線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2781
推到 Plurk!
推到 Facebook!

QReport

答題得分者是:careychen
lasterliu
一般會員


發表:38
回覆:57
積分:19
註冊:2007-11-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-08-12 11:10:56 IP:139.223.xxx.xxx 訂閱
請問各位大大,小弟在設計一份報表時遇到一個問題,想詢問知道的大大到底是什麼原因呢?
問題描述:
1、報表格式
Page Header
Detail (分為4個Column) 也是問題所在
Page Footer

2、問題
小弟因為每頁的前兩個Column不要列印資料,意即每頁都從第三欄開始列印。
在PageStart設定初始值 Column_Count=1;
Date_Count:=0;

在Detail的Band之BeforePrint設定
// 一開始當Column為一時,則跳下一個欄位,讓其跳兩個欄位,從第三個開始寫入
if Column_Count=1 then
begin
MWOR0201F2.NewColumn;
MWOR0201F2.NewColumn;
Column_Count:=Column_Count 2;
end;

// 品號不同即跳頁,相同則資料比數加一
if (N_LOT_Temp<>MWOR0201F.ADOSQL1.Fields[0].AsString) AND (N_LOT_Temp<>'') then
MWOR0201F2.NewPage
else
Date_Count:=Date_Count 1;

// 一欄只能列印八筆資料
if Date_Count=9 then
begin
MWOR0201F2.NewColumn;
Column_Count:=Column_Count 1;
end;

Detail結果如下
Column_1 Column_1 Column_1 Column_1
第一筆資料 第二筆資料
第三筆資料
第四筆資料
||
||
依此類推,問題為為何我都在BefortPrint前進行判斷了,怎麼他還是都先列印一筆資料後再進行判斷。
麻煩知道的大大跟小弟解說一下原理或者錯在哪了,謝謝~~~~
lasterliu
一般會員


發表:38
回覆:57
積分:19
註冊:2007-11-05

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-08-15 22:52:05 IP:123.192.xxx.xxx 訂閱
不好意思,在回覆詢問一下,不知是否有大大能指點小弟一下,若是題目小弟描述的不夠清楚讓各位大大不能了解小弟再說什麼,
麻煩各位大大也跟小弟說一下,小弟會盡快補充讓問題更詳盡,謝謝~~^^
kadee
高階會員


發表:11
回覆:141
積分:165
註冊:2002-03-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-08-16 10:24:38 IP:59.127.xxx.xxx 訂閱
其實一旦QR列印的行為不如你想要的,除了修改程式以外,比較簡單的方法
就是換個方式簡化。
你的問題比較簡單的辦法是,抓一個 memorytable (MT),先在 MT 新增16個records,
再將你要印的資料放在第17筆及以後的record。
然後將QR的dataset 指向 MT,應該就OK了。
------
Kadee/BigRed Ent.
www.tw165.com
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-08-17 11:38:10 IP:61.66.xxx.xxx 訂閱
老實說我也不清楚原理~
但是你可以在QR1的beforeprint中加入判斷看看!!
QR 真是不好搞!!!!!!!!!
------
======================
昏睡~
不昏睡~
不由昏睡~
lasterliu
一般會員


發表:38
回覆:57
積分:19
註冊:2007-11-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-08-17 21:27:01 IP:123.192.xxx.xxx 訂閱
謝謝ko大大的提醒,這個我還沒試過,我只有試過在Page Header的AfterPrinter作判斷(我的QR有PageHeader  Detail PageFooter三個),但結果更糟,資料改全顯現在PageHeader那一列。
我試完後再來回覆給大家。謝謝KO大大^^。
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-08-18 22:58:00 IP:59.126.xxx.xxx 訂閱
HI, 可以試試下面這樣
[code delphi]
procedure TForm1.Button1Click(Sender: TObject);
begin
iColumn := 0; // 目前是第幾個 Column
iRow := 0; // 目前是第幾行
quickrep1.Preview;
end;
procedure TForm1.QRBandDetailBeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean);
var bNeedNextPage: Boolean;
begin
inc(iRow);
// 每 8 個為一個 Column
if iRow = 8 then
begin
iRow := 0;
inc(iColumn);
// 當為第5個 Column 時,表示是下一頁了
// 所以這邊不可以寫 NewPage
if iColumn = 5 then
iColumn := 0
else
quickrep1.NewColumn;
end;
// 這邊是用檢查你要跳頁的地方
bNeedNextPage := AdoTable1.FieldbyName('DataID').AsInteger = 26;
if (iRow = 0) and (iColumn = 3) then bNeedNextPage := False;

// 只有在第三個 Column 和不強迫跳頁時才列印
PrintBand := (iColumn = 3) and (not bNeedNextPage);

// 注意這邊,假如這個 Column 沒有印東西的話
// 要叫 ADODataSet 往前一筆哦!!
if Not PrintBand then
AdoTable1.Prior;
end;
[/code]

===================引 用 lasterliu 文 章===================
請問各位大大,小弟在設計一份報表時遇到一個問題,想詢問知道的大大到底是什麼原因呢?
問題描述:
1、報表格式
Page Header
Detail (分為4個Column) 也是問題所在
Page Footer

2、問題
小弟因為每頁的前兩個Column不要列印資料,意即每頁都從第三欄開始列印。
在PageStart設定初始值 Column_Count=1;
Date_Count:=0;

在Detail的Band之BeforePrint設定
// 一開始當Column為一時,則跳下一個欄位,讓其跳兩個欄位,從第三個開始寫入
if Column_Count=1 then
begin
MWOR0201F2.NewColumn;
MWOR0201F2.NewColumn;
Column_Count:=Column_Count 2;
end;

// 品號不同即跳頁,相同則資料比數加一
if (N_LOT_Temp<>MWOR0201F.ADOSQL1.Fields[0].AsString) AND (N_LOT_Temp<>'') then
MWOR0201F2.NewPage
else
Date_Count:=Date_Count 1;

// 一欄只能列印八筆資料
if Date_Count=9 then
begin
MWOR0201F2.NewColumn;
Column_Count:=Column_Count 1;
end;

Detail結果如下
Column_1 Column_1 Column_1 Column_1
第一筆資料 第二筆資料
第三筆資料
第四筆資料
||
||
依此類推,問題為為何我都在BefortPrint前進行判斷了,怎麼他還是都先列印一筆資料後再進行判斷。
麻煩知道的大大跟小弟解說一下原理或者錯在哪了,謝謝~~~~
------
價值的展現,來自於你用哪一個角度來看待它!!
編輯記錄
careychen 重新編輯於 2008-08-18 22:58:55, 註解 無‧
lasterliu
一般會員


發表:38
回覆:57
積分:19
註冊:2007-11-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-08-22 12:31:28 IP:139.223.xxx.xxx 訂閱
各位大大,不好意思,過很久都還沒回覆這問題,真是抱歉。
小弟試過ko與careychen大大的方法後,依然不行。
不過看到careychen大大,讓小弟想到用另一偷吃步的方法解決此問題。
程式如下:
procedure TMWOR0201F2.QuickRepStartPage(Sender: TCustomQuickRep);
begin
Date_Count:=0; // 代表資料數
Column_Count:=1; // 代表列印欄位
end;

// 此為Detail的BeforePrint宣告 有更改的部分我以紅字顯示
procedure TMWOR0201F2.QRBand2BeforePrint(Sender: TQRCustomBand;var PrintBand: Boolean);
begin
// 原本Detail中的資料顯示是以QRDBText現將其改為QRLabel
// 在列印之前會將QRLabel都清空
QRLabel19.Caption:='';
QRLabel20.Caption:='';
QRLabel21.Caption:='';
QRLabel22.Caption:='';
QRLabel23.Caption:='';
QRLabel24.Caption:='';


if (Column_Count=1) then
begin
MWOR0201F2.NewColumn;
MWOR0201F2.NewColumn;
// 因為報表都會將第一筆資料先列印出來再第一欄,才進行判斷
{
第一欄 第二欄 第三欄 第四欄
first second
third
|
|
}
// 所以我依然讓他如此列印只是當它列印第一筆資料時,QRLabel都是空的,
// 且再將資料往前一筆,那第三欄原本是從second列印起,因為往前一筆所以依然從第一筆資料開始列印。
MWOR0201F.ADOSQL1.Prior;
Column_Count:=3;
end;
// 品號不同即跳頁,相同則資料比數加一
if (N_LOT_Temp<>MWOR0201F.ADOSQL1.Fields[0].AsString) AND (N_LOT_Temp<>'') then
// 這裡要用newpage 不可用newcolumn
MWOR0201F2.NewPage
else
begin
if (Column_Count=3) OR (Column_Count=4)then
begin
將資料傳給QRLabel
Date_Count:=Date_Count 1;
end;
end;
// 一欄只能列印八筆資料
if Date_Count=9 then
begin
MWOR0201F2.NewColumn;
Column_Count:=Column_Count 1;
end;
end;

以上是小弟在看過careychen大大的程式碼後想出來的,若有任何更好的方法或可以修改的地方,
煩請各位大大根小弟說一下~~謝謝各位的回答。
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-08-22 12:47:57 IP:218.210.xxx.xxx 訂閱
hi~~,我上面的程式那個我實測過,應該是可以的,所以我在猜,可能是大大你【放資料的時間點】不大對,所以沒有預期的效果出現
而且我的都是直接用 TQRDBText 使用的,沒有用 TQRLabel 的唷~~!

不過,先恭禧你的目標達成~~~!

===================引 用 lasterliu 文 章===================
各位大大,不好意思,過很久都還沒回覆這問題,真是抱歉。
小弟試過ko與careychen大大的方法後,依然不行。
不過看到careychen大大,讓小弟想到用另一偷吃步的方法解決此問題。
程式如下:
procedure TMWOR0201F2.QuickRepStartPage(Sender: TCustomQuickRep);
begin
Date_Count:=0; // 代表資料數
Column_Count:=1; // 代表列印欄位
end;

// 此為Detail的BeforePrint宣告 有更改的部分我以紅字顯示
procedure TMWOR0201F2.QRBand2BeforePrint(Sender: TQRCustomBand;var PrintBand: Boolean);
begin
// 原本Detail中的資料顯示是以QRDBText現將其改為QRLabel
// 在列印之前會將QRLabel都清空
QRLabel19.Caption:='';
QRLabel20.Caption:='';
QRLabel21.Caption:='';
QRLabel22.Caption:='';
QRLabel23.Caption:='';
QRLabel24.Caption:='';


if (Column_Count=1) then
begin
MWOR0201F2.NewColumn;
MWOR0201F2.NewColumn;
// 因為報表都會將第一筆資料先列印出來再第一欄,才進行判斷
{
第一欄 第二欄 第三欄 第四欄
first second
third
|
|
}
// 所以我依然讓他如此列印只是當它列印第一筆資料時,QRLabel都是空的,
// 且再將資料往前一筆,那第三欄原本是從second列印起,因為往前一筆所以依然從第一筆資料開始列印。
MWOR0201F.ADOSQL1.Prior;
Column_Count:=3;
end;
// 品號不同即跳頁,相同則資料比數加一
if (N_LOT_Temp<>MWOR0201F.ADOSQL1.Fields[0].AsString) AND (N_LOT_Temp<>'') then
// 這裡要用newpage 不可用newcolumn
MWOR0201F2.NewPage
else
begin
if (Column_Count=3) OR (Column_Count=4)then
begin
將資料傳給QRLabel
Date_Count:=Date_Count 1;
end;
end;
// 一欄只能列印八筆資料
if Date_Count=9 then
begin
MWOR0201F2.NewColumn;
Column_Count:=Column_Count 1;
end;
end;

以上是小弟在看過careychen大大的程式碼後想出來的,若有任何更好的方法或可以修改的地方,
煩請各位大大根小弟說一下~~謝謝各位的回答。
------
價值的展現,來自於你用哪一個角度來看待它!!
系統時間:2024-04-25 18:09:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!