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 :

bug Post dans un ADOQuery après un InsertRecord


Sujet :

Bases de données Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 30
    Points : 21
    Points
    21
    Par défaut [résolu]bug Post dans un ADOQuery après un InsertRecord
    Salut,

    Je me replonge dans un vieux bout de programme qui marchait (dans mes souvenirs...), et là ça marche plus... :-\ Le pb vient d'un Post dans un adoquery, précédé par un insertrecord :
    j'ai une TDBCtrlGrid, un bouton insérer, un bouton valider. Dans le onclick du bouton insérer, je ne fais qu'un insertrecord avec deux valeurs prédéfinies, et dans le onclick du bouton valider je ne fais qu'un "if adoquery1.State in dsEditModes then adoquery1.Post"
    Le insertrecord se fait bien, mais si l'utilisateur modifie ensuite une cellule tdbedit de la ctrl grid, puis clique sur valider, j'ai une EOleException "la ligne n'a pas pu être trouvée pour la mise à jour".
    J'ai dû loupé quelque chose... mais vois pas quoi ! La base Access possède bien une clé primaire pourtant. Cherché sur le web mais pas trouvé, vous avez une idée ?

    Merci beaucoup !

    --

    Thibaud

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Points : 22
    Points
    22
    Par défaut
    Salut

    J'ai eu le même problème.
    La clé primaire a du changée dans ton InsertRecord.
    Ton InsertRecord fait un Post. Utilise plutot Insert (qui ne fait pas de post)ainsi ton enregistrement ne va pas changer d'état.

    Ou alors il faudrait que tu fasse ton insertrecord et que tu recharge ton dataset. en utilisant DisableControls/EnableControls et les bookmark pour que ton rechargement soit transparent.

    Ou alors tu as une requete avec une jointure ?

    En fait, donne nous ta requete, ce sera plus simple.

    Fox

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Salut, merci pour ta réponse. La requête est un simple select * sur la table ! Je fais un insertrecord sur les deux premiers champs, le 1er étant un entier long (pas autoincrémenté), clé primaire. Dans la base au lancement de ce prog de test, il n'y a bien-sûr pas d'enregistrement dont la valeur du 1er champ est 10.

    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
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      with adoquery1 do
      begin
        SQL.Clear;
        SQL.Add('SELECT * FROM chantiers');
        Open;
      end;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      adoquery1.InsertRecord([10, 'tutu']);
    end;
     
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      adoquery1.Post;
    end;

  4. #4
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Ca plante tout autant avec un insert plutôt qu'un insertrecord, et j'avoue que fermer puis rouvrir ma table, ça me plaît pas trop...
    Je reformule mon problème que j'ai simplifié : quelqu'un peut me dire pourquoi le 2e Post (ci-dessous) provoque l'erreur "la ligne n'a pas pu être trouvée pour la mise à jour (...)" ? Pourtant j'ai bien une clé primaire ! Quelque chose doit m'échapper ?

    (le champ 0 est de type autoincrémenté, c'est ma clé primaire)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    adoquery1.Insert;
    adoquery1.Fields[1].AsString := 'tutu';
    adoquery1.Post;
    adoquery1.Edit;
    adoquery1.Fields[3].AsInteger:= 4125;
    adoquery1.Post // plantage ligne non trouvée pour mise à jour !;
    ce code sert à illustrer le bug de mon appli. :
    - l'utilisateur clique sur mon bouton "insérer" (qui fait un insert et prérempli un champ),
    - puis il clique sur valider (un simple Post),
    - puis modifie une cellule (d'une dbctrlgrid) numérique du nouvel enregistrement (bizarrement ça passe avec un champ string !),
    - puis re-valide : ça plante ! "Ligne non trouvée pour la mise à jour blabla"

    Et le code ci-dessus reproduit ce phénomène. Bizarre que ça passe si on remplace l'avant-dernière ligne par adoquery1.Fields[2].AsString:= 'toto' (où le champ 2 est de type chaîne) ! Je précise qu'aucun de ces champ n'est requis.

    Une idée ?
    Merci !

    --

    Thibaud

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Points : 22
    Points
    22
    Par défaut
    Ca voudrait dire que tant que ton programme n'a pas la clé primaire autoincrémentée (car ton premier post ne lui donne pas), il utilise tous les champs entiers pour identifier l'enregistrement.

    Je vais regarder s'il y a un moyen de lui indiquer la clé primaire sans avoir à recharger ton select.

    En attendant, essaye de faire un applyupdate juste après ton premier post.

    ps : c'est quoi ta base de donnée ? Access ?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Ca voudrait dire que tant que ton programme n'a pas la clé primaire autoincrémentée (car ton premier post ne lui donne pas), il utilise tous les champs entiers pour identifier l'enregistrement.
    Oui j'ai cru comprendre à peu près ça en cherchant sur le web. Il utiliserait donc le champ numérique pour identifier l'enregistrement.
    C'est effectivement une base Access, et je pense qu'il s'agit peut-être d'un problème de valeur par défaut de ce champ, pourtant j'ai choisi default 0 sous Access !

    Je vais essayer avec l'applyupdate comme tu le suggères. Sinon j'ai trouvé un lien intéressant qui indique comment choisir les colonnes à utiliser pour un update http://support.microsoft.com/default.aspx?scid=kb;EN-GB;q190727&GSSNB=1
    On voit comment un Post est en fait transformer en requête UPDATE, utilisant les valeurs des colonnes pour identifier l'enregistrement.

    Quand-même fou qu'on puisse pas faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    adoquery1.Insert; 
    adoquery1.Fields[1].AsString := 'tutu'; 
    adoquery1.Post; 
    adoquery1.Edit; 
    adoquery1.Fields[3].AsInteger:= 4125; 
    adoquery1.Post // plantage ligne non trouvée pour mise à jour !;
    simplement ! Cette table est pourtant toute "nue" je l'ai créée pour le test. Juste un champ autoinc(clé primaire), deux champs textes et un champ entier...

    Je te tiens au courant
    merci de ton aide

    Thibaud

  7. #7
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2002
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    okay j'ai trouvé !

    Il fallait que le champ numérique n'ait pas de valeur par défaut.
    En laissant 0 pour "default value" sous Access, ça plante
    en supprimant le 0 ça passe

    les voies d'Access (ou de Jet ?) sont impénétrables...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Retourner les valeurs d'un select dans un tableau après un POST
    Par DevCom59 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/06/2014, 21h47
  2. Réponses: 0
    Dernier message: 20/03/2012, 17h34
  3. Requête POST dans un script bash
    Par desperado dans le forum Linux
    Réponses: 4
    Dernier message: 11/12/2007, 22h38
  4. [JComboBox] Problème dans le PopMenu après ajout
    Par bidon dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 29/03/2005, 15h52
  5. Supprimer les guillemets dans un fichier après écriture
    Par soulryo dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 01/03/2005, 11h39

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