Abap 下拉框中的值为';t刷新

Abap 下拉框中的值为';t刷新,abap,dropdownbox,dynpro,Abap,Dropdownbox,Dynpro,我有一个带有两个输入字段的dynpro屏幕: 销售订单编号: 销售订单行n°(在下拉列表中) 我的问题是,在输入不同的销售订单编号后,销售订单行没有刷新。但是,与销售订单行相关的其他输出字段将使用预期数据正确刷新 程序行为: MODULE REFRESH_ALL_FIELDS INPUT. DATA temp_vbeln TYPE VBAK-VBELN. temp_vbeln = VBAK-VBELN. CLEAR: VBAK, VBAP. SELECT VBELN KU

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

  • 销售订单编号:
  • 销售订单行n°(在下拉列表中)
我的问题是,在输入不同的销售订单编号后,销售订单行没有刷新。但是,与销售订单行相关的其他输出字段将使用预期数据正确刷新

程序行为:

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.
文档通风”是“销售订单”。“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.

如何解决此问题?

dynpro流逻辑语句
字段vbak vbeln模块。。。根据请求
仅允许“轻松”更改屏幕字段的值
VBAK-VBELN
,即全局变量
VBAK-VBELN
的值将在两个方向上“传输”,从屏幕传输到ABAP程序,反之亦然

如果要更改另一个屏幕字段,如
VBAP-POSNR
,则必须调用函数模块
DYNP\u VALUES\u 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.
CHAIN.
  FIELD: vbak-vbeln, vbap-posnr.
  MODULE ... ON REQUEST.
ENDCHAIN.
另一种解决方案是声明字段的“链”,然后可以直接在模块内更改这些字段,而无需调用
DYNP\u VALUES\u 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.
CHAIN.
  FIELD: vbak-vbeln, vbap-posnr.
  MODULE ... ON REQUEST.
ENDCHAIN.

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

以下是无需创建dynpro,只需使用纯选择屏幕即可执行的方法:

TYPES: BEGIN OF ty_order,
         vbeln TYPE vbak-vbeln,
         erdat TYPE vbak-erdat,
         netwr TYPE vbak-netwr,
         kunnr TYPE vbak-kunnr,
       END OF ty_order,
       BEGIN OF ty_pos,
         vbeln  TYPE vbap-vbeln,
         posnr  TYPE vbap-posnr,
         matnr  TYPE vbap-matnr,
         arktx  TYPE vbap-arktx,
         kwmeng TYPE vbap-kwmeng,
       END OF ty_pos.

DATA: i_order TYPE TABLE OF ty_order WITH EMPTY KEY,
      i_pos   TYPE TABLE OF ty_pos WITH EMPTY KEY,
      i_aux   TYPE TABLE OF ty_pos WITH EMPTY KEY,
      list    TYPE vrm_values.

PARAMETERS: order    TYPE vbak-vbeln AS LISTBOX VISIBLE LENGTH 80 USER-COMMAND ord,
            position TYPE vbap-posnr AS LISTBOX VISIBLE LENGTH 80 USER-COMMAND art.

INITIALIZATION.
  SELECT vbeln erdat netwr kunnr
    FROM vbak AS ak
    INTO TABLE i_order
   WHERE vbeln = ANY ( SELECT vbeln  FROM vbap WHERE vbeln = ak~vbeln GROUP BY vbeln HAVING COUNT( * ) > 1 ).

  IF i_order IS NOT INITIAL.
    SELECT vbeln posnr matnr arktx kwmeng
      FROM vbap
      INTO TABLE i_pos
       FOR ALL ENTRIES IN i_order
     WHERE vbeln = i_order-vbeln.
  ENDIF.

  LOOP AT i_order INTO DATA(wa).
    APPEND VALUE vrm_value( key = |{ wa-vbeln ALPHA = OUT }| text = |{ wa-erdat DATE = USER }| ) TO list.
  ENDLOOP.

  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id     = 'order'
      values = list.
  CLEAR list.

AT SELECTION-SCREEN.
  CHECK sy-ucomm = 'ORD'.
  CLEAR position.
  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id     = 'position'
      values = list.
  CLEAR list.

AT SELECTION-SCREEN ON order.
  CHECK sy-ucomm = 'ORD' AND order IS NOT INITIAL.
  i_aux = VALUE #( FOR pos IN i_pos WHERE ( vbeln = |{ order ALPHA = IN }| ) ( pos ) ).
  LOOP AT i_aux INTO DATA(aux).
    APPEND VALUE vrm_value( key = |{ aux-posnr ALPHA = OUT }| text = |{ aux-matnr ALPHA = OUT }| ) TO list.
  ENDLOOP.

  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id     = 'position'
      values = list.

order
下拉列表中进行每次选择后,所有与订单相关的数据都将收集到
i_aux
表格中,您可以使用该表格填充输出字段。

最接近的解决方案是根据WA的值更新PAI中的工作区域,并更新PBO中的实际屏幕字段。

能否提供更多详细信息,帮助未来的游客?非常感谢。