Crystal Reports 財務日記帳憑證套打設計

 

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)) + "元整"
    
最後的成果如圖:

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章