Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

UN EXEMPLE DE PROGRAMME UTILISANT UNE BASE DE DONNÉES : UTILISATION DU SQL COMBINÉ AVEC UNE RELATION MAITRE-DETAIL


Information sur la source

Description

cet exemple met en évidence la puissance du langage SQL pour simuler une
relation maitre/détail
- utilisation simultannée des controls non orientés données et orientés données
- utilisation de la propriété TabWidth d'un TlistBox
- utilisation d'un module de données
- utilisation de la propriété Align des TPanels
- utilisation de l'alias DBDEMOS livré en standard avec Delphi
- Cet exemple a été écris avec D5 entreprise il utilise les controls standards se compile très bien avec D7

-  suite possible :
  utilisation des propriétés Filter, Filtered d'une TTable
  le fonctionnement étant très similaire vous pouvez le mettre en oeuvre en d'exercice.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de fmicros le 17/04/2007 16:05:54

Ca fait plaisir de voir du code propre, bien documenté, pour une élégante solution.
Si on veut faciliter la lecture du code:
-      // comment procedure et bloc de code
- repousser les begin end en fin de ligne
- faire des if ... then exit pour les cas limites
- ne pas renommer les objets Table1 DBGrid1 ...
  ça évite le dépaysement.
- utiliser Tab pour les répétitions
- po de prise de tet ecriture fonétik trankil moi j fé gaf a laure tograf; Po de je, nous, on ..
- regrouper tout ce qui concerne un objet comme par ex l'initialisation et le OnChange d'un ComboBox.

A titre d'exemle j'ai fait qqes transformations du code, j'attends vos comments avec plaisir.


//******************************************************************************
//* SQL pour simuler une relation maître/détail
//*
//* - Fichier|Nouveau|Module de données|Name|'DM'
//* Database1|DatabaseName='DBDEMOS' (alias livré avec Delphi)
//*     Table1|TableName='employee.db' DataSource1|DataSet='Table1' ListBox1
//*     Query2|SQL='SELECT * FROM orders DataSource2|DataSet='Query2'   DBGrid2
//*         WHERE EmpNo = :NoEmp
//*         ORDER BY AmountPaid DESC'
//*           (:NoEmp prendra la valeur de Query2.ParamByname('NoEmp').Value)
//*     Table3|TableName='items.db'       DataSource3|DataSet='Table3' DBGrid3
//*           |MasterSource='DataSource2'
//*           |MasterFields|OrderNO -> OrderNO
//* - ComboBox1|OnChange sélectionne un champ Employee
//* - ListBox1  reçoit la liste du champ Employee
//* - DBGrid2 Orders   Query SQL reçoit en paramétre l'employé sélectionné
//* - TDBGrid Items    Table détail  reçoit OrderNo du maître Orders
//*
//* - ToolBar avec Images
//* - Align des TPanels
//* - TabWidth d'un TlistBox
//* Remarques et commentaires à : julienraine@laetjr.com
//* Suite: utiliser Filter, Filtered d'une TTable
//******************************************************************************



//******************************************************************************
//* MainFrm OnShow
//******************************************************************************
procedure TMainFrm.FormShow(Sender: TObject); begin
  ComboBox1Change(nil);   // exécute le chargement de la liste
  ListBox1.TabWidth := 80;   // Tab ou #9  saut de ... caratères, incertain
  end;

//******************************************************************************
//* ComboBox OnChange
//* ComboBox liste les champs Employee
//* ListBox  chargement des valeurs en fonction du champ sélectionné
//* simule une relation maitre/détail avec N° d'employé comme champ commun
//******************************************************************************
procedure TMainFrm.ComboBox1Change(Sender: TObject);
  var i: integer; begin
   // Combobox1 liste les champs Employee
  if ComboBox1.Items.Count=0 then
    with ComboBox1.Items, DM.Table1 do begin
      Clear;
      if not Active then open;
      for i:=1 to FieldCount-1 do // 0 = N° de l'employé
        Add( Fields[i].FieldName);
      ComboBox1.ItemIndex := 0; end; // LastName par defaut
// Champ sélectionné
  i := ComboBox1.ItemIndex; if i<0 then exit;
   // ListBox1 liste extraite de la table Employee
  with DM.Table1, ListBox1.Items do begin
    Clear;
    if not Active then open;
    First;
    while not eof do begin
      Add( FieldByName( ComboBox1.Items[i]).AsString + #9+
           FieldByName('EmpNo'            ).AsString );
      Next; end; end;
  ListBox1.ItemIndex := 0; // par defaut, sélection 1er de la liste
  ListBox1.SetFocus;           //
  ListBox1Click(nil);           // exécute la relation maître/détail
  end;

//******************************************************************************
//* ExtractNum( Nom + tab + N°) -->  N°  ou  code d'erreur -1
//******************************************************************************
function TMainFrm.ExtractNum(s: string): integer;
  var x: string; begin
  Result := -1;
  if pos(#9,s)=0 then exit;
  x := Copy( s, pos(#9,s)+1, length(s));
  try
    Result := StrToInt(x);
  except
    Result := -1;
  end;
  end;

//******************************************************************************
//* ListBox OnClick
//* Affiche les commandes en fonction du N° de l'employé
//* simule une relation maitre/détail avec le N° de l'employé en commun
//******************************************************************************
procedure TMainFrm.ListBox1Click(Sender: TObject);
  var n: integer; begin
   // n° employé sélectionné dans ListBox
  n := ListBox1.ItemIndex;
  if n>-1 then
      n := ExtractNum( ListBox1.Items[n]);
  if n=-1 then exit;
   // passe le n° au paramétre SQL et exécute
  with DM.Query2 do begin
    Close;
    ParamByname('NoEmp').Value := n;
    Open; end;
     // s'assure que détail est dans le meme etat que maître
  DM.Table3.Active := DM.Query2.Active;
  end;

//******************************************************************************
//* ToolBar Buttons
//******************************************************************************
procedure TMainFrm.TbCloseClick(Sender: TObject); begin
  close;
  end;
procedure TMainFrm.TbGaucheClick(Sender: TObject); begin
  Pagauche.Align := alLeft;
  end;
procedure TMainFrm.TbDroiteClick(Sender: TObject); begin
  Pagauche.Align := alRight;
  end;

signaler à un administrateur
Commentaire de fatehkap le 11/11/2007 23:11:10

mois je veut seulement un code source pour la date et comment decomposser les colones de dbgrid et comment fair deux lignes sur une colone merci de me repondre sur mon adresse fateh.kap30@hotmail.com

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Sql et Bdd [ par viper ] Je cherche depuis qq temps à récupérer le resultat d'une requet SQL avec un TQuery et une base de donnée mais sans succès...J'aimerais donc savoir com Tri de données d'un Tquery [ par DeadSoul ] Salut à tous,Mon problème : Comment trier des données d'un TQuery présentées à l'aide d'un DBGrid. Sur base d'une ou plusieurs colonnes.Souhait ; je n requete SQL parametrée pour un tri.... [ par juan ] bjour tousje cherche à faire une requête paramétrée dans un TQuery du genre:SELECT * FROM MaBase WHERE (mes conditions)ORDER BY :MonIndexmais apparemm Nombre max d'enregistrements que peut supporter un TQuery [ par lirva ] Bonjour,Combien d'enregistrements au maximum peut contenir un objet TQuery ?Comment gérer une requête sur une "grosse table" ?(J'ai une limitation à 7 assignation dynamique d'une bde à un TQuery [ par usmok ] J'ai une application qui doit gérer plusieurs bases de données et j'aimerai donc pouvoir assigner dynamiquement à mon TQuery la bde à utiliserle chemi TQUERY LOGIN ??? [ par w38 ] Bonjour,JE souhaiterais me connecter à une Tquery sans qu'il y est la fenêtre de connexion, c'està dire le login, comment puis-je le zapper ?MERCICord TQuery et violation de cle [ par jonath ] bonjour, j'ai un probleme suite à l'execution d'une requete sql : des que je ferme une fenetre du prog, une erreur violation de cle apparait et fait b Tquery & DBCombobox [ par VashTheStampede ] Comment recupere-t-on le resultat d une Tquery dans une DBCombobox?La requete ressemble a :select distinct artistenom from artisteJe voudrais que ces Trier un TQuery et Ecrire dedans en même temps [ par wilouches ] Voilà j'ai besoin de trié une liste sur deux tables.Jusque là pas de prob, j'utilise un query avec la fonction SQL ORDER BY Mon_champMais je ne peux p TQuery et thread [ par Fandril ] Est ce que quelqu un a deja mis un TQuery (pour executer requete SQL select sur Paradox) dans un thread...Car ca marche mais ca met 10 secondes pour


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,640 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.