文本数据格式如下:
start|唯一流水号|G|13|A|4|B|7|C|7|D|0|E|0|
G|广东省****有限公司客户帐单|
G|**分公司账单|
G|邮编:|000000|
G|地址:|**市**区***大厦**楼|
G|姓名:|******股份有限公司|
G|客户名称:|******股份有限公司|
G|缴费代码:|080000382705|
G|出帐年月:|200503|
G|计费周期:|2005/03/01-2005/03/31|
G|单位:|元|
G|预缴费: 本期余额:|0|
G|上期余额:|0|
G|本期使用:|0|
A|产品汇总帐单|
AH|产品类型|费用|折扣|应收小计|
AB|简易集线通|207.92|-41.62|166.30|
AT|应收合计:|166.30|
B|产品明细|将相同类别的产品明细费用合并显示|
BH1|简易集线通|产品明细|
BH2|1.固定费|2.市话|3.长途|4.其他|
BB|基本月租费|54.00|区内通信费|67.76|传统国内长途|10.85|市话折扣|-25.03|
BB|新业务费|18.00|区间通信费|9.90|||传统长途折扣|-2.19|
BB|||本地移动|47.41|||基本费折扣|-14.40|
BT1|固定费小计:|72.00|市话小计:|125.07|长途小计:|10.85|其它小计:|-41.62|
BT2|应收合计:|166.30|
C|汇总明细|简单列出每个产品的费用|
CH1|简易集线通|汇总明细|
CH2|产品号码|客户名称|固定费|市话费|长途费|折扣|应收小计|
CB|2091676|******股份有限公司|24.00|59.11|3.43|-17.33|69.21|
CB|2091677|******股份有限公司|24.00|52.39|6.79|-16.66|66.52|
CB|2091678|******股份有限公司|24.00|13.57|0.63|-7.63|30.57|
CT|应收合计:|166.30|
end|
数据说明:每条记录均与start为起始,以end结束。其中第一行为总说明,G代表固定,其后的13表示固定项有13条(分别是名称、邮编、地址等13项);A表示A类明细,其后的数字4表示A类明细有4项;
B表示B类明细,以此类推。共有A、B、C、D及E五类明细,如果某类明细后面的数字为0则表示没有该类明细,报表不需要打印该类明细。至于每条记录由那几种明细组成,以及每种明细各有多少项,则都为不确定!
请教各位:该如何设计数据库?又该如何设计报表?或者用什么报表控件更合适呢?
此问题实在是让人太困惑,如果那位大侠乐于帮助解决,必定感激不尽。我愿意顷尽所有(现有1250可用分),即使有困难也欢迎大家一起探讨,谢谢!

解决方案 »

  1.   

    你的意思是倒底只是想把数据灌到数据库中,还是想把上面的数据以报表的形式显示出来?
    这一点你没有说明O -_-?如果只是想把数据放到数据库中,就 TStringList 装进来解析它就可以了。
    解析可以自己做嘛,解析出来后在写到相应的表中就 OK到呗。
    如果是想把上面的数据以报表的形式显示的话,请问,位置信息在哪里?
    比如, 应收合计:放在报表的什么位置?晕O~-_-''?
      

  2.   

    你的意思是倒底只是想把数据灌到数据库中,还是想把上面的数据以报表的形式显示出来?
    这一点你没有说明O -_-?
    ------------------------
    谢谢楼上这位朋友提醒!将数据插入到数据库是不成问题的但是,显然将所有数据项(以|分隔的部分)插入到同一数据库也是不可能的?因为我还不知道那种数据库可以支持超过300个字段
    我的考虑是将数据库设计成五个表(G、A、B、C、D、E),其中固定表存放固定项(数据中凡是G开头的项),A表存放A类明细,B表存放B类明细。。
    如果是这样的话,我不知道有那种报表控件可以支持设计一对报表?郁闷
    =====================================================================
    如果是想把上面的数据以报表的形式显示的话,请问,位置信息在哪里?
    比如, 应收合计:放在报表的什么位置?晕O~-_-''?
    ---------------------
    这个‘应收合计:’是各类明细各自有的。比如A类明细中有‘AT|应收合计:|166.30|’
    B类明细中也有“BT2|应收合计:|166.30|”,同样其他各类明细亦各自有合计,相应的在报表中合计也应放在各自的明细列表中。再说明一点:
    凡是G开头的就是所有记录都有的固定项目(每条记录均有13项固定项)
    凡是A开头的表示A类清单明细,条数由第一行中A后面的数字决定
    凡是B开头的表示B类清单明细,条数由第一行中B后面的数字决定
    请见第一行:start|唯一流水号|G|13|A|4|B|7|C|7|D|0|E|0|
    。。假如D后面的数字是0则表示没有D类明细,报表中也不应打印(甚至不能留空)谢谢!
      

  3.   

    假如设计报表能灵活到
    if A类明细空   then   不打印A类明细   else   if    B类明细空......
    那就几乎一切搞掂了
    不知道有什么报表控件能达到这样的目的?
      

  4.   

    FastReport 不可以么?没错以上数据放到一张表是不可能的,可以分多个表放嘛,
    应该不是问题吧,你上面也谈到了,那么即然都放到了表中,我最想不出来有什么不可以实现的。
    FastReport 是可以写脚本的,
    到于你所提到的:if A类明细空   then   不打印A类明细   else   if    B类明细空......
    我想用一个类去把该判断的东西都判断完,该生成的数据都生成,
    在自己行加入到 FastReport 中,应该可行吧。
      

  5.   

    注,FastReport 每一个 Band 上面都可以写脚本。
    语法可以看 FastReport 自己带的 帮助文件。
    实现你所说的报表应该不是问题,如果想要有现成的组件,去可以解释你上面列出来的文档
    我想应该也有,是在你脑子里面吧:)。
      

  6.   

    FastReport 不可以么?没错以上数据放到一张表是不可能的,可以分多个表放嘛,
    应该不是问题吧,你上面也谈到了,那么即然都放到了表中,我最想不出来有什么不可以实现的。
    FastReport 是可以写脚本的,
    --------------------------------------
    FastReport没有用过,不知道如何用首先请教:该报表控件可以如此支持一对多么
    (一个固定表G-->对应于A、B、C、D、E)?有这样的主从报表么?第二个问题也很关键,就是当报表里边某个明细清单不存在的时候,该明细是不该打印的,也不被允许占据纸张的空白空间(客户的要求),这样的要求对于FastReport也能实现么?
    要是这两个条件都能实现那就OK了
      

  7.   

    你要实现的功能任何报表工具或组件都不可能直接实现,都要你写代码,
    FastReport 是一个很强的报表工具,你要的功能只要在它相应的事件里面写点代码就可以实现,
    重要的不是显示报表,是你从文本文件中的数据提取,和数据的存储分类。
    一但把数据整理好了,FastReport 可以不连数据源,只要在相应的事件中写入你的数据信息,就可以把数据按你想要的格式显示出来了,至于打印你根本不需要操心。还有别忘了,FastReport 是开源的。
      

  8.   

    up,这几天公司很忙。现在还没找到FR,当测试成功后再结帖。
    cnmaxu(Max)朋友:我会根据实际情况,另外开帖加分的,谢谢!
    欢迎大家给予更多的提点!
      

  9.   

    很简单的问题~~
    你要打出什么东西,是动态的字段就是设计成数据表,静态的就为固定格式,如果为0 visble 为假不显示,打印就看不出来,然后调整打印位置
      

  10.   

    很简单的问题~~
    你要打出什么东西,是动态的字段就是设计成数据表,静态的就为固定格式,如果为0 visble 为假不显示,打印就看不出来,然后调整打印位置
    ---------------------------------------------
    问题是每条记录当中,各类明细的组成不同,有些记录可能有B明细,有些则没有
    我的是连续打印哦!!!不是一条一条手工调整的!!!‘动态的字段就是设计成数据表’
    这句如何理解?可否说清楚点?
      

  11.   

    是啊,看这意思FOR循环加上if判断就可以了吗,把结果弄到报表
      

  12.   

    比如Master:为数据表ggg
    从表Detail:为数据表Atable、Btable、Ctable、Dtable、Etable
    select * from ggg,Atable,Btable,Ctable,Dtable,Etable where ggg.id=atable.id or ggg.id=btable.id or ggg.id=ctable.id or ggg.id=dtable.id or ggg.id=etable.id当报表中的从数据为空的时候(比如Btable数据为空),这时报表中Btable对应位置不要显示空白
    该如何写啊????
    当真是郁闷!!!
      

  13.   

    报表主要分为列表式和报告式两种,你要做的是一个报告式的报表,本人认为不要想用一两个控件就可以完成,如果我做会用以下方式:
    1、在form上先显示出来,也便于核对和调试。
    主表的内容:
    .....
    _____________________
    明细表1的内容:
    .....
    _____________________
    明细表2的内容:
    .....
    _____________________
    ...
    ...2、把以上的内容按一定的格式导出到excel,通过控制excel的打印功能把它打印出来
      

  14.   

    to aimin(天剑)朋友:
    谢谢你的回答!我现在所面临的问题就是:
    _____________________
    明细表1的内容:
    .....
    _____________________
    明细表2的内容:
    .....
    _____________________假如某条记录出现明细表1的记录为空,则报表中这个位置不能再给明细表1留!!
    也就是说这个报表要能实现动态地控制几项明细的打印
    怎么办???也不能在那个位置留空白!!!
    好困惑啊。
      

  15.   

    况且你说的导出成excel这种方式不知是否会影响打印,我们的打印机的高速连续打印的
    不像A4纸那样一张一张打,而是连续走纸的那种,就是套打
      

  16.   

    还有请关注另外一帖:主从报表的困惑
    http://community.csdn.net/Expert/topic/3966/3966399.xml?temp=.1558802
      

  17.   

    况且你说的导出成excel这种方式不知是否会影响打印,我们的打印机的高速连续打印的
    不像A4纸那样一张一张打,而是连续走纸的那种,就是套打==============================================================================
    不会影响打印,不过当一张报表的记录数据上1000条时,导出的过程可能会慢一点,但肯定不会影响打印