Текущее время: Вс, июл 20 2025, 01:04

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Yandex [Bot]


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

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