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).
Это процедура сделано для того, чтобы за один прием заполнить таблицу для всего набора условий - выбранных артикулов, мест хранения и пр.