связывание двух таблиц в яве скрипт

Здравствуйте!!

Научилась проверять наличие значений в пределах карточки договора:
wnd_ContractEditScript:
function btnOKOnClick(Control)
{
var Dataset = BaseDBEdit.Dataset;

if (Dataset.ValIsNull('CustomerID'))
{
ShowInformationDialog('Заполните инфо о контрагенте!!! ');
return;
}
else {
scr_BaseDBEdit.btnOKOnClick(Control);

}

знаю, что можно связывать две таблицы в яве скрипт, но не понимаю как.
помогите пожалуйста решить следующую задачу:

в карточке договора при нажатии кнопки ОК нужно проверять на наличие значений в других карточках, например, в карточке "Контрагенты". При отсутствии значений в карточке контрагентов должно выдаваться сообщение, чтобы пользователь заполнил конкретное поле, например, "Полное название".

С уважением, Гашникова Екатерина

Нравится

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

Здравствуйте, Екатерина!
Насколько мы поняли из предоставленного Вами описания, Вам необходимо со скрипта карточки редактирования договора получить значения полей контрагента, указанного в поле "Контрагент" этого же договора. Для реализации данной функциональности можно использовать следующие варианты:
1. Использовать функцию из скрипта scr_DB

\\ scr_DocumentEditScript

function GetDatasetFieldValueByID(DatasetUSI, ID, FieldName);

Так получим значение поля ‘OfficialName’ который указан в поле ‘AccountID’ карточки редактирования например:

var DocumentDataset = dlData.Dataset;
var AccountID = DocumentDataset.Values(‘AccountID’);
var AccountOfficialName = GetDatasetFieldValueByID(‘ds_Account’, AccountID, ‘OfficialName’);

В этом случае будет выполняться запрос с фильтром по ID для получения значения поля. В этом случае в запрос могут попасть ненужные данные (обязательные поля), что всегда может быть приемлемым. И кроме того хотим обратить Ваше внимание на то, что дополнительное время будет потрачено на получение сервиса ds_Account. И еще если вам потребуется получить больше одного поля по данному контрагенту, то желательно использовать последовательно код типа:

var AccountPrimaryContactID = GetDatasetFieldValueByID(‘ds_Account’, AccountID, ‘PrimaryContactID’);
var AccountZip = GetDatasetFieldValueByID(‘ds_Account’, AccountID, ‘ZIP’);

2. Вы можете написать свою функцию инициализации нужного вида датасета:

// scr_DocumentEditScript
var DocumentEdit = new Object();


function GetAccountDataset() {
if (Assigned(DocumentEdit.AccountDataset)) {
DocumentEdit.AccountDataset = Services.GetNewItemByUSI(‘ds_Account’); // здесь можем использовать свой сервис датасета, в который вынесите только нужные вам колонки, например только ‘PrimaryContactID’, ‘ZIP’ и ‘OfficialName’

}

var AccountDataset = DocumentEdit.AccountDataset;
EnableDatasetFilters(AccountDataset, false); // отключим все фильтры которые были раньше
if (AccountDataset.IsActive) {
AccountDataset.Close(); //закроем датасет если был открыт и не закрыли
}
return AccountDataset;
}

//теперь использование функции:

var AccountDataset = GetAccountDataset();
var DocumentDataset = dlData.Dataset;
var AccountID = DocumentDataset.Values(‘AccountID’);
ApplyDatasetFilter(AccountDataset, ‘ID’, AccountID, true);
AccountDataset.Open();
var AccountOfficialName = AccountDataset.Values(‘OfficialName’);
var AccountPrimaryContactID = AccountDataset.Values(‘PrimaryContactID);
var AccountZip = AccountDataset.Values(‘ZIP);
AccountDataset.Close();

Сутью любых способов является получить датасет, установить на него фильтр по нужному ID, получить нужные значения полей.

Желаем Вам успехов!

спасибо за ответ!
Использовала первый вариант. При попытке нажать кнопку ОК на карточке договора при незаполненном поле "Клиент", все работает правильно - выдается сообщение, но при попытке нажать ОК при заполненном поле "Клиент" возникает ошибка "Ошибка выполнения метода 'btnOKOnClick'. Object 'DataField OfficialAccountName' is not assigned" - а должна производиться проверка на наличие в карточке контрагента в поле "Полное наименование" значения, и если его нет, то выдаваться сообщение о том, что его нужно также заполнить ...

так выглядит моя функция btnOKOnClick:

Карточка договора
Скрипт wnd_ContractEditScript:
function btnOKOnClick(Control) {
var Dataset = BaseDBEdit.Dataset;
var CotractDataset = dlData.Dataset;
var CustomerID = Dataset.Values('CustomerID');
if (Dataset.ValIsNull('CustomerID'))
{
ShowInformationDialog('Заполните клиента!!!');
return;
}
else
{
var ContractDataset = dlData.Dataset;
var AccountID = ContractDataset.Values('AccountID');
var OfficialAccountName = GetDatasetFieldValueByID('ds_Account', AccountID, 'OfficialAccountName');
if (ContractDataset.ValIsNull ('OfficialAccountName'))
{
ShowInformationDialog('Заполните в карточке клиента поле 'Полное наименование'!!!');
return;
}
else
{
scr_BaseDBEdit.btnOKOnClick(Control);
}
scr_BaseDBEdit.btnOKOnClick(Control);

}
}

Что я делаю неправильно, подскажите очень прошу)
С УВАЖЕНИЕМ, Гашникова Екатерина

Здравствуйте, Екатерина.
Мы проанализировали Ваш запрос и можем Вам сообщить следующее.
Для реализации необходимой Вам функциональности можем посоветовать вместо:

var OfficialAccountName = GetDatasetFieldValueByID('ds_Account', AccountID, 'OfficialAccountName');
if (ContractDataset.ValIsNull ('OfficialAccountName'))
{
ShowInformationDialog('Заполните в карточке клиента поле 'Полное наименование'!!!');
return;
}

прописать:
var OfficialAccountName = GetDatasetFieldValueByID('ds_Account', AccountID, 'OfficialAccountName');
if (!OfficialAccountName)
{
ShowInformationDialog('Заполните в карточке клиента поле 'Полное наименование'!!!');
return;
}

А также в скрипте:

var AccountID = ContractDataset.Values('AccountID');
var OfficialAccountName = GetDatasetFieldValueByID('ds_Account', AccountID, 'OfficialAccountName');
if (ContractDataset.ValIsNull ('OfficialAccountName'))
{
ShowInformationDialog('Заполните в карточке клиента поле 'Полное наименование'!!!');
return;
}

Нужно проверять заполнено ли поле Контрагент в карточке договора.
if (!AccountID)
{
return;
}

Желаем Вам успехов!

спасибо большое, все работает!!

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