В общем, исправил много недочетов в коде.
1) В БД выкинул использование доменов. (Где-то в документации по InterBase/FireBird указывалось, что домен можно редактировать, и при этом изменения коснутся всех полей и переменных, которым присвоен тип этого домена. Ни разу не получилось так сделать, только ограничения лишние накладывали)
create or alter procedure KKM_INS (
ID integer,
SHOP_ID integer,
KKM_NUM bigint,
DESCRIPTION varchar(255),
ACTIVE_FLAG smallint)
as
begin
insert into kkm(
id,
shop_id,
kkm_num,
description,
active_flag)
values (
:id,
:shop_id,
:kkm_num,
:description,
:active_flag);
end^
2) В код Delphi в блоки Insert/Post Edit/Post включил все поля таблиц, с которыми работают датасеты. Соответственно, пришлось получать ID'шники из программы, и добавлять их в блоки, а не просто в БД их генерировать и присваивать. То же самое касается значений "по умолчанию".
С самого начала я не добавлял в параметры сохраненки абсолютно все поля. Для инсерта, например, значения по умолчанию и ID не указывал.
frmKKMEdit:
// Get shop param by name
with frmMain.sqlSber do
begin
SQL.Text := 'select * from get_shop_by_name(:shop_name)';
ParamByName('shop_name').AsString := cbShopName.Text; <- Находим ID того, что выбрал пользователь
ExecQuery;
end;
ShopID := frmMain.sqlSber.Fields[0].AsInteger;
frmMain.sqlSber.Close;
frmMain:
// Get new ID
with sqlSber do
begin
SQL.Text := 'select * from get_kkm_gen';
ExecQuery;
end;
KKMID := sqlSber.Fields[0].AsInteger;
sqlSber.Close;
// Insert
with dsKKM do
begin
Open;
Insert;
FieldByName('id').AsInteger := KKMID;
FieldByName('shop_id').AsInteger := frmKKMEdit.ShopID;
FieldByName('kkm_num').AsInteger := StrToInt(frmKKMEdit.edtKKMNum.Text);
FieldByName('description').AsString := frmKKMEdit.memDescription.Text;
FieldByName('active_flag').AsInteger := Integer(frmKKMEdit.cbActive.Checked);
Post;
Close;
end;
3) Также пришлось получать в программе id-значения "выбираемых" полей из связанных таблиц.(Например, id значения, выбранного в комбобоксе). Можно, конечно, и массивы сюда прикрутить, типа локального кэша "id-value" таблицы, из которой заполняется комбобокс, но... излишество, имхо.
Сначала я пытался просто передавать значение в сохраненку, чтобы БД сама находила нужный ID.
execute procedure kkm_ins(:id, :shop_id, :kkm_num, :description, :active_flag)
Вот... С исправлением всего этого работает, тема закрыта. X77 благодарю за объяснение, советы и подсказки.
зы: После работы над этим проектом сделаю программу-демку, в которой все-таки попробую еще раз создать сохраненку инсерта с какими попало параметрами, и вызвать ее Edit/Post'ом
А то аж за живое задело - "а я хочу так!"