ABAP动态编程-动态生成报表、动态屏幕

目录

前言

一、动态生成报表并调用

二、动态生成屏幕并调用

总结

前言

        本文主要讲述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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《从实例学SAP ABAP编程1-10章》是一本SAP ABAP编程的经典入门教材。本书从简单的SAP ABAP编程入手,通过多个实例向读者展示了SAP ABAP编程的核心概念和语法。 在第一章中,本书通过一个简单的例子介绍了SAP ABAP编程的基础知识,讲解了ABAP编辑器、ABAP数据字典和ABAP Workbench等重要工具的用法。 在第二章中,本书通过一个简单的例子向读者介绍了ABAP表格的创建和维护,并讲解了一些与表格相关的SAP ABAP编程的语法和概念。 在第三章中,本书介绍了SAP ABAP编程中的面向对象编程,通过几个例子向读者展示了如何使用类、对象和继承等概念进行SAP ABAP编程。 在第四章中,本书介绍了SAP ABAP编程中的函数模块,向读者讲解了如何创建和调用函数模块,以及如何在SAP系统中使用函数模块。 在第五章中,本书介绍了SAP ABAP编程中的异常处理,向读者讲解了如何使用TRY/CATCH语句处理SAP系统中的异常情况。 在第六章中,本书介绍了SAP ABAP编程中的Web服务,向读者讲解了如何创建和使用SAP系统中的Web服务,以及如何使用HTTP和SOAP协议进行数据通信。 在第七章中,本书介绍了SAP ABAP编程中的ALV报表,向读者讲解了如何创建和维护SAP系统中的ALV报表,以及如何对报表进行数据操作和定制。 在第八章中,本书介绍了SAP ABAP编程中的BADI和Enhancement点,向读者讲解了如何使用BADI和Enhancement点扩展和修改SAP系统中的业务逻辑。 在第九章中,本书介绍了SAP ABAP编程中的Smart Form,向读者讲解了如何使用Smart Form创建和维护SAP系统中的表单。 在第十章中,本书介绍了SAP ABAP编程中的SAP HANA数据库,向读者讲解了如何使用SAP HANA数据库进行高效的数据处理和分析。 通过阅读本书,读者可以快速掌握SAP ABAP编程的核心知识和技能,从而能够独立进行SAP系统的开发和维护工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值