Crystal Reports 財務日記帳憑證套打設計
一、首先大家看下財務日記帳憑證的紙張格式:
下面我們來分析下有幾點要素:1、每頁顯示5行記錄,2、就是在合計處的中文金額大寫了。其他頁眉頁腳在水晶報表中很容易設計。
二、報表設計:在此只是提供一種實現方式,如果有更好的方法實現歡迎交流。
如圖構建水晶報表:
在頁眉處設計相關固定格式;新建過賬日期組(配合之後的設計可以將不同日期的數據按頁分開);詳細數據中顯示我們需要的信息;最後新建4個空白格式組頁腳(我們使用的是SQL2008,在數據庫中查詢到的日記帳數據可以按照過賬日期分組,爲了實現每頁5行數據的格式套打,我們需要增加4行空白行,然後分別判斷本頁顯示數據一共有幾行如果不足5行數據則用空白行替代。)
實現每頁5行數據:首先我們在查詢數據庫數據的時候爲每行數據增加了一列名爲Num值爲1例如:selsct *,1 Num from XX where XX。(配合水晶報表的彙總功能我們就可以知道每行數據的序號,爲了實現每頁5行數據我們還要增加一個公式字段TotalNum記錄序號並且將序號按照1-5循環顯示 :if ({#RTotal0}-({#RTotal0} \ 5) * 5)=0 then 5 else {#RTotal0}-({#RTotal0} \ 5) * 5)。然後利用TotalNum我們在每個組頁角中添加抑制顯示的條件(例如:第4行紅白格式組頁角就判斷如果TotalNum〉4就抑制顯示,第3行紅白格式組頁角就判斷如果TotalNum〉3就抑制顯示,以此類推)。到此我們爲每個組的數據每頁顯示5行補足了空白的格式行,下面就是讓數據分頁顯示了,在最後一個組頁腳節專家中勾選在後面新建頁並添加條件,使得最後一組的數據後面不用新建頁我是這樣實現的{getOJDT;1.TransId}<Maximum ({getOJDT;1.TransId}) ;並且在最後組頁腳節專家中勾選之後重置頁碼。這樣我們格式化顯示數據的工作完成了,只要調整下詳細數據和組頁腳的高度就可以實現5行數據顯示)。
三、下面我們來實現金額大寫:
//定義一個字符數組
stringVar array strNumber := ["零","壹","貳","叄","肆","伍","陸","柒","捌","玖"];
//把數值轉換爲字符串
StringVar strValue := CStr({@TotalDebit});
//獲取數值字符串的長度
NumberVar strLength := Length(strValue);
//如果有小數點就進行獲取元、角、分的字符串
//在這裏我們使用mid函數階段金額字符和ToWords函數轉換金額爲大寫,可以查看幫助文檔
//沒有小數點的話就直接採用ToWords{@TotalDebit})這個值就可以了
//由於ToWords函數在轉換角和分的時候不能真確顯示所以角和分我們要單獨轉換,
//雖然ToWords函數可以轉換負數但是爲了截取金額中的"-"號 我這裏還是單獨使用了一個變量存儲"負"這個字符串
if inStr(strValue,".")>0 then
(
StringVar strDec := mid(strValue, inStr(strValue,".")+1,2);
StringVar strB := mid(strDec,1,1);
StringVar strC := mid(strDec,2,1);
);
if InStr (strValue,"-")=0 then
//判斷特殊情況".00"
if inStr(strValue,".")=1 then
(StringVar strA:="0";)
else
(StringVar strA := mid(strValue,1,inStr(strValue,".")-1);
stringvar strX :="";)
else if InStr (strValue,"-")>0 then
( StringVar strA := mid(strValue,2,inStr(strValue,".")-1);
stringvar strX :="負";);
//判斷特殊情況"-.00"
if strA="." then strA:="0";
if strB<>"0" or strC <>"0" then
if strA="0" then
if strB="0" then
strX + strNumber[ToNumber(strC)+1] + "分整"
else if strC ="0" then
strX + strNumber[ToNumber(strB)+1] + "角整"
else
strX + strNumber[ToNumber(strB)+1] + "角" + strNumber[ToNumber(strC)+1] +"分整"
else
strX + ToWords(toNumber(strA)) + "元" + strNumber[ToNumber(strB)+1] + "角" + strNumber[ToNumber(strC)+1] +"分整"
else
strX + ToWords(toNumber(strA)) + "元整"
最後的成果如圖: