PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Récupération id automatique apres un insert (hfsql)
Récupération id automatique apres un insert (hfsql)
Débuté par LC, 28 fév. 2018 11:43 - 18 réponses
Membre enregistré
628 messages
Popularité : +0 (16 votes)
Posté le 28 février 2018 - 11:43
Bonjour à tous,
je dois écrire 1 enregistrement dans une table "entete" et 3 enregistrements dans une table "détail"
qui sont liés bien entendu par une rubrique : (entete.cle et detail.cleentete)
Entete.cle étant l'id automatique de la table entete.
Pour des raisons évidentes de cohérence d'écriture (intégrité) , je démarre donc une transaction au départ,
ensuite une requête insert pour écrire l'entete et ensuite 3 requêtes insert pour écrire le détail
et à la fin je valide ma transaction ...
Mon problème est le suivant : il faut que je récupère l'id auto après avoir fait l'insert sur l'entete pour pouvoir
la récupérer afin de l'écrire dans le détail. Comment dois je faire vu que la transaction est en cours ?
Membre enregistré
950 messages
Popularité : +53 (63 votes)
Posté le 28 février 2018 - 12:14
Bonjour,

De memoire, apres un hajoute() l'enregistrement recupere automatiquement le dernier id

exemple
Le dernier enregistrement est 123
TOTO.NOM = "TATA"
HAjoute(TOTO)
Info(TOTO.ID) // doit afficher 124

Dans le cas du hexecuterequete() je ne sais pas je n'ai jamais testé

Jordan
Membre enregistré
628 messages
Popularité : +0 (16 votes)
Posté le 28 février 2018 - 13:19
si j'ai posé la question c'est que je n'utilise pas Hajoute mais une requête insert.
Membre enregistré
18 messages
Posté le 28 février 2018 - 13:21
Bonjour

Faite une requête qui récupère la plus grande id
Message modifié, 28 février 2018 - 13:22
Membre enregistré
628 messages
Popularité : +0 (16 votes)
Posté le 28 février 2018 - 13:33
même si la transaction n'est pas validée, la requête me renverra l'id ?
Membre enregistré
18 messages
Posté le 28 février 2018 - 13:43
Oui, enfin avec HyperFile et MySql ça fonctionne en tout cas
Membre enregistré
628 messages
Popularité : +0 (16 votes)
Posté le 28 février 2018 - 13:45
Ok, merci pour votre réponse
Posté le 02 mars 2018 - 11:25
Bjr,

LC avait soumis l'idée :
si j'ai posé la question c'est que je n'utilise pas Hajoute mais une requête
insert.


Ben c 'est peut etre la que tu as tort.
ajout ou suppression modif , les H* conviennent bien mieux.
Par contre a fond sur les requetes pour les Select...

a plus

--
-------------------------------------------------------------
www.ctc-soft.com
Gestion biblo-documentaire (free-share)
Comptabilité shareware
Logiciels de Gestion de saisie terrain
Spécialisé Tournées de boulangers
-------------------------------------------------------------
Membre enregistré
165 messages
Popularité : +12 (12 votes)
Posté le 02 mars 2018 - 12:03
Bonjour;
Ou bien change la règle :
l'entête peut avoir "0" ou "N" Détail.

Bon Dev.
Posté le 15 mars 2018 - 18:33
Bonjour,

@LC : Avez vous trouvé une solution ? Je suis confronté au même cas, et apparemment tant que la transaction n'est pas validée je n'arrive pas à récupérer l'ID.
Cela fonctionne avec des HAjoute, mais il me semble que c'est mieux avec une requête INSERT.

Qu'en pensez-vous ?

J'utilise HFSQL, dernière version.

Michel
Membre enregistré
232 messages
Popularité : +23 (23 votes)
Posté le 16 mars 2018 - 05:47
Salut à tous,

Essayez de regarder du côté de l'isolation des transactions (https://doc.pcsoft.fr/?1000017316), et tentez en READ UNCOMMITTED.

Sinon pour ma part, je n'utilise quasiment que les requêtes pour de la lecture, mais pour l'écriture j'ai une nette préférence pour les ordres H. Mais bon, là on est presque dans du dogmatique, donc pas de débat.

Cdt,

Marc
Posté le 16 mars 2018 - 13:18
Bonjour Marc,

J'ai testé en isolant la transaction avec hReadUncommitted, sans résultat.
Je vais passer par des HAjoute parce ce que j'ai déjà perdu trop de temps là-dessus...

Merci quand même pour ta réponse. Quand j'aurai le temps je referai des tests, mais là je sature :)
Membre enregistré
232 messages
Popularité : +23 (23 votes)
Posté le 16 mars 2018 - 17:29
Pour être totalement honnête, je t'avoue que j'avais moi aussi déjà essayé de changer le mode d'isolation des transactions, sans résultat aucun. J'avais pensé que ça venait de moi et de mes deux mains gauches. Donc dans un sens ça me rassure que chez toi non plus ça ne fonctionne pas, mais en même temps je suis désolé que ça n'ai pas pu t'aider à résoudre ton problème.

Je comprends ta saturation, je pense que ça nous arrive à tous de temps en temps ;)

Bon courage et bon dev,

Marc.
Posté le 16 mars 2018 - 17:44
Merci Marc pour ton soutien :) Au moins j'aurai essayé. Les HAjoute fonctionnent alors...
C'est vrai que de plus en plus j'essaie d'utiliser au maximum les requêtes UPDATE et INSERT.
Malheureusement, HFSQL n'est pas top pour certaines requêtes, et aussi pour les jointures multiples.. (surtout au niveau des temps de réponse...). Mais ça c'est pas nouveau.

Bon dev à toi aussi, et surtout bon week-end !!
Posté le 16 mars 2018 - 18:03
Bonjour,

Pour récupérer ton ID automatique il faudrait travailler avec un rubrique chaine clé "Token" que tu alimentes avec le nom de la machine concaténée avec l'instance de l'appli et la date heure par exemple, ensuite tu récupère l'id correspondant à ton token

Mais bon, hajoute va aussi vite qu'un INSERT même sur les DB SQL donc est-ce vraiment nécessaire de devoir faire 2 accès DB pour le remplacer ?

Par contre pour les lecture multiples et / ou jointure SQL impératif, sauf éventuellement pour récupérer les rubriques d'un seul record d'un fichier ( positionnement avant HMODIFIE ou HSUPPIRME par exemle ) là HLitRecherchePremier ca aussi vite ( si pas plus en HF ) qu'un SELECT * qq soir la base

Bon Dev
Marc Fastré
www.marc-fastre.be
Membre enregistré
21 messages
Popularité : +1 (1 vote)
Posté le 19 mars 2018 - 20:43
Bonjour,

essayez ça :
HExécuteRequête(REQ_insert1,hModifieFichier, vos données.....)
VariableID =SQL.IdAuto
HExécuteRequête(REQ_insert1,hModifieFichier, vos données...VariableID ..)

ça marche pour moi

Bon Dev
Posté le 21 novembre 2018 - 17:18
SQL.IdAuto juste après la requête d'insertion remonte bien l'ID du nouvel enregistrement.:merci:

Merci bien pour cette astuce qui m'a évité de passer par des commandes H :merci:
Posté le 09 octobre 2022 - 01:54
Bonjour,

essayez ça :

la requete INSERT ;

SELECT LAST_INSERT_ID() ;

ça marche pour moi

Bon Dev
Membre enregistré
3 881 messages
Popularité : +227 (347 votes)
Posté le 09 octobre 2022 - 20:10
Bonjour,
LAST_INSERT_ID() est propre à MySQL

--
Il y a peut être plus simple, mais, ça tourne