abap - 下拉框中的值未刷新
问题描述
我有一个带有两个输入字段的 dynpro 屏幕:
- 销售订单编号
- 销售订单行 n°(在下拉列表中)
我的问题是在输入不同的销售订单 n° 后销售订单行没有刷新。但是,与销售订单行相关的其他输出字段已使用预期数据正确刷新。
程序行为:
在此屏幕中,如果我请求销售订单号 1,订单行 10 保持活动状态并显示在下拉列表中,尽管订单号 1没有行号 10。其他输出字段将使用第 20 行的数据进行更新。如果我选择线订单 20、30 或 70,则值 10 从列表中消失。
dynpro 屏幕字段被命名为它们在 VBAK 和 VBAP 表中的对应字段,因此它们的值会自动从一个复制到另一个。
后面跟注释“将订单行设置为订单中的第一个”的代码似乎不起作用。我希望它用新顺序中的第一个行号替换行号字段的值。
编码:
MODULE REFRESH_ALL_FIELDS INPUT.
DATA temp_vbeln TYPE VBAK-VBELN.
temp_vbeln = VBAK-VBELN.
CLEAR: VBAK, VBAP.
SELECT VBELN KUNNR BSTNK NETWR WAERK
FROM VBAK
INTO CORRESPONDING FIELDS OF VBAK
WHERE VBAK~VBELN = temp_vbeln.
ENDSELECT.
" Fill dropdown list with order line numbers.
TYPE-POOLS VRM.
DATA it_posnr TYPE VRM_VALUES.
REFRESH it_posnr.
SELECT POSNR
FROM VBAP
INTO TABLE it_posnr
WHERE VBAP~VBELN = VBAK-VBELN.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
ID = 'VBAP-POSNR'
VALUES = it_posnr
* EXCEPTIONS
* ID_ILLEGAL_NAME = 1
* OTHERS = 2
.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
" Set order line number as first in the order.
SELECT SINGLE POSNR
FROM VBAP
INTO VBAP-POSNR
WHERE VBAP~VBELN = VBAK-VBELN.
PERFORM REFRESH_ITEM_FIELDS.
ENDMODULE. " REFRESH_ALL_FIELDS INPUT
MODULE REFRESH_ITEM_FIELDS INPUT.
PERFORM REFRESH_ITEM_FIELDS.
ENDMODULE. " REFRESH_ITEM_FIELDS INPUT
FORM REFRESH_ITEM_FIELDS .
SELECT SINGLE MATNR ARKTX KWMENG
FROM VBAP
INTO CORRESPONDING FIELDS OF VBAP
WHERE VBAP~VBELN = VBAK-VBELN
AND VBAP~POSNR = VBAP-POSNR.
ENDFORM. " REFRESH_ITEM_FIELDS
流程逻辑:
PROCESS BEFORE OUTPUT.
PROCESS AFTER INPUT.
FIELD VBAK-VBELN MODULE REFRESH_ALL_FIELDS ON REQUEST.
FIELD VBAP-POSNR MODULE REFRESH_ITEM_FIELDS ON REQUEST.
我怎样才能解决这个问题 ?
解决方案
dynpro flow 逻辑语句FIELD vbak-vbeln MODULE ... ON REQUEST
只允许“轻松”更改屏幕字段VBAK-VBELN
的值,即全局变量的值VBAK-VBELN
将在两个方向“传输”,从屏幕到 ABAP 程序,反之亦然。
如果要更改另一个屏幕字段,例如VBAP-POSNR
,则必须调用功能模块DYNP_VALUES_UPDATE
:
TYPES tt_dynpread TYPE STANDARD TABLE OF dynpread WITH DEFAULT KEY.
DATA(dynpfields) = VALUE ty_dynpread_s(
( fieldname = 'VBAP-POSNR'
fieldvalue = vbap-posnr ) ).
CALL FUNCTION 'DYNP_VALUES_UPDATE'
EXPORTING
dyname = sy-repid
dynumb = sy-dynnr
TABLES
dynpfields = dynpfields
EXCEPTIONS
OTHERS = 8.
另一种解决方案是声明一个“链”字段,然后您可以直接在模块内更改这些字段而无需调用DYNP_VALUES_UPDATE
:
CHAIN.
FIELD: vbak-vbeln, vbap-posnr.
MODULE ... ON REQUEST.
ENDCHAIN.
但这需要对两个字段执行相同的代码。
推荐阅读
- php - Yii 1.0:如何知道renderPartial是成功还是失败
- c - 即使在三元运算符中给出的左值很好,赋值语句也会出错
- aspnetboilerplate - 如何定义在单元测试执行期间使用的 Abp 语言?
- ruby-on-rails - 何时执行 ActiveRecord 查询?
- ruby-on-rails - Net::OpenTimeout 执行在 Action Mailer Ruby on Rails 5 中过期
- django - django admin 中选择字段的可搜索下拉菜单
- javascript - 在不同的 HTML 标记中显示 javascript 多维数组
- java - Java合并排序递归奇怪
- c - 如何在c中使用数组打开文件
- security - 通过命令行安全地发送密码而不暴露在 ps/wmic (Windows,Unix) 中