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.