DYNP_VALUES_UPDATE 實時更新 Selection Screen

本文介绍如何使用DYNP_VALUES_UPDATE实现ABAP程序中选择屏幕参数的实时更新。通过示例代码展示了如何在用户选择后即时刷新选择屏幕上的PARAMETER或SELECT-OPTIONS值,提高用户体验。
DYNP_VALUES_UPDATE 實時更新 Selection Screen 在 AT SELECTION-SCREEN 事件中更新 PARAMETER 或 SELECT-OPTIONS 的數值時,當前的畫面並不會立即更新,要按 Enter 之後才會顯示最新數值。 以下代碼是用 DYNP_VALUES_UPDATE 實現實時更新。 (1) 觸發 AT SELECTION-SCREEN ON VALUE-REQUEST FOR XXX. (2) REUSE_ALV_POPUP_TO_SELECT 彈出選單,Double Click 以選擇目標。 (3) 立即更新已選的兩個數值。 DYNP_VALUES_UPDATE – Update the Selection Screen dynamically REPORT ztest. TYPE-POOLS: slis. *----------------------------------------------------------------------* * T A B L E S *----------------------------------------------------------------------* *----------------------------------------------------------------------* * T Y P E S *----------------------------------------------------------------------* * Main internal table for process TYPES: BEGIN OF ty_bwart, zeile TYPE mseg-zeile, bwart TYPE mseg-bwart, sobkz TYPE mseg-sobkz, rmtxt TYPE string, END OF ty_bwart. *----------------------------------------------------------------------* * I N T E R N A L T A B L E *----------------------------------------------------------------------* DATA: t_bwart TYPE ty_bwart OCCURS 0 WITH HEADER LINE. *----------------------------------------------------------------------* * W O R K I N G A R E A S * *----------------------------------------------------------------------* DATA: w_bwart TYPE ty_bwart. *----------------------------------------------------------------------* * S E L E C T I O N - S C R E E N *----------------------------------------------------------------------* SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE c_title. PARAMETER: p_bwart LIKE mseg-bwart OBLIGATORY, "MOV Type p_sobkz LIKE mseg-sobkz. "Special Stock SELECTION-SCREEN SKIP 1. SELECTION-SCREEN END OF BLOCK b1. *----------------------------------------------------------------------* * L O A D - O F - P R O G R A M *----------------------------------------------------------------------* LOAD-OF-PROGRAM. *----------------------------------------------------------------------* * I N I T I A L I Z A T I O N *----------------------------------------------------------------------* INITIALIZATION. c_title = 'DYNP_VALUES_UPDATE Demo'. t_bwart-bwart = '322'. t_bwart-sobkz = ''. t_bwart-rmtxt = 'Unrest. Use > QI (WH stock)'. APPEND t_bwart. t_bwart-bwart = '344'. t_bwart-sobkz = 'K'. t_bwart-rmtxt = 'Unrest. Use > Blocked (Consignment)'. APPEND t_bwart. t_bwart-bwart = '321'. t_bwart-sobkz = ''. t_bwart-rmtxt = 'QI > to Unrest. Use (WH stock)'. APPEND t_bwart. t_bwart-bwart = '350'. t_bwart-sobkz = 'E'. t_bwart-rmtxt = 'QI > Blocked (SO stock)'. APPEND t_bwart. t_bwart-bwart = '350'. t_bwart-sobkz = 'K'. t_bwart-rmtxt = 'QI > Blocked (Consignment)'. APPEND t_bwart. *----------------------------------------------------------------------* * A T S E L E C T I O N - S C R E E N *----------------------------------------------------------------------* AT SELECTION-SCREEN. "ON VALUE-REQUEST FOR P_LAYOUT. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_bwart. DATA l_selfield TYPE slis_selfield. DATA: wa_fcat TYPE slis_fieldcat_alv, fcat TYPE slis_t_fieldcat_alv. "Field Cat. for Error Message Display CLEAR wa_fcat. wa_fcat-row_pos = '1'. wa_fcat-col_pos = '1'. wa_fcat-fieldname = 'BWART'. wa_fcat-tabname = 'T_BWART'. wa_fcat-seltext_m = 'Movement'. wa_fcat-outputlen = 5. APPEND wa_fcat TO fcat. CLEAR wa_fcat. wa_fcat-row_pos = '1'. wa_fcat-col_pos = '2'. wa_fcat-fieldname = 'SOBKZ'. wa_fcat-tabname = 'T_BWART'. wa_fcat-seltext_m = 'Spec.Stk.'. wa_fcat-outputlen = 5. APPEND wa_fcat TO fcat. CLEAR wa_fcat. wa_fcat-row_pos = '1'. wa_fcat-col_pos = '3'. wa_fcat-fieldname = 'RMTXT'. wa_fcat-tabname = 'T_BWART'. wa_fcat-seltext_m = 'Description'. wa_fcat-outputlen = 50. APPEND wa_fcat TO fcat. CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT' EXPORTING i_selection = 'X' i_zebra = 'X' it_fieldcat = fcat i_tabname = 'T_BWART' * I_CHECKBOX_FIELDNAME = 'CHECKBOX' IMPORTING es_selfield = l_selfield TABLES t_outtab = t_bwart. IF l_selfield-tabindex GT 0. CLEAR w_bwart. READ TABLE t_bwart INDEX l_selfield-tabindex INTO w_bwart. IF w_bwart-bwart IS NOT INITIAL. DATA: ltab_fields LIKE dynpread OCCURS 0 WITH HEADER LINE. DATA: lc_dyname LIKE sy-repid. DATA: lc_dynumb LIKE sy-dynnr. lc_dyname = sy-repid. lc_dynumb = sy-dynnr. ltab_fields-fieldname = 'P_BWART'. ltab_fields-fieldvalue = w_bwart-bwart. APPEND ltab_fields. ltab_fields-fieldname = 'P_SOBKZ'. ltab_fields-fieldvalue = w_bwart-sobkz. APPEND ltab_fields. CALL FUNCTION 'DYNP_VALUES_UPDATE' EXPORTING dyname = lc_dyname dynumb = lc_dynumb TABLES dynpfields = ltab_fields EXCEPTIONS OTHERS = 8. ENDIF. ENDIF. http://w1ng.hk/dynp_values_update-update-selection/
REPORT Z_XTT_FILE_BROWSER. DATA: V_FILE_PATH TYPE STRING, V_DIR_PATH TYPE STRING. PARAMETERS: P_FILE TYPE RLGRAP-FILENAME DEFAULT 'C:\' OBLIGATORY, P_DIR TYPE RLGRAP-FILENAME DEFAULT 'C:\' OBLIGATORY. SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001. PARAMETERS: RB_FILE RADIOBUTTON GROUP GR1 DEFAULT 'X', RB_DIR RADIOBUTTON GROUP GR1. SELECTION-SCREEN END OF BLOCK B1. AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE. PERFORM FRM_GET_FILE_PATH. AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_DIR. PERFORM FRM_GET_DIR_PATH. FORM FRM_GET_FILE_PATH. DATA: LIT_FILES TYPE FILETABLE, LWA_FILE TYPE FILE_TABLE, V_RC TYPE I. CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG EXPORTING WINDOW_TITLE = 'Select File' DEFAULT_EXTENSION = '*.*' MULTISELECTION = ABAP_FALSE CHANGING FILE_TABLE = LIT_FILES RC = V_RC EXCEPTIONS FILE_OPEN_DIALOG_FAILED = 1 CNTL_ERROR = 2 ERROR_NO_GUI = 3 NOT_SUPPORTED_BY_GUI = 4 OTHERS = 5. IF SY-SUBRC = 0 AND V_RC = 1. READ TABLE LIT_FILES INTO LWA_FILE INDEX 1. IF SY-SUBRC = 0. P_FILE = LWA_FILE-FILENAME. ENDIF. ENDIF. ENDFORM. FORM FRM_GET_DIR_PATH. DATA: V_DIR TYPE STRING. CALL METHOD CL_GUI_FRONTEND_SERVICES=>DIRECTORY_BROWSE EXPORTING WINDOW_TITLE = 'Select Directory' INITIAL_FOLDER = 'C:\' CHANGING SELECTED_FOLDER = V_DIR EXCEPTIONS CNTL_ERROR = 1 ERROR_NO_GUI = 2 NOT_SUPPORTED_BY_GUI = 3 OTHERS = 4. IF SY-SUBRC = 0. P_DIR = V_DIR. ENDIF. ENDFORM. START-OF-SELECTION. IF RB_FILE = 'X'. V_FILE_PATH = P_FILE. WRITE: / 'Selected File:', V_FILE_PATH. ELSE. V_DIR_PATH = P_DIR. WRITE: / 'Selected Directory:', V_DIR_PATH. ENDIF. ### 问题: 如何创建一个SAP接口来获取国家特定的数字格式、日期格式和时间格式设置,包括可选的相关描述信息? ### 代码: REPORT ZGET_COUNTRY_FORMATS. TABLES: T005X. TYPES: BEGIN OF TY_COUNTRY_FORMAT, LAND1 TYPE T005X-LAND1, NUMCO TYPE T005X-NUMCO, DATFM TYPE T005X-DATFM, TIMEFM TYPE T005X-TIMEFM, LANDX TYPE T005X-LANDX, DATFMTXT TYPE T005X-DATFMTXT, TIMEFMTXT TYPE T005X-TIMEFMTXT, END OF TY_COUNTRY_FORMAT. DATA: IT_COUNTRY_FORMATS TYPE STANDARD TABLE OF TY_COUNTRY_FORMAT, WA_COUNTRY_FORMAT TYPE TY_COUNTRY_FORMAT. SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001. PARAMETERS: P_LAND1 TYPE T005X-LAND1 OBLIGATORY. SELECT-OPTIONS: S_NUMCO FOR T005X-NUMCO. PARAMETERS: CB_DESC AS CHECKBOX DEFAULT 'X'. SELECTION-SCREEN END OF BLOCK B1. START-OF-SELECTION. PERFORM FRM_GET_COUNTRY_FORMATS. FORM FRM_GET_COUNTRY_FORMATS. SELECT LAND1 NUMCO DATFM TIMEFM LANDX DATFMTXT TIMEFMTXT FROM T005X INTO TABLE IT_COUNTRY_FORMATS WHERE LAND1 = P_LAND1 AND NUMCO IN S_NUMCO. IF CB_DESC = 'X'. LOOP AT IT_COUNTRY_FORMATS INTO WA_COUNTRY_FORMAT. WRITE: / 'Country:', WA_COUNTRY_FORMAT-LAND1, / 'Numeric Format:', WA_COUNTRY_FORMAT-NUMCO, / 'Date Format:', WA_COUNTRY_FORMAT-DATFM, / 'Time Format:', WA_COUNTRY_FORMAT-TIMEFM, / 'Country Name:', WA_COUNTRY_FORMAT-LANDX, / 'Date Format Desc:', WA_COUNTRY_FORMAT-DATFMTXT, / 'Time Format Desc:', WA_COUNTRY_FORMAT-TIMEFMTXT. ENDLOOP. ELSE. LOOP AT IT_COUNTRY_FORMATS INTO WA_COUNTRY_FORMAT. WRITE: / 'Country:', WA_COUNTRY_FORMAT-LAND1, / 'Numeric Format:', WA_COUNTRY_FORMAT-NUMCO, / 'Date Format:', WA_COUNTRY_FORMAT-DATFM, / 'Time Format:', WA_COUNTRY_FORMAT-TIMEFM. ENDLOOP. ENDIF. ENDFORM. 上面代码用了CLASS,把他改成不用CLASS的方法
07-11
<think>嗯,用户遇到了SAP字段RALT_DYNP_STRUC-ANBTR01的格式错误问题。我需要先理解这个字段的用途。ANBTR01通常和金额或数量相关,可能属于结构RALT_DYNP_STRUC的一部分。格式错误常见于数据类型、长度或小数位不匹配。 首先,用户可能是在数据传输或屏幕输入时遇到了问题。比如,输入的值带有错误的符号或小数位超过定义。SAP中的字段属性检查很重要,比如用SE11或SE80查看数据元素,确认字段类型是否为CURR或类似数值类型,长度和小数位数是否符合输入的数据。 然后,程序逻辑方面,可能在转换或赋值时没有正确处理数据类型。例如,使用MOVE或WRITE语句时,如果源字段和目标字段格式不兼容,就会报错。用户需要检查ABAP代码中的相关部分,确保转换正确,比如使用MOVE TO或WRITE TO语句,或者显式转换函数如CL_ABAP_CONV_IN_CE=>TEXT2NUM。 另外,屏幕字段的格式设置也可能影响输入。用户需要检查屏幕元素属性中的格式选项是否正确,比如货币字段的小数位数是否匹配。还有,字典对象的引用是否正确,避免直接使用结构字段而忽略了数据元素的属性。 可能用户没有考虑到的点包括隐式转换的问题,或者字段在结构中的位置导致的数据传输错误。此外,增强或用户出口可能修改了字段行为,需要检查是否有自定义代码影响了该字段。 总结解决步骤:检查数据字典定义,验证程序中的数据处理,检查屏幕格式设置,以及查看是否有隐式转换或自定义代码的问题。最后,测试环境调试可以具体定位错误位置。</think>### SAP RALT_DYNP_STRUC-ANBTR01 字段格式错误解决方案 #### 1. 确认字段定义属性 - **检查数据字典(SE11)** 使用事务码`SE11`查看结构`RALT_DYNP_STRUC`中字段`ANBTR01`的定义: - 数据类型:应为数值类型(如`CURR`货币类型或`QUAN`数量类型) - 长度和小数位:需与输入数据匹配(例如`CURR(13,2)`表示最大13位长度含2位小数) - 引用数据元素:检查关联的数据元素是否包含格式约束[^1] #### 2. 验证输入数据格式 - **输入值合法性检查** 若字段为货币/数值类型: - 输入值不能包含非数字字符(如逗号、货币符号等) - 小数位数必须与字段定义一致(例如`123.45`对应2位小数) - 负数需使用系统配置的符号(通常为`-`) - **ABAP隐式转换处理** 在赋值操作前添加显式类型转换: ```abap DATA: lv_amount TYPE anbtr01. WRITE p_input TO lv_amount LEFT-JUSTIFIED. "强制格式对齐 ``` #### 3. 检查屏幕字段格式 - **屏幕元素属性(DYNP)** 使用事务码`SE51`或`SE80`检查对应屏幕的字段属性: - 格式选项需设置为`CURR`或`QUAN`(与数据字典定义匹配) - 货币/单位字段需关联`SKA1`或`MSEG`等参考表字段 #### 4. 调试定位具体错误点 - **设置断点调试** 在`PAI(PROCESS AFTER INPUT)`模块中添加断点: ```abap FIELD anbtr01 MODULE check_format. "检查字段输入 ``` 使用`/h`启动调试,观察数据传递时的格式转换过程。 #### 5. 特殊场景处理 - **批量数据传输场景** 使用`BDC`或`LSMW`导入时,需在映射字段时指定格式函数: ```abap CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_INTERNAL' EXPORTING currency = 'CNY' amount_external = lv_external IMPORTING amount_internal = ralt_dynp_struc-anbtr01. ``` #### 6. 常见错误对照表 | 错误现象 | 可能原因 | 解决方案 | |---------|---------|---------| | `DYNPRO_FIELD_INCONSISTENT` | 输入值超出长度限制 | 检查数据字典字段长度 | | `NON_NUMERIC_CHARACTER` | 包含字母或特殊符号 | 使用`REPLACE`过滤非数字字符 | | `INCONSISTENT_DECIMALS` | 小数位超限 | 用`ROUND`函数截断数值 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值