我想做一个万能报表,就是让客户去选要查找的数据表,相关数据表的字段名,字段名符合的条件等sql语句需要的数据,生成一条客户需要的查询语句。请问有没有相关的例子,或帮我解决这个问题:怎么将数据库中的所有用户数据表名显示到一个下拉的combobox的item中,且将相关数据表的字段也生成到另一个combobox的item中,这样用户就可以进行选择了。(还有一个问题就是,我的数据表名为英文的,如dkc10,实际是销售表,如果下拉dkc10,用户肯定不知道什么意思,怎么转换?字段的问题也是如果,如kbi01c代表公司编号,下拉肯定要公司编号客户才能明白)
有谁能解决,分不够尽管说!!我有4000多分,分没问题,暂时只给50分,以防没人答出来浪费!!

解决方案 »

  1.   

    万能报表我做过。不过实现方法不同。我是利用固定的SQL语句和动态生成的TDBGRID列来完成这种报表的。你这种办法我想过,但是一直找不到相应的SQL语句。另外名称的转化就没多少办法了,自己写个函数慢慢CASE吧。例如:
    function  TFormMenulsz.myGetdisplaylabel(fieldname:string):string;
    begin
      fieldname:=uppercase(fieldname);
      if fieldname='CLASSID'  then result:='餐次' else
      if fieldname='MENUNO' then result:='菜品编码' else
      if fieldname='MENUNAME' then result:='菜品名称' else
      if fieldname='PLACENO' then result:='场所' else
      if fieldname='UNITS' then result:='单位' else
      if fieldname='PRICE' then result:='单价' else
      if fieldname='DISCOUNT' then result:='折扣' else
      if fieldname='CURR' then result:='金额' else
      if fieldname='AMOUNT' then result:='数量' else
      if fieldname='NOTENO' then result:='单据号' else
      if fieldname='GUESTNAME' then result:='主客姓名' else
      if fieldname='NUM' then result:='人数' else
      if fieldname='ENDDATE' then result:='日期' else
      if fieldname='PERSON' then result:='姓名' else
      if fieldname='HOUSENO' then result:='监室号' else
      if fieldname='OPERANT' then result:='制单' else
      if fieldname='REMARK' then result:='摘要' else
      if fieldname='REMARK0' then result:='备注' else
      if fieldname='CHECKNO' then result:='结账单号' else
      result:='';
    end;
      

  2.   

    1。数据库中的所有用户数据表名显示到一个下拉的combobox的item
    QUERY 的SQL :select dbo.sysobjects.name from dbo.sysobjects where OBJECTPROPERTY(id, N'IsUserTable') = 1
    然后怎么加到COMBOBOX的ITEM就不用教了吧?
    2。我的数据表名为英文的,如dkc10,实际是销售表,如果下拉dkc10,用户肯定不知道什么意思,怎么转换?字段的问题也是如果,如kbi01c代表公司编号,下拉肯定要公司编号客户才能明白?
     我的处理方式,在数据库中增加一个表ctablename,这个表的至少有两个字段
     tablename 表的原名
     ctablename 表的中文描述
    用以下的语句可以自动把当前数据库中的所有表都加入到ctablename中,补充一下中文部分就可以了
    insert into ctablename(tablename)
    select dbo.sysobjects.name from dbo.sysobjects where OBJECTPROPERTY(id, N'IsUserTable') = 1 当然了,针对你的非中文字段,也可用类似的方式来解决
      

  3.   

    2补充: 在有了这一个表之后,你要把原始表名和中文表名,从CTABLENAME表中加到COMBOBOX也是易如反掌的事了
      

  4.   

    这个问题我已经解决了,只要建两个表就可以,一个表记录表编码和表的逻辑名,一个表为相关表的字段名:相关表编号、字段编码、字段逻辑名称,这样就可以
    这个问题可以解决,但是select 语句那么麻烦,什么inner join,full outer join,where的条件又不定,再加上order by ,group by,用户要出的报表可能有统计,这又要加上表达式生成器,我拷,吐了!!用户的数据可能来自好几个表的一些字段,我的头都糊了!!有没有什么很好的办法能实现sql语句的最大可能的拼凑!!最好能把那些语法元素都加上去!
    加不上去也要基本实现sql语句的最基本语法!!(where的条件很多哦!)如有哪位能实现,分不是问题,只要你提!!!
      

  5.   

    中间再定义让用户选择,系统在转换成实际的字段
    1.数据表基本信息表
    字段名 字段说明 类型 是否为空 备注
    Table_name 数据表名 Varchar(50) Not Null PK
    Table_chinese 数据表中文名 Varchar(80) Null
    Table_desc 数据表描述 Varchar(200) Null
    Table_param 驱动参数 Int
    Table_format 显示格式 Char(1) Not Nulll Default ‘1’
    Is_SaveMsg 保存是否有提示 Bit 0
    Create_date 创建时间 Datatime Null Default Getdate()
    Creator 创建人 Varchar(10) Null System_User
    Bz 备注 Varchar(200) Null Default ‘’2.数据字段信息表
    字段名 字段说明 类型 是否为空 备注
    Table_ID 自动ID Numeric(11,0) Not Null Identity,PK
    Table_name 数据表名 Varchar(50) Not Null
    Column_name 字段名称 Varchar(50) Not Null
    Column_chinese 字段中文名 Varchar(80) Null Default ‘’
    Column_type 字段类型 Char(1) Null Default ‘1’
    Column_format 字段格式 Varchar(40) Null
    Column_width 显示宽度 Int
    Column_order 显示顺序 Int Null
    Content_source 取值来源方式 Char(1) Null Default ‘1’
    Value_source 取值SQL语句 Varchar(200) Null Default ‘’
    Can_empty 是否可以为空 Bit Null Default 1
    Default_Value 默认值 Varchar(50)
    Bz 备注 Varchar(200) Null Default ‘’
      

  6.   

    现在要解决的问题是怎么用控件拼出sql语句呀,其它问题我都自己解决了,不过谢谢大家参与了
      

  7.   

     向 hhytsoft(雨中独行)  学习!!!
      

  8.   

    世界上没有万能的。
    你只能定义一些常用的功能,如果有特殊要求,可以让用户自己编辑sql