cs_apz
Messages postés281Date d'inscriptiondimanche 7 avril 2002StatutMembreDernière intervention11 avril 2013
-
16 sept. 2002 à 21:41
cs_apz
Messages postés281Date d'inscriptiondimanche 7 avril 2002StatutMembreDernière intervention11 avril 2013
-
18 sept. 2002 à 16:22
salut a tous,
je voulais faire un filtrage sur une table en utlisant les numeros d'enregistrements pour marquer les record et ensuite applique une requete sur cette ensemble marqué
var
Form1: TForm1;
RECN1, RECN2, Allrec : longint;
implementation
{$R *.DFM}
Procedure TForm1.SelectAll(leDbGrid : TDBGrid);
var
ABookmark: TBookmark;
begin
if ((dgMultiSelect in leDbGrid.Options) and (dgRowSelect in leDbGrid.Options))
and leDbGrid.DataSource.DataSet.Active then begin
with leDbGrid.DataSource.DataSet do begin
if (BOF and EOF) then Exit;
DisableControls;
try
ABookmark := GetBookmark;
try
recno:=recn1;
//First;
//while not EOF do begin
while not (recno>recn2) do begin
ledbgrid.SelectedRows.currentrowselected:=true;
showmessage(INTTOSTR(RECNO));
Next;
end;
finally
try
begin
//recno:=recn2;
GotoBookmark(pointer(DBGrid1.SelectedRows.Items[recn1]));
//GotoBookmark(ABookmark);
end;
except
end;
FreeBookmark(ABookmark);
end;
finally
EnableControls;
end;
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i : integer;
begin
recn1:=1;
recn2:=recn1+3;
allrec:=6; // par exemple
//table1.recordcount;
while (recn1<=allrec) do
begin
SelectAll(dbgrid1);
showmessage('ca y est c"est fait pour la plage '+IntToStr(recn1)+' à '
+ IntToStr(recn2));
// deselectionner les lignes
for i:=recn1 to recn2 do
begin
dbgrid1.DataSource.DataSet.RecNo:=recn1;
if (dbgrid1.SelectedRows.currentrowselected) then
begin
dbgrid1.DataSource.DataSet.GotoBookmark(pointer(DBGrid1.SelectedRows.Items[i-1]));
dbgrid1.SelectedRows.currentrowselected:=false;
end;
end;
recn1:=recn2+1;
recn2:=recn1+3;
end;
end;
end.
qlq peut le tester pour moi et me dire ou se situe la faille ?
cs_Nono40
Messages postés962Date d'inscriptionmercredi 3 avril 2002StatutMembreDernière intervention12 septembre 20062 17 sept. 2002 à 23:18
En fait je ne savais pas que c'était possible de sélectionner les lignes d'une DBGrid par programme, comme quoi il y a toujours quelque-chose à apprendre.
Le code est bien compliqué, il suffit juste de faire une boucle pour sélectionner les lignes de la grille. Voici une procédure qui sélectionne une plage de ligne d'une grille :
Procedure TForm1.SelectPlage(leDbGrid : TDBGrid;Debut,Fin:Integer);
var i : Integer;
begin
if ((dgMultiSelect in leDbGrid.Options) and (dgRowSelect in leDbGrid.Options))and leDbGrid.DataSource.DataSet.Active
then begin
with leDbGrid.DataSource.DataSet do
begin
// Supression de la sélection précédente
LeDBGrid.SelectedRows.Clear;
// Sélection des nouvelles lignes
For i:= Debut To Fin Do
Begin
RecNo:=i;
If Not ledbgrid.SelectedRows.currentrowselected Then ledbgrid.SelectedRows.currentrowselected:=true;
End;
end;
end;
end;
Et voici la reprise de la procédure d'essais de la sélection. Comme tu voulais le faire, cette procédure sélectionne toute la grille par bloc de 4 lignes :
procedure TForm1.Button1Click(Sender: TObject);
var RecN1,RecN2 : integer;
begin
With DBGrid2.DataSource.DataSet Do
Begin
recn1:=1;
while (recn1<=RecordCount) do
begin
recn2:=recn1+3;
If RecN2>RecordCount Then RecN2:=RecordCount;
SelectPlage(dbgrid2,RecN1,RecN2);
showmessage('ca y est c"est fait pour la plage '+IntToStr(recn1)+' à '+ IntToStr(recn2));
recn1:=recn2+1;
end;
End;
end;
Une petite remarque concernant ce code : il ne fonctionne que sur des tables Paradox et non filtrées !