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