Q&A

  • DBGrid에서 필드별로 정열?
수고들 많으십니다~

이거 이쪽 분류에서 하는건지 모르겠네요?

암튼 아시는 분 좀 가르쳐 주세요~~



음~ 디비 그리드에서 필드에 이름 전화번호 등등이 있는데요..



데이타베이스 인덱스를 이용하거나(파라독스로 했어요~) 아님

디비 그리드 필드를 눌렀을때 한번 누르면 오름차순 다시 한번

누르면 내림차순으로 정렬될 수 있을까요?

윈도우 탐색기에서 크기 누르면 큰것 부터 또는 작은것 부터

정렬되어 보이게 되듯이요?



어떤 방법이라도 좀 가르펴 주세요... 상세요히요... 시작한지 얼마

되지 않아 설명을 알아들을수 있을지 모르겠습니다만..



부탁드립니다.~~~



1  COMMENTS
  • Profile
    문홍철 1999.08.24 21:48
    김명찬 께서 말씀하시기를...

    > 수고들 많으십니다~

    > 이거 이쪽 분류에서 하는건지 모르겠네요?

    > 암튼 아시는 분 좀 가르쳐 주세요~~

    >

    > 음~ 디비 그리드에서 필드에 이름 전화번호 등등이 있는데요..

    >

    > 데이타베이스 인덱스를 이용하거나(파라독스로 했어요~) 아님

    > 디비 그리드 필드를 눌렀을때 한번 누르면 오름차순 다시 한번

    > 누르면 내림차순으로 정렬될 수 있을까요?

    > 윈도우 탐색기에서 크기 누르면 큰것 부터 또는 작은것 부터

    > 정렬되어 보이게 되듯이요?

    >

    > 어떤 방법이라도 좀 가르펴 주세요... 상세요히요... 시작한지 얼마

    > 되지 않아 설명을 알아들을수 있을지 모르겠습니다만..



    모든 컴퍼넌트에는 Tag라는 property가 있습니다.

    저는 이것을 이용해서 title click event에 해봤는데요...

    물론 다신 Open 하는 형태로 Query문만 잘 되어 있으며 속도는 문제가

    안도요..



    간략하게 야그하면



    with(Column.Field.DataSet as TQuery) do

    begin

    Close;

    //query문을 대문자로 만들고

    SQL.Text := UpperCase(SQL.Text);

    //order by가 있는지 확이하고

    iPos := Pos('ORDER BY', SQL.Text);

    //그리고 order by에 Descend문이 있는지 확이하고

    if(iPos > 0) then bDesc := Pos(' DESC ', SQL.Text) <> 0;

    //query문을 order by까지 만듭니다.

    if(iPos > 0) then SQL.Text := Copy(SQL.Text, 1, iPos + 7) + ' '

    else SQL.Append(' ORDER BY ');

    //그리고 정렬될 Field를 Append합니다.

    SQL.Append(sOrder);

    //여기서 sOrder는 Column.Fieldname이 되거나

    //나름대로 조합을 하면 됩니다.

    //물론 Lookup일 때는 KeyField로 그리고 calc일때는

    //별도의 정의를 하셔야죠



    //그리고 Parmameter는 Close하기전에 oParams라는 곳에

    //저장을 해서 Open 하기 전에 다시 넣어줍니다.

    //oParams는 TStringList입니다.

    //그리고 이곳에서 다시 넣어준거죠

    for iCount := 0 to oParams.Count - 1 do

    Params[iCount].AsString := oParams[iCount];

    try

    Open;

    except

    Screen.Cursor := CrDefault;

    oParams.Free;

    EXIT;

    end;

    end;



    //간략하게 쓴다는게 어설프게 된네요..

    //여기서 sOrder가 핵심입니다.

    한번 정렬이 된것은 Tag기억을 시켜두고

    다시 크릭할때 Desc을 붙여주면 첫번째는 Asc, 두번째는 Desc

    이것이 반복되겠지요..

    또한 Title에 Asc, Desc표시의 특수문자도 넣다 뺐다

    하면 더 좋겠죠, 색깔까진 넣으면 금상첨화..?



    order절에 대한 Procedure만 아래 쓰겠습니다.

    야그하자면 너무 길어서요 궁금한점이 있으면 Mail주세요..



    function OrderClause(Column: TColumn; bDesc : boolean;

    CalcFields, SubFields: array of string): string;

    var

    iCount : integer;

    bFirst : boolean;



    begin

    Result := '';

    bFirst := True;



    case Column.Field.FieldKind of

    fkData : Result := Format(' %s ', [Column.Field.FieldName]);

    fkLookup : Result := Format(' %s ', [Column.Field.KeyFields]);



    fkCalculated,

    fkInternalCalc : //요것은 야그가 길어지므로 생략합니다.



    end;



    //저는 Tag에 9를 주어서 한번 Sort한것을 표시

    if(Column.Field.Tag = 9) and not(bDesc) then

    begin

    Result := Format('%s %s ', [Result, 'DESC']);

    if(copy(Column.Title.Caption,1, 2) = '▼') or

    (copy(Column.Title.Caption,1, 2) = '▲') then

    Column.Title.Caption := copy(Column.Title.Caption, 3, length(Column.Title.Caption));

    Column.Title.Caption := Format('▼%s', [Column.Title.Caption]);

    end

    else

    begin

    DeleteCaption(Column.Grid as TDBGrid);



    with (Column.Field.DataSet as TQuery) do

    begin

    for iCount := 0 to FieldCount - 1 do

    begin

    if(Fields[iCount].Tag = 9) then

    begin

    Fields[iCount].Tag := 0;

    BREAK;

    end;

    end;

    end;



    Column.Title.Caption := Format('▲%s', [Column.Title.Caption]);

    end;



    end;





    //점심시간 이용해서 쓰느라 정신없이 작성했는데.

    //Q&A에 다시올리거나 Mail주세요..