Текущее время: Пн, июл 28 2025, 15:05

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Оптимизация кода
СообщениеДобавлено: Пт, апр 23 2010, 10:21 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, авг 03 2009, 15:37
Сообщения: 292
Откуда: Алматы
Пол: Мужской
Здравствуйте коллеги.
Необходим совет.
Code:
 
  SORT it_out BY gsber kvgr3 matnr.
  REFRESH itab.
  LOOP AT it_out INTO wa_out.
    itab-gsber = wa_out-gsber.
    itab-gtext = wa_out-gtext.
    SUM.
    trgsm = wa_out-trgsm.
    daylt = wa_out-daylt.
    daykg = wa_out-daykg.
    sobnu = wa_out-sobnu.
    karlt = wa_out-karlt.
    zapta = wa_out-zapta.
    kartg = wa_out-kartg.
    total = daykg - sobnu - trgsm.
    raznc = total - karlt - zapta - kartg.
    AT NEW gsber.
      CLEAR itab-kvgr3.
      CLEAR itab-bezei.
      CLEAR itab-matnr.
      CLEAR itab-arktx.
      SUM.
      itab-daykg = wa_out-daykg.
      itab-daylt = wa_out-daylt.
      itab-trgsm = wa_out-trgsm.
      itab-sobnu = wa_out-sobnu.
      itab-total = wa_out-daylt - wa_out-trgsm - wa_out-sobnu.
      itab-zapta = wa_out-zapta.
      itab-karlt = wa_out-karlt.
      itab-kartg = wa_out-kartg.
      itab-raznc = wa_out-daylt - wa_out-trgsm - wa_out-sobnu - wa_out-zapta - wa_out-karlt - wa_out-kartg.
      APPEND itab.
    ENDAT.
    itab-kvgr3 = wa_out-kvgr3.
    itab-bezei = wa_out-bezei.
    AT NEW kvgr3.
      CLEAR itab-gtext.
      CLEAR itab-matnr.
      CLEAR itab-arktx.
      SUM.
      itab-daykg = wa_out-daykg.
      itab-daylt = wa_out-daylt.
      itab-trgsm = wa_out-trgsm.
      itab-sobnu = wa_out-sobnu.
      itab-total = wa_out-daylt - wa_out-trgsm - wa_out-sobnu.
      itab-zapta = wa_out-zapta.
      itab-karlt = wa_out-karlt.
      itab-kartg = wa_out-kartg.
      itab-raznc = wa_out-daylt - wa_out-trgsm - wa_out-sobnu - wa_out-zapta - wa_out-karlt - wa_out-kartg.
      APPEND itab.
    ENDAT.
    itab-kvgr3 = wa_out-kvgr3.
    itab-matnr = wa_out-matnr.
    itab-arktx = wa_out-arktx.
    AT NEW matnr.
      CLEAR itab-gtext.
      CLEAR itab-bezei.
      SUM.
      itab-daykg = wa_out-daykg.
      itab-daylt = wa_out-daylt.
      itab-trgsm = wa_out-trgsm.
      itab-sobnu = wa_out-sobnu.
      itab-total = wa_out-daylt - wa_out-trgsm - wa_out-sobnu.
      itab-zapta = wa_out-zapta.
      itab-karlt = wa_out-karlt.
      itab-kartg = wa_out-kartg.
      itab-raznc = wa_out-daylt - wa_out-trgsm - wa_out-sobnu - wa_out-zapta - wa_out-karlt - wa_out-kartg.
      APPEND itab.
    ENDAT.
  ENDLOOP.

Отрабатывает верно, но ооочень медленно. Подскажите как можно соптимизировать... Заранее большое спасибо.

_________________
Все в этом мире стоит под сомнением, над сомнением – только google...


Последний раз редактировалось FeBO-Sh Вт, апр 27 2010, 07:17, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: SUM
СообщениеДобавлено: Пт, апр 23 2010, 11:05 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Ср, июн 13 2007, 16:36
Сообщения: 585
Откуда: Belarus
Пол: Мужской
В этом куске кода - никак.
Вы уверены, что именно этот кусок работает ооочень медленно ?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SUM
СообщениеДобавлено: Пт, апр 23 2010, 11:19 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, авг 03 2009, 15:37
Сообщения: 292
Откуда: Алматы
Пол: Мужской
да, уверен
Проверял в отладчике, при выполнении цикла система подвисла на несколько минут

_________________
Все в этом мире стоит под сомнением, над сомнением – только google...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: SUM
СообщениеДобавлено: Пт, апр 23 2010, 11:22 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, окт 31 2008, 15:58
Сообщения: 70
Добрый день!

Предлагаю поменять данную структуру на следующую:

1) Оставляется loop и ассайнитца к <fs>
2) Далее создается сортированная таблица, по структуре равная начальной таблицы, но с нужными ключами для чтения
3)Делается чтение данной таблицы по нужным условиям <fs> в другую <fs> с binary search
4) Далее если записи с таким ключом нет, то append
5)Если есть делаем нужные операции
Пример:
Code:
LOOP AT lt_tab1 ASSIGNING <fs1>.
  READ TABLE lt_tab2 ASSIGNING <fs2>
  WITH KEY a = <fs1>-a BINARY SEARCH.
  IF sy-subrc = 0.
    ADD <fs1>-b TO <fs2>-b.
    ADD <fs1>-c TO <fs2>-c.
  ELSE.
    APPEND <fs2> TO lt_tab2.
  ENDIF.

ENDLOOP.

Должно работать очень быстро

_________________
С Уважением, Абрамов Виктор.
The devil is in the detail.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SUM
СообщениеДобавлено: Пт, апр 23 2010, 11:28 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, авг 03 2009, 15:37
Сообщения: 292
Откуда: Алматы
Пол: Мужской
Спасибо, буду пробовать

_________________
Все в этом мире стоит под сомнением, над сомнением – только google...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: SUM
СообщениеДобавлено: Пт, апр 23 2010, 15:27 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, авг 03 2009, 15:37
Сообщения: 292
Откуда: Алматы
Пол: Мужской
Все хорошо. Не получается только сделать заголовки c суммами по трем ключевым полям, в моем случае это GSBER, KVGR3, MATNR.
Данные со старым кодом не сходятся. Не пойму где ошибся. Код:
Code:
  REFRESH itab.
  LOOP AT it_out ASSIGNING <fs_out>.
    READ TABLE itab ASSIGNING <fs_sout>
         WITH KEY gsber = <fs_out>-gsber
*                  kvgr3 = <fs_out>-kvgr3
*                  matnr = <fs_out>-matnr
                  hdr = 'G'
                  BINARY SEARCH.
    IF sy-subrc = 0.
      ADD <fs_out>-daykg TO <fs_sout>-daykg.
      ADD <fs_out>-daylt TO <fs_sout>-daylt.
      ADD <fs_out>-sobnu TO <fs_sout>-sobnu.
      ADD <fs_out>-total TO <fs_sout>-total.
      ADD <fs_out>-zapta TO <fs_sout>-zapta.
      ADD <fs_out>-raznc TO <fs_sout>-raznc.
      ADD <fs_out>-karlt TO <fs_sout>-karlt.
      ADD <fs_out>-trgsm TO <fs_sout>-trgsm.
      ADD <fs_out>-kartg TO <fs_sout>-kartg.
      READ TABLE itab ASSIGNING <fs_sout>
           WITH KEY gsber = <fs_out>-gsber
                    kvgr3 = <fs_out>-kvgr3
*                    matnr = <fs_out>-matnr
                    hdr = 'K'
                    BINARY SEARCH.
      IF sy-subrc = 0.
        ADD <fs_out>-daykg TO <fs_sout>-daykg.
        ADD <fs_out>-daylt TO <fs_sout>-daylt.
        ADD <fs_out>-sobnu TO <fs_sout>-sobnu.
        ADD <fs_out>-total TO <fs_sout>-total.
        ADD <fs_out>-zapta TO <fs_sout>-zapta.
        ADD <fs_out>-raznc TO <fs_sout>-raznc.
        ADD <fs_out>-karlt TO <fs_sout>-karlt.
        ADD <fs_out>-trgsm TO <fs_sout>-trgsm.
        ADD <fs_out>-kartg TO <fs_sout>-kartg.
        READ TABLE itab ASSIGNING <fs_sout>
             WITH KEY gsber = <fs_out>-gsber
                      kvgr3 = <fs_out>-kvgr3
                      matnr = <fs_out>-matnr
                      hdr = 'M'
                      BINARY SEARCH.
        IF sy-subrc = 0.
          ADD <fs_out>-daykg TO <fs_sout>-daykg.
          ADD <fs_out>-daylt TO <fs_sout>-daylt.
          ADD <fs_out>-sobnu TO <fs_sout>-sobnu.
          ADD <fs_out>-total TO <fs_sout>-total.
          ADD <fs_out>-zapta TO <fs_sout>-zapta.
          ADD <fs_out>-raznc TO <fs_sout>-raznc.
          ADD <fs_out>-karlt TO <fs_sout>-karlt.
          ADD <fs_out>-trgsm TO <fs_sout>-trgsm.
          ADD <fs_out>-kartg TO <fs_sout>-kartg.
        ELSE.
          <fs_out>-hdr = 'M'. " Заголовок [G-gsber, K-kvgr3, M-matnr]
          CLEAR: <fs_out>-gtext, <fs_out>-bezei.
          APPEND <fs_out> TO itab.
        ENDIF.
      ELSE.
        <fs_out>-hdr = 'K'. " Заголовок [G-gsber, K-kvgr3, M-matnr]
        CLEAR: <fs_out>-matnr, <fs_out>-gtext, <fs_out>-arktx.
        APPEND <fs_out> TO itab.
      ENDIF.
    ELSE.
      ind = ind + 1.
      <fs_out>-ind = ind.
      <fs_out>-hdr = 'G'. " Заголовок [G-gsber, K-kvgr3, M-matnr]
      CLEAR: <fs_out>-kvgr3, <fs_out>-matnr, <fs_out>-bezei, <fs_out>-arktx.
      APPEND <fs_out> TO itab.
    ENDIF.
*    DELETE it_out.
  ENDLOOP.

_________________
Все в этом мире стоит под сомнением, над сомнением – только google...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: SUM
СообщениеДобавлено: Пт, апр 23 2010, 15:51 
Модератор
Модератор

Зарегистрирован:
Пт, ноя 12 2004, 11:40
Сообщения: 542
Откуда: Москва
Пол: Мужской
может collect'ом будет быстрее...


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SUM
СообщениеДобавлено: Вт, апр 27 2010, 07:15 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, авг 03 2009, 15:37
Сообщения: 292
Откуда: Алматы
Пол: Мужской
Есть такой код
Code:
  SELECT vak~vbeln 
         vap~posnr           
         vap~matnr           
         vak~vdatu AS audat   
         vak~auart           
         vak~vtweg           
         vak~kunnr           
         vak~vkorg           
         vak~waerk           
         vak~erzet           
         vak~vbtyp           
         kna~ktokd           
         kna~stcd1           
         kna~name1         
         vap~vrkme           
         lps~vbeln AS id_dlv
         vrp~vbeln AS factr
         vak~knumv           
         vap~kwmeng AS lfimg
         vap~netwr AS netwr_o
         vap~mwsbp AS mwsbp_o
         vrp~netwr AS netwr_f
         vrp~mwsbp AS mwsbp_f
         INTO  TABLE it1
    FROM vbak AS vak
    INNER JOIN vbap AS vap ON vap~vbeln = vak~vbeln
    INNER JOIN kna1 AS kna ON kna~kunnr = vak~kunnr
    INNER JOIN lips AS lps ON lps~vgbel = vap~vbeln AND lps~vgpos = vap~posnr
    INNER JOIN vbuk AS vuk ON vuk~vbeln = lps~vbeln
    LEFT OUTER JOIN vbrp AS vrp ON vrp~vgbel = lps~vbeln AND vrp~vgpos = lps~posnr
    WHERE vuk~wbstk = 'C'
    AND vak~kunnr IN p_kunnr
    AND vak~auart IN r_auart
    AND vak~vtweg IN p_vtweg
    AND vak~vdatu IN p_audat
    AND vap~matnr IN p_matnr
    ORDER BY vak~vdatu vak~vbeln vap~posnr.

Все было нормально, только теперь надо добавить в код условие на вид материала (если вид материала = 1, inner join LIPS, если вм = 2, тогда VBRP). Есть вариант:
Code:
SELECT ... INTO wa
    FROM ...
    INNER JOIN ...
      CASE wa-mtart.                          " Проверка на вид материала
        WHEN ....
           SELECT ... INTO CORRESPONDING FIELDS OF wa ... FROM ...
           APPEND wa TO tb.
        WHEN others.
           ...
      ENDCASE.
ENDSELECT.

Прочитав посты по оптимизации, понял что это не самый быстрый способ.
Может у кого есть более оптимальные варианты. Заранее всем спс.

_________________
Все в этом мире стоит под сомнением, над сомнением – только google...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Оптимизация кода
СообщениеДобавлено: Вт, апр 27 2010, 08:35 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Вам поможет выборка по таблице VBFA.
1.Выбираете из VBFA записи с join mara во внутреннюю таблицу
2.По записям с mtart = 1 и vbfa~vbtyp_n = 'J' выбираете отдельным селектом данные из lips
3.По записям с mtart = 2 и vbfa~vbtyp_n = 'M', 'N', '5','6' выбираете отдельным селектом данные из vbrp

Это будет намного быстрее.

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Оптимизация кода
СообщениеДобавлено: Вт, апр 27 2010, 12:11 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, авг 03 2009, 15:37
Сообщения: 292
Откуда: Алматы
Пол: Мужской
Спасибо.

_________________
Все в этом мире стоит под сомнением, над сомнением – только google...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB