Приводится исходный текст процедуры формирования проводок по состоянию на 1 января 1999г. С того момента процедура прошла оптимизацию (она уже в 1 insert и т.д.), было подключено 20 уровней аналитики. Однако приводимый вариант с одной стороны прост для понимания, а с другой не раскрывает технологических секретов Ultima-S.
create procedure SuperDocPass
--быстрая (в 2-insert'a) процедура
--пакетной проводки всех проводок к документу
@DocUDN int, --Документ
@dt datetime, --На какую дату провести
@gran int, --Грануляция
@AccId int -- План счетов
as
declare @di int
create table #DocPass(UDN int) --Табличка проводок к документу
insert #DocPass select UDN from Pass
where Doc=@DocUDN and Processed=0 and AccId=@AccId
--Вычисляем индекс грануляции (номер периода) для даты проводки, если надо его двигаем
ag:
select @di=Cindex from GranDates where @dt>=d1 and @dt<d2 and UDN=@gran
if @di=null or @di is null
if (select d1 from GranDates where UDN=@gran and Cindex=1) <= @dt
if (select Auto from Gran where UDN=@gran) > 0
begin
exec granexpand @gran
goto ag
end
tbegin
--Протаскиваем всю аналитику одним махом через триггер
insert Complect (UDN, u1, u2, u3, u4, u5, u6, u7, u8, i, s, v, doc)
select Acc1, @di, u1, u6, u3, u5, u7, u8, u9, ,i, s, v,P.UDN
from Complect C, Pass P
where P.UDN in (select UDN from #DocPass) and C.UDN=P.UDN
insert Complect (UDN, u1, u2, u3, u4, u5, u6, u7, u8, upkt, i, s, v, doc)
select -Acc2, @di, u2, u10, u4, u5, u11, u12, u13, ,i, s, v,P.UDN
from Complect C, Pass P
where P.UDN in (select UDN from #DocPass) and C.UDN=P.UDN
--Фиксируем проводки проведенными на dt
update Pass set Processed=1 where UDN in (select UDN from #DocPass)
update Docs set Date=@dt where UDN in (select UDN from #DocPass)
tcommit
drop table #DocPass
go
Обратите внимание, на строки insert Complect … from Complect фактически этими строками комплект аналитики переводится по маршруту аналитики из под проводки (Pass) под счета дебета и кредита (Acc).
На insert, delete, update для Complect поставлен триггер SaldoInformator, который ловит эти insert'ы и формирует (правит) таблицу сальдо (Saldo) в соотвествии с ее описанием.