IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

Locate après Insert


Sujet :

Bases de données Delphi

  1. #1
    Membre actif
    Inscrit en
    Décembre 2004
    Messages
    390
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 390
    Points : 288
    Points
    288
    Par défaut Locate après Insert
    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

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    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.

    @+

  3. #3
    Membre actif
    Inscrit en
    Décembre 2004
    Messages
    390
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 390
    Points : 288
    Points
    288
    Par défaut
    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;

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 577
    Points : 1 073
    Points
    1 073
    Par défaut
    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
    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;
    Après cette opération ta transaction est close, tu peux faire une recherche conformément à la dernière partie de ton code.
    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
    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
        dm.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;
    CloseOpenLocate est une procédure qui regroupe les trois instructions.
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      tb.Close;   // tb = Table
      tb.Open;
    Y a t-il nécessité de mettre dans ton code l'instruction "Application.ProcessMessages;" ?
    @Claudius est plus averti que moi, il t'en dira certainement d'avantage.
    Bon courage

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 183
    Points : 41 383
    Points
    41 383
    Billets dans le blog
    63
    Par défaut
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       dm.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;
    par contre merci , je ne connaissais pas le CloseOpenLocate , une ligne au lieu de 3 mes doigts vont être content

  6. #6
    Membre actif
    Inscrit en
    Décembre 2004
    Messages
    390
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 390
    Points : 288
    Points
    288
    Par défaut
    Merci SergioMaster,

    Le couple Commit/RollBack est fait dans la procedure DM.CommitData. Voici le code :
    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;
    Je n'utilise pas StartTransaction car il n'est pas permis quand AutoCommit est à False !

    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 !

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 577
    Points : 1 073
    Points
    1 073
    Par défaut
    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.
    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;
    Pour @akli_agha

    Tu es certain que cette partie de code appelle bien l'enregistrement que tu viens d'inclure dans ta table.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        qDepense.Close;
        qDepense.ParamByName('TYPE_DEPENSE').AsInteger := SALAIRE;
        qDepense.Open;
        qDepense.Refresh;
        Application.ProcessMessages;
        qDepense.Locate('ID_DEPENSE', myIdDep, []);
    Hormis ce point, je ne vois pas pourquoi, tu ne trouves pas l'enregistrement inséré. L'ensemble du traitement me paraît correct.
    Bon courage dans ta recherche

  8. #8
    Membre actif
    Inscrit en
    Décembre 2004
    Messages
    390
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 390
    Points : 288
    Points
    288
    Par défaut
    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.

Discussions similaires

  1. [PowerBuilder] Prob. d'affichage après insertion de contrôle
    Par Oakenshield dans le forum Powerbuilder
    Réponses: 1
    Dernier message: 30/01/2006, 14h37
  2. Affichage d'une image après insertion dans une base
    Par leloup84 dans le forum Langage
    Réponses: 9
    Dernier message: 24/01/2006, 16h34
  3. Rafraichir dbgrid apres insertion d'une donnée ds une table
    Par gizmorambo dans le forum Bases de données
    Réponses: 7
    Dernier message: 11/01/2005, 16h03
  4. [VB.NET] [ADO.NET] Récupérer id après insertion
    Par nashouille dans le forum Accès aux données
    Réponses: 9
    Dernier message: 09/01/2005, 15h54
  5. récupérer valeur d'un ID après insertion
    Par rikidi dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/08/2003, 22h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo