fastreport我觉得好用,功能也强大.
我在用得过程中,觉得有一个难点,就是如何在它的设计期得到不是它所关联的数据集的值,我说的是在设计期,因为报表肯定会提供给客户自己来设计,如果不能方便的提供给用户查询的接口,用户肯定会很难接受.
  打个比如:在一个报表所关联的数据表中,只有一个custid(客户号),没有custname(客户名),要打印出这个客户名,需要从数据库客户表中,查询到这个custid的custname信息,通常采取如下办法:
  1,为报表定义变量,设计的时候添加这个变量到memo当中,然后在程序中为这个变量写代码赋值,用ongetvalue事件来处理,或用数据词典来处理,但这个方法需要在程序中写代码,不可能为用户设计一个报表,又要改程序,并且这里定义的变量,还不能在每个报表里面通用,像fastreport定义的#page那样的变量,在哪张报表上都可用就好了.
  2,还有一个办法就是利用fastreport提供的可自已定义函数的功能,然后注册到fastreport里面,这样客户在设计报表时,只要在memo中添加这个函数,设置好相应的参数,就能得到这个custname的值,这个就比较方便了.
  但问题是报表中的一些内容并不是所有都在数据库当中的,如存储过程的查询日期(这在客户报表当中经常用到的),登陆程序的用户名(用来在报表上显示:制表:XXX),或者程序界面上的编辑框里面的一个数字;这些数据又怎么能在报表设计中直接方便的得到呢?
  用变量来处理,必须得在程序中写代码,每为一个报表就要修改程序,晕,
  用函数数来处理?怎样定义这个函数来获得这个查询日期或者程序界面上的一些东西.
  我心中最理想的效果是,如同fastreport里面自带的全局变量#date,#page那样,在哪个报表里面都可以用. 不知道我说明白了没有,有哪位高手可以讨论指点一下,有没有可能实现这样的功能?

解决方案 »

  1.   

    如果是要在报表显示非数据库的数据,可以用TfrReport控件的OnGetValue事件
    如:
    procedure TfrmMain.frReportGetValue(const ParName: String;
      var ParValue: Variant);
    begin
      if ParName = '企业名称' then
        ParValue:= Edit.Text
      ...
    end;
    在报表设计界面memo中输入[企业名称],在打印报表时就会将Edit编辑框内容显示出
    不知道是不是楼主想要的
      

  2.   

    我觉得FAST报表是挺好用的,但不是万能的,有许多还是要通过程序解决