OVH Cloud OVH Cloud

Gérer les id automatique de sqlserver

1 réponse
Avatar
Roumegou Eric
Bonsoir,
Gros blème pour moi !
J'ai une appli que j'ai du adapter à une base SQLServer (merci ADO4WD!)
mais les id sont automatiques et j'ai besoin de récupérer la valeur de
l'id auto généré.
je pensais tenir la solution avec le select @@IDENTITY as 'Identity' et
donc aménagé ma fn que j'envoie après l'ordre INSERT

FONCTION Rtv_Last_Insert_Id(pSeq="")
commande est une chaîne
lCurReq est un entier
chretour est un entier=0
lCurReq=3
SELON gBase
CAS cORACLE
// sans objet !sauf si une sequence a été spécifiée
SI pSeq<>"" ALORS
commande="SELECT "+pSeq+".CURVAL FROM DUAL "
SI fSQL:mySQLExec(commande,lCurReq)
fSQL:mySQLPremier(lCurReq)
SI PAS fSQL:mySQLEnDehors ALORS chretour=fSQL:mySQLCol(lCurReq,1)
SINON
fSQL:mySQLMsgBox(commande)
FIN
fSQL:mySQLFerme(lCurReq)
FIN

CAS cMYSQL
commande="SELECT LAST_INSERT_ID()"
SI fSQL:mySQLExec(commande,lCurReq)
fSQL:mySQLPremier(lCurReq)
SI PAS fSQL:mySQLEnDehors ALORS chretour=fSQL:mySQLCol(lCurReq,1)
SINON
fSQL:mySQLMsgBox(commande)
FIN
fSQL:mySQLFerme(lCurReq)

CAS cSQLITE
chretour=fSQL:mySQLDernierId()

CAS cSQLSERVER
commande="SELECT @@IDENTITY AS 'Identity'"
SI fSQL:mySQLExec(commande,lCurReq)
fSQL:mySQLPremier(lCurReq)
SI PAS fSQL:mySQLEnDehors ALORS chretour=fSQL:mySQLCol(lCurReq,1)
SINON
fSQL:mySQLMsgBox(commande)
FIN
fSQL:mySQLFerme(lCurReq)
FIN
RENVOYER chretour


Mais il me retourne 0 le pleutre !!!
Sur Internet on trouve des ex qui parlent d'envoyer le select dans le
meme recordset séparé par un ;. Mais je ne vois pas comment avec les
accès alternatifs ???

En plus pas facile de modifier mon code qui est le meme pour toutes mes
fenêtres et qui doit s'adapter au sgbd.

Merci de vos idées.


--
Eric Roumégou
Webmaster des wtablettes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)

1 réponse

Avatar
Roumegou Eric
Au secours ! ça me bloque ma mise en prod ce truc.
en allant sur cette adresse
http://www.kamath.com/tutorials/tut007_identity.asp

j'ai essayé de passer l'ordre de recup de l'ident avec la commande
insert. Cela ne plante pas mais je n'arrive pas à lire le resultat
retourné.

INSERT INTO PEOPLE_TASK
(PPL_ID,FOR_ID,TAC_TITRE,TAC_DATE,TAC_DATFIN,TAC_HHMM,TAC_HHMMFIN,TAC_TYPE,TAC_COMM,TAC_RAPPORT,TAC_DATRAPPORT,TAC_NOTE,TAC_APPREC,DATE_CREAT,LOGIN_CREAT,DATE_MODIF,LOGIN_MODIF,SRC_CREAT,SRC_MODIF,REF_IMPORT,OPE_ID,TAC_TYPEDATE,TAC_NBJOURS,TAC_NBHEURES,TAC_TYPEACT,TAC_ACTION,TAC_ETAT,TAC_CHOIXD1,TAC_CHOIXD2,TAC_CHOIXD3,TAC_CHOIXD4,TAC_CHOIXD5,TAC_DATECHOISIE,TAC_TYPE_CHOIXDATE,TAC_PERE_1,TAC_PERE_2,TAC_PERE_3,TAC_STAT1,TAC_STAT2,TAC_STAT3,TAC_STAT4,TAC_STAT5,TAC_STAT6,TAC_STAT7,TAC_VAL1,TAC_VAL2,TAC_VAL3)
values (100315,25,'WELCOME
ErSAv','20051128',Null,0,0,1,'','',Null,0,0,'20051208','Roumegou',Null,'','Saisie
depuis
PEOPLE_TASK_FIC','',0,54,1,0,100,1,'',1,Null,Null,Null,Null,Null,Null,7,100033,100022,100032,'1','PF','9','4','6','C','F',0,4813.081031186,5000);SELECT
@@IDENTITY AS LAST_ID;

Dans un frontal SQL cela passe bien et mon enreg est à chaque fois bien
créé.
Alors j'essaie ce code mais mysqlendehors est à vrai.
fSQL:mySQLPremier(lCurReq)
SI PAS fSQL:mySQLEnDehors ALORS {PrimaryKey}=fSQL:mySQLCol(lCurReq,1)




Roumegou Eric a utilisé son clavier pour écrire :
Bonsoir,
Gros blème pour moi !
J'ai une appli que j'ai du adapter à une base SQLServer (merci ADO4WD!) mais
les id sont automatiques et j'ai besoin de récupérer la valeur de l'id auto
généré.
je pensais tenir la solution avec le select @@IDENTITY as 'Identity' et donc
aménagé ma fn que j'envoie après l'ordre INSERT

FONCTION Rtv_Last_Insert_Id(pSeq="")
commande est une chaîne
lCurReq est un entier
chretour est un entier=0
lCurReq=3
SELON gBase
CAS cORACLE
// sans objet !sauf si une sequence a été spécifiée
SI pSeq<>"" ALORS
commande="SELECT "+pSeq+".CURVAL FROM DUAL "
SI fSQL:mySQLExec(commande,lCurReq)
fSQL:mySQLPremier(lCurReq)
SI PAS fSQL:mySQLEnDehors ALORS chretour=fSQL:mySQLCol(lCurReq,1)
SINON
fSQL:mySQLMsgBox(commande)
FIN
fSQL:mySQLFerme(lCurReq)
FIN

CAS cMYSQL
commande="SELECT LAST_INSERT_ID()"
SI fSQL:mySQLExec(commande,lCurReq)
fSQL:mySQLPremier(lCurReq)
SI PAS fSQL:mySQLEnDehors ALORS chretour=fSQL:mySQLCol(lCurReq,1)
SINON
fSQL:mySQLMsgBox(commande)
FIN
fSQL:mySQLFerme(lCurReq)

CAS cSQLITE
chretour=fSQL:mySQLDernierId()

CAS cSQLSERVER
commande="SELECT @@IDENTITY AS 'Identity'"
SI fSQL:mySQLExec(commande,lCurReq)
fSQL:mySQLPremier(lCurReq)
SI PAS fSQL:mySQLEnDehors ALORS chretour=fSQL:mySQLCol(lCurReq,1)
SINON
fSQL:mySQLMsgBox(commande)
FIN
fSQL:mySQLFerme(lCurReq)
FIN
RENVOYER chretour


Mais il me retourne 0 le pleutre !!!
Sur Internet on trouve des ex qui parlent d'envoyer le select dans le meme
recordset séparé par un ;. Mais je ne vois pas comment avec les accès
alternatifs ???

En plus pas facile de modifier mon code qui est le meme pour toutes mes
fenêtres et qui doit s'adapter au sgbd.

Merci de vos idées.




--
Eric Roumégou
Webmaster des wtablettes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)