Bonjour à tous,
Est-ce normal de ne pas retrouver un enregistrement immédiatement après son insertion ?
En effet, après un insert suivi d'un commit, close et open, locate me renvoie false sur l'ID que je viens d'insérer !
XP, D7, FB 2.0, Zeos,
Merci








Bonjour à tous,
Est-ce normal de ne pas retrouver un enregistrement immédiatement après son insertion ?
En effet, après un insert suivi d'un commit, close et open, locate me renvoie false sur l'ID que je viens d'insérer !
XP, D7, FB 2.0, Zeos,
Merci
Salut
De deux choses l'une, ou ton commit n'est pas effectif, ou bien l'ID récupéré n'est pas le bon.
Je ne vois que ça.
@+








Merci Cl@udius.
Voici la portion de code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 Screen.Cursor := crHourGlass; qDep := TZQuery.Create(nil); try with qDep do begin Connection := DM.FANNY; SQL.Clear; myIdDep := DM.GetGenerator('GEN_DEPENSE_ID'); SQL.Add('INSERT INTO DEPENSE ' + ' (ID_DEPENSE, NO_DEPENSE, DATE_DEPENSE, '+ ' TYPE_DEPENSE, ID_BEN, OBJET, REMBOURS, ' + ' ID_USER, DATEC, DATEM ) ' + 'VALUES(:ID_DEPENSE, :NO_DEPENSE, :DATE_DEPENSE, '+ ' :TYPE_DEPENSE, :ID_BEN, :OBJET, :REMBOURS, ' + ' :ID_USER, :DATEC, :DATEM ) ' ); ParamByName('TYPE_DEPENSE').AsInteger := SALAIRE; ParamByName('REMBOURS').AsInteger := PAIEMENT; ParamByName('NO_DEPENSE').AsString := IntToStr(myIdDep); ParamByName('DATEC').AsDateTime := Date; ParamByName('ID_DEPENSE').AsInteger := myIdDep; ParamByName('DATE_DEPENSE').AsDateTime:= StrToDate(edDFact.Text); ParamByName('ID_BEN').AsInteger := StrToInt(edBen.Text); ParamByName('OBJET').AsString := Trim(edObjet.Text); ParamByName('ID_USER').AsString := myUserId; ParamByName('DATEM').AsDateTime := Date; ExecSQL; DM.CommitData; Application.ProcessMessages; end; finally FreeAndNil(qDep); Application.ProcessMessages; qDepense.Close; qDepense.ParamByName('TYPE_DEPENSE').AsInteger := SALAIRE; qDepense.Open; qDepense.Refresh; Application.ProcessMessages; qDepense.Locate('ID_DEPENSE', myIdDep, []); DisplayRec; Screen.Cursor := crDefault; Application.ProcessMessages; end;
Bonjour,
Sans être un spécialiste, il me semble qu'il manque dans ton code l'ouverture de la transaction. Le principe est le suivant
Après cette opération ta transaction est close, tu peux faire une recherche conformément à la dernière partie de ton code.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Start_Transaction; try ExecSQL; Commit; except Rollback; end;
Personnellement, j'ai la même configuration que toi et n'ai jamais eu aucun souci pour réaliser un locate.
Je te mets un exemple de l'un de mes programmes
CloseOpenLocate est une procédure qui regroupe les trois instructions.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15dm.ZConnect.StartTransaction; try ExecSQL; except lTest := False; dm.ZConnect.Rollback; MsgDlg(f_LireMessage(kMsgGeneral_02), mtWarning, ['mbOk'], ed1.ClientOrigin.Y + ed1.Height, pnl1); end; dm.ZConnect.Commit; // Retour vers l'unité d'appel avec le n° de position if lTest then begin dm.CloseOpenLocate(FParams.Ftb_Com, 'ID_REPR', lNoEnr); btnAnnulerClick(btnValider); end;
Quelques remarques sur ton code.
Il me semble pas nécessaire de faire "qDepense.Refresh;" après un open. En principe, l'instruction refresh correspond au code suivant :
Y a t-il nécessité de mettre dans ton code l'instruction "Application.ProcessMessages;" ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2tb.Close; // tb = Table tb.Open;
@Claudius est plus averti que moi, il t'en dira certainement d'avantage.
Bon courage
le premières questions qui me viennent à l'esprit sont : Es-tu sur de la valeur myIDDep et de SALAIRE (parametre du query) ? comment se comporte le générateur dans la base ? y a t-il des enregistrements dans la table , avec quels codes ?
une seconde remarque ,tant qu'a faire d'utiliser les zeos pourquoi ne pas utiliser ZSequence ?
@seabs , j'aurais plutôt mis le commit à l'intérieur du try .. except
par contre merci , je ne connaissais pas le CloseOpenLocate , une ligne au lieu de 3 mes doigts vont être content
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10dm.ZConnect.StartTransaction; try ExecSQL; dm.ZConnect.Commit; // ici except lTest := False; dm.ZConnect.Rollback; MsgDlg(f_LireMessage(kMsgGeneral_02), mtWarning, ['mbOk'], ed1.ClientOrigin.Y + ed1.Height, pnl1); end;![]()








Merci SergioMaster,
Le couple Commit/RollBack est fait dans la procedure DM.CommitData. Voici le code :
Je n'utilise pas StartTransaction car il n'est pas permis quand AutoCommit est à False !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 procedure TDM.CommitData; begin try FANNY.Commit; except FANNY.RollBack; Dialog('Les informations n''ont pas été enregistrées ! '+ 'Elles ont été restaurées.', mtError, [mbOK], 0); end; Application.ProcessMessages; end;
Le refresh et autres Application.ProcessMessages en plus sont pour tenter le diable (Je sais que Close/Open suffit !)
Le générateur ramène la bonne valeur (j'ai mis un point d'arrêt dessus !) et SALAIRE est une constante !
Le problème n'est toujours pas réglè !
N.B : ZSequence ?? J'avoue ne pas l'avoir utilisé et CloseOpenLocate, je ne savais pas, non plus, que ça existait ! Alors à mon tour de te remercier !
Bonjour,
@SergioMaster
Je suis d'accord avec toi sur le placement du commit. Je ne sais d'ailleurs pourquoi dans cette procédure il est placé après exception. Une étourderie de plus.
Pour la procédure CloseOpenLocate, elle n'est pas incluse dans Zeos, il s'agit d'une fabrication maison.
Pour @akli_agha
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 // Gérer fermer, ouvrir une table et sélectionner un enregistrement procedure Tdm.CloseOpenLocate(pQry: TZReadOnlyQuery; pField: string; pVariant: Variant); begin with pQry do begin DisableControls; try Active := False; Active := True; if pField <> '' then Locate(pField, pVariant, []); finally EnableControls; end; end; end;
Tu es certain que cette partie de code appelle bien l'enregistrement que tu viens d'inclure dans ta table.
Hormis ce point, je ne vois pas pourquoi, tu ne trouves pas l'enregistrement inséré. L'ensemble du traitement me paraît correct.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6qDepense.Close; qDepense.ParamByName('TYPE_DEPENSE').AsInteger := SALAIRE; qDepense.Open; qDepense.Refresh; Application.ProcessMessages; qDepense.Locate('ID_DEPENSE', myIdDep, []);
Bon courage dans ta recherche








Il était temps de trouver la coquille car ce satané trigger a failli me faire monter la Gly. !
Désolé chers amis de vous avoir fait trimer. En fait à l'origine j'ai placé un trigger que je devais supprimer et qui est tombé dans les oubliettes !
Vous aurez tout compris.
Encore une fois désolé et merci pour l'assistance.
Akli.
Partager