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
, 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

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
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é.)

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 ?
(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 " )

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
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:
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

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:
ou mieux:
(permet de saisir avec des guillemets, apostrophes et évite l'injection de code)

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

....
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