QReport |
答題得分者是:careychen
|
lasterliu
一般會員 發表:38 回覆:57 積分:19 註冊:2007-11-05 發送簡訊給我 |
請問各位大大,小弟在設計一份報表時遇到一個問題,想詢問知道的大大到底是什麼原因呢?
問題描述: 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 發送簡訊給我 |
|
kadee
高階會員 發表:11 回覆:141 積分:165 註冊:2002-03-20 發送簡訊給我 |
|
ko
資深會員 發表:28 回覆:785 積分:444 註冊:2002-08-14 發送簡訊給我 |
|
lasterliu
一般會員 發表:38 回覆:57 積分:19 註冊:2007-11-05 發送簡訊給我 |
|
careychen
尊榮會員 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
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 發送簡訊給我 |
各位大大,不好意思,過很久都還沒回覆這問題,真是抱歉。
小弟試過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 發送簡訊給我 |
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大大的程式碼後想出來的,若有任何更好的方法或可以修改的地方, 煩請各位大大根小弟說一下~~謝謝各位的回答。
------
價值的展現,來自於你用哪一個角度來看待它!! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |