Un exemple de programme utilisant une base de données : utilisation du sql combiné avec une relation maitre-detail

Soyez le premier à donner votre avis sur cette source.

Vue 19 956 fois - Téléchargée 6 598 fois

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.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

fmicros
Messages postés
8
Date d'inscription
lundi 14 juin 2010
Statut
Membre
Dernière intervention
14 juin 2010
-
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;
fatehkap
Messages postés
29
Date d'inscription
jeudi 19 mai 2011
Statut
Membre
Dernière intervention
10 juillet 2011
-
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
cs_riadh123
Messages postés
3
Date d'inscription
vendredi 11 janvier 2008
Statut
Membre
Dernière intervention
23 avril 2015
-
merci

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.