二维码

在Module Pool 类型的程序中创建变式

Twilight发表于 2014-12-22 11:06Twilight 最后回复于 2014-12-22 11:06 [复制链接] 4568 0

在Module Pool 类型的程序中变式的作用和report程序中的Selection Screens变式作用相同

1、se38 创建一个Module Pool类型的程序
  1. PROGRAM  ydamon_091.
  2. TABLES: mara.
  3. DATA: ok_code TYPE sy-ucomm,
  4.        g_variant1 TYPE rsvar-variant,
  5.        g_user_vari TYPE rsvar-variant,
  6.        g_vari_report TYPE rsvar-report,
  7.        g_sel_var TYPE rsvar-variant,
  8.        g_sel_vartxt TYPE rsvar-vtext,
  9.        g_report TYPE rsvar-report,
  10.        g_varexists TYPE c.

  11. SELECTION-SCREEN BEGIN OF SCREEN 901 AS SUBSCREEN.
  12. SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001. "Input
  13. SELECT-OPTIONS: s_matnr FOR mara-matnr. "Material Number
  14. SELECTION-SCREEN SKIP.
  15. PARAMETERS: p_rec TYPE char4 DEFAULT '1000'. "Max. No. of Records
  16. SELECTION-SCREEN END OF BLOCK b1.
  17. SELECTION-SCREEN END OF SCREEN 901.

  18. SELECTION-SCREEN BEGIN OF SCREEN 902 AS SUBSCREEN.
  19. SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-001.
  20. PARAMETERS: p_name TYPE rsvar-variant, p_mean TYPE rsvar-vtext.
  21. SELECTION-SCREEN END OF BLOCK b2.
  22. SELECTION-SCREEN END OF SCREEN 902.
  23. *&---------------------------------------------------------------------*
  24. *&      Module  STATUS_9000  OUTPUT
  25. *&---------------------------------------------------------------------*
  26. *       text
  27. *----------------------------------------------------------------------*
  28. MODULE status_9000 OUTPUT.
  29.   SET PF-STATUS 'ZGUI_9000'.
  30.   SET TITLEBAR 'ZTITLE_900'.

  31. ENDMODULE.                 " STATUS_9000  OUTPUT
  32. *&---------------------------------------------------------------------*
  33. *&      Module  USER_COMMAND_9000  INPUT
  34. *&---------------------------------------------------------------------*
  35. *       text
  36. *----------------------------------------------------------------------*
  37. MODULE user_command_9000 INPUT.
  38.   CLEAR ok_code.
  39.   ok_code = sy-ucomm.
  40.   CASE ok_code.
  41.     WHEN 'SAVE'.
  42.       CLEAR: p_name, p_mean.
  43.       CALL SCREEN 9001 STARTING AT 10 5.
  44.     WHEN 'VARIANT'.
  45.       PERFORM load_variant.
  46.       IF sy-ucomm EQ 'CANC'.
  47.         MESSAGE 'Variant operation terminated' TYPE 'S' DISPLAY LIKE 'E'.
  48.       ELSE.
  49.         MESSAGE 'Variant selected' TYPE 'S'.
  50.       ENDIF.
  51.       CALL SCREEN 9000.
  52.     WHEN OTHERS.
  53.       LEAVE TO SCREEN 0.
  54.   ENDCASE.
  55. ENDMODULE.                 " USER_COMMAND_9000  INPUT
  56. *&---------------------------------------------------------------------*
  57. *&      Module  STATUS_9001  OUTPUT
  58. *&---------------------------------------------------------------------*
  59. *       text
  60. *----------------------------------------------------------------------*
  61. MODULE status_9001 OUTPUT.
  62.   SET PF-STATUS 'ZGUI_9001'.
  63. *  SET TITLEBAR 'xxx'.

  64. ENDMODULE.                 " STATUS_9001  OUTPUT
  65. *&---------------------------------------------------------------------*
  66. *&      Module  USER_COMMAND_9001  INPUT
  67. *&---------------------------------------------------------------------*
  68. *       text
  69. *----------------------------------------------------------------------*
  70. MODULE user_command_9001 INPUT.
  71.   IF NOT p_name IS INITIAL.
  72.     ok_code = 'OK'.
  73.   ELSE.
  74.     ok_code = 'CANCEL'.
  75.   ENDIF.
  76.   CASE ok_code.
  77.     WHEN 'OK'.
  78.       IF NOT p_name IS INITIAL.
  79.         PERFORM save_variant.
  80.         MESSAGE 'Variant has been saved' TYPE 'S'.
  81.       ENDIF.
  82.     WHEN 'CANCEL'.
  83.       MESSAGE '"Variant Not saved.' TYPE 'S' DISPLAY LIKE 'E'.
  84.   ENDCASE.
  85.   CALL SCREEN 9000.
  86. ENDMODULE.                 " USER_COMMAND_9001  INPUT

  87. *&---------------------------------------------------------------------*
  88. *&  Form  SAVE_VARIANT
  89. *&---------------------------------------------------------------------*
  90. *  Routine to Save the variant
  91. *----------------------------------------------------------------------*
  92. FORM save_variant .
  93.   DATA: BEGIN OF rsparams_tab OCCURS 10.
  94.           INCLUDE STRUCTURE rsparams.
  95.   DATA: END OF rsparams_tab.
  96.   DATA: BEGIN OF varid_tab.
  97.           INCLUDE STRUCTURE varid.
  98.   DATA: END OF varid_tab.
  99.   DATA: BEGIN OF varit_tab OCCURS 2.
  100.           INCLUDE STRUCTURE varit.
  101.   DATA: END OF varit_tab.
  102.   DATA: rc  TYPE syst-subrc.
  103. * Tabellen initialisieren
  104.   CLEAR: varid_tab.
  105.   REFRESH varit_tab.
  106.   REFRESH rsparams_tab.
  107. *fill VARID structure - variant description
  108.   varid_tab-report  = 'YDAMON_091'.  "当前程序名称
  109.   varid_tab-variant = p_name.
  110.   varid_tab-environmnt   = 'A'.
  111.   varit_tab-mandt   = sy-mandt.
  112.   varit_tab-langu   = sy-langu.
  113.   varit_tab-report  = varid_tab-report.
  114.   varit_tab-variant = varid_tab-variant.
  115.   varit_tab-vtext   = p_mean.
  116.   APPEND varit_tab.
  117. *fill RSPARAMS structure - Selektionswerte; variant contents
  118.   LOOP AT s_matnr.
  119.     rsparams_tab-selname = 'S_MATNR'.
  120.     rsparams_tab-kind    = 'S'.
  121.     rsparams_tab-sign    = s_matnr-sign.
  122.     rsparams_tab-option  = s_matnr-option.
  123.     rsparams_tab-low     = s_matnr-low.
  124.     rsparams_tab-high    = s_matnr-high.
  125.     APPEND rsparams_tab.
  126.   ENDLOOP.

  127.   rsparams_tab-selname = 'P_REC'.
  128.   rsparams_tab-kind  = 'P'.
  129.   rsparams_tab-sign  = 'I'.
  130.   rsparams_tab-option  = 'EQ'.
  131.   rsparams_tab-low  = p_rec.
  132.   rsparams_tab-high  = ' '.
  133.   APPEND rsparams_tab.
  134. *Check variant
  135.   CALL FUNCTION 'RS_VARIANT_EXISTS'
  136.     EXPORTING
  137.       report              = varid_tab-report
  138.       variant             = varid_tab-variant
  139.     IMPORTING
  140.       r_c                 = rc
  141.     EXCEPTIONS
  142.       not_authorized      = 01
  143.       no_report           = 02
  144.       report_not_existent = 03
  145.       report_not_supplied = 04.

  146.   IF sy-subrc <> 0.
  147.     MESSAGE e001(vl) DISPLAY LIKE 'S' WITH text-e22 .
  148.   ENDIF.

  149.   IF rc = 0.                    " Variante existiert
  150.     CALL FUNCTION 'RS_CHANGE_CREATED_VARIANT'
  151.       EXPORTING
  152.         curr_report               = varid_tab-report
  153.         curr_variant              = varid_tab-variant
  154.         vari_desc                 = varid_tab
  155.       TABLES
  156.         vari_contents             = rsparams_tab
  157.         vari_text                 = varit_tab
  158.       EXCEPTIONS
  159.         illegal_report_or_variant = 01
  160.         illegal_variantname       = 02
  161.         not_authorized            = 03
  162.         not_executed              = 04
  163.         report_not_existent       = 05
  164.         report_not_supplied       = 06
  165.         variant_doesnt_exist      = 07
  166.         variant_locked            = 08
  167.         selections_no_match       = 09.
  168.   ELSE.
  169.     CALL FUNCTION 'RS_CREATE_VARIANT'
  170.       EXPORTING
  171.         curr_report               = varid_tab-report
  172.         curr_variant              = varid_tab-variant
  173.         vari_desc                 = varid_tab
  174.       TABLES
  175.         vari_contents             = rsparams_tab
  176.         vari_text                 = varit_tab
  177.       EXCEPTIONS
  178.         illegal_report_or_variant = 01
  179.         illegal_variantname       = 02
  180.         not_authorized            = 03
  181.         not_executed              = 04
  182.         report_not_existent       = 05
  183.         report_not_supplied       = 06
  184.         variant_exists            = 07
  185.         variant_locked            = 08.
  186.   ENDIF.
  187.   rc = sy-subrc.
  188. ENDFORM.           " SAVE_VARIANT

  189. *&---------------------------------------------------------------------*
  190. *&      Form  LOAD_VARIANT
  191. *&---------------------------------------------------------------------*
  192. *       加载选中的变式
  193. *----------------------------------------------------------------------*
  194. FORM load_variant .
  195.   PERFORM choose_variant CHANGING g_sel_var.
  196.   IF g_sel_var NE space.
  197.     CALL FUNCTION 'RS_SUPPORT_SELECTIONS'
  198.       EXPORTING
  199.         report               = sy-repid
  200.         variant              = g_sel_var
  201.       EXCEPTIONS
  202.         variant_not_existent = 1
  203.         variant_obsolete     = 2
  204.         OTHERS               = 3.
  205.   ENDIF.
  206. ENDFORM.                    " LOAD_VARIANT

  207. *&---------------------------------------------------------------------*
  208. *&      Form  CHOOSE_VARIANT
  209. *&---------------------------------------------------------------------*
  210. *       弹出变式列表对话框
  211. *----------------------------------------------------------------------*
  212. *      -->FP_SEL_VAR text
  213. *----------------------------------------------------------------------*
  214. FORM choose_variant  CHANGING fp_sel_var.
  215.   CALL FUNCTION 'RS_VARIANT_CATALOG'
  216.     EXPORTING
  217.       report               = sy-repid
  218.       masked               = 'X'
  219.     IMPORTING
  220.       sel_variant          = fp_sel_var
  221.       sel_variant_text     = g_sel_vartxt
  222.     EXCEPTIONS
  223.       no_report            = 1
  224.       report_not_existent  = 2
  225.       report_not_supplied  = 3
  226.       no_variants          = 4
  227.       no_variant_selected  = 5
  228.       variant_not_existent = 6
  229.       OTHERS               = 7.
  230. ENDFORM.                    " CHOOSE_VARIANT
复制代码
2、创建normal screen 9000
Variants 1.jpg
定义ok_code&创建子屏幕区域SUB1
Variants 2.jpg
定义逻辑流
  1. PROCESS BEFORE OUTPUT.
  2. MODULE STATUS_9000.
  3. CALL SUBSCREEN SUB1 INCLUDING SY-REPID '901'.
  4. *
  5. PROCESS AFTER INPUT.
  6. CALL SUBSCREEN SUB1.
  7. MODULE USER_COMMAND_9000.
复制代码
定义GUI状态
Variants 4.jpg
3、创建Dialog screen 9001
Variants 3.jpg
定义ok_code&创建子屏幕区域SUB2
定义逻辑流
  1. PROCESS BEFORE OUTPUT.
  2. MODULE STATUS_9001.
  3. CALL SUBSCREEN SUB2 INCLUDING SY-REPID '902'.
  4. *
  5. PROCESS AFTER INPUT.
  6. CALL SUBSCREEN SUB2.
  7. MODULE USER_COMMAND_9001.
复制代码
定义GUI状态
Variants 5.jpg

4、定义T-code(se93),Module Pool 类型的程序不能直接执行,需要T-code执行
Transaction 1.jpg
Transaction 2.jpg
5、执行程序,测试
Transaction 3.jpg
Transaction 4.jpg
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表