SAP R/3 форум ABAP консультантов
Russian ABAP Developer's Club

Home - FAQ - Search - Memberlist - Usergroups - Profile - Log in to check your private messages - Register - Log in - English
Blogs - Weblogs News

Разворот столбцов в строки в ALV



 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ALV Grid / ALV Tree / ALV List
View previous topic :: View next topic  
Author Message
Garik
Специалист
Специалист



Joined: 11 Oct 2007
Posts: 60

PostPosted: Fri Dec 14, 2007 5:39 pm    Post subject: Разворот столбцов в строки в ALV Reply with quote

Коллеги, посоветуйте алгоритм. В таблице данные хранятся в виде
Code:

id   Месяц  Сумма
001  07   2300
001  08   2500
001  09   7800
001  10   4500
002  07   ---
003  07   4100
003  08   2500
004  07   2400
004  08   ---
004  09   7000
005  07   3600


Их нужно отобразить в ALV в развернутом виде.
Code:

id  Назв.  Месяц Сумма Месяц Сумма Месяц Сумма Месяц Сумма
001 Имя1    07    2300  08    2500  09    7800  10    4500
002 Имя2    --
004 Имя4    07    4100  08     --      09    7000   --    ---
005 Имя5    07    3600
Back to top
View user's profile Send private message
John Doe
Модератор
Модератор


Age: 42
Joined: 05 Nov 2007
Posts: 725
Location: КраснАдар

PostPosted: Fri Dec 14, 2007 7:40 pm    Post subject: Reply with quote

Вопрос не тривиальный, ответ такой же будет.
В общем виде нужно сделать так:
1. Из данных таблицы сформировать три: таблицу строк, таблицу столбцов и таблицу данных, в которой будут лежать значения на стыке строк и столбцов. Пример
Code:
Таблица строк
ROW      ID     NAME
1        001    Имя 1
2        002    Имя 2
3        003    Имя 3
4        004    Имя 4

Таблица столбцов
COL        MONTH
1          07
2          08
3          09
4          10

Таблица данных
ROW      COL      VALUE
1        1        2300
1        2        2500
1        3        7800
1        4        4500
2        1        0
3        1        4100
3        2        2500
4        1        2400
4        2        0


2. Далее динамически создаем нужную структурку и внутреннюю табличку, которую будем выводить в грид.

3. Делаем цикл по таблице строк. Внутри него циклимся по таблице столбцов. Внутри него читаем таблицу данных и заполняем значениями структурку. Аппендим ее в табличку.

4. После формирования - показываем ее пользователю. Он радуется и благодарит нас - мы чувствуем себя отлично!!!
Back to top
View user's profile Send private message Blog
admin
Администратор
Администратор



Joined: 01 Sep 2007
Posts: 1636

PostPosted: Fri Dec 14, 2007 11:52 pm    Post subject: Reply with quote

Тема весьма интересная, Garik, если выложите код, перенесем в Готовые решения.
Back to top
View user's profile Send private message
John Doe
Модератор
Модератор


Age: 42
Joined: 05 Nov 2007
Posts: 725
Location: КраснАдар

PostPosted: Sat Dec 15, 2007 12:27 am    Post subject: Reply with quote

admin wrote:
Тема весьма интересная, Garik, если выложите код, перенесем в Готовые решения.

Реализовал неделю назад. Но требует адаптации - у меня динамически заполняются столбцы статического Table control с очень длинной структурой (расчет на 50 лет - в текущих и базовых ценах). К середине следующей недели будет свободная минутка - сделаю пример.

ЗЫ Эту технологию я честно украл из папок планирования BW. Можно подсмотреть в группах функций UPB_*. За вывод этого "нечто" отвечает группа функций UPB_PM_ALV или что-то в этом роде...

ЗЗЫ Странно, что у Garikа попросили месяцы перед суммой выводить - у меня затребовали в шапку вынести. Мне кажется, что требование моего консультанта несколько логичнее.
Back to top
View user's profile Send private message Blog
admin
Администратор
Администратор



Joined: 01 Sep 2007
Posts: 1636

PostPosted: Sat Dec 15, 2007 1:31 am    Post subject: Reply with quote

John Doe wrote:
ЗЗЫ Странно, что у Garikа попросили месяцы перед суммой выводить - у меня затребовали в шапку вынести. Мне кажется, что требование моего консультанта несколько логичнее.


Да, я бы тоже Месяцы (Периоды) в Шапке отобразил, а для универсальности алгоритма Год отдельным столбцом вынес.
Отчет то довольно стандартный - оборотка по месяцам, начального/конечного баланса не хватает.
Back to top
View user's profile Send private message
John Doe
Модератор
Модератор


Age: 42
Joined: 05 Nov 2007
Posts: 725
Location: КраснАдар

PostPosted: Wed Dec 19, 2007 5:56 pm    Post subject: Reply with quote

Как и обещал:
Code:
*************** Set test data ******************
INITIALIZATION.
  DATA: BEGIN OF WA,
         ID(3)    TYPE N,
         IDTEXT(20),
         MONTH(2) TYPE N,
         VALUE    TYPE I,
        END OF WA,
        ITAB LIKE WA OCCURS 0 WITH HEADER LINE,
        N TYPE I, M TYPE I.

* Prepare data table
  DO 10 TIMES.
    N = N + 1.
    WA-ID = N.
    CONCATENATE 'Product ¹' WA-ID INTO WA-IDTEXT.
    CLEAR M.
    DO 12 TIMES.
      M = M + 1.
      WA-MONTH = M.
      CALL FUNCTION 'BKK_RANDOM'
        EXPORTING
          I_MODULO        = 100
        IMPORTING
          E_RANDOM_NUMBER = WA-VALUE.
      APPEND WA TO ITAB.
    ENDDO.
  ENDDO.
  CLEAR: N, M.

***************** Program *************************
START-OF-SELECTION.
  DATA: BEGIN OF ROW_TAB OCCURS 0,
         ROW(3) TYPE N,
         ID(3)  TYPE N,
         IDTEXT(20),
        END OF ROW_TAB,
        BEGIN OF COL_TAB OCCURS 0,
          COL(3) TYPE N,
          MONTH(2) TYPE N,
        END OF COL_TAB,
        BEGIN OF VALUE_TAB OCCURS 0,
          ROW(3) TYPE N,
          COL(3) TYPE N,
          VALUE  TYPE I,
        END OF VALUE_TAB.

  DATA: BUFFER_TAB LIKE ITAB OCCURS 0 WITH HEADER LINE.
  DATA: FCAT TYPE LVC_T_FCAT, HCAT TYPE LVC_S_FCAT,
        LAYOUT TYPE LVC_S_LAYO.
  DATA: DREFTAB TYPE REF TO DATA,
        DREFHEAD TYPE REF TO DATA,
        FIELDNAME TYPE STRING.

  FIELD-SYMBOLS: <OUTTAB> TYPE TABLE,
                 <HEADER> TYPE ANY,
                 <FIELD>  TYPE ANY,
                 <SUM>    TYPE ANY.

* Prepare row table
  BUFFER_TAB[] = ITAB[].
  SORT BUFFER_TAB BY ID.
  DELETE ADJACENT DUPLICATES FROM BUFFER_TAB COMPARING ID.
  LOOP AT BUFFER_TAB.
    ROW_TAB-ROW    = SY-TABIX.
    ROW_TAB-ID     = BUFFER_TAB-ID.
    ROW_TAB-IDTEXT = BUFFER_TAB-IDTEXT.
    APPEND ROW_TAB.
  ENDLOOP.

* Prepare column table
  BUFFER_TAB[] = ITAB[].
  SORT BUFFER_TAB BY MONTH.
  DELETE ADJACENT DUPLICATES FROM BUFFER_TAB COMPARING MONTH.
  LOOP AT BUFFER_TAB.
    COL_TAB-COL    = SY-TABIX.
    COL_TAB-MONTH  = BUFFER_TAB-MONTH.
    APPEND COL_TAB.
  ENDLOOP.

* Prepare value table
  LOOP AT ITAB.
    READ TABLE ROW_TAB WITH KEY ID    = ITAB-ID.
    READ TABLE COL_TAB WITH KEY MONTH = ITAB-MONTH.
    VALUE_TAB-ROW   = ROW_TAB-ROW.
    VALUE_TAB-COL   = COL_TAB-COL.
    VALUE_TAB-VALUE = ITAB-VALUE.
    APPEND VALUE_TAB.
  ENDLOOP.

* Create structure of fieldcatalog
  CLEAR HCAT. N = N + 1.
  HCAT-COL_POS   = N.
  HCAT-FIELDNAME = 'ID'.
  HCAT-COLTEXT   = 'ID'.
  HCAT-DATATYPE  = 'CHAR'.
  HCAT-INTTYPE   = 'C'.
  HCAT-INTLEN    = '3'.
  HCAT-KEY       = 'X'.
  APPEND HCAT TO FCAT.
  CLEAR HCAT. N = N + 1.
  HCAT-COL_POS   = N.
  HCAT-FIELDNAME = 'IDTEXT'.
  HCAT-COLTEXT   = 'IDTEXT'.
  HCAT-DATATYPE  = 'CHAR'.
  HCAT-INTTYPE   = 'C'.
  HCAT-INTLEN    = '20'.
  HCAT-KEY       = 'X'.
  APPEND HCAT TO FCAT.
* Set dynamic columns with assigning values
  LOOP AT COL_TAB.
    CLEAR HCAT. N = N + 1.
    HCAT-COL_POS   = N.
    CONCATENATE 'MONTH' COL_TAB-MONTH INTO HCAT-FIELDNAME.
    CONCATENATE 'Month ' COL_TAB-MONTH INTO HCAT-COLTEXT RESPECTING BLANKS.
    HCAT-DATATYPE  = 'INT2'.
    HCAT-INTTYPE   = 'N'.
    HCAT-INTLEN    = '12'.
    HCAT-NO_ZERO   = 'X'.
    APPEND HCAT TO FCAT.
  ENDLOOP.
  CLEAR HCAT. N = N + 1.
  HCAT-COL_POS   = N.
  HCAT-FIELDNAME = 'YEAR'.
  HCAT-COLTEXT   = 'Year summary'.
  HCAT-DATATYPE  = 'INT2'.
  HCAT-INTTYPE   = 'N'.
  HCAT-INTLEN    = '12'.
  HCAT-EMPHASIZE = 'C500'.
  APPEND HCAT TO FCAT.

* Dynamic create internal table & header
  CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
    EXPORTING
      IT_FIELDCATALOG = FCAT
    IMPORTING
      EP_TABLE        = DREFTAB.

  ASSIGN DREFTAB->* TO <OUTTAB>.
  CHECK SY-SUBRC IS INITIAL.

  CREATE DATA DREFHEAD LIKE LINE OF <OUTTAB>.
  ASSIGN DREFHEAD->* TO <HEADER>.
  CHECK SY-SUBRC IS INITIAL.

* Prepare outtab
  LOOP AT ROW_TAB.
    ASSIGN COMPONENT 'ID' OF STRUCTURE <HEADER> TO <FIELD>.
    CHECK SY-SUBRC IS INITIAL.
    <FIELD> = ROW_TAB-ID.
    UNASSIGN <FIELD>.
    ASSIGN COMPONENT 'IDTEXT' OF STRUCTURE <HEADER> TO <FIELD>.
    CHECK SY-SUBRC IS INITIAL.
    <FIELD> = ROW_TAB-IDTEXT.
    UNASSIGN <FIELD>.

    ASSIGN COMPONENT 'YEAR' OF STRUCTURE <HEADER> TO <SUM>.
    LOOP AT COL_TAB.
      READ TABLE VALUE_TAB WITH KEY ROW = ROW_TAB-ROW COL = COL_TAB-COL.
      CONCATENATE 'MONTH' COL_TAB-MONTH INTO FIELDNAME.
      ASSIGN COMPONENT FIELDNAME OF STRUCTURE <HEADER> TO <FIELD>.
      CHECK SY-SUBRC IS INITIAL.
      <FIELD> = VALUE_TAB-VALUE.
      <SUM> = <SUM> + <FIELD>.
      UNASSIGN <FIELD>.
    ENDLOOP.
    UNASSIGN <SUM>.
    APPEND <HEADER> TO <OUTTAB>.
    CLEAR <HEADER>.
  ENDLOOP.

  LAYOUT-CWIDTH_OPT = 'X'.

***************** Output view ***********************
END-OF-SELECTION.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      IS_LAYOUT_LVC   = LAYOUT
      IT_FIELDCAT_LVC = FCAT
    TABLES
      T_OUTTAB        = <OUTTAB>
    EXCEPTIONS
      PROGRAM_ERROR   = 1
      OTHERS          = 2.
  IF SY-SUBRC <> 0.
    LEAVE PROGRAM.
  ENDIF.
Back to top
View user's profile Send private message Blog
Display posts from previous:   
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ALV Grid / ALV Tree / ALV List All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG.
SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG.
Every effort is made to ensure content integrity. Use information on this site at your own risk.