阳光网驿-企业信息化交流平台【DTC零售连锁全渠道解决方案】

 找回密码
 注册

QQ登录

只需一步,快速开始

扫描二维码登录本站

手机号码,快捷登录

老司机
查看: 1362|回复: 2

[讨论] 如何编写复杂的自定义报表

[复制链接]
  • TA的每日心情
    开心
    2015-3-26 09:26
  • 签到天数: 316 天

    [LV.8]以坛为家I

    发表于 2010-10-28 19:13:35 | 显示全部楼层 |阅读模式
    如何编写复杂的自定义报表
    一、一般方法的弱点
    实施过程中难免要根据客户的需要编写自定义报表。如果直接在自定
    义报表栏写SQL 语句总有诸多的不便。比如:
    1、不能使用某些系统函数(更别说自定义函数了);
    2、不能使用分情语句;
    3、对 sql 语句的字数有限制;
    所以这种方法只能做一些简单的报表,用户在使用上受到很大的限
    制。另外:如果使用了表头(或表体)自定义项,而这些自定义项又
    被其他模块定义了项目名称。那么在过滤窗体,系统就会显示这个用
    于其他模块的项目名称,这给客户理解报表带来很大的不便。
    二、使用作业的好处
    在实施过程中,我一般使用作业来编制复杂报表。基本的思路是这样
    的:先用过程生成要编制的报表,并且将它插入到tempdb 当中去。
    把过程做成作业,让SQL SERVER 在后台定时刷新这个报表。在自
    定义报表中,只要用最简单的select 语句列出报表即可。这样做就可
    以完全避免【一】中所述的种种缺点,随心所欲地编出各种客户需要
    的报表。
    三、复杂报表的实例
    我在南孚电池曾经编制过一个比较复杂的自定义报表――《新运行记
    录报表》。它有几个难点是普通自定义报表无法解决的:
    1、如果班号是“大夜”要将日期减 1,否则按原样显示。
    2、因为数值型的自定义项不够用,用了字符型的自定义项来代替,
    需要将它们转换为数值型(否则做出的自定义报表无法汇总),
    另外有些操作员将数值型的数据写成:“8 小时”、“2.3 万只”
    需要用一个自定义函数删除多余的汉字。
    3、自定义项 14 中的数据是对象代码(即可能是设备代码,也可能
    是设备的位置代码)报表中要将它转换成设备的名称或位置的
    名称
    这样的报表在作业中能够很好的实现,下面就是它的 sql 语句:
    use tempdb
    IF EXISTS(SELECT name
    FROM sysobjects
    WHERE name = 'yxjn'
    AND type = 'U')
    DROP TABLE yxjn
    GO
    use ufdata_777_2006
    SELECT convert(nvarchar(10),case eq_run.cdefine1 when ' 大夜' then
    dateadd(day,-1,eq_run.dtdate) else eq_run.dtdate end,120) as 日期,
    EQ_Run.cDefine1 AS [ 班次],EQ_Run.cDefine2 AS [ 班
    号],convert(float,dbo.turnnum(EQ_Run.cDefine3)) AS [废品只数],
    round(EQ_Run.cDefine7,0) AS [速度],convert(float,dbo.turnnum(EQ_Run.cDefine8)) AS [实际
    工时],convert(float,dbo.turnnum(EQ_Run.cDefine9)) AS [计划工时],
    convert(float,dbo.turnnum(EQ_Run.cDefine12)) AS [额外产量],EQ_Run.cDefine15 AS [额外工
    时],round(EQ_Run.cDefine16 ,0)AS [实际产量],EQ_Position.cPName AS [位置名称]
    , case EQ_Run.cDefine7 when null then null when 0 then null else case
    convert(float,dbo.turnnum(EQ_Run.cDefine8)) when null then null when 0 then null else
    (EQ_Run.cDefine16-convert(float,dbo.turnnum(EQ_Run.cDefine12)))/EQ_RUN.CDEFINE7/con
    vert(float,dbo.turnnum(EQ_Run.cDefine8))/60 end end as OEE ,
    case EQ_Run.cDefine16 when null then null when 0 then 0 else
    convert(float,dbo.turnnum(EQ_Run.cDefine3))/EQ_Run.cDefine16*1000000 end AS PPM
    into tempdb..yxjn FROM EQ_Run INNER JOIN (select cpcode,cpname from EQ_Position
    union all select ceqcode,ceqname from eq_eqdata) as eq_position ON EQ_Run.cdefine14 =
    EQ_Position.cPCode

    编写复杂的自定义报表.pdf

    147.31 KB, 阅读权限: 10, 下载次数: 8

    楼主热帖
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    擦汗
    2020-12-26 10:40
  • 签到天数: 140 天

    [LV.7]常住居民III

    发表于 2010-11-11 13:13:13 | 显示全部楼层
    太贵了,这里的锭难赚哦,

    望楼主.开恩
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    开心
    2014-10-22 16:22
  • 签到天数: 330 天

    [LV.8]以坛为家I

    发表于 2010-11-11 13:51:31 | 显示全部楼层
    去掉一个0吧。。。。
    让别人分享你的成就也是件快乐的事情嘛
    启用邀请码注册,提高发帖质量,建设交流社区
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表