전장까지 가장 기본적인 사용법을 기술하였습니다.
이번장은 퀌텀의 가장 큰 특징인 Footer, Hroup Footer, Incremental Search의 사용법에대해 알아 보려 합니다.
요즘 필자가 갑자기 백수가 되는 관계로 인해 맥주를 한잔 하자는 여러 부류의 압박에 의해 글을 빨리 올리지 못하는 일이 발생하고 있습니다. 이해해 주시기 바랍니다.
이번 내용도 역시 본 제작자가 이동 또는 게시하지 않는 경우를 제외하고는 이곳 외에 다른곳에서 볼수 없습니다. 이를 어길시 정말 법적 제제가 가해질수 있습니다.
이번장에 해야 하는 작업은
-. Incremental Search 구현해보기.
-. Footer, GroupFooter 구성하기.
-. StyleRepository 이용하여 꾸미기 등입니다.
-. 그리드의 모양 그대로 프린트 하기.
좀 많네요 ㅜ.ㅜ 뭐 그런대로 작업해 보도록 하겠습니다.
-. Footer 구성하기..
Footer를 구성하기위해서는 DataController.DataModeController.GridMode = False 이어야만 합니다.
만약 GridMode에서 Footer를 출력하고자 한다면, 직접 계산해야 합니다.
두번째 OptionsView.Footer = True이어야만 화면에 나타납니다.
세번째 좌측 그림처럼 Component Editor에서 Footer를 Add한뒤에 Object Inspector에서 출력할 위치와 내용을 설정합니다.
1. FieldName : 계산할 필드를 정의 합니다.
2. Format : 출력한 Format을 지정합니다.
ex) 출력되는 값이 1000 만이라 가정하고 아래와 같은 예제와 출력예제 입니다.
,0;-,0; | 10,000 |
합계 = ,0; | 합계 = 10,000 |
합계 ,0 입니다. | 합계 10,000 입니다. |
합계 ,0; 입니다. | 합계 10,000 |
주의 Format중 ;(세미콜론)이나오면 세미콜론 이후의 포맷문자외의 문자열은 무시됩니다.
3. Kind :Sum, Average, Count, Max, Min중 하나를 택합니다.
4. Column : 출력할 위치를 선정합니다.
짜잔 하고 Footer가 출력이됩니다. 뭐 간단한 내용이니 그림도 필요 없을것 같아 생략합니다.
이제 GridMode인경우 어떻게 값을 출력하는지 알아보도록 하겠습니다.
위와같이 코딩으로 값을 입력해야 합니다. 짜잔 하고 gridMode에서도 Footer값이 나타납니다.
그런데 저값이 Sum인지 Count인지 Average인지 아무도 모릅니다. 넣은 사람만이 알수 있겟죠.
자, 입력을 할수 있다는 것은 가져 올수도 있다는 겁니다. Footer값을 가져 오고 싶다면, 위와 같이 값을 넣지 말고 뺴오면 됩니다.
Coding상으로도 Footer를 추가하는 방법에 대해 알아 보겟습니다.
Footer는 List관리자로 관리 되므로 BandTV_Simple.DataController.Summary.FooterSummaryItems.Count로 갯수를 읽어 올수 있고 .Add로 추가 할수 있습니다.
begin
FieldName := 필드명;
Format := ‘합계 = ,0;’;
Kind := skSum;
Column := 위치;
end;
간단하지요? 이젠 수동이던 자동이던 Footer를 마음대로 다룰수 있습니다.
자 그럼. 간단한 이벤트에 대해 알아보도록 하겠습니다.
위 이벤트에서 기본적인 Footer의 이벤트를 진행합니다.
이벤트의 사용예제로 Customer_no = 1351인 사람의 내용만 Sum해보는 것으로 하겠습니다.
뭐 이런짓을 할리는 없지만( Filter 를 사용하면 간단하므로 ) 조건별로 Summary등이 된다는 것을 보여주는 예제로 생각 해주시기 바랍니다.
ASender: TcxDataSummaryItems; Arguments: TcxSummaryEventArguments;
var OutArguments: TcxSummaryEventOutArguments);
var
begin
// Arguments.SummaryItem <– 현재 계산되어지는 FooterSummaryItems의 Class이다.
// 사용자가 지정한 내용을 확인 가능하다.
aItem := TcxGridTableSummaryItem( Arguments.SummaryItem );if aItem.Kind = skSUM Then 어쩌구 저쩌구 작업…
if aItem.Column = BandTV_SimpleCustNo Then 어쩌구 저쩌구 작업…
if aItem.Position = spGroup Then 어쩌구 저쩌구 작업… //아래 예제는 CustNo = 1351번의 내용만 합을 구하는 예제이다.
if ASender.DataController.GetValue(
Arguments.RecordIndex, BandTV_SimpleCustNo.Index) <> 1351 then
begin
//조건에 맞으면 Count를 하나 감소한다.(summry kind 가 count 일때)
Dec( OutArguments.CountValue );
//조건에 맞으면 Value값을 0으로 돌린다.(summry kind 가 sum등 과 같은경우)
OutArguments.Value:=0;
end;
end;
간단하지만, 그리 쉽지만은 않은 예제입니다.
여기서 주의할것은 파라미터로 넘어온 OutArguments에 적당한 값을 넣어 주거나 빼주어서 조건에 맞는 값을 처리하는 것이 요주 입니다.
참고 : 이벤트가 발생은 처음 Open 되는 경우 , BandTV_Simple.DataController.Summary.Recalculate; 함수를 호출하는 경우, 데이타가 바뀌는 경우등에서 반복 됩니다.
이벤트를 몇번 타는가는 레코드수 * Footer의 갯수입니다. ( 레코드한번에 Footer갯수만큼 반복하는 순서 입니다.)
-. GroupFooter 구성하기..
GroupFooter란 Group Box에 컬럼을 올려놓았을 경우 올려놓은 컬럼으로 Group을 만들어지는 퀀텀의 특성을 이용한 Group별 Footer입니다.
GroupFooter는 일반 Footer와 사용 방법이 거의 동일합니다.단지 차이점이라면, Group으로 나뉘어진 부분에 Footer또는 Group에 표현한다는것 입니다.
요기서는 Group Footer의 간단한 사용법만을 진행 하도록 하겠습니다.
일단 GroupFooter는 다시 두개의 방법으로 표현합니다. Default for Group과 Groups 입니다.
Default for Group는 쉽게 Group Footer를 만들어 주지만, 몇가지 단점이 있습니다. Link의 관계가 불명확하여 그리드의 내용을 Print할때나 Excel등으로 Export할경우 그값이 모두 출력되지 않는 경우가 있습니다.
따라서, 필자는 Groups를 사용할것을 권장해 드립니다. 또한 모든 예제는 Groups를 사용한 예제 입니다.
Groups는 Default for Group보다 좀더 세분화하여 관리가 가능한 넘이라고 보시면 됩니다.
Groups의 내용을 가지고 설정 하는 부분에 대해 간단히 알아보겠습니다.
Groups는 아래 그림에서 보시듯이 4개의 부분으로 나뉩니다.
Groups
참고 : Groups는 Linked에 의해 한개 이상으로 나타날수 있습니다.
위 그림처럼 달랑 2개의 링크만 해놨으므로 Summary의 내용은 2개의 컬럼만 Group으로 올라갈때 유효 합니다.
따라서 모든 컬럼을 Group으로 올리고자 한다면, 모든 컬럼을 Linked에 올려야 정상적인 계산이 이루어 집니다.
Items에서 정의한 내용.( Object properties의 이름을 주목하시기 바랍니다. 이름을 알면 Coding으로 구현하는것도 쉽게 되겠죠? )
마지막 4번째는 spFooter에 올려 놓았습니다. 자 이렇게 구성한 내용의 화면은 아래와 같습니다.
참고 : 맨 마지막의 “2,679,130”이라 출력된 내용은 그냥 Footer입니다.
왜 저사람은 빨강색으로 나오지? 라고 하신다면 힌트는 Style에 있습니다. 차후에 알아보도록 하겠습니다.
여기서 Groups의 디자인을 바꿔보도록 하겠습니다. ( 출력 방법의 변화 )
우선 groups로 묶이면, 괄호가 쳐지고 구분자는 , (콤마) 입니다. 이는 Object properties에 정의된 내용입니다.
이를 변경하시고 싶은 경우에는 아래 그림처럼 순서대로 변경 하시면 됩니다.
물론 수동으로 하셔도 되고요.( Object properties의 이름을 보시면 수정도 가능 하리라 봅니다. )
변경된 내용.
여기서 전부 괄호 안에만 출력해야 하는 것일까? 라는 의문이 생깁니다.
자 , 아래 그림을 보면 ( Demo 에도 나와 있습니다. ) 컬럼에 Groups의 내용이 들어가 있습니다.
참고 : 여기서 갯수 부분은 출력할 Column의 위치를 지정하지않아서 그룹에 포함되어 나타납니다.
자 설명이 필요 없지요? OptionsView의 GroupSummaryLayout에 정의만 하면 됩니다.
한가지더 DBbanededTableView –> OptionsView –> GroupFooterMultiSummaries 를 true로 설정하면, Group Summary를 지정할때 계산되어진 값을 같은 Column위치에 여러개 출력할수 있습니다.
예제> 그림 참조.
참조 내용.
group된 내용에 대한 편집은 아래와 같은 코드를 사용하시면 편리합니다.
Level의 깊이를 알아내는 방법.
1 2 3 4 5 6 7 8 |
// 레벨의 깊이를 알아 낸다.( Group Box에 몇개의 컬럼이 올라 갔는지 확인 ) BandTV_Simple.DataController.Groups.GroupingItemCount // Group Box에 어떤 컬럼이 올라 갔는지 알아 낸다. for i := 0 to AGroups.GroupingItemCount - 1 do begin Idx := BandTV_Simple.DataController.Groups.GroupingItemIndex[i] ; ListBox1.Items.Add( 'Columns = ' +Inttostr(idx) + ' - '+ BandTV_Simple.Items[ Idx ].Caption ); end; |
Summary의 값을 알아내는 방법.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
ListBox1.Clear; iRow := 0; iSummaryCnt := BandTV_Simple.DataController.Summary.SummaryGroups[0].SummaryItems.Count; for i := 0 to BandTV_Simple.DataController.DataControllerInfo.DataGroups.Count - 1 do begin iLevel := BandTV_Simple.DataController.DataControllerInfo.DataGroups.Items[i].Level ; S := 'Level = ' + Inttostr( iLevel ) + ' - '; for j := 0 to iSummaryCnt - 1 do s := s + 'j = ' + IntToStr( j ) + ' [ ' + VarToStr( BandTV_Simple.DataController.Summary.GroupSummaryValues[ i, j ] ) + ' ] '; ListBox1.Items.Add( S ); end; 컬럼의 값을 알아내는 방법. for i := 0 to BandTV_Simple.ViewData.RowCount - 1 do begin idx := BandTV_Simple.DataController.DataControllerInfo.DataGroups.RowInfo[i].RecordListIndex; ListBox1.Items.Add( 'Record = ' + IntToStr( idx ) + ' Column (1,2,3 ) = ' VarToStr( BandTV_Simple.DataController.Values[idx, 0] ) + ' - ' + VarToStr( BandTV_Simple.DataController.Values[idx, 1] ) + ' - ' + VarToStr( BandTV_Simple.DataController.Values[idx, 2] ) ); end; |
위에 소스를 잘 보시고 이해해 주시기 바랍니다. 퀀텀의 대부분의 작업이 위 소스를 가지면 해결 가능 합니다.
이번에는 여기서 마치고 다음장에 IncrementalSearch를 이용한 코딩법에 대하여 소개할까 합니다.
최신 댓글