Добрый день!
Понадобилось реализовать такую задачу:
В DataControlы карточки добавить появляющуюся при появлении значения в поле кнопку(за лупой, если это LookupDataControl), нажатие на которую очистит это значение и после этого кнопка снова исчезнет.
Данную задачу реализовываю при помощи ActionMenu, привязывая ее к DataField.Buttons динамически в событии OnDatasetDataChange и затем при удалении значения поля делаю DataField.Buttons = System.EmptyValue.
Так вот, все работает нормально, если удаляю значение кнопкой Delete с клавиатуры, кнопка появляется и исчезает нормально, но если значение удалять из события ActionMenuItemOnExecute (Sender.DataField.Value = null), вываливается ошибка List index out of bounds(2).
В чем может быть проблема?
Заранее благодарен!

Нравится

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

Просто интересно, а чем Backspace не устраивал?

Вопрос к клиенту, наверное боятся мышь отпускать :wink:

Иван, реализуйте задачу немного иначе:
1. В функции dlDataOnDatasetDataChange пропишите логику скрытия amiActionMenuItem, например:

	if (FieldName == 'OwnerID') {
		if (IsEmptyValue (DataField.Value)){
	    amiActionMenuItem.IsVisible = false; 	
		}else{
		amiActionMenuItem.IsVisible = true;
		}
	}

2. В функцию обработки события OnExecute компонента amiActionMenuItem никаких изменений вносить не нужно.

Ошибка вызвана тем, что Вы находясь в уже вызванном обработчике события amiActionMenuItem, связанном с компонентом LookupDataField окна, пытаетесь сделать отвязку .

Спасибо Наталия, ситуация с ошибкой прояснилась.
Но проблема в том, что если сделать amiActionMenuItem.IsVisible = false, то он будет скрыт для всех DataField, которых очень много. А нужно это делать только для тех, в которых Value = null.

Вопрос решил обнулением Value по таймеру. Спасибо за наводку!

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

Добрый день!
Есть насущная необходимость очистить справочник "Типы задач" карточки "Задача" принудительно.
Как это можно сделать?
Причем справочник нужно очистить не весь (хотя как очистить весь тоже интересно знать на будущее), только определенные значения.
Поясню, типов задач развелось слишком много, и сейчас их число резко сократили, но в выпадающем списке они появляются все, нужно удалить ненужные.
В базе 50к+ задач, все взаимосвязи вручную вычистить под удаление нереально.

Заранее спасибо!

Нравится

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

Сначала смотрим ID ненужного типа и ID нужного, на который его меняем. Открываем в TSAdmin сервис sq_TaskType, нажимаем на лупу предпросмотра, в открывшейся вкладке на кнопку Play.
Видим примерно такое:

{63FB4E89-EE75-404F-8352-1E712AC909F6}		Встреча		...
{EE2F344B-BCE6-48A7-8813-20A4964DDE82}		Выполнить	...
{8CAD3402-F313-41F7-8EF7-4FE847E25005}		Email		...
{CED7CC70-81CB-4AB1-A9F2-521998B14723}}		Звонок		...
{23657C4C-696C-4B44-BDDA-5E0D3BC98BF0}		Какой-то ненужный тип	

Допустим, надо поменять всем задачам последний тип на второй.
Запускаем программу для работы с БД (например, MS SQL Server Management Studio или Toad), вводим и запускаем скрипт:

update "tbl_Task"
set "TypeID" = '{EE2F344B-BCE6-48A7-8813-20A4964DDE82}'
where "TypeID" = '{23657C4C-696C-4B44-BDDA-5E0D3BC98BF0}'

После выполнения этого скрипта задач ненужного типа не останется, значение из справочника можно удалить невозбранно. Редактировать их содержимое можно в разделе или окне "Справочники", в зависимости от версии Terrasoft.

Это единственный способ? И мы на Firebird.

Для Firebird нужно смотреть, не отличается ли синтаксис SQL. Программа для управления БД там называется IBExpert.

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

По идее, в Firebird так же, только без двойных кавычек:

update tbl_Task
set TypeID = '{EE2F344B-BCE6-48A7-8813-20A4964DDE82}'
where TypeID = '{23657C4C-696C-4B44-BDDA-5E0D3BC98BF0}'

Алгоритм приведен выше, какой конкретно тип менять на какой - вам виднее.

Как раз в firebird будет обязательно с кавычками :smile:
Типа такого предложу:

update "tbl_Task" set "TypeID" =
    (select first 1 "ID" from "tbl_TaskType" where "tbl_TaskType"."Name" = 'Новый тип')
where "TypeID" =
    (select first 1 "ID" from "tbl_TaskType" where "tbl_TaskType"."Name" = 'Старый ненужный тип')

Текстом вписываете названия типов старого и нового, не надо с ID возиться

"Александр Кудряшов" написал:Как раз в firebird будет обязательно с кавычками

Странно. Запутало официальное руководство с их сайта. Там без кавычек и операторы маленькими буквами.

Не работает. Скрипт с ошибкой.

Какой из скриптов? И какая ошибка?

Сорри, моя вина, я не поставил флажок "использовать текущее соединение".
Сделал, что хотел, но! Работал только скрипт с идентификаторами, с именами не работал. Почему?

Попутно родился вопрос - как сделать, чтобы у пользователей в выпадающем списке все значения полей были по алфавиту?

"Зверев Александр" написал:Открываем в TSAdmin сервис sq_TaskType, нажимаем на лупу предпросмотра, в открывшейся вкладке на кнопку Play

А где живут значения справочника "Результаты задач"?

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

Оптимальный вариант на данный момент - добавить в справочник новый признак "показывать" и фильтровать справочник на открытии. В этом случае в выпадающем списке будут только правильные типы задач, и для старых задач типы также будут отображаться корректно.

"Alimova Anna" написал:
Дмитрий, нельзя бесконтрольно очищать справочники типов, поскольку они связаны с задачами, исистема просто не позволит удалить значения.

Не бесконтрольно же. Сначала заменяем, а потом удаляем.


Оптимальный вариант на данный момент - добавить в справочник новый признак "показывать" и фильтровать справочник на открытии. В этом случае в выпадающем списке будут только правильные типы задач, и для старых задач типы также будут отображаться корректно.

Это требует немного программирования.

"Бухаров Дмитрий" написал:А где живут значения справочника "Результаты задач"?

Соответственно sq_TaskResult и tbl_TaskResult.

Александр спасибо! Анна, я понимаю, что делаю :)

"Бухаров Дмитрий" написал:

Работал только скрипт с идентификаторами, с именами не работал. Почему?

Попутно родился вопрос - как сделать, чтобы у пользователей в выпадающем списке все значения полей были по алфавиту?


А тут как?

"Бухаров Дмитрий" написал:А тут как?

Открыть sq_TaskType, выбрать поле Name и поменять настройку "Тип сортировки" с "нет" на "по возрастанию".

"Зверев Александр" написал:

Открыть sq_TaskType, выбрать поле Name и поменять настройку "Тип сортировки" с "нет" на "по возрастанию".


Спасибо!
А по поводу скрипта?

"Бухаров Дмитрий" написал:А по поводу скрипта?

А какая ошибка выводится?

Не ошибка. Скрипт исполняется, но ничего не меняется.

"Бухаров Дмитрий" написал:Скрипт исполняется, но ничего не меняется.

Интересно. А можете запустеть отдельно такие запросы:

SELECT first 1 "ID" FROM "tbl_TaskType" WHERE "tbl_TaskType"."Name" = 'Новый тип'

и

SELECT first 1 "ID" FROM "tbl_TaskType" WHERE "tbl_TaskType"."Name" = 'Старый ненужный тип'

Естественно, с вашими названиями типов.
Эти запросы покажут ID по имени, ничего не меняя в базе.
Если они выводят по одному GUID-у, то оба скрипта замены должны, по идее, работать одинаково.

Ничего не выводят.

Здравствуйте, Дмитрий.

Если запросы:

SELECT "ID" FROM "tbl_TaskType" WHERE "tbl_TaskType"."Name" = 'Новый тип'

и

SELECT "ID" FROM "tbl_TaskType" WHERE "tbl_TaskType"."Name" = 'Старый ненужный тип'

ничего не возвращают, значит тут два варианта:

1) Либо в той БД к которой Вы выполняете запросы просто нету таких типов.
2) Либо в названии типа Вы допустили опечатку.

"Бухаров Дмитрий" написал:

Не ошибка. Скрипт исполняется, но ничего не меняется.


Дмитрий, особенность Firebird в том, что он ничего за вас "не додумывает" в отличии от платного MSSQL :)
Тут необходимо явно делать коммит изменений.

"Бухаров Дмитрий" написал:

Ничего не выводят.


Думаю проблема в том, что вы пишите не в юникоде. Данные храняться в в другом формате чем вы написали. Посмотрите в редакторе запросов в IBExpert как конвертировать текст в юникод.

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