Автор Тема: Статус серийного номера на дату (YUUK_STORE_SERNR_ON_DAY)  (Прочитано 7028 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 758
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
YUUK_STORE_SERNR_ON_DAY - Программа определения статуса серийных номеров на дату, в общем то в стандарте такой программы вроде как нет, а тут понадобилось типа, а был ли на заданную дату серийный номер на складе или был списан или... короче в каком состоянии находился. Для одного серийного номера оно конечно не вопрос зайти в историю, а вот если их много, то задача уже переходи в разряд интеллектуальных  :D. Так что типа вот довел ее до ума, серийные можно как задавать в диалоге, так и загружать из файла.

Программа состоит из двух модулей: REPORT yuuk_store_sernr_on_day, сама программа и вспомогательный модуль YUUK_STORE_SERNR_ON_DAY_ALV - вся обработка ALV-таблицы
Код: You are not allowed to view links. Register or Login
*&**********************************************************************
*& 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.
************************************************************************

Код: You are not allowed to view links. Register or Login
*----------------------------------------------------------------------*
*   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