DBEdit на форму редактирования
Технические вопросы
Разработка

В продолжении темы http://community.terrasoft.ua/forum/topic/799 возник вопрос:
Как правильно разместить форму редактирования на форме редактирования.
Сразу отвечаю на вопрос - "зачем?".

Иногда бывает так, что датасет одной карточки редактирования достигает ограничений (http://community.terrasoft.ua/forum/topic/3970) и больше поля добавлять не остаётся возможным, а руководству - надо! и разносить их по деталям не дают.
Вот и приходится изобретать велосипед.

Исходя из выше сказанного 38байт уникального индификатора для связи с другим справочником можно выкроить учитывая что это даёт ещё один датасет для размещения полей.

Но суть вопроса в том, как описать сохранение записи в "связаном" справочнике в момент btnOKOnClick основной карточки, так как отображение происходит по тому же алгоритму, что и с DataGrid.

Нравится

4 комментария

Александр, насколько я понял, Вам необходимо разбить данные в карточке редактирования на две части. Возможно, эту задачу можно решить без использования второго окна редактирования, просто добавить второй даталинк, связать его с нужным датасетом, а при инициализации окна фильтровать второй датасет в зависимости от первого датасета или ID записи реестра. Аналогично, при нажатии кнопки "OK" после выполнения метода Post первого датасета сохранять также и второй (в той же обработке btnOKOnClick или в dlDataOnDatasetAfterPost).

Олег,
В который раз спасибо, что откликнулись на мой вопрос...
Я стопорюсь только на btnOKOnClick.
Сейчас он выглядит так:
[xml]
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 */
[/xml]

Как мне правильно вызвать тогда пост датасета второго даталинка?

Мне кажется, достаточно будет после блока

[javascript]
if (!scr_BaseDBEdit.btnOKOnClick(Control)) {
return;
}
[/javascript]

выполнить

[javascript]
Datalink2.Dataset.Post();
[/javascript]

А для того, чтобы запись во второй таблице оказалась связанной с записью первой таблицы, необходимо при обработке события OnPrepare окна редактирования после базового обработчика выполнить что-то вроде такого (пример для карточки контрагента):

[javascript]
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');
}
[/javascript]

Для этого в запросе второго датасета должен быть фильтр с кодом "ID", параметр с названием "ID", а сам фильтр выглядеть примерно так:

[sql]
...
WHERE
[tbl_Account2].[AccountID] = :ID
[/sql]

Здесь tbl_Account2 - таблица, которая содержит вторую часть полей контрагента, а также поле AccountID связи с первой таблицей.

Олег, спасибо большое за помощь.
Всё получилось...

Показать все комментарии