ABAP获取屏幕字段的值
Monday, February 18, 2019
1:12 PM
ABAP 处理屏幕事件中存在4个常见的逻辑流:
1. PBO – PROCESS BEFORE OUTPUT.
该事件在屏幕出来之前被触发。
2. PAI – PROCESS AFTER INPUT.
在屏幕出来之后,负责处理用户的操作响应
3. POH – PROCESS ON HELP-REQUEST.
处理用户帮助请求(F1) 时响应处理操作, 如当用户按下F1 被触发
4. POV – PROCESS ON VALUE-REQUEST.
处理用户值查询帮助(F4) 时响应处理操作。 Value Search Help 的处理
PBO 为在Screen 显示之前,SAP 系统会自动将程序变量(屏幕上的值)放到屏幕字段中。 接着在屏幕显示之后,用户PAI 事件如果触发,系统会自动屏幕字段的值更新到相应的程序变量。
这里需要注意的是: POH 和 POV 的触发中,这时去获取Screen 的字段值 需要使用 Function: DYNP_VALUES_READ 来实现。 原因为: POH 或 POV 触发时 PAI 并没有执行, Screen 字段的值还没有更新到程序变量中。
下例中为通过屏幕参数来控制是否可以选择多文件上传。
Example:
*&———————————————————————*
*& Report ZBC_UPLOAD01
*&———————————————————————*
* Identification
* Report/Program : ZBC_UPLOAD01
* Transaction :
* Author : Wei.Zhu
* Owner : IDES01
* Creation date : 2019.02.18
* Project : N/A
* Dev. under SAP : ECC
*&———————————————————————*
* Attributes
* Type : REPORT
* Develop.-Class : ZBC_COMMON
*———————————————————————*
* Description (short)
*
*———————————————————————*
* Change-history
* 2019.02.18 TR#NPLK900057 Wei.Zhu New Creation.
*———————————————————————*
REPORT zbc_upload01.
TABLES: file_table.
“Define Data
TYPES: BEGIN OF ty_tab,
f1 TYPE string,
f2 TYPE string,
f3 TYPE string,
END OF ty_tab.
DATA: gt_tab1 TYPE STANDARD TABLE OF ty_tab,
gs_tab1 TYPE ty_tab.
DATA: lv_file_name TYPE string,
lt_file_name TYPE filetable.
DATA: lv_subrc TYPE sy–subrc.
“—Selection Screen—
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT–001.
SELECT-OPTIONS: s_fn FOR file_table NO INTERVALS.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT–002.
PARAMETERS: p_c1 AS CHECKBOX DEFAULT ‘X’.
SELECTION-SCREEN END OF BLOCK b2.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_fn–low.
* p_c1 = zcl_bc_common=>get_dynp_values(
* EXPORTING
* iv_repid = sy-repid
* iv_dynnr = sy-dynnr
* iv_field_name = ‘P_C1’
* ).
PERFORM get_dynp_values USING ‘P_C1’
CHANGING p_c1.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
* WINDOW_TITLE =
* DEFAULT_EXTENSION =
* DEFAULT_FILENAME =
* FILE_FILTER =
initial_directory = ‘c:\temp’
multiselection = p_c1
CHANGING
file_table = lt_file_name
rc = lv_subrc
* USER_ACTION =
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
OTHERS = 4.
IF sy–subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
“—Start-of-selection—
START-OF-SELECTION.
FORM get_dynp_values USING pv_field_name TYPE dynpread–fieldname
CHANGING chg_field_value.
DATA: lt_dynpfield TYPE TABLE OF dynpread,
ls_dynpfield TYPE dynpread.
CLEAR: lt_dynpfield.
ls_dynpfield–fieldname = pv_field_name.
APPEND ls_dynpfield TO lt_dynpfield.
CALL FUNCTION ‘DYNP_VALUES_READ’
EXPORTING
dyname = sy–repid
dynumb = sy–dynnr
translate_to_upper = ‘X’
TABLES
dynpfields = lt_dynpfield
EXCEPTIONS
OTHERS = 9.
IF sy–subrc = 0.
READ TABLE lt_dynpfield INTO ls_dynpfield
WITH KEY fieldname = pv_field_name.
chg_field_value = ls_dynpfield–fieldvalue.
ENDIF.
ENDFORM.
独立构建为通用Method: GET_DYNP_VALUES
*———————————————————————*
* Class: ZCL_BC_COMMON
* Method Name: GET_DYNP_VALUES
* Author: WEI.ZHU
* Date: 2019.02.18
*———————————————————————*
* Description (short)
* Get Dynpro Values
*———————————————————————*
* Change-history
* 2019.02.18 TR#NPLK900057 Wei.Zhu New Creation.
*———————————————————————*
METHOD get_dynp_values.
DATA: lt_dynpfield TYPE TABLE OF dynpread,
ls_dynpfield TYPE dynpread.
CLEAR: lt_dynpfield.
ls_dynpfield–fieldname = iv_field_name.
APPEND ls_dynpfield TO lt_dynpfield.
CALL FUNCTION ‘DYNP_VALUES_READ’
EXPORTING
dyname = iv_repid
dynumb = iv_dynnr
translate_to_upper = ‘X’
TABLES
dynpfields = lt_dynpfield
EXCEPTIONS
OTHERS = 9.
IF sy–subrc = 0.
READ TABLE lt_dynpfield INTO ls_dynpfield
WITH KEY fieldname = iv_field_name.
rv_result = ls_dynpfield–fieldvalue.
ENDIF.
ENDMETHOD.