栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SAP报表开发步骤

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SAP报表开发步骤

https://blog.csdn.net/Kang_xiong/article/details/64922576

了解需求

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

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

3.如何下手开发

1.分析需求,该报表的要点是关于SO

2.熟悉表
报表中的数据从何而来,需求中的订单号,物料号都来自于数据库。所以我们需要分析需要那些表。

使用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(确认的数量)

然后我们就可以开始我们的报表开发

报表开发
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这个类型池

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查看类型池

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

DATA:t_result TYPE TABLE OF ty_result.
DATA:w_result TYPE ty_result.
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.

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

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

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

3.parameters 用于单值查询

PARAMETERS p_matnr like mara-matnr.

4.设置选择屏幕的文本值

5.获取数据

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
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Report ZALVTEST006
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZALVTEST006.
*     第一步:  声明ALV相关变量
TYPE-POOLS:slis.
DATA: lt_fieldcat TYPE slis_t_fieldcat_alv, "存储fieldcat的内表
      wa_fieldcat TYPE slis_fieldcat_alv,   "定义工作区
      ls_layout   TYPE slis_layout_alv.     "ALV格式控制的结构体:layout


*     第二步:  定义内表
TYPES: BEGIN OF TY_ALVSHOW,
    VBELN TYPE VBAK-VBELN,
    ERDAT TYPE VBAK-ERDAT,
    ERNAM TYPE VBAK-ERNAM,
    KUNNR TYPE VBAK-KUNNR,
    POSNR TYPE VBAP-POSNR,
    MATHR TYPE VBAP-MATNR,
    MATKL TYPE VBAP-MATKL,
    ZMENG TYPE VBAP-ZMENG,
    ZIEME TYPE VBAP-ZIEME,
    WERKS TYPE VBAP-WERKS,
    LGORT TYPE VBAP-LGORT,
      END OF TY_ALVSHOW.
*     定义相关的内表的名字为 LT_ALVSHOW,其结构参照我们卸载开头的结构
    DATA:   lt_alvshow TYPE TABLE OF TY_ALVSHOW,
            LS_alvshow  TYPE TY_ALVSHOW.
*     定义工作区wa_alvshow


*     第三步:读取数据
SELECt
VBELN ERDAT ERNAME KUNNR  POSNRMATNR
MATKL ZMENG ZIEME WERKS LGORT
FROM VBAK as a  INNER JOIN vbap as b
  on a~vbeln  = b~vbeln
into TABLE LT_ALVSHOW
UP TO 100 ROWS.


*     第四步:ALV格式控制
ls_layout-zebra = 'X'.
ls_layout-detail_popup = 'X'.
ls_layout-detail_titlebar = 'X'.
ls_layout-f2code = 'X'.
ls_layout-colwidth_optimize = 'X'.
"fieldcat

*销售凭证
lv_colpos = 1.
ls_fieldcat-fieldname = 'VBELN'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype  = 'CHAR'.
ls_fieldcat-outputlen = '10'.
ls_fieldcat-seltext_m = '销售凭证'.
APPEND ls_fieldcat TO lt_fieldcat.

*凭证日期
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'ERDAT'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype  = 'CHAR'.
ls_fieldcat-outputlen = '10'.
ls_fieldcat-seltext_m = '销售日期'.
APPEND ls_fieldcat TO lt_fieldcat.

*创建时间
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'ERNAME'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype  = 'CHAR'.
ls_fieldcat-outputlen = '10'.
ls_fieldcat-seltext_m = '创建时间'.
APPEND ls_fieldcat TO lt_fieldcat.

*创建人
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'ERNAM'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype  = 'CHAR'.
ls_fieldcat-outputlen = '12'.
ls_fieldcat-seltext_m = '销售人'.
APPEND ls_fieldcat TO lt_fieldcat.

*售达方
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'kunnr'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype  = 'CHAR'.
ls_fieldcat-outputlen = '10'.
ls_fieldcat-seltext_m = '售达方'.
APPEND ls_fieldcat TO lt_fieldcat.

*项目编码
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'POSNR'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype  = 'NUMC'.
ls_fieldcat-outputlen = '6'.
ls_fieldcat-seltext_m = '项目编码'.
APPEND ls_fieldcat TO lt_fieldcat.

*物料
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'MATNR'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype  = 'CHAR'.
ls_fieldcat-outputlen = '18'.
ls_fieldcat-seltext_m = '物料'.
APPEND ls_fieldcat TO lt_fieldcat.

*物料组
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'MATKL'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype  = 'CHAR'.
ls_fieldcat-outputlen = '9'.
ls_fieldcat-seltext_m = '物料组'.
APPEND ls_fieldcat TO lt_fieldcat.

*数量
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'ZMENG'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype  = 'QUAN'.
ls_fieldcat-outputlen = '13'.
ls_fieldcat-seltext_m = '数量'.
APPEND ls_fieldcat TO lt_fieldcat.

*单位
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'ZIEME'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype  = 'CUNIT'.
ls_fieldcat-outputlen = '3'.
ls_fieldcat-seltext_m = '单位'.
APPEND ls_fieldcat TO lt_fieldcat.

*工厂
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'werks'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-ref_tabname  = 'VBAP'.
APPEND ls_fieldcat TO lt_fieldcat.

*库存
lv_colpos = lv_colpos + 1 .
ls_fieldcat-fieldname = 'LOGORT'.
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-ref_tabname  = 'VBAP'.
APPEND ls_fieldcat TO lt_fieldcat.


*   第五步:定义事件(省略)

*   第六步: 显示ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
 EXPORTING
*   I_INTERFACE_CHECK                 = ' '
*   I_BYPASSING_BUFFER                = ' '
*   I_BUFFER_ACTIVE                   = ' '
*   I_CALLBACK_PROGRAM                = ' '
*   I_CALLBACK_PF_STATUS_SET          = ' '
*   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                         = LS_LAYOUT
   IT_FIELDCAT                       = LT_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                          = LT_ALVSHOW
 EXCEPTIONS
   PROGRAM_ERROR                     = 1
   OTHERS                            = 2
          .
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF. 

 
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1027853.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号