Q&A

  • 스트링 그리드를 가지고 QReport 다루기
Detail

-------------------------

Group Header

-------------------------

Sub Detail QRLabel1 QRLabel2 ...

-------------------------

Group Header

-------------------------

Sub Detail QRLabel11 QRLabel12 ...



의 형태로 퀵리포트를 구성하고





procedure Tform2.QuickRep1NeedData(Sender: TObject;

var MoreData: Boolean);

begin

if count <= Form1.Grid1.RowCount - 1 then begin

MoreData := true;

end else begin

MoreData := false;

end;

if Not MoreData Then

count := 0;

end;



procedure Tform2.FormCreate(Sender: TObject);

begin

count := 0;

end;



procedure Tform2.QRBand1BeforePrint(Sender: TQRCustomBand;

var PrintBand: Boolean);

begin

with form1.Grid1 do begin

QRLabel1.Caption := cells[0, count];

QRLabel2.Caption := cells[1, count];

...

QRLabel11.Caption := cells[11, count];

QRLabel12.Caption := cells[12, count];

...

end;

inc(count);

end;



의 형태로 코딩하였습니다.

근데 preview 폼이 뜨며 연결은 되는데, 각 서브디테일밴드에 나타나야할

form1에서의 스트링그리드 값들이 나타나지 않습니다.

물론 form2의 QRLabel들도 아예 나타나지 않네요.(enable 이 true 상태인데도...)

form1의 스트링그리드는 하나이지만 column 이 너무 길어서 디테일밴드는 둘로 나눠져야

하는데 그 방법좀 가르쳐 주십시오. 물론 DB로 연결되지는 않습니다.





2  COMMENTS
  • Profile
    종이학 2000.02.09 05:44
    nambada wrote:

    > Detail

    > -------------------------

    > Group Header

    > -------------------------

    > Sub Detail QRLabel1 QRLabel2 ...

    > -------------------------

    > Group Header

    > -------------------------

    > Sub Detail QRLabel11 QRLabel12 ...

    >

    > 의 형태로 퀵리포트를 구성하고

    >

    >

    > procedure Tform2.QuickRep1NeedData(Sender: TObject;

    > var MoreData: Boolean);

    > begin

    > if count <= Form1.Grid1.RowCount - 1 then begin

    > MoreData := true;

    > end else begin

    > MoreData := false;

    > end;

    > if Not MoreData Then

    > count := 0;

    > end;

    >

    > procedure Tform2.FormCreate(Sender: TObject);

    > begin

    > count := 0;

    > end;

    >

    > procedure Tform2.QRBand1BeforePrint(Sender: TQRCustomBand;

    > var PrintBand: Boolean);

    > begin

    > with form1.Grid1 do begin

    > QRLabel1.Caption := cells[0, count];

    > QRLabel2.Caption := cells[1, count];

    > ...

    > QRLabel11.Caption := cells[11, count];

    > QRLabel12.Caption := cells[12, count];

    > ...

    > end;

    > inc(count);

    > end;

    >

    > 의 형태로 코딩하였습니다.

    > 근데 preview 폼이 뜨며 연결은 되는데, 각 서브디테일밴드에 나타나야할

    > form1에서의 스트링그리드 값들이 나타나지 않습니다.

    > 물론 form2의 QRLabel들도 아예 나타나지 않네요.(enable 이 true 상태인데도...)

    > form1의 스트링그리드는 하나이지만 column 이 너무 길어서 디테일밴드는 둘로 나눠져야

    > 하는데 그 방법좀 가르쳐 주십시오. 물론 DB로 연결되지는 않습니다.

    >

    >





    QuickReport의 NeedData이벤트는 DetailBand에 찍을 데이터에 대한거구요..

    각 SubDetailBand에 보면 OnNeedData이벤트가 있습니다.

    각각 SubDetailBand의 OnNeedData이벤트에도 QuickReport의 NeedData이벤트처럼

    코딩을 해주시구요.

    각SubDetailBand의 BeforePrint이벤트에서 해당하는 Form의 StringGrid의 값을

    Assign하는 코딩을 합니다.







  • Profile
    이재식 2000.02.08 06:23
    nambada wrote:

    > Detail

    > -------------------------

    > Group Header

    > -------------------------

    > Sub Detail QRLabel1 QRLabel2 ...

    > -------------------------

    > Group Header

    > -------------------------

    > Sub Detail QRLabel11 QRLabel12 ...

    >

    > 의 형태로 퀵리포트를 구성하고

    >

    >

    > procedure Tform2.QuickRep1NeedData(Sender: TObject;

    > var MoreData: Boolean);

    > begin

    > if count <= Form1.Grid1.RowCount - 1 then begin

    > MoreData := true;

    > end else begin

    > MoreData := false;

    > end;

    > if Not MoreData Then

    > count := 0;

    > end;

    >

    > procedure Tform2.FormCreate(Sender: TObject);

    > begin

    > count := 0;

    > end;

    >

    > procedure Tform2.QRBand1BeforePrint(Sender: TQRCustomBand;

    > var PrintBand: Boolean);

    > begin

    > with form1.Grid1 do begin

    > QRLabel1.Caption := cells[0, count];

    > QRLabel2.Caption := cells[1, count];

    > ...

    > QRLabel11.Caption := cells[11, count];

    > QRLabel12.Caption := cells[12, count];

    > ...

    > end;

    > inc(count);

    > end;

    >

    > 의 형태로 코딩하였습니다.

    > 근데 preview 폼이 뜨며 연결은 되는데, 각 서브디테일밴드에 나타나야할

    > form1에서의 스트링그리드 값들이 나타나지 않습니다.

    > 물론 form2의 QRLabel들도 아예 나타나지 않네요.(enable 이 true 상태인데도...)

    > form1의 스트링그리드는 하나이지만 column 이 너무 길어서 디테일밴드는 둘로 나눠져야

    > 하는데 그 방법좀 가르쳐 주십시오. 물론 DB로 연결되지는 않습니다.

    >

    >



    이재식 Wrote :

    안녕하세요?



    잘 보았습니다.



    subdetail에 올려놓은 라벨에 출력할 값이 보이지 않는 것은 당연한 것입니다.

    왜냐하면, detail과 연결이 되어있지 않을뿐더러 onNeedData이벤트를 쓰셨기

    때문입니다.



    사실, 위의 내용만으론 의도내용이 무엇인지 잘 모르겠습니다.

    우리가 onNeedData이벤트를 쓰면 장점은 유동성, 그러나 단점은 프로그래머의

    코딩이 필요하다는 것입니다.

    보니까, subdetail를 두개 쓰셨는데요,

    detail에 출력되는 현 레코드의 키값과 같은 레코드를 출력하려는 것 같습니다.



    만약 그렇다면, 그리고 onNeedData이벤트를 쓰신다면 코딩을 하셔서,

    출력하기 전에 스트링 그리드에 모든 결과들이 담겨 있어야 합니다.

    즉, 스트링 그리드에 마스터/디테일 관계의 데이터들이 담겨 있어야

    합니다.

    그리고, subdetail밴드는 쓸 수 없고요, detail밴드만 쓰셔서 하시면 됩니다.



    즉, onNeedData이벤트를 쓴다는 것은 DataSet기능을 쓰지 않는 다는 것이고요,

    그럼으로써 유동성있게 출력할 수 있지만, 퀵에서 제공하는 많은(?)기능들은

    쓸 수 없고, 프로그래머가 코딩을 해야 한다는 것입니다.



    그리고, 칼럼이 너무 길어서 디테일을 두개 나누고 싶다고 하셨는데요,

    이런 문제가 소위 동적칼럼 출력문제인데요,

    한 스트링 그리드내에 모든 칼럼을 다 담았다고 가정해보면

    출력시 몇개까지 끈어서 출력을 해야 겠죠.

    아니면, 스트링 그리드를 적당히 써서 칼럼의 개수를 분배하는 것입니다.



    저의 경험으론 두번째 방법으로 하는것이 용이할 듯 합니다.

    그러나, 문제에 따라 틀립니다.