目录
前言
一、动态生成报表并调用
二、动态生成屏幕并调用
总结
前言
本文主要讲述ABAP编程中根据逻辑自动生成报表及屏幕(依托语句GENERATE DYNPRO)的实现示例及简单说明。
一、动态生成报表并调用
代码示例:
" Create report
INSERT REPORT lv_program FROM lt_codes STATE 'A'.
COMMIT WORK AND WAIT.
" Execute
SUBMIT (lv_program) WITH SELECTION-TABLE lt_rsparams AND RETURN.
" Delete
DELETE REPORT lv_program.
PS: 该种方式生成报表不会刷新所用处清单,可临时生成报表并调用来执行动态逻辑,缺点是和主程序交互麻烦。lv_program为程序名,lt_code 为代码,注意每行代码长度。
二、动态生成屏幕并调用
代码示例:
DATA: lv_tabname TYPE tabname VALUE 'T001'.
DATA: ls_dynpro_header TYPE d020s,
lt_feild_list TYPE TABLE OF d021s,
ls_feild_list TYPE d021s,
lt_flow_logic TYPE TABLE OF d022s,
ls_flow_logic TYPE d022s,
lt_matchcode TYPE TABLE OF d023s,
ls_matchcode TYPE d023s,
lv_message TYPE text240,
lv_lines TYPE i,
lv_word TYPE char72.
DATA: BEGIN OF ls_dynp_id,
prog LIKE d020s-prog,
dnum LIKE d020s-dnum,
END OF ls_dynp_id.
ls_dynp_id-prog = sy-repid.
ls_dynp_id-dnum = 9001.
CLEAR: ls_dynpro_header.
ls_dynpro_header-prog = sy-repid.
ls_dynpro_header-dnum = 9001.
ls_dynpro_header-fnum = 9001.
ls_dynpro_header-mili = 192.
ls_dynpro_header-mico = 37.
ls_dynpro_header-noli = 27.
ls_dynpro_header-noco = 121.
ls_dynpro_header-cuan = 'G'.
ls_dynpro_header-spra = '1'.
ls_dynpro_header-dgen = sy-datum.
ls_dynpro_header-tgen = sy-uzeit.
CLEAR ls_feild_list.
ls_feild_list-fnam = 'TEXT001'.
ls_feild_list-fmb1 = '30'.
ls_feild_list-leng = '0A'.
ls_feild_list-line = '02'.
ls_feild_list-coln = '02'.
ls_feild_list-type = 'CHAR'.
ls_feild_list-ityp = 'C'.
ls_feild_list-stxt = 'Table Name'.
APPEND ls_feild_list TO lt_feild_list.
CLEAR ls_feild_list.
ls_feild_list-fnam = 'lv_tabname'.
ls_feild_list-flg1 = '80'.
ls_feild_list-flg3 = '80'.
ls_feild_list-line = '02'.
ls_feild_list-leng = '10'.
ls_feild_list-coln = '0F'.
ls_feild_list-type = 'CHAR'.
ls_feild_list-ityp = 'C'.
ls_feild_list-stxt = '________________'.
APPEND ls_feild_list TO lt_feild_list.
CLEAR ls_feild_list.
ls_feild_list-fnam = ''.
ls_feild_list-flg1 = '80'.
ls_feild_list-flg2 = '10'.
ls_feild_list-line = 'FF'.
ls_feild_list-leng = '14'.
ls_feild_list-coln = '01'.
ls_feild_list-type = 'CHAR'.
ls_feild_list-ltyp = 'O'.
ls_feild_list-stxt = '________________'.
APPEND ls_feild_list TO lt_feild_list.
" 逻辑流代码
lt_flow_logic = VALUE #( ( line = `PROCESS BEFORE OUTPUT.` )
( line = ` MODULE STATUS_9001.` )
( line = ` ` )
( line = `PROCESS AFTER INPUT.` )
( line = ` MODULE USER_COMMAND_9001.` )
).
" 屏幕参数
lt_matchcode = VALUE #( ( type = '' content = '' ) ).
DELETE DYNPRO ls_dynp_id.
GENERATE DYNPRO ls_dynpro_header lt_feild_list lt_flow_logic lt_matchcode ID ls_dynp_id
MESSAGE lv_message
LINE lv_lines WORD lv_word.
CALL SCREEN ls_dynp_id-dnum.
DELETE DYNPRO ls_dynp_id.
效果:
可动态生成屏幕,即用即生成,用完即弃.该代码生成的屏幕缺点是不会关联所用处清单,即在SE80中无法查看,如果要永久生成使用如下代码.
DATA: lv_tabname TYPE tabname VALUE 'T001'.
DATA: ls_dynpro_header TYPE d020s,
lt_feild_list TYPE TABLE OF d021s,
ls_feild_list TYPE d021s,
lt_flow_logic TYPE TABLE OF d022s,
ls_flow_logic TYPE d022s,
lt_matchcode TYPE TABLE OF d023s,
ls_matchcode TYPE d023s,
lv_message TYPE text240,
lv_lines TYPE i,
lv_word TYPE char72.
DATA: BEGIN OF ls_dynp_id,
prog LIKE d020s-prog,
dnum LIKE d020s-dnum,
END OF ls_dynp_id.
DATA: lv_obj_name TYPE e071-obj_name.
ls_dynp_id-prog = sy-repid.
ls_dynp_id-dnum = 9001.
CLEAR: ls_dynpro_header.
ls_dynpro_header-prog = sy-repid.
ls_dynpro_header-dnum = 9001.
ls_dynpro_header-fnum = 9001.
ls_dynpro_header-mili = 192.
ls_dynpro_header-mico = 37.
ls_dynpro_header-noli = 27.
ls_dynpro_header-noco = 121.
ls_dynpro_header-cuan = 'G'.
ls_dynpro_header-spra = '1'.
ls_dynpro_header-dgen = sy-datum.
ls_dynpro_header-tgen = sy-uzeit.
CLEAR ls_feild_list.
ls_feild_list-fnam = 'TEXT001'.
ls_feild_list-fmb1 = '30'.
ls_feild_list-leng = '0A'.
ls_feild_list-line = '02'.
ls_feild_list-coln = '02'.
ls_feild_list-type = 'CHAR'.
ls_feild_list-ityp = 'C'.
ls_feild_list-stxt = 'Table Name'.
APPEND ls_feild_list TO lt_feild_list.
CLEAR ls_feild_list.
ls_feild_list-fnam = 'lv_tabname'.
ls_feild_list-flg1 = '80'.
ls_feild_list-flg3 = '80'.
ls_feild_list-line = '02'.
ls_feild_list-leng = '10'.
ls_feild_list-coln = '0F'.
ls_feild_list-type = 'CHAR'.
ls_feild_list-ityp = 'C'.
ls_feild_list-stxt = '________________'.
APPEND ls_feild_list TO lt_feild_list.
CLEAR ls_feild_list.
ls_feild_list-fnam = ''.
ls_feild_list-flg1 = '80'.
ls_feild_list-flg2 = '10'.
ls_feild_list-line = 'FF'.
ls_feild_list-leng = '14'.
ls_feild_list-coln = '01'.
ls_feild_list-type = 'CHAR'.
ls_feild_list-ltyp = 'O'.
ls_feild_list-stxt = '________________'.
APPEND ls_feild_list TO lt_feild_list.
" 逻辑流代码
lt_flow_logic = VALUE #( ( line = `PROCESS BEFORE OUTPUT.` )
( line = ` MODULE STATUS_9001.` )
( line = ` ` )
( line = `PROCESS AFTER INPUT.` )
( line = ` MODULE USER_COMMAND_9001.` )
).
" 屏幕参数
lt_matchcode = VALUE #( ( type = '' content = '' ) ).
DELETE DYNPRO ls_dynp_id.
CALL FUNCTION 'RPY_DYNPRO_INSERT_NATIVE'
EXPORTING
header = ls_dynpro_header
dynprotext = 'Generated dynpro'
TABLES
fieldlist = lt_feild_list
flowlogic = lt_flow_logic
params = lt_matchcode
EXCEPTIONS
cancelled = 1
already_exists = 2
program_not_exists = 3
not_executed = 4
OTHERS = 5.
IF sy-subrc <> 0.
ENDIF.
GENERATE DYNPRO ls_dynpro_header lt_feild_list lt_flow_logic lt_matchcode ID ls_dynp_id
MESSAGE lv_message
LINE lv_lines WORD lv_word.
CALL FUNCTION 'RS_WORKING_AREA_ACTIVE_CHECK'
EXCEPTIONS
nok = 1
OTHERS = 2.
IF sy-subrc = 0.
lv_obj_name = ls_dynp_id.
CALL FUNCTION 'RS_WORKING_AREA_INIT'.
CALL FUNCTION 'RS_DELETE_FROM_WORKING_AREA'
EXPORTING
object = 'DYNP'
obj_name = lv_obj_name
EXCEPTIONS
OTHERS = 1.
ENDIF.
生成屏幕展示:
可以使用如下代码获取屏幕参数参考
DATA: ls_dynpro_header TYPE d020s,
lt_feild_list TYPE TABLE OF d021s,
lt_flow_logic TYPE TABLE OF d022s,
lt_matchcode TYPE TABLE OF d023s.
DATA: BEGIN OF ls_dynp_id,
prog LIKE d020s-prog,
dnum LIKE d020s-dnum,
END OF ls_dynp_id.
ls_dynp_id-prog = sy-repid.
ls_dynp_id-dnum = 9001.
IMPORT DYNPRO ls_dynpro_header lt_feild_list lt_flow_logic lt_matchcode ID ls_dynp_id.
PS: 屏幕生成可以选择动态生成,临时使用,也可以选择永久生成,自动化编程,参考SM30。注意动态屏幕生成和选择动态选择屏幕时两回事。
总结
1. 报表和屏幕的动态生成,可以作为实现代码的动态效果的一种方式,每次执行都动态生成,也可以作为自动化编程的一种,生成永久的代码,这部分可参考SM30.
2. 其它永久生成abap开发对象的方式可以参考abapgit源码。
————————————————
版权声明:本文为CSDN博主「Fireworks_me」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiefireworks/article/details/123143289