欢迎来到萧静默的博客

书山有路勤为径,学海无涯苦作舟。

采购订单屏幕增强框做F4帮助时候出不来帮助内容

由于业务需要,在采购订单的行项目做了增强字段,这个增强字段比如取了供应商和采购组织获取相关数据的话,在初次ME21N时候,可以很好的获取到,当保存后,造次打开想修改这个增强字段值内容的话,此时会出现提示没有数据可以选,经debug发现,是因为没有获取到屏幕上的采购组织字段导致。因为在修改状态下,机构数据页签是没被打开过,导致PBO获取不到这个屏幕的数据。

 代码如下:

ASSIGN ('(SAPLMEGUI)MEPO1222-EKORG') TO <EKORG>.   "获取屏幕字段值,SAPLMEGUI程序名,MEPO1222-EKORG屏幕字段值
  ASSIGN ('(SAPLMEGUI)MEPO_TOPLINE-LIFNR') TO <LIFNR>.   "获取屏幕字段值,SAPLMEGUI程序名,MEPO_TOPLINE-SUPERFIELD屏幕字段值
*  ASSIGN ('(SAPLMEGUI)MEPO_TOPLINE-SUPERFIELD') TO <SUPERFIELD>.   "获取屏幕字段值,SAPLMEGUI程序名,MEPO_TOPLINE-SUPERFIELD屏幕字段值
  ASSIGN ('(SAPLMEGUI)MEPO1211-EMATN') TO <EMATN>.   "获取屏幕字段值,SAPLMEGUI程序名,MEPO_TOPLINE-SUPERFIELD屏幕字段值
  ASSIGN ('(SAPLMEGUI)MEPO_TOPLINE-EBELN') TO <EBELN1>.   "获取屏幕字段值,SAPLMEGUI程序名,MEPO_TOPLINE-SUPERFIELD屏幕字段值

  IF <EKORG> IS INITIAL.
    SELECT SINGLE EKORG INTO <EKORG> FROM EKKO WHERE EBELN = <EBELN1>.

  ENDIF.


*    SELECT SINGLE ZDH INTO CI_EKKO-ZDH FROM ZTMM019 WHERE EBELN =  <EBELN> .


*  GET PARAMETER ID 'EKO' FIELD LV_EKORG.

  GV_LIFNR = |{ <LIFNR> ALPHA = OUT }|.

  SELECT * FROM ZTMM022 INTO TABLE @DATA(LT_ZWLXFL)
    WHERE EKORG = @<EKORG> AND LIFNR = @GV_LIFNR AND ZNO < 1.

  IF LT_ZWLXFL IS INITIAL.
    MESSAGE '无可用的数据' TYPE 'I' DISPLAY LIKE 'I'.
    EXIT.
  ENDIF.
  " 调用函数
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      RETFIELD        = 'TYPE_DETAIL' "内表里面的字段
      DYNPPROG        = SY-REPID
      DYNPNR          = SY-DYNNR
      DYNPROFIELD     = 'EKPO_CI-ZWLXFL'  "画面上绑定字段
      VALUE_ORG       = 'S'
*     DISPLAY         = 'F'                  "不可编辑可选择
*     CALLBACK_PROGRAM = SY-REPID             "回调程序
*     CALLBACK_FORM   = 'USER_FORM'  "回调函数名
    TABLES
      VALUE_TAB       = LT_ZWLXFL "需要显示帮助的值内表
      RETURN_TAB      = LT_RETURN     " 返回值表
    EXCEPTIONS
      PARAMETER_ERROR = 1
      NO_VALUES_FOUND = 2
      OTHERS          = 3.


  IF SY-SUBRC = 0 AND LT_RETURN IS NOT INITIAL.
    READ TABLE LT_RETURN INTO LS_RETURN INDEX 1.
    IF SY-SUBRC = 0 AND LS_RETURN-FIELDVAL IS NOT INITIAL.
*      SELECT SINGLE TYPE_DETAIL, ZNO, ZGUID FROM ZTMM022 INTO @DATA(LS_001)  WHERE TYPE_DETAIL = @LS_RETURN-FIELDVAL.
      READ TABLE LT_ZWLXFL INTO DATA(LS_ZWLXFL) WITH KEY TYPE_DETAIL = LS_RETURN-FIELDVAL.
      IF SY-SUBRC = 0.
        DATA: LT_DYNP TYPE TABLE OF DYNPREAD,
              LS_DYNP TYPE DYNPREAD.
        " 赋值到屏幕字段

        LS_DYNP-FIELDNAME = 'EKPO_CI-ZWLXFL'.
        LS_DYNP-FIELDVALUE = LS_ZWLXFL-TYPE_DETAIL.
        APPEND LS_DYNP TO LT_DYNP.
        CLEAR:LS_DYNP.

        LS_DYNP-FIELDNAME = 'EKPO_CI-ZNO'.
        IF LS_ZWLXFL-ZNO = 0.
          LS_DYNP-FIELDVALUE = 1.
        ELSE.
          LS_DYNP-FIELDVALUE = LS_ZWLXFL-ZNO.
        ENDIF.
        APPEND LS_DYNP TO LT_DYNP.
        CLEAR:LS_DYNP.

        LS_DYNP-FIELDNAME = 'EKPO_CI-ZGUID'.
        LS_DYNP-FIELDVALUE = LS_ZWLXFL-ZGUID.
        APPEND LS_DYNP TO LT_DYNP.
        CLEAR:LS_DYNP.

        " 更新屏幕字段值
        CALL FUNCTION 'DYNP_VALUES_UPDATE'
          EXPORTING
            DYNAME     = SY-REPID
            DYNUMB     = SY-DYNNR
          TABLES
            DYNPFIELDS = LT_DYNP.
      ENDIF.
    ENDIF.
  ENDIF.
ASSIGN ('(SAPLMEGUI)MEPO1222-EKORG') TO <EKORG>.   "获取屏幕字段值,SAPLMEGUI程序名,MEPO1222-EKORG屏幕字段值
这段代码中,如果屏幕1222没有打开过,则不会取到对应的值,导致
SELECT * FROM ZTMM022 INTO TABLE @DATA(LT_ZWLXFL)
    WHERE EKORG = @<EKORG> AND LIFNR = @GV_LIFNR AND ZNO < 1.
这个SQL会取不到值,最后导致没数据展示,所以后面加了一句,如果为空,则去采购订单里直接取EKORG的值。
另外关于F4函数,也有一个小坑
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      RETFIELD        = 'TYPE_DETAIL' "内表里面的字段
      DYNPPROG        = SY-REPID
      DYNPNR          = SY-DYNNR
      DYNPROFIELD     = 'EKPO_CI-ZWLXFL'  "画面上绑定字段
      VALUE_ORG       = 'S'
*     DISPLAY         = 'F'                  "不可编辑可选择
*     CALLBACK_PROGRAM = SY-REPID             "回调程序
*     CALLBACK_FORM   = 'USER_FORM'  "回调函数名
    TABLES
      VALUE_TAB       = LT_ZWLXFL "需要显示帮助的值内表
      RETURN_TAB      = LT_RETURN     " 返回值表
    EXCEPTIONS
      PARAMETER_ERROR = 1
      NO_VALUES_FOUND = 2
      OTHERS          = 3.
如果
RETFIELD        = 'TYPE_DETAIL' "内表里面的字段
这里面的字段名,在前面的内表LT_ZWLXFL里面没有值的话,后面在return表里的字段FIELDVAL就会没有值,最后导致
READ TABLE LT_ZWLXFL INTO DATA(LS_ZWLXFL) WITH KEY TYPE_DETAIL = LS_RETURN-FIELDVAL.这个获取不到值,呈现的效果是双击内表行,但是这个值不会赋值到屏幕字段框里。
posted @ 2026-05-11 09:48  萧静默  阅读(22)  评论(0)    收藏  举报