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 :

[Delphi7][ADO][MS-SQL]Problème avec TADOquery en maître détail


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Algérie

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 74
    Points : 62
    Points
    62
    Par défaut [Delphi7][ADO][MS-SQL]Problème avec TADOquery en maître détail
    ola tout le monde!

    j'ai une application delphi7 avec sgbd sql serveur connécté en ODBC et utilisant des composant ADO

    mon probleme porte sur 2 table dans ma bdd,commande et lignedecommande

    je suis entrein de créé un masque de saisie pour une commande, le masque doit pouvoir inseré dans la base un client avec plusieur porduits commandé par ce dernier

    maintenant le code que j'a réalisé

    pour inseré une nouvelle commande j'ai utilisé le composant ADOQuery comme suit

    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
    procedure TFinsertcde.Button4Click(Sender: TObject);
    begin
    if MessageDlg('Confirmez-vous la creation de la nouvelle commande  du client dont le code est '+
                    DBEdit1.Text,
                    mtConfirmation, [mbYes, mbNo], 0) = mrYes
       then begin
                     with ADOQuery1 do
                 begin
                   SQL.Clear;
                   SQL.Add('Insert into commande (codcli,datcde) Values (');
                   SQL.Add(Quotedstr(DBEdit1.Text)+',');
                   SQL.Add(Quotedstr(DateToStr(Date))+')');
                   ExecSQL;
                   Close;
                   end;
     
          button2.Enabled:=true;
          button4.Enabled:=false;
          adoquery3.Active:=false;
          adoquery3.Active:=true;
         end;
    end;
    ici DBEdit1 et le champ codeclient

    pour inseré la nouvelle clé de commande dans la table lignedecommande j'ai bidouillé comme suit

    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
    procedure TFqteprod.Button1Click(Sender: TObject);
    var codprod:string;
    begin
      codprod:=Fajoutprod.DBGrid1.DataSource.DataSet.Fields.Fields[0].AsString;
      with Finsertcde.ADOQuery2 do
        begin
          SQL.Clear;
          SQL.Add('Insert into lignecommande (numcde,codprod,qte) Values (');
          SQL.Add(Quotedstr(finsertcde.DBEdit4.Text)+',');
          SQL.Add(Quotedstr(codprod)+',');
          SQL.Add(Quotedstr(Edit1.Text)+')');
          ExecSQL;
          Close;
        end;
      close;
      Fajoutprod.Close;
      Finsertcde.ADOQuery5.Active:=false;
      Finsertcde.ADOQuery5.Active:=true;
     
    end;
    ce code ajoute un produit a ma commande
    ici DBedit4 est le champ codcommande alimenté par la une ADOquery avec la requette

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select max (numcde) from commande
    maintenant quand je regarde dans ma bdd tout est inséré correctement, le problem c'est que j 'arrive pas a affiché les porduit lié a ma commande directement apres l'insertion ou la j 'utilise 2 adoquery en maitre detail avec respectivement les requetes suivantes

    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT codprod 
    from lignecommande
     Where lignecommande.numcde =:numcde
    ps:c'est le mem sujet que le post [adoquery +sqlserveur + IHM pourri ] http://www.developpez.net/forums/sho...d.php?t=304573

    que j'ai délesté , j 'ésper que j 'ai pas enfrein les regles du forum , mon attention etait d'etre plus claire sans plus


    cordialment NapZ .. ter

  2. #2
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    Tu execute cette erquete dans l'evenement AfterScroll de ta table maitre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT codprod 
    from lignecommande
     Where lignecommande.numcde =:numcde

  3. #3
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Algérie

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 74
    Points : 62
    Points
    62
    Par défaut
    rien ne ce passe , ya pas d'erreur bd ou a la compilation

    mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TFinsertcde.ADOQuery5AfterScroll(DataSet: TDataSet);
    begin
        adoquery4.Active:=false;
        adoquery4.Active:=true;
        with adoquery5 do
        begin
        close;
        SQL.Clear;
        SQL.Add('SELECT codprod from lignecommande Where lignecommande.numcde =:numcde' );
        open;
        end;
    end;
    adoquery4 est la table detail

  4. #4
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut


    voyons voir,
    je suppose que tes 2 tables ont cette structure :

    T_Commande( com_num, com_date, com_client, ...);
    T_Details(det_num, #det_com_num, det_produit, det_qte, det_pu, ...);

    ce que je fais souvent dans ce genre de situation c'est d'utiliser les relations maitre-esclave.

    soit 2 composants query, 2 composants datasource :
    AdoQuery1
    SQL = select * from T_Commande;
    AdoQuery2
    SQL = select * from T_Details where det_com_num = :com_num;
    MasterSource = Datasource1
    Datasource1
    Dataset = AdoQuery1
    Datasource2
    Dataset = AdoQuery2

    avec une structure semblable et un peu de code ( pour définir le numéro de la commande lors de l'insertion d'un produit ) ca devrait marcher. l'actualisation des données est faites automatiquement. lorsque tu te déplace entre les enregistrements des commandes les détails s'affichent automatiquement.

    Citation Envoyé par napz
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        adoquery4.Active:=false;
        adoquery4.Active:=true;
    pour les composants ADO tu as la méthode Requery qui te donne le même résultat.

  5. #5
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    par hazar, il n'y a pas un erreur ici:
    ce code ajoute un produit a ma commande
    ici DBedit4 est le champ codcommande alimenté par la une ADOquery avec la requette
    Code :
    select max (numcde)+1 from commande
    en plus la méthode de evarisnea et bonne sauf
    que : SQL = select * from T_Details , sans where det_com_num = :com_num;
    si tu laisse cette ligne antier alors tu fait ce que ta dit aityahia, dans afterscroll,
    bien sûr ADOQuery5 maitre et ADOQuery4 détail
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TFinsertcde.ADOQuery5AfterScroll(DataSet: TDataSet);
    begin
      
        with adoquery4 do
        begin
          Active:=false;
        SQL.Clear;
        SQL.Add('SELECT codprod from lignecommande Where lignecommande.numcde =:numcde' );
        .parame[0].value:=ADOQuery5.fielbynaim('com_num').value;
           Active:=true;
        
        end;
    end;
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  6. #6
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    @edam
    la requête est bonne pour la fonctionnalité que j'ai expliquée.

    voilà une source qui montre cela :
    master-detail.rar

  7. #7
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Algérie

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 74
    Points : 62
    Points
    62
    Par défaut
    merci infiniment evarisnea pour la source, et si ce n'est pas abusé pourez tu m'éxpliqué ce bout de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.DBGrid1Enter(Sender: TObject);
    begin
    	//enregistrer la commande s'il le faut
      if ADOQuery1.State in [dsEdit,dsInsert] then
      	ADOQuery1.Post();
    end;
    je sais il ya le commentaire mais je en saisi pas trop !

    cordialement NaPz

  8. #8
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    la propreiété state renvoie l'etat actuel de votre table si elle en mode edition alors vous effectuez un post

  9. #9
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut
    Citation Envoyé par aityahia
    la propreiété state renvoie l'etat actuel de votre table si elle en mode edition alors vous effectuez un post
    exactement, en édition ou en insertion d'un enregistrement.
    j'ai mis cette vérification car si tu commences à saisir une nouvelle commande et que tu ne l'enregistres pas avant d'essayer d'ajouter les détails, tu risques d'avoir un problème pour lier les détails de la commande à cette commande.
    alors, à chaque fois que tu "entres" dans le DBGrid, on vérifie si la commande est enregistrée.

  10. #10
    Membre à l'essai
    Homme Profil pro
    retraité
    Inscrit en
    Octobre 2011
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2011
    Messages : 87
    Points : 21
    Points
    21
    Par défaut
    Merci pour cet exemple que je trouve simple et m'aide beaucoup, mais comment y rajouter une table (adoquery) comment les lier toutes svp
    donc 03 adoquery (tables)
    sous access 2007.
    merci encore

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

Discussions similaires

  1. Problème avec une relation maître détail
    Par nb-wissam dans le forum Forms
    Réponses: 2
    Dernier message: 15/06/2010, 11h03
  2. [SQL]Problème avec ADO - Order by
    Par Dnx dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 03/11/2005, 10h55
  3. [T-SQL] problème avec un trigger
    Par karine77 dans le forum Adaptive Server Enterprise
    Réponses: 3
    Dernier message: 26/09/2005, 10h45
  4. Access/SQL : Problème avec Count
    Par Taurëndil dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/01/2005, 15h49
  5. [SQL] problème avec les date et les group By
    Par Stef784ever dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/11/2004, 09h18

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