Таблица:
- Код: Выделить всё
SET SQL DIALECT 3;
CREATE GENERATOR GEN_USERS_ID;
CREATE TABLE USERS (
ID ID /* ID = INTEGER NOT NULL */,
NOMAN BOOL_FALSE DEFAULT 0 /* BOOL_FALSE = SMALLINT DEFAULT 0 NOT NULL CHECK (VALUE IN (0,1)) */,
PARENT_ID INT_DMN DEFAULT 0 /* INT_DMN = INTEGER */,
IS_USER ID DEFAULT 0 NOT NULL /* ID = INTEGER NOT NULL */,
IS_PARTNER BOOL_FALSE DEFAULT 0 NOT NULL /* BOOL_FALSE = SMALLINT DEFAULT 0 NOT NULL CHECK (VALUE IN (0,1)) */,
EXP BOOL_FALSE DEFAULT 0 /* BOOL_FALSE = SMALLINT DEFAULT 0 NOT NULL CHECK (VALUE IN (0,1)) */,
PORYADOK INT_DMN /* INT_DMN = INTEGER */,
FIO VU_128 DEFAULT '' NOT NULL /* VU_128 = VARCHAR(256) */,
MAIL VU_064 /* VU_064 = VARCHAR(128) */,
BODY VU_512 /* VU_512 = VARCHAR(1024) */
);
ALTER TABLE USERS ADD CONSTRAINT PK_USERS PRIMARY KEY (ID);
SET TERM ^ ;
/* Trigger: USERS_BI */
CREATE OR ALTER TRIGGER USERS_BI FOR USERS
ACTIVE BEFORE INSERT POSITION 0
as
begin
if (new.id is null) then
new.id = gen_id(gen_users_id,1);
end
^
--еще тригеры
SET TERM ; ^
На форме:
PeopleSQL: TSQLQuery;
...
PeopleSQL.SQL
- Код: Выделить всё
select
u.id,
u.parent_id,
u.fio as fio,
case when g.fio is null then 'Нет' else g.fio end as boss,
u.body,
u.mail,
u.noman,
u.is_user,
u.is_partner
from users u
left join users g on u.parent_id = g.id
PeopleSQL.insertSQL
- Код: Выделить всё
insert into users (fio) values (:fio)
PeopleSQL.updateSQL
- Код: Выделить всё
update users set
fio=:fio,
body=:body,
mail=:mail,
noman=:noman,
is_user=:is_user,
is_partner=:is_partner
where
id=:id
Инсерт работает замечательно. Апдейт работает замечательно. Все бы хорошо, но... инсерт работает ТОЛЬКО на одну запись. Т.е. если вставить >1 записи, то при вызове
- Код: Выделить всё
PeopleSQL.ApplyUpdates; // <----- здесь ошибка
MainForm.Base.Transaction.CommitRetaining;
получаем вот такую картинку.
Вопрос:
Как разрулить ситуацию / уйти от ошибки? Желательно не используя радикальных методов типа "переходи на ZEOS" или вроде того...
Спасибо.
зы. FireBird 2.1.3 Тригеры в БД отключать пробовал.