Объектно-реляционная БД Ultima-S

Описание процедуры проведения проводки

Приводится исходный текст процедуры формирования проводок по состоянию на 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) в соотвествии с ее описанием.