Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[WD12] SQLManagerX et MySQL

8 réponses
Avatar
JeAn-PhI
bonjour

mon problème sur l'affectation des NULL est maintenant corrigé merci
encore à Firetox

mais j'ai un autre soucis.

j'ai défini dans ma BDD une valeur par défaut ("CURRENT_TIMESTAMP")
pour une colonne de type TIMESTAMP alors que d'après la doc officielle
cette colonne doit se mettre à jour automatiquement sans valeur par
défaut

bref cela fonctionne lorsque j'utilise un frontal mais lors de
l'utilisation de SQLManagerX cela ne fonctionne pas.

effectivement lorsqu'on regarde la req envoyée on a :

values (...,....,...,'CURRENT_TIMESTAMP') avec des quotes

donc j'aimerais bien apporté un correctif pour prendre en compte ce
genre de pb mais j'aimerais qu'il soit profitable pour tous et fait
convenablement sans qu'il y ait des effets de bord "tarabiscotté"

donc qu'elle est la meilleure façon de procéder ?

merci

--
Cordialement JeAn-PhI

8 réponses

Avatar
Firetox
Bonjour,

quelle modif a tu fais ?
peut tu tracer le constructeur d'une table avec timeStamp pour voir ce qu'il
y a dans le tableau :defCol ou extCol sur cette colonne
car effectivement pour ce genre de colonne il ne faut pas envoyer les
valeurs mais comme mySQL permet de forcer une telle colonne on peut quand
meme envoyé une valeur donc on peut soit decider de faire comme NULL ou
alors une autre solution : je suis ouvert a toute proposition

bon dev
@+




"JeAn-PhI" a écrit dans le message de news:
48cf657f$0$12634$
bonjour

mon problème sur l'affectation des NULL est maintenant corrigé merci
encore à Firetox

mais j'ai un autre soucis.

j'ai défini dans ma BDD une valeur par défaut ("CURRENT_TIMESTAMP") pour
une colonne de type TIMESTAMP alors que d'après la doc officielle cette
colonne doit se mettre à jour automatiquement sans valeur par défaut

bref cela fonctionne lorsque j'utilise un frontal mais lors de
l'utilisation de SQLManagerX cela ne fonctionne pas.

effectivement lorsqu'on regarde la req envoyée on a :

values (...,....,...,'CURRENT_TIMESTAMP') avec des quotes

donc j'aimerais bien apporté un correctif pour prendre en compte ce genre
de pb mais j'aimerais qu'il soit profitable pour tous et fait
convenablement sans qu'il y ait des effets de bord "tarabiscotté"

donc qu'elle est la meilleure façon de procéder ?

merci

--
Cordialement JeAn-PhI




Avatar
Firetox
je viens de faire un test
c'est a cause de ton prepare car en mode standard (SQLinsert et SQLupdate
sans prepare) envoi la colonne que si on la force sinon on ne l'envoi pas
mais dans ton cas le prepare force l'envoi de la colonne et donc comme la
valeur est vide on envoi la valeur par defaut , mais c'est une fonction donc
il n'aurait pas fallut envoyé les quotes
donc sur le prepare il faut trouve une solution pour specifier que c'est une
fonction sur cette colonne pour ne pas envoyé les quotes ou alors faire un
code speciale a cause du prepare

Bon dev
@+



"JeAn-PhI" a écrit dans le message de news:
48cf657f$0$12634$
bonjour

mon problème sur l'affectation des NULL est maintenant corrigé merci
encore à Firetox

mais j'ai un autre soucis.

j'ai défini dans ma BDD une valeur par défaut ("CURRENT_TIMESTAMP") pour
une colonne de type TIMESTAMP alors que d'après la doc officielle cette
colonne doit se mettre à jour automatiquement sans valeur par défaut

bref cela fonctionne lorsque j'utilise un frontal mais lors de
l'utilisation de SQLManagerX cela ne fonctionne pas.

effectivement lorsqu'on regarde la req envoyée on a :

values (...,....,...,'CURRENT_TIMESTAMP') avec des quotes

donc j'aimerais bien apporté un correctif pour prendre en compte ce genre
de pb mais j'aimerais qu'il soit profitable pour tous et fait
convenablement sans qu'il y ait des effets de bord "tarabiscotté"

donc qu'elle est la meilleure façon de procéder ?

merci

--
Cordialement JeAn-PhI




Avatar
Firetox
Bonjour,

remplace dans le SQLinsert le bloc du case DATE,TIMESTAMP
par le code ci dessous :

ligneCol +=:DcaractEspace+ :NomCol[i] +:FCaracterEspace + ","
// modif du 10/09/2008 pour remplacer une chaine vide par Null
// il suffit d'alimenter les colonnes vides avec "@NULL"
SI :ValCol[i] = "@NULL" ALORS
ligneValue += "null,"
SINON
SI :defCol[i] <> "" ALORS
// modifi du 16/09/2008 si la valeur par defaut est differentes de
'' alors on a afaire a une fonction
// attention voir si une valeur par defaut autre que fonction est
posssible
// voir quand meme si le probleme de la fonction est reglé sinon il
faudra faire autre chose pour identifier les fonctions des vrais valeur par
defaut
ligneValue += :ValCol[i]) + ","
SINON
ligneValue += :MySQL:mySQLDateFormat(:ValCol[i]) + ","
FIN
FIN


cela pour un test car il engendre un autre probleme
Bon dev
@+

"Firetox" a écrit dans le message de news:
48cf6af1$0$17347$
je viens de faire un test
c'est a cause de ton prepare car en mode standard (SQLinsert et SQLupdate
sans prepare) envoi la colonne que si on la force sinon on ne l'envoi pas
mais dans ton cas le prepare force l'envoi de la colonne et donc comme la
valeur est vide on envoi la valeur par defaut , mais c'est une fonction
donc il n'aurait pas fallut envoyé les quotes
donc sur le prepare il faut trouve une solution pour specifier que c'est
une fonction sur cette colonne pour ne pas envoyé les quotes ou alors
faire un code speciale a cause du prepare

Bon dev
@+



"JeAn-PhI" a écrit dans le message de news:
48cf657f$0$12634$
bonjour

mon problème sur l'affectation des NULL est maintenant corrigé merci
encore à Firetox

mais j'ai un autre soucis.

j'ai défini dans ma BDD une valeur par défaut ("CURRENT_TIMESTAMP") pour
une colonne de type TIMESTAMP alors que d'après la doc officielle cette
colonne doit se mettre à jour automatiquement sans valeur par défaut

bref cela fonctionne lorsque j'utilise un frontal mais lors de
l'utilisation de SQLManagerX cela ne fonctionne pas.

effectivement lorsqu'on regarde la req envoyée on a :

values (...,....,...,'CURRENT_TIMESTAMP') avec des quotes

donc j'aimerais bien apporté un correctif pour prendre en compte ce genre
de pb mais j'aimerais qu'il soit profitable pour tous et fait
convenablement sans qu'il y ait des effets de bord "tarabiscotté"

donc qu'elle est la meilleure façon de procéder ?

merci

--
Cordialement JeAn-PhI








Avatar
JeAn-PhI
Firetox a couché sur son écran :
Bonjour,

remplace dans le SQLinsert le bloc du case DATE,TIMESTAMP
par le code ci dessous :

ligneCol +=:DcaractEspace+ :NomCol[i] +:FCaracterEspace + ","
// modif du 10/09/2008 pour remplacer une chaine vide par Null
// il suffit d'alimenter les colonnes vides avec "@NULL"
SI :ValCol[i] = "@NULL" ALORS
ligneValue += "null,"
SINON
SI :defCol[i] <> "" ALORS
// modifi du 16/09/2008 si la valeur par defaut est differentes de ''
alors on a afaire a une fonction
// attention voir si une valeur par defaut autre que fonction est
posssible
// voir quand meme si le probleme de la fonction est reglé sinon il
faudra faire autre chose pour identifier les fonctions des vrais valeur par
defaut
ligneValue += :ValCol[i]) + ","
SINON
ligneValue += :MySQL:mySQLDateFormat(:ValCol[i]) + ","
FIN
FIN


cela pour un test car il engendre un autre probleme
Bon dev
@+

"Firetox" a écrit dans le message de news:
48cf6af1$0$17347$
je viens de faire un test
c'est a cause de ton prepare car en mode standard (SQLinsert et SQLupdate
sans prepare) envoi la colonne que si on la force sinon on ne l'envoi pas
mais dans ton cas le prepare force l'envoi de la colonne et donc comme la
valeur est vide on envoi la valeur par defaut , mais c'est une fonction
donc il n'aurait pas fallut envoyé les quotes
donc sur le prepare il faut trouve une solution pour specifier que c'est
une fonction sur cette colonne pour ne pas envoyé les quotes ou alors faire
un code speciale a cause du prepare

Bon dev
@+



"JeAn-PhI" a écrit dans le message de news:
48cf657f$0$12634$
bonjour

mon problème sur l'affectation des NULL est maintenant corrigé merci
encore à Firetox

mais j'ai un autre soucis.

j'ai défini dans ma BDD une valeur par défaut ("CURRENT_TIMESTAMP") pour
une colonne de type TIMESTAMP alors que d'après la doc officielle cette
colonne doit se mettre à jour automatiquement sans valeur par défaut

bref cela fonctionne lorsque j'utilise un frontal mais lors de
l'utilisation de SQLManagerX cela ne fonctionne pas.

effectivement lorsqu'on regarde la req envoyée on a :

values (...,....,...,'CURRENT_TIMESTAMP') avec des quotes

donc j'aimerais bien apporté un correctif pour prendre en compte ce genre
de pb mais j'aimerais qu'il soit profitable pour tous et fait
convenablement sans qu'il y ait des effets de bord "tarabiscotté"

donc qu'elle est la meilleure façon de procéder ?

merci

-- Cordialement JeAn-PhI











désolé pour la réponse tardive

je résume :

- si je fais un insert avec un frontal sans valeur par défaut dans ma
bdd il ne renseigne pas la colonne avec "date+heure" mais avec NULL
chose que je ne comprends pas :-( la doc indique le contraire

- si je fais un "SQLPrepare" avec SQLManagerX sans valeur par défaut
dans ma bdd et que je ne mets pas de valeur pour cette colonne dans mon
code WinDev, donc la colonne n'est pas renseignée ni envoyée dans la
requête, je me retrouve avec NULL par défaut ce qui est normal vu le
comportement avec le frontal

- si je fais un "SQLPrepare" avec SQLManagerX avec valeur par défaut
(CURRENT_TIMESTAMP) dans ma bdd et que je ne mets pas de valeur pour
cette colonne dans mon code WinDev (membre non renseigné), donc la
colonne n'est pas renseignée mais elle est envoyée dans la requête avec
'CURRENT_TIMESTAMP' car :defCol[i] contient la valeur
"CURRENT_TIMESAMP" je retrouve avec une erreur car CURRENT_TIMESTAMP
est une fonction et non une valeur textuelle

j'ai donc comme valeur :

:ValCol[i] = "CURRENT_TIMESTAMP"
:defCol[i] = "CURRENT_TIMESTAMP"
:extCol[i] = ""
p_prepare = Vrai

je viens de faire la modification et cela fonctionne

effectivement faire attention car les valeurs par défaut peuvent ne pas
être que des fonctions donc identifier les fonctions de façon dynamique
serait un plus

en attendant la suite...

--
Cordialement JeAn-PhI
Avatar
Firetox
j'ai fait une modif dans ce sens

j'ai rajouter une methode SetFonctionDefaut qui permet de specifier si la
colonne a pour valeur par defaut une fonction
ainsi quand on declare l'objet SQLManagerX il suffit de dire que cette
colonne a une fonction pour valeur defaut et la valeur ne sera pas mise en
''

donc recap :

i_client est un c_client("Client",monAcces,"i_client)
i_client:setFonctionDefaut("DateMAJ")

veut dire que la dateMAJ a pour defaut une fonction
et donc insert n'everra pas les quotes sur le timeStamp

j'ai pris pour base le code que je t"ai donné mais avec la difference qu'on
peut quand meme envoyé autre chose
je verifie tout ca car il faut que je test avec , sans , en forcant la
valeur etc ......

le principe :
si valCol[i] = '' alors on met le defaut et si foncCol[i] alors defaut sans
les quotes

Bon dev
@+





"JeAn-PhI" a écrit dans le message de news:
48cf940b$0$14745$
Firetox a couché sur son écran :
Bonjour,

remplace dans le SQLinsert le bloc du case DATE,TIMESTAMP
par le code ci dessous :

ligneCol +=:DcaractEspace+ :NomCol[i] +:FCaracterEspace + ","
// modif du 10/09/2008 pour remplacer une chaine vide par Null
// il suffit d'alimenter les colonnes vides avec "@NULL"
SI :ValCol[i] = "@NULL" ALORS
ligneValue += "null,"
SINON
SI :defCol[i] <> "" ALORS
// modifi du 16/09/2008 si la valeur par defaut est differentes
de '' alors on a afaire a une fonction
// attention voir si une valeur par defaut autre que fonction est
posssible
// voir quand meme si le probleme de la fonction est reglé sinon
il faudra faire autre chose pour identifier les fonctions des vrais
valeur par defaut
ligneValue += :ValCol[i]) + ","
SINON
ligneValue += :MySQL:mySQLDateFormat(:ValCol[i]) + ","
FIN
FIN


cela pour un test car il engendre un autre probleme
Bon dev
@+

"Firetox" a écrit dans le message de news:
48cf6af1$0$17347$
je viens de faire un test
c'est a cause de ton prepare car en mode standard (SQLinsert et
SQLupdate sans prepare) envoi la colonne que si on la force sinon on ne
l'envoi pas
mais dans ton cas le prepare force l'envoi de la colonne et donc comme
la valeur est vide on envoi la valeur par defaut , mais c'est une
fonction donc il n'aurait pas fallut envoyé les quotes
donc sur le prepare il faut trouve une solution pour specifier que c'est
une fonction sur cette colonne pour ne pas envoyé les quotes ou alors
faire un code speciale a cause du prepare

Bon dev
@+



"JeAn-PhI" a écrit dans le message de news:
48cf657f$0$12634$
bonjour

mon problème sur l'affectation des NULL est maintenant corrigé merci
encore à Firetox

mais j'ai un autre soucis.

j'ai défini dans ma BDD une valeur par défaut ("CURRENT_TIMESTAMP")
pour une colonne de type TIMESTAMP alors que d'après la doc officielle
cette colonne doit se mettre à jour automatiquement sans valeur par
défaut

bref cela fonctionne lorsque j'utilise un frontal mais lors de
l'utilisation de SQLManagerX cela ne fonctionne pas.

effectivement lorsqu'on regarde la req envoyée on a :

values (...,....,...,'CURRENT_TIMESTAMP') avec des quotes

donc j'aimerais bien apporté un correctif pour prendre en compte ce
genre de pb mais j'aimerais qu'il soit profitable pour tous et fait
convenablement sans qu'il y ait des effets de bord "tarabiscotté"

donc qu'elle est la meilleure façon de procéder ?

merci

-- Cordialement JeAn-PhI











désolé pour la réponse tardive

je résume :

- si je fais un insert avec un frontal sans valeur par défaut dans ma bdd
il ne renseigne pas la colonne avec "date+heure" mais avec NULL chose que
je ne comprends pas :-( la doc indique le contraire

- si je fais un "SQLPrepare" avec SQLManagerX sans valeur par défaut dans
ma bdd et que je ne mets pas de valeur pour cette colonne dans mon code
WinDev, donc la colonne n'est pas renseignée ni envoyée dans la requête,
je me retrouve avec NULL par défaut ce qui est normal vu le comportement
avec le frontal

- si je fais un "SQLPrepare" avec SQLManagerX avec valeur par défaut
(CURRENT_TIMESTAMP) dans ma bdd et que je ne mets pas de valeur pour cette
colonne dans mon code WinDev (membre non renseigné), donc la colonne n'est
pas renseignée mais elle est envoyée dans la requête avec
'CURRENT_TIMESTAMP' car :defCol[i] contient la valeur "CURRENT_TIMESAMP"
je retrouve avec une erreur car CURRENT_TIMESTAMP est une fonction et non
une valeur textuelle

j'ai donc comme valeur :

:ValCol[i] = "CURRENT_TIMESTAMP"
:defCol[i] = "CURRENT_TIMESTAMP"
:extCol[i] = ""
p_prepare = Vrai

je viens de faire la modification et cela fonctionne

effectivement faire attention car les valeurs par défaut peuvent ne pas
être que des fonctions donc identifier les fonctions de façon dynamique
serait un plus

en attendant la suite...

--
Cordialement JeAn-PhI




Avatar
JeAn-PhI
Firetox avait soumis l'idée :
j'ai fait une modif dans ce sens

j'ai rajouter une methode SetFonctionDefaut qui permet de specifier si la
colonne a pour valeur par defaut une fonction
ainsi quand on declare l'objet SQLManagerX il suffit de dire que cette
colonne a une fonction pour valeur defaut et la valeur ne sera pas mise en ''

donc recap :

i_client est un c_client("Client",monAcces,"i_client)
i_client:setFonctionDefaut("DateMAJ")

veut dire que la dateMAJ a pour defaut une fonction
et donc insert n'everra pas les quotes sur le timeStamp

j'ai pris pour base le code que je t"ai donné mais avec la difference qu'on
peut quand meme envoyé autre chose
je verifie tout ca car il faut que je test avec , sans , en forcant la valeur
etc ......

le principe :
si valCol[i] = '' alors on met le defaut et si foncCol[i] alors defaut sans
les quotes

Bon dev
@+




dans la PROCEDURE SetFonctionDefault il faut mettre vrai et non faux

BOUCLE
v_indice++
v_nomCol = ExtraitChaîne(p_nomdeColonne,v_indice,",")
SI v_nomCol = EOT ALORS SORTIR
SI v_nomCol = "" ALORS SORTIR
i = Position(Minuscule(:listeColonne),"/"+Minuscule(v_nomCol)+",")
SI i > 0 ALORS
i = Val(:listeColonne[[ (i+1)+Taille(v_nomCol)+2 sur 4]])
SI i >= 1 ET i <= Dimension(:NomCol) ALORS
:FoncCol[i] = True // <= Pas False
FIN
FIN
FIN

car le test est :

// 16/09/2008 modif si la colonne est une fonction il ne faut pas
mettre de '' dur la valeur par defaut
SI :FoncCol[i] ALORS
ligneValue += :defCol[i] + ","
SINON
ligneValue += :MySQL:mySQLDateFormat(:ValCol[i]) + ","
FIN

et cela fonctionne je suppose que c'est un copier/coller de
setNotNull() :D

--
Cordialement JeAn-PhI
Avatar
Firetox
exact j'ai fait la maodif et je suis en train de faire l'upload
il faut aussi changer la remise a zero en fait il faut inverser le true et
le false

@+


"JeAn-PhI" a écrit dans le message de news:
48cfc681$0$5101$
Firetox avait soumis l'idée :
j'ai fait une modif dans ce sens

j'ai rajouter une methode SetFonctionDefaut qui permet de specifier si la
colonne a pour valeur par defaut une fonction
ainsi quand on declare l'objet SQLManagerX il suffit de dire que cette
colonne a une fonction pour valeur defaut et la valeur ne sera pas mise
en ''

donc recap :

i_client est un c_client("Client",monAcces,"i_client)
i_client:setFonctionDefaut("DateMAJ")

veut dire que la dateMAJ a pour defaut une fonction
et donc insert n'everra pas les quotes sur le timeStamp

j'ai pris pour base le code que je t"ai donné mais avec la difference
qu'on peut quand meme envoyé autre chose
je verifie tout ca car il faut que je test avec , sans , en forcant la
valeur etc ......

le principe :
si valCol[i] = '' alors on met le defaut et si foncCol[i] alors defaut
sans les quotes

Bon dev
@+




dans la PROCEDURE SetFonctionDefault il faut mettre vrai et non faux

BOUCLE
v_indice++
v_nomCol = ExtraitChaîne(p_nomdeColonne,v_indice,",")
SI v_nomCol = EOT ALORS SORTIR
SI v_nomCol = "" ALORS SORTIR
i = Position(Minuscule(:listeColonne),"/"+Minuscule(v_nomCol)+",")
SI i > 0 ALORS
i = Val(:listeColonne[[ (i+1)+Taille(v_nomCol)+2 sur 4]])
SI i >= 1 ET i <= Dimension(:NomCol) ALORS
:FoncCol[i] = True // <= Pas False
FIN
FIN
FIN

car le test est :

// 16/09/2008 modif si la colonne est une fonction il ne faut pas mettre
de '' dur la valeur par defaut
SI :FoncCol[i] ALORS
ligneValue += :defCol[i] + ","
SINON
ligneValue += :MySQL:mySQLDateFormat(:ValCol[i]) + ","
FIN

et cela fonctionne je suppose que c'est un copier/coller de setNotNull()
:D

--
Cordialement JeAn-PhI




Avatar
JeAn-PhI
Firetox avait prétendu :
exact j'ai fait la maodif et je suis en train de faire l'upload
il faut aussi changer la remise a zero en fait il faut inverser le true et le
false

@+




ok c'est fait
merci encore pour cet outil fabuleux et d'avoir pu le faire évoluer
aussi rapidement

--
Cordialement JeAn-PhI