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