В продолжении темы http://community.terrasoft.ua/forum/topic/799 возник вопрос:
Как правильно разместить форму редактирования на форме редактирования.
Сразу отвечаю на вопрос - "зачем?".
Иногда бывает так, что датасет одной карточки редактирования достигает ограничений (http://community.terrasoft.ua/forum/topic/3970) и больше поля добавлять не остаётся возможным, а руководству - надо! и разносить их по деталям не дают.
Вот и приходится изобретать велосипед.
Исходя из выше сказанного 38байт уникального индификатора для связи с другим справочником можно выкроить учитывая что это даёт ещё один датасет для размещения полей.
Но суть вопроса в том, как описать сохранение записи в "связаном" справочнике в момент btnOKOnClick основной карточки, так как отображение происходит по тому же алгоритму, что и с DataGrid.
Нравится
Александр, насколько я понял, Вам необходимо разбить данные в карточке редактирования на две части. Возможно, эту задачу можно решить без использования второго окна редактирования, просто добавить второй даталинк, связать его с нужным датасетом, а при инициализации окна фильтровать второй датасет в зависимости от первого датасета или ID записи реестра. Аналогично, при нажатии кнопки "OK" после выполнения метода Post первого датасета сохранять также и второй (в той же обработке btnOKOnClick или в dlDataOnDatasetAfterPost).
Олег,
В который раз спасибо, что откликнулись на мой вопрос...
Я стопорюсь только на btnOKOnClick.
Сейчас он выглядит так:
var Dataset = BaseDBEdit.Dataset; /* MODULE WORKFLOW */ var WorkflowItemID = Dataset.ValAsStr('WorkflowItemID'); var StatusID = Dataset.Values('ContractStatusID'); /* ENDMODULE WORKFLOW */ if (!CheckItemNumberDuplicate('Contract', Dataset, 'ContractNumber', "Договор")) { return; } if (!scr_BaseDBEdit.btnOKOnClick(Control)) { return; } /* MODULE WORKFLOW */ var IsFinish = GetIsFinishByStatusID(StatusID); if (IsFinish) { ProcessWorkflowItem(WorkflowItemID, Self); } /* ENDMODULE WORKFLOW */
Как мне правильно вызвать тогда пост датасета второго даталинка?
Мне кажется, достаточно будет после блока
if (!scr_BaseDBEdit.btnOKOnClick(Control)) { return; }
выполнить
Datalink2.Dataset.Post();
А для того, чтобы запись во второй таблице оказалась связанной с записью первой таблицы, необходимо при обработке события OnPrepare окна редактирования после базового обработчика выполнить что-то вроде такого (пример для карточки контрагента):
var AddDataset = Datalink2.Dataset; if (AddDataset.State != dstInactive) { AddDataset.Close(); } ApplyDatasetFilter(AddDataset, 'ID', dlData.Dataset.Values('ID'), true); AddDataset.Open(); if (IsDatasetEmpty(AddDataset)) { AddDataset.Append(); AddDataset.Values('ID') = Connector.GenGUID(); AddDataset.Values('AccountID') = dlData.Dataset.Values('ID'); }
Для этого в запросе второго датасета должен быть фильтр с кодом "ID", параметр с названием "ID", а сам фильтр выглядеть примерно так:
... WHERE [tbl_Account2].[AccountID] = :ID
Здесь tbl_Account2 - таблица, которая содержит вторую часть полей контрагента, а также поле AccountID связи с первой таблицей.