Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Delphi > Bases de données
Bases de données Vos questions concernant les bases de données (BDE, Access, SqlServer...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 12/04/2007, 16h31   #1
napz
Futur Membre du Club
 
Inscription : octobre 2005
Messages : 61
Détails du profil
Informations personnelles :
Âge : 30

Informations forums :
Inscription : octobre 2005
Messages : 61
Points : 15
Points : 15
Envoyer un message via MSN à napz
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
napz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 16h55   #2
aityahia
Rédacteur
 
Avatar de aityahia
 
Homme Idir AIT YAHIA
EURL CIEPTAL CARS
Inscription : mars 2006
Messages : 1 864
Détails du profil
Informations personnelles :
Nom : Homme Idir AIT YAHIA
Âge : 37
Localisation : Algérie

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

Informations forums :
Inscription : mars 2006
Messages : 1 864
Points : 3 297
Points : 3 297
Envoyer un message via MSN à aityahia Envoyer un message via Yahoo à aityahia Envoyer un message via Skype™ à aityahia
Tu execute cette erquete dans l'evenement AfterScroll de ta table maitre

Code :
1
2
3
SELECT codprod 
from lignecommande
 Where lignecommande.numcde =:numcde
aityahia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 19h36   #3
napz
Futur Membre du Club
 
Inscription : octobre 2005
Messages : 61
Détails du profil
Informations personnelles :
Âge : 30

Informations forums :
Inscription : octobre 2005
Messages : 61
Points : 15
Points : 15
Envoyer un message via MSN à napz
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
napz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2007, 10h36   #4
evarisnea
Rédacteur/Modérateur
 
Avatar de evarisnea
 
Homme Evaris NGOUZO
Ingénieur intégration
Inscription : juin 2005
Messages : 1 958
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 958
Points : 3 692
Points : 3 692


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.
evarisnea est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2007, 21h16   #5
edam
Membre Expert
 
Avatar de edam
 
Homme said
Développeur Delphi/c++/Omnis
Inscription : décembre 2003
Messages : 1 789
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 789
Points : 2 392
Points : 2 392
par hazar, il n'y a pas un erreur ici:
Citation:
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
edam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2007, 23h30   #6
evarisnea
Rédacteur/Modérateur
 
Avatar de evarisnea
 
Homme Evaris NGOUZO
Ingénieur intégration
Inscription : juin 2005
Messages : 1 958
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 958
Points : 3 692
Points : 3 692
@edam
la requête est bonne pour la fonctionnalité que j'ai expliquée.

voilà une source qui montre cela :
master-detail.rar
evarisnea est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2007, 10h46   #7
napz
Futur Membre du Club
 
Inscription : octobre 2005
Messages : 61
Détails du profil
Informations personnelles :
Âge : 30

Informations forums :
Inscription : octobre 2005
Messages : 61
Points : 15
Points : 15
Envoyer un message via MSN à napz
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
napz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2007, 10h57   #8
aityahia
Rédacteur
 
Avatar de aityahia
 
Homme Idir AIT YAHIA
EURL CIEPTAL CARS
Inscription : mars 2006
Messages : 1 864
Détails du profil
Informations personnelles :
Nom : Homme Idir AIT YAHIA
Âge : 37
Localisation : Algérie

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

Informations forums :
Inscription : mars 2006
Messages : 1 864
Points : 3 297
Points : 3 297
Envoyer un message via MSN à aityahia Envoyer un message via Yahoo à aityahia Envoyer un message via Skype™ à aityahia
la propreiété state renvoie l'etat actuel de votre table si elle en mode edition alors vous effectuez un post
aityahia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2007, 13h37   #9
evarisnea
Rédacteur/Modérateur
 
Avatar de evarisnea
 
Homme Evaris NGOUZO
Ingénieur intégration
Inscription : juin 2005
Messages : 1 958
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 958
Points : 3 692
Points : 3 692
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.
evarisnea est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2012, 17h10   #10
kasrimus
Invité de passage
 
Homme
retraité
Inscription : 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
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
kasrimus est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 21h55.


 
 
 
 
Partenaires

Hébergement Web