Page 1 sur 1

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

Publié : ven. 22/mai/2020 14:11
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

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

Publié : ven. 22/mai/2020 16:13
par falsam
:idea: update Fclient set Nom = LTRIM(RTRIM(Nom))

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

Publié : ven. 22/mai/2020 16:19
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.

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

Publié : ven. 22/mai/2020 16:28
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 

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

Publié : ven. 22/mai/2020 16:34
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:

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

Publié : ven. 22/mai/2020 16:39
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)

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

Publié : ven. 22/mai/2020 16:43
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:

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

Publié : ven. 22/mai/2020 16:51
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 :|

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

Publié : sam. 23/mai/2020 1:46
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

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

Publié : sam. 23/mai/2020 6:44
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:

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

Publié : sam. 23/mai/2020 8:34
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

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

Publié : sam. 23/mai/2020 10:25
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:

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

Publié : sam. 23/mai/2020 10:30
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

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

Publié : sam. 23/mai/2020 11:26
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.

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

Publié : sam. 23/mai/2020 12:57
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