Шаг 9 - Описание структуры данных "бухгалтерии"

И, наконец собственно наш взгляд на бухгалтерию.

Итак, основные данные о бухгалтерских операциях мы решили хранить в таблице под названием "Главная Книга", к сожалению, это несколько не бухгалтерское понятие - у нас получился список всех проведенных элементарных операций. Исходя из идей "нормализации данных", решили "обзавестись" еще табличками - "СЧЕТА", "Аналитика", "ВАЛЮТЫ", "КУРСЫ"... И, пожалуй, главная табличка - "ОСТАТКИ" почему главная? :-) - да, к слову.. на самом деле, остатки нам не нужны :-)) - нет ничего проще - взять и суммировать числа в одной из колонок таблицы.... вот только это (суммирование) самая длительная операция из всего, что есть в "сиквеле". Представляете, сколько будет длится получение остатков на счете? :-) - я пробовал, и знаю, что это очень долго, просто неприемлемо долго... так что, проще бороться с остатками...

Главная книга:

CREATE TABLE SYSADM.GROS_BUCH (
	ID VARCHAR(18) NOT NULL, 
	ROW_DATE DATE, 
	ID_D_ACC VARCHAR(18), 
	ID_K_ACC VARCHAR(18), 
	ID_AN_D VARCHAR(18), 
	ID_AN_K VARCHAR(18), 
	DEFIneRow VARCHAR(18), 
	Money_ROW DOUBLE PRECISION, 
	quanti_ROW DOUBLE PRECISION, 
	NUMJOURNAL VARCHAR(10), 
	ID_CUR VARCHAR(18), 
	ID_DOC VARCHAR(18), 
	ID_STR_DOC VARCHAR(18), 
	ID_USER VARCHAR(18) NOT NULL)
/

ID - Идентификатор строки... (нужно! :-))

ROW_DATE - Дата (число :-)) - проведения текущей проводки.

ID_D_ACC - Идентификатор счета дебита.

ID_K_ACC - Идентификатор счета кредита.

ID_AN_D - Идентификатор аналитического признака, по которому мы можем анализировать дебетовый счет...

ID_AN_K - Идентификатор аналитического признака, по которому мы можем анализировать счет кредита...

DEFIneRow - Идентификатор описания проводки. Описаний - то не очень и много - так их проще хранить в неком "отдельном" месте... :-))

Money_ROW - Это деньги - сумма денег, о которой ведется речь в проводке...

quanti_ROW - количество... ну сумма... а если учет по счету (любому - или дебиту или кредиту) количественный, то показывать количество в строке очень "правильно" :-))

NUMJOURNAL - номер журнала. Что ЭТО? Ну... точно даже не опишу. Но, как-то сложилось или просто если смотреть на ОБЩИЙ список проводок, то "приятнее" как- то "упорядочить" проводки по темам что ли.

ID_CUR - Идентификатор валюты, в которой была сделана проводка.

ID_DOC - Идентификатор документа, породившего текущую строку.

ID_STR_DOC - Идентификатор строки из табличной части документа, породившего текущую строку, если таковая действительно существует.

ID_USER - Идентификатор пользователя, сделавшего запись.

Ограничения: поскольку описание проводки мы решили хранить в табличке "CONSTCHAR" - списком строковых констант... это наверное, самое "правильное" место для хранения такого рода данных.

ALTER TABLE SYSADM.GROS_BUCH FOREIGN KEY GrBu001 (
DEFIneRow ) REFERENCES SYSADM.CONSTCHAR
/

Список документов - все документы от туда... важно не дать возможности удалить документ, если еще есть строки в "главной книге"...

ALTER TABLE SYSADM.GROS_BUCH FOREIGN KEY GrBu002 (
ID_DOC ) REFERENCES SYSADM.LISTDOC
/

Аналогично поступим и с пользователями...

ALTER TABLE SYSADM.GROS_BUCH FOREIGN KEY LU120603 (
ID_USER) REFERENCES SYSADM.LISTUSER
/

В таблице "GROS_BUCH" идентификаторов еще много, для всех есть связанные ограничения, Но остальные введем после описания соответствующих табличек...

Следующая таблица - список счетов:

CREATE TABLE SYSADM.PLAN_ACCOUNT (
	ID VARCHAR(18) NOT NULL, 
	ACCOUNT VARCHAR(16), 
	DEFINE VARCHAR(50), 
	ANALITIC VARCHAR(18), 
	ACCLINCK VARCHAR(18), 
	FLAGS CHAR(4))
/

ID - Идентификатор счета...

ACCOUNT - номер, или сокращенное название.

DEFINE - описание типа, "товары на складах"

ANALITIC - Идентификатор аналитического признака - "узла на дереве аналитических признаков" (таблице субконт) - указатель, что по счету ведется аналитических учет, и по чему собственно.

ACCLINCK - Идентификатор "связанности" представим себе ситуацию: надо организовать учет по большому количеству материально-ответственных лиц (реализаторов)... (или еще что -то подобное) - учитывать надо допустим, "товары"... как это сделать в этой системе? Почти просто - "связываем" аналитический признак - "МОЛ" (с конкретным именем и фамилией) со счетом из "раздела" товары у "МОЛ". Получается счет с именем "ФИО", по которому учитываем товары... на самом деле, пример "надуманный", но, "похожих" ситуаций достаточно много в практике... так что...

FLAGS - флаги счета все, что я говорил только что - только в 4-х символах получились строки вида "Х_Х_" что есть что?

  1. Аналитичность - если по счету ведется аналитический учет. В первой позиции стоит "Х".
  2. Количественность. Если у нас, допустим, расчетный счет, то о каких количествах можно говорить? - только суммы.... а товары? - есть и суммы и количество.
  3. Связанность (уже рассказал)
  4. Про учет товаров, находящихся у "МОЛ" я говорил, а КАК назвать "счет_название_раздела"? в случае тех же самых "МОЛ", и КАК назвать родительский счет? - типа, "уточнения" которого и будут "счетами-МОЛ" и КАК сказать системе, что на такой счет, без "уточнений" НИЧЕГО положить (или взять) НЕЛЬЗЯ?

Вот именно для разрешения такого рода "неприятностей", мы и ввели эту позицию флага.

А теперь очень важно сказать что идентификатор в этой таблице несет некие нагрузки.

ALTER TABLE SYSADM.PLAN_ACCOUNT PRIMARY KEY (ID)
/

Теперь ограничения: нельзя позволить удалить счет, если есть строки в "GROS_BUCH", в которых счет "упомянут".

ALTER TABLE SYSADM.GROS_BUCH FOREIGN KEY GB100401 (
ID_D_ACC) REFERENCES SYSADM.PLAN_ACCOUNT
/

ALTER TABLE SYSADM.GROS_BUCH FOREIGN KEY GB100402 (
ID_K_ACC) REFERENCES SYSADM.PLAN_ACCOUNT
/

Естественно, нужно добавить еще ограничения на "ANALITIC" и "ACCLINCK" но, сделаем это после того, как опишем таблицу "аналитические признаки".

Да, так вот и она:

CREATE TABLE SYSADM.SUBCONTO (
	ID VARCHAR(18) NOT NULL,
	NAME CHAR(50),
	STORY VARCHAR(254),
	FLAGS DOUBLE PRECISION,
	IDSTRUCT VARCHAR(18),
	IDPARAM VARCHAR(18))
/

ID - Идентификатор аналитического признака.

NAME - Название

STORY - Пожалуй самое "нагруженное поле" - именно тут "моделируется" древовидная структура... как и зачем... начнем с "зачем" вернее "почему" да, именно так... проще (да и логичнее) было бы хранить идентификатор "родителя" - самое "то", вот только КАК получить ВСЕ "поддерево" начиная с некого узла? - необходимость в таком действии есть, а ВОЗМОЖНОСТЬ? - в "оракле" есть, а синтаксис "SQLBase" чуть проще, и возможности уже нет. Вот мы и "выкрутились" - "просто" добавляем идентификатор "родителя" к строке, которая и получилась "списком родителей" - историей... и, получить "набор потомков" - "просто" :-)) надо выбрать всех, у кого есть в истории нужные идентификаторы... неприятности: пришлось ограничить глубину вложения.

FLAGS - Некий флаг. Пока, как я понимаю, это "для будующих применений".

IDSTRUCT - Идентификатор описания документа-редактора параметров аналитического признака (из таблицы "LISTPATTERN") уф, загнул, и наверное, по- порядку: аналитический признак - "контрАгент" - нужно его описание - адрес, банковский счет, телефон директора... или, "заказ" - а вот тут - даже пока и не придумывается... но, в любом случае, МНОГО! И что важно, так то, что все данные параметров Аналитики, по - большому счету, нужно хранить в неких таблицах, и, соответственно, нам нужны "екзешники" для редактирования...

IDPARAM - Идентификатор, а это ссылка на данные... из той таблицы, которая описана в предыдущей ссылке...

Подчеркнем важность илентификатора:

ALTER TABLE SYSADM.SUBCONTO PRIMARY KEY (ID)
/

А теперь ограничения. Сначала введем ограничения для списка счетов:

ALTER TABLE SYSADM.PLAN_ACCOUNT FOREIGN KEY PA100400 (
ANALITIC ) REFERENCES SYSADM.SUBCONTO
/

ALTER TABLE SYSADM.PLAN_ACCOUNT FOREIGN KEY PA100401 (
ACCLINCK ) REFERENCES SYSADM.SUBCONTO
/

Теперь для "Главной книги": ограничения на поля "аналитических признаков".

ALTER TABLE SYSADM.GROS_BUCH FOREIGN KEY SU100401 (
ID_AN_D) REFERENCES SYSADM.SUBCONTO
/

ALTER TABLE SYSADM.GROS_BUCH FOREIGN KEY SU100402 (
ID_AN_K) REFERENCES SYSADM.SUBCONTO
/

И, "на последок": про права я рассказывал? - а ограничения, связанные с "аналитикой"? вот и они...

ALTER TABLE SYSADM.LISTRIGTHUS FOREIGN KEY SB100400 (
IDSUBC ) REFERENCES SYSADM.SUBCONTO
/

Пора двигаться дальше... просто список валют:

CREATE TABLE SYSADM.CURRENCY (
	ID VARCHAR(18) NOT NULL,
	NAME_CUR VARCHAR(25),
	DEF_CUR VARCHAR(5))
/

ID - Идентификатор валюты.

NAME_CUR - "длинное" название.

DEF_CUR - "сокращенное" название.

Естественное замечание:

ALTER TABLE SYSADM.CURRENCY PRIMARY KEY (ID)
/

Ограничения: естественно, раз валюты упоминаются в "главной книге".

ALTER TABLE SYSADM.GROS_BUCH FOREIGN KEY CU100401 (ID_CUR)
REFERENCES SYSADM.CURRENCY
/

А вот теперь уже интереснее: "кроссы" или, коэффициенты перевода... или курсы валют? Ну, наверное последнее определение самое правильное...

Да, и неверное самое время "вернуться" несколько назад - к описанию "главной книги" там я говорил именно о валютах (названиях) почему? Прежде всего потому, что иногда бывает необходимо пересчитывать баланс в разных валютах (причем, иногда совсем не в той валюте, в которой делалась проводка) и, вот это делать "правильно" по курсу "сегодняшнего дня", а может я и не прав, может и на день совершения операции... любой из подходов "проходит" в нашем случае...

CREATE TABLE SYSADM.CROSSCUR (
	ID VARCHAR(18) NOT NULL,
	ROW_DATE DATE,
	ID_CUR1 VARCHAR(18),
	SUM_C DOUBLE PRECISION,
	ID_CUR2 VARCHAR(18))
/

ID - Идентификатор.

ROW_DATE - Дата введения нового курса.

ID_CUR1 - Идентификатор валюты "продажи".

SUM_C - Коэффициент пересчета.

ID_CUR2 - Идентификатор валюты "покупки".

Методика перевода из валюты в валюту: "курс покупки" может не совпадать с "курсом продажи" - для этого между двумя валютами ДОЛЖНО быть две строки перевода. Как все это работает? Выбираем нужную нам строку - самую "свежую" запись, в которой представлены необходимые нам коды валют. "ID_CUR1" валюта "продажи" - та валюта, которую мы ХОТИМ поменять (продать) (допустим доллар). ID_CUR2 - код валюты, которую "покупаем" (гривня или рубль, если хотите :-)). SUM_C - коэффициент перевода ( допустим, 5,6) SUM_C = 5,6 а, в ОБРАТНУЮ сторону (обычно пишут курс покупки -5.9) и вот ТУТ мы указываем: SUM_C = 0,1694 (1/5.9) - ОЧЕНЬ извиняемся, но проще не придумалось.

Ограничения? Как же без них? :-) - тоже есть. Ограничиваем возможность удалить строку из списка валют, если у нас есть ее курсы...

ALTER TABLE SYSADM.CROSSCUR FOREIGN KEY CU100403 (
ID_CUR1 ) REFERENCES SYSADM.CURRENCY
/

ALTER TABLE SYSADM.CURRENCY FOREIGN KEY CU100404 (
ID_CUR2 ) REFERENCES SYSADM.CURRENCY
/

Ну вот, обо всем поговорили, добрались до остатков:

CREATE TABLE SYSADM.REMAINDET (
	ROW_DATE DATE NOT NULL,
	ID_ACC VARCHAR(18) NOT NULL,
	ID_AN VARCHAR(18) NOT NULL,
	REM_ACC DOUBLE PRECISION,
	REM_quanti DOUBLE PRECISION,
	REM_MANEY VARCHAR(18) NOT NULL)
/

ROW_DATE - Дата. Многие бухгалтерские системы имеют месячные итоги, то есть, нет "штатной" возможности сказать, сколько было на неком счету денег 14 числа некого прошедшего месяца... такое положение может и устраивает бухгалтеров, но совершенно не устраивает "управленцев" (а систему мы "придумывали" и для них тоже)... вот мы и решили, что "самым правильным" будет делать ежедневные остатки... причем, если по некому счету в некий день операций не происходило, то и остаток за ЭТОТ день хранится не будет...

ID_ACC - Идентификатор счета.

ID_AN - Идентификатор аналитического признака.

REM_ACC - Сумма остатка на счете...

REM_quanti - Количество остатка, если по счету ведется количественный учет...

REM_MANEY - Идентификатор валюты, в которой совершена последняя проводка. Т.е. если по некому счету у нас ведется много валютный учет, и, следующая проводка, которая записывается в "главную книгу" делается в иной валюте, чем предыдущая, то остаток пересчитывается в новую валюту, происходит суммирование, и новый остаток, в новой валюте записывается в таблицу...

Ограничения вполне понятны, и подробно о них говорить не интересно...

ALTER TABLE SYSADM.REMAINDET FOREIGN KEY Rem100401 (
ID_ACC ) REFERENCES SYSADM.PLAN_ACCOUNT
/

ALTER TABLE SYSADM.REMAINDET FOREIGN KEY Rem100402 (
ID_AN) REFERENCES SYSADM.SUBCONTO
/

ALTER TABLE SYSADM.REMAINDET FOREIGN KEY Rem100403 (
REM_MANEY ) REFERENCES SYSADM.CURRENCY
/

А вот теперь триггера, которые и считают остатки. Вот команда, которая помогает нам получить остаток на текущем счету по текущим аналитике и валюте.

STORE SYSADM.STRSELREM select a.ROW_DATE, a.REM_ACC, a.REM_quanti, a.REM_MANEY     
 from remaindet a     
where  a.ID_acc=:2 AND     
a.ID_an=:3 AND a.REM_MANEY=:4     
AND  a.ROW_DATE in     
(select max ( b.ROW_DATE )  from REMAINDET b where     
b.ROW_DATE <=  :1 and b.ID_ACC = :2 and b.ID_AN = :3 and b.REM_MANEY = :4 )   
/

Команда добавления новой строки в таблицу "остатки".

STORE SYSADM.STRINSREM insert into Remaindet
( ROW_DATE, ID_ACC, ID_AN, REM_ACC, REM_quanti, REM_MANEY )
values (:1, :2, :3, :4, :5, :6 )
/

Команда исправления нужной строки в таблице "остатки".

STORE SYSADM.STRUPREM update Remaindet set
Rem_Acc = Rem_Acc + :1,
REM_quanti = REM_quanti + :2
where ID_acc=:3 AND
ID_an=:4 AND REM_MANEY =:5 AND
ROW_DATE >= :6
/

А вот теперь и главная подготовительная процедура.

STORE SYSADM.INSROWREM Procedure: InsRowRem static
Parameters
	Date/Time: RemDtW
	String: RemID_Acc
	String: RemID_AN
	Number: RemK
	Number: RemSum
	String: RemID_cur
Local variables
	String: strSelWhere
	String: strSelInto
	String: strUpdWhere
	String: strUpRemOfr
	String: strUpFl
	String: strInsRemOld
	Number: Remfl
	Number: RemACC
	String: RemCur
	Number: RemKol
	String: Row
	String: NameTabl
	Number: nOk
	Date/Time: RemDat
	Sql Handle: hsqlWWW
	Number: nCount
	Number: bInsert
Actions
	On Procedure Startup
		Call SqlConnect ( hsqlWWW )
	On Procedure Execute
		set NameTabl = 'remaindet'
		Set RemACC = 0
		Set RemKol = 0
		Set bInsert = 1
		Set strSelWhere = ' :RemDtW, :RemID_Acc, :RemID_AN, :RemID_cur '
		Set strSelInto = ' :RemDat, :RemACC, :RemKol, :Remfl '
		Set strUpdWhere = ' :RemSum, :RemK, :RemID_Acc, :RemID_AN, :RemID_cur, :RemDtW '
		Set strInsRemOld = ' :RemDtW, :RemID_Acc, :RemID_AN, :RemACC, :RemKol, :RemID_cur '
		When SqlError
			Set nOk = SqlError ( hsqlWWW )
			Return FALSE
! что с начала: получим остатки.
		Call SqlRetrieve(hsqlWWW, 'sysadm.strSelRem', strSelWhere, strSelInto )
		Call SqlExecute(hsqlWWW)
		Call SqlGetResultSetCount ( hsqlWWW, nCount )
		If nCount >0
			Call SqlFetchNext(hsqlWWW, nOk)
!если остаток на счете за необходимое нам число есть
		If RemDtW = RemDat
			Set bInsert = 0
		If bInsert = 1
! а вот если нету, то в таблицу остатки надо добавить
! строку, с ПРЕДЫДУЩИМ значением остатка,
			Call SqlRetrieve(hsqlWWW, 'sysadm.strInsRem', strInsRemOld,'')
			Call SqlExecute(hsqlWWW)
! а потом ВСЕ изменить.... наверное,
! не очень "логично", но... работает...
		Call SqlRetrieve(hsqlWWW,'sysadm.strUpRem', strUpdWhere,'')
		Call SqlExecute(hsqlWWW)
	On Procedure Close
		Call SqlDisconnect ( hsqlWWW )
/

И вот процедура, которая работает в триггере на добавление строки в "главную книгу":

STORE SYSADM.INS_ROWBGREM Procedure: Ins_RowBgRem static
Parameters
	String: GBmaxID
	String: strRoWid
	Date/Time: GBdat
	String: my_d_acc
	String: my_k_acc
	String: my_an_d
	String: my_an_k
	Number: GB_k
	Number: my_sum_row
	String: GBid_cur
Local variables
	String: strInsP
	Number: nOk
	Number: tmp_Qw
	Number: tmp_Sum
	Sql Handle: hsqlWWW
	Number: nChoose
	String: OperNow
Actions
	On Procedure Startup
		Call SqlConnect ( hsqlWWW )
On Procedure Execute
! что? Да, именно, ЭТО секция работы с будущей ! репликацией... пока просто обозначим ее... ! Set OperNow = 'I' When SqlError
Set nOk = SqlError ( hsqlWWW ) Return FALSE ! сначала нужен идентификатор строки... Call SqlRetrieve(hsqlWWW, 'sysadm.GetMaxID', ' :NameTabl, :GBmaxID ', ' :GBmaxID ') Call SqlExecute ( hsqlWWW ) Call SqlFetchRow ( hsqlWWW, 0, nChoose ) ! а потом, добавить (или изменить) "остатки" что важно: ! для одной строки из "главной книги" нам нужны две ! строки в "остатках" и, если для одного счета происходит ! увеличение сумм, то для другого - уменьшение.. это я и показал. Call SqlRetrieve(hsqlWWW, 'InsRowRem', ' :GBdat, :my_d_acc, :my_an_d, :GB_k, :my_sum_row, :GBid_cur ','') Call SqlExecute ( hsqlWWW )
set tmp_Qw = -GB_k
set tmp_Sum = -my_sum_row
Call SqlRetrieve(hsqlWWW, 'InsRowRem', ':GBdat, :my_k_acc, :my_an_k, :tmp_Qw, :tmp_Sum, :GBid_cur ','') Call SqlExecute ( hsqlWWW ) On Procedure Close Call SqlDisconnect ( hsqlWWW ) /

А вот и триггер, который работает:

CREATE TRIGGER SYSADM.INSROWGB After Insert ON SYSADM.GROS_BUCH
(Execute SYSADM.INS_ROWBGREM
(
GROS_BUCH.ID,
GROS_BUCH.rowid,
GROS_BUCH.ROW_DAT,
GROS_BUCH.ID_D_ACC,
GROS_BUCH.ID_K_ACC,
GROS_BUCH.ID_AN_D,
GROS_BUCH.ID_AN_K,
GROS_BUCH.K_REM,
GROS_BUCH.SUM_ROW,
GROS_BUCH.ID_CUR ))
For Each Row
/

Процедура смены строки в "главной книге". Поменяться может ВСЕ, (пользователь меняет, а вот что ему в голову взбредет... :-)) нам же нужно отслеживать те изменения, которые меняют "остатки":

STORE SYSADM.UPPR_GRBU Procedure: UpPr_GrBu static
! сначала стоит все удалить, вернее не все, ! а старую строку из "остатков" ! мне показалось, что проще удалить все, а потом, ! привычно, начать все заново... :-)) set tmp_Qw = -K_REM set tmp_Sum = -SUM_ROW Call SqlRetrieve(hsqlWWW, 'InsRowRem', ' :ROW_DAT, :ID_D_ACC, :ID_AN_D, :tmp_Qw, :tmp_Sum, :ID_CUR ','') Call SqlExecute ( hsqlWWW ) Call SqlRetrieve( hsqlWWW, 'InsRowRem', ' :ROW_DAT, :ID_K_ACC, :ID_AN_K, :K_REM, :SUM_ROW, :ID_CUR ','') Call SqlExecute ( hsqlWWW ) ! вот ЭТОТ кусок текста относится ! к реализации системы реплицирования... ! Set OperNow = 'U' ! Call SqlImmediate ( 'insert into SYSREP.DT$GROS_BUCH select ID, ROW_DATE, ID_D_ACC, ID_K_ACC, DEFIneRow, Money_ROW, quanti_ROW, NUMJOURNAL, ID_CUR, ID_AN_D, ID_AN_K, ID_DOC, ID_STR_DOC, ID_USER, :OperNow, current timestamp from SYSADM.GROS_BUCH where rowid = :strRoWid ' ) ! вторая часть "марлизонского балета" - старые значения ! "выкусили", а вот новые то НАДО добавить... set tmp_Qw = -NewK_REM
set tmp_Sum = -NewSUM_ROW
Call SqlRetrieve(hsqlWWW, 'InsRowRem', ' :NewROW_DAT, :NewID_D_ACC, :NewID_AN_D, :NewK_REM, :NewSUM_ROW, :NewID_CUR ','') Call SqlExecute ( hsqlWWW ) Call SqlRetrieve( hsqlWWW, 'InsRowRem', ' :NewROW_DAT, :NewID_K_ACC, :NewID_AN_K, :tmp_Qw, :tmp_Sum, :NewID_CUR ','') Call SqlExecute ( hsqlWWW ) On Procedure Close Call SqlDisconnect ( hsqlWWW ) /

С процедурой "покончили", надеюсь, все понятно, а вот и триггер:

CREATE TRIGGER SYSADM.UPD_GBU Before Update ON SYSADM.GROS_BUCH
REFERENCING OLD oldT NEW NewT (
Execute SYSADM.UpPr_GrBu (
NewT.ROW_DATE, NewT.ID_D_ACC, NewT.ID_K_ACC,
NewT.Money_ROW, NewT.quanti_ROW,
NewT.ID_CUR, NewT.ID_AN_D, NewT.ID_AN_K, NewT.rowid,
oldT.ID, oldT.ROW_DATE, oldT.ID_D_ACC, oldT.ID_K_ACC,
oldT.DEFIneRow, oldT.Money_ROW, oldT.quanti_ROW,
oldT.NUMJOURNAL, oldT.ID_CUR, oldT.ID_AN_D, oldT.ID_AN_K,
oldT.ID_DOC, oldT.ID_STR_DOC, oldT.ID_USER ))
For Each Row
/

Удаление. После всего описанного, тут уже все понятно... (я надеюсь :-))

STORE SYSADM.DELL_ROWBGREM Procedure: Dell_RowBgRem static
Parameters
	String: strRoWid
	string: ID
	Date/Time: ROW_DAT
	string: ID_D_ACC
	string: ID_K_ACC
	string: DEFINIT
	Number: SUM_ROW
	Number: K_REM
	string: NUMJOURNAL
	string: ID_CUR
	string: ID_AN_D
	string: ID_AN_K
	string: ID_DOC
	string: ID_STR_DOC
	string: ID_USER
Local variables
	String: strInsP
	Number: GBmaxID
	Number: nOk
	Number: tmp_Qw
	Number: tmp_Sum
	Sql Handle: hsqlWWW
	Number: nChoose
	string: OPER
Actions
	On Procedure Startup
		Call SqlConnect ( hsqlWWW )
	On Procedure Execute
		When SqlError
			Set nOk = SqlError ( hsqlWWW )
			Return FALSE
		set tmp_Qw = -K_REM
		set tmp_Sum = -SUM_ROW
		Call SqlRetrieve(hsqlWWW, 'InsRowRem',
			' :ROW_DAT, :ID_D_ACC, :ID_AN_D, :tmp_Qw, :tmp_Sum, :ID_CUR ','')
		Call SqlExecute ( hsqlWWW )
		Call SqlRetrieve( hsqlWWW, 'InsRowRem',
			' :ROW_DAT, :ID_K_ACC, :ID_AN_K, :K_REM, :SUM_ROW, :ID_CUR ','')
		Call SqlExecute ( hsqlWWW )
!        Set OPER = 'D'
! и все, что положено будет делать для удаленных
! строк - занесем соответствующие строки и в 
! "дельта таблицу"... - все это, конечно, 
! "воспоминания о будущем" :-)...
	On Procedure Close
		Call SqlDisconnect ( hsqlWWW )
/

Вот и триггер:

CREATE TRIGGER SYSADM.DEL_GB
Before DELETE ON SYSADM.GROS_BUCH ( 
Execute SYSADM.Dell_RowBgRem (
rowid, ID, ROW_DATE, 
ID_D_ACC, ID_K_ACC, DEFIneRow, 
Money_ROW, quanti_ROW, 
NUMJOURNAL, ID_CUR, ID_AN_D, ID_AN_K, ID_DOC, ID_STR_DOC, ID_USER ))
For Each Row
/

Вот, вроде все... во всяком случае, с ЭТОЙ частью...


Загрузить проект | Предыдущий Шаг | Оглавление
Автор Голиброда Александр.