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

 

 

 

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