**************************************************************
>>얼마전에 아래와 같은 질문을 올렸습니다.
**************************************************************
리스트박스에 500건정도의 리스트가 있습니다.
여기서 프린트하고 싶은 리스트만 골라서 프리뷰를 합니다.
그리고 그 중에서 일부만 실제 프린트를 합니다.
이때, 실제 프린트한 종이의 어떤 항목의 data값을 얻고 싶어서
다음과 같이 했습니다.
procedure Tprint_seikyuu_data.QuickRep1AfterPrint(Sender: TObject);
begin
showmessage(DM.Query1.FieldByName('TOKUISAKICD').AsString);
end;
근데, 여러 이상한 현상이 발생합니다
예를들어,
3장을 실제 프린트했는데, 마지막 종이의 data값만 출력되거나
또 어떤때는
리스트박스에서 선택하지도 않은 전혀 엉뚱한 data값이 나옵니다.
왜 그런가여?
해결하려면 어찌해야 하나여?
**************************************************************
>>그래서 아래와 같은 답변을 얻었습니다.
**************************************************************
원하시는 결과가 무엇인지 모르겠지만
퀵리포트 컴포넌트에서 AfterPrint는 모든 출력을 마친 후에 실행되는 이벤트 입니다.
그렇기 때문에 마지막 장에서 결과가 한 번 뜨는 것이 옳기 때문에 그런 현상이 발생한 것 같습니다.
원하는 값이 들어 있는 밴드에 AfterPrint 이벤트를 사용하세요.
**************************************************************
>>그래도 역시 같은 현상이 일어납니다.
**************************************************************
답변주신 분의 말씀대로 했는데도(A부분)
여전히 같은 현상이 발생하네여.
혹시나 도움이 될까 해서 소스까지 같이 올려봅니다.
죄송하지만 좀 봐 주세여.
참고로 sql문이 실행, open된 상태에서 report를 프리뷰하고 있습니다.
또 밴드는 rbPageHeader(얻고 싶은 값필드가 있는 밴드입니다), rbDetail,
rbPageFooter의 3개를 사용하고 있습니다
**************************************************************
>>아래는 소스입니다
**************************************************************
.....
zankin4: TQRLabel;
QRBand3: TQRBand;
QRShape12: TQRShape;
procedure QuickRep1BeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
procedure QuickRep1NeedData(Sender: TObject; var MoreData: Boolean);
procedure QRBand2BeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
procedure QRBand1BeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
private
{ Private 宣言 }
procedure pageheaderset;
public
{ Public 宣言 }
nenngetudo,hansya_addr,hansya_tel,hakkoubi:string;
tcode:string;
udate:string;
end;
var
print_seikyuu_data: Tprint_seikyuu_data;
firstexecute:integer;
tokuisakicd_betu_datacnt:integer;
tokuisakicd_betu_pagenum:integer;
implementation
uses DataM;
{$R *.DFM}
procedure Tprint_seikyuu_data.QuickRep1BeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
begin
firstexecute := 0;
tokuisakicd_betu_datacnt:=0;
tokuisakicd_betu_pagenum:=1;
DM.M_Query1.First;
if not DM.M_Query1.EOF then PrintReport := True
else PrintReport := False;
tcode := DM.M_Query1.FieldByName('TOKUISAKICD').AsSTRING;
udate :='2999';
end;
procedure Tprint_seikyuu_data.QuickRep1NeedData(Sender: TObject;
var MoreData: Boolean);
begin
inc(firstexecute);
inc(tokuisakicd_betu_datacnt);
if not DM.M_Query1.EOF then MoreData := True
else MoreData := False;
end;
procedure Tprint_seikyuu_data.QRBand2BeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
begin
with DM.M_Query1 do
begin
if (tcode <> DM.M_Query1.FieldByName('TOKUISAKICD').AsString) then
begin
tokuisakicd_betu_pagenum :=1;
tokuisakicd_betu_datacnt :=1;
QuickRep1.NewPage;
end
//
if trim(FieldByName('uriagebi').asstring)='' then
begin
uriagebi.Caption := '' ;
udate := '2999';
end
else
begin
if udate = trim(FieldByName('uriagebi').AsSTRING) then
uriagebi.Caption := ''
else
uriagebi.Caption := FieldByName('uriagebi').AsSTRING;
udate := trim(FieldByName('uriagebi').AsSTRING);
end;
//
if FieldByName('code').asstring='' then
code.Caption := ''
else
code.Caption := FieldByName('code').AsSTRING;
//
if FieldByName('itemname').asstring='' then
itemname.Caption := ''
else
itemname.Caption := FieldByName('itemname').AsSTRING;
//
if firstexecute =1 then
begin
pageheaderset;
end;
end;
PrintBand := True;
DM.M_Query1.Next;
end;
procedure Tprint_seikyuu_data.QRBand1BeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
begin
if (firstexecute <>1) then
begin
if (tcode <> DM.M_Query1.FieldByName('TOKUISAKICD').AsString) then
pageheaderset;
end;
end;
procedure Tprint_seikyuu_data.pageheaderset;
begin
with DM.M_Query1 do
begin
YUBIN_NO.Caption := FieldByName('post').AsSTRING;
address1.Caption := FieldByName('addr1').AsSTRING;
kanji1.Caption := FieldByName('KANJI1').AsSTRING;
number.Caption := FieldByName('renbannumber').asstring ;
H_address.caption := hansya_addr ;
tel.caption := 'TEL.'+hansya_tel ;
zankin1.caption := formatfloat('#,##0',FieldByName('tougetuseikyu').asinteger) ;
zankin2.caption := formatfloat('#,##0',FieldByName('jengetuseikyu').asinteger) ;
zankin3.caption := formatfloat('#,##0',FieldByName('nyukingaku').asinteger) ;
end;
end;
procedure Tprint_seikyuu_data.QRBand1AfterPrint(Sender: TQRCustomBand; // A
BandPrinted: Boolean);
begin
showmessage(DM.M_Query1.FieldByName('TOKUISAKICD').AsString);
end;
end.
그 쿼리에 값을 출력할 자료만 넣는것은 어떨지요????
그후에 해당 필드의 afterprint 이벤트의 값을 해보시면 알수 있을것입니다.
참고로 필드가 많거나 해서 일일히 하기 귀찮다면 똑같이 복사해서
필드갯수만큼 루프돌리면 데이타도 쉽게 넣을수 있습니다..