这样的一个数据集(我可以根据需要再调整,添加一些其他的信息列,保证报表的打印),要打印成这样的报表,应该怎么打客户名称   结算单号      产品    数量       金额      
张三        0001        A      10       100
张三        0001        B      20       300
张三        0001        C      15        45
张三        0001        D      70       350
张三        0002        E      30       150
张三        0002        F      8        320
.
.
.打印出的格式要求是--------------------------------------- 结算单号: 0001      客户: 张三
 
  A      10      100
  B      20      300
  C      15       45
  D      70      350
 小计   115      795
 大写金额  柒佰玖拾伍元零角
 操作员 : Admin     日期 : 2008.04.29
  第一张  累计金额: 795---------------------------------------
 
 结算单号: 0002      客户: 张三
 
  E      30      150
  F       8      320
  .(后面如果没有记录了,要补足每张单子4行的高度)
  .
 小计    38      470
 大写金额  肆佰柒拾零元零角
 操作员 : Admin     日期 : 2008.04.29
  第二张  累计金额: 1265 (说明:这个值是本张报表小计金额与上一张的累计金额的和)---------------------------------------我用FastReport作,分组和小计是好实现的,我用GroupHead和MasterData,GroupFoot三个Band实现了,现在还有三个问题
1.我在GroupHead上放了一个Memo,写上[FrxData."结算单号"],结果打出来,两张上的结算单号都是0001,第二张应该是0002
2.每张上的小计我用GroupFoot实现了,但是由于小计结果是动态产生的,转化成大写形式应该怎么作,自定义函数么
3.现在每张单子要求是4条记录,最后一张很可能出现不足4条的情况,比如只有1条,这时候小计结果会打印到第2条记录的位置,底下的信息都跑到上面去了,这个应该怎么处理希望给予指点的朋友能说的详细写,那些信息放到哪个Band上,象现在,操作员和日期是死的,但是这一栏上下的内容又都是动态生成的,比较麻烦

解决方案 »

  1.   

     function TJzpzEdit1.MoneyCn(mmje: Double): string;
    const
      s1: string = '零壹贰叁肆伍陆柒捌玖';
      s2: string = '分角元拾佰仟万拾佰仟亿拾佰仟万';  function StrTran(const S, s1, s2: string): string;
      begin
        Result := StringReplace(S, s1, s2, [rfReplaceAll]);
      end;
    var
      S, dx: string;
      i, Len: Integer;
    begin
      if mmje < 0 then
      begin
        dx := '负';
        mmje := -mmje;
      end;
      S := Format('%.0f', [mmje * 100]);
      Len := Length(S);
      for i := 1 to Len do
        dx := dx + Copy(s1, (Ord(S[i]) - Ord('0')) * 2 + 1, 2) + Copy(s2, (Len - i)
          * 2 + 1, 2);
      dx := StrTran(StrTran(StrTran(StrTran(StrTran(dx, '零仟', '零'), '零佰',
        '零'),
        '零拾', '零'), '零角', '零'), '零分', '整');
      dx := StrTran(StrTran(StrTran(StrTran(StrTran(dx, '零零', '零'), '零零',
        '零'),
        '零亿', '亿'), '零万', '万'), '零元', '元');
      if dx = '整' then
        Result := '零元整'
      else
        Result := StrTran(StrTran(dx, '亿万', '亿零'), '零整', '整');
    end;
    //////////
    procedure TJzpzEdit1.FormCreate(Sender: TObject);
    begin
      frxReport1.AddFunction('function MoneyCn(mmje: Double): String;','Myfunction','小写金额转大写的函数');
    end;
    //////////
    function TJzpzEdit1.frxReport1UserFunction(const MethodName: string;
      var Params: Variant): Variant;
    begin
      if UpperCase(MethodName) = UpperCase('MoneyCn') then
        Result := MoneyCn(Params[0]);
    end;
    //////////
    报表中调用方法
    MoneyCn(50000000) 
      

  2.   

    SWind的方法只能解决金额问题,金额其实我有个笨办法也能解决的
    其他几个问题没人能回答了么
      

  3.   

    按客户名称和结算单号进行group by再透影出视图之后,再从这个视图中读取资料就可以了.
    SQL的查询语句可以达到效果
      

  4.   

    是,我现在就是这样作的,但是你仔细看我帖子就知道了,分组那部分已经好了,但是结算单号放在GroupHeader里结果不对,现在第二条SWind提出解决办法了,第三条我自己实现了,就是第一条,其实我相信很简单,应该怎么放置Band和Memo,我现在就是这点卡住了
      

  5.   

    http://download.csdn.net/source/438259
    看看这个是否能够解决?
      

  6.   

    1.将数据集整理成主从形式,可以解决单据号显示不正常的问题。
    2.加空行,用脚本解决,根据FreeSpace的值,详见附件。
    3.金额累加,用脚本解决,设置全局变量,我是在报表表中设置的,不知道可不可以有更好的地方设置。
      

  7.   

    不是分组显示,
    提供多个MasterDataBand就可以了.
      

  8.   

       后来都自己研究出来了,其实难是不难的,不过除了SWind 给出了具体的解决方法,其他朋友说的都太简略,我帖子里的要求是详细点,所以尽管SWind 只给我解决了一个问题,分数也基本都给他了