Текущее время: Пт, май 16 2025, 15:28

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Исключение сторно при выборке FI-документов
СообщениеДобавлено: Пт, янв 13 2006, 15:46 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Чт, окт 27 2005, 17:13
Сообщения: 1068
Откуда: Из бессрочного бана
Пол: Мужской
Есть конструкция:
...
SELECT bukrs belnr gjahr ... INTO TABLE lt_docs FROM bsas
WHERE bukrs IN so_bukrs
AND hkont IN so_hkont
AND gjahr = ryear
AND NOT EXISTS ( SELECT * FROM bkpf
WHERE bukrs = bsas-bukrs
AND ( budat IN so_budat OR
budat < so_budat-low )
AND stblg = bsas-belnr
AND stjah = bsas-gjahr ).
...
Сторнированные и сторнирующие не исключает... В чем может быть причина? Если же данная конструкция и не должна работать, то подскажите, кто-нибудь реализовывал (см. тему) БЕЗ последующего цикла по выбранным позициям и исключением сторно, т.е. за одну выборку?

_________________
В бессрочном бане


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 13 2006, 16:01 
Старший специалист
Старший специалист

Зарегистрирован:
Пт, мар 25 2005, 11:46
Сообщения: 282
Откуда: SPb
Можно соединить с заголовком документа для бухгалтерии,
добавить условие на Финансовый год документа сторно
bkpf~stjah = ''

_________________
Лучше сделать и пожалеть, чем не сделать и потом жалеть.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 13 2006, 16:12 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Чт, окт 27 2005, 17:13
Сообщения: 1068
Откуда: Из бессрочного бана
Пол: Мужской
Условия, по которым сторно исключается (чтобы обороты за период, указанные в select-options so_budat были актуальными):
1) Если сторнируемый и сторнирующий в одном периоде или сторнируемый до указанного периода, а сторнирующий в периоде, то исключаем оба;
2) Если сторнируемый в периоде, а сторнирующий проведен после указанного периода, то первый оставляем (для оборотов).

_________________
В бессрочном бане


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 13 2006, 16:12 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
Поля stblg и stjah не пусты и у сторнированного, и у сторнирующего документа. Думаю условие AND NOT EXISTS лишнее. Можно обойтись обычным JOIN'ом:
Code:
  SELECT ...
    FROM bsas JOIN bkpf ON ....
    WHERE bkpf~stblg = space.

Тогда исключатся сторнируемые и сторнирующие.

_________________
С уважением, Сергей Королев


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 13 2006, 16:15 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Чт, окт 27 2005, 17:13
Сообщения: 1068
Откуда: Из бессрочного бана
Пол: Мужской
Да, про STBLG = space все понятно, но обороты...

_________________
В бессрочном бане


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 13 2006, 16:17 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
Dmitriy написал:
Да, про STBLG = space все понятно, но обороты...

Если считать обороты, то лучше вообще не обращать внимания на признак сторно, должно посчитаться правильно.

_________________
С уважением, Сергей Королев


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 13 2006, 16:19 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
Цитата:
должно посчитаться правильно.
- это я погорячился... имел в виду сальдо... Хотя, если все сторно - красное, и если на это обращать внимание, то и обороты должны бы сойтись...

_________________
С уважением, Сергей Королев


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 13 2006, 16:22 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Чт, окт 27 2005, 17:13
Сообщения: 1068
Откуда: Из бессрочного бана
Пол: Мужской
Задачка, конечно типовая, решалась не раз, но вот просто интересно стало, как за одну выборку это сделать (оптимизируется оборотная ведомость по счетам).

_________________
В бессрочном бане


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 13 2006, 17:04 
Гость
оптимизация подзапросом? :shock: я всегда считал что это лучший способ замедлить выполнение


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 13 2006, 17:11 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Чт, окт 27 2005, 17:13
Сообщения: 1068
Откуда: Из бессрочного бана
Пол: Мужской
Возможно будет и замедление, но подзапрос не работает, поэтому пока об этом речи нет. Вот пример для документов движений материалов, где подзапрос не только не замедляет, но работает и полезен:
SELECT mseg~mblnr mseg~mjahr ... INTO TABLE lt_mseg
FROM mseg JOIN mkpf ON mkpf~mblnr = mseg~mblnr AND
mkpf~mjahr = mseg~mjahr
WHERE mseg~bwart IN lr_bwart
AND mseg~matnr IN s_matnr
AND mseg~werks IN s_werks
AND mseg~lgort IN s_lgort
AND mseg~sobkz = ' '
AND mseg~smbln = ' '
AND mkpf~budat IN s_date
AND NOT EXISTS ( SELECT * FROM *mseg
WHERE smbln = mseg~mblnr
AND sjahr = mseg~mjahr
AND smblp = mseg~zeile ).
Здесь в критериях выбора 55 тыс. материалов, 32 завода, 7 складов.
Если не сделать подзапрос, то для исключения сторно приходиться в цикле по lt_mseg делать SELECT SINGLE ... from mseg, что для сотен тысяч записей во внутренней таблице приводит к существенному замедлению. :shock:

_________________
В бессрочном бане


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 13 2006, 17:45 
Гость
а так?
Code:
SELECT * INTO TABLE lt_doc FROM bsas as bs
WHERE bukrs IN so_bukrs
AND hkont IN so_hkont
AND gjahr = ryear
AND NOT EXISTS ( SELECT * FROM bkpf
WHERE bukrs = bs~bukrs
AND ( budat IN so_budat OR
budat < so_budat-low )
AND stblg = bs~belnr
AND stjah = bs~gjahr ).


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 13 2006, 17:45 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, май 04 2005, 16:29
Сообщения: 687
Откуда: Нижневартовск->Москва
Пол: Мужской
Думаю стоит сменить разделитель '-' на '~' в подзапросе ..


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 13 2006, 17:48 
Гость
ну да используются поля рабочей области, а не таблицы. даже синтаксическую проверку не пройдет, если нет tables: bsas. также будьте внимательны с
Code:
budat < so_budat-low
- нужно позиционироваться на строку критерия выбора.


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, янв 13 2006, 18:01 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Чт, окт 27 2005, 17:13
Сообщения: 1068
Откуда: Из бессрочного бана
Пол: Мужской
Заработало но...:
nyar, в данном случае ты вдвойне прав :), данная конструкция существенно замедляет работу (даже если убрать условие OR в подзапросе и сделать соответствующий индекс в BKPF) :(.
Спасибо за помощь!

_________________
В бессрочном бане


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, янв 16 2006, 17:54 
Гость
Dmitriy написал:
Заработало но...:
nyar, в данном случае ты вдвойне прав :), данная конструкция существенно замедляет работу (даже если убрать условие OR в подзапросе и сделать соответствующий индекс в BKPF) :(.
Спасибо за помощь!

проблема не в подзапросе как таковом. А в виде предиката. Если бы у вас бы не not exists, а просто exists, все было в плане производительности бы по иному. СУБД, она и R/3 СУБД...


Принять этот ответ
Вернуться к началу
  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

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


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

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


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

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