天天看点

Crystal Reports 财务日记帐凭证套打设计

Crystal Reports 财务日记帐凭证套打设计

一、首先大家看下财务日记帐凭证的纸张格式:

Crystal Reports 财务日记帐凭证套打设计

下面我们来分析下有几点要素:1、每页显示5行记录,2、就是在合计处的中文金额大写了。其他页眉页脚在水晶报表中很容易设计。

二、报表设计:在此只是提供一种实现方式,如果有更好的方法实现欢迎交流。

如图构建水晶报表:

Crystal Reports 财务日记帐凭证套打设计

在页眉处设计相关固定格式;新建过账日期组(配合之后的设计可以将不同日期的数据按页分开);详细数据中显示我们需要的信息;最后新建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)) + "元整"

最后的成果如图:

继续阅读