首页 > 解决方案 > 下拉框中的值未刷新

问题描述

我有一个带有两个输入字段的 dynpro 屏幕:

我的问题是在输入不同的销售订单 n° 后销售订单行没有刷新。但是,与销售订单行相关的其他输出字段已使用预期数据正确刷新。

程序行为:

文件发泄”是“销售订单”。“ Poste ”是“行号”。 在此处输入图像描述

在此屏幕中,如果我请求销售订单号 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.

我怎样才能解决这个问题 ?

标签: abapdropdownboxdynpro

解决方案


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.

但这需要对两个字段执行相同的代码。


推荐阅读