изменение значения в датасете

В скрипте scr_UserEdit я получаю ID контакта нужного мне пользователя в функции btnOKOnClick(Control). А в ds_Contact надо изменить значение поля для контакта с тем самым полученным ID (чтобы это изменение происходило при нажатии кнопки OK окна wnd_UserEdit - т.е. получается, из функции btnOKOnClick(Control)).

var dataset = dlData.dataset; //датасет пользователя
dataset.open();
dataset.edit();
UserIsActive = cbUserIsEnabled.DataField.Value;
ContactID = edtContactName.DataField.Value; //contact ID
//ниже - неудачная попытка изменить значение поля 'Active' в ds_Contact

//2 варианта получения датасета
var ContactDataset = Services.GetNewItemByUSI('ds_Contact');
//var ContactDataset = edtContactName.DataField.LookupDataset;

ApplyDatasetIncludeFilter(ContactDataset, 'ID', ContactID, true);
ContactDataset.open(); // кстати, почему-то ну очень долго открывается
ContactDataset.edit();
ContactDataset.Values('Active') = UserIsActive;

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

Нравится

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

Нужно сообщить набору данных о том, что следует сохранить данные.

ContactDataset.Post();
var UserIsActive = cbUserIsEnabled.DataField.Value;
var ContactID = edtContactName.DataField.Value;
 
var ContactDataset = Services.GetNewItemByUSI('ds_Contact');
ApplyDatasetFilter(ContactDataset, 'ID', ContactID, true);
ContactDataset.DisableEvents();
ContactDataset.Open();
ContactDataset.Edit();
ContactDataset.Values('Active') = UserIsActive;
ContactDataset.Post();
ContactDataset.EnableEvents();

это если поправить существующий код
а вообще я бы по другому сделал, просто отобразил бы значение данной галочки в карточке контакта (правим запрос sq_Contact), а не сохранял бы ее в таблице tbl_Contact

ничего не изменилось.

"Александр Кудряшов" написал:а вообще я бы по другому сделал, просто отобразил бы значение данной галочки в карточке контакта (правим запрос sq_Contact), а не сохранял бы ее в таблице tbl_Contact
- не поняла, что Вы имеете ввиду.

var UserIsActive = cbUserIsEnabled.DataField.Value;

- берем значение Активен из карточки пользователя (tbl_AdminUnit.UserIsEnabled)

ContactDataset.Values('Active') = UserIsActive;

заносим это значение уже в таблицу tbl_Contact в поле Active (правильно понимаю?)
Вот я и пишу - зачем эту же информацию из tbl_AdminUnit каждый раз при изменении синхронно менять в tbl_Contact? Важно редактировать это поле в карточке контакта независимо? Если нет, достаточно просто в карточку контакта подтягивать запросом значение tbl_AdminUnit.UserIsEnabled

"Александр Кудряшов" написал:Важно редактировать это поле в карточке контакта независимо?

Да. у одного пользователя может быть несколько контактов. контакт можно сделать неактивным, а пользователь останется активным. А вот если пользователь неактивен, то его контакт тоже автоматически становится неактивным.

Изменяя значение ContactDataset.Values('Active') = UserIsActive;
в базе данных значение соответствующего поля таблицы не меняется
и в окне контакта значение поля 'Active' тоже не меняется.

Вы все сделали, как рекомендовал Александр Кудряшов?
Этот код по всей логике рабочий. Если и он не работает, то нужно рассматривать конкретно Вашу ситуацию. Обратитесь в службу поддержки (support@tscrm.com) и предоставьте измененные сервисы (скрипты, сервисы контакта) на детальное рассмотрение.

Не совсем=) Я не заметила, что он другой филдьтр использовал

ApplyDatasetFilter(ContactDataset, 'ID', ContactID, true);

вместо моего ApplyDatasetIncludeFilter.

чем отличаются эти 2 фильтра?

в стандартной поставке под именем 'ID' в sq_Contact скрывается фильтр сравнения вида tbl_Contact.ID = :ID
поэтому применил ApplyDatasetFilter, а у вас какой фильтр назван 'ID' в том запросе?
тем более ContactID - одно значение, фильтра сравнения вполне достаточно

У нас тоже фильтр сравнения.
Просто я еще не знаю, чем отличаются функции фильтров ApplyDataset***Filter,
поэтому ошибаюсь=)

В скрипте scr_DB есть эти и много других функций. Если говорить о ApplyDataset***Filter, то их несколько
ApplyDatasetFilter(датасет, название_фильтра, знач_параметра, включен_ли) - для фильтра сравнения с определенным названием
ApplyDatasetIDFilter(датасет, значение_ID, включен_ли) - фильтр сразу по ID
ApplyDatasetGroupIDFilter(родит_датасет, дочерн_датасет, название_родит_ID_поля) - для фильтрации дочернего датасета по группе, выбранной в родительском
ApplyDatasetIncludeFilter - для фильтра включения
ApplyDatasetIsNullFilter - фильтр существования

В зависимости от необходимости используйте ту или иную функцию.
Чаще всего используют фильтры сравнения и фильтры существования, для которых вызывается первая ApplyDatasetFilter.
Или же используйте EnableDatasetFilters для включения/отключения сразу нескольких или же всех фильтров

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