quickrep是比较基础的报表制作组件,不支持太灵活的报表打印。
你可以在数据库的角度解决这个问题,这也的话,就变成了一个记录-字段(所谓行变列)的经典问题,是比较容易解决的,通过SQL语句,将那个表转换为你所要的报表的二维表的格式,问题就迎刃而解了。
知道怎么搞吗?通过一个游标(Cursor)对那个表的记录进行循环,把记录对应Create成临时表的一个字段,然后Union在一起就OK了。
如果你用SQL Server数据库,我可以给你提供相关的SQL Source Code,我在Handle台北市环保局的MIS专案时候,指导程序员做了N*M个那种报表,都是很复杂的,一个Stored Procedure要些几百行!

解决方案 »

  1.   

    marysxj:没有重名的。
    就拿我举的这个例子来说吧!
    非常感谢!
      

  2.   

    kories:我用的是sql server。
    请把 SQL Source Code e-mail给我吧
    e-mail:[email protected]
      

  3.   

    1 自己写打印的程序就行了,不需要使用 QuickReport
    2 将需要的数据按需要的格式生成到表中 再用 QuickReport
    3 找一支持该功能的组建
      

  4.   

    adailee(不谈恋爱的铅笔) :
    麻烦你告诉我怎样在存储过程中翻转行列? 
      

  5.   

    Adailee的意见我认为不错的,我也指导我的程序员这样干,尽量使Client端瘦起来。
    我EMail给你类似的Stored Procedure好了,不过比较复杂,你要仔细读。
      

  6.   

    /*********************************************************************
    --Fuction: 行变列
    --Author: Kories
    --LastUpdate: 2001/11/30
    *********************************************************************/
    If exists (
                select * from sysobjects 
                where id = object_id('MyProc') and sysstat & 0xf = 4
              )
      drop procedure MyProc 
    gocreate procedure MyProc  
    as
    begin
      create table #MyTmpTable(
        姓名·成绩 char(8)
      )
      declare C1 cursor for
        select * from Table1
      open C1
      declare @ID smallint,@Name Varchar(10),@Ach Float
      fetch C1 into @ID,@Name,@Ach
      while @@fetch_status=0 begin
        exec('alter table #MyTmpTable add '+'F'+@ID+' Varchar(10)')
        fetch C1 into @ID,@Name,@Ach
      end
      close C1
      --以上程序建立临时表结构
      insert #MyTmpTable(姓名·成绩) values('姓名')
      insert #MyTmpTable(姓名·成绩) values('成绩')
      --以上插入静态记录
      open C1
      fetch C1 into @ID,@Name,@Ach
      while @@fetch_status=0 begin
        exec('update #MyTmpTable set '+ 'F' +@ID + '=' + ''''+ @Name +'''' + ' where 姓名·成绩=' + '''' + '姓名' + '''')
        exec('update #MyTmpTable set '+ 'F' +@ID + '=' + ''''+ @Ach +''''  + ' where 姓名·成绩=' + '''' + '成绩' + '''')
        fetch C1 into @ID,@Name,@Ach
      end
      --以上程序插入动态记录
      close C1
      deallocate C1
      --释放变量
      select * from #MyTmpTable
      --得到结果集
    end 
    go/*执行下边Sql Script得到表结构
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Table1]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[Table1]
    GOCREATE TABLE [dbo].[Table1] (
    [ID] [int] IDENTITY (1, 1) NOT NULL ,
    [Name] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [Ach] [float] NULL 
    ) ON [PRIMARY]
    GO
    */你好,我看了一下台北环保局MIS的Source Code,委实太复杂了,500行的Stored Procedure你没有完整的Database Shcema,很难看懂,就给你写了个简单的,你看一下,在Sql2000下运行OK。我写的只是例子程序,你要改造为实用的,要自己花一些工夫,比如,有可能存在总计一类的东东,你自己研究吧,其实都很简单。一定要把Cursor用熟,用灵活,很多数据可以两级以上Cursor套起来查询得到。OK?祝你好运,如果有疑惑再问。
      

  7.   

    在报表的ONNeedData中自己获取数据就行了
      

  8.   

    有个笨办法.
    1.定义一个足够大的固定二维数组,将表中的数据存入数组中.
    2.在quickrep中先设定好足够多的QRDBtext控件.
    3.在每次打印之前先将每个控件符值ok!