Précédent   Forum des professionnels en informatique > Bases de données > Firebird > Débuter
Débuter Forum d'entraide pour débuter avec Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/04/2005, 21h15   #1
Nouveau Membre du Club
 
Inscription : décembre 2004
Messages : 74
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 74
Points : 25
Points : 25
Par défaut Numéro auto-incrément

Bonjour!

J'ai plusieurs tables avec comme clé primaire des numéros qui s'incrementent tout seuls, que j'ai fait à l'aide de Trigger et de Generator avec la mention "Before Update"

Maintenant par exemple, (avant j'avais mes données sur Access et ca ne me faisait pas ca), lorsque je fais un ajout d'un enregistrement dans une de ces tables, je ne suis pas capable de récupérer le numéro auto.

Voici mon exemple, en VB, avant ca marchais, plus maintenant car ca ajoute le numéro auto après (au moment de rst.update), pas au moment ou je créé la ligne. Donc quand j'essaie de récupérer ma valeur dans idEmp, ca fait une erreur car idEmployeur n'a pas de valeur assigné encore.

Code :
1
2
3
4
5
SET rst = db.OpenRecordset("Employeur")
  rst.AddNew
  rst("nomCompagnieEmployeur") = "Compagnie1"
  idEmp = rst("idEmployeur")
  rst.UPDATE

Et si je tente de récuperer le "idEmployeur" après le update, comme ca:

Code :
1
2
3
4
5
SET rst = db.OpenRecordset("Employeur")
  rst.AddNew
  rst("nomCompagnieEmployeur") = "Compagnie1"
  rst.UPDATE
  idEmp = rst("idEmployeur")
ca me retourne le premier "idEmployeur" de toute la table, pas le dernier créé.

Merci d'avance de votre aide.
mona est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2005, 08h31   #2
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Par défaut Re: Numéro auto-incrément

Citation:
Envoyé par mona
Bonjour!

J'ai plusieurs tables avec comme clé primaire des numéros qui s'incrementent tout seuls, que j'ai fait à l'aide de Trigger et de Generator avec la mention "Before Update"
Before Update est déclanché AVANT une mise à jours d'enregistrement. Or ce n'est pas lorsqu'on met à jour un enregistrement (UPDATE) qu'on a besoin de définir une clé primaire mais lors de sa création (INSERT)

Donc le trigger doit être sur le BEFORE INSERT, et celui ci est utile uniquement dans le cas ou vous n'avez pas renseigné la clé primaire (donc il y a un if (cle is null) then Cle = gen_id(generateur,1); ) car en effet si vous souhaitez lors d'un insert spécifier une clé, votre trigger ne dois pas effacer ce que vous avez spécifé.

Maintenant l'autre probleme : Comment récupérer l'identifiant affecté à l'enregistrement nouvellement inséré ?

Il existe des tuto ici qui même s'ils ne sont pas dédiés à ASP.NET expliquent comment procéder.

Mais voici le principe à respecter :
Si cet identifiant a été affecté par le trigger, c'est impossible (à moins que vous ne soyez dans une application mono-utilisateur car dans ce cas il suffira de faire un select max(Cle) from matable (ce qui n'est pas tres performant ou un select gen_id(MonGenerateur,0) mais surtout faudra changer impérativement de méthode lorsque vous passerez votre appli en mode multi-poste donc autant prendre de bonnes habitudes dès le début).

Donc la seule solution pour récupérer un identifiant c'est de demander un indentifiant unique avant l'insertion.

Faire un
Code :
SELECT gen_id(MonGenerateur,1) FROM Rdb$database;
et utiliser ce résultat pour créer le nouvel enregistrement.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2005, 15h28   #3
Nouveau Membre du Club
 
Inscription : décembre 2004
Messages : 74
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 74
Points : 25
Points : 25
Merci !
mona est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2005, 00h13   #4
Nouveau Membre du Club
 
Inscription : décembre 2004
Messages : 74
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 74
Points : 25
Points : 25
Un peu en retard, mais je n'avais pas encore eu le temps de tester ça.

Moi je suis en Access.. je crois qu'il est impossible pour moi d'utiliser cette ligne de code là n'est ce pas?

Code :
1
2
 
SELECT gen_id(MonGenerateur,1) FROM Rdb$database;
Y a-t-il une autre solution semblable possible des formulaires Access?

Merci
mona est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2005, 09h58   #5
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Pourquoi ce n'est pas possible ? c'est du SQL...
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2005, 16h21   #6
Nouveau Membre du Club
 
Inscription : décembre 2004
Messages : 74
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 74
Points : 25
Points : 25
Ben je n'ai pas réussi. Je ne comprends pas par quoi remplacer J'utilise un driver ODBC, mais j'ai fait des liens uniquement sur les tables. Ma chaîne de connexion pour chaque table est la suivante:
Code :
ODBC; DSN=Connexion a Jurimaitre; Driver=Firebird/Interbase(r) driver; Dbname=C:\JURIMAITRE.FDB; CHARSET=NONE;
Alors pouvez-vous m'indiquer par quoi remplacer Rdb$database pour que ca aille chercher le générateur de la bd FireBird?

Merci
mona est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2005, 21h18   #7
Nouveau Membre du Club
 
Inscription : décembre 2004
Messages : 74
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 74
Points : 25
Points : 25
J'ai fini par comprendre, voici comment je m'y suis pris

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
 
    Dim cnx AS ADODB.Connection
    SET cnx = New ADODB.Connection
    Dim rst AS ADODB.Recordset
    SET rst = New ADODB.Recordset
 
    cnx.ConnectionString = "DSN=nomConnexion;UID=SYSDBA;PWD=motDePasse;"
 
    cnx.Open
 
    rst.Open "SELECT gen_id(monGenerateur, 1) AS id FROM Rdb$database", cnx
 
    MsgBox (rst("id"))
 
    cnx.Close
Voilà! Je ne comprenais pas qu'il fallait ouvrir une connexion..

Merci.
mona est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h45.


 
 
 
 
Partenaires

Hébergement Web