Загрузка данных


*&---------------------------------------------------------------------*
*&  Include           ZNZP_REPORT_F01
*&---------------------------------------------------------------------*
*======================================================================*
*   Inlude         : Подпрограммы                                      *
*----------------------------------------------------------------------*
*   Автор          : Галимзянов И.Р.                                   *
*   Ответственный                                                      *
*   пользователь   : Яковлева А.А.                                     *
*   Дата создания  : 18.08.2025                                        *
*   Номер заявки   : 000086074                                         *
*======================================================================*
*   Модификации                                                        *
*----------------------------------------------------------------------*
*   Автор          :  Лихачева А.В.                                    *
*   Заявка         :  25497   S00117707                                *
*   Консультант    :  Яковлева А.А.                                    *
*   Дата изменения :  25.09.2025                                       *
*   Назначение     :  RFC-2025-128257.RS-00X Доработка отчета          *
*                     ZNZP_OTCHET                                      *
*-----------------------------------------------------------------------
*   Автор          : Артурззаман Р.                                    *
*   Дата изменения : 20.10.2025                                        *
*   Ответственный                                                      *
*   пользователь   : Тищенко А. Е.                                     *
*   наименование   : S00117707                                         *
*   Код поручение  : 27 084                                            *
*   Назначение     : О внедрение электронных отчетов от цехов/складов  *
*                    по ПРЗ                                            *
*-----------------------------------------------------------------------
*   Автор          : Федоров Ю.А.                                      *
*   Дата изменения : 31.10.2025                                        *
*   Ответственный                                                      *
*   пользователь   : Тищенко А. Е.                                     *
*   Код поручение  : 28 197/S00128677                                  *
*   Назначение     : Добавлено поле Сумма НЗП                          *
*-----------------------------------------------------------------------
*   Автор          : Петряков Н.В.                                     *
*   Дата изменения : 05.02.2026                                        *
*   Ответственный                                                      *
*   пользователь   : Тищенко А.Е.                                      *
*   Код поручение  : 32 991                                            *
*   Назначение     : Продолжение S00117707                             *
*-----------------------------------------------------------------------
*   Автор          : Новокшонова С.Б.                                  *
*   Дата изменения : 02.03.2026                                        *
*   Ответственный                                                      *
*   пользователь   : Яковлева А.А.                                     *
*   Код поручение  : 34 685                                            *
*   Назначение     : 1)Добавление суммы ошибки и других полей в выборку*
*                    2)Скрытие некоторых полей в ALV                   *
*======================================================================*
*   Автор          : Матвеева Л.Ф.                                     *
*   Дата изменения : 10.03.2026                                        *
*   Ответственный                                                      *
*   пользователь   : Тищенко А. Е.                                     *
*   Код поручение  : 35 154                                            *
*   Назначение     : Настройка выбора Типа отчета                      *
*======================================================================*
*   Автор          : Лавров И.Г.                                       *
*   Дата изменения : 30.03.2026                                        *
*   Ответственный                                                      *
*   пользователь   : Тищенко А.Е.                                      *
*   Код поручение  : 36 287                                            *
*   Назначение     : Изменение сортировки                              *
*-----------------------------------------------------------------------

"выбор данных
FORM FILL_REPORT.

  TYPES: BEGIN OF TT_FORMS,
           ZTYPE     TYPE Z_FORMSIGN,
           ZDATEOTCH TYPE DATS,
           GJAHR     TYPE GJAHR,
           MONAT     TYPE MONAT,
         END OF TT_FORMS.

  CLEAR: S_MONAT[], S_GJAHR[], S_MONAT, S_GJAHR.
  S_MONAT[] = VALUE #( ( SIGN = 'I' OPTION = 'EQ' LOW = S_D_OTCH-LOW+4(2) ) ).
  S_GJAHR[] = VALUE #( ( SIGN = 'I' OPTION = 'EQ' LOW = S_D_OTCH-LOW(4) ) ).
  S_MONAT = S_MONAT[ 1 ].
  S_GJAHR = S_GJAHR[ 1 ].

  " 25497   S00117707 Лихачева А.В. 25.09.2025 beg
  DATA: LRT_WERKS     TYPE RANGE OF WERKS_D,
        LRT_LGORT     TYPE RANGE OF ZLGORT,
        LS_LGORT      LIKE LINE OF LRT_LGORT,
        LT_ZECP_FORMS TYPE STANDARD TABLE OF TT_FORMS.

  CASE 'X'.
    WHEN P_DET.
      LT_ZECP_FORMS = VALUE #(
      ( ZTYPE = 'NZP' )
      ).
    WHEN P_MET.
      LT_ZECP_FORMS = VALUE #(
      ( ZTYPE = 'NZP_M' )
      ).
    WHEN OTHERS.
  ENDCASE.

  LOOP AT LT_ZECP_FORMS ASSIGNING FIELD-SYMBOL(<FS_ZTYPE>).
    SELECT  MATNR,
            ZTYPE_OTCH,
            ERDAT,
            ERZET,
            WERKS,
            GJAHR,
            MONAT,
            ZLGORT,
            DISPO,
            BISMT,
            MAKTX,
            MEINS,
            ZESALDO_MEINS,
            ZSUM_NZP,
            ZPRICE_NZP,
            CURRENCY,
            Z01,
            Z02,
            Z03,
            Z04,
            Z05,
            Z07,
            Z08,
            Z11,
            Z35,
            Z43,
            Z45,
            Z25,
            Z_BUDAT,
            Z01_S,  " 02.03.2026 1C 34685
            Z06_1_S,
            Z02_S,  " добавление полей
            Z03_S,
            Z06_3_S,
            Z04_S,
            Z05_S,
            Z07_S,
            Z08_S,
            Z11_S,
            Z35_S,
            Z43_S,
            Z45_S,
            Z25_S,
            ZERR_S                                          " /34685
    FROM ZES_NZP
    APPENDING TABLE @DATA(LT_NZP)
    WHERE WERKS  IN @S_WERKS AND
          ZLGORT IN @S_LGORT AND
          MATNR  IN @S_MATNR AND
          ZTYPE_OTCH = @<FS_ZTYPE>-ZTYPE AND
          GJAHR  IN @S_GJAHR[] AND
          MONAT  IN @S_MONAT[].

  ENDLOOP.

  IF LT_NZP IS INITIAL.
    MESSAGE 'Данные по статьям калькуляции не найдены' TYPE 'I' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING AND RETURN TO SCREEN 0.
  ENDIF.


  LRT_WERKS = VALUE #( FOR GROUPS WRK OF <FS_ROW> IN LT_NZP
                          WHERE ( WERKS IS NOT INITIAL )
                          GROUP BY <FS_ROW>-WERKS
                          WITHOUT MEMBERS ( SIGN = 'I' OPTION = 'EQ' LOW = WRK ) ).

  LOOP AT LT_NZP ASSIGNING FIELD-SYMBOL(<FS_NZP>).
    " 02.03.2026 1C 34685 добавление сумм статей 06.1 и 06.3 к статьям 01 и 03
    DATA(N) = STRLEN( <FS_NZP>-ZLGORT ) - 3.
    IF N < 0. N = 0. ENDIF.
    LS_LGORT = VALUE #( SIGN = 'I' OPTION = 'EQ' LOW = |{ <FS_NZP>-WERKS(2) }{ <FS_NZP>-ZLGORT+N(3) }| ) .
    APPEND LS_LGORT TO LRT_LGORT.
    CLEAR: LS_LGORT, N.
  ENDLOOP.
  SORT LRT_LGORT BY LOW.
  DELETE ADJACENT DUPLICATES FROM LRT_LGORT COMPARING LOW.

  "Выполнить группировку из внутренней таблицы LT_NZP уникальных значений Z_BUDAT в LRT_Z_BUDAT
  DATA: LRT_Z_BUDAT TYPE RANGE OF DATS.
  LRT_Z_BUDAT = VALUE #(
  FOR GROUPS Z_BUDAT OF <FS_Z_BUDAT> IN LT_NZP
  GROUP BY <FS_Z_BUDAT>-Z_BUDAT ASCENDING WITHOUT MEMBERS (
    SIGN   = 'I'
    OPTION = 'EQ'
    LOW    = Z_BUDAT
) ).

  IF LRT_LGORT IS NOT INITIAL.
*    LOOP AT lt_nzp ASSIGNING <fs_nzp>.
    SELECT MATNR,
           WERKS,
           LGORT,
           MENGE6,
           SUMMA6,
           MENGE12,
           SUMMA12,
           MENGE13,
           SUMMA13,
           MENGEO3,
           SUMMAO3,
           MENGEO5,
           SUMMAO5,
           MENGEO7,
           SUMMAO7,
           DATECALC
    FROM ZMM_UNSOLD
   INTO TABLE @DATA(LT_UNSOLD)
    WHERE WERKS IN @LRT_WERKS AND
          LGORT IN @LRT_LGORT AND
          MPZ_NZP = '2' AND
          MATNR IN @S_MATNR AND
          DATECALC IN @LRT_Z_BUDAT.
*    ENDLOOP.
  ENDIF.

  "сортировка для binary search
  SORT LT_UNSOLD BY WERKS LGORT MATNR DATECALC.

  "Скопировать все значения из таблицы LT_NZP в таблицу GT_REPORT
  MOVE-CORRESPONDING LT_NZP TO GT_REPORT.

  LOOP AT GT_REPORT ASSIGNING FIELD-SYMBOL(<FS_REPORT>).
    "Объединить GT_REPORT~WERKS[1-2] GT_REPORT~ZLGORT+N[3] в поле GT_REPORT~LGORT
    N = STRLEN( <FS_REPORT>-ZLGORT ) - 3.
    IF N < 0. N = 0. ENDIF.
    <FS_REPORT>-LGORT = |{ <FS_REPORT>-WERKS(2) }{ <FS_REPORT>-ZLGORT+N(3) }|.

    "Для каждой строки внутренней таблицы GT_REPORT найти значения полей MENGE6, SUMMA6, MENGE12, SUMMA12, MENGE13, SUMMA13, MENGEO3, SUMMAO3, MENGEO5, SUMMAO5, MENGEO7, SUMMAO7, DATECALC во внутренней таблице LT_UNSOLD
    READ TABLE LT_UNSOLD
    WITH KEY
      WERKS = <FS_REPORT>-WERKS
      LGORT = <FS_REPORT>-LGORT
      MATNR = <FS_REPORT>-MATNR
      DATECALC = <FS_REPORT>-Z_BUDAT
    ASSIGNING FIELD-SYMBOL(<FS_UNSOLD>)
    BINARY SEARCH.
    IF SY-SUBRC = 0.
      <FS_REPORT> = CORRESPONDING #( BASE ( <FS_REPORT> ) <FS_UNSOLD> ).
    ENDIF.
  ENDLOOP.

  "Скопировать значения полей WERKS, ZLGORT из таблицы LT_NZP в LT_WELGORT
  DATA: LT_WELGORT TYPE TABLE OF TT_WELGORT.
  LOOP AT LT_NZP ASSIGNING <FS_NZP>.
    APPEND VALUE #( WERKS = <FS_NZP>-WERKS ZLGORT = <FS_NZP>-ZLGORT ) TO LT_WELGORT.
  ENDLOOP.

  "Удалить дубликаты по WERKS, ZLGORT
  SORT LT_WELGORT BY WERKS ZLGORT.
  DELETE ADJACENT DUPLICATES FROM LT_WELGORT COMPARING WERKS ZLGORT.

  "Если LT_WELGORT = не пусто, то
  IF LINES( LT_WELGORT ) > 0.
    "Выполнить выборку поля LGORT из таблицы ZMM_OSV_CEH в таблицу LT_WELGORT
    SELECT WERKS, CEH, LGORT
      FROM ZMM_OSV_CEH
      INTO TABLE @DATA(LT_ALL_LGORTS).
    SORT LT_ALL_LGORTS BY WERKS CEH LGORT.
    LOOP AT LT_WELGORT ASSIGNING FIELD-SYMBOL(<FS_WELGORT>).
      READ TABLE LT_ALL_LGORTS
        WITH KEY
          WERKS = <FS_WELGORT>-WERKS
          CEH = <FS_WELGORT>-ZLGORT
        ASSIGNING FIELD-SYMBOL(<FS_LGORT>).
      IF SY-SUBRC = 0.
        <FS_WELGORT>-LGORT = <FS_LGORT>-LGORT.
      ENDIF.
    ENDLOOP.

    "уникальные range по заводу и складу
    DATA: LR_WERKS TYPE RANGE OF WERKS_D.
    LR_WERKS = VALUE #(
    FOR GROUPS WERKS OF <FS_UNIQ_WERKS> IN LT_WELGORT
    GROUP BY <FS_UNIQ_WERKS>-WERKS ASCENDING WITHOUT MEMBERS (
      SIGN   = 'I'
      OPTION = 'EQ'
      LOW    = WERKS
  ) ).
    DATA: LR_LGORT TYPE RANGE OF LGORT_D.
    LR_LGORT = VALUE #(
    FOR GROUPS LGORT OF <FS_UNIQ_LGORT> IN LT_WELGORT
    GROUP BY <FS_UNIQ_LGORT>-LGORT ASCENDING WITHOUT MEMBERS (
      SIGN   = 'I'
      OPTION = 'EQ'
      LOW    = LGORT
  ) ).

    "Выполнить выборку поля LGOBE из таблицы T001L в таблицу LT_WELGORT
    SELECT WERKS, LGORT, LGOBE
      FROM T001L
      INTO TABLE @DATA(LT_LGOBE)
      WHERE
      WERKS IN @LR_WERKS AND
      LGORT IN @LR_LGORT.

    LOOP AT LT_WELGORT ASSIGNING <FS_WELGORT>.
      READ TABLE LT_LGOBE
        WITH KEY
          WERKS = <FS_WELGORT>-WERKS
          LGORT = <FS_WELGORT>-LGORT
        ASSIGNING FIELD-SYMBOL(<FS_LGOBE>).
      IF SY-SUBRC = 0.
        <FS_WELGORT>-LGOBE = <FS_LGOBE>-LGOBE.
      ENDIF.
    ENDLOOP.

    "Для каждой строки внутренней таблицы GT_REPORT найти значения поля LGOBE из таблицы LT_WELGORT
    LOOP AT GT_REPORT ASSIGNING <FS_REPORT>.
      READ TABLE LT_WELGORT
        WITH KEY
          WERKS = <FS_REPORT>-WERKS
          ZLGORT = <FS_REPORT>-ZLGORT
        ASSIGNING FIELD-SYMBOL(<FS_WELGORT_LGOBE>).
      IF SY-SUBRC = 0.
        <FS_REPORT>-LGOBE = <FS_WELGORT_LGOBE>-LGOBE.
      ENDIF.
    ENDLOOP.
  ENDIF.

  CLEAR: LRT_WERKS, LRT_LGORT, LT_NZP, LT_UNSOLD, LRT_Z_BUDAT.
  " 25497   S00117707 Лихачева А.В. 25.09.2025 end

  DATA(LT_REPORT) = GT_REPORT.
  SORT LT_REPORT BY ZSUM_NZP DESCENDING.
  APPEND LINES OF LT_REPORT FROM 1 TO 20 TO GT_TOP20.
  REFRESH LT_REPORT.

  GT_ALV = GT_REPORT.
ENDFORM.

"заполняем каталог полей
FORM CREATE_FIELDCATALOG  USING IT_REPORT TYPE ANY TABLE
                                CT_FIELDCAT TYPE LVC_T_FCAT.
  "Из внутренней таблицы
  DATA:
    LR_TABDESCR TYPE REF TO CL_ABAP_STRUCTDESCR,
    LR_DATA     TYPE REF TO DATA,
    LT_DFIES    TYPE DDFIELDS.

  CLEAR: CT_FIELDCAT.
  CREATE DATA LR_DATA LIKE LINE OF IT_REPORT.
  LR_TABDESCR ?= CL_ABAP_STRUCTDESCR=>DESCRIBE_BY_DATA_REF( LR_DATA ).
  LT_DFIES = CL_SALV_DATA_DESCR=>READ_STRUCTDESCR( LR_TABDESCR ).
  CT_FIELDCAT = CORRESPONDING #( LT_DFIES ).

  LOOP AT CT_FIELDCAT ASSIGNING FIELD-SYMBOL(<FS_FIELDCAT>).

    CASE <FS_FIELDCAT>-FIELDNAME.
      WHEN 'ZLGORT' OR 'Z_BUDAT' OR 'DATECALC' OR  'Z06_1_S'  OR 'Z06_3_S'.
        <FS_FIELDCAT>-NO_OUT = 'X'.
      WHEN 'ERDAT' OR 'ERZET' OR 'WERKS'. " 02.03.2026 !C 34685
        <FS_FIELDCAT>-NO_OUT = 'X'. " скрыть поля, с возомжностью выбора через формат
      WHEN 'Z01_S' OR 'Z02_S' OR 'Z03_S' OR 'Z04_S' OR 'Z05_S' OR 'Z07_S' OR 'Z08_S' OR 'Z11_S' OR 'Z35_S' OR 'Z43_S' OR 'Z45_S' OR 'Z25_S' OR 'ZERR_S'.
        <FS_FIELDCAT>-NO_OUT = 'X'. " скрыть поля, с возомжностью выбора через формат /34685
      WHEN 'MENGE6'.
        <FS_FIELDCAT>-REPTEXT = 'Количество до 6 месяцев'.
      WHEN 'SUMMA6'.
        <FS_FIELDCAT>-REPTEXT = 'Сумма(руб.) до 6 месяцев'.
      WHEN 'MENGE12'.
        <FS_FIELDCAT>-REPTEXT = 'Кол-во от 6 до 12 месяцев'.
      WHEN 'SUMMA12'.
        <FS_FIELDCAT>-REPTEXT = 'Сумма(руб.) от 6 до 12 месяцев'.
      WHEN 'MENGE13'.
        <FS_FIELDCAT>-REPTEXT = 'Количество свыше (12 месяцев или 7 лет )'.
      WHEN 'SUMMA13'.
        <FS_FIELDCAT>-REPTEXT = 'Сумма(руб.) свыше (12 месяцев или 7 лет )'.
      WHEN 'MENGEO3'.
        <FS_FIELDCAT>-REPTEXT = 'Количество от 1 до 2-х лет'.
      WHEN 'SUMMAO3'.
        <FS_FIELDCAT>-REPTEXT = 'Сумма(руб.) от 1 до 2-х лет'.
      WHEN 'MENGEO5'.
        <FS_FIELDCAT>-REPTEXT = 'Количество от 2 до 5 лет'.
      WHEN 'SUMMAO5'.
        <FS_FIELDCAT>-REPTEXT = 'Сумма(руб.) от 2 до 5 лет'.
      WHEN 'MENGEO7'.
        <FS_FIELDCAT>-REPTEXT = 'Количество от 5 до 7 лет'.
      WHEN 'SUMMAO7'.
        <FS_FIELDCAT>-REPTEXT = 'Сумма(руб.) от 5 до 7 лет'.
      WHEN 'ZTYPE_OTCH'.
        <FS_FIELDCAT>-SCRTEXT_L = 'Тип документа'.
        <FS_FIELDCAT>-SCRTEXT_M = 'Тип документа'.
        <FS_FIELDCAT>-SCRTEXT_S = 'Тип документа'.
        <FS_FIELDCAT>-OUTPUTLEN = 10.
        <FS_FIELDCAT>-NO_OUT = 'X'.
        " скрыть поля, с возомжностью выбора через формат
      WHEN 'LGOBE'.
        <FS_FIELDCAT>-NO_OUT = 'X'.
      WHEN 'CURRENCY'.
        <FS_FIELDCAT>-NO_OUT = 'X'.
      WHEN OTHERS.
    ENDCASE.


  ENDLOOP.
ENDFORM.

"Календарь и выбор дня
FORM F4_DATE.
  "Календарь и выбор дня
  CALL FUNCTION 'F4_DATE'
    IMPORTING
      SELECT_DATE = S_D_OTCH-LOW.
ENDFORM.

"закрыть поля года и месяца на селекционном экране для заполнения
FORM SELSCR_OUTPUT.
  LOOP AT SCREEN.
    IF SCREEN-NAME = 'S_GJAHR-LOW' OR SCREEN-NAME = 'S_MONAT-LOW'.
      SCREEN-INPUT = 0.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.

  CLEAR: S_MONAT[], S_GJAHR[].
  IF S_D_OTCH IS NOT INITIAL.
    APPEND VALUE #( SIGN = 'I' OPTION = 'EQ' LOW = S_D_OTCH-LOW+4(2) ) TO S_MONAT[].
    APPEND VALUE #( SIGN = 'I' OPTION = 'EQ' LOW = S_D_OTCH-LOW(4) ) TO S_GJAHR[].
  ENDIF.

  PERFORM UPDATE_DYNP.
ENDFORM.

"обновление экрана
FORM UPDATE_DYNP.
  DATA: LT_DYNP TYPE TABLE OF DYNPREAD.
  IF S_D_OTCH IS NOT INITIAL AND S_D_OTCH-LOW+4(1) = '0'.
    APPEND VALUE #( FIELDNAME = 'S_GJAHR-LOW' FIELDVALUE = S_D_OTCH-LOW(4) ) TO LT_DYNP.
    APPEND VALUE #( FIELDNAME = 'S_MONAT-LOW' FIELDVALUE = | { S_D_OTCH-LOW+5(1) }| ) TO LT_DYNP.
  ELSEIF S_D_OTCH IS NOT INITIAL.
    APPEND VALUE #( FIELDNAME = 'S_GJAHR-LOW' FIELDVALUE = S_D_OTCH-LOW(4) ) TO LT_DYNP.
    APPEND VALUE #( FIELDNAME = 'S_MONAT-LOW' FIELDVALUE = S_D_OTCH-LOW+4(2) ) TO LT_DYNP.
  ELSEIF S_D_OTCH[] IS NOT INITIAL.
    "если ошибка после СЭ, вернуть отображение года и месяца
    APPEND VALUE #( SIGN = 'I' OPTION = 'EQ' LOW = S_D_OTCH[ 1 ]-LOW+4(2) ) TO S_MONAT[].
    APPEND VALUE #( SIGN = 'I' OPTION = 'EQ' LOW = S_D_OTCH[ 1 ]-LOW(4) ) TO S_GJAHR[].
  ENDIF.

  " изменить содержимое полей экрана
  CALL FUNCTION 'DYNP_VALUES_UPDATE'
    EXPORTING
      DYNAME     = SY-CPROG
      DYNUMB     = SY-DYNNR
    TABLES
      DYNPFIELDS = LT_DYNP.
  CLEAR: LT_DYNP.
ENDFORM.

"справочник для склада/цеха
FORM F4_LGORT.
  "взять поле завода с селекционного экрана
  DATA: LT_DYNPFIELDS TYPE STANDARD TABLE OF DYNPREAD.

  "Считывание значений полей
  CALL FUNCTION 'DYNP_VALUES_READ'
    EXPORTING
      DYNAME               = SY-CPROG
      DYNUMB               = SY-DYNNR
      REQUEST              = 'A'
    TABLES
      DYNPFIELDS           = LT_DYNPFIELDS
    EXCEPTIONS
      INVALID_ABAPWORKAREA = 1
      INVALID_DYNPROFIELD  = 2
      INVALID_DYNPRONAME   = 3
      INVALID_DYNPRONUMMER = 4
      INVALID_REQUEST      = 5
      NO_FIELDDESCRIPTION  = 6
      INVALID_PARAMETER    = 7
      UNDEFIND_ERROR       = 8
      DOUBLE_CONVERSION    = 9
      STEPL_NOT_FOUND      = 10
      OTHERS               = 11.
  IF SY-SUBRC IS NOT INITIAL.
    CLEAR LT_DYNPFIELDS.
  ENDIF.

  DATA: LV_WERKS LIKE S_WERKS-LOW.
  LV_WERKS = LT_DYNPFIELDS[ FIELDNAME = 'S_WERKS-LOW' ]-FIELDVALUE.

  TYPES: BEGIN OF TY_LGORT,
           WERKS TYPE ZMM_OSV_CEH-WERKS,
           CEH   TYPE ZMM_OSV_CEH-CEH,
         END OF TY_LGORT.
  DATA: LT_LGORT TYPE TABLE OF TY_LGORT.
  FIELD-SYMBOLS: <FS_LINE> TYPE TY_LGORT.

  IF LV_WERKS IS NOT INITIAL.
    SELECT WERKS, CEH
        FROM ZMM_OSV_CEH
        INTO TABLE @LT_LGORT
        WHERE WERKS = @LV_WERKS.
  ELSE.
    SELECT WERKS, CEH
        FROM ZMM_OSV_CEH
        INTO TABLE @LT_LGORT.
  ENDIF.

  SORT LT_LGORT BY WERKS CEH.
  DELETE ADJACENT DUPLICATES FROM LT_LGORT COMPARING WERKS CEH.

  LOOP AT LT_LGORT ASSIGNING <FS_LINE>.
    DATA: LV_PUT TYPE CHAR10.
    LV_PUT = <FS_LINE>-CEH.
    "удалить ведущие нули
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING
        INPUT  = LV_PUT
      IMPORTING
        OUTPUT = LV_PUT.
  ENDLOOP.

  "вывод списка значений
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      RETFIELD        = 'CEH'
      DYNPPROG        = SY-REPID
      DYNPNR          = SY-DYNNR
      DYNPROFIELD     = 'S_LGORT-LOW'
      VALUE_ORG       = 'S'
    TABLES
      VALUE_TAB       = LT_LGORT
    EXCEPTIONS
      PARAMETER_ERROR = 1
      NO_VALUES_FOUND = 2
      OTHERS          = 3.
  IF SY-SUBRC IS NOT INITIAL.
    CLEAR LT_LGORT.
  ENDIF.
ENDFORM.

"Кнопка «Итог по заводу»
FORM SORT_WERKS.
  DATA: LT_SORT TYPE LVC_T_SORT.

  "comp = 'X'
  LT_SORT = VALUE #( ( SPOS = 1 FIELDNAME = 'WERKS' UP = 'X' SUBTOT = 'X' COMP = 'X' SELTEXT = 'Завод' EXPA = 'X' ) ).
  GO_GRID->SET_SORT_CRITERIA( IT_SORT = LT_SORT ).

  GO_GRID->GET_FRONTEND_FIELDCATALOG( IMPORTING ET_FIELDCATALOG = DATA(LT_FIELDCATALOG) ).

  LOOP AT LT_FIELDCATALOG ASSIGNING FIELD-SYMBOL(<FS_FIELDCATALOG>).
    "только строки итогов с полями WERKS, ZSUM_NZP, Z01, Z02, Z03, Z04, Z05, Z07, Z08, Z11, Z35, Z43, Z45, Z25. Остальные поля скрыть
    CASE <FS_FIELDCATALOG>-FIELDNAME.
      WHEN 'WERKS' OR 'ZSUM_NZP' OR 'Z01_S' OR 'Z06_1_S' OR 'Z02_S' OR 'Z03_S' OR 'Z06_3_S' OR 'Z04_S' OR 'Z05_S' OR 'Z07_S'
        OR 'Z08_S' OR 'Z11_S' OR 'Z35_S' OR 'Z43_S' OR 'Z45_S' OR 'Z25_S' OR 'ZERR_S' "/34685
        OR 'SUMMA6' OR 'SUMMA12'  OR 'SUMMA13'  OR 'SUMMAO3'  OR 'SUMMAO5'  OR 'SUMMAO7'.   "34154
        <FS_FIELDCATALOG>-NO_OUT = ''.
        IF <FS_FIELDCATALOG>-FIELDNAME NE 'WERKS'. " 02.03.2026 1С 34685 указываем поля для суммирования
          <FS_FIELDCATALOG>-DO_SUM = 'X'.
        ENDIF.
      WHEN OTHERS.
        <FS_FIELDCATALOG>-NO_OUT = 'X'.
    ENDCASE.
  ENDLOOP.

  PERFORM GET_POS USING LT_SORT CHANGING LT_FIELDCATALOG.

  GO_GRID->SET_FRONTEND_FIELDCATALOG( IT_FIELDCATALOG = LT_FIELDCATALOG ).

  GO_GRID->GET_FRONTEND_LAYOUT( IMPORTING ES_LAYOUT = DATA(LS_LAYOUT) ).
  LS_LAYOUT-CWIDTH_OPT = 'X'.
  GO_GRID->SET_FRONTEND_LAYOUT( EXPORTING IS_LAYOUT = LS_LAYOUT ).

  GO_GRID->REFRESH_TABLE_DISPLAY( ).

ENDFORM.

"Кнопка «Итог по цеху»
FORM SORT_LGORT.
  DATA: LT_SORT TYPE LVC_T_SORT.

  "comp = 'X'
  LT_SORT = VALUE #( ( SPOS = 1 FIELDNAME = 'LGORT' UP = 'X' SUBTOT = 'X' COMP = 'X' SELTEXT = 'Склад/Цех' EXPA = 'X' ) ).
  GO_GRID->SET_SORT_CRITERIA( IT_SORT = LT_SORT ).

  GO_GRID->GET_FRONTEND_FIELDCATALOG( IMPORTING ET_FIELDCATALOG = DATA(LT_FIELDCATALOG) ).

  LOOP AT LT_FIELDCATALOG ASSIGNING FIELD-SYMBOL(<FS_FIELDCATALOG>).
    CASE <FS_FIELDCATALOG>-FIELDNAME.
        " 02.03.2026 1С 34685 вместо статьей показать суммы по статьям
*      WHEN 'LGORT' OR 'ZSUM_NZP' OR 'Z01' OR 'Z02' OR 'Z03' OR 'Z04' OR 'Z05' OR 'Z07' OR 'Z08' OR 'Z11' OR 'Z35' OR 'Z43' OR 'Z45' OR 'Z25'.
      WHEN 'LGORT' OR 'ZSUM_NZP' OR 'Z01_S' OR 'Z06_1_S' OR 'Z02_S' OR 'Z03_S'  OR 'Z06_3_S' OR 'Z04_S' OR 'Z05_S' OR 'Z07_S'
        OR 'Z08_S' OR 'Z11_S' OR 'Z35_S' OR 'Z43_S' OR 'Z45_S' OR 'Z25_S' OR 'ZERR_S' "/34685
        OR 'SUMMA6' OR 'SUMMA12'  OR 'SUMMA13'  OR 'SUMMAO3'  OR 'SUMMAO5'  OR 'SUMMAO7'.   "34154
        <FS_FIELDCATALOG>-NO_OUT = ''.
        IF <FS_FIELDCATALOG>-FIELDNAME NE 'LGORT'. " 02.03.2026 1С 34685 указываем поля для суммирования
          <FS_FIELDCATALOG>-DO_SUM = 'X'.
        ENDIF.
      WHEN OTHERS.
        <FS_FIELDCATALOG>-NO_OUT = 'X'.
    ENDCASE.
  ENDLOOP.

  PERFORM GET_POS USING LT_SORT CHANGING LT_FIELDCATALOG.

  GO_GRID->SET_FRONTEND_FIELDCATALOG( IT_FIELDCATALOG = LT_FIELDCATALOG ).

  GO_GRID->GET_FRONTEND_LAYOUT( IMPORTING ES_LAYOUT = DATA(LS_LAYOUT) ).
  LS_LAYOUT-CWIDTH_OPT = 'X'.
  GO_GRID->SET_FRONTEND_LAYOUT( EXPORTING IS_LAYOUT = LS_LAYOUT ).

  GO_GRID->REFRESH_TABLE_DISPLAY( ).

ENDFORM.

FORM GET_POS USING    LT_SOR    TYPE LVC_T_SORT
             CHANGING LT_CAT TYPE LVC_T_FCAT.

  DATA: LT_POS TYPE LVC_T_FCAT,
        L_I    TYPE  I.

  LT_POS[] = LT_CAT[].
  DELETE LT_POS WHERE NO_OUT = 'X'.

  L_I = LINES( LT_SOR ).

  CASE OK_CODE.
    WHEN  'BTN_CEH'.
      LOOP AT LT_POS ASSIGNING FIELD-SYMBOL(<FS_POS>) WHERE FIELDNAME <> 'LGORT'.
        L_I = L_I + 1.
        <FS_POS>-COL_POS = L_I.
      ENDLOOP.
    WHEN 'BTN_WERKS'.
      LOOP AT LT_POS ASSIGNING FIELD-SYMBOL(<FS_POS1>) WHERE FIELDNAME <> 'WERKS'.
        L_I = L_I + 1.
        <FS_POS1>-COL_POS = L_I.
      ENDLOOP.
    WHEN  'BTN_WERKSCEH'.
      LOOP AT LT_POS ASSIGNING FIELD-SYMBOL(<FS_POS2>) WHERE FIELDNAME <> 'LGORT' AND FIELDNAME <> 'LGOBE' AND FIELDNAME <> 'WERKS' AND FIELDNAME <> 'ZSUM_NZP'.
        L_I = L_I + 1.
        <FS_POS2>-COL_POS = L_I.
      ENDLOOP.
    WHEN OTHERS.
  ENDCASE.

  LOOP AT LT_POS ASSIGNING FIELD-SYMBOL(<FS_POSS>).
    READ TABLE LT_CAT ASSIGNING FIELD-SYMBOL(<FS_CATT>) WITH KEY FIELDNAME = <FS_POSS>-FIELDNAME.
    IF SY-SUBRC IS INITIAL.
      <FS_CATT>-COL_POS = <FS_POSS>-COL_POS.
    ENDIF.
  ENDLOOP.

ENDFORM.

"Кнопка «Итог по цехам завода»
FORM SORT_WERKSCEH.
  DATA: LT_SORT TYPE LVC_T_SORT.
  LT_SORT = VALUE #(
                     ( SPOS = 1 FIELDNAME = 'WERKS' UP = 'X' SUBTOT = 'X' COMP = 'X' SELTEXT = 'Завод' EXPA = '' )
                     ( SPOS = 2 FIELDNAME = 'LGORT' UP = 'X' SUBTOT = '' COMP = 'X' SELTEXT = 'Склад/Цех' EXPA = '' )
                     ( SPOS = 3 FIELDNAME = 'LGOBE' UP = 'X' SUBTOT = 'X' COMP = 'X' SELTEXT = 'Название' EXPA = 'X' )
                      ).
  GO_GRID->SET_SORT_CRITERIA( IT_SORT = LT_SORT ).

  GO_GRID->GET_FRONTEND_FIELDCATALOG( IMPORTING ET_FIELDCATALOG = DATA(LT_FIELDCATALOG) ).

  LOOP AT LT_FIELDCATALOG ASSIGNING FIELD-SYMBOL(<FS_FIELDCATALOG>).
    IF STRLEN( <FS_FIELDCATALOG>-FIELDNAME ) = 3
      OR <FS_FIELDCATALOG>-FIELDNAME = 'LGOBE'
      OR <FS_FIELDCATALOG>-FIELDNAME = 'ZSUM_NZP'
      . " Все Z* кроме ZESALDO
      <FS_FIELDCATALOG>-DO_SUM = 'X'.
    ENDIF.
    "только строки итогов с полями LGORT, LGOBE, ZSUM_NZP, Z01, Z02, Z03, Z04, Z05, Z07, Z08, Z11, Z35, Z43, Z45, Z25. Остальные поля скрыть
    CASE <FS_FIELDCATALOG>-FIELDNAME.
        " 02.03.2026 1С 34685 вместо статьей показать суммы по статьям
      WHEN 'LGORT' OR 'LGOBE' OR 'ZSUM_NZP' OR 'Z01_S' OR 'Z06_1_S' OR 'Z02_S' OR 'Z03_S'  OR 'Z06_3_S' OR 'Z04_S' OR 'Z05_S' OR 'Z07_S'
        OR 'Z08_S' OR 'Z11_S' OR 'Z35_S' OR 'Z43_S' OR 'Z45_S' OR 'Z25_S' OR 'ZERR_S' "/34685
         OR 'SUMMA6' OR 'SUMMA12'  OR 'SUMMA13'  OR 'SUMMAO3'  OR 'SUMMAO5'  OR 'SUMMAO7'.   "34154
        <FS_FIELDCATALOG>-NO_OUT = ''.
        IF <FS_FIELDCATALOG>-FIELDNAME NE 'LGORT' AND  <FS_FIELDCATALOG>-FIELDNAME NE 'LGOBE'. " 02.03.2026 1С 34685 указываем поля для суммирования
          <FS_FIELDCATALOG>-DO_SUM = 'X'.
        ENDIF.
      WHEN OTHERS.
        <FS_FIELDCATALOG>-NO_OUT = 'X'.
    ENDCASE.
  ENDLOOP.

  LOOP AT LT_FIELDCATALOG ASSIGNING <FS_FIELDCATALOG>.
    <FS_FIELDCATALOG>-NO_MERGING = 'X'.
    CASE <FS_FIELDCATALOG>-FIELDNAME.
      WHEN 'WERKS'.
        <FS_FIELDCATALOG>-COL_POS = 1.
      WHEN 'LGORT'.
        <FS_FIELDCATALOG>-COL_POS = 2.
      WHEN 'LGOBE'.
        <FS_FIELDCATALOG>-COL_POS = 3.
      WHEN 'ZSUM_NZP'.
        <FS_FIELDCATALOG>-COL_POS = 4.
      WHEN OTHERS.
    ENDCASE.
  ENDLOOP.

  PERFORM GET_POS USING LT_SORT CHANGING LT_FIELDCATALOG.

  GO_GRID->GET_FRONTEND_LAYOUT( IMPORTING ES_LAYOUT = DATA(LS_LAYOUT) ).
  LS_LAYOUT-CWIDTH_OPT = 'X'.

  GO_GRID->SET_FRONTEND_FIELDCATALOG( EXPORTING IT_FIELDCATALOG = LT_FIELDCATALOG ).
  GO_GRID->SET_FRONTEND_LAYOUT( EXPORTING IS_LAYOUT = LS_LAYOUT ).

  GO_GRID->REFRESH_TABLE_DISPLAY( ).

ENDFORM.

"значения таблицы
FORM CHANGE_RB.
  CASE 'X'.
    WHEN GV_RB_ALL.
      GT_ALV = GT_REPORT.
    WHEN GV_RB_TOP20.
      GT_ALV = GT_TOP20.
    WHEN OTHERS.
  ENDCASE.
  GO_GRID->REFRESH_TABLE_DISPLAY( ).
ENDFORM.