UN EXEMPLE DE PROGRAMME UTILISANT UNE BASE DE DONNÉES : UTILISATION DU SQL COMBI

fmicros Messages postés 8 Date d'inscription lundi 14 juin 2010 Statut Membre Dernière intervention 14 juin 2010 - 17 avril 2007 à 16:05
cs_riadh123 Messages postés 3 Date d'inscription vendredi 11 janvier 2008 Statut Membre Dernière intervention 23 avril 2015 - 23 avril 2015 à 15:59
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/42174-un-exemple-de-programme-utilisant-une-base-de-donnees-utilisation-du-sql-combine-avec-une-relation-maitre-detail

cs_riadh123 Messages postés 3 Date d'inscription vendredi 11 janvier 2008 Statut Membre Dernière intervention 23 avril 2015
23 avril 2015 à 15:59
merci
fatehkap Messages postés 29 Date d'inscription jeudi 19 mai 2011 Statut Membre Dernière intervention 10 juillet 2011
11 nov. 2007 à 23:11
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
fmicros Messages postés 8 Date d'inscription lundi 14 juin 2010 Statut Membre Dernière intervention 14 juin 2010
17 avril 2007 à 16:05
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;
Rejoignez-nous