精华内容
下载资源
问答
  • 报表开发流程

    万次阅读 2019-08-26 23:24:10
    报表开发是数据分析师的常见工作之一。报表是业务监控必备工具之一(用数据说话),另一方面,报表监控的指标通常都是业务相关的重要指标,做报表的过程也是深入了解业务的过程。 把数据分析分为“描述、解释、预测、...

    报表开发是数据分析师的常见工作之一。报表是业务监控必备工具之一(用数据说话),另一方面,报表监控的指标通常都是业务相关的重要指标,做报表的过程也是深入了解业务的过程。

    把数据分析分为“描述、解释、预测、控制”4个层级。那么报表开发就对应“描述”这一层级,也就是要做到准确、及时地监控业务数据。

    9步教你玩转报表开发

    描述、解释是最常见的工作内容

    本文梳理报表开发的主要流程及注意事项,在不同的实际操作场景下涉及到的环节可能不一样,本流程仅供参考。

    9步教你玩转报表开发

    报表开发的主要流程

    报表开发的主要流程

    1. 需求提交

    报表需求发起人就是业务方(通常也称为“需求方”),一般需求方是产品或者运营的同事。

    提交需求时,要提供的信息如下:

    • 业务背景;
    • 报表字段及统计口径(中文描述);
    • 关注数据周期,e.g. 当前年、当前月、近7天、近30天等;
    • 报表发送频率,e.g. 月报、周报、日报、时报、实时等。

    建议制作一个需求模板让需求方填写各项信息,主要用途有两个:

    • 帮助需求方想清楚报表的背景和目的,同时过滤掉一部分不靠谱的需求;
    • 规范填写的信息,以减少沟通成本。

    2. 可行性评估

    该环节主要解决3个问题:

    Q1:有没有必要做?

    • 是否其他系统或报表上可以获得需求方要的数据?
    • 报表的价值或者重要性大不大?
    • 报表的使用频率是不是够高?如果只是偶尔一次,手动取数应该就可以了。

    Q2:能不能做?

    • 一方面要考虑技术上是否可以实现,e.g.实时报表通常由技术人员实现(分析师通常只提供统计口径);
    • 另一方面要考虑权限、合规、安全上的问题,e.g. 报表中是否涉及敏感字段,需求方是否有足够的权限获得这些数据。

    Q3:是不是其他人做更合适?

    数据分析师会做一部分报表,但不是所有的报表都是由数据分析师来做。做报表的目的一方面是便于及时监控业务数据,另一方面,报表相当于“自动化”的数据处理任务,所以报表也能减轻分析师的工作量。

    如果是直接拉取明细数据,或者只是很简单的计数或者求和,那么是否生产库的技术人员应该可以直接做(一般生产库会对接到一个数据后台,不过功能一般比较粗糙)。

    3.需求排期

    9步教你玩转报表开发

     

    在考虑报表需求的重要性、紧急程度的同时,还需要对需求方进行预期管理,留够充足的时间。

    进入“需求排期”阶段就意味着需要登记相应的信息(比如登记在wiki上),e.g. 报表的编号,业务线归属,报表中文名称,报表类型,需求方,需求提交日期,预计上线日期,开发负责人,当前进度等。

    4.数据抽取

    9步教你玩转报表开发

     

    可以简单的把企业数据按用途分为3类库:生产库、分析库、报表库。

    • 生产库,是生产数据直接存储的地方,非开发人员一般是不能直接访问的,生产库的数据通常称为“源数据”(也就是数据源头);
    • 分析库,就是将生产库的数据ETL处理后,放到一个地方集中供数据部门直接使用,数据分析师的日常工作通常依赖于这类库;
    • 报表库,则是存放各业务线报表数据的数据库,通常报表库会对接到各数据产品(e.g. 报表系统、数据展板、自助分析平台等)。

    数据抽取,也就是将数据从生产库抽取到分析库。

    一般业务发展成熟时,报表开发所需要的大部分源数据表都已经抽取过,所以该步骤不一定需要执行。如果是某个业务刚上线或者报表需要用到的表没有被抽取,那么就可能需要执行该步骤:

    • 联系业务线的产品经理以确认生产库的技术接口人;
    • 然后,技术接口人提供库名、表名(英文及中文)、建表代码等源表信息;
    • 接下来,将源表信息传递给数据ETL的同事进行数据抽取。

    5. 代码编写

    这里的代码主要指SQL代码,也就是选择合适的数据表,统计出业务方需要的报表字段数据。

    除了统计口径要准确外,代码编写的时候还要注意3点:

    ①代码规范,代码要有必要的注释、版本信息,注意对齐和命名规范;

    ②文档管理,主要是便于后期的报表维护以及统计口径整合,建议:

    • 代码放到企业网盘备份或者托管到企业内部的git平台;
    • 用wiki登记报表的相关信息,e.g. 报表名称、负责人、代码、数据字典等

    ③建中间表,如果有需要,那就建立中间表,将常用字段整合到一张表,以便于统计分析和口径维护。

    常见的中间表有3类:用户宽表、订单宽表、维表。

    • 用户宽表就是记录用户属性的一张表,比如用户画像的大多数属性都可以放到这张表里,e.g. 基本属性(年龄、性别等)、产品属性(是否开通某服务、产品标签等)、统计属性(首次、常用、最近等)
    • 订单宽表整合订单的各种信息(这里的订单泛指交易订单),e.g.电商订单中的订单来源信息(硬件设备、操作系统、网络类型等)、优惠信息、物流信息、售后信息(退换货等)
    • 维表则是记录字段枚举值的含义的表,因为业务会发生变化,相应的业务类型也会增加调整。e.g. 记录地区编号对应的省市信息表,记录产品各页面名称信息的表,记录不同商品信息(品类、品牌等)的表。

    注:用户宽表和订单宽表之所以称为“宽表”,因为用户或者订单的属性(列)通常比较多(从各个业务线的数据整合过来),且这两类表通常会有增加列的操作(属性扩展);而维表的列(属性)通常比较稳定,一般情况下不会有增加列的操作。

    设计中间表时,除了要求口径的准确性外,最需要关注的是可扩展性,也可以理解为通用性,扩展性要考虑表的维度和计量两个方面:

    i.维度

    • 一般为分类变量,包括日期、二值属性、多值离散属性等,维度就意味着数据表的颗粒度,常见的颗粒度有用户、订单、商品、日期等;
    • 维度上的扩展性体现为,可以进行行压缩或者行列转置等pivot table的操作,一般而言颗粒度越细化(在业务需要的范围内),扩展性越高;

    ii.计量

    • 通常是连续变量,包括数量、金额、时间等绝对量;
    • 计量上的扩展性在于,可以用多个计量的组合计算得到另一个变量,e.g. 计算百分比;

    6. 数据验证

    数据验证主要是核对数据是否准确、完整。

    一般的方式如下:

    • 自检代码逻辑,字段相互验证;
    • 和其他系统的数据比对验证,比如生产库的数据;
    • 由测试人员进行验证;

    数据验证阶段,发现的问题通常在3个地方:

    • 统计逻辑,e.g. 隐藏前提,交叉标签等;
    • 数据抽取,e.g. 数据增量抽取时依赖update_time字段,而该字段在生产库没有同步更新,这种情况下要么改抽取方式为“全量抽取”,要么生产库的字段更新逻辑要进行调整;
    • 生产库改动,e.g. 生产库的业务逻辑改动(业务分流),或者先前的表的字段已被弃用(不再更新);

    如果数据核对不上,则建议按上述的顺序一一排查。

    7. 前端展示

    这个步骤就涉及最终报表的交付形式了,报表的交付形式是在“可行性评估”这个环节确定的。

    按报表展示的载体可以大致分为3类:

    • 自动定时邮件;
    • 网页展示(PC端或者移动端);
    • 独立应用(e.g. 移动端app);

    该环节需要使用到呈现数据的工具(不一定可视化工具,大多数情况还是会用表格展示),这些工具可以是企业内部开发的数据工具(平台),也可以是购买的FineBI, Tableau等方便易用的商业软件。但工具不是最重要的,更重要的是呈现的数据能突出重点、准确反映问题。

    注:理想的数据展示应该是选用了恰当的展示方式,按业务逻辑、有层级地组织了数据,并讲述了一个完整的故事。关于图表可视化建议阅读《用图表说话:麦肯锡商务沟通完全工具箱》这本书。

    9步教你玩转报表开发

     

    8. 报表验收

    在正式上线之前要先对报表进行“自测”,比如:

    • 邮件是否能正常定时发送;
    • 图表是否能正常显示,是否有添加必要的说明提示(e.g. 统计口径等);
    • 显示的数据格式是否OK,e.g. 小数点后位数,单位,坐标轴范围等);
    • 需求方需要用到的功能是否正常,e.g.筛选、交互等;

    完成上述工作后,就可以交由需求方验收了,后续可能需要根据需求方提出的建议做适当的调整,当需求方确认OK时就准备上线。

    9. 报表上线

    报表验收通过,接下来就是正式上线。

    如果是自动邮件,则要确认发送的频率、收件人等信息;

    注:邮件中最好有相应的计算口径说明

    如果是网页或者在独立应用中展示,通常需要申请权限,那么报表上线后需要告知业务费报表申请路径(走OA或者发邮件)、报表名称等信息。

    以上,就是报表开发的主要步骤,涉及到的技术的东西比较少,主要是流程以及信息的沟通,希望对大家有用,欢迎留言交流。

    需要补充的信息:

    i. 本文所述流程是以需求导向的“被动”的报表开发流程,实际上,我们平时也会根据业务需要来“主动”做报表,例如高频的“临时需求”就可以转化成报表需求(自动化的报表可以解放劳动力),另一方面,如果分析师是以项目导向的工作方式,则需要主动和业务方沟通需要有哪些数据需要监控(e.g. KPI、转化率、交易情况等);

    ii. 如果是新业务上线时,报表开发者可能对统计口径一无所知,那么在第一步“需求提出”环节,可以:

    • 让业务方先和产品经理沟通确定报表字段及口径;
    • 然后产品经理再和生产库技术接口人确定技术口径;
    • 产品经理将相应的字段统计口径发送给报表开发者(分析师),并抄送业务方及技术接口人;

    这样业务上线初期,通过报表开发就能积累后续会常用到的统计口径,对报表开发过程中使用到的统计口径进行分类和整理,不管是将相应信息记录到wiki还是建立中间表(这也是数据部分知识管理的一部分),对后续的业务分析都能极大地提高效率。

    iii. 报表也是数据产品之一,凡产品都有其生命周期,报表也不例外,报表后续的维护不仅包括报表字段的增删改,还要进行下线和清理工作,以节省计算资源,同时减少对需求方的打扰。此外,沟通的环节尽量走邮件,一方面是确保信息送达相关人员,另一方面,信息的存档真的很重要。

    展开全文
  • java报表开发之报表总述

    千次阅读 2018-11-14 15:14:51
    1.什么是报表开发报表开发就是根据指定的规则,把业务数据按照一定的形式展现给用户的技术。 2.报表开发发展历史 【手工绘制(效率低、容易出错)】 ---->【Excle工具软件(降低了报表开发效率、准确性提高)...

    1.什么是报表开发?
    报表开发就是根据指定的规则,把业务数据按照一定的形式展现给用户的技术。
    2.报表开发发展历史
    【手工绘制(效率低、容易出错)】 ---->【Excle工具软件(降低了报表开发效率、准确性提高)】---->【定制报表系统(根据业务数据自动生成)】
    3.报表开发分类(一般按照业务系统的架构进行分类):
    C/S架构:
    ① 客户端/服务器端(C/S):可以借助平台自带API(如java的Swing组件),实现丰富的用户交互功能,增强用户体验。
    ② 第三方报表控件:例如在java中选择JFreechart、JasperReports来实现各种复杂的报表。
    B/S架构:
    ③ 浏览器/服务器(B/S):采取了基于浏览器的策略,简化客户端的开发工作。在B/C结构的服务器端,不用处理通信相关的问题,Web服务器会吃力用户HTTP请求等通信问题,开发人员只需要专注于业务逻辑功能的实现。
    ④ B/S没有C/S那么丰富的界面元素可以调用、也没有C/S中那么灵活的事件调用机制。
    ⑤ 第三方报表控件:如java的JFreechart、JasperReports,或其它报表控件(Highcharts)。
    4.报表的表现形式:
    在这里插入图片描述

    展开全文
  • 润乾报表开发工具 免费

    千次下载 热门讨论 2013-11-23 15:30:55
    润乾报表开发工具 免费
  • SAP报表开发

    万次阅读 多人点赞 2017-03-23 15:03:34
    手把手教你快速学会SAP ALV报表开发,涉及到子程序,内表,工作区,选择屏幕,获取数据,处理数据,INTO CORRESPONDING FIELDS OF TABLE,FOR ALL ENTRIES IN等知识点介绍

    一切开发都来自于需求,需求并不决定开发。当接到需求的时候,一定要进行可行性分析,是否可以进行开发,否则将会严重影响工作效率

    1.SAP报表

    • List:原始技术,直接输出数据
    • ALV:简单到复杂,也可以面向对象
    • MS Office Excel:调用excel输出数据

    SAP提供多种方式开发报表,这里只介绍常用的ALV报表,其他的大家有兴趣也可以去网上找资料研究一下

    2.需求

    1)假设有一个客户提出需求开发一个销售订单报表,报表应该包含的字段有:销售订单(so)、行项目、工厂、物料号、库存地点、需求数量、订单数量、创建日期、交货日期等等

    2)接到需求进行可行性分析,如果SAP存在可满足需求的报表则不用进行开发或则进行修改;如果不存在则考虑报表开发是否可行,如果能做就准备开发,否则再和客户进行讨论。

    3)假设可行性分析OK!

    3、如何下手开发

    1)从需求入手,分析需求

    该报表主要是关于SO,这就是我们需要重点关注的地方

    2)熟悉表

    报表中的数据是怎么来的?当然并不是凭空产生的,需求中的销售订单、物料号等数据都将取自于数据库。所以得分析需要哪些表。当然你有可能不熟悉SAP中的表,你可以向有经验的同事请教。通过积累,让这些也成为你的东西

    T-CODE:se16n可以查询透明表

    这里写图片描述

    以下是需要用到的一些表和一些重点关注字段,当然在实际中可能会涉及到更多的表和字段

    1.【VBAK:销售凭证】
          字段:vbeln(销售凭证)、erdat(创建日期)、ername(创建者)、auart(销售类型)、bstnk(采购订单)、bsark(采购订单类型)、bstdk(采购日期)
    2.【VBAP:销售凭证行项目】
           字段:vbeln(销售凭证)、posnr(项目)、matnr(物料)、werks(工厂)、lgort(库存地点)、erdat(销售订单创建日期)、PRCTR(利润中心)、aufnr(订单)
    3.【VBPA:销售凭证合作伙伴】
              字段: vbeln(销售凭证)、posnr(项目)、kunnr(客户)、lifnr(供应商)
    3.【MAKT:物料描述】
              字段:matnr(物料号)、spras(语言)、maktx(描述)
    4.【LIPS:SD凭证交货项目数据】
              字段:vbeln(交货)、posnr(项目)、werks(工厂)、lgort(地点)、lfimg(交货数量)
    5.【VBKD:销售凭证业务数据】
              字段: vbeln(销售凭证)、posnr(项目)、bstkd(PO)、inco1(国际贸易条件)、
    6.【VBEP:销售凭证计划行数据】
              字段: vbeln(销售凭证)、posnr(项目)、ETENR(计划行)、edatu(交货日期)、ezit(到达时间)、wmeng(订单数量)、lmeng(需求数量)、bmeng(确认的数量)

    4、报表开发

    1)se38创建程序,创建完会有一行代码

    2)自定义输出表结构

    REPORT  zbsdr_025.
    TABLES:vbak,mara,t001w,vbap,vbep.
    
    *--------------类型池定义
    TYPE-POOLS: slis.
    
    DATA:t_fieldcat TYPE slis_t_fieldcat_alv,
         w_fieldcat TYPE LINE OF slis_t_fieldcat_alv,
         t_layout TYPE slis_layout_alv.
    
    *------------------定义输出表结构
    TYPES:BEGIN OF ty_result,
         vbeln TYPE vbak-vbeln,   "so
         auart TYPE vbak-auart,   "销售类 型
         posnr TYPE vbap-posnr,   "项目
         bstkd TYPE vbkd-bstkd,   "po
         aufnr TYPE vbap-aufnr,
         werks TYPE vbap-werks,    "工厂
         lgort TYPE vbap-lgort,     "库存地点
         matnr TYPE vbap-matnr,    "物料
         maktx TYPE makt-maktx,
         kunnr TYPE vbpa-kunnr,    "客户
         lifnr  TYPE vbpa-lifnr,   "供应商
    *    lfimg TYPE lips-lfimg,     "交货数量
         edatu  TYPE vbep-edatu,   "计划交货日期
         erdat  TYPE vbap-erdat,    "创建日期
         lmeng  TYPE vbep-lmeng,    "需求数量
         wmeng  TYPE vbep-wmeng,    "订单数量
    
     END OF ty_result.
    
    *-----------------------------定义输出表和工作区域
    DATA:t_result TYPE TABLE OF ty_result.
    DATA:w_result TYPE ty_result.

    (1)类型池:slis 。类型池顾名思义就是个池子,池子里面有很多的类型。开发ALV报表得用到slis里面的类型,所以要引用slis这个类型池

    (2)DATA:主要用于声明变量,【TYPE】表示改变量参考的类型。在报表里一般都定义两个东西:内表和工作区。

    (3)内表和工作区。内表可以理解为临时表,对内表操作不影响数据库中的表。如果频繁地从数据库中取数会导致效率降低,所以可以用内表临时存放数据;工作区只能存放一条数据,对数据进行处理,一般用于循环中。

    DATA:t_fieldcat TYPE slis_t_fieldcat_alv,
         w_fieldcat TYPE LINE OF slis_t_fieldcat_alv,
         t_layout TYPE slis_layout_alv.

    (4) se11查看类型池,如果不知道变量参考的类型可以在这里查找,比如ALV报表字段(我们取名t_fieldcat)

    这里写图片描述
    这里写图片描述

    (5)TYPES自定义结构,可以的字段可以来自于不同的表,一般先定义输出表结构(把报表需要展示的字段都放在一个结构里),当然为了后面的操作也要定义内表和工作区,参考的类型就是该结构

    DATA:t_result TYPE TABLE OF ty_result.
    DATA:w_result TYPE ty_result.

    2)声明所需表

    TYPES:BEGIN OF ty_vbakp,
        vbeln TYPE vbak-vbeln,   "so
        auart TYPE vbak-auart,   "销售类型
        posnr TYPE vbap-posnr,   "项目
        werks TYPE vbap-werks,    "工厂
        lgort TYPE vbap-lgort,     "库存地点
        matnr TYPE vbap-matnr,    "物料
        erdat  TYPE vbap-erdat,    "创建日期
        bstkd TYPE vbkd-bstkd,   "po
    END OF ty_vbakp.
    
    DATA:t_vbakp TYPE TABLE OF ty_vbakp,
         w_vbakp TYPE ty_vbakp.
    
    
    *----------------------------------------------
    "引入makt主要是为了获取物料描述信息
    DATA:t_makt TYPE STANDARD TABLE OF makt,
         w_makt TYPE makt.
    DATA:rt_extab TYPE slis_t_extab.
    
    *----------------------------------------------
    "引入vbpa主要是为了获取客户和供应商
    DATA:t_vbpa TYPE STANDARD TABLE OF vbpa,
         w_vbpa TYPE vbpa.
    *-------------------------------------------
    "为获取计划交货时间,需求数量,订单数量
    data:t_vbep type STANDARD TABLE OF vbep,
         w_vbep type vbep.

    需要什么,就声明什么。比如需要获取物料描述信息就定义一个内表参考类型为物料描述表(makt),如果需要的多个表有联系,也可以定义结构,把所需字段放在结构里。如上面的结构ty_vbakp.(表vbak,vbap,vbkd都有销售凭证字段)

    3)选择屏幕

    *-------------------------------定义选择屏幕
    SELECTION-SCREEN:BEGIN OF BLOCK a1 WITH FRAME TITLE text-001.
    SELECT-OPTIONS:s_vbeln FOR vbak-vbeln,
                   s_matnr FOR mara-matnr,
                   s_werks FOR t001w-werks,
                   s_erdat FOR vbap-erdat,      "创建日期
                   s_edatu FOR vbep-edatu.      "交货日期
    
    SELECTION-SCREEN:END OF BLOCK a1.

    (1)选择屏幕就是SAP的前台,一般是一些查询条件

    这里写图片描述

    (2)select-options 可以进行多值查询(有范围的),如上图会有两个输入框。比如用户想查询1000到1010工厂的销售订单。点击输入框后面的搜索按钮,会从数据库里查询,关键字【FOR】后面就是的数据源。要注意的是,select-options里的数据源表都要在TABLES里声明下不然会出错。

    TABLES:vbak,mara,t001w,vbap,vbep.
    SELECT-OPTIONS:s_vbeln FOR vbak-vbeln.

    (3)parameters 用于单值查询

    PARAMETERS p_matnr like mara-matnr.

    这里写图片描述

    (4)设置选择屏幕的文本值

    这里写图片描述
    这里写图片描述

    4)获取数据

    START-OF-SELECTION.
    *-----------------------获取数据
      PERFORM frm_get_data.
    
    *-------------------------处理数据
      PERFORM frm_handle_data.
    *&---------------------------------------------------------------------*
    *&      Form  FRM_GET_DATA
    *&---------------------------------------------------------------------*
    *       text
    *----------------------------------------------------------------------*
    *  -->  p1        text
    *  <--  p2        text
    *----------------------------------------------------------------------*
    
      IF t_result IS NOT INITIAL.
        PERFORM frm_alv_show.
      ELSE.
        MESSAGE '没有符合的数据,请重新查询' TYPE 'S' DISPLAY LIKE 'E'.
      ENDIF.
    
    END-OF-SELECTION.

    (1)START-OF-SELECTION.程序的开始,PERFORM frm_get_data可以创建子程序,点击子程序名系统自动创建,选第二个,子程序会包含在当前程序里面,如下

    这里写图片描述

    FORM frm_get_data .
      SELECT * INTO CORRESPONDING FIELDS OF TABLE t_vbakp
               FROM vbak
                    JOIN vbap ON vbak~vbeln = vbap~vbeln
                    JOIN vbkd ON vbap~vbeln = vbkd~vbeln AND vbap~posnr = vbkd~posnr
                    WHERE vbak~vbeln IN s_vbeln
                          AND vbap~werks IN s_werks
                          AND vbap~matnr IN s_matnr
                          AND vbap~erdat IN s_erdat.
    
      IF t_vbakp[] IS NOT INITIAL.
    *物料描述
        SELECT * INTO TABLE t_makt
                 FROM makt
                 FOR ALL ENTRIES IN t_vbakp
                 WHERE matnr = t_vbakp-matnr.
    
    * 客户供应商
        SELECT * INTO CORRESPONDING FIELDS OF TABLE t_vbpa
                 FROM vbpa
                 FOR ALL ENTRIES IN t_vbakp
                 WHERE vbpa~vbeln = t_vbakp-vbeln.
    *                    AND vbpa~posnr = t_vbakp-posnr.
    
    *计划交货时间
        SELECT *  INTO CORRESPONDING FIELDS OF TABLE t_vbep
                  from vbep
                  FOR ALL ENTRIES IN t_vbakp
                  where vbeln = t_vbakp-vbeln
                        and posnr = t_vbakp-posnr
                        and edatu in s_edatu.
      ENDIF.
    
    ENDFORM.                    " FRM_GET_DATA
    *&---------------------------------------------------------------------*

    (2)INTO CORRESPONDING FIELDS OF TABLE XXX:一般会把查询到的数据存放到内表对应的字段里

    (3) JOIN…ON…:可以把两张表进行关联,ON后面的就是条件,但是不建议关联太多张表,会导致效率下降

    (4)IS NOT INITIAL 判断不为空

    (5) FOR ALL ENTRIES IN:相当于一个子查询。假设上面代码通过第一个select语句后,t_vbakp有值了。我们还想获取物料描述,当然可以直接从物料描述表(makt)里取,但是好多不是我们需要的,所以要加个条件,条件就是内表t_vbakp里的物料(matnr)即获取这些物料的物料描述。最后再把数据存放在内表t_makt里,所以t_makt就有了我们需要的物料描述

    *物料描述
        SELECT * INTO TABLE t_makt
                 FROM makt
                 FOR ALL ENTRIES IN t_vbakp
                 WHERE matnr = t_vbakp-matnr.
    

    5)处理数据

    (1)和之前一样创建一个子程序

    FORM frm_handle_data .
      CLEAR w_vbakp.
      LOOP AT t_vbakp INTO w_vbakp.
        w_result-auart = w_vbakp-auart.
        w_result-vbeln = w_vbakp-vbeln.
        w_result-werks = w_vbakp-werks.
        w_result-lgort = w_vbakp-lgort.
        w_result-posnr = w_vbakp-posnr.
        w_result-matnr = w_vbakp-matnr.
        w_result-erdat = w_vbakp-erdat.
        w_result-bstkd = w_vbakp-bstkd.
    
        READ TABLE t_makt INTO w_makt
              WITH  KEY matnr = w_vbakp-matnr.
    
        IF sy-subrc = 0.
          w_result-maktx = w_makt-maktx.
        ENDIF.
    
        READ TABLE t_vbep INTO w_vbep
              WITH  KEY vbeln  = w_vbakp-vbeln
                        posnr  = w_vbakp-posnr.
        IF sy-subrc = 0.
          w_result-lmeng = w_vbep-lmeng.
          w_result-wmeng = w_vbep-wmeng.
          w_result-edatu = w_vbep-edatu.
        ENDIF.
    
    
        READ TABLE t_vbpa INTO w_vbpa
                 WITH  KEY vbeln  = w_vbakp-vbeln.
    *                       posnr = w_vbakp-posnr.
        IF sy-subrc = 0.
          w_result-kunnr = w_vbpa-kunnr.
          w_result-lifnr = w_vbpa-lifnr.
        ENDIF.
    
        APPEND w_result TO t_result.
      ENDLOOP.
      CLEAR w_result.
    ENDFORM.                    " FRM_HANDLE_DATA

    (2)一般建议使用工作区前先清空工作区

    (3)LOOP AT … INTO…. :主要用于循环内表,把内表数据一条一条取出来into到工作区里(马上要工作了^_^)

        w_result-auart = w_vbakp-auart.
        w_result-vbeln = w_vbakp-vbeln.
        w_result-werks = w_vbakp-werks.
        w_result-lgort = w_vbakp-lgort.
        w_result-posnr = w_vbakp-posnr.
        w_result-matnr = w_vbakp-matnr.
        w_result-erdat = w_vbakp-erdat.
        w_result-bstkd = w_vbakp-bstkd.

    (4)上面循环的内表有很多需要的数据直接赋值给工作区w_result就可以

    (5)对于循环内表t_vbakp没有的,比如物料描述信息等就要从其他地方取。前面我们已经获取了物料描述信息放在了内表t_makt里, 在这一步要做的是去取出物料对应的物料描述,就用到了READ TABLE …INTO…

    (6)READ TABLE …INTO…WITH KEY…:主要用于读取内表数据into到工作区间,条件就是with key后面的。假设内表t_vbakp里有个物料112,当循环到这条记录时,就以这个物料号为条件去t_makt中查,有的话就把数据取出来放在工作区w_makt里。

    READ TABLE t_makt INTO w_makt
              WITH  KEY matnr = w_vbakp-matnr.
    
        IF sy-subrc = 0.
          w_result-maktx = w_makt-maktx.
        ENDIF.

    (7)sy-subrc = 0表示语句运行成功。如果成功就给工作区w_result的物料描述赋值,但是read table只取一条数据,什么意思呢?比如说物料112有两个物料描述,但是w_makt工作区的物料描述就取第一条,因为工作区只能放一条数据。

    (8)APPEND… to…:一般把工作区的数据添加到内表里。每一次循环都是给工作区w_result里的字段赋值,赋值完再把工作区添加到内表t_result里。即每次循环都往内表存数据。

    6)展示ALV

    创建子程序frm_alv_show,子程序里再创建以下几个程序。子程序可以让报表可读性增强,双击程序名可以快速定位到对应的位置

    FORM frm_alv_show.
      PERFORM frm_init_layout.
      PERFORM frm_set_fieldset.
      PERFORM frm_output_alv.
      PERFORM f_status USING rt_extab .
    ENDFORM.                    "frm_alv_show
    *&---------------------------------------------------------------------*

    (1)PERFORM frm_init_layout.

    初始化ALV布局,可以自动根据数据长度调整列宽

    FORM frm_init_layout .
      t_layout-colwidth_optimize = 'X'.
      t_layout-zebra = 'X'.
    *t_layout-box_fieldname = 'BOX'.
    ENDFORM.  

    (2)PERFORM frm_set_fieldset:

    该子程序主要用于设置ALV字段

    FORM frm_set_fieldset .
    
      PERFORM frm_init_fieldcat USING 'VBELN' '销售凭证'.
      PERFORM frm_init_fieldcat USING 'AUART' '销售类型'.
      PERFORM frm_init_fieldcat USING 'WERKS' '工厂'.
      PERFORM frm_init_fieldcat USING 'LGORT' '库存地点'.
      PERFORM frm_init_fieldcat USING 'POSNR' '项目'.
      PERFORM frm_init_fieldcat USING 'MATNR' '物料'.
      PERFORM frm_init_fieldcat USING 'MAKTX' '物料描述'.
      PERFORM frm_init_fieldcat USING 'ERDAT' '创建日期'.
      PERFORM frm_init_fieldcat USING 'EDATU' '计划交货日期'.
      PERFORM frm_init_fieldcat USING 'KUNNR' '客户'.
      PERFORM frm_init_fieldcat USING 'LIFNR' '供应商'.
      PERFORM frm_init_fieldcat USING 'BSTKD' 'PO'.
      PERFORM frm_init_fieldcat USING 'LMENG' '订单数量'.
      PERFORM frm_init_fieldcat USING 'WMENG' '需求数量'.
    
    ENDFORM.                    " FRM_SET_FIELDSET
    *&---------------------------------------------------------------------*

    这里的字段就是ALV报表即将显示的字段,注意这里的字段名都必须大写否则报错

    可以看到该程序里面又有一个子程序frm_init_fieldcat,SAP通过USING传递参数,对应子程序的参数。

     PERFORM frm_init_fieldcat USING 'VBELN' '销售凭证'.
    FORM frm_init_fieldcat  USING    fieldcatname LIKE w_fieldcat-fieldname
                                      seltext LIKE w_fieldcat-seltext_l.
      CLEAR w_fieldcat.
      w_fieldcat-fieldname = fieldcatname .
      w_fieldcat-seltext_m = seltext.
      w_fieldcat-seltext_l = seltext.
      w_fieldcat-seltext_s = seltext.
    
      APPEND w_fieldcat TO t_fieldcat.
    
    ENDFORM.     

    frm_init_fieldcat 通过using 接收参数,这里有两个参数:字段和字段描述。

    (3)PERFORM frm_output_alv.

    这里需要调用函数[‘REUSE_ALV_GRID_DISPLAY’]输出ALV

    这里写图片描述

    FORM frm_output_alv .
      CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
      EXPORTING
    *       I_INTERFACE_CHECK                 = ' '
    *       I_BYPASSING_BUFFER                = ' '
    *       I_BUFFER_ACTIVE                   = ' '
        i_callback_program                = sy-repid
        i_callback_pf_status_set          = 'F_STATUS '
    *       I_CALLBACK_USER_COMMAND           = ' '
    *       I_CALLBACK_TOP_OF_PAGE            = ' '
    *       I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
    *       I_CALLBACK_HTML_END_OF_LIST       = ' '
    *       I_STRUCTURE_NAME                  =
    *       I_BACKGROUND_ID                   = ' '
    *       I_GRID_TITLE                      =
    *       I_GRID_SETTINGS                   =
        is_layout                         = t_layout
        it_fieldcat                       = t_fieldcat
    *       IT_EXCLUDING                      =
    *       IT_SPECIAL_GROUPS                 =
    *       IT_SORT                           =
    *       IT_FILTER                         =
    *       IS_SEL_HIDE                       =
    *       I_DEFAULT                         = 'X'
    *       I_SAVE                            = ' '
    *       IS_VARIANT                        =
    *       IT_EVENTS                         =
    *       IT_EVENT_EXIT                     =
    *       IS_PRINT                          =
    *       IS_REPREP_ID                      =
    *       I_SCREEN_START_COLUMN             = 0
    *       I_SCREEN_START_LINE               = 0
    *       I_SCREEN_END_COLUMN               = 0
    *       I_SCREEN_END_LINE                 = 0
    *       I_HTML_HEIGHT_TOP                 = 0
    *       I_HTML_HEIGHT_END                 = 0
    *       IT_ALV_GRAPHICS                   =
    *       IT_HYPERLINK                      =
    *       IT_ADD_FIELDCAT                   =
    *       IT_EXCEPT_QINFO                   =
    *       IR_SALV_FULLSCREEN_ADAPTER        =
    *     IMPORTING
    *       E_EXIT_CAUSED_BY_CALLER           =
    *       ES_EXIT_CAUSED_BY_USER            =
        TABLES
          t_outtab                          = t_result
    *     EXCEPTIONS
    *       PROGRAM_ERROR                     = 1
    *       OTHERS                            = 2
                .
      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.
    
    ENDFORM.                    " FRM_OUTPUT_ALV

    上面的t_outtab就是要输出的ALV表即t_result表。

    (4)创建状态

    没有状态ALV报表状态栏上的按钮都不能用

    这里写图片描述

    看看状态里有什么,直接双击状态名

    这里写图片描述

    FORM f_status USING rt_extab TYPE slis_t_extab.
      SET PF-STATUS 'STANDARD_FULLSCREEN' EXCLUDING rt_extab.
    ENDFORM.                    "FRM_PLATFORM_O

    5.效果

    这里写图片描述

    报表流程大致都是这样的,当然你写完报表不表示就完成了,你还得要测试数据,进行debug,发现问题并修改完善程序。快写完了突然断电,没有保存,真够伤的,又重新敲~~(>_<)~~,写个博客真不容易。

    展开全文
  • 大数据数仓之报表开发

    千次阅读 2020-11-03 22:54:30
    大数据数仓之报表开发 1. 背景 在大数据开发中,主要的数据分析目的可以分为2类。一类是基于历史数据(就算是实时数仓,接收到数据的时候,其实也已经是历史数据了)做数据规律或者结果提取;一类是基于历史数据,...

    大数据数仓之报表开发

    1. 背景

    1. 在大数据开发中,主要的数据分析目的可以分为2类。一类是基于历史数据(就算是实时数仓,接收到数据的时候,其实也已经是历史数据了)做数据规律或者结果提取;一类是基于历史数据,训练模型,做未来数据预测或者分类等。
    2. 如果是前者,基于已有数据做数据规律和数据结果提取,这时候就可以称之为报表开发。
    3. 参考神策系统,报表开发可以划分固定维度报表开发,一定维度自由组合报表开发,自由维度报表开发。
    4. 固定维度报表开发,一般是一些固定指标,但会加一些固定维度,典型的如年,月,日等
      在这里插入图片描述
    5. 一定维度内自定义组合分析
      在这里插入图片描述
      在这里插入图片描述
    6. 灵活自定义分析

    在这里插入图片描述

    2. 报表分类

    1. 从上述描述中可以看到,报表从数据维度和计算难度来看,可以分为3大类
    2. 固定报表,如果是离线数仓场景,很多时候使用hive,或者spark,或者mapreduce程序,结合脚本定时(一般是每天定时任务滚动计算)执行,就可以将这些指标计算出来。
      注意,数仓一般会做分层处理,一般都是将原始数据处理后放入ODS层,ODS层数据处理之后放入DWD层,DWS层结果一般从DWD计算而来。所以整个数据流是有先后顺序的
    3. 一定维度内组合报表,也就是典型的cube。
    • 可以使用hive 的三个语法

    with cube
    grouping sets
    roll up
    但注意,这三个语法其实在实际开发中,维度过多时,实际使用并不友好。并且计算之后的结果还需要想办法放到HBase或者mysql来方便外部的快速结果查询

    • 可以使用现有工具,druid或者kylin

    kylin是纯粹的预计算框架,当设定好需要计算的cube,设定好需要计算的维度组合之后,结合kylin的rest api或者jdbc接口,可以让kylin做每日滚动计算。kylin还会自己把计算后结果放入HBase中(hbase可以提供亚秒级别的数据访问,不过需要基于rowkey或者索引查询);
    druid 则有轻度预先聚合,对数据查询也有加速效果

    1. 灵活自定义查询,也叫即席查询
    1. 即席查询要求有很强的计算性能,因为没有做预计算或者预聚合,数据量大时,需要有很强的计算性能才能满足即席查询的秒级要求。
    2. 神策使用的方案是impala,但应对大量数据的计算,还是会受限于impala本身的限制。据说内部其实也做了很多优化,思路包括一定的预聚合和预计算等,所以神策在国内其实属于领头羊地位,属于独角兽
    3. presto属于后起之秀,虽然社区内划分了2个分支,但不影响使用。presto的计算性能其实弱于impala,但结合presto的内存表,性能会有很大提升,就是对内存占用以及数据体量会有一些要求。
      并且,presto的社区活跃很多,版本迭代快速。有大公司支持,个人人为性能超越impala是预期内的事情。
    展开全文
  • JAVA报表开发技术深入解析.pdf

    千次下载 热门讨论 2013-01-07 10:31:43
    《Java报表开发技术深入解析》内容是一个完整的Java报表开发体系,而且在《Java报表开发技术深入解析》的每个章节都提供了丰富的实用实例,力求让读者通过这些实例程序掌握Java报表开发的各种基本技巧。通过《Java...
  • VUE报表开发

    千次阅读 2018-08-20 23:29:00
    封装成一款报表开发工具。 先看一下项目的一些效果:数据单项绑定 可视化操作: 数据联动: 使用技术:vue全家桶 项目结构: │ App.vue #主要组件│ main.js│├─assets│ logo.png│├─axios #网络....
  • EAS BOS 报表开发

    千次阅读 2019-03-12 11:33:16
    EAS BOS 报表开发 只是做为新手BOS报表开发一个参考: 开发所需要新建的文件 ContractReportFilterUI:报表弹出的条件选择框,在新建时需要继承系统UI类...
  • 金蝶自定义报表开发

    千次阅读 2019-02-01 16:26:27
    自定义报表开发 添加链接描述
  • 报表开发之自定义函数

    千次阅读 2016-07-21 11:14:45
    对于报表开发,很多情况下,自带的函数就能满足大部分用户的报表制作需求,FineReport也不例外。但是在一些特殊领域,可能需要一些特殊的函数,在这种情况下,FineReport提供了自定义函数机制,可以由用户根据业务...
  • Jasper报表开发

    千次阅读 2016-06-20 09:56:18
    Jasper + iReport报表开发技术 环境搭建及入门基础普及
  • 介绍报表的相关知识和基本概念,以及报表工具FineReport初级报表的制作,分组报表、自由报表、多源报表、交叉报表、主子报表原理及制作,图表、参数查询模块,数据钻取的介绍,填报、多sheet填报、数据上报等填报...
  • 2.online 报表开发 3.online 流程开发 Online开发——初体验(在线配置图表) 01 通过JSON数据,快速配置图形报表 02 通过SQL数据,快速配置图形报表 03 图表模板配置,实现不同数据源图表合并展示 04 图表...
  • openerp的报表开发教程

    2014-12-24 08:53:21
    最近学习OPENERP,其最常用的报表模式为RML ,哪位有比较详细的报表开发教程?
  • 然而很多企业的数据分析师或者报表工程师在报表开发的过程中总遇到这样的问题:每天接需求,接需求,费尽心血做了一堆的报表,但是感觉没什么用。有的报表改了又改,业务总是不满意,最后好不容易改好了,功劳还都是...
  • SSRS报表开发

    万次阅读 2013-08-20 10:07:30
    我们再进行SSRS报表开发的时候经常会用到两个工具:一个是 SQL SERVER 安装集成的 IDE -- BIDS(SQL Server Business Intelligence Development Studio);另一个是报表生成器(Report Builder)。如果是比较熟悉...
  • Birt报表开发

    千次阅读 2011-09-08 22:33:22
    Birt报表开发 1. 报表介绍 BIRT――商业智能和报表工具。 BIRT是一个Eclipse-based开放源代码的报表系统,它主要是用在基于Java和J2ee的web应用程序上。BIRT主要由两部分组成:一个是基于Eclipse的报表设计器和一个...
  • maximo报表开发

    千次阅读 2012-03-12 09:11:01
    如果birt版本过高,开发后的报表在maximo系统中无法上传,所以只能用ibm提供的打包好的eclipse和birt插件做报表开发。    1. 将maximo提供的birt文件夹替换目录 ..\eclipse\plugins\org.eclipse.birt.
  • eclipse birt报表开发入门

    千次阅读 2016-12-13 17:58:45
    eclipse birt报表开发入门 时间:2015-06-08 21:36:38 阅读:19023 评论:1 收藏:1 [点我收藏+] 标签:报表 birt   在开发中,报表或多或少会涉及到,有些报表可能比较简单,而有些报表可能很复杂。...
  • 第一次帆软报表开发驻场

    千次阅读 2019-06-21 12:44:54
    学习帆软报表开发有一段时间了,但是一直在做部署,集群和分布式等工作,没有真正的做过报表的开发。此次项目,我也加入了报表开发小组。这个项目真的是任务重时间紧,不说工作量了,就说我们工作时间,每天上午9点...
  • 论制造业的报表开发项目需求

    千次阅读 2015-11-13 14:21:48
    论制造业的报表开发项目需求
  • 使用JasperReports报表开发工具,报表引擎的整个工作过程如下图所示:  JasperReports 报表引擎工作原理图  为了让读者进一步了解上述原理,先写一段简单的代码进行分析,我们假设已经完成了JRXML报表的创建...
  • 报表开发工程师面试准备

    千次阅读 2018-12-05 22:13:23
    现在也没搞明白报表开发工程师是做什么的,明天上午就要面试了,先按照职位描述的内容进行复习。 了解hadoop hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。 Hadoop的框架最核心...
  • Devexpress报表开发(一):创建静态报表最近项目需求,学习了一下Devexpress报表,下面我们就用Devexpress所带的报表控件实现一张静态报表。1.创建一个winform窗体项目并添加一张报表在winform中添加三个button按钮...
  • iReport报表开发

    千次阅读 2016-09-08 13:28:54
    说明:制作像这样的报表 编号:2016030277777003 中华人民共和国预防健康检查用表 从业人员健康检查表 体检日期:2016-03-02 单位:xxxxxx 单位性质:个体 姓名:张三 性别:男 年龄:xx 民族:汉 文化程度:大学...
  • 处理各种表格中的数据,然后将这些数据进行转换,但是报表之间往往是不同的,同时它涉及到的很多数据也是要进行进一步的分析的,因此此时就需要使用到报表开发解决方案了,那么它的作用都有哪些呢?其实主要就表现在...
  • SAP报表开发工具 Report Painter

    千次阅读 2017-12-01 16:09:45
    Painter是SAP ECC产品中的一个报表开发工具,中文名为报表绘制器。经常与Report Painter一同提出的Report Writer是其前身,原应用于SAP R/3产品中,后升级为Report Painter。   ※ Report Painter适用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 149,208
精华内容 59,683
关键字:

报表开发