1228|如何用ALV输出完成SAP报表

2022-05-19 12:41:05 浏览数 (1)

ABAP开发—ALV学习笔记

一、开发思想

ABAP开发:事件驱动开发

SAP请求号意义

程序的封装思想

二、开发ALV的基本流程

第一步:定义ALV所要用到的类型池:TYPE-POOLS:SLIS;

第二步:定义ALV所要显示的数据对应的内表数据类型及内表数据对象;

第三步:定义一些显示ALV时所要使用到的变量;

第四步:定义选择屏幕;

第五步:声明各个选择屏幕事件块;

三、ABAP-ALV-00方法中的ALV的如何自己添加按钮及其响应

步骤一:创建一个事件的处理类

步骤二:类的实现

步骤三:在FROM---set_toolbar中添加button(按钮)

步骤四:创建事件处理对象

四、我的开发实例1:使用ALV输出一个会计凭证清单

五、我的开发实例2:ALV SMARTFROM,输出物料凭证清单

20201228学习《ABAP_ALV_知识整理》,以下为读书笔记和我的ALV开发实例。

一、开发思想

ABAP开发属于事件驱动开发

这句话清晰的解释了SAP程序的必然结构。对于事件驱动,SAP程序就需要是由一个个事件去触发才能够执行的程序,当我们使用SE38去创建1类型的可执行程序,我们可以直接调试,这个程序是按照上面所写的事件块的顺序去依次执行的。他的事件块的顺序是指定好的,所以可以直接按F8,直接运行。

SAP请求号意义

CR:请求号,可以理解为一个程序的代码版本,所有的SAP程序都是在D(开发)系统,然后传到Q系统(测试)由顾问测试,又不干扰生产系统的程序运营,最后再传到P(生产)系统,覆盖原来的代码,变成修改后的代码逻辑。

我目前正在开发的项目就是100client开发、300client测试,项目后期加了一个600client,集成测试。

程序的封装思想

INCLUDE是一种封装起来的思想,单独产生CR,而和它的主程序没有任何关联。include是一个全局全系统的声明;

perfrom 封装思想、代码块,需要取有意义的名字,方便代码阅读。

在START-OF-SELECTION中,一般有以下几个PERFROM:

frm_get_data                    取数逻辑

frm_alv_layout_build        创建ALV显示格式

frm_alv_set_columns        调用ALV函数

二、开发ALV的基本流程

第一步:定义ALV所要用到的类型池:TYPE-POOLS:SLIS;

第二步:定义ALV所要显示的数据对应的内表数据类型及内表数据对象;

第三步:定义一些显示ALV时所要使用到的变量;

第四步:定义选择屏幕;

第五步:声明各个选择屏幕事件块;

例如:

    1.调用一个子程序frm_get_data,用于获取alv所要显示的数据;

    2.调用一个子程序frm_alv_layout_build,用于设置alv所要显示的样式;

    3.调用显示alv的函数,例如REUSE_ALV_GRID_DISPLAY;

ALV中所用到的函数

显示ALV函数:REUSE_ALV_GRID_DISPLAY

其中参数frm_user_command_alv,该子程序指定相关函数功能码的响应逻辑。

三、ABAP-ALV-00方法中的ALV的如何自己添加按钮及其响应

SAP    在做报表开发中,不同公司对报表的风格往往各异,为此经常使用00方法做ALV,报表中需要去掉自带的工具栏而自行添加一些工具按钮,下面将简单介绍一下添加按钮及如何响应的实现方法:

步骤一:创建一个事件的处理类

这个事件处理类中添加了两个方法:

1.往工具栏添加按钮

2.响应工具栏上按钮的动作

步骤二:类的实现

步骤三:在FROM---set_toolbar中添加button(按钮)

步骤四:创建事件处理对象

这一步一般在grf_grid→set_table_for_fist_display之后

四、我的开发实例1:使用ALV输出一个会计凭证清单

代码语言:javascript复制
*&---------------------------------------------------------------------*
*& Report ZR_DAY5_40
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZR_DAY5_40.


*声明表名  会计核算凭证标题  会计核算凭证段  采购凭证抬头  采购凭证项目  供应商主数据 (一般地区)
TABLES:BKPF,BSEG,EKKO,EKPO,LFA1.

*表格样式设置
INCLUDE ZINCLUDE.

*引用ALV类型池
TYPE-POOLS:SLIS.

*定义变量类型
TYPES: BEGIN OF GS_OUT,
  BUKRS TYPE BSEG-BUKRS, "公司代码
  GJAHR TYPE BSEG-GJAHR, "财年
  MONAT TYPE BKPF-MONAT, "期间
  BELNR TYPE BSEG-BELNR, "凭证编号
  BKTXT TYPE BKPF-BKTXT, "抬头文本
  BLDAT TYPE BKPF-BLDAT, "凭证日期
  BUDAT TYPE BKPF-BUDAT, "过账日期
  BLART TYPE BKPF-BLART, "凭证类型
  HKONT TYPE BSEG-HKONT, "会计科目
  SHKZG TYPE BSEG-SHKZG, "借贷方(S=借方,H=贷方)
  DMBTR TYPE BSEG-DMBTR, "金额
  LIFNR TYPE BSEG-LIFNR, "供应商编码
  KUNNR TYPE BSEG-KUNNR, "客户编码
  ANLN1 TYPE BSEG-ANLN1, "固定资产
  KOSTL TYPE BSEG-KOSTL, "成本中心
  PRCTR TYPE BSEG-PRCTR , "利润中心
  FIPOS TYPE BSEG-FIPOS , "承诺项目
  PROJK TYPE BSEG-PROJK, "WBS元素
  AUGBL TYPE BSEG-AUGBL, "冲销凭证
END OF GS_OUT.


*定义内表和工作区
DATA :GT_OUT TYPE TABLE OF GS_OUT.
DATA: GS_OUT TYPE  GS_OUT.


*   定义选择屏幕
SELECTION-SCREEN BEGIN OF BLOCK BL1 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS:
  B_BUKRS FOR BKPF-BUKRS OBLIGATORY NO-EXTENSION NO INTERVALS, "NO-EXTENSION是不出现后面的多选按钮
  B_GJAHR FOR BKPF-GJAHR OBLIGATORY NO-EXTENSION NO INTERVALS, "NO INTERVALS是将多选框变为单选框
  B_MONAT FOR BKPF-MONAT OBLIGATORY,
  B_BELNR FOR BSEG-BELNR,
  B_BLART FOR BKPF-BLART,
  B_BLDAT FOR BKPF-BLDAT,
  B_BUDAT FOR BKPF-BUDAT,
  B_HKONT FOR BSEG-HKONT,
  B_DMBTR FOR BSEG-DMBTR,
  B_USNAM FOR BKPF-USNAM.
SELECTION-SCREEN END OF BLOCK BL1.


*开始选择数据
START-OF-SELECTION.




*调用
PERFORM FRM_PROCESS.


PERFORM FRM_OUTPUT.



*&---------------------------------------------------------------------*
*&      Form  FRM_PROCESS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_PROCESS .
* 选择数据
  SELECT
  BSEG~BUKRS "公司代码
  BSEG~GJAHR "财年
  BKPF~MONAT "期间
  BSEG~BELNR "凭证编号
  BKPF~BKTXT "抬头文本
  BKPF~BLDAT "凭证日期
  BKPF~BUDAT "过账日期
  BKPF~BLART "凭证类型
  BSEG~HKONT "会计科目
  BSEG~SHKZG "借贷方(S=借方,H=贷方)
  BSEG~DMBTR "金额
  BSEG~LIFNR "供应商编码
  BSEG~KUNNR "客户编码
  BSEG~ANLN1 "固定资产
  BSEG~KOSTL "成本中心
  BSEG~PRCTR  "利润中心
  BSEG~FIPOS "承诺项目
  BSEG~PROJK "WBS元素
  BSEG~AUGBL "冲销凭证
  INTO TABLE GT_OUT
  FROM BSEG
  INNER JOIN BKPF ON BSEG~BUKRS = BKPF~BUKRS "公司代码
  AND BSEG~GJAHR = BKPF~GJAHR "财年
  AND BSEG~BELNR = BKPF~BELNR "凭证编号
  WHERE  BKPF~BUKRS IN B_BUKRS
  AND   BKPF~GJAHR IN B_GJAHR
  AND   BKPF~MONAT IN B_MONAT
  AND   BSEG~BELNR IN B_BELNR
  AND   BKPF~BLART IN B_BLART
  AND   BKPF~BLDAT IN B_BLDAT
  AND   BKPF~BUDAT IN B_BUDAT
  AND   BSEG~HKONT IN B_HKONT
  AND   BSEG~DMBTR IN B_DMBTR
  AND   BKPF~USNAM IN B_USNAM .
ENDFORM.



*&---------------------------------------------------------------------*
*&      Form  FRM_OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM  FRM_OUTPUT.
PERFORM layout_init_lvc USING gs_layout_lvc.
add_field_lvc 'SEL' '选择框' '' 'X' '' '1' '' '' 'X'.
add_field_lvc 'BUKRS' '公司代码' '' '' '' '' '' '' ''.
add_field_lvc 'GJAHR' '财年' '' '' '' '' '' '' ''.
add_field_lvc 'MONAT' '期间' '' '' '' '' '' '' ''.
add_field_lvc 'BELNR' '凭证编号' '' '' '' '' '' '' ''.
add_field_lvc 'BKTXT' '抬头文本' '' '' '' '' '' '' ''.
add_field_lvc 'BLDAT' '凭证日期' '' '' '' '' '' '' ''.
add_field_lvc 'BUDAT' '过账日期' '' '' '' '' '' '' ''.
add_field_lvc 'BLART' '凭证类型' '' '' '' '' '' '' ''.
add_field_lvc 'HKONT' '会计科目' '' '' '' '' '' '' ''.
add_field_lvc 'SHKZG' '借贷方(S=借方,H=贷方)' '' '' '' '' '' '' ''.
add_field_lvc 'DMBTR' '金额' '' '' '' '' '' '' ''.
add_field_lvc 'LIFNR' '供应商编码' '' '' '' '' '' '' ''.
add_field_lvc 'KUNNR' '客户编码' '' '' '' '' '' '' ''.
add_field_lvc 'ANLN1' '固定资产' '' '' '' '' '' '' ''.
add_field_lvc 'KOSTL' '成本中心' '' '' '' '' '' '' ''.
add_field_lvc 'PRCTR' '利润中心' '' '' '' '' '' '' ''.
add_field_lvc 'FIPOS' '承诺项目' '' '' '' '' '' '' ''.
add_field_lvc 'PROJK' 'WBS元素' '' '' '' '' '' '' ''.
add_field_lvc 'AUGBL' '冲销凭证' '' '' '' '' '' '' ''.


  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
  EXPORTING
    i_callback_program       = sy-repid
    is_layout_lvc            = gs_layout_lvc
    it_fieldcat_lvc          = gt_fieldcat_lvc
    i_save                   = 'A'
    it_events                = gt_events[]
  TABLES
    t_outtab                 = gt_out
  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.

五、我的开发实例2:ALV SMARTFROM,输出物料凭证清单

代码语言:javascript复制
*&---------------------------------------------------------------------*
*& Report ZR_DAY6_40
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZR_DAY6_40.
TABLES: MKPF,MSEG,MAKT,LFA1.

INCLUDE:ZINCLUDE.

* ALV使用到的类库
TYPE-POOLS:SLIS.
* SLIS_T_FIELDCAT_ALV

*   输出内表和工作区
TYPES: BEGIN OF GT_OUTPUT,
  CHECKBOX    TYPE C,
  MBLNR       TYPE MKPF-MBLNR, "物料凭证号"
  MJAHR       TYPE MKPF-MJAHR, "会计年度"
  ZEILE       TYPE MSEG-ZEILE, ""
  BUDAT       TYPE MKPF-BUDAT, ""
  MATNR       TYPE MSEG-MATNR, "物料号"
  MAKTX       TYPE MAKT-MAKTX, "物料描述"
  BWART       TYPE MSEG-BWART, ""
  LIFNR       TYPE MSEG-LIFNR, ""
  NAME1       TYPE LFA1-NAME1, "供应商描述"
  DMBTR       TYPE MSEG-DMBTR, "总量"
  MENGE       TYPE MSEG-MENGE, "数量"
  REMARKS(40) TYPE C,
END OF GT_OUTPUT.


*内表
DATA:GT_OUTPUT TYPE TABLE OF GT_OUTPUT.

*  定义工作区
DATA:GS_OUTPUT TYPE GT_OUTPUT.

* 为打印按钮定义的内表和工作区
DATA:GT_OUTPUT_FM TYPE  ZTT32_DAY6_SM.
DATA: GS_OUTPUT_FM TYPE ZS32_DAY6_SM.


* 定义屏幕选择器
SELECTION-SCREEN BEGIN OF BLOCK BL1 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS:
  MT_DOC   FOR MKPF-MBLNR  ,"多选非必填字段"
  MT_DOC_Y FOR MKPF-MJAHR OBLIGATORY NO-EXTENSION NO INTERVALS, "no-extension 限制为单选   OBLIGATORY为必填字段" “单选必填字段”
  POT_DATE FOR   MKPF-BUDAT,
  MT_NUM   FOR  MSEG-MATNR,
  MM_TYPE  FOR MSEG-BWART.
SELECTION-SCREEN END OF BLOCK BL1.


*开始选择
START-OF-SELECTION.


*调用
PERFORM FRM_PORCESS.
PERFORM FRM_OUTPUT.


*&---------------------------------------------------------------------*
*&      Form  FRM_PORCESS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*


FORM FRM_PORCESS .
* 选择数据
* 查询数据
  SELECT  MKPF~MBLNR
  MKPF~MJAHR
  MSEG~ZEILE
  MKPF~BUDAT
  MSEG~MATNR
  MAKT~MAKTX
  MSEG~BWART
  MSEG~LIFNR
  LFA1~NAME1
  MSEG~DMBTR
  MSEG~MENGE
*CORRESPONDING  匹配相同字段
  INTO CORRESPONDING FIELDS OF TABLE GT_OUTPUT
  FROM MKPF
  INNER JOIN MSEG ON MSEG~MBLNR = MKPF~MBLNR AND MSEG~MJAHR = MKPF~MJAHR
  INNER JOIN MAKT ON MSEG~MATNR = MAKT~MATNR
  INNER JOIN LFA1 ON MSEG~LIFNR = LFA1~LIFNR
  WHERE MKPF~MBLNR IN MT_DOC
  AND   MKPF~MJAHR IN MT_DOC_Y
  AND   MKPF~BUDAT IN POT_DATE
  AND   MSEG~MATNR IN MT_NUM
  AND   MSEG~BWART IN MM_TYPE.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_OUTPUT .
* 创建fieldcat
  PERFORM layout_init_lvc USING gs_layout_lvc.
  add_field_lvc 'CHECKBOX' '选择框' '' 'X' '' '1' '' '' 'X'.
  add_field_lvc 'MBLNR' 'Material Document' '' '' '' '' '' '' ''.
  add_field_lvc 'MJAHR' 'Material Document Year' '' '' '' '' '' '' ''.
  add_field_lvc 'ZEILE' 'Item no' '' '' '' '' '' '' ''.
  add_field_lvc 'BUDAT' 'Posting Date' '' '' '' '' '' '' ''.
  add_field_lvc 'MATNR' 'Material Number' '' '' '' '' '' '' ''.
  add_field_lvc 'MAKTX' 'Material Description' '' '' '' '' '' '' ''.
  add_field_lvc 'BWART' 'Vendor' '' '' '' '' '' '' ''.
  add_field_lvc 'LIFNR' 'Movement Type' '' '' '' '' '' '' ''.
  add_field_lvc 'NAME1' 'Vendor Description' '' '' '' '' '' '' ''.
  add_field_lvc 'DMBTR' 'Amount' '' '' '' '' '' '' ''.
  add_field_lvc 'MENGE' 'Quantity' '' 'X' '' '' '' '' ''.
  add_field_lvc 'REMARKS' 'Remarks' '' 'X' '' '' '' '' ''.


  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
  EXPORTING
    i_callback_program       = sy-repid
    is_layout_lvc            = gs_layout_lvc
    it_fieldcat_lvc          = gt_fieldcat_lvc
    i_callback_pf_status_set = 'STATUS_SET'     "大写!
    i_callback_user_command  = 'USER_COMMAND'
*     I_CALLBACK_TOP_OF_PAGE   = 'FRM_TOP_OF_PAGE'
    i_save                   = 'A'
    it_events                = gt_events[]
  TABLES
    t_outtab                 = GT_OUTPUT
  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.


"设置ALV的GUI_STATUS
FORM  status_set USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'ZGUI1_ZR_DAY6_40'.
ENDFORM.




*为按钮添加新功能
FORM user_command USING rf_ucomm    LIKE sy-ucomm  "sy-ucomm系统字段
      rs_selfield TYPE slis_selfield.


DATA: lr_grid TYPE REF TO cl_gui_alv_grid.


CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
  e_grid = lr_grid.
CALL METHOD lr_grid->check_changed_data.
rs_selfield-REFRESH = 'X'.
rs_selfield-col_stable = 'X'.
rs_selfield-row_stable = 'X'.


CASE RF_UCOMM.
WHEN 'ALL'.
  PERFORM FRM_OKCODE_ALL.
WHEN 'CLEAR'.
  PERFORM FRM_OKCODE_CLEAR.
*     WHEN '&IC1'.
*       PERFORM FRM_OKCODE_IC1.
WHEN 'PRINT'. "打印
PERFORM FRM_OKCODE_PRINT.
ENDCASE.
*RE_SELFIELD-REFRESH = 'X'.
ENDFORM.


*&---------------------------------------------------------------------*
*&      Form  FRM_OKCODE_ALL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_OKCODE_ALL .
  LOOP AT GT_OUTPUT INTO GS_OUTPUT.
    GS_OUTPUT-CHECKBOX = 'X'.
    MODIFY GT_OUTPUT FROM GS_OUTPUT.
  ENDLOOP.
ENDFORM.


*&---------------------------------------------------------------------*
*&      Form  FRM_OKCODE_CLEAR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_OKCODE_CLEAR .
  LOOP AT GT_OUTPUT INTO GS_OUTPUT.
    GS_OUTPUT-CHECKBOX = ''.
    MODIFY GT_OUTPUT FROM GS_OUTPUT.
  ENDLOOP.
ENDFORM.


FORM FRM_OKCODE_PRINT .
  CLEAR:GT_OUTPUT,GS_OUTPUT.
  LOOP AT GT_OUTPUT INTO GS_OUTPUT.
    IF GS_OUTPUT-CHECKBOX = 'X'.
      MOVE-CORRESPONDING GS_OUTPUT TO GS_OUTPUT_FM.
      APPEND GS_OUTPUT_FM TO GT_OUTPUT_FM.
    ENDIF.
  ENDLOOP.




*打印功能
  DATA: G_FM TYPE RS38L_FNAM.
  DATA: CONTROL_PARAMETERS TYPE SSFCTRLOP.
  DATA: GV_DT(14) TYPE C.


  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
  EXPORTING
    FORMNAME           = 'ZR_DAY6_40' "填写创建的smartform的名字
*     VARIANT            = ' '
*     DIRECT_CALL        = ' '
  IMPORTING
    FM_NAME            = G_FM  "功能模块的名字
  EXCEPTIONS
    NO_FORM            = 1
    NO_FUNCTION_MODULE = 2
    OTHERS             = 3.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.


*  CONTROL_PARAMETERS-NO_DIALOG = 'X'.
*  CONTROL_PARAMETERS-PREVIEW = 'X'.
*  control_parameters-device  = 'LP01'.


  CALL FUNCTION G_FM
  EXPORTING
    CONTROL_PARAMETERS = CONTROL_PARAMETERS
    GV_DT = GV_DT
  TABLES
    GT_OUTPUT          = GT_OUTPUT   "  smartform里面表格接口里面的表的那个名字
  EXCEPTIONS
    FORMATTING_ERROR   = 1
    INTERNAL_ERROR     = 2
    SEND_ERROR         = 3
    USER_CANCELED      = 4
    OTHERS             = 5.
ENDFORM.

0 人点赞