Пишу простенькую БД и приложение к ней для инвентаризации компьютеров предприятия (Lazarus 2.0.8 x86, ZeosLib 7.2.14, SQLite3 3.36.0, Windows 10 x64). В ней имеются две таблички "Parts" (Оборудование) и "Journal" (Журнал). В первой содержится перечень оборудования, во второй события, произошедшие с ним (отношение "один ко многим"). В табличке "Journal" есть внешний ключ на записи из "Parts" (PN). Для доступа к табличкам использую компоненты TZTable (ZeosLib). Сейчас работаю над диалогом добавления оборудования или изменения сведений об оборудовании (см. скриншоты).
Хочу реализовать такую логику: при добавлении нового оборудования или изменении информации о старом сначала в таблицу "Parts" добавляется / редактируется запись об оборудовании. Потом в таблицу "Journal" добавляется запись, где пользователь пишет, почему он произвёл добавление / изменение информации. Тоесть при показе данного диалога я пишу:
- Код: Выделить всё
..
ztParts.Insert;
ztJournal.Insert;
..
Однако, при переключении с одного DB-Aware компонента, привязанного к ztParts на другой, привязанный к ztJournal и наоборот один из датасетов переходит из режима dsInsert в режим dsBrowse, из за чего например элементах управления привязанных к "Journal" отображаются данные от другой записи. Пока "победил" такое поведение так (в данном случае, при вставке новой записи):
- Код: Выделить всё
ztParts.Insert;
ztParts.Post;
ztJournal.Insert;
ztJournal.Post;
ztParts.Edit;
При переключении вкладок PageControl'a (Оборудование / Журнал) вызываю метод Edit соответствующего TZTable. А потом, при закрытии диалога дабы связать запись об оборудовании с записью в журнале ещё и:
- Код: Выделить всё
ztParts.ApplyUpdates;
ztJournal.Edit;
ztJournal.FieldByName('PN').AsInteger :=
ztParts.FieldByName('PartID').AsInteger;
ztJournal.Post;
ztJournal.ApplyUpdates;
Но чувствую что всё это сплошные костыли и быдлокодерство. Не говоря уже о том, что из-за постоянного быстрого переключения DB-aware компонентов в разные режимы, диалог вставки/редактирования при запуске ощутимо подтормаживает. В связи с этим, основной мой вопрос: каким образом правильно вставить связанные записи в две таблицы? Какими компонентами для этого лучше воспользоваться (TZTable / TZQuery + TZUpdateSQL)? Для краткости приведу алгоритм действий для добавления.
Добавление оборудования:
- Вставка новой записи в таблицу Parts
- Редактирование только что созданной записи
- Добавление новой записи в таблицу Journal
- Редактирование новой записи в таблице Journal
- Присвоение внешнего ключа записи из таблицы Journal от новой записи таблицы Parts
- Фиксация (COMMIT) или отмена (ROLLBACK) изменений, в зависимости от того, какую кнопку нажмёт пользователь.
Прошу прощения за длинный пост, и благодарю за внимание!
Скриншоты:

