全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3448
推到 Plurk!
推到 Facebook!

fastreport 3.2 變數定義的問題

答題得分者是:bestlong
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2015-07-17 11:35:15 IP:220.136.xxx.xxx 未訂閱
請問各位:

這是一個老系統了, 因為我幾乎都是使用 FastReport2.5, 最近改公司一個專案是 FastReport3.2 (我極少使用),
對於 fr3 有一個變數的定義查不到資訊, 是否有對 fr3 熟悉的網友可以幫忙解答

問題
我有一個 Memo1 的ojbect, 對應 [frxDBDataset1."COUNTS"] (masterdata1),
而 Memo2 object 則是統計 COUNTS 的 sum 值 (在Footer1)
為因應Delphi程式的一個switch(on, off)要決定是否 Memo1 是否要顯示
如果為 on, Memo1 object 則要顯示 counts, 如果為 off , 則 Memo1 不顯示
countprint 由 delphi導入 True, False

我在 fr3 的 Page1 的 這麼做
if = False then begin
Memo1.Visible := False;
Memo2.Visible := False;
Memo1.Text := ' ';
Memo2.Text := ' ';
end
else begin
Memo1.Visible := True;
Memo2.Visible := True;
Memo1.Text := '[frxDBDataset1."COUNTS"]';
Memo2.Text := '[sum(, MasterData1)]';
end;

run fr3 後, Memo1 可以順利出現每一筆counts, 但sum 的部份是空白, 所以不知道如果要這麼做, Memo2 要如何指定?

另外, 再請問一個問題
我在 fr3 定義一個 tcounts 變數,
要如何在 fr3 中令 tcounts := tcounts 1
我下 := 1; 會出現 ";" expected
如果下 tcounts := tcounts 1; 會出現 undeclared identifier : 'tcounts'
那要如何下才能達成計量的功能
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2015-07-17 13:56:02 IP:210.242.xxx.xxx 訂閱
目前有用 FR 4.8
自訂變數手動累加值,應該是在 MasterData 或 DetailData 的 OnBeforePrint 事件內處理。
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2015-07-17 14:09:01 IP:220.136.xxx.xxx 未訂閱
這個部份我了解, 我的做法是
MasterData1 -> 加載 Child1
在 Child1 的 onBeforePrint 寫

:= 1 或 tcounts := tcounts 1 都不行,
以前 fr2.5 只要寫 tcounts := tcounts 1 是沒有問題的!

tcounts 在 Data 的 Variable 中已先有新增一組 tcounts 變數
目前想了解的是, fr3 對於 Memo.Text 如何動態指定變數或函式(如 sum), 正確的語法應該如何下法?
===================引 用 bestlong 文 章=================== 目前有用 FR 4.8
自訂變數手動累加值,應該是在 MasterData 或 DetailData 的 OnBeforePrint 事件內處理。
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2015-07-17 15:00:20 IP:210.242.xxx.xxx 訂閱
離最後一次處理 FR 有點久,只好看官方文件
https://www.fast-report.com/public_download/html/FR5UserManual-HTML-en/index.html?aggregate_functions.htm

看起來 sum() 函數需要與 Group band 配合處理。
看能不能接受用一個元件計算值然後不顯示
然後才用程式碼決定是否設定到 Memo2
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2015-07-17 16:28:58 IP:220.136.xxx.xxx 未訂閱
感謝副站提供的文件, 這個我也搜尋到(有fr3的), 每一章節都看過了, 其中s cript一節是比較接近我想要的, 但都說的很簡單,
手冊也建議我們使用 getvalue(), setvalue() 來做, 但都試過, 不是空白就是錯誤, 還是找不到能達成我想要的,
如果還達不到, 只能分兩張報表, 一張有 Memo1, 一張沒有Memo1 的, 但如此做, 我的程式一共有6張報表, 兩個版本,
那就要 6 * 2 * 2(有Memo1, 無Memo1), 光一支程式就搞到24張fr3, 太恐怖
===================引 用 bestlong 文 章===================

離最後一次處理 FR 有點久,只好看官方文件
https://www.fast-report.com/public_download/html/FR5UserManual-HTML-en/index.html?aggregate_functions.htm
看起來 sum() 函數需要與 Group band 配合處理。
看能不能接受用一個元件計算值然後不顯示
然後才用程式碼決定是否設定到 Memo2
編輯記錄
P.D. 重新編輯於 2015-07-17 16:29:42, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2015-07-17 16:58:32 IP:220.136.xxx.xxx 未訂閱
本來想到一招, 利用 xe8 附的 fr5 來做測試, 於是乎啟動了 xe8, 放了一個 frxReport , 進入 editor 中, 想說按 F1 應該可以有說明, 結果半個字也沒出來, 想在 EVENT 中試著寫 s cript, 但竟然 event 無法點選, 這是怎麼回事?
(ps.使用xe以來, 從沒有去測 fr 的系統, 這是第一次)
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2015-07-17 17:14:53 IP:210.242.xxx.xxx 訂閱
報表變數 tcounts 可以用 < tcounts >  或  Get('tcounts') 來取值

但是要設值就要用 Set('tcounts', < tcounts > 1) 來處理

------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
編輯記錄
bestlong 重新編輯於 2015-07-17 17:15:51, 註解 無‧
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2015-07-17 23:48:00 IP:220.136.xxx.xxx 未訂閱
試了一整天, 我找到方法了

Data->Variable 中設置一組 tcounts 變數 (計算數量值用), 一組 printon 變數(接收由Delphi傳進來的 旗標, 為True 則要計量, 為 False 則不顯示

MasterDataset1 設置一個 Memo1 -> [frxDataBaseset1."COUNTS"] (每筆數量, 不要寫入 Memo1.Text, 即保持空白, 預設 Visible=False)
Footer1 設置一個 Memo2 -> [sum(, MasterDataset1)] (總數量, 先寫入 Memo2.Text, 預設 Visible=False)
在 Page1 -> on BeforePrint 下寫

if = False then begin
Memo1.Visible := False;
Memo2.Visible := False;
Memo1.Text := ' '; // 不顯示時, 讓 Memo1 空白
end
else begin
Memo1.Visible := True;
Memo2.Visible := True;
Memo1.Text := '[frxDBDataset1."COUNTS"] '; // 這個寫法fr3可接受動態帶入dataset 值
end;

在 MasterDataset1 -> on BeforePrint 下寫
if = True then set('tcounts', ); // 如果要顯示, 則把Dataset值丟進 tcount

這樣就成了, 不但每筆可顯示 dataset 值, 最後 footer 也可加總 每一次 set() 的 tcounts 值,
我不知道 fr3 的原理是什麼, 似乎 sum() 的函式可以累加每次的 tcounts, 這是我的猜測, 因為所有的 fr 手冊都沒有提到 sum() 的原理
這也是我在不經意的測試下, 胡亂碰到的, 是幸或不幸, 不管! 只要能解決就好

但動態指定 Memo2.Text := '[sum(, MasterDataset1)] ' 或 ', MasterDataset1)>' 都會引發錯誤, 似乎 Memo2.Text 不可以指定動態函式給值
我發上本袩的問題, 就是在於這部份不解, 要不然也不用這樣繞一大圈
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2015-07-18 01:07:13 IP:220.136.xxx.xxx 未訂閱
忘了補充一點,
可能各位會想, 為什麼要動態改變 Memo1的欄位值, 原因是
在我的Delphi sql 中, 如果 printon 時, query 的 select 有 counts , 反之則不會有 select counts 語法
所以, 如果我預先在 Memo1.Text 設置 , 會招致 fr3 的錯誤,
因此才要動態的指定才能解決
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#10 引用回覆 回覆 發表時間:2015-07-22 15:48:05 IP:210.242.xxx.xxx 未訂閱
這樣不知道可否??
TfrxMemoView(form1.FindObject('frxDBDataset1.FieldByName('COUNTS').AsString;
Showreport之前...
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#11 引用回覆 回覆 發表時間:2015-07-22 23:54:37 IP:118.169.xxx.xxx 未訂閱
原則上是可以的, 但我並不想寫在Delphi上, 原因很簡單, 寫在delphi上就失去了 fr 原本最強的機動性功能, 一但要改變任何運算, 就得要重新編譯, 而且我面臨上千個不同客戶需求的報表, 所以不可能改1000支不同的程式!
===================引 用 chih 文 章===================
這樣不知道可否??
TfrxMemoView(form1.FindObject('frxDBDataset1.FieldByName('COUNTS').AsString;
Showreport之前...
系統時間:2024-04-25 21:08:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!