【问题标题】:Value in dropdown box isn't refreshed下拉框中的值未刷新
【发布时间】:2020-10-02 14:14:52
【问题描述】:

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

  • 销售订单编号
  • 销售订单行 n°(在下拉列表中)

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

程序行为:

Document vente”是“销售订单”。 “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.

我该如何解决这个问题?

【问题讨论】:

    标签: abap dropdownbox dynpro


    【解决方案1】:

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

    【讨论】:

    • 您能否提供更多详细信息,以帮助未来的访客?谢谢。
    【解决方案2】:

    以下是无需创建 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 表中,您可以使用该表来填充输出字段。

    【讨论】:

      【解决方案3】:

      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.
      

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

      【讨论】:

        猜你喜欢
        • 2012-03-11
        • 2011-09-29
        • 2014-08-08
        • 1970-01-01
        • 1970-01-01
        • 2013-11-23
        • 1970-01-01
        • 2016-01-08
        • 2012-01-01
        相关资源
        最近更新 更多