Получить итоговые и промежуточные итоги без петли в новом abap - PullRequest
0 голосов
/ 10 октября 2018

Я начинаю изучать новый способ.Но у меня есть проблемы.Я хочу сделать вывод результатов, как показано ниже, без использования операторов "LOOP" и "AT".

У меня есть внутренняя таблица, например:

Category Amount
    AAA     10
    AAA     20
    BBB     30
    CCC     40
    CCC     50
    CCC     60

Мне нужно отобразить вывод как:

Category Amount
    AAA       10
    AAA       20
    SUBTOTAL  30
    BBB       30
    SUBTOTAL  30
    CCC       40
    CCC       50
    CCC       60
    SUBTOTAL  150
    TOTAL     210

Кто-нибудь может помочь с этим?

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Я делаю этот код, как показано ниже.

TYPES: LTY_DISPLAY TYPE STANDARD TABLE OF TY_DISPLAY WITH EMPTY KEY.

LT_DISPLAY = REDUCE LTY_DISPLAY
             ( INIT LIST = VALUE LTY_DISPLAY( )
               SUBTOTAL = VALUE LTY_DISPLAY( )
               TOTAL = VALUE LTY_DISPLAY( )
               LV_TEXT TYPE STRING

               FOR GROUPS <GROUP_KEY> OF <WA> IN GT_MAIN GROUP BY ( CATEGORY = <WA>-CATEGORY ) ASCENDING
               NEXT lV_TEXT = <GROUP_KEY>
                    LIST = VALUE LTY_COSP( BASE SUBTOTAL FOR <WA1> IN GROUP <GROUP_KEY> ( <WA1> ) )
                    SUBTOTAL = VALUE LTY_COSP( BASE LIST ( CATEGORY = 'SUBTOTAL' && LV_TEXT
                                                           AMOUNT = REDUCE #( INIT SUM TYPE P
                                                                               FOR M IN GROUP <GROUP_KEY>
                                                                               NEXT SUM = SUM + M-AMOUNT ) ) )
                    TOTAL = VALUE LTY_COSP( BASE SUBTOTAL ( CATEGORY = 'TOTAL' 
                                                              AMOUNT = REDUCE #( INIT SUM TYPE P
                                                                                  FOR M IN GT_MAIN
                                                                                  NEXT SUM = SUM + M-AMOUNT ) ) ) ).
0 голосов
/ 11 октября 2018

Если ваш вопрос о том, как построить внутреннюю таблицу (в памяти) с помощью выражений конструктора (ABAP> = 7.40), а не отображать ее на экране или в файле спула (итоги и промежуточные итоги - это функции, хорошо интегрированные в ALVи простой в использовании), вот один из способов сделать это (ASSERT здесь, чтобы показать, что окончательное значение соответствует ожидаемому):

TYPES : BEGIN OF ty_line,
          category TYPE string,
          amount   TYPE decfloat16,
        END OF ty_line,
        ty_lines TYPE STANDARD TABLE OF ty_line WITH DEFAULT KEY.

DATA(gt_main) = VALUE ty_lines( ( category = 'AAA' amount = 10 )
                                ( category = 'AAA' amount = 20 )
                                ( category = 'BBB' amount = 30 )
                                ( category = 'CCC' amount = 40 )
                                ( category = 'CCC' amount = 50 )
                                ( category = 'CCC' amount = 60 ) ).

DATA(lt_display) = VALUE ty_lines(
        ( LINES OF VALUE #(
              FOR GROUPS <g> OF <line> IN gt_main
              GROUP BY ( category = <line>-category )
              ( LINES OF VALUE #( FOR <line2> IN GROUP <g> ( <line2> ) ) )
              ( category = 'SUBTOTAL'
                amount = REDUCE #( INIT subtotal TYPE ty_line-amount
                                   FOR <line2> IN GROUP <g>
                                   NEXT subtotal = subtotal + <line2>-amount ) ) ) )
        ( category = 'TOTAL'
          amount = REDUCE #( INIT total TYPE ty_line-amount
                             FOR <line> IN gt_main
                             NEXT total = total + <line>-amount ) ) ).

ASSERT lt_display = VALUE ty_lines( ( category = 'AAA'      amount = 10 )
                                    ( category = 'AAA'      amount = 20 )
                                    ( category = 'SUBTOTAL' amount = 30 )
                                    ( category = 'BBB'      amount = 30 )
                                    ( category = 'SUBTOTAL' amount = 30 )
                                    ( category = 'CCC'      amount = 40 )
                                    ( category = 'CCC'      amount = 50 )
                                    ( category = 'CCC'      amount = 60 )
                                    ( category = 'SUBTOTAL' amount = 150 )
                                    ( category = 'TOTAL'    amount = 210 ) ).
0 голосов
/ 11 октября 2018

Если вы не хотите перебирать внутреннюю таблицу с помощью loop at, то вы всегда можете использовать функциональный модуль, который будет проходить через внутреннюю таблицу и печатать итоги и промежуточные итоги.

REUSE_ALV_GRID_DISPLAY является одним из таких функциональных модулей.

Вы можете проверить следующую ссылку для учебника: http://www.saphub.com/abap-tutorial/abap-alv-total-subtotal/

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

Однако, еще более новый способ, чем использование объектно-ориентированной реализации отчетов ALV.Посмотрите на CL_GUI_ALV_GRID.

Вот вступительная статья о CL_GUI_ALV_GRID: https://wiki.scn.sap.com/wiki/display/ABAP/OBJECT+ORIENTED+ALV+Guide

...