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

подбор из списка в отчете

Автор ls600, 05 ноя 2014, 08:40

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

ls600

Доброго времени суток. Подскажите как реализовать в отчете подбор из списка?.
В отчете уже реализовано отбор т.е если указан участок то выводит данные по конкретному участку, иначе по всем участкам.
На рис 1 как форма выглядит до изменения.


Процедура КнопкаСформироватьНажатие(Кнопка)
   Макет = ПолучитьМакет("Макет");
   ТабДок = ЭлементыФормы.ПолеТабличногоДокумента;
   ТабДок.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
   ТабДок.ФиксацияСверху = ТабДок.Область("R5C1:R5C20").Низ;
   ТабДок.ТолькоПросмотр = Истина;
   
   запрос = Новый запрос;
   запрос.Текст = "ВЫБРАТЬ
                  |   Совещание.Регистратор.Номер КАК Номер,
                  |   Совещание.КостЦентр,
                  |   Совещание.Линия,
                  |   Совещание.Участок.Код КАК Код,
                  |   Совещание.Участок,
                  |   Совещание.ФЛСОборудования,
                  |   Совещание.НомерОборудованияКЦ,
                  |   Совещание.Регистратор.Дата КАК ДатаДок,
                  |   Совещание.Заявитель,
                  |   Совещание.ОписаниеЗапроса,
                  |   Совещание.ДляКого,
                  |   Совещание.ЗаявленнаяДатаЗавершения,
                  |   Совещание.ИмяРуководителя,
                  |   Совещание.Утверждено,
                  |   Совещание.ПричинаОтказа,
                  |   Совещание.Исполнитель,
                  |   Совещание.ДатаЗавершения,
                  |   Совещание.СтатусВыполнения,
                  |   Совещание.ОжидаемаяДатаЗавершения КАК ОжидаемаяДатаЗавершения,
                  |   Совещание.Примечание,
                  |   Совещание.Регистратор КАК Ссылка
                  |ИЗ
                  |   РегистрНакопления.Совещание КАК Совещание
                  |ГДЕ
                  |   Совещание.Регистратор.Дата МЕЖДУ &ДатаНач И &ДатаКон"+?(ЗначениеЗаполнено(СтатусВыполнения), " И Совещание.СтатусВыполнения = &СтатусВыполнения","")+"
               |   "+?(ЗначениеЗаполнено(Линия) ,          " И Совещание.Линия = &Линия","")+"
               |   "+?(ЗначениеЗаполнено(ДатаНачЗавершения) ИЛИ ЗначениеЗаполнено(ДатаКонЗавершения)," И Совещание.ОжидаемаяДатаЗавершения МЕЖДУ &ДатаНачЗавершения И &ДатаКонЗавершения ","")+"
               |   "+?(ЗначениеЗаполнено(Заявитель) ,       " И Совещание.Заявитель = &Заявитель","")+"
               |   "+?(ЗначениеЗаполнено(Исполнитель) ,    " И Совещание.Исполнитель = &Исполнитель","")+"
                  |   "+?(ЗначениеЗаполнено(Участок) ,       " И Совещание.Участок = &Участок","")+"
               |   "+?(ЗначениеЗаполнено(Утверждено) ,       " И Совещание.Утверждено = &Утверждено","")+"
               |ИТОГИ ПО
               |   Номер";
               
   запрос.УстановитьПараметр("ДатаНач" ,НачалоДня(ДатаНач));
   запрос.УстановитьПараметр("ДатаКон",КонецДня(ДатаКон));
   запрос.УстановитьПараметр("СтатусВыполнения",СтатусВыполнения);
   запрос.УстановитьПараметр("ДатаНачЗавершения",ДатаНачЗавершения);
   запрос.УстановитьПараметр("ДатаКонЗавершения",ДатаКонЗавершения);
   запрос.УстановитьПараметр("Заявитель",Заявитель);
   запрос.УстановитьПараметр("Исполнитель",Исполнитель);
   запрос.УстановитьПараметр("Участок",Участок);
   запрос.УстановитьПараметр("Утверждено",Утверждено);
   запрос.УстановитьПараметр("Линия",Линия);
   
   ОбластьЗаголовок  = Макет.ПолучитьОбласть("Заголовок");
   ОбластьШапка     = Макет.ПолучитьОбласть("ШапкаТаблицы");
   Обл              = Макет.ПолучитьОбласть("Обл");
   ОбластьНомер     = Макет.ПолучитьОбласть("Номер");
   ОбластьДетали      = Макет.ПолучитьОбласть("Детали");
   
   Результат = запрос.Выполнить();
   
   ТабДок.Очистить();
   ТабДок.НачатьАвтогруппировкуСтрок();
   
   ОбластьЗаголовок.Параметры.Текст = СоставитьЗаголовок();
   ТабДок.Вывести(ОбластьЗаголовок);
   ТабДок.Вывести(ОбластьШапка);
   ТабДок.Вывести(Обл);
   
   ВыборкаНомера = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
   Пока ВыборкаНомера.Следующий() Цикл
      ОбластьНомер.Параметры.Заполнить(ВыборкаНомера);
      ТабДок.Вывести(ОбластьНомер, ВыборкаНомера.Уровень());
      ВыборкаДетали = ВыборкаНомера.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
      Пока ВыборкаДетали.Следующий() Цикл
         ОбластьДетали.Параметры.Заполнить(ВыборкаДетали);
         Если ВыборкаДетали.СтатусВыполнения = 100 Тогда
            ОбластьДетали.Область(1,8,1,2).ЦветФона = WebЦвета.СероСиний;
         Иначе
            ОбластьДетали.Область(1,8,1,2).ЦветФона = WebЦвета.Белый;
         КонецЕсли;
         ТабДок.Вывести(ОбластьДетали, ВыборкаДетали.Уровень());
      КонецЦикла;
   КонецЦикла;
   
   ТабДок.Показать();
   ТабДок.ЗакончитьАвтогруппировкуСтрок();
     
КонецПроцедуры





На форуме инфорстарта нашел похожую тему [size=78%]http://forum.infostart.ru/forum26/topic98695/[/size]


вот что у меня из этого получилось. Рис 2




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


Процедура ПолеВидаСравненияУчастокПриИзменении(Элемент)
   ПриИзмененииПоляВидаСравнения(ЭтаФорма,Элемент,"Участок");
КонецПроцедуры


Процедура ПриИзмененииПоляВидаСравнения(Форма,Элемент,Поле)Экспорт
   Если Элемент.Значение = ВидСравнения.ВСписке
      ИЛИ Элемент.Значение = ВидСравнения.НеВСписке
      Тогда
      Значение = Неопределено;
      Если Форма.ЭлементыФормы[Поле].ТипЗначения <> Новый ОписаниеТипов("СписокЗначений")Тогда
         Значение = Форма.ЭлементыФормы[Поле].Значение;
         Форма.ЭлементыФормы[Поле].ТипЗначения = Новый ОписаниеТипов("СписокЗначений");
         Форма.ЭлементыФормы[Поле].ТипЗначенияСписка = Новый ОписаниеТипов("СправочникСсылка."+Поле);
      КонецЕсли;
     
      Если ЗначениеЗаполнено(Значение) Тогда
         Форма.ЭлементыФормы[Поле].Значение.Добавить(Значение);
      КонецЕсли;
     
   ИначеЕсли Элемент.Значение = ВидСравнения.Равно
      Тогда
      Значение = Неопределено;
      Если Форма.ЭлементыФормы[Поле].ТипЗначения = Новый ОписаниеТипов("СписокЗначений")Тогда
         Если Форма.ЭлементыФормы[Поле].Значение.Количество()>0 Тогда
            Значение = Форма.ЭлементыФормы[Поле].Значение[0].Значение;
         КонецЕсли;   
         Форма.ЭлементыФормы[Поле].ТипЗначения = Новый ОписаниеТипов("СправочникСсылка."+Поле);
      КонецЕсли;
     
      Если ЗначениеЗаполнено(Значение) Тогда
         Форма.ЭлементыФормы[Поле].Значение = Значение;
      КонецЕсли;
     
   КонецЕсли;
КонецПроцедуры


Функция ПолучитьУсловиеЗапроса(Форма, Поле) Экспорт
   ФрагментУсловия = "";
   Если Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.Равно Тогда
      ФрагментУсловия = "=";
   ИначеЕсли Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.ВСписке Тогда
      ФрагментУсловия = "В";
   КонецЕсли;
   
   Возврат ФрагментУсловия;
КонецФункции



 
В итоге нужно добавить условие в перед формированием запроса....  и тут я в тупик зашел как и что сделать. я так понял нужно функцию задействовать в параметрах запроса.









Yura063

Не увидел где вы вызываете функцию! И Сравнение "В" параметр в скобках!
а вы меняете равно на в не ставя скобки. Нет измененного запроса!
Помогли, отблагодари!

ls600

в том то и дело я затрудняюсь изменить запрос что б он работал.
без функциии изменил получается так


//в запросе
| "+?(ЗначениеЗаполнено(ЭлементыФормы.Участок.Значение) ,"И Совещание.Участок = &Участок","")+"

....

запрос.УстановитьПараметр("Участок",ЭлементыФормы.Участок.Значение);
...


так работает когда равно. когда добавляешь в список то я понимаю что будет ошибка

{Форма.ФормаОтчета.Форма(99)}: Ошибка при вызове метода контекста (Выполнить)
   Результат = запрос.Выполнить();
по причине:
{(31, 22)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов.
И Совещание.Участок <<?>>= &Участок


Yura063

Цитата: ls600 от 05 ноя 2014, 08:40Функция ПолучитьУсловиеЗапроса(Форма, Поле) Экспорт    ФрагментУсловия = "";    Если Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.Равно Тогда       ФрагментУсловия = "=";    ИначеЕсли Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.ВСписке Тогда       ФрагментУсловия = "В";    КонецЕсли;        Возврат ФрагментУсловия; КонецФункции

Скорее всего вам надо прописывать полностью строку условия для запроса, притом в условии у вас нет ФрагментаУсловия "НЕ В".
Помогли, отблагодари!

ls600

в функции будет тогда вот так
Функция ПолучитьУсловиеЗапроса(Форма, Поле) Экспорт
ФрагментУсловия = "";
Если Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.Равно Тогда
ФрагментУсловия = "=";
ИначеЕсли Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.НеРавно Тогда
        ФрагментУсловия = "<>";
    ИначеЕсли Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.ВСписке Тогда
        ФрагментУсловия = "В";
    ИначеЕсли Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.НеВСписке Тогда
        ФрагментУсловия = "НЕ В";
КонецЕсли;

Возврат ФрагментУсловия;
КонецФункции

если не затруднит как в запросе будет выглядит условие??? :dfbsdfbsdf:

Yura063

Запрос менять придется иначе не как!!!
Цитата: ls600 от 05 ноя 2014, 10:18| "+?(ЗначениеЗаполнено(ЭлементыФормы.Участок.Значение) ,"И Совещание.Участок = &Участок","")+"

Надо что-то типа:
| "+?(ЗначениеЗаполнено(ЭлементыФормы.Участок.Значение) ,СтрокаУсловия,"")+"
А в функции:
Функция ПолучитьУсловиеЗапроса(Форма, Поле) Экспорт
   СтрокаУсловия = "";
   Если Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.Равно Тогда
      СтрокаУсловия = "И Совещание.Участок = &Участок";
   ИначеЕсли Форма.ЭлементыФормы["ПолеВидаСравнения"+Поле].Значение = ВидСравнения.ВСписке Тогда
      СтрокаУсловия = "И Совещание.Участок В (&Участок);
   КонецЕсли;
   
   Возврат СтрокаУсловия;
КонецФункции
Помогли, отблагодари!

ls600

Цитата: Yura063 от 05 ноя 2014, 10:31| "+?(ЗначениеЗаполнено(ЭлементыФормы.Участок.Значение) ,СтрокаУсловия,"")+"

вот так работает
|+?(ЗначениеЗаполнено(ЭлементыФормы.Участок.Значение) ,ПолучитьУсловиеЗапроса(ЭтаФорма,"Участок"),"")+"

Yura063 благодарю!!!!! Все Работает.!!!
:zebzdr:

Теги:

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

Рейтинг@Mail.ru

Поиск