Gambas France BETA


Pas de compte ? Incription

Récuper le l'id après une maj de table

Ce sujet est résolu.

1
AuteurMessages
manu#1 Posté le 14/11/2011 à 08:23:28
Avec Gambas ca roule !Bonjour,

Dans mon projet, j'enchaine 3 formulaires pour saisir des données que j'enregistre à chaque fois dans une table différente.
Toutes ces tables sont liées par un champ id. Lors de l'enregistrement de Form1 dans table1, le champ id, de type série, est donc créé automatiquement.
Je souhaite récupérer la valeur de ce champs juste après l'enregistrement (pour l'envoyer au formulaire suivant en fait). J'ai fait ça mais ça ne marche pas :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
'---------------------------------------------------------------------------------------------------
'----------- 'Mise à jour de la base apres creation ou modification -------------------
'---------------------------------------------------------------------------------------------------

PUBLIC SUB ValidRation()
DIM hResult AS Result
hResult = db.Create("Table1")
hResult!NomRation = TextBox2.Text
hResult!DateCreation = DateBox1.Value
hResult!DateDebut = DateBox2.Value
hResult!DateFin = DateBox3.Value
hResult!Lot = TextBox1.Text
hResult!NombreAnimaux = SpinBox1.Value

hResult.Update
Message.Info("la fiche " & TextBox2.Text & "\n est bien enregistrée"

PRINT hresult!id ' <-------------------------- aucune valeur !

END


Bon à vrai dire je m'en doutais :).

Savez vous si il y a une méthode simple pour connaitre cette valeur ?

Merci d'avance
Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
jeanyvon#2 Posté le 14/11/2011 à 13:04:11
Gambas? Ma! Et gustosalut,
Est-ce que les autres valeurs sont enregistrées? CàD :
1
PRINT hRseult!lot
donne quelque chose?
Si oui, renseigne ton index. Ta méthode doit tolérer les champs vides.
@+
JY
Vieillir? On peut retarder mais pas y échapper!
manu#3 Posté le 14/11/2011 à 13:26:30
Avec Gambas ca roule !Oui, l'enregistrement des autres valeurs se passe très bien, et le champ Id est bien incrémenté automatiquement. Mais pour l'avoir dans hResult je crois que je ne vais pas couper a faire une requête...

un truc du genre :

1
hResult = DB.exec("SELECT max(id) from table1")


J'aurais espéré un tour de magie comme gambas nous en reverse souvent.

Mais si notre magicien préféré passe par là, il va peut être nous sortir ça de son chapeau :)
Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
manu#4 Posté le 14/11/2011 à 13:53:36
Avec Gambas ca roule !bon, en fait faut faire ca :

1
2
hResult = DB.exec("SELECT MAX(id) as idLast FROM Table1") ' idLast c'est le nom du champ que je donne au résultat de la requête
Message.Info("ID = " & hResult!idLast)


Renommer le champ de réponse (pour moi idLast) est indispensable car par défaut il s'appelle MAX(id) et là, Gambas s’emmêle les pinceaux avec sa fonction Max à lui ;)

Bon je met pas en résolu tout de suite au cas ou le chapeau ne soit pas vide :) :cheers:
Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
Prokopy#5 Posté le 14/11/2011 à 18:30:59
Kinder PinguiSalut manu,

En effet il y a plus simple :

1
hResult = DB.Exec("SELECT LAST_INSERT_ID() As id")


La fonction LAST_INSERT_ID() retourne l'identifiant du dernier champ ajouté à la base de données, tout simplement. C'est plus rapide que de calculer un maximum (surtout si la table est grosse) et parfois même plus exact, dans certains cas un peu tordus le dernier id n'est pas forcément le plus grand. ;)
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
gambix#6 Posté le 14/11/2011 à 20:30:02
Faire simple !La solution de Prokopy est plus sur, car celle de manu n'est valable que si l'id est automatique, donc parfaitement incrémentielle
Moins de texte dans une signature c'est agrandir son espace.
manu#7 Posté le 14/11/2011 à 20:56:44
Avec Gambas ca roule !ok, merci a tous les deux mais je crois que cette fonction est propre à MySql vu ce que j'ai lu ici : http://forum.hardware.fr/hfr/Programmation/SGBD-SQL/equivalent-sql-last_insert_id-sujet_106696_1.htm

Je suis sur une base Sqlite, je vais quand même essayer :)
Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
manu#8 Posté le 14/11/2011 à 21:03:49
Avec Gambas ca roule !Heu dans le database manager de Gambas, ca ne marche pas...

C'est bien ca la requête ??? :

SELECT LAST_INSERT_ID() As id FROM Table1

Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
Prokopy#9 Posté le 14/11/2011 à 22:03:17
Kinder PinguiIl n'y a pas de FROM dans la requête. :)

SELECT LAST_INSERT_ID() As id
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
gambix#10 Posté le 14/11/2011 à 22:06:57
Faire simple !oui c'est a appeler après la dernière entrée .. car ça donne le dernier id toute table confondue
Moins de texte dans une signature c'est agrandir son espace.
manu#11 Posté le 15/11/2011 à 22:37:34
Avec Gambas ca roule !Bonjour,


Bon je suis sur une Bsae SQlite donc la fonction ne marche pas...

Va pt'être falloir que je m’intéresse plus à MySql :)

Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
Prokopy#12 Posté le 16/11/2011 à 14:40:57
Kinder PinguiIl me semble que sous SQLite la fonction c'est pas LAST_INSERT_ID() mais LAST_INSERT_ROWID(). ;)
http://www.sqlite.org/lang_corefunc.html#last_insert_rowid

MySQL est en effet plus puissant mais aussi plus lourd. Avec SQLite t'as juste à avoir un fichier qui contient la base de données, niveau portabilité c'est comme si tu avais un fichier de config de gb.settings. Avec MySQL il faut lancer le serveur MySQL avant de lancer ton application, ce qui est très lourd. :|
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
manu#13 Posté le 16/11/2011 à 21:23:10
Avec Gambas ca roule !Ok, super et merci. Ca marche nickel :)
Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
1