![]() |
|
Переход от объекта "Отбор" к объекту "Структура" | ☑ | ||
---|---|---|---|---|
0
Волшебник
23.10.04
✎
19:14
|
Thrash
форма. динамический список (ргСведений, спр - неважно). панель инструментов. юзер делает какой-либо отбор (абсолютно произвольный, стандартными средствами). жмет на пимпу - и мне надо получить то, что у него в данный момент в списке. логичное , казалось бы: CODE тзЧтототам = РегистрыСведений.Чтототам.СрезПоследних(ТекущаяДата(), ЭлементыФормы.РегистрСведенийСписок.Значение.Отбор); по понятным причинам не прокатывает (ну дурь, отбор - это отбор, а не структура, если 2 вида - надо дать возможность использовать оба варианта) - ибо ЭлементыФормы.РегистрСведенийСписок.Значение.Отбор это объект "Отбор", а в команде в параметре должна быть Структура. то есть это отпадает и нужен запрос с условием. собственно вопрос - есть ли какой-либо изящный способ это сделать, кроме как потрошить отбор, вытаскивая оттуда типы, пути к данным, виды сравнения, данные для сравнения громоздя условие в запрос? --------------------------------- отвечаю сам себе, делюсь своим решением - вдруг кому-то пригодиться. во вложении функция, ей передается динамический список CODE глЗапросПоОтборуДС(ЭлементыФормы.РегистрСведенийСписок) возвращает она ТЗ состояния регистра "как в списке" . в качестве источника для условий используется отбор, для регистров сведений выполняется проверка устанвки значения среза - первых, последних, не использовать. в качестве домашнего задания - там еще надо упорядочить, как в списке, и обработать галочку Иерархического просмотра в списках ПВХ, спр., планов счетов - сделаете самостоятельно если обнаружите ошибки - пишите. ------------------------------------------- Функция глЗапросПоОтборуДС(СписокД) Экспорт ВидД = СтрЗаменить(Строка(СписокД.Значение), "Список", ""); Если Лев(ВидД, 15) = "РегистрСведений" Тогда Если СписокД.ВыбиратьСрез = ИспользованиеСреза.Первые Тогда ВидД = ВидД + ".СрезПервых"; ИначеЕсли СписокД.ВыбиратьСрез = ИспользованиеСреза.Последние Тогда ВидД = ВидД + ".СрезПоследних"; КонецЕсли; КонецЕсли; ЗапросД = Новый Запрос; ТекстЗапроса = "Выбрать | * |Из | " + ВидД; _где = " |ГДЕ | "; _и = " | И | "; Попытка //бывает, что Отбор недоступен (например при первом вызове и ОтборД = СписокД.Значение.Отбор; //из проц. ПередОткрытием() Исключение ОтборД = Неопределено; КонецПопытки; БылоГде = Ложь; Если ОтборД <> Неопределено Тогда Для ИндексОтбора = 0 По ОтборД.Количество() - 1 Цикл Если ОтборД[ИндексОтбора].Использование Тогда Если не БылоГде Тогда ТекстЗапроса = ТекстЗапроса + _где; БылоГде = Истина; Иначе ТекстЗапроса = ТекстЗапроса + _и; КонецЕсли; Вариант = 0; Если ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.Больше Тогда ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " > "; Вариант = 1; ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.БольшеИлиРавно Тогда ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " >= "; Вариант = 1; ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.ВИерархии Тогда ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " В иерархии "; Вариант = 4; ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.ВСписке Тогда ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " В "; Вариант = 4; ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.ВСпискеПоИерархии Тогда ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " В иерархии "; Вариант = 4; ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.Интервал Тогда ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " > &" + ОтборД[ИндексОтбора].ПутьКДанным + "1" + _и; ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " < &" + ОтборД[ИндексОтбора].ПутьКДанным + "2"; Вариант = 2; ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.ИнтервалВключаяГраницы Тогда ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " >= &" + ОтборД[ИндексОтбора].ПутьКДанным + "1" + _и; ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " <= &" + ОтборД[ИндексОтбора].ПутьКДанным + "2"; Вариант = 2; ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.ИнтервалВключаяНачало Тогда ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " >= &" + ОтборД[ИндексОтбора].ПутьКДанным + "1" + _и; ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " < &" + ОтборД[ИндексОтбора].ПутьКДанным + "2"; Вариант = 2; ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.ИнтервалВключаяОкончание Тогда ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " > &" + ОтборД[ИндексОтбора].ПутьКДанным + "1" + _и; ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " <= &" + ОтборД[ИндексОтбора].ПутьКДанным + "2"; Вариант = 2; ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.Меньше Тогда ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " < "; Вариант = 1; ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.МеньшеИлиРавно Тогда ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " <= "; Вариант = 1; ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.НеВИерархии Тогда ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " Не В иерархии "; Вариант = 4; ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.НеВСписке Тогда ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " Не В "; Вариант = 4; ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.НеВСпискеПоИерархии Тогда ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " Не В иерархии "; Вариант = 4; ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.НеРавно Тогда ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " <> "; Вариант = 1; ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.Равно Тогда ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " = "; Вариант = 1; ИначеЕсли ОтборД[ИндексОтбора].ВидСравнения = ВидСравнения.Содержит Тогда ТекстЗапроса = ТекстЗапроса + ОтборД[ИндексОтбора].ПутьКДанным + " Подобно "; Вариант = 3; Иначе Сообщить("ошибка!"); КонецЕсли; Если Вариант = 1 Тогда ТекстЗапроса = ТекстЗапроса + "&" + ОтборД[ИндексОтбора].ПутьКДанным; ЗапросД.УстановитьПараметр("" + ОтборД[ИндексОтбора].ПутьКДанным, ОтборД[ИндексОтбора].Значение); ИначеЕсли Вариант = 2 Тогда ЗапросД.УстановитьПараметр("" + ОтборД[ИндексОтбора].ПутьКДанным + "1", ОтборД[ИндексОтбора].ЗначениеС); ЗапросД.УстановитьПараметр("" + ОтборД[ИндексОтбора].ПутьКДанным + "2", ОтборД[ИндексОтбора].ЗначениеПо); ИначеЕсли Вариант = 3 Тогда ТекстЗапроса = ТекстЗапроса + "&" + ОтборД[ИндексОтбора].ПутьКДанным; ЗапросД.УстановитьПараметр("" + ОтборД[ИндексОтбора].ПутьКДанным, "%" + ОтборД[ИндексОтбора].Значение + "%"); ИначеЕсли Вариант = 4 Тогда ТекстЗапроса = ТекстЗапроса + "(&" + ОтборД[ИндексОтбора].ПутьКДанным + ")"; ЗапросД.УстановитьПараметр("" + ОтборД[ИндексОтбора].ПутьКДанным, ОтборД[ИндексОтбора].Значение); КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; Сообщить("" + ТекстЗапроса); ЗапросД.Текст = ТекстЗапроса; тзТ = ЗапросД.Выполнить().Выгрузить(); Возврат тзТ; КонецФункции // () ------------------------- Источник: http://itland.ru/forum/index.php?showtopic=4977 |
|||
1
427
23.10.04
✎
20:00
|
и эти люди запрещают мне ковыряться в носу?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |