Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
25 ноя 2024, 13:08

Помогите с Запросами пожалуйста!

Автор Lia_97, 21 фев 2020, 22:51

0 Пользователей и 1 гость просматривают эту тему.

Lia_97

Всем доброго времени суток)
Помогите,пожалуйста,правильно сформировать запрос,я только учусь и не могу понять,как решить подобную задачку
Есть справочник "Процессы",в нем 100 элементов с табличными частями(Допустим Элемент1,Элемент2...ЭлементН).В табличной части(Имя "Операции") 2 поля "Номер" и "Операция".
При добавлении нового элемента нужно проверить все Элементы на наличие дубликата.
Я создала временную таблицу ВремТаб куда поместила ЭтотОбъект в первой части запроса.А после , во втором запросе,хотела выбрать все Элементы где количество полей "Номер" = количеству полей "Номер" текущего объекта и,после этого,в тертьем запросе, применить соединение на оставшиеся в результате второго запроса.
Но у меня не выходит правильно составить второй запрос...
Вот текст моего запроса

Запрос.УстановитьПараметр("Элемент",Элемент.Операции);
                                         //Элемент.Операции = ЭтотОбъект.Операции
    Запрос.Текст =
   "ВЫБРАТЬ
        |  Номер КАК Номер,
|  Операция КАК Операция
|ПОМЕСТИТЬ ВремТаб
        |ИЗ
        |   &Элемент КАК ВремТаб;
|ВЫБРАТЬ
    |  Операции
|ИЗ
|Справочник.Процессы КАК Процессы
                |ГДЕ
                |КОЛИЧЕСТВО(Процессы.Номер) = КОЛИЧЕСТВО(ВремТаб.Номер)";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();

Ругается на неверное использование агрегатной функции,но я не знаю даже,как в ОДНОМ запросе все сделать..
Спасибо даже если просто прочитали и очень надеюсь на вашу поддержку :bleh:

LexaK

да в вашем случае даже запрос писать не надо,
просто в событии элемента формы ПрИзмененииОперации()
в модуле объекта Справочник.Процессы, выполняете процедуру

Процедура ПроверитьОперацию(Операция)Экспорт
    лкОтбор = Новый Структура("Операция",Операция);
    лкСтроки = Операции.НайтиСтроки(лкОтбор);
    Если лкСтроки.Количество() > 1 Тогда
        //есть задвоение, и сообщаем и удаляем повторяющиеся
        Сообщить("Повтор Операции: " + Операция);
        Удалить = Ложь;
        Для каждого лкСтр Из лкСтроки Цикл
            Если Удалить Тогда
                Операции.Удалить(лкСтр);
            КонецЕсли;
            Удалить = Истина;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры;
если помогло нажмите: Спасибо!

Lia_97

Спасибо огромное!)
Но мне интересно именно с запросами разобраться,я знаю,что можно оформить запрос так,что бы решить эту задачу максимально эффективно в объектно-ориентированном плане(что бы этот модуль можно было подключить для списка из 1000 или 100000 элементов)
И большое спасибо,что уделили мне ваше время :nhsrm:

АлександрВладимирович

Как-то так:
// Модуль объекта справочника Процессы

Процедура ПриЗаписи(Отказ)


Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПроцессыОперации.Номер КАК Номер,
| ПроцессыОперации.Операция КАК Операция
|ПОМЕСТИТЬ ДанныеТЧ
|ИЗ
| Справочник.Процессы.Операции КАК ПроцессыОперации
|ГДЕ
| ПроцессыОперации.Ссылка = &Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Процессы.Ссылка КАК Ссылка,
| КОЛИЧЕСТВО(ПроцессыОперации.Номер) КАК КоличествоСовпадений
|ПОМЕСТИТЬ ПроцессыССовпадениями
|ИЗ
| Справочник.Процессы.Операции КАК ПроцессыОперации
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Процессы КАК Процессы
| ПО (Процессы.Ссылка = ПроцессыОперации.Ссылка)
| И ((ПроцессыОперации.Номер, ПроцессыОперации.Операция) В
| (ВЫБРАТЬ
| ДанныеТЧ.Номер КАК Номер,
| ДанныеТЧ.Операция КАК Операция
| ИЗ
| ДанныеТЧ КАК ДанныеТЧ))
|
|СГРУППИРОВАТЬ ПО
| Процессы.Ссылка
|
|ИМЕЮЩИЕ
| КОЛИЧЕСТВО(ПроцессыОперации.Номер) = &ТекущееКоличествоОпераций
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ПроцессыССовпадениями.Ссылка КАК Ссылка,
| ПроцессыССовпадениями.КоличествоСовпадений КАК КоличествоСовпадений,
| КОЛИЧЕСТВО(ПроцессыОперации.Номер) КАК КоличествоОпераций,
| ПроцессыССовпадениями.Ссылка.Представление КАК СсылкаПредставление
|ИЗ
| ПроцессыССовпадениями КАК ПроцессыССовпадениями
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Процессы.Операции КАК ПроцессыОперации
| ПО ПроцессыССовпадениями.Ссылка = ПроцессыОперации.Ссылка
|ГДЕ
| ПроцессыССовпадениями.Ссылка <> &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ПроцессыССовпадениями.Ссылка,
| ПроцессыССовпадениями.КоличествоСовпадений,
| ПроцессыССовпадениями.Ссылка.Представление
|
|ИМЕЮЩИЕ
| ПроцессыССовпадениями.КоличествоСовпадений = КОЛИЧЕСТВО(ПроцессыОперации.Номер)";

Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("ТекущееКоличествоОпераций", Операции.Количество());
                                       
РезультатЗапроса = Запрос.Выполнить();

Если НЕ РезультатЗапроса.Пустой() Тогда

Отказ = Истина;

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Найден дубль: " + ВыборкаДетальныеЗаписи.СсылкаПредставление;
Сообщение.Сообщить();
КонецЦикла;

КонецЕсли;


КонецПроцедуры

Lia_97

Спасибо большое!) буду разбираться теперь,надеюсь научусь большему,чем знаю сейчас):ehtwj:

АлександрВладимирович

Удачи! :ooifh: Учиться - это интересно.

Lia_97


Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск