[RESOLU] Modifier le contenu d'un champ d'une table

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
omega
Messages : 626
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

[RESOLU] Modifier le contenu d'un champ d'une table

Message par omega »

Bonjour à tous

Je sais qu'il y a plusieurs solutions pour modifier les données d'une table, mais ce que je souhaite c'est de pouvoir modifier la table en utilisant UNE SEULE LIGNE (EXEMPLE: Update fichier set Nom=trim(nom)).
J'ai une table de clients qui contient les données des clients, parmi ces données Nom qui est le nom du client. Dans mon cas précis, je voudrais modifier tous les noms des clients en enlevant l'espace qui se trouverait au début du nom.
En appliquant cette instruction

Code : Tout sélectionner

(Update Fclient Set Nom=Trim(Nom))
, il y a une erreur de syntaxe parce que Trim(Nom) n'est pas autorisé dans ce cas sauf si Nom.s est une variable mémoire qui contient qq chose (Ce qui est normal).

J'espère que je suis clair.

Merci
Dernière modification par omega le sam. 23/mai/2020 1:50, modifié 1 fois.
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Modifier le contenu d'un champ d'une table automatiqueme

Message par falsam »

:idea: update Fclient set Nom = LTRIM(RTRIM(Nom))
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Modifier le contenu d'un champ d'une table automatiqueme

Message par Marc56 »

(Update Fclient Set Nom=Trim(Nom))
Requête SQL, donc rien à voir avec PB.

De plus, Trim() s'utilise différemment selon le type de base SQL.

https://sql.sh/fonctions/trim

Précise la base, le message exact (DatabaseError()) et un bout de code si tu veux une réponse précise.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Modifier le contenu d'un champ d'une table automatiqueme

Message par falsam »

Bonjour Marc. Je suis d'accord qu'il aurait fallu utiliser la fonction Trim de PB. Mais Omega souhaite utiliser une opération de suppression des espaces en une seule opération SQL
omega a écrit :ce que je souhaite c'est de pouvoir modifier la table en utilisant UNE SEULE LIGNE (EXEMPLE: Update fichier set Nom=trim(nom)).
Je sais aussi qu'omega utilise d'habitude des bases de données SQLite.

Avec ces seules informations, petite démonstration :
- Création d'une table clients
- Ajout de deux noms avec des espaces avant et aprés les nom
- Traitement de suppression de ces espaces en une seule ligne de commande.

Code : Tout sélectionner

ReqSql = "update clients set nom = LTRIM(RTRIM(nom))" 

Code : Tout sélectionner

EnableExplicit

Enumeration
  #DataBase
EndEnumeration

UseSQLiteDatabase()

Global ReqSql.s

;- Création base de données en mémoire 
OpenDatabase(#DataBase, ":memory:", "", "")

;Creation de la table clients (trés simplifié)
ReqSql = "CREATE TABLE clients ("
ReqSql + "idauto INTEGER PRIMARY KEY,"   ;Identification auto
ReqSql + "nom TEXTE,"                    ;Nom du client
ReqSql + "compte INTEGER"
ReqSql + ");"
DatabaseUpdate(#DataBase, ReqSql)         

;Ajout d'un client (par defaut idauto prendra la valeur 1)
ReqSql = "insert into clients (nom, compte) values (?,?)"
SetDatabaseString(#Database, 0, "     falsam") 
DatabaseUpdate(#Database, ReqSql)

ReqSql = "insert into clients (nom, compte) values (?,?)"
SetDatabaseString(#Database, 0, "     omega      ") 
DatabaseUpdate(#Database, ReqSql)


;Suppression des blancs avant et aprés les nom EN UNE SEULE OPERATION SQL
ReqSql = "update clients set nom = LTRIM(RTRIM(nom))"  
DatabaseUpdate(#Database, ReqSql)

;-Vérification
If DatabaseError() <> ""
  MessageRequester("Information", "Immpossible de mettre à jour la base de données" + #CRLF$ + DatabaseError())
Else
  ReqSql = "SELECT nom FROM clients"
  DatabaseQuery(#Database, ReqSql) 
  
  Debug "Liste clients #database"
  While NextDatabaseRow(#Database)            
    Debug "Nom : ->" + GetDatabaseString(#Database, 0) + "<-" 
  Wend
EndIf 
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Modifier le contenu d'un champ d'une table automatiqueme

Message par Marc56 »

Oui, il n'y a d'ailleurs pas d'erreur en ligne de commandes avec SQLite

Code : Tout sélectionner

SQLite version 3.30.1 2019-10-10 20:19:45
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> create table Fclient (Nom text);

sqlite> insert into Fclient Values (' un');
sqlite> insert into Fclient Values (' deux ');
sqlite> insert into Fclient Values (' trois ');

sqlite> select * from Fclient;
 un
 deux
 trois
 
sqlite> select * from Fclient;
un
deux
trois
(on le voit moins, mais l'espace a bien été supprimé.)

:wink:
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Modifier le contenu d'un champ d'une table automatiqueme

Message par falsam »

Dans mon code commente l'opération de TRIM et relance l'exécution. Tu verras les blancs avant et après chaque nom.

Code : Tout sélectionner

;Suppression des blancs avant et aprés les nom
;ReqSql = "update clients set nom = LTRIM(RTRIM(nom))"  
;DatabaseUpdate(#Database, ReqSql)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: Modifier le contenu d'un champ d'une table automatiqueme

Message par Marc56 »

Oui j'avais bien compris, mais pourquoi mettre deux fonctions imbriquées ? LTRIM(RTRIM(
une seule suffit TRIM(
ou alors j'ai loupé un truc ?

Code : Tout sélectionner

 ReqSql = "update clients set nom = TRIM(nom)" 

Code : Tout sélectionner

Liste clients #database
Nom : ->falsam<-
Nom : ->omega<-
(pas d'erreur et les espaces sont bien supprimés)

Il faudrait un bout de code d'Omega pour trouver d'où vient l'erreur (je parie pour des ' ou " )

:wink:
Dernière modification par Marc56 le ven. 22/mai/2020 16:51, modifié 1 fois.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Modifier le contenu d'un champ d'une table automatiqueme

Message par falsam »

Marc56 a écrit :Pourquoi faire deux fonctions imbriquées ? LTRIM(RTRIM(
une seule suffit TRIM(
ou alors j'ai loupé un truc ?
parce qu'Omega disait que son code ne fonctionnait pas avec Trim !!!
omega a écrit : il y a une erreur de syntaxe parce que Trim(Nom) n'est pas autorisé dans ce cas
et j'ai oublié de faire un test de mon code avec Trim SQL :mrgreen:

Donc tu as raison l'erreur est ailleurs dans son code ou alors ce n'est pas une base de données SQlite :|
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
omega
Messages : 626
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

[RESOLU] Modifier le contenu d'un champ d'une table

Message par omega »

Ouf! Erreur bête >> regardez ce code:

Code : Tout sélectionner

Sql="Update Fclient Set Nom=TRIM(Nom)"
C'est sur ce code que j'ai eu une erreur. L'erreur ne concerne pas TRIM (Nom) mais tout simplement NOM (ce champ n'existe pas il fallait écrire TRIM(NomClient) au lieu de Trim(Nom).

Merci beaucoup pour votre aide
Bonne continuation
Win7 (x64) 64 bits Pb 5.72
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: [RESOLU] Modifier le contenu d'un champ d'une table

Message par Marc56 »

Tu peux utiliser DatabaseError() après chaque fonction OpenDatabase(), DatabaseQuery() et DatabaseUpdate()

Exemple avec le code de Falsam en mettant une colonne qui n'existe pas.

Code : Tout sélectionner

;-Vérification
If DatabaseError() <> ""
    MessageRequester("Information", "Immpossible de mettre à jour la base de données" + #CRLF$ + DatabaseError())
Else
    ReqSql = "SELECT nom0 FROM clients"
    ; --- Ajout
    If Not DatabaseQuery(#Database, ReqSql)
        Debug "Erreur: " + DatabaseError()
        End
    EndIf
    ; --- /ajout
    Debug "Liste clients #database"
    While NextDatabaseRow(#Database)           
        Debug "Nom : ->" + GetDatabaseString(#Database, 0) + "<-"
    Wend
EndIf 

Code : Tout sélectionner

Erreur: no such column: nom0
:wink:
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: [RESOLU] Modifier le contenu d'un champ d'une table

Message par GallyHC »

Bonjour,

Au boulot j'utilise, une routine C# ou VB.net (selon les besoins) pour filtré les Noms et/ou Prénoms avant de les mettre en base de données, ce qui permet de ne pas devoir revenir sur cela par la suite. Je vais voir si j'ai le temps de l'adapté en PureBasic (Si vous penser que cela est utile)?

Cordialement,
GallyHC
Dernière modification par GallyHC le sam. 23/mai/2020 10:31, modifié 1 fois.
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Marc56
Messages : 2148
Inscription : sam. 08/févr./2014 15:19

Re: [RESOLU] Modifier le contenu d'un champ d'une table

Message par Marc56 »

Couper le superflu dès la saisie:

Code : Tout sélectionner

Nom$ = Trim( GetGadgetText(#Str_Nom) )
ou mieux:

Code : Tout sélectionner

SetDatabaseString(#DB, 0, Trim( GetGadgetText(#Str_Nom) ) )
(permet de saisir avec des guillemets, apostrophes et évite l'injection de code)

:wink:
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: [RESOLU] Modifier le contenu d'un champ d'une table

Message par GallyHC »

Bonjour,

pour le superflu, Trim() ne retire pas ce qui est a l’intérieur de la chaîne de caractère. Dans tout les cas j'ai fait la module que j'ai posté sur le forum.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [RESOLU] Modifier le contenu d'un champ d'une table

Message par falsam »

omega a écrit :C'est sur ce code que j'ai eu une erreur. L'erreur ne concerne pas TRIM (Nom) mais tout simplement NOM (ce champ n'existe pas il fallait écrire TRIM(NomClient) au lieu de Trim(Nom).
Marc avait raison. L'erreur était ailleurs :roll: ....

Omega je te conseille de mettre en place un gestionnaire d'erreur SQL. Un exemple se trouve dans le code que je propose.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
omega
Messages : 626
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: [RESOLU] Modifier le contenu d'un champ d'une table

Message par omega »

Bonjour

J'utilise ces deux procédures dans tous mes programmes (c'est une habitude).

Code : Tout sélectionner

Procedure CheckDatabaseUpdate(Database, Query$)
   Result = DatabaseUpdate(Database, Query$)
   If Result = 0
      MessageRequester("Erreur" ,DatabaseError() + "    Db=" +  Str(database) + " query$= " + Query$)
   EndIf
   ProcedureReturn Result
EndProcedure

;----------------------------------------------------------------------------------------------------------
Procedure CheckDatabaseQuery(Database, Query$)
   Define Resultat
   Resultat = DatabaseQuery(Database, Query$)
   If Resultat = 0
      MessageRequester("Erreur"  ,DatabaseError() + "    Db=" +  Str(database) + " query$= " + Query$)
   EndIf
   ProcedureReturn Resultat
EndProcedure
L'erreur a sûrement été affichée par DatabaseError() mais je ne me rappelles plus du message

@Marc56
Nom$ = Trim( GetGadgetText(#Str_Nom) )
Dorénavant, c'est ce que je vais devoir utiliser (avant validation)

Merci beaucoup à tous
Win7 (x64) 64 bits Pb 5.72
Répondre