Текущее время: Сб, июл 19 2025, 23:41

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: VBAK vs LIPS. Оптимизация запроса ABAP SAP OpenSQL.
СообщениеДобавлено: Чт, июл 18 2013, 07:16 
Младший специалист
Младший специалист

Зарегистрирован:
Ср, апр 10 2013, 17:25
Сообщения: 54
Добрый день.
Уважаемые форумчане - я в полном замешательстве!

Передо мно стоит задача связать таблички VBAK и LIPS.
Пишу вот такой вот код:

Code:
tables: vbak, " таблица торговых документов - шапки,
        vbap,
        lips. " таблица документов сбыта: поставка

types:
begin of t_contract,
  vbeln like vbak-vbeln, " № документа
  vgbel like vbak-vgbel, " № подчиненного документа
  erdat like vbak-erdat, " Дата документа
  ernam like vbak-ernam, " Автор документа
end of t_contract,
begin of t_order,
  vbeln like vbak-vbeln, " № документа
  vgbel like vbak-vgbel, " № подчиненного документа
  erdat like vbak-erdat, " Дата документа
  ernam like vbak-ernam, " Автор документа
  posnr like vbap-posnr, " Автор документа
end of t_order,
begin of t_delivery,
  vbeln like lips-vbeln, " № документа
  erdat like lips-erdat, " Дата документа
  ernam like lips-ernam, " Автор документа
  vgbel like lips-vgbel, " Автор документа
end of t_delivery.

data: gt_contract type standard table of t_contract,
      gs_contract type t_contract.

data: gt_order type standard table of t_order,
      gs_order type t_order.

data: gt_delivery type standard table of t_delivery,
      gs_delivery type t_delivery.

select-options s_period for vbak-erdat obligatory.

initialization.
  perform init_selection_screen.

start-of-selection.
  perform get_data_from_database.

form get_data_from_database .
  select
      vbak~vbeln
      vbak~vgbel
      vbak~erdat
      vbak~ernam
    into table gt_contract
    from vbak
    where vbak~erdat between s_period-low and s_period-high
      and vbak~vbtyp eq 'G'.

  select
      vbak~vbeln
      vbak~vgbel
      vbak~erdat
      vbak~ernam
      vbap~posnr
    into table gt_order
    from vbak
    left outer join vbap on vbap~vgbel = vbak~vgbel
    for all entries in gt_contract
    where vbak~vgbel = gt_contract-vbeln
      and vbak~vbtyp eq 'C'.

  select
      lips~vbeln
      lips~erdat
      lips~ernam
      lips~vgbel
    into table gt_delivery
    from lips
    for all entries in gt_order
    where lips~vgbel = gt_order-vbeln
      and lips~posnr = gt_order-posnr.
endform.                    " GET_DATA_FROM_DATABASE


проблема в том что 3 запрос даже за период 10 дней - не выполняется!
первые два запроса по таблице VBAK выполняются.
Но вот 3-ий запрос висит и вывливается с превышением времени выполнения.

О гуру! Подскажите как оптимизировать эти запросы чтобы они выполнялись!
отчет формируется при условии что период - 1 день. и то формируется около 3-ех минут.


Code:
select
      vbak~vbeln
      vbak~vgbel
      vbak~erdat
      vbak~ernam
    into table gt_contract
    from vbak
    where vbak~erdat between s_period-low and s_period-high
      and vbak~vbtyp eq 'G'.


после выполнения этого запроса получаю список из 10 контрактов.
Code:
select
      vbak~vbeln
      vbak~vgbel
      vbak~erdat
      vbak~ernam
      vbap~posnr
    into table gt_order
    from vbak
    left outer join vbap on vbap~vgbel = vbak~vgbel
    for all entries in gt_contract
    where vbak~vgbel = gt_contract-vbeln
      and vbak~vbtyp eq 'C'.


После этого запроса получаю список заказов на основании контрактов -около 30

Code:
select
      lips~vbeln
      lips~erdat
      lips~ernam
      lips~vgbel
    into table gt_delivery
    from lips
    for all entries in gt_order
    where lips~vgbel = gt_order-vbeln
      and lips~posnr = gt_order-posnr.


На основании документов закав(30 документов) - пытаюсь получить подчиненные поставки из LIPS- вот здесь вот все и вист.
Подскажите где, что не правильно делаю


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: VBAK vs LIPS. Оптимизация запроса ABAP SAP OpenSQL.
СообщениеДобавлено: Чт, июл 18 2013, 07:38 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, сен 19 2011, 13:29
Сообщения: 492
Пол: Мужской
kvartirant написал(а):
... and lips~posnr = gt_order-posnr.
тут скорее всего так:
... and lips~vgpos = gt_order-posnr.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: VBAK vs LIPS. Оптимизация запроса ABAP SAP OpenSQL.
СообщениеДобавлено: Чт, июл 18 2013, 07:48 
Ассистент
Ассистент

Зарегистрирован:
Ср, апр 25 2012, 14:25
Сообщения: 26
Существует несколько рекомендаций:
1. При использовании в запросе "for all entries in gt_contract" необходимо убедиться, что табличка не пустая
2. Выбор из таблички необходимо делать по ключевым\индексным полям "where lips~vgbel = gt_order-vbeln"
3. Посмотрите табличку VBFA, в ней содержится поток документов


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: VBAK vs LIPS. Оптимизация запроса ABAP SAP OpenSQL.
СообщениеДобавлено: Чт, июл 18 2013, 09:38 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, сен 09 2004, 07:32
Сообщения: 777
Откуда: Москва
Пол: Мужской
1) Поправьте код, как указал Korvax;
2) Обязательно проверьте наличие записей перед вызовом SELECT ... FOR ALL ENTRIES, как указал Tomatos;
3) Подружитесь с Базисом и осознайте, как работает выбор, и какими системными параметрами можно управлять его выполнением - см. SAP Note 48230. На больших объемах данных время выполнения можно существенно сократить, используя, например, параметр rsdb/max_blocking_factor.

_________________
"Прежде чем сделать что-то, подумай, к чему это может привести..."


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: VBAK vs LIPS. Оптимизация запроса ABAP SAP OpenSQL.
СообщениеДобавлено: Чт, июл 18 2013, 09:49 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Вт, май 17 2005, 13:35
Сообщения: 4871
Откуда: Москва
Пол: Мужской
Если запрос по 20 строкам уходит в бесконечность, то дело не в тонком тюнинге (rsdb/max_blocking_factor)
Надо как уже написали:
1. исправить на выбор по vgbel и vgpos а также добавить ограничение по VGTYP (константа).
2. проверить, что в lips есть индекс по этим трем полям и этот индекс существует в БД

_________________
Удача - результат нашего желания (© А. Нортон)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: VBAK vs LIPS. Оптимизация запроса ABAP SAP OpenSQL.
СообщениеДобавлено: Чт, июл 18 2013, 09:58 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Я бы еще для заказов вместо left outer join vbap написал inner join vbap.
Поставки со ссылкой только на заголовок заказа не выбираются по условию.

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: VBAK vs LIPS. Оптимизация запроса ABAP SAP OpenSQL.
СообщениеДобавлено: Сб, июл 20 2013, 18:58 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, сен 30 2011, 11:47
Сообщения: 62
Пол: Мужской
Нашел в тырнете такую рекомендацию:

Code:
SELECT vbeln INTO TABLE gt_vbfa
FROM vbfa FOR ALL ENTRIES ...
WHERE VBELV  = gt_order-vbeln
   AND posnn = gt_order-posnr
   AND VBTYP_N = 'J'   

SELECT * INTO ...
FROM lips  FOR ALL ENTRIES...
WHERE vbeln = gt_vbfa-vbeln
   AND posnr = gt_vbfa-posnn


А зачем тут позиции ограничивать, разве нужно? Если вообще сделать Range для номеров документов?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: VBAK vs LIPS. Оптимизация запроса ABAP SAP OpenSQL.
СообщениеДобавлено: Пн, июл 29 2013, 08:38 
Младший специалист
Младший специалист

Зарегистрирован:
Ср, апр 10 2013, 17:25
Сообщения: 54
Всем большое спасибо! Все получилось.

Вполне возможно что наговнокодил.
Для получения потоков документа использовал табличку vbfa

запросы получились примерно такие:
Code:
  select
    vbak~vbeln   as doc_contract
    vbkd~bstkd_m as pnd_contract
    vbap~posnr   as pos_contract
    vbap~matnr   as cmt_contract
    vbap~zmeng   as qua_contract
  into table gt_contract
  from vbak
  left outer join vbap on vbap~vbeln = vbak~vbeln
  left outer join vbkd on vbkd~vbeln = vbak~vbeln and vbkd~posnr = '000000'
  where vbak~erdat between s_period-low and s_period-high
    and vbak~vbeln in s_contr
    and vbak~vbtyp eq 'G'.

  select
    *
    from vbfa
    for all entries in gt_contract
    where vbelv = gt_contract-doc_contract
      and posnv = gt_contract-pos_contract
      and vbtyp_n eq 'C'.

    clear gs_stream_contract.
    gs_stream_contract-doc   = vbfa-vbelv.
    gs_stream_contract-pos   = vbfa-posnv.
    gs_stream_contract-s_doc = vbfa-vbeln.
    gs_stream_contract-s_pos = vbfa-posnn.

    collect gs_stream_contract into gt_stream_contract.
  endselect.


Всем БОЛЬШОЕ СПАСИБО!


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: VBAK vs LIPS. Оптимизация запроса ABAP SAP OpenSQL.
СообщениеДобавлено: Пн, июл 29 2013, 13:41 
Старший специалист
Старший специалист

Зарегистрирован:
Вт, апр 08 2008, 10:42
Сообщения: 379
Пол: Мужской
есть еще нотка по оптимизации сбытовых выборок http://scn.sap.com/thread/42680


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

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


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

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


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

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