수고들 많으십니다~
이거 이쪽 분류에서 하는건지 모르겠네요?
암튼 아시는 분 좀 가르쳐 주세요~~
음~ 디비 그리드에서 필드에 이름 전화번호 등등이 있는데요..
데이타베이스 인덱스를 이용하거나(파라독스로 했어요~) 아님
디비 그리드 필드를 눌렀을때 한번 누르면 오름차순 다시 한번
누르면 내림차순으로 정렬될 수 있을까요?
윈도우 탐색기에서 크기 누르면 큰것 부터 또는 작은것 부터
정렬되어 보이게 되듯이요?
어떤 방법이라도 좀 가르펴 주세요... 상세요히요... 시작한지 얼마
되지 않아 설명을 알아들을수 있을지 모르겠습니다만..
부탁드립니다.~~~
> 수고들 많으십니다~
> 이거 이쪽 분류에서 하는건지 모르겠네요?
> 암튼 아시는 분 좀 가르쳐 주세요~~
>
> 음~ 디비 그리드에서 필드에 이름 전화번호 등등이 있는데요..
>
> 데이타베이스 인덱스를 이용하거나(파라독스로 했어요~) 아님
> 디비 그리드 필드를 눌렀을때 한번 누르면 오름차순 다시 한번
> 누르면 내림차순으로 정렬될 수 있을까요?
> 윈도우 탐색기에서 크기 누르면 큰것 부터 또는 작은것 부터
> 정렬되어 보이게 되듯이요?
>
> 어떤 방법이라도 좀 가르펴 주세요... 상세요히요... 시작한지 얼마
> 되지 않아 설명을 알아들을수 있을지 모르겠습니다만..
모든 컴퍼넌트에는 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주세요..