Вопрос по реализации Master-Detail на FBDataset'ах.
Как я понял, FBDataset хорошо поддерживает схему, при которой совпадают
1) Имя поля ПК Мастера
2) Имя поля ФК Детали
3) Имена соответствующих параметров в запросах.
У меня не получилось средствами FBDataset'а организовать Мастер-Деталь вот для такой схемы (может, просто недокопал - ткните носом)
- Код: Выделить всё
MASTER: ID, CAPTION
DETAIL: ID, MASTER_ID, CAPTION
Где ID - суррогатные первичные ключи (BIGINT), MASTER_ID - FK на Мастера.
Пока выкрутился на событиях BeforeOpen и BeforePost Детали. Примерно так
DetailFBDataSetBeforeOpen:
- Код: Выделить всё
var Detail, Master: TFBDataSet;
MasterId: Int64;
. . . . . . .
if Master.Eof then // Нет текущей записи Мастера
Detail.Params.ByNameIsNull['master_id']:= TRUE
else begin // Есть запись Мастера
// Получить значение 1-го поля (ID) текущей записи мастера
Master.GetFieldData(1, @MasterId);
// Установить значение параметра в SQLSelect
Detail.Params.ByNameAsInt64['master_id']:= MasterId;
end;
DetailFBDataSetBeforePost:
- Код: Выделить всё
. . . . . .
if Master.Eof then // Нет текущей записи Мастера
Detail.SetFieldValues('master_id', Null)
else begin // Есть запись Мастера
Master.GetFieldData(1, @MasterId);
Detail.SetFieldValues('MASTER_ID', MasterId);
end;
Это работает, но, во-первых, это реализация частного случая, а во-вторых, хотелось бы более системного решения в рамках самого FBDataset'a.
Прошу подсказку - куды бедному крестьянину податься?