Abap 如何使用REUSE\u ALV\u FIELDCATALOG\u MERGE功能模块?

Abap 如何使用REUSE\u ALV\u FIELDCATALOG\u MERGE功能模块?,abap,alv,function-module,Abap,Alv,Function Module,我试图使用功能模块重用\u ALV\u FIELDCATALOG\u MERGE传递ddic中的字段标签,以显示在ALV报告的列标题中。 但是,这不起作用 如果我注释I\u STRUCTURE\u NAME='TY\u YNAH\u CUS\u OBJ\u REQ'行,它会给出运行时错误状态 ABAP程序行比内部表宽 但是如果我取消注释它,程序仍然无法运行 REPORT YALV_TEST. tables sscrfields. type-pools : sl

我试图使用功能模块
重用\u ALV\u FIELDCATALOG\u MERGE
传递ddic中的字段标签,以显示在ALV报告的列标题中。 但是,这不起作用

如果我注释
I\u STRUCTURE\u NAME='TY\u YNAH\u CUS\u OBJ\u REQ'
行,它会给出运行时错误状态

ABAP程序行比内部表宽

但是如果我取消注释它,程序仍然无法运行

REPORT YALV_TEST.

        tables sscrfields. 
        type-pools : slis.

        "CREATE STRUCTURE -1 
        TYPES: BEGIN OF TY_YNAH_CUS_OBJ_REQ, 
               REQID TYPE YNAH_REQ_ID, 
               REQUESTOR TYPE YNAH_REQUESTOR,
               BUSINESS_OWNER TYPE YNAH_BUS_OWN,
               FUNCTIONAL_OWNER TYPE YNAH_FUNC_OWN, 
               REQNUM TYPE YNAH_SERVICE_REQ_NUM, 
               PROJECT_ID TYPE YNAH_PRO_ID, 
               SYSTEM_ID TYPE YNAH_SYS_ID, 
               FUNCTIONAL_AREA TYPE YNAH_FUNC_AREA,
               REQUEST_DATE TYPE YNAH_REQ_DATE,
               REQUEST_TIME TYPE YNAH_REQ_TIME,

           END OF TY_YNAH_CUS_OBJ_REQ.

        "defining internal table -2 

        DATA: IT_YNAH_CUS_OBJ_REQ type TABLE OF TY_YNAH_CUS_OBJ_REQ 
         * WA_YNAH_CUS_OBJ_REQ type TY_YNAH_CUS_OBJ_REQ.

        DATA: it_fcat TYPE slis_t_fieldcat_alv ,
         wa_fcat TYPE slis_fieldcat_alv,
         gd_layout TYPE slis_layout_alv.

        SELECTION-SCREEN BEGIN OF BLOCK menu WITH FRAME TITLE text-001.
        SELECT-OPTIONS: s_proid FOR IT_YNAH_CUS_OBJ_REQ-PROJECT_ID.
        PARAMETER p_sysid type TY_YNAH_CUS_OBJ_REQ-SYSTEM_ID.
        SELECTION-SCREEN: BEGIN OF LINE,
        pushbutton 33(8) BUT user-command search. 
        SELECTION-SCREEN END OF LINE. 
        SELECTION-SCREEN END OF BLOCK menu.

        initialization. 
        BUT = 'SEARCH'. END-OF-SELECTION.

        "execute search function when user click search button
        at selection-screen. "after processing user input 
         case SSCRFIELDS.
           when 'SEARCH'.
            SSCRFIELDS-UCOMM = 'ONLI'.
        endcase.

    "fetch data using select-4 START-OF-SELECTION. 

    SELECT * 
    FROM YNAH_CUS_OBJ_REQ "Database 
    INTO CORRESPONDING FIELDS OF TABLE IT_YNAH_CUS_OBJ_REQ "Into internal table 
    WHERE 
       PROJECT_ID in s_proid and 
       SYSTEM_ID eq p_sysid.

        CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE' 
        EXPORTING
         I_PROGRAM_NAME = sy-repid
        I_INTERNAL_TABNAME ='TY_YNAH_CUS_OBJ_REQ'
        * I_STRUCTURE_NAME = 'TY_YNAH_CUS_OBJ_REQ'
        * I_CLIENT_NEVER_DISPLAY = 'X'
        I_INCLNAME = sy-repid 
        * I_BYPASSING_BUFFER = 'X' 
        * I_BUFFER_ACTIVE = CHANGING CT_FIELDCAT = it_fcat. 
        * EXCEPTIONS 
        * INCONSISTENT_INTERFACE = 1 
        * PROGRAM_ERROR = 2 
        * OTHERS = 3 
        * .
         IF SY-SUBRC <> 0. 
        ** Implement suitable error handling here 
        ENDIF.
报告YALV_测试。
表sscrfields。
类型:sli。
“创建结构-1
类型:TY_YNAH_CUS_OBJ_REQ开始,
请求ID类型YNAH_请求ID,
请求者类型YNAH_请求者,
企业所有者类型YNAH\U BUS\U OWN,
功能所有者类型YNAH\u FUNC\u OWN,
REQUNUM类型YNAH\u服务\u REQU\u NUM,
项目ID类型YNAH\U PRO\U ID,
系统ID类型YNAH系统ID,
功能区类型YNAH功能区,
请求日期类型YNAH请求日期,
请求时间类型YNAH请求时间,
结束对客户的要求。
“定义内部表-2
数据:TY_YNAH_CUS_OBJ_REQ的IT_YNAH_CUS_OBJ_REQ类型表
*WA_YNAH_CUS_OBJ_REQ类型TY_YNAH_CUS_OBJ_REQ。
数据:类型为slis\U t\U fieldcat\U alv,
wa_fcat型slis_fieldcat_alv,
gd\U布局类型slis\U布局\U alv。
框标题为text-001的块菜单的选择屏幕开始。
SELECT-OPTIONS:s_proid FOR IT_YNAH_CUS_OBJ_REQ-PROJECT_ID。
参数p_sysid type TY_YNAH_CUS_OBJ_REQ-SYSTEM_ID。
选择屏幕:行的开始,
按钮33(8),但用户命令搜索。
选择屏幕结束行。
选择块菜单的屏幕末端。
初始化。
但是='搜索'。选择结束。
“当用户单击搜索按钮时,执行搜索功能
在选择屏幕上。”处理用户输入后
案例研究领域。
当“搜索”时。
SSCRFIELDS-UCOMM='ONLI'。
尾声。
“使用select-4开始选择获取数据。
选择*
来自YNAH_CUS_OBJ_REQ“数据库
在表的相应字段中,将“IT_YNAH_CUS_OBJ_REQ”放入内部表
哪里
s_proid中的项目ID和
系统ID eq p系统ID。
调用函数“重用\u ALV\u字段目录\u合并”
出口
I_PROGRAM_NAME=sy repid
I_INTERNAL_TABNAME='TY_YNAH_CUS_OBJ_REQ'
*I_结构_名称='TY_YNAH_CUS_OBJ_REQ'
*I\u客户端\u从不\u显示='X'
I_INCLNAME=sy repid
*I_绕过_缓冲区='X'
*I_BUFFER_ACTIVE=更改CT_FIELDCAT=it_fcat。
*例外情况
*接口不一致=1
*程序错误=2
*其他=3
* .
如果SY-SUBRC为0。
**在这里实现适当的错误处理
恩迪夫。
  • REUSE\u*ALV*
    功能模块不受支持。我建议切换到
    CL\u SALV*
    类。文档更好,有更多的示例程序(
    DEMO\u SALV*
    ),您可以获得支持
  • 如果要获取基于字典的字段描述(duh),则需要字典结构。如果您使用
    type…BEGIN OF…END OF…
    在ABAP级别组装结构类型,据我所知,各个字段的字典类型将首先转换为ABAP类型,然后才组装为结构类型。无论如何,原始字段的字典引用将丢失。而不是定义结构对于代码中的输出表,请使用字典结构

  • structure
    slis\u fieldcat\u alv
    提供了几个不同的文本组件,用作列标签。所选文本取决于当前列宽(其本身通常取决于所显示数据的长度)。请确保对它们进行相应的更改

    通常的技术是:通过传递
    I\u结构\u名称
    ,您将获得与此DDIC结构相对应的字段目录(更改参数
    ct\u fieldcat
    )。然后根据需要修改此内部表,并将修改后的表传递到
    重用ALV网格\u显示器

    如果我没有区分不同大小的文本版本,我会使用以下宏将所有文本字段设置为相同的值。这些宏需要一个本地工作区
    ls\u fieldcat
    (线型为
    ct\u fieldcat)和一个本地字符串变量
    lv\u text`才能工作

    define set_field.
    * Feld &1 für Anzeigefeld &2 den Wert &3 zuweisen
      ls_fieldcat-&1 = &3.
      modify ct_fieldcat from ls_fieldcat
        transporting &1
        where fieldname cp '&2'.
    end-of-definition.
    
    define set_text_direct.
      lv_text = &2.
      set_field seltext_s &1 lv_text.
      lv_text = &2.
      set_field seltext_m &1 lv_text.
      lv_text = &2.
      set_field seltext_l &1 lv_text.
    end-of-definition.
    

    您可能有一些不知道的错误(SAP有时非常混乱) 我给你举了一个我的工作示例,看看它,尤其是评论

    首先,数据定义:

    TYPE-POOLS slis. "import you need for REUSE_ALV_FIELDCATALOG_MERGE
    
    DATA:
      lt_fieldcat TYPE slis_t_fieldcat_alv,
    
      BEGIN OF G_IT_MATERIAL occurs 0,
        MATNR LIKE MARA-MATNR,
        MTART LIKE MARA-MTART,
        MAKTX_DE LIKE MAKT-MAKTX,
        MAKTX_FR LIKE MAKT-MAKTX,
        MAKTX_IT LIKE MAKT-MAKTX,
        ERNAM LIKE MARA-ERNAM,
        ERSDA LIKE MARA-ERSDA,
        LAEDA LIKE MARA-LAEDA,
      END OF G_IT_MATERIAL.
    
    绝对有必要直接使用
    一样定义本地结构,否则
    重用\u ALV\u FIELDCATALOG\u MERGE
    中的解析器将找不到它

    选择您的资料:

     SELECT ma~matnr ma~mtart ma~ernam ma~ersda ma~laeda
     de~maktx as maktx_de fr~maktx as maktx_fr it~maktx as maktx_it
     FROM mara as ma
     LEFT JOIN MAKT as de ON de~matnr = ma~matnr AND de~spras = 'DE'
     LEFT JOIN MAKT as fr ON fr~matnr = ma~matnr AND fr~spras = 'FR'
     LEFT JOIN MAKT as it ON it~matnr = ma~matnr AND it~spras = 'IT'
     INTO CORRESPONDING FIELDS OF TABLE g_it_material
          WHERE ...
    
    动态创建字段目录:

    CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
    I_PROGRAM_NAME        = sy-repid
    
    I_INTERNAL_TABNAME    = 'G_IT_MATERIAL'
    
    I_INCLNAME            = sy-repid
    CHANGING
    ct_fieldcat            = lt_fieldcat
    EXCEPTIONS
    inconsistent_interface = 1
    program_error          = 2
    OTHERS                 = 3.
    
    IF sy-subrc <> 0.
    * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    *         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.
    
    注意,解析器还需要最大行大小为72个字符

    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
    it_fieldcat   = lt_fieldcat                 "you could also give a structure
    "i_structure_name      = 'ZMM_SMATERIAL'    "here instead of the fieldcat
    TABLES
    t_outtab      = g_it_material
    EXCEPTIONS
    program_error = 1
    OTHERS        = 2.