加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

ABAP-动态创建子程序池,并在程序中调用(1)

(2011-05-10 17:53:18)
标签:

abap

动态

子程序池

杂谈

分类: SAP家园-ABAP
*&---------------------------------------------------------------------*
*& Report  ZTRAINING_X3 为主程序动态创建字程序池                       *
*&                                                                     *
*&---------------------------------------------------------------------*
*& Created by Xavery Hsueh on 2011-04-19                               *
*&                                                                     *
*&---------------------------------------------------------------------*
REPORT  ztraining_x3 NO STANDARD PAGE HEADING.

************************************************************************
**  声明数据库表 Declaration of database                              **
************************************************************************

************************************************************************
**  定义结构类型 Define the structure's type                          **
************************************************************************

************************************************************************
**  定义变量与内表 Define the variants and Internal tables            **
************************************************************************
DATA:gt_report TYPE TABLE OF tdline WITH HEADER LINE.

DATA:gt_code(72) TYPE OCCURS 10.
DATA:g_filenm   TYPE string.
DATA:g_prog(8)  TYPE c,
     g_msg(120) TYPE c,
     g_lin(3)   TYPE c,
     g_wrd(10)  TYPE c,
     g_off(3)   TYPE c.
   指定子程序池中的子程序名
CONSTANTS:con_form1(20) TYPE VALUE 'SUB_DYN1',
          con_form2(20) TYPE VALUE 'SUB_DYN2',
          con_form3(20) TYPE VALUE 'SUB_DYN3',
          con_form4(20) TYPE VALUE 'SUB_DYN4',
          con_form5(20) TYPE VALUE 'SUB_DYN5',
          con_form6(20) TYPE VALUE 'SUB_DYN6',
          con_form7(20) TYPE VALUE 'SUB_DYN7'.
************************************************************************
**  选择屏幕 Customize the selection-screen                           **
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK xavery WITH FRAME TITLE text-001.
PARAMETERS p_filenm TYPE rlgrap-filename.
SELECTION-SCREEN END OF BLOCK xavery.
************************************************************************
**  执行程序事件 Executing the program's events                       **
************************************************************************
INITIALIZATION.
  PERFORM sub_init_cond.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_filenm.
  PERFORM sub_search_help_for_filename.

START-OF-SELECTION.
  PERFORM sub_upload_data.
  PERFORM sub_generate_code.

END-OF-SELECTION.
*@---------------------------------------------------------------------*
*@      Form  SUB_INIT_COND
*@---------------------------------------------------------------------*
      初始化选择条件
*----------------------------------------------------------------------*
FORM sub_init_cond .

ENDFORM.                    SUB_INIT_COND
*&---------------------------------------------------------------------*
*&      Form  sub_search_help_for_filename
*&---------------------------------------------------------------------*
      给文件名字段加搜索帮助
*----------------------------------------------------------------------*
FORM sub_search_help_for_filename .
  CALL FUNCTION 'WS_FILENAME_GET'
   EXPORTING
    DEF_FILENAME           '
    DEF_PATH               '
     mask                   ',*.* ,*.*.'
       mask             ',文本文件 (*.txt),*.txt.'
      mode                   '0'
      title                  '上传数据'
   IMPORTING
      filename               p_filenm
    RC                     =
   EXCEPTIONS
     inv_winsys             1
     no_batch               2
     selection_cancel       3
     selection_error        4
     OTHERS                 5
            .
  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.                    sub_search_help_for_filename
*&---------------------------------------------------------------------*
*&      Form  sub_upload_data
*&---------------------------------------------------------------------*
      将指定的程序代码加载到内表中
*----------------------------------------------------------------------*
FORM sub_upload_data .
  CHECK NOT p_filenm IS INITIAL.
处理文件名
  CLEAR g_filenm.
  g_filenm p_filenm.
调用FUNCTION,上载程序源代码
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                g_filenm
    TABLES
      data_tab                gt_code
    EXCEPTIONS
      file_open_error         1
      file_read_error         2
      no_batch                3
      gui_refuse_filetransfer 4
      invalid_type            5
      no_authority            6
      unknown_error           7
      bad_data_format         8
      header_not_allowed      9
      separator_not_allowed   10
      header_too_long         11
      unknown_dp_error        12
      access_denied           13
      dp_out_of_memory        14
      disk_full               15
      dp_timeout              16
      OTHERS                  17.
  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.                    sub_upload_data
*&---------------------------------------------------------------------*
*&      Form  sub_generate_code
*&---------------------------------------------------------------------*
      为程序创建子程序池
*----------------------------------------------------------------------*
FORM sub_generate_code .
  CHECK NOT p_filenm IS INITIAL.
  GENERATE SUBROUTINE POOL gt_code NAME g_prog
                                   MESSAGE g_msg
                                   LINE g_lin
                                   WORD g_wrd
                                   OFFSET g_off.
程序创建不成功,则返回错误信息,
  IF sy-subrc <> 0.
    WRITE: 'Error during generation in line', g_lin,
    g_msg,
    'Word:', g_wrd, 'at offset', g_off.
程序创建成功,则执行生成的代码
  ELSE.
    WRITE: 'The name of subroutine pool is ', g_prog.
    PERFORM (con_form1) IN PROGRAM (g_prog) "通过常量指定子程序名
                        IF FOUND.
    PERFORM (con_form2) IN PROGRAM (g_prog) "通过常量指定子程序名
                        IF FOUND.
    PERFORM (con_form3) IN PROGRAM (g_prog) "通过常量指定子程序名
                        IF FOUND.
    PERFORM (con_form4) IN PROGRAM (g_prog) "通过常量指定子程序名
                        IF FOUND.
    PERFORM (con_form5) IN PROGRAM (g_prog) "通过常量指定子程序名
                        IF FOUND.
    PERFORM (con_form6) IN PROGRAM (g_prog) "通过常量指定子程序名
                        IF FOUND.
    PERFORM (con_form7) IN PROGRAM (g_prog) "通过常量指定子程序名
                        IF FOUND.
  ENDIF.
ENDFORM.                    sub_generate_code

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有