Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 10 sur 10
  1. #1
    Futur Membre du Club
    Inscrit en
    octobre 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 31

    Informations forums :
    Inscription : octobre 2005
    Messages : 66
    Points : 17
    Points
    17

    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 :
    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 :
    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 :
    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 :
    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
    Rédacteur
    Avatar de aityahia
    Homme Profil pro Idir AIT YAHIA
    EURL CIEPTAL CARS
    Inscrit en
    mars 2006
    Messages
    1 926
    Détails du profil
    Informations personnelles :
    Nom : Homme Idir AIT YAHIA
    Âge : 38
    Localisation : Algérie

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

    Informations forums :
    Inscription : mars 2006
    Messages : 1 926
    Points : 3 365
    Points
    3 365

    Par défaut

    Tu execute cette erquete dans l'evenement AfterScroll de ta table maitre

    Code :
    1
    2
    3
    SELECT codprod 
    from lignecommande
     Where lignecommande.numcde =:numcde

  3. #3
    Futur Membre du Club
    Inscrit en
    octobre 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 31

    Informations forums :
    Inscription : octobre 2005
    Messages : 66
    Points : 17
    Points
    17

    Par défaut

    rien ne ce passe , ya pas d'erreur bd ou a la compilation

    mon code :

    Code :
    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/Modérateur
    Avatar de evarisnea
    Homme Profil pro Evaris NGOUZO
    Ingénieur intégration
    Inscrit en
    juin 2005
    Messages
    1 959
    Détails du profil
    Informations personnelles :
    Nom : Homme Evaris NGOUZO
    Localisation : Cameroun

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

    Informations forums :
    Inscription : juin 2005
    Messages : 1 959
    Points : 3 694
    Points
    3 694

    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 :
    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 Expert Avatar de edam
    Homme Profil pro said
    Développeur Delphi/c++/Omnis
    Inscrit en
    décembre 2003
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Nom : Homme said
    Localisation : Maroc

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

    Informations forums :
    Inscription : décembre 2003
    Messages : 1 811
    Points : 2 433
    Points
    2 433

    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 :
    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/Modérateur
    Avatar de evarisnea
    Homme Profil pro Evaris NGOUZO
    Ingénieur intégration
    Inscrit en
    juin 2005
    Messages
    1 959
    Détails du profil
    Informations personnelles :
    Nom : Homme Evaris NGOUZO
    Localisation : Cameroun

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

    Informations forums :
    Inscription : juin 2005
    Messages : 1 959
    Points : 3 694
    Points
    3 694

    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
    Futur Membre du Club
    Inscrit en
    octobre 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 31

    Informations forums :
    Inscription : octobre 2005
    Messages : 66
    Points : 17
    Points
    17

    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 :
    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
    Rédacteur
    Avatar de aityahia
    Homme Profil pro Idir AIT YAHIA
    EURL CIEPTAL CARS
    Inscrit en
    mars 2006
    Messages
    1 926
    Détails du profil
    Informations personnelles :
    Nom : Homme Idir AIT YAHIA
    Âge : 38
    Localisation : Algérie

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

    Informations forums :
    Inscription : mars 2006
    Messages : 1 926
    Points : 3 365
    Points
    3 365

    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/Modérateur
    Avatar de evarisnea
    Homme Profil pro Evaris NGOUZO
    Ingénieur intégration
    Inscrit en
    juin 2005
    Messages
    1 959
    Détails du profil
    Informations personnelles :
    Nom : Homme Evaris NGOUZO
    Localisation : Cameroun

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

    Informations forums :
    Inscription : juin 2005
    Messages : 1 959
    Points : 3 694
    Points
    3 694

    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
    Invité de passage
    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 : 0
    Points
    0

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •