Можно Ли Получить Список Выделенных Checkbox-entry До Очередного Клика

Shandrik

Lotus team
30.12.2010
268
12
#1
Добрый день, коллеги.
Прошу помощи, т.к. сам простого решения не вижу.
Имеется три CheckBox-поля, причем список вариантов во втором, зависит от выбранных в первом, а список в третьем зависит от выбора во втором.
То есть, выбираем ещё один пункт в первом CheckBoxe и во втором появляются дополнительные варианты.
Скажем, в первом страны, во втором города, а в третьем - офисы.
Я реализовал на формулах такую зависимость, но заказчик теперь хочет, чтобы при выборе нового пункта в ведущем Checkbox-е, появившиеся новые пункты в ведомом списке автоматически выделялись.

Не могу сообразить, как это реализовать.

Как понять, какой пункт мы только что выбрали?
На ум приходит только хранение предыдущего значения в отдельном поле, которое создается в PostOpen и обновляется в InputTranslation.

Есть ли путь попрямее и поизящней?
 

ty3uk

Well-known member
31.03.2008
170
0
#2
ну я именно так и делаю, только не для чекетбоксов, а для обычных полей, когда надо отсеживать изменение, и менять в других документах, рассылки делать и т.п.
Тока, сразу, в LS для айтемов, есть такой параметр как savetodisk соотвественно, на постопен (что-то типа этого):
Код:
dim t_item as notesitem
t_item=source.document.getfirstitem("subject")
t_item=t_item.copytodocument(source.document,"old_subject")
t_item.savetodisk=false
соответвенно на постсаве, проверяю, поменялось или нет.
 

alexas1

Lotus team
10.04.2014
723
144
#3
Я реализовал на формулах такую зависимость, но заказчик теперь хочет, чтобы при выборе нового пункта в ведущем Checkbox-е, появившиеся новые пункты в ведомом списке автоматически выделялись...
Т.е. при выборе в первом чекбоксе добавляются значения в список выбора второго чека.
Т.е. у Вас есть этот "список".
Выбранные значения в чекбоксе это новые значения самого чекбокса.
Ну и сделайте FIELD второй_чекбокс := "список" (ну, или LS-ом), как только получили этот "список"
P.S.
После сохранения/открытия этого дока "выделения" в чеках останутся.
 

Shandrik

Lotus team
30.12.2010
268
12
#4
ну я именно так и делаю, только не для чекетбоксов, а для обычных полей, когда надо отсеживать изменение, и менять в других документах, рассылки делать и т.п.
Тока, сразу, в LS для айтемов, есть такой параметр как savetodisk соотвественно, на постопен (что-то типа этого):
Думаю, что все так делают, но тут надо отслеживать не в квери- или пост-сейве, а в момент клика.

Наверное, описанный мной алгоритм - единственный путь.

Добавлено:
Т.е. при выборе в первом чекбоксе добавляются значения в список выбора второго чека.
Т.е. у Вас есть этот "список".
Выбранные значения в чекбоксе это новые значения самого чекбокса.
Ну и сделайте FIELD второй_чекбокс := "список" (ну, или LS-ом), как только получили этот "список"
Нет, до этого во втором Чекбоксе было уже множество выбранных вариантов и их выбранность, разумеется, надо сохранить.
 

alexas1

Lotus team
10.04.2014
723
144
#5
Нет, до этого во втором Чекбоксе было уже множество выбранных вариантов и их выбранность, разумеется, надо сохранить.
Вот тут не понял.
т.е. так?
1 во втором чеке навыбирали элементов
2 в первом чеке изменили выбор элемента и для второго чека добавился список для выбора
3 во втором чеке надо оставить выбранное и дополнительно подсветить (т.е. выбрать автоматом) добавленный список?
Тогда FIELD второй_чекбокс := второй_чекбокс : "список"
 

Shandrik

Lotus team
30.12.2010
268
12
#6
Да, видимо, правильно поняли.
Должно быть такое поведение:

Состояние 1
("+" - выбранный элемент,
красный - изменение, выполненное пользователем)

ChkBox1:
CCCP +
ГДР
Чехословакия

ChkBox2:
Москва +
Новосибирск +
Омск
Бобруйск +
Мелитополь +
Шепетовка
Владивосток



Состояние 2:

ChkBox1:
CCCP +
ГДР
Чехословакия +

ChkBox2:
Москва +
Новосибирск +
Омск
Бобруйск +
Мелитополь +
Шепетовка
Владивосток
Прага +
Братислава +
Брно +

Состояние 3:

ChkBox1:
CCCP +
ГДР
Чехословакия +

ChkBox2:
Москва +
Новосибирск +
Омск
Бобруйск +
Мелитополь +
Шепетовка
Владивосток
Прага
Братислава

Брно +


Состояние 4:

ChkBox1:
CCCP
ГДР
Чехословакия +

ChkBox2:
Прага
Братислава
Брно +
 

alexas1

Lotus team
10.04.2014
723
144
#7
Да, видимо, правильно поняли.
Тогда так.
1 При изменении первого чека записывается измененный список в поле выбора для второго чека.
2 Новые элементы списка выбора - это "список"
3 Проверяем, что ранее выбранное во втором чеке содержится в новом списке выбора (трансформом, проверка @ismember, если "0" - пишем на это место "", результат - @trim) т.о. удаляем ранее выбранное, не содержащееся в уже измененном (возможно урезанном) списке.
3 В конце FIELD второй_чек := второй_чек : "список"
=================
Т.е. не только добавляем к выбору (в чеке) заведомо новые элементы выбора списка с автоматическим селектом, а, дополнительно, удаляем все, ранее выбранные, если они не содержатся в новом списке выбора.
 

Shandrik

Lotus team
30.12.2010
268
12
#8
Да дальше-то понятно - вроде, граблей не видно.
Проблема, как я озвучил, в получении выбранного пункта CheckBoxа
 

alexas1

Lotus team
10.04.2014
723
144
#9
...Проблема, как я озвучил, в получении выбранного пункта CheckBoxа
На форме:
Checked - Ваш чекбокс, с включенным |refresh fields on keyword change|
OldChoice - Multivalue computed text field с формулой просто CheckBox
и Changed, например, - computed text field с формулой:

flag := @Elements(CheckBox)>@Elements(OldChoice);
@If(flag;"checked: "+@Trim(@Replace(CheckBox; OldChoice; ""));
"unchecked: "+@Trim(@Replace(OldChoice; CheckBox; "")))

После каждого изменения выбора в Checked в поле Changed будет последнее изменение вида checked(unchecked): |строка клика|

для правильной работы, поле OldChoice должно быть на форме после Changed (правее или ниже).