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

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

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

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

Нравится

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

Александр, насколько я понял, Вам необходимо разбить данные в карточке редактирования на две части. Возможно, эту задачу можно решить без использования второго окна редактирования, просто добавить второй даталинк, связать его с нужным датасетом, а при инициализации окна фильтровать второй датасет в зависимости от первого датасета или 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 связи с первой таблицей.

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

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