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

При открытии нового окна путем нажатия Add в гриде, некоторые поля открывшегося окна должны получить значения по умолчанию.

Где правильно это реализовать? В каком скрипте: окна, датасета или грида.

Спасибо.

Нравится

9 комментариев

Реализовала в обработчике события OnDatasetAfterAppend (на рисунке pic1)

function dlDataOnDatasetAfterAppend(Dataset)
{
например:
Dataset.Values('CreatedByID') = Connector.CurrentUser.ContactID;

но это работает, если CreatedByID существует в Dataset, а если на окне есть поле из другого датасета?

как же ссылатся на это поле, чтобы дать значение ?

edtПоле.Value = значение
Microsoft JScript runtime error: Object doesn't support this property or method
Self.ComponentsByName('edtПоле').Value = значение
Microsoft JScript runtime error: Object doesn't support this property or method

Спасибо.

Не совсем понял.
Объясните подробнее, что именно у Вас в окне, какие поля и датасеты, что Вы хотите сделать.

Задача стоит такая:
Надо, чтобы при открытии окна, некоторые поля окна получили значения.

Данное окно состоит из 3-х датасетов: dltata(это основной датасет), dlDataContactCredit и dlContact.(pic2)
Поле CreatedByID-из датасета dltata(pic3), а поле ContactCreditNumber-из датасета dlDataContactCredit(pic4).

в событии function dlDataOnDatasetAfterAppend(Dataset) // Dataset = dltata (посмотрела по дебаггеру)

данное присвоение
Dataset.Values('CreatedByID') = Connector.CurrentUser.ContactID;
работает, но
Dataset.Values('ContactCreditNumber') = "123";
не работает, выдает ошибку 'DataField ContactCreditNumber' is not assigned, так как в dltata этого поля нет. Оно в dlDataContactCredit.

Как задать значение полю ContactCreditNumber ?

Спасибо.

Вы что-то очень странное делаете.
Основной датасет dlData — при нажатии «ОК» в соответствующей таблице в базе создаётся новая запись и в ней эти поля заполнены значениями по умолчанию, если пользователь на карточке вручную не изменил. А зачем другие датасеты? Там должна добавляться новая запись или просто будет выбираться значение из списка?

Может, прямо обращаться к полям dlDataContactCredit.Dataset?

Другие датасеты только для чтения.
Те поля, которые не из основного датасета(dlData) не будут менятся(они readOnly). И чтобы получить значения из других датасетов, я использовала

function RefreshDetailDataByParentID(ParentID, ChildDataset, ChildFilterName, DoNotDisableAllFilters) из scr_DB
Эта функция делает следующее:
ApplyDatasetFilter(ChildDataset, ChildFilterName, ParentID, true);
ChildDataset.Open(); здесь работает запрос, со всеми полями
которые есть в ChildDataset и поля на окне автомотически заполняются.

Для dlContact этот подход уместен, так как на окне есть много полей из этого датасета.

Но для dlDataContactCredit, на окне лишь одно поле из этого датасета, да и значение которое поле должно получить, в конкретной задаче известно, поэтому не имеет смысла запрашивать данные.

Поэтому я подумала, будет быстрее напрямую дать значение, но не получается.
var ContactCreditDataset = Self.ComponentsByName('dlDataContactCredit').Dataset;
ContactCreditDataset.Values('XXX') = Self.Attributes('NotifyObject').Attributes.Values('Attribute');

Ошибка выполнения метода 'dlDataOnDatasetAfterAppend'. Field 'XXX' not found.

Во всяком случае, с помощью RefreshDetailDataByParentID вопрос решается.

Вам не надо делать вставку новой записи в это поле, а просто устанавливать значение поля.
Или же вовсе отказаться от дополнительных датасетов и заполнять значения контролов программно.

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

Есть несколько способов установки значений по умолчанию (примеры приведу для контрагента):

  1. 1. Создать свою функцию в скрипте окна редактирования (scr_AccountEdit):
    function SetDefValues() {
    	var IsAppendRec = (dlData.Dataset.State == dstInsert);
    	AccountEdit.IsAppendRec = IsAppendRec;
    	if (!IsAppendRec) {
    		return;
    	}
    	edtCode.DataField.Value = '456';
    } 

    После чего функцию SetDefValues вызвать вызвать из события окна wnd_AccountEditOnPrepare:

    function wnd_AccountEditOnPrepare(Window) {
    	Initialize();
       	wnd_BaseDBEditOnPrepare(Window);
     
    	SetDefValues();	
    }
  2. 2. Устанавливать значения по умолчанию для каждого источника данных (датасет) на событии OnDatasetAfterAppend:
    function dlDataOnDatasetAfterAppend(Dataset) {
    	Dataset('EmployeesNumber') = '987';
    	Dataset.DataFields('Name').Value = '654';
    	Dataset.DataFields('OfficialAccountName').ValAsStr = '321';
    	Dataset.ValAsStr('Address') = 'Address';
    }

    Данная реализация сработает только при добавлении новой записи при помощи окна редактирования.

  3. 3. Устанавливать значения по умолчанию для глобального (пример, ds_Account) источника данных (датасет) на событии OnDatasetAfterAppend:
    function SelfOnDatasetAfterAppend(Dataset) {
    	Dataset('EmployeesNumber') = '987';
    	Dataset.DataFields('Name').Value = '654';
    	Dataset.DataFields('OfficialAccountName').ValAsStr = '321';
    	Dataset.ValAsStr('Address') = 'Address';
    }

    Данный код будет всегда срабатывать, когда будет добавляться новая запись вне зависимости от метода добавления, будет ли это окно редактирования реестра или при помощи кода.

Здравствуйте Александр и Павел.
Спасибо за ответы !

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