程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 點擊DBGrid的Title對查詢結果排序

點擊DBGrid的Title對查詢結果排序

編輯:Delphi

  //欲實現點擊DBGrid的Title對查詢結果排序,想作一個通用程序,不是一事一議,
  //例如不能在SQL語句中增加Order by ...,因為SQL可能原來已經包含Order by ...,
  //而且點擊另一個Title時又要另外排序,目的是想作到象資源管理器那樣隨心所欲。
  procedure TfrmChild.DBGrid1TitleClick(Column: TColumn);
  var
    SqlStr,myFieldName,TempStr: string;
    OrderPos: integer;
    SavedParams: TParams;
  begin
    if not (Column.Field.FieldKind in [fkData,fkLookup]) then exit;
    if Column.Field.FieldKind =fkData then
      myFieldName := UpperCase(Column.Field.FieldName)
    else
      myFieldName := UpperCase(Column.Field.KeyFields);
    while Pos(myFieldName,';')<>0 do
      myFieldName := copy(myFieldName,1,Pos(myFieldName,';')-1)
                    + ',' + copy(myFieldName,Pos(myFieldName,';')+1,100);
    with TQuery(TDBGrid(Column.Grid).DataSource.DataSet) do
    begin
      SqlStr := UpperCase(Sql.Text);
  //  if pos(myFieldName,SqlStr)=0 then exit;
      if ParamCount>0 then
      begin
        SavedParams := TParams.Create;
        SavedParams.Assign(Params);
      end;
      OrderPos := pos('ORDER',SqlStr);
      if (OrderPos=0) or
        (pos(myFieldName,copy(SqlStr,OrderPos,100))=0) then
        TempStr := ' Order By ' + myFieldName + ' Asc'
      else if pos('ASC',SqlStr)=0 then
        TempStr := ' Order By ' + myFieldName + ' Asc'
      else
        TempStr := ' Order By ' + myFieldName + ' Desc';
      if OrderPos<>0 then SqlStr := Copy(SqlStr,1,OrderPos-1);
      SqlStr := SqlStr + TempStr;
      Active := False;
      Sql.Clear;
      Sql.Text := SqlStr;
      if ParamCount>0 then
      begin
        Params.AssignValues(SavedParams);
        SavedParams.Free;
      end;
      Prepare;
      Open;
    end;

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved