OVH Cloud OVH Cloud

récupérer la clef dautomatique d'un reccordset

8 réponses
Avatar
thierry
Hello, je fais un insertion dans une table ACCESS où la clef est
générée automatiquement. Le Update se passe bien, par contre je ne sais
pas comment faire pour récupérer la valeur de la clef qui a été générée
par ACCESS. Avez vous une idée?

Cdt

Thierry

PS:

je travaille en DAO

je créer un reccordset sur la table
je fais un add new
puis update.

c'est une fois là que je voudrais récpérer la clef généré
automatiquement....

8 réponses

Avatar
Quasimodo
thierry expressed precisely :
Hello, je fais un insertion dans une table ACCESS où la clef est
générée automatiquement. Le Update se passe bien, par contre je ne sais
pas comment faire pour récupérer la valeur de la clef qui a été générée
par ACCESS. Avez vous une idée?

Cdt

Thierry

PS:

je travaille en DAO

je créer un reccordset sur la table
je fais un add new
puis update.

c'est une fois là que je voudrais récpérer la clef généré
automatiquement....



Bonjour,
Il existe sur le site msdn un topic la dessus, sorry je ne me souvien
plus de l'url.
Un bon conseille (je suis passé sur ce problème aussi), n'utilisez pas
d'autonumber. Gérer vous même les clefs.
Je vais essayer de retrouver l'url.

@+Quaz

--
This is an automatic signature of MesNews.
Site : http://mesnews.no-ip.com
Avatar
Pascal B.
Salut Thierry,

Il suffit de lire le contenu du champs juste après le AddNew et avant le Update.
Exemple:

Dom DB as Database
Dim RS as Recordset
Dim Cle as Long
'...
Set RS = DB.OpenRecordset("MaTable")
RS.AddNew
'Récupération de la valeur de la clé générée automatiquement
Cle = RS!MonChampCle
'Initialisation des autres champs
'...
RS.Update
RS.Close

Pascal B.



"thierry" wrote in message news:
|
| Hello, je fais un insertion dans une table ACCESS où la clef est
| générée automatiquement. Le Update se passe bien, par contre je ne sais
| pas comment faire pour récupérer la valeur de la clef qui a été générée
| par ACCESS. Avez vous une idée?
|
| Cdt
|
| Thierry
|
| PS:
|
| je travaille en DAO
|
| je créer un reccordset sur la table
| je fais un add new
| puis update.
|
| c'est une fois là que je voudrais récpérer la clef généré
| automatiquement....
Avatar
thierry
In article ,
says...
Salut Thierry,

Il suffit de lire le contenu du champs juste après le AddNew et avant le Update.
Exemple:

Dom DB as Database
Dim RS as Recordset
Dim Cle as Long
'...
Set RS = DB.OpenRecordset("MaTable")
RS.AddNew
'Récupération de la valeur de la clé générée automatiquement
Cle = RS!MonChampCle
'Initialisation des autres champs
'...
RS.Update
RS.Close

Pascal B.



"thierry" wrote in message news:
|
| Hello, je fais un insertion dans une table ACCESS où la clef est
| générée automatiquement. Le Update se passe bien, par contre je ne sais
| pas comment faire pour récupérer la valeur de la clef qui a été générée
| par ACCESS. Avez vous une idée?
|
| Cdt
|
| Thierry
|
| PS:
|
| je travaille en DAO
|
| je créer un reccordset sur la table
| je fais un add new
| puis update.
|
| c'est une fois là que je voudrais récpérer la clef généré
| automatiquement....






super génial, ça marche

MERCI BEAUCOUP

cordialement

Thierry
Avatar
jmn
Version 1 : la propriété lastmodified du recordset retourne un bookmark sur
le dernier enregistrement modifié/créé

Version 2 : un "select top 1 * from table order by compteur desc" permet de
retrouver le dernier enregistrement si : compteur est en incrément
automatique et pas en aléatoire, et si vous avez un index dessus (si +
milliers d'enr).

Tout cela suppose que vous soyez à peu près certain qu'à un instant donné
(quelques secondes) il n'y ai qu'un seul utilisateur qui soit en train de
créer un enregistrement dans la table. Sinon, rajoutez des critères à la
version 2 (sur ce qui vient d'être saisi ou des données relatives au
contexte) pour être sûr de retrouver le bon enr :
"select top 1 * from table where truc='" & dat(0) & "' and machin ='" &
dat(25) & "' order by compteur desc"
Prenons l'exemple d'une saisie de ligne de facture. Il peut bien avoir 150
utilisateurs en train de saisir des lignes, mais chacun travaille dans sa
facture. Donc, retrouver la plus grande valeur de 'compteur' pour les lignes
saisies en référence de LA facture 3213213 retourne bien l'enr. voulu.


(accessoirement, après un .addnew le pointeur de lecture du recordset reste
là où il était avant...)
Avatar
thierry
In article , says...
Version 1 : la propriété lastmodified du recordset retourne un bookmark sur
le dernier enregistrement modifié/créé

Version 2 : un "select top 1 * from table order by compteur desc" permet de
retrouver le dernier enregistrement si : compteur est en incrément
automatique et pas en aléatoire, et si vous avez un index dessus (si +
milliers d'enr).

Tout cela suppose que vous soyez à peu près certain qu'à un instant donné
(quelques secondes) il n'y ai qu'un seul utilisateur qui soit en train de
créer un enregistrement dans la table. Sinon, rajoutez des critères à la
version 2 (sur ce qui vient d'être saisi ou des données relatives au
contexte) pour être sûr de retrouver le bon enr :
"select top 1 * from table where truc='" & dat(0) & "' and machin ='" &
dat(25) & "' order by compteur desc"
Prenons l'exemple d'une saisie de ligne de facture. Il peut bien avoir 150
utilisateurs en train de saisir des lignes, mais chacun travaille dans sa
facture. Donc, retrouver la plus grande valeur de 'compteur' pour les lignes
saisies en référence de LA facture 3213213 retourne bien l'enr. voulu.


(accessoirement, après un .addnew le pointeur de lecture du recordset reste
là où il était avant...)





je profite de votre réponse pour rebondir sur une question qui me
titille depuis un certain temps.

Quand je bossais sur la base de données Ingres avec l'outil OPEN ROAD,
nous gérions nos clef nous mêmes. Pour cela, on indiquait explicitement
que nous posions un verrrou exclusif sur une table, puis nous débutions
notre transaction (en écrivant set autocommit off), nous faisions une
série de transaction sur plusieurs tables et si tout se passait bien,
nous faisions un commit ou sinon un rollback.

En VB, je peux poser des verrous au niveau du Recordset, mais je ne sais
pas comment pas comment gérer le commit ou le rollback, dan sle cas de
plusieurs transactions. Avez vous une idée? Je pense que le commit est
géré par le update du reccordset...
Avatar
jmn
Les transactions sont gérées dans VB à travers des méthodes associées au
moteur de GBD utilisé.
Les méthodes sont BeginTrans, CommitTrans, Rollback(trans) (rollback avec
DAO, rollbacktrans avec ADO)

Avec DAO, le moteur Jet réalise les opérations en local ( fichiers dans
temp) et, en cas de succès, il transfère les résultats dans la base réelle.
En pratique, cela ne marche pas bien car la base est lockée en totalité
pendant toutes la manoeuvre et il n'y a pas de gestion centralisée qui
permettent de régler les conflits sur plusieurs transactions issues de
postes différents qui se lanceraient 'à peu près' en même temps. De plus,
lemoteur Jet a tendance à se prendre les pieds dans sa gestion des fichiers
TEMP (avec une grosse appli DAO il faut toujours commencer par vider
temp...) ! Mon expérience montre qu'avec DAO il est moins risqué de traiter
le problème par du code que de le sous-traiter à DAO.

Avec ADO et SQL Server (par exemple) les requêtes sont controlées et
journalisées au niveau du serveur, et ca marche très bien.
Avatar
thierry
In article <#KHN#, says...
Les transactions sont gérées dans VB à travers des méthodes associées au
moteur de GBD utilisé.
Les méthodes sont BeginTrans, CommitTrans, Rollback(trans) (rollback avec
DAO, rollbacktrans avec ADO)

Avec DAO, le moteur Jet réalise les opérations en local ( fichiers dans
temp) et, en cas de succès, il transfère les résultats dans la base réelle.
En pratique, cela ne marche pas bien car la base est lockée en totalité
pendant toutes la manoeuvre et il n'y a pas de gestion centralisée qui
permettent de régler les conflits sur plusieurs transactions issues de
postes différents qui se lanceraient 'à peu près' en même temps. De plus,
lemoteur Jet a tendance à se prendre les pieds dans sa gestion des fichiers
TEMP (avec une grosse appli DAO il faut toujours commencer par vider
temp...) ! Mon expérience montre qu'avec DAO il est moins risqué de traiter
le problème par du code que de le sous-traiter à DAO.

Avec ADO et SQL Server (par exemple) les requêtes sont controlées et
journalisées au niveau du serveur, et ca marche très bien.







ok,
moi je bosse avec ACESSS, par contre, dès que j'ai terminé mon appli, je
vais utiliser ADO à la place de DAO. Est ce que cela sera mieux?
Avatar
jmn
Fondamentalement, cela ne change rien... DAO et ADO ne sont que des
interfaces entre le programme et les moteurs de gestion.
Pour un fonctionnement parfaitement sûr, et par principe même, choisissez un
sgbd client/serveur (oracle, sql server, db2, etc...) ou, si vous y tenez
absolument, bricolez un module centralisé avec Access pour le faire tourner
en client/serveur (des exemples existes sur le web et sur
msdn.microsoft.com).
Maintenant, s'il s'agit d'une application légère avec un nombre de postes
réduits, ne vous cassez pas la tête et continuez avec Access (si possible
dans une version supérieure ou égale à 2000, cela réduit les risques...).