Статус серийного номера на дату (YUUK_STORE_SERNR_ON_DAY)

Автор Uukrul, Жовтень 29, 2009, 02:38:11 ПП

Попередня тема - Наступна тема

0 Користувачі і 1 Гість дивляться цю тему.

Uukrul

YUUK_STORE_SERNR_ON_DAY - Программа определения статуса серийных номеров на дату, в общем то в стандарте такой программы вроде как нет, а тут понадобилось типа, а был ли на заданную дату серийный номер на складе или был списан или... короче в каком состоянии находился. Для одного серийного номера оно конечно не вопрос зайти в историю, а вот если их много, то задача уже переходи в разряд интеллектуальных  :D. Так что типа вот довел ее до ума, серийные можно как задавать в диалоге, так и загружать из файла.

Программа состоит из двух модулей: REPORT yuuk_store_sernr_on_day, сама программа и вспомогательный модуль YUUK_STORE_SERNR_ON_DAY_ALV - вся обработка ALV-таблицы

*&**********************************************************************
*& Comments    : Список нахождения серийных номеров на дату
*& Platform    : SAP R/3 V4.6A or later
*& Autor       : Uukrul
*& Date create : 29-10-2009
*& Date change : 29-10-2009
*&**********************************************************************
REPORT yuuk_store_sernr_on_day MESSAGE-ID yy.
TABLES: equi, mara, rlgrap.
TYPE-POOLS: slis.
TYPES     : slis_t_fieldcat_alv TYPE slis_fieldcat_alv OCCURS 1.
CONSTANTS: true(1) TYPE c VALUE 'X',
          false(1) TYPE c VALUE space.
INCLUDE <icon>.
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK block001 WITH FRAME TITLE text-002.
SELECT-OPTIONS: p_matkl FOR mara-matkl,
               p_matnr FOR mara-matnr,
               p_sernr FOR equi-sernr.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS    : p_fl AS CHECKBOX USER-COMMAND fld.
SELECTION-SCREEN COMMENT 3(24) text-011 FOR FIELD p_fl.
SELECTION-SCREEN POSITION 33.
PARAMETERS      p_cfile LIKE rlgrap-filename DEFAULT 'C:\file.txt'
                                            MODIF ID fld.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK block001.
SELECTION-SCREEN SKIP 1.

SELECTION-SCREEN BEGIN OF BLOCK block002 WITH FRAME TITLE text-003.
PARAMETERS    : p_datst LIKE sy-datum,
               p_datum LIKE sy-datum DEFAULT sy-datum OBLIGATORY.
PARAMETERS    : p_all RADIOBUTTON GROUP grp DEFAULT 'X',
               p_sel RADIOBUTTON GROUP grp.
PARAMETERS    : p_only_t AS CHECKBOX,
               p_only_s AS CHECKBOX,
               p_only_h AS CHECKBOX,
               p_onl_sd AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK block002.

SELECTION-SCREEN BEGIN OF BLOCK block004 WITH FRAME TITLE text-010.
PARAMETERS: p_chkst AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK block004.

SELECTION-SCREEN BEGIN OF BLOCK block003 WITH FRAME TITLE text-004.
PARAMETERS: alv_def LIKE disvariant-variant.
SELECTION-SCREEN END OF BLOCK block003.

************************************************************************
DATA: p_test LIKE bapi2017_gm_gen-testrun VALUE 'X'.

DATA: BEGIN OF gt_equi OCCURS 10,
 sel(1) TYPE c,
 numpos LIKE sy-tabix,
 idx LIKE sy-tabix,
 tbwart(1) TYPE c,
 equnr LIKE equi-equnr,    "Номер единицы оборудования
 sernr LIKE equi-sernr,    "Серийный номер
 matnr LIKE equi-matnr,    "Код материала
 taser LIKE objk-taser,    "Таблица списка истории
 matkl LIKE mara-matkl,    "Группа материала
 maktx LIKE makt-maktx.    "Краткий текст материала
       INCLUDE STRUCTURE rserxx.
DATA:
 sernr_icon(4) TYPE c,
 sernr_stat(25) TYPE c,
 store_icon(4) TYPE c,
END OF gt_equi.

DATA: g_count        TYPE i,
     alv_variant    LIKE disvariant,
     fieldcat       TYPE slis_t_fieldcat_alv,
     fieldcat_ln    LIKE LINE OF fieldcat,
     sortcat        TYPE slis_t_sortinfo_alv,
     sortcat_ln     LIKE LINE OF sortcat,
     e_user_command TYPE slis_formname VALUE 'USER_COMMAND',
     er_events      TYPE slis_t_event,
     er_list_top_of_page TYPE slis_t_listheader,
     layout         TYPE slis_layout_alv.

DATA: BEGIN OF gt_file OCCURS 1000,
* Данные для преобразовани
sernr LIKE equi-sernr,
END OF gt_file.

************************************************************************
DEFINE ext_to_int.
 call function 'CONVERSION_EXIT_ALPHA_INPUT'
      exporting
           input  = &1
      importing
           output = &2.
END-OF-DEFINITION.

************************************************************************

************************************************************************
*                          START-OF-SELECTION
************************************************************************
START-OF-SELECTION.
 CLEAR: gt_equi[].

 PERFORM read_equi.
 PERFORM write_list_alv.

*&**********************************************************************
AT SELECTION-SCREEN OUTPUT.
 LOOP AT SCREEN.
   IF screen-group1 = 'FLD'.
     IF p_fl = false.
       screen-input = '0'.
       screen-output = '0'.
       screen-invisible = '1'.
     ENDIF.
   ENDIF.
   MODIFY SCREEN.
 ENDLOOP.

*&**********************************************************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_cfile.
 CLEAR rlgrap-filename.
 CALL FUNCTION 'WS_FILENAME_GET'
      EXPORTING
           def_filename     = rlgrap-filename
           def_path         = 'C:\'
           mask             = ',*.*,*.*.'
           mode             = '0'
      IMPORTING
           filename         = rlgrap-filename
      EXCEPTIONS
           inv_winsys       = 01
           no_batch         = 02
           selection_cancel = 03
           selection_error  = 04.
 IF rlgrap-filename <> space. p_cfile = rlgrap-filename. ENDIF.

************************************************************************
*                AT SELECTION-SCREEN ON VALUE-REQUEST
************************************************************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR alv_def.
 alv_variant-report = sy-repid.
 CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
      EXPORTING
           is_variant = alv_variant
           i_save     = 'A'
      IMPORTING
           es_variant = alv_variant
      EXCEPTIONS
           not_found  = 2.
 IF sy-subrc = 2.
   MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
           WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
 ELSE.
   alv_def = alv_variant-variant.
 ENDIF.

************************************************************************
*&---------------------------------------------------------------------*
*&      Form  read_matnr_custom
*&---------------------------------------------------------------------*
*       Читает список материалов для ручной обработки
*----------------------------------------------------------------------*
*      -->P_I_MATNR = Список материалов
*      -->P_P_WERKS = Код обрабатываемого завода
*----------------------------------------------------------------------*
FORM read_equi.
 RANGES: lr_obknr FOR gt_equi-obknr.
 DATA: l_count LIKE sy-tabix,
       ls_equi LIKE gt_equi,
       l_clabs LIKE mchb-clabs,
       tabix_equi LIKE sy-tabix,
       lt_serxx LIKE rserxx OCCURS 1 WITH HEADER LINE,
       ls_serxx LIKE rserxx.

 CLEAR: gt_equi[].

* Данные из файла
 IF p_fl = true.
   CALL FUNCTION 'WS_UPLOAD'
        EXPORTING
             filename                = p_cfile
             filetype                = 'DAT'
        IMPORTING
             filelength              = l_count
        TABLES
             data_tab                = gt_file
        EXCEPTIONS
             conversion_error        = 1
             file_open_error         = 2
             file_read_error         = 3
             invalid_type            = 4
             no_batch                = 5
             unknown_error           = 6
             invalid_table_width     = 7
             gui_refuse_filetransfer = 8
             customer_error          = 9
             OTHERS                  = 10.
 ENDIF.

 DO.
   DESCRIBE TABLE gt_file LINES l_count.
   IF l_count > 0.
     CLEAR: p_sernr[], p_sernr.
     p_sernr-sign = 'I'. p_sernr-option = 'EQ'.
     DO 1000 TIMES.
       READ TABLE gt_file INDEX 1.
       IF sy-subrc <> 0. EXIT. ENDIF.
       ext_to_int gt_file-sernr p_sernr-low.
       APPEND p_sernr.
       DELETE gt_file INDEX 1.
     ENDDO.
   ENDIF.

   SELECT eq~equnr    "Номер единицы оборудования
          eq~sernr    "Серийный номер
          eq~matnr    "Код материала
          ob~obknr    "Номер списка объектов
          ob~datum    "Дата операции
          ob~taser    "Таблица списка истории
          ma~matkl    "Группа материала
   APPENDING CORRESPONDING FIELDS OF TABLE gt_equi
   FROM equi AS EQ
       JOIN objk AS ob ON ob~equnr = eq~equnr
       JOIN mara AS ma ON ma~matnr = eq~matnr
   WHERE eq~sernr IN p_sernr AND
         eq~matnr IN p_matnr AND
         ob~datum >= p_datst AND ob~datum <= p_datum AND
         ma~matkl IN p_matkl
   ORDER BY EQ~EQUNR ob~obknr EQ~SERNR eq~matnr.

   DESCRIBE TABLE gt_file LINES l_count.
   IF l_count = 0. EXIT. ENDIF.
 ENDDO.

* Идем по истории каждого серийного номера
 CLEAR: gt_equi. APPEND gt_equi.
 LOOP AT gt_equi.
   AT FIRST.
*     Первый вход в цикл подготовить таблицу объектов
     CLEAR: lr_obknr[], tabix_equi.
     lr_obknr-sign = 'I'. lr_obknr-option = 'EQ'.
   ENDAT.

   ON CHANGE OF gt_equi-equnr.
*     Если произошло изменение ЕО, тогда обработать накопленные данные
     DESCRIBE TABLE lr_obknr LINES l_count.
     IF l_count > 0.
*       Обработать список объектов для LS_EQUI
       CLEAR: lt_serxx.
       CASE ls_equi-taser.
         WHEN 'SER02' OR 'SER07' OR 'SER08'.
           SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_serxx
           FROM (ls_equi-taser)
           WHERE obknr IN lr_obknr
           ORDER BY DATUM descending
                    OBKNR descending.
         WHEN OTHERS.
           SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_serxx
           FROM (ls_equi-taser)
           WHERE obknr IN lr_obknr
           ORDER BY DATUM descending
                    UZEIT descending
                    obknr DESCENDING.
       ENDCASE.

*       Последняя операция с серийным номером, будет первой в списке
       READ TABLE lt_serxx INDEX 1.
       IF sy-subrc = 0.
         MOVE-CORRESPONDING lt_serxx TO ls_equi.
         ls_equi-sel = true.
         READ TABLE lt_serxx INDEX 2.
         IF sy-subrc = 0 AND
            lt_serxx-datum = ls_equi-datum AND
            lt_serxx-uzeit = ls_equi-uzeit AND
            lt_serxx-bwart = ls_equi-bwart.
           ls_equi-tbwart = 'T'.
         ELSE.
           ls_equi-tbwart = ls_equi-shkzg.
         ENDIF.
       ELSE.
         ls_equi-sel = 'U'.
       ENDIF.
       MODIFY gt_equi FROM ls_equi INDEX tabix_equi.
       CLEAR: lr_obknr[].
     ENDIF.
   ENDON.

*   Накопление списка объектов для обработки
   ls_equi = gt_equi.
   tabix_equi = tabix_equi + 1.
   lr_obknr-low = ls_equi-obknr.
   APPEND lr_obknr.
 ENDLOOP.

 DELETE gt_equi WHERE sel = false.
 IF p_sel = true.
   IF p_only_t = false. DELETE gt_equi WHERE tbwart = 'T'. ENDIF.
   IF p_only_s = false. DELETE gt_equi WHERE tbwart = 'S'. ENDIF.
   IF p_only_h = false. DELETE gt_equi WHERE tbwart = 'H'. ENDIF.
   IF p_onl_sd = false.
     DELETE gt_equi WHERE tbwart = space AND
                          vbtyp = 'J' AND
                          vorgang = 'SDLS'.
   ENDIF.
 ENDIF.
* Прочатать дополнительные данные к серийным номерам
 LOOP AT gt_equi.
   gt_equi-numpos = sy-tabix.
   gt_equi-idx = '1'.
   gt_equi-sel = false.
*   Проверить данные запаса по складу
   IF p_chkst = true.
     IF gt_equi-charge <> space AND gt_equi-werk <> space AND
        gt_equi-lagerort <> space.
       SELECT SINGLE clabs INTO (l_clabs)
       FROM mchb
       WHERE matnr = gt_equi-matnr AND
             werks = gt_equi-werk AND
             lgort = gt_equi-lagerort AND
             charg = gt_equi-charge.
     ELSEIF gt_equi-charge = space AND gt_equi-werk <> space AND
            gt_equi-lagerort <> space.
       SELECT SINGLE labst INTO (l_clabs)
       FROM mard
       WHERE matnr = gt_equi-matnr AND
             werks = gt_equi-werk AND
             lgort = gt_equi-lagerort.
     ENDIF.
     IF l_clabs > 0.
       gt_equi-store_icon = icon_store_location.
     ELSE.
       gt_equi-store_icon = icon_incomplete.
     ENDIF.
   ENDIF.

*   Краткий текст описания материала
   READ TABLE gt_equi INTO ls_equi WITH KEY matnr = gt_equi-matnr.
   IF ls_equi-maktx = space.
     SELECT SINGLE maktx INTO (gt_equi-maktx)
     FROM makt WHERE matnr = gt_equi-matnr AND
                     spras = sy-langu.
   ELSE.
     gt_equi-maktx = ls_equi-maktx.
   ENDIF.
*   Статус серийного
   CASE gt_equi-tbwart.
     WHEN 'T'.
       gt_equi-sernr_icon = icon_other_object.
       gt_equi-sernr_stat = text-005.
     WHEN 'S'.
       gt_equi-sernr_icon = icon_positive.
       gt_equi-sernr_stat = text-006.
     WHEN 'H'.
       gt_equi-sernr_icon = icon_negative.
       gt_equi-sernr_stat = text-007.
     WHEN 'U'.
       gt_equi-sernr_icon = icon_message_warning_small.
       gt_equi-sernr_stat = text-008.
     WHEN OTHERS.
       IF gt_equi-vbtyp = 'J' AND gt_equi-vorgang = 'SDLS'.
         gt_equi-sernr_icon = icon_packing.
         gt_equi-sernr_stat = text-009.
       ELSE.
       ENDIF.
   ENDCASE.
   MODIFY gt_equi.
 ENDLOOP.
ENDFORM.                    " read_matnr_custom

************************************************************************
INCLUDE yuuk_store_sernr_on_day_alv.
************************************************************************



*----------------------------------------------------------------------*
*   INCLUDE YUUK_LIST_SERNR_ON_DAY_ALV                                 *
*----------------------------------------------------------------------*
*&**********************************************************************
*& Comments    : Список нахождения серийных номеров на дату
*& Platform    : SAP R/3 V4.6A or later
*& Autor       : Uukrul
*& Date create : 29-10-2009
*& Date change : 29-10-2009
*&**********************************************************************
*&---------------------------------------------------------------------*
*&      Form  write_list_alv
*&---------------------------------------------------------------------*
*       Подготовка данных для вывода через ALV-таблицу
*----------------------------------------------------------------------*
FORM write_list_alv.
 CLEAR  : fieldcat[], sortcat[], er_events[],
          fieldcat_ln, sortcat_ln, er_events.

 PERFORM build_options_alv.
 PERFORM build_fieldcat_alv.
 PERFORM build_sortcat_alv.
 PERFORM build_eventtab_alv USING er_events[].
 PERFORM build_comments_alv.
 PERFORM start_list_viewer_alv.
ENDFORM.                    " write_list_alv

*&---------------------------------------------------------------------*
*&      Form  build_options_alv
*&---------------------------------------------------------------------*
*       Параметры грида по умолчанию
*----------------------------------------------------------------------*
*  <--  LAYOUT - Данные для сетки по умолчанию
*----------------------------------------------------------------------*
FORM build_options_alv.
 layout-colwidth_optimize = true.
 layout-detail_popup      = true.
 layout-box_fieldname      = 'SEL'.
 layout-get_selinfos       = true.
 layout-zebra              = true.
ENDFORM.                    " build_options_alv

*&---------------------------------------------------------------------*
*&      Form  build_fieldcat_alv
*&---------------------------------------------------------------------*
*       Создание полей вывода для ALV-очета
*----------------------------------------------------------------------*
*  <--  FIELDCAT - Список полей ALV-таблицы отчета
*----------------------------------------------------------------------*
FORM build_fieldcat_alv.
 DATA: l_str LIKE fieldcat_ln-seltext_m,
       col_pos TYPE i.

* Группа материала
 col_pos = 1.
 CLEAR: fieldcat_ln.
 fieldcat_ln-ref_tabname = 'MARA'.
 fieldcat_ln-fieldname   = 'MATKL'.
 fieldcat_ln-key         = true.
 fieldcat_ln-do_sum      = true.
 fieldcat_ln-col_pos     = col_pos.
 APPEND fieldcat_ln TO fieldcat.

* Номер строки
 col_pos = col_pos + 1.
 CLEAR: fieldcat_ln.
 fieldcat_ln-ref_tabname   = 'SYST'.
 fieldcat_ln-ref_fieldname = 'TABIX'.
 fieldcat_ln-fieldname   = 'NUMPOS'.
 fieldcat_ln-col_pos     = col_pos.
 fieldcat_ln-ddictxt     = 'L'.
 fieldcat_ln-seltext_l   = '№'.
 fieldcat_ln-seltext_m   = '№ Строки'.
 fieldcat_ln-seltext_s   = 'Номер строки'.
 APPEND fieldcat_ln TO fieldcat.

* Индекс для суммирования
 col_pos = col_pos + 1.
 CLEAR: fieldcat_ln.
 fieldcat_ln-ref_tabname   = 'SYST'.
 fieldcat_ln-ref_fieldname = 'TABIX'.
 fieldcat_ln-fieldname   = 'IDX'.
 fieldcat_ln-no_out      = true.
 fieldcat_ln-col_pos     = col_pos.
 fieldcat_ln-ddictxt     = 'L'.
 fieldcat_ln-seltext_l   = 'Сч'.
 fieldcat_ln-seltext_m   = 'Счетчик'.
 fieldcat_ln-seltext_s   = 'Счетчик для суммирования'.
 APPEND fieldcat_ln TO fieldcat.

* Иконка статуса
 col_pos = col_pos + 1.
 CLEAR: fieldcat_ln.
 fieldcat_ln-fieldname   = 'SERNR_ICON'.
 fieldcat_ln-col_pos     = col_pos.
 fieldcat_ln-icon        = true.
 fieldcat_ln-outputlen = 4.
 fieldcat_ln-ddictxt     = 'L'.
 fieldcat_ln-seltext_l   = 'Ст'.
 fieldcat_ln-seltext_m   = 'Статус'.
 fieldcat_ln-seltext_s   = 'Статус серийного номера'.
 APPEND fieldcat_ln TO fieldcat.

* ЕО
 col_pos = col_pos + 1.
 CLEAR: fieldcat_ln.
 fieldcat_ln-ref_tabname = 'EQUI'.
 fieldcat_ln-fieldname   = 'EQUNR'.
 fieldcat_ln-col_pos     = col_pos.
 fieldcat_ln-hotspot     = true.
 APPEND fieldcat_ln TO fieldcat.

* Код материала
 CLEAR: fieldcat_ln.
 col_pos = col_pos + 1.
 fieldcat_ln-ref_tabname = 'MARA'.
 fieldcat_ln-fieldname   = 'MATNR'.
 fieldcat_ln-col_pos     = col_pos.
 APPEND fieldcat_ln TO fieldcat.

* Серийные номер материала
 col_pos = col_pos + 1.
 CLEAR: fieldcat_ln.
 fieldcat_ln-ref_tabname = 'EQUI'.
 fieldcat_ln-fieldname   = 'SERNR'.
 fieldcat_ln-col_pos     = col_pos.
 fieldcat_ln-hotspot     = true.
 APPEND fieldcat_ln TO fieldcat.

* Наименование материала
 col_pos = col_pos + 1.
 CLEAR: fieldcat_ln.
 fieldcat_ln-ref_tabname = 'MAKT'.
 fieldcat_ln-fieldname   = 'MAKTX'.
 fieldcat_ln-col_pos     = col_pos.
 APPEND fieldcat_ln TO fieldcat.

* Иконка статуса
 col_pos = col_pos + 1.
 CLEAR: fieldcat_ln.
 fieldcat_ln-fieldname   = 'SERNR_STAT'.
 fieldcat_ln-col_pos     = col_pos.
 fieldcat_ln-ddictxt     = 'M'.
 fieldcat_ln-seltext_l   = 'Ст'.
 fieldcat_ln-seltext_m   = 'Статус описание'.
 fieldcat_ln-seltext_s   = 'Статус серийного номера (Описание)'.
 APPEND fieldcat_ln TO fieldcat.


* Код таблици истории
 col_pos = col_pos + 1.
 CLEAR: fieldcat_ln.
 fieldcat_ln-ref_tabname = 'RSERXX'.
 fieldcat_ln-fieldname   = 'TASER'.
 fieldcat_ln-col_pos     = col_pos.
 fieldcat_ln-no_out      = true.
 fieldcat_ln-ddictxt     = 'L'.
 fieldcat_ln-seltext_l   = 'Тбл'.
 fieldcat_ln-seltext_m   = 'ТабИстЗпс'.
 fieldcat_ln-seltext_s   = 'Таблица истории запаса'.
 APPEND fieldcat_ln TO fieldcat.

* Дата последне операции
 col_pos = col_pos + 1.
 CLEAR: fieldcat_ln.
 fieldcat_ln-ref_tabname = 'RSERXX'.
 fieldcat_ln-fieldname   = 'DATUM'.
 fieldcat_ln-col_pos     = col_pos.
 APPEND fieldcat_ln TO fieldcat.

* Время последней операции
 col_pos = col_pos + 1.
 CLEAR: fieldcat_ln.
 fieldcat_ln-ref_tabname = 'RSERXX'.
 fieldcat_ln-fieldname   = 'UZEIT'.
 fieldcat_ln-col_pos     = col_pos.
 APPEND fieldcat_ln TO fieldcat.

* Вид движения
 col_pos = col_pos + 1.
 CLEAR: fieldcat_ln.
 fieldcat_ln-ref_tabname = 'RSERXX'.
 fieldcat_ln-fieldname   = 'BWART'.
 fieldcat_ln-col_pos     = col_pos.
 APPEND fieldcat_ln TO fieldcat.

* Документ ММ
 col_pos = col_pos + 1.
 CLEAR: fieldcat_ln.
 fieldcat_ln-ref_tabname = 'RSERXX'.
 fieldcat_ln-fieldname   = 'MBLNR'.
 fieldcat_ln-col_pos     = col_pos.
 fieldcat_ln-hotspot     = true.
 APPEND fieldcat_ln TO fieldcat.

* Год документа ММ
 col_pos = col_pos + 1.
 CLEAR: fieldcat_ln.
 fieldcat_ln-ref_tabname = 'RSERXX'.
 fieldcat_ln-fieldname   = 'MJAHR'.
 fieldcat_ln-col_pos     = col_pos.
 APPEND fieldcat_ln TO fieldcat.

* Позиция документа
 col_pos = col_pos + 1.
 CLEAR: fieldcat_ln.
 fieldcat_ln-ref_tabname = 'RSERXX'.
 fieldcat_ln-fieldname   = 'ZEILE'.
 fieldcat_ln-col_pos     = col_pos.
 APPEND fieldcat_ln TO fieldcat.

* Код клиента
 col_pos = col_pos + 1.
 CLEAR: fieldcat_ln.
 fieldcat_ln-ref_tabname = 'RSERXX'.
 fieldcat_ln-fieldname   = 'KUNDE'.
 fieldcat_ln-col_pos     = col_pos.
 fieldcat_ln-no_out      = true.
 APPEND fieldcat_ln TO fieldcat.

* Код завода
 col_pos = col_pos + 1.
 CLEAR: fieldcat_ln.
 fieldcat_ln-ref_tabname = 'RSERXX'.
 fieldcat_ln-fieldname   = 'WERK'.
 fieldcat_ln-col_pos     = col_pos.
 fieldcat_ln-no_out      = true.
 APPEND fieldcat_ln TO fieldcat.

* Код склада
 col_pos = col_pos + 1.
 CLEAR: fieldcat_ln.
 fieldcat_ln-ref_tabname = 'RSERXX'.
 fieldcat_ln-fieldname   = 'LAGERORT'.
 fieldcat_ln-col_pos     = col_pos.
 fieldcat_ln-no_out      = true.
 APPEND fieldcat_ln TO fieldcat.

* Код партии
 col_pos = col_pos + 1.
 CLEAR: fieldcat_ln.
 fieldcat_ln-ref_tabname = 'RSERXX'.
 fieldcat_ln-fieldname   = 'CHARGE'.
 fieldcat_ln-col_pos     = col_pos.
 fieldcat_ln-no_out      = true.
 APPEND fieldcat_ln TO fieldcat.

* Иконка
 col_pos = col_pos + 1.
 CLEAR: fieldcat_ln.
 fieldcat_ln-fieldname   = 'STORE_ICON'.
 fieldcat_ln-col_pos     = col_pos.
 fieldcat_ln-icon        = true.
 fieldcat_ln-outputlen = 4.
 fieldcat_ln-ddictxt     = 'L'.
 fieldcat_ln-seltext_l   = 'СтСк'.
 fieldcat_ln-seltext_m   = 'СтаСкл'.
 fieldcat_ln-seltext_s   = 'Статус серийного наскладе'.
 APPEND fieldcat_ln TO fieldcat.
ENDFORM.                    " build_fieldcat_alv
*&---------------------------------------------------------------------*
*&      Form  build_sortcat_alv
*&---------------------------------------------------------------------*
*       Критерии сортировки данных по умолчанию
*----------------------------------------------------------------------*
*  <--  SORTCAST - Список полей для сортировки
*----------------------------------------------------------------------*
FORM build_sortcat_alv.
 sortcat_ln-spos = '1'.
 sortcat_ln-fieldname = 'MATKL'.
 sortcat_ln-up = true.
 sortcat_ln-down = false.
 sortcat_ln-subtot = true.
 APPEND sortcat_ln TO sortcat.

 sortcat_ln-spos = '2'.
 sortcat_ln-fieldname = 'MATNR'.
 sortcat_ln-up = true.
 sortcat_ln-down = false.
 sortcat_ln-subtot = false.
 APPEND sortcat_ln TO sortcat.

 sortcat_ln-spos = '3'.
 sortcat_ln-fieldname = 'SERNR'.
 sortcat_ln-up = true.
 sortcat_ln-down = false.
 sortcat_ln-subtot = false.
 APPEND sortcat_ln TO sortcat.
ENDFORM.                    " build_sortcat_alv

*&---------------------------------------------------------------------*
*&      Form  build_eventtab_alv
*&---------------------------------------------------------------------*
*       Список событий для сетки
*----------------------------------------------------------------------*
*      -->P_ER_EVENTS[] - Список имен событий
*----------------------------------------------------------------------*
FORM build_eventtab_alv USING  u_er_events TYPE slis_t_event.
 DATA: ls_event TYPE slis_alv_event.

 CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
      EXPORTING
           i_list_type = 0
      IMPORTING
           et_events   = u_er_events.
 READ TABLE u_er_events WITH KEY name = slis_ev_top_of_page
                        INTO ls_event.
 IF sy-subrc = 0.
   MOVE 'BUILD_TOP_OF_PAGE_ALV' TO ls_event-form.
   APPEND ls_event TO u_er_events.
 ENDIF.
 READ TABLE u_er_events WITH KEY name = slis_ev_user_command
                        INTO ls_event.
 IF sy-subrc = 0.
   MOVE 'USER_COMMAND' TO ls_event-form.
   APPEND ls_event TO u_er_events.
 ENDIF.
ENDFORM.                    " build_eventtab_alv

*----------------------------------------------------------------------*
*       FORM BUILD_TOP_OF_PAGE_ALV
*----------------------------------------------------------------------*
FORM build_top_of_page_alv.
 CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
   EXPORTING
*      i_logo             = 'ENJOYSAP_LOGO'
     it_list_commentary = er_list_top_of_page.
ENDFORM.                    "build_top_of_page_alv

*&---------------------------------------------------------------------*
*&      Form  build_comments_alv
*&---------------------------------------------------------------------*
*       Построение комментария заголовка отчета
*----------------------------------------------------------------------*
*  <--  ER_LIST_TOP_OF_PAGE - Строки для вывода в заголовке отчета
*----------------------------------------------------------------------*
FORM build_comments_alv.
 DATA: l_count       TYPE i,
       ls_line       TYPE slis_listheader,
       l_info        TYPE slis_listheader-info.

 CLEAR ls_line.
 ls_line-typ = 'S'.
 ls_line-key = 'На дату:'.
 WRITE p_datum TO ls_line-info DD/MM/YYYY.
 APPEND ls_line TO er_list_top_of_page.
 CLEAR: ls_line-key.

* Группы материалов
 DESCRIBE TABLE p_matkl LINES l_count.
 IF l_count > 0.
   CLEAR ls_line.
   ls_line-typ = 'S'.
   ls_line-key = 'Группы материала:'.
   LOOP AT p_matkl.
     IF p_matkl-high = space.
       ls_line-info = p_matkl-low.
     ELSE.
       CONCATENATE p_matkl-low p_matkl-high
                                 INTO ls_line-info SEPARATED BY ' - '.
     ENDIF.
     APPEND ls_line TO er_list_top_of_page.
     CLEAR: ls_line-key.
   ENDLOOP.
 ENDIF.

* Код материала
 DESCRIBE TABLE p_matnr LINES l_count.
 IF l_count > 0.
   CLEAR ls_line.
   ls_line-typ = 'S'.
   ls_line-key = 'Коды материалов:'.
   LOOP AT p_matnr.
     IF p_matnr-high = space.
       ls_line-info = p_matnr-low.
     ELSE.
       CONCATENATE p_matnr-low p_matnr-high
                                 INTO ls_line-info SEPARATED BY ' - '.
     ENDIF.
     APPEND ls_line TO er_list_top_of_page.
     CLEAR: ls_line-key.
   ENDLOOP.
 ENDIF.
ENDFORM.                    "build_comments_alv

*&---------------------------------------------------------------------*
*&      Form  start_list_viewer_alv
*&---------------------------------------------------------------------*
*       Вывести ALV-таблицу на экран
*----------------------------------------------------------------------*
FORM start_list_viewer_alv.
 DATA pgm LIKE sy-repid.

 pgm = sy-repid.
 alv_variant-report = pgm.
 alv_variant-variant = alv_def.
 IF NOT alv_def IS INITIAL.
   CALL FUNCTION 'REUSE_ALV_VARIANT_EXISTENCE'
        EXPORTING
             i_save     = 'A'
        CHANGING
             cs_variant = alv_variant
        EXCEPTIONS
             OTHERS     = 1.
   IF sy-subrc <> 0.
     MESSAGE e321(m7) WITH alv_def pgm.
   ENDIF.
 ENDIF.

*  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
** EXPORTING
**   I_INTERFACE_CHECK                 = ' '
**   I_BYPASSING_BUFFER                = ' '
**   I_BUFFER_ACTIVE                   = ' '
**   I_CALLBACK_PROGRAM                = ' '
**   I_CALLBACK_PF_STATUS_SET          = ' '
**   I_CALLBACK_USER_COMMAND           = ' '
**   I_CALLBACK_TOP_OF_PAGE            = ' '
**   I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
**   I_CALLBACK_HTML_END_OF_LIST       = ' '
**   I_STRUCTURE_NAME                  =
**   I_BACKGROUND_ID                   = ' '
**   I_GRID_TITLE                      =
**   I_GRID_SETTINGS                   =
**   IS_LAYOUT                         =
**   IT_FIELDCAT                       =
**   IT_EXCLUDING                      =
**   IT_SPECIAL_GROUPS                 =
**   IT_SORT                           =
**   IT_FILTER                         =
**   IS_SEL_HIDE                       =
**   I_DEFAULT                         = 'X'
**   I_SAVE                            = ' '
**   IS_VARIANT                        =
**   IT_EVENTS                         =
**   IT_EVENT_EXIT                     =
**   IS_PRINT                          =
**   IS_REPREP_ID                      =
**   I_SCREEN_START_COLUMN             = 0
**   I_SCREEN_START_LINE               = 0
**   I_SCREEN_END_COLUMN               = 0
**   I_SCREEN_END_LINE                 = 0
**   I_HTML_HEIGHT_TOP                 = 0
**   I_HTML_HEIGHT_END                 = 0
**   IT_ALV_GRAPHICS                   =
**   IT_HYPERLINK                      =
**   IT_ADD_FIELDCAT                   =
**   IT_EXCEPT_QINFO                   =
**   IR_SALV_FULLSCREEN_ADAPTER        =
** IMPORTING
**   E_EXIT_CAUSED_BY_CALLER           =
**   ES_EXIT_CAUSED_BY_USER            =
*    TABLES
*      T_OUTTAB                          =
** EXCEPTIONS
**   PROGRAM_ERROR                     = 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.

 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
      EXPORTING
*         I_INTERFACE_CHECK        = ' '
         i_buffer_active          = space
         i_callback_program       = pgm
*         i_callback_pf_status_set = 'BUILD_PF_STATUS_ALV'
         i_callback_user_command  = 'USER_COMMAND'
*         I_STRUCTURE_NAME         =
         i_grid_title             = text-001
         is_layout                = layout
         it_fieldcat              = fieldcat
*         IT_EXCLUDING             =
*         IT_SPECIAL_GROUPS        =
         it_sort                  = sortcat
*         IT_FILTER                =
*         IS_SEL_HIDE              =
*         I_DEFAULT                = 'X'
         i_save                   = 'A'
         is_variant               = alv_variant
         it_events                = er_events
*         IT_EVENT_EXIT            =
*         IS_PRINT                 =
*         I_SCREEN_START_COLUMN    = 0
*         I_SCREEN_START_LINE      = 0
*         I_SCREEN_END_COLUMN      = 0
*         I_SCREEN_END_LINE        = 0
*    IMPORTING
*         E_EXIT_CAUSED_BY_CALLER  =
*          es_exit_caused_by_user   = 'X'
      TABLES
           t_outtab                 = gt_equi
      EXCEPTIONS
           program_error            = 1
           OTHERS                   = 2.
ENDFORM.                    " start_list_viewer_alv

*----------------------------------------------------------------------*
*       FORM USER_COMMAND                                              *
*----------------------------------------------------------------------*
*    Обработка нажатия своих кодов клавишь для Лелика                  *
*----------------------------------------------------------------------*
*  -->  VALUE(RT_EXTAB)                                                *
*----------------------------------------------------------------------*
FORM user_command USING r_ucomm TYPE sy-ucomm
                       rs_selfield TYPE slis_selfield.
 CASE r_ucomm.
   WHEN '&IC1'.
     IF rs_selfield-tabindex > 0.
       READ TABLE gt_equi INDEX rs_selfield-tabindex.
     ELSEIF rs_selfield-sumindex > 0.
       READ TABLE gt_equi INDEX rs_selfield-sumindex.
     ELSE.
       EXIT.
     ENDIF.
     CASE rs_selfield-fieldname.
       WHEN 'EQUNR'.
         SET PARAMETER ID 'EQN' FIELD gt_equi-equnr.
         CALL TRANSACTION 'IE03' AND SKIP FIRST SCREEN.
       WHEN 'SERNR'.
         SET PARAMETER ID 'MAT' FIELD gt_equi-matnr.
         SET PARAMETER ID 'SER' FIELD gt_equi-sernr.
         CALL TRANSACTION 'IQ03' AND SKIP FIRST SCREEN.
       WHEN 'MBLNR'.
         SET PARAMETER ID 'MBN' FIELD gt_equi-mblnr.
         SET PARAMETER ID 'MJA' FIELD gt_equi-mjahr.
         CALL TRANSACTION 'MB03' AND SKIP FIRST SCREEN.
     ENDCASE.
 ENDCASE.
ENDFORM.                    "user_command

Описания текстовых переменных на картинках. Пример работы и внешний вид селекционного экрана YTOV_STORE_SERNR_ON_DAY.png и YUUK_STORE_SERNR_ON_DAY_SCR.png