SELECTION-SCREEN选择界面字段值的实时获取-函数DYNP_VALUES_READ

项目中ABAP程序会遇到一种需求:实时获取屏幕字段的值。如下图所示:

根据销售组织/分销渠道/产品组来限制凭证类型的选择,类似与系统VA01操作。因为存在大量的必输字段,导致一个问题:只有把所有的必输字段维护完成之后,程序才会经过AT SELECTION-SCREEN的节点,但是实际的业务需求:未维护完整其他必输的情况下,也可以约束到凭证类型的选择范围。

为此,我们首先采用了MEMORY ID的方法,即想把销售组织/分销渠道/产品组3个字段维护的值写入到内存中,但是实际操作发现,必输字段没有维护完整,这些值无法写入内存。

因为和VA01的操作类似,通过调试系统标准程序,发现如下代码段和函数:

   DATA: DA_AUART LIKE VBAK-AUART,
          DA_BEZEI LIKE TVAKT-BEZEI.

    DATA: BEGIN OF DYNPFIELDS OCCURS 5.
            INCLUDE STRUCTURE DYNPREAD.
    DATA: END OF DYNPFIELDS.

    MOVE 'VBAK-VKORG' TO DYNPFIELDS-FIELDNAME.
    APPEND DYNPFIELDS.
    MOVE 'VBAK-VTWEG' TO DYNPFIELDS-FIELDNAME.
    APPEND DYNPFIELDS.
    MOVE 'VBAK-SPART' TO DYNPFIELDS-FIELDNAME.
    APPEND DYNPFIELDS.

    CALL FUNCTION 'DYNP_VALUES_READ'
         EXPORTING
              DYNAME               = SY-CPROG
              DYNUMB               = SY-DYNNR
         TABLES
              DYNPFIELDS           = DYNPFIELDS
         EXCEPTIONS
              INVALID_ABAPWORKAREA = 01
              INVALID_DYNPROFIELD  = 02
              INVALID_DYNPRONAME   = 03
              INVALID_DYNPRONUMMER = 04
              INVALID_REQUEST      = 05
              NO_FIELDDESCRIPTION  = 06
              UNDEFIND_ERROR       = 07.

    IF SY-SUBRC EQ 0. "nur falls Transport-Felder im Dynpro existieren

      READ TABLE DYNPFIELDS WITH KEY 'VBAK-VKORG'.
      IF SY-SUBRC = 0.
        VBAK-VKORG = DYNPFIELDS-FIELDVALUE.
      ENDIF.

      READ TABLE DYNPFIELDS WITH KEY 'VBAK-SPART'.
      IF SY-SUBRC = 0.
        VBAK-SPART = DYNPFIELDS-FIELDVALUE.
      ENDIF.

      READ TABLE DYNPFIELDS WITH KEY 'VBAK-VTWEG'.
      IF SY-SUBRC = 0.
        VBAK-VTWEG = DYNPFIELDS-FIELDVALUE.
      ENDIF.

    ENDIF.

    CALL FUNCTION 'RV_HELP'
         EXPORTING
              KEY            = VBAK-VKORG
              KEY2           = VBAK-VTWEG
              KEY3           = VBAK-SPART
              KEY4           = T180-TRVOG
              NUMBER         = '008'
              TRTYP          = T185F-TRTYP
              FIELD_IN       = VBAK-AUART
              DESCRIPTION_IN = TVAKT-BEZEI
         IMPORTING
              FIELD          = DA_AUART
              DESCRIPTION    = DA_BEZEI.

    IF DA_AUART IS INITIAL. " Anwender hat F4-Hilfe abgebrochen
        DA_AUART   = TVAKT-AUART.
        DA_BEZEI   = TVAKT-BEZEI.
        VBAK-AUART = DA_AUART.
    ENDIF.
* Ermitteln der Anzeigeart für die Auftragsart (Anzeigen/Ändern)
    REFRESH DYNPFIELDS.
    CLEAR DYNPFIELDS.
    MOVE 'VBAK-AUART' TO DYNPFIELDS-FIELDNAME.
    APPEND DYNPFIELDS.

    CALL FUNCTION 'DYNP_VALUES_READ'
         EXPORTING
              DYNAME               = SY-CPROG
              DYNUMB               = SY-DYNNR
         TABLES
              DYNPFIELDS           = DYNPFIELDS
         EXCEPTIONS
              INVALID_ABAPWORKAREA = 01
              INVALID_DYNPROFIELD  = 02
              INVALID_DYNPRONAME   = 03
              INVALID_DYNPRONUMMER = 04
              INVALID_REQUEST      = 05
              NO_FIELDDESCRIPTION  = 06
              UNDEFIND_ERROR       = 07.

    READ TABLE DYNPFIELDS WITH KEY 'VBAK-AUART'.
    IF DYNPFIELDS-FIELDINP <> SPACE.
*   Auftragsart ist zur Eingabe offen
      VBAK-AUART  = DA_AUART.
      TVAKT-AUART = DA_AUART.
      TVAKT-BEZEI = DA_BEZEI.
    ENDIF.

    REFRESH DYNPFIELDS.
    CLEAR DYNPFIELDS.

 

通过对上述方法进行分析,总结如下解决方法:

手工对选择字段“凭证类型”P_AUART创建一个搜索帮助,如下所示

SELECT-OPTIONS:s_vkorg FOR vbak-vkorg NO-DISPLAY,
               s_vtweg FOR vbak-vtweg NO-DISPLAY,
               s_spart FOR vbak-spart NO-DISPLAY.

 

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_auart.
  DATA ls_auart LIKE help_info-dynprofld.
  "获取销售凭证类型的搜索帮助内容
  PERFORM frm_auart_f4.

  ls_auart = 'P_AUART'.
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield    = 'AUART'
      value_org   = 'S'
      dynprofield = ls_auart
      dynpprog    = sy-repid
      dynpnr      = sy-dynnr
    TABLES
      value_tab   = it_auart.

 

*&---------------------------------------------------------------------*
*&      Form  FRM_AUART_F4
*&---------------------------------------------------------------------*
*       获取销售凭证类型的搜索帮助内容
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_AUART_F4 .

  DATA: BEGIN OF DYNPFIELDS OCCURS 5.
          INCLUDE STRUCTURE DYNPREAD.
  DATA: END OF DYNPFIELDS.

  MOVE 'P_VKORG' TO DYNPFIELDS-FIELDNAME.
  APPEND DYNPFIELDS.
  MOVE 'P_VTWEG' TO DYNPFIELDS-FIELDNAME.
  APPEND DYNPFIELDS.
  MOVE 'P_SPART' TO DYNPFIELDS-FIELDNAME.
  APPEND DYNPFIELDS.

  CALL FUNCTION 'DYNP_VALUES_READ'
    EXPORTING
      DYNAME               = SY-CPROG
      DYNUMB               = SY-DYNNR
    TABLES
      DYNPFIELDS           = DYNPFIELDS
    EXCEPTIONS
      INVALID_ABAPWORKAREA = 01
      INVALID_DYNPROFIELD  = 02
      INVALID_DYNPRONAME   = 03
      INVALID_DYNPRONUMMER = 04
      INVALID_REQUEST      = 05
      NO_FIELDDESCRIPTION  = 06
      UNDEFIND_ERROR       = 07.


  IF SY-SUBRC EQ 0.

    READ TABLE DYNPFIELDS WITH KEY 'P_VKORG'.
    IF SY-SUBRC = 0.
      P_VKORG = DYNPFIELDS-FIELDVALUE.
    ENDIF.

    READ TABLE DYNPFIELDS WITH KEY 'P_SPART'.
    IF SY-SUBRC = 0.
      P_SPART = DYNPFIELDS-FIELDVALUE.
    ENDIF.

    READ TABLE DYNPFIELDS WITH KEY 'P_VTWEG'.
    IF SY-SUBRC = 0.
      P_VTWEG = DYNPFIELDS-FIELDVALUE.
    ENDIF.

  ENDIF.


  CLEAR:s_vkorg[],
        s_vtweg[],
        s_spart[].

  s_vkorg-low = p_vkorg.
  IF s_vkorg-low IS NOT INITIAL.
    s_vkorg-sign = 'I'.
    s_vkorg-option = 'EQ'.
    APPEND s_vkorg.
  ENDIF.

  s_vtweg-low = p_vtweg.
  IF s_vtweg-low IS NOT INITIAL.
    s_vtweg-sign = 'I'.
    s_vtweg-option = 'EQ'.
    APPEND s_vtweg.
  ENDIF.


  s_spart-low = p_spart.
  IF s_spart-low IS NOT INITIAL.
    s_spart-sign = 'I'.
    s_spart-option = 'EQ'.
    APPEND s_spart.
  ENDIF.


  CLEAR:it_auart[],
        it_auart.

  SELECT tvakz~auart
    tvakt~bezei
    INTO CORRESPONDING FIELDS OF TABLE it_auart
    FROM tvakz
    INNER JOIN tvakt
    ON tvakt~auart = tvakz~auart
    WHERE tvakz~vkorg IN s_vkorg
    AND   tvakz~vtweg IN s_vtweg
    AND   tvakz~spart IN s_spart
    AND   tvakt~spras = sy-langu
    .

  SORT it_auart.

  DELETE ADJACENT DUPLICATES FROM it_auart.

ENDFORM.                    " FRM_AUART_F4

 

至此完成,对选择屏幕数据的实时获取!!!

 

 

 

 

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在ABAP Dialog Programming中,可以通过使用控件类型为“下拉列表框”来实现下拉列表的添加。下面是添加下拉列表框的步骤: 1. 在屏幕绘制时,使用函数模块“DYNP_VALUES_READ”读取屏幕字段,然后使用函数模块“DYNP_VALUES_UPDATE”更新字段。 2. 使用“MODULE池”中的模块,如MODULE STATUS_XX,来创建下拉列表框。在该模块中定义下拉列表框的元素,并将其添加到屏幕中。 3. 在PBO(Process Before Output)事件中,使用函数模块“DYNP_VALUES_READ”读取下拉列表框的,并将其设置为屏幕字段的默认。 4. 在PAI(Process After Input)事件中,使用函数模块“DYNP_VALUES_READ”读取下拉列表框的,并将其存储在屏幕字段中。 下面是一个简单的例子,演示如何添加一个下拉列表框: REPORT ztest_program. TABLES: sflight. *定义屏幕字段 SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001. PARAMETERS: p_carrid TYPE sflight-carrid AS LISTBOX VISIBLE LENGTH 10. SELECTION-SCREEN END OF BLOCK b1. *PBO事件 MODULE user_command_0100 OUTPUT. *定义下拉列表框元素 DATA: lt_carrid TYPE TABLE OF sflight-carrid, ls_carrid TYPE sflight-carrid. SELECT carrid UP TO 10 ROWS FROM sflight INTO TABLE lt_carrid. LOOP AT lt_carrid INTO ls_carrid. p_carrid-LOW = ls_carrid-carrid. p_carrid-TEXT = ls_carrid-carrname. APPEND p_carrid. ENDLOOP. ENDMODULE. *PAI事件 MODULE user_command_0100 INPUT. *读取下拉列表框的 DATA: lv_carrid TYPE sflight-carrid. CALL FUNCTION 'DYNP_VALUES_READ' EXPORTING dyname = sy-cprog dynumb = sy-dynnr TABLES dynpfields = p_carrid EXCEPTIONS invalid_abapworkarea = 1 invalid_dynprofield = 2 invalid_dynproname = 3 invalid_dynpronummer = 4 invalid_request = 5 no_fielddescription = 6 invalid_parameter = 7 undefined_error = 8 OTHERS = 9. READ TABLE p_carrid INTO lv_carrid INDEX 1. *将下拉列表框的存储在屏幕字段中 MOVE lv_carrid TO sflight-carrid. ENDMODULE. 在上面的例子中,我们定义了一个下拉列表框,用于选择SFLIGHT表中的航空公司代码。在PBO事件中,我们使用SELECT语句从SFLIGHT表中检索出前10个航空公司代码,并将其添加到下拉列表框中。在PAI事件中,我们使用函数模块“DYNP_VALUES_READ”读取下拉列表框的,并将其存储在SFLIGHT表的CARRID字段中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王小磊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值