|
Сложное условие на СКД | ☑ | ||
---|---|---|---|---|
0
sinner_world
30.08.16
✎
17:26
|
Добрый день.
Есть Регистр сведений КомпетенцииСотрудников Измерение: Кандидат (Спр.ФизЛица); Компетенция (Спр.Навыки) Ресурс Оценка(число) Запрос: ВЫБРАТЬ КомпетенцииКандидатовСрезПоследних.Кандидат, КомпетенцииКандидатовСрезПоследних.Компетенция, КомпетенцииКандидатовСрезПоследних.Оценка ИЗ РегистрСведений.КомпетенцииКандидатов.СрезПоследних(&Период, ) КАК КомпетенцииКандидатовСрезПоследних Получаем Кандидатов с оценками их навыком. Кандидат1 1С:Управление торговлей ред. 10.3 5 Кандидат1 1С:Управление торговлей ред. 11.x 2 Кандидат1 Бухгалтерия предприятия 2 Кандидат2 1С:Управление торговлей ред. 10.3 4 Кандидат2 1С:Управление торговлей ред. 11.x 4 Кандидат2 Бухгалтерия предприятия 3 Кандидат3 1С:Управление торговлей ред. 10.3 2 Кандидат3 1С:Управление торговлей ред. 11.x 5 Кандидат3 Бухгалтерия предприятия 4 Используя группы в отборе хочу получить вот такое сочетание навыков Параметры: Период: 30.08.2016 0:00:00 Отбор: "( ( Компетенция Равно ""1С:Управление торговлей ред. 10.3"" И Оценка Больше или равно ""4"" ) ИЛИ ( Компетенция Равно ""1С:Управление торговлей ред. 11.x"" И Оценка Больше или равно ""4"" ) ) И ( Компетенция Равно "" Бухгалтерия предприятия"" И Оценка Больше или равно ""4"" )" В консоли СКД смотрю какой запрос мне сформировал компоновщик: ВЫБРАТЬ КомпетенцииКандидатовСрезПоследних.Кандидат КАК Кандидат, КомпетенцииКандидатовСрезПоследних.Компетенция КАК Компетенция, КомпетенцииКандидатовСрезПоследних.Оценка КАК Оценка, ПРЕДСТАВЛЕНИЕССЫЛКИ(КомпетенцииКандидатовСрезПоследних.Кандидат) КАК КандидатПредставление, ПРЕДСТАВЛЕНИЕССЫЛКИ(КомпетенцииКандидатовСрезПоследних.Компетенция) КАК КомпетенцияПредставление ИЗ РегистрСведений.КомпетенцииКандидатов.СрезПоследних(&П, ) КАК КомпетенцииКандидатовСрезПоследних ГДЕ (КомпетенцииКандидатовСрезПоследних.Компетенция = &П2 И КомпетенцииКандидатовСрезПоследних.Оценка >= &П3 ИЛИ КомпетенцииКандидатовСрезПоследних.Компетенция = &П4 И КомпетенцииКандидатовСрезПоследних.Оценка >= &П3) И КомпетенцииКандидатовСрезПоследних.Компетенция = &П5 И КомпетенцииКандидатовСрезПоследних.Оценка >= &П6 Вывод результат пустой т.к. условия И. Вопрос: Как получить список кандидатов которые знают УТ 10 ИЛИ УТ 11 больше чем на 4 И БП больше чем на 4 В приведенном примере это Кандидат3 |
|||
1
Волшебник
модератор
30.08.16
✎
17:27
|
сделай несколько левых соединений на каждую компетенцию
|
|||
2
sinner_world
30.08.16
✎
17:29
|
А как быть если пользователь в запросе будет выбирать их произвольно ??
|
|||
3
Волшебник
модератор
30.08.16
✎
17:29
|
(2) динамически генери текст запроса
|
|||
4
Лефмихалыч
30.08.16
✎
17:31
|
>Вопрос: Как получить список кандидатов которые знают УТ 10 ИЛИ УТ 11 больше чем на 4 И БП больше чем на 4
надо сформировать таблицу с требуемыми компетенциями и баллами и потом эту таблицу содеинить с регистром внутренним соединением. И не едловать мозги компоновке и ее отборам |
|||
5
sinner_world
30.08.16
✎
17:33
|
(4) Ok Спасибо Буду пробовать.
|
|||
6
Buster007
30.08.16
✎
17:35
|
Вывод результат пустой т.к. условия И.
а это где такое ты нашел? По-моему запрос нормальный, а косяк где-то в твоих параметрах. |
|||
7
sinner_world
30.08.16
✎
17:47
|
(6) Запрос нормальный, что бы ему быть не нормальным то.
но если уберешь все условия кроме: КомпетенцииКандидатовСрезПоследних.Компетенция = &П2 И КомпетенцииКандидатовСрезПоследних.Компетенция = &П5 ГДЕ П2 эде "УТ 10" а П5 это "БП" |
|||
8
Buster007
30.08.16
✎
17:59
|
(7) так ты на СКД не греши.
То что ты указал в отборах, то он тебе и сформировал. |
|||
9
sinner_world
30.08.16
✎
18:16
|
(8) а с чего ты взял что я на него грешу. Если задача хочется решить ее на СКД, знаешь как подскажи.
|
|||
10
sinner_world
07.09.16
✎
10:01
|
Дошли руки сделать набросок решения задачи, может кому пригодится:
На форме ТЗ СписокКомпетенция (Компетенция (Спр), Отбор (ТипОбластиОформленияВидСравнения), Оценка (Число)) И Отчет (ТабличныйДокумент) &НаКлиенте Функция КорректировкаСравнения(ТекстЗапроса) ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"Больше или равно",">="); ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"Меньше или равно","<="); ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"Не равно","<>"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"Равно","="); ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"Меньше","<"); ТекстЗапроса = СтрЗаменить(ТекстЗапроса,"Больше",">"); Возврат ТекстЗапроса; КонецФункции &НаКлиенте Процедура Сформировать(Команда) МассивУсловийКомпетенции = Новый Массив; МассивУсловийОценок = Новый Массив; СтрокаГДЕ = "ГДЕ "; СтрокаСоединение = ""; СтрокаПоляВыборки = ""; КолСоединений = 1; Если ПоИли = Истина Тогда УсловияИ_Или = "ИЛИ"; Иначе УсловияИ_Или = "И"; КонецЕсли; Для каждого Стр Из СписокКомпетенция Цикл СтрПрефиксСоединения = "ВТ"+Строка(КолСоединений); СтрокаСоединение = СтрокаСоединение + " ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК " + СтрПрефиксСоединения + " ПО ВТ.Кандидат = "+СтрПрефиксСоединения+".Кандидат " + Символы.ПС; СтрокаГДЕ = СтрокаГДЕ + " " + СтрПрефиксСоединения+".Компетенция = &Компетенция"+СтрПрефиксСоединения; СтрокаГДЕ = СтрокаГДЕ + " И " + СтрПрефиксСоединения+".Оценка "+ Строка(Стр.Отбор) +" &Оценка"+СтрПрефиксСоединения + Символы.ПС; МассивУсловийКомпетенции.Добавить(Стр.Компетенция); МассивУсловийОценок.Добавить(Стр.Оценка); СтрокаГДЕ = СтрокаГДЕ + " " + УсловияИ_Или; СтрокаПоляВыборки = СтрокаПоляВыборки + "," + СтрПрефиксСоединения+".Компетенция КАК Компетенция"+СтрПрефиксСоединения + Символы.ПС + "," + СтрПрефиксСоединения+".Оценка КАК Оценка"+СтрПрефиксСоединения + Символы.ПС; КолСоединений = КолСоединений + 1; КонецЦикла; ТекстЗапрос = "ВЫБРАТЬ | КомпетенцииКандидатовСрезПоследних.Кандидат, | КомпетенцииКандидатовСрезПоследних.Компетенция, | КомпетенцииКандидатовСрезПоследних.Оценка |ПОМЕСТИТЬ ВТ |ИЗ | РегистрСведений.КомпетенцииКандидатов.СрезПоследних(&МоментВремени, ) КАК КомпетенцииКандидатовСрезПоследних |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ.Кандидат КАК Кандидат | //ПоляВыборки |ИЗ | ВТ КАК ВТ |"; Если КолСоединений <> 1 Тогда СтрокаГДЕ = Лев(СтрокаГДЕ, СтрДлина(СтрокаГДЕ)-СтрДлина(УсловияИ_Или)); ТекстЗапрос = ТекстЗапрос + СтрокаСоединение + СтрокаГДЕ; КорректировкаСравнения(ТекстЗапрос); ТекстЗапрос = СтрЗаменить(ТекстЗапрос,"//ПоляВыборки",СтрокаПоляВыборки); КонецЕсли; ТабДок = СформироватьОтчет(ТекстЗапрос,МассивУсловийКомпетенции,МассивУсловийОценок); Отчет = ТабДок; КонецПроцедуры &НаСервере Функция СформироватьОтчет(ТекстЗапроса,МассивУсловияКомпетенция,МассивУсловияОценок) СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; Источник = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить(); Источник.Имя = "ЛокальнаяБаза"; Источник.СтрокаСоединения = ""; Источник.ТипИсточникаДанных = "Local"; НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); НаборДанных.Имя = "Кандидат"; НаборДанных.ИсточникДанных = "ЛокальнаяБаза"; НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина; НаборДанных.Запрос = ТекстЗапроса; КомпНастроек = Новый КомпоновщикНастроекКомпоновкиДанных; КомпНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных)); КомпНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию); ПараметрСКД = КомпНастроек.Настройки.ПараметрыДанных.Элементы.Найти("МоментВремени"); ПараметрСКД.Использование = Истина; ПараметрСКД.Значение = ТекущаяДата(); Для ИндексСтрока = 0 По МассивУсловияКомпетенция.Количество() - 1 Цикл ПараметрСКД = КомпНастроек.Настройки.ПараметрыДанных.Элементы.Найти("КомпетенцияВТ" + Строка(ИндексСтрока+1)); ПараметрСКД.Использование = Истина; ПараметрСКД.Значение = МассивУсловияКомпетенция[ИндексСтрока]; ПараметрСКД = КомпНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ОценкаВТ" + Строка(ИндексСтрока+1)); ПараметрСКД.Использование = Истина; ПараметрСКД.Значение = МассивУсловияОценок[ИндексСтрока]; КонецЦикла; ПолеОтчета = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); ПолеОтчета.Заголовок = "Кандидат"; ПолеОтчета.ПутьКДанным = "Кандидат"; ПолеОтчета.Поле = "Кандидат"; //добавить группировку ГруппировкаПоКандидат = КомпНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); ГруппировкаПоКандидат.Имя = "Кандидат"; ГруппировкаПоКандидат.Использование = Истина; //созданная группировка по полю "ТО" ПолеГруппировки = ГруппировкаПоКандидат.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); ПолеГруппировки.Использование = Истина; ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Кандидат"); ПолеГруппировки.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы; ПолеГруппировки.ТипДополнения = ТипДополненияПериодаКомпоновкиДанных.БезДополнения; //добавить выводимые поля в группировке: склад и количество остаток для данной группировки АвтоПоле = ГруппировкаПоКандидат.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); АвтоПоле.Использование = Истина; Для ИндексСтрока = 0 По МассивУсловияКомпетенция.Количество() - 1 Цикл ПолеОтчета = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); ПолеОтчета.Заголовок = "Компетенция" + Строка(ИндексСтрока+1); ПолеОтчета.ПутьКДанным = "КомпетенцияВТ" + Строка(ИндексСтрока+1); ПолеОтчета.Поле = "КомпетенцияВТ" + Строка(ИндексСтрока+1); ПолеОченка = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); ПолеОченка.Заголовок = "Оценка" + Строка(ИндексСтрока+1); ПолеОченка.ПутьКДанным = "ОценкаВТ" + Строка(ИндексСтрока+1); ПолеОченка.Поле = "ОценкаВТ" + Строка(ИндексСтрока+1); ПолеГруппировки = ГруппировкаПоКандидат.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); ПолеГруппировки.Использование = Истина; ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("КомпетенцияВТ" + Строка(ИндексСтрока+1)); ПолеГруппировки = ГруппировкаПоКандидат.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); ПолеГруппировки.Использование = Истина; ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("ОценкаВТ" + Строка(ИндексСтрока+1)); КонецЦикла; ДетальныеЗаписи = ГруппировкаПоКандидат.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); ДетальныеЗаписи.Имя = "Детальные"; ДетальныеЗаписи.Использование = Истина; //добавить автополе в группировку детальные АвтоПоле = ДетальныеЗаписи.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); АвтоПоле.Использование = Истина; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпНастроек.Настройки); ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(Макет); ПроцессорКомпоновки.Сбросить(); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ТабДок = Новый ТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ТабДок); ПроцессорВывода.Вывести(ПроцессорКомпоновки); Возврат ТабДок; КонецФункции |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |