Форум OlegON > Программы и оборудование для автоматизации торговли > Системы автоматизации торговли > Супермаг Плюс (Супермаг 2000)

Функция для получения остатка на дату : Супермаг Плюс (Супермаг 2000)

26.04.2024 7:59


25.07.2013 16:14
svtl
 
1. В инете предлагается решение с помощью автономных транзакций

Вот варинат, который у меня корректно отрабатывает:
create or replace function get_goods_ondate2(art in string,
mh in number,
dat in date) return number is
Res number(14, 3);
pragma autonomous_transaction;
begin
Supermag.Remains.Calc(to_date(dat, 'dd.mm.yyyy'), false, 23, 1, false);
commit;
.....
<далее по тексту функции>
end get_goods_ondate2;

select get_goods_ondate2('100172',2,to_date('25.07.2013', 'dd.mm.yyyy'))
from dual;

Но такая функция будет работать крайне медленно.
Вы не установили фильтры для этой процедуры (Обычно в отчетах CM используют для этого Supermag.SQL_Filter).
В результате в вашем варианте в ttremains попадают каждый раз
ВСЕ карточки с ненулевыми остатками по ВСЕМ местам хранения (можете после первого обращения к функции посмотреть содержимое ttremains).

Это процедура сделано для того, чтобы за один прием заполнить таблицу для всего набора условий - выбранных артикулов, мест хранения и пр.
25.07.2013 16:22
Starter
 
Вот вариант, автора не знаю. Но внутри Select также работать не будет. По поводу автономных транзакций - можно попробовать модифицировать ее.

create or replace
function supermag.GetOstToDate(AStoreLoc in supermag.smstorelocations.id%type, AArticle in supermag.smcard.article%type, OnDate in Date) return number
is
res number := 0;
begin
supermag.sql_filter.clear_allfilters;
supermag.sql_filter.add_location(AStoreLoc);
supermag.sql_filter.add_article(AArticle);
supermag.remains.calc(OnDate, False, 23, 0, True);
begin
select quantity
into res
from supermag.ttremains r
where r.article = AArticle;
return res;
exception when no_data_found then
return 0;
end;
end;
/
25.07.2013 16:28
whitewizard
 
Как оно всё замудрёно.
Проще ночью собирать таблицу с остатками на конец дня за нужный период.
Быстрее днём будут отчёты крутиться.
25.07.2013 16:40
svtl
 
можно и не ночью, а внутри отчета. но сначала посчитать 1 раз остатки а потом делать выборки из ttremains. Период у каждого исполнителя отчета свой может быть
25.07.2013 16:43
whitewizard
 
да все равно таблица копеешная будет
25.07.2013 21:39
svtl
 
угу.... если у меня сеть 50 магазинов + 300 000 карточек + дата любая - что я получу в результате?
кмк, эта процедура тем и хороша, что опирается на уже рассчитанные остатки на конец периода (в расчете статистики) и оптимальным по быстродействию образом расчитывает уже то, что мне надо.
т.е. велосипед уже изобретен :)
26.07.2013 03:36
whitewizard
 
Тогда быстрее будет уже рассчитанная таблица, в которую будут добавляться данные каждый день.
Разумеется, кроме случая, когда нужны остатки на единичные товары.
26.07.2013 15:46
Explosion
 
Задумался...
А кто-нибудь знает как можно эти остатки получить обходным путем?))
Ну к примеру через FastReport и оракл в связке
26.07.2013 15:47
Explosion
 
Или какой-нить прикладной программой дергать данные из отчета?
26.07.2013 15:49
Mtirt
 
Для каких целей это требуется? И какие именно остатки?
Может тебе текущих достаточно. Из smgoods выбрать и вся недолга...
Часовой пояс GMT +3, время: 07:59.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.