Avatar billede whynot Nybegynder
20. november 2003 - 23:48 Der er 2 kommentarer og
1 løsning

Sortering af et DBgrid med en Mysql database

Hejsa eksperter

Så har jeg endnu en hård nød at knække....

Jeg vil gerne at man kan trykke på en kolonnes titel, hvorefter at DBGrid'ets data blev sorteret efter denne kolonne i faldende orden. Hvis man trykker igen skal der sorteres i stigende orden.

Jeg ved godt hvordan jeg "aflæser" kolonnens titel.. det gør jeg ved: column.Field.FieldName

Men hvordan sorterer jeg DBGrid'et med denne oplysning?

Det må jo være noget med en sql-statement som skal sendes - eller kan man gøre det direkte i DBGrid'et?

DBGrid'et er koblet en mySQLTabel.. der er connection til databasen vha. en datasource og en mySQLdatabase komponent.

Anyway.. jeg håber nogle af Jer kan hjælpe mig.
Avatar billede whynot Nybegynder
21. november 2003 - 17:26 #1
Hejsa igen.. nu har jeg selv fundet svaret :)

her er løsningen:

skift væk fra mySQLTabel og brug istedet for mySQLQuery... herved kommer man selv til at kunne styre sine sql-statements.

Først sørger man for at DBgriddet er fyldt med date....

procedure TForm1.Button8Click(Sender: TObject);
var
aQuerry: TmySQLQuery;
begin
  try
  aQuerry:=mySQLQuery1;
  with aQuerry do
    begin
    SQL.Clear; //sikrer at query'ens sqlstatement bliver slettet
    SQL.Add('select * from prototype');
    ExecSQL;
    dbgrid1.DataSource.DataSet.Open; //sætter dataset.active = open/true
    dbgrid1.DataSource.DataSet.Refresh; //opdaterer dbgriddet

    end;
    Finally
    end;

  end;
end.


...okey.. så er vi klar til at trykke på en kollone i DBGriddet og sortere efter denne.. dette gøres på følgende facon:

dobbeltklik på dbgriddets event for titleclick.. og cut'n'paste følgende ind.

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
aQuerry: TmySQLQuery;
begin
  try
  aQuerry:=mySQLQuery1;
  with aQuerry do
    begin
    SQL.Text := 'SELECT * FROM prototype ORDER BY '+ column.Field.FieldName;
    ExecSQL;

    dbgrid1.DataSource.DataSet.Open; //sætter dataset.active = open/true
    dbgrid1.DataSource.DataSet.Refresh; //opdaterer dbgriddet
    end;
    Finally
    end;
end;



Jeg håber andre kan få glæde af min erfaring.. jeg ved godt at koden er GRIM - men den fungerer.!

God fornøjelse :)
Avatar billede whynot Nybegynder
21. november 2003 - 17:27 #2
ps jeg beklager mine stavefejl ;)
Avatar billede morten_s Nybegynder
21. november 2003 - 17:27 #3
Sådan gør jeg med dbexpress komponenter og lidt sql


procedure TfrmFalcoRemote.vDBGridStatusTitleClick(Sender: TObject;
  Column: TVolgaColumn);
var
  i : Integer;
begin
  if DM.SQLConDB.Connected then
  with TDBGrid(Sender) do
    for i := 0 to Columns.Count - 1 do
      Columns[i].Title.Font.Color := clBlack;
  with DM.SQLcdsInt do
  begin
    if IntLogSortOrder then
    begin
      Close;
      DM.SQLcdsInt.CommandText:= 'SELECT * FROM intersec ORDER BY '+Column.Title.DefaultCaption+' ASC';
      Open;
      Column.Title.Font.Color := clBlue;
      IntLogSortOrder := False;
    end
    else begin
      Close;
      DM.SQLcdsInt.CommandText:= 'SELECT * FROM intersec ORDER BY '+Column.Title.DefaultCaption+' Desc';

      Open;
      IntLogSortOrder := True;
      Column.Title.Font.Color := clRed;
    end;
    DM.SQLcdsInt.Locate('NodeNo', IdSelectedInt, []);
  end;
end;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester