2015-08-11 4 views
2

Я пытаюсь использовать функциональный модуль REUSE_ALV_FIELDCATALOG_MERGE для передачи метки поля в ddic для отображения в заголовке столбца отчета alv. Но это не сработало.Как использовать функциональный модуль REUSE_ALV_FIELDCATALOG_MERGE?

Если я комментировать I_STRUCTURE_NAME = 'TY_YNAH_CUS_OBJ_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. 

ответ

3
  1. В REUSE_*ALV* функциональные модули не поддерживаются. Я бы предложил перейти на классы CL_SALV_*. Документация лучше, есть больше примеров программ (DEMO_SALV_*), и вы получаете поддержку.
  2. Вам нужна структура словаря, если вы хотите получить описание полей на основе словаря (duh). Если вы собираете тип структуры на уровне ABAP, используя TYPE ... BEGIN OF ... END OF ..., насколько я знаю, типы словарей для отдельных полей сначала преобразуются в типы ABAP и только затем собираются в тип структуры. Во всяком случае, словарная ссылка исходных полей теряется. Вместо определения структуры выходной таблицы в вашем коде используйте структуру словаря.
0

Существует несколько различных текстовых компонентов, предоставляемых структурой slis_fieldcat_alv, которые используются в качестве меток столбцов. Выбранный текст зависит от текущей ширины столбца (который сам обычно зависит от длины отображаемых данных). Убедитесь, что вы изменили их все соответственно!

Обычная техника: Пройдя I_STRUCTURE_NAME, вы получите каталог полей, соответствующий этой структуре DDIC (параметр изменения ct_fieldcat). Затем вы изменяете эту внутреннюю таблицу в соответствии с вашими потребностями и передаете эту измененную таблицу в REUSE_ALV_GRID_DISPLAY.

В тех случаях, когда я не различаю текстовые версии разного размера, я использую следующие макросы, чтобы установить все текстовые поля на одно и то же значение. Макросы требуют локальной рабочей зоны ls_fieldcat (с отсчитываемым от ct_fieldcat) and a local string variable lv_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. 
2

Вы некоторые ошибки, которые вы, возможно, не известны (SAP очень запутанный иногда и не прозрачен с error- . сообщения) я получил для вас рабочий пример шахты, посмотрите на него, особенно на комментарии

Во-первых, определение данных:.

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. 

это абсолютно необходимо, чтобы вы Defi ne ваша локальная структура напрямую с LIKE, в противном случае анализатор от REUSE_ALV_FIELDCATALOG_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. 

Теперь отображение сетки ALV:

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. 

Обратите внимание, что анализатор также нуждается в макс linesize из 72 символов.