Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Подскажите, что делаю не так! Хочу выбирать и группы и эллементы (число прочтений - 2367 )
Vix
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 25. Марта 2011
Подскажите, что делаю не так! Хочу выбирать и группы и эллементы
15. Апреля 2011 :: 05:07
Печать  
[code]Запрос = СоздатьОбъект("ЗапросSQL");
   Запрос.ДобавитьУсловие("Спр", "DESCR", "",ВыбВладелец.Наименование, "");
   Запрос.Текст = "
              |SELECT
           |   Спр.DESCR As Изделие,                         --//Справочник.Номенклатура.Наименование
           |   Комплектация.DESCR As Комплектующее           --//Справочник.Комплектация.Наименование
           |        ,Count($Комплектация.Количество) Количество
           |   ,GROUPING(Комплектация.DESCR) as ГруппаКомплектующие         --//группируем по Изделиям
           |FROM                                             --//из
           |    $Справочник.Номенклатура  As  Спр (NOLOCK)   --//справочника Номенклатура
           |LEFT OUTER JOIN $Справочник.Комплектация As Комплектация (NOLOCK) ON Спр.ID = Комплектация.PARENTEXT  --//привязка владельца из комплектации с кодом справочника Номенклатура
           |           AND Комплектация.ISMARK = 0                                                                --//Комплектация не помеченная на удаление
           |WHERE {Условие}                                  --//фильтр
             |GROUP BY Спр.DESCR,
             |         Комплектация.DESCR WITH ROLLUP                         
             |HAVING (Спр.DESCR) IS NOT NULL                   --//Номенклатура не пустое значение
             |ORDER BY Спр.DESCR, ГруппаКомплектующие DESC
             |";  
           Если ПустоеЗначение(ВыбВладелец) = 1 Тогда
                 стр       =      "Спр.ISFOLDER = 2 AND (Комплектация.DESCR) IS NOT NULL" ;  //только эллемены
           Иначе
                 стр       =      "Спр.ISFOLDER = 2 AND (Комплектация.DESCR) IS NOT NULL AND %DESCR " ; //только эллементы и фильтр по Комплектация.Наименование
           КонецЕсли;
           Запрос.Текст =      СтрЗаменить(Запрос.Текст, "{Условие}", стр) ;
     //      рс.УстановитьТекстовыйПараметр("ВыбВладелец", ВыбВладелец.Наименование);      
     //      рс.Отладка(1);
                     тз = Запрос.Выполнить(); [/code]

хочется выбирать как без фильтра, так и с фильтром по эллементам или группам
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Подскажите, что делаю не так! Хочу выбирать и группы и эллементы
Ответ #1 - 15. Апреля 2011 :: 05:17
Печать  
Условие на справочник комплектация втыкай не в ветку where (так ты из left join делаешь автоматом inner join) , а в место присоединения справочников в ветку on
  
Наверх
 
IP записан
 
Vix
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 25. Марта 2011
Re: Подскажите, что делаю не так! Хочу выбирать и группы и эллементы
Ответ #2 - 15. Апреля 2011 :: 06:36
Печать  
[code]|LEFT OUTER JOIN $Справочник.Комплектация As Комплектация (NOLOCK) ON Спр.ID = Комплектация.PARENTEXT  --//привязка владельца из комплектации с кодом справочника Номенклатура
              |           AND Комплектация.ISMARK = 0                                                                --//Комплектация не помеченная на удаление
                  |           AND (Комплектация.DESCR) IS NOT NULL
                  |           AND %DESCR
                  |WHERE {Условие}                                  --//фильтр
                  |GROUP BY Спр.DESCR,
                  |         Комплектация.DESCR WITH ROLLUP
                  |HAVING (Спр.DESCR) IS NOT NULL                   --//Номенклатура не пустое значение
                  |ORDER BY Спр.DESCR, ГруппаКомплектующие DESC
                  |"; 
           Если ПустоеЗначение(ВыбВладелец) = 1 Тогда
                 стр       =      "Спр.ISFOLDER = 2 AND (Комплектация.DESCR) IS NOT NULL" ;  //только эллемены
           Иначе
                 стр       =      "Спр.ISFOLDER = 2" ; //только эллементы и фильтр по Комплектация.Наименование
           КонецЕсли; [/code]
сделал так, получилось что если фильтра нет все выводится нормально, если фильтр группа или просто какойто эллемен выводятся все эллементы справочника комплектация. Если указать ISFOLDER = 1 то выводятся только группы
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Подскажите, что делаю не так! Хочу выбирать и группы и эллементы
Ответ #3 - 15. Апреля 2011 :: 06:46
Печать  
Еще раз прочитай, куды втыкать условие.
  
Наверх
 
IP записан
 
Vix
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 25. Марта 2011
Re: Подскажите, что делаю не так! Хочу выбирать и группы и эллементы
Ответ #4 - 15. Апреля 2011 :: 09:49
Печать  
[code]
|LEFT OUTER JOIN $Справочник.Комплектация As Комплектация (NOLOCK) ON Спр.ID = Комплектация.PARENTEXT  --//привязка владельца из комплектации с кодом справочника Номенклатура
|           AND Комплектация.ISMARK = 0                                                                --//Комплектация не помеченная на удаление
|           AND {Условие}      

                                   
Если ПустоеЗначение(ВыбВладелец) = 1 Тогда
               стр       =      "Спр.ISFOLDER = 2 AND (Комплектация.DESCR) IS NOT NULL" ;  //только эллемены
Иначе
     стр       =      "Спр.ISFOLDER = 2 AND (Комплектация.DESCR) IS NOT NULL AND %DESCR " ; //только эллементы и фильтр по Комплектация.Наименование
КонецЕсли;
Запрос.Текст =      СтрЗаменить(Запрос.Текст, "{Условие}", стр) ;      
[/code]
вот условие в ветке ON, что не так? Выводятся вообще все позиции без учета, что выбрано в списке ВыбВладелец
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Подскажите, что делаю не так! Хочу выбирать и группы и эллементы
Ответ #5 - 15. Апреля 2011 :: 09:58
Печать  
[quote author=Vix link=1302844028/0#4 date=1302860944]
вот условие в ветке ON, что не так? Выводятся вообще все позиции без учета, что выбрано в списке ВыбВладелец[/quote]

1. А что такое 'AND %DESCR'?
2. Комплектация.DESCR У тебя может быть NULL? Каким образом?
  
Наверх
ICQ  
IP записан
 
Vix
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 25. Марта 2011
Re: Подскажите, что делаю не так! Хочу выбирать и группы и эллементы
Ответ #6 - 15. Апреля 2011 :: 10:14
Печать  
вот весь фрагмент без вывода на печать
[code]

Запрос = СоздатьОбъект("ЗапросSQL");
Запрос.ДобавитьУсловие("Спр", "DESCR", "", ВыбВладелец.Наименование, "");
Запрос.Текст = "
     |SELECT
               |   Спр.DESCR As Изделие,                         --//Справочник.Номенклатура.Наименование
     |   Комплектация.DESCR As Комплектующее           --//Справочник.Комплектация.Наименование
     |   ,Count($Комплектация.Количество) Количество
     |   ,GROUPING(Комплектация.DESCR) as ГруппаКомплектующие         --//группируем по Изделиям
     |FROM                                             --//из
     |    $Справочник.Номенклатура  As  Спр (NOLOCK)
     |LEFT OUTER JOIN $Справочник.Комплектация As Комплектация (NOLOCK) ON Спр.ID = Комплектация.PARENTEXT  --//привязка владельца из комплектации с кодом справочника Номенклатура
     |           AND Комплектация.ISMARK = 0                                                                --//Комплектация не помеченная на удаление
     |           AND {Условие}
     |GROUP BY Спр.DESCR,
     |         Комплектация.DESCR WITH ROLLUP
     |HAVING (Спр.DESCR) IS NOT NULL                   --//Номенклатура не пустое значение
     |ORDER BY Спр.DESCR, ГруппаКомплектующие DESC
     |";  
Если ПустоеЗначение(ВыбВладелец) = 1 Тогда
     стр       =      "Спр.ISFOLDER = 2 AND (Комплектация.DESCR) IS NOT NULL" ;  //только эллемены
Иначе
     стр       =      "Спр.ISFOLDER = 2 AND (Комплектация.DESCR) IS NOT NULL AND %DESCR " ; //только эллементы и фильтр по Комплектация.Наименование
КонецЕсли;
Запрос.Текст =      СтрЗаменить(Запрос.Текст, "{Условие}", стр) ;
//      рс.УстановитьТекстовыйПараметр("ВыбВладелец", ВыбВладелец.Наименование);      
тз = Запрос.Выполнить();
[/code]
%DESCR  это переменная (класс ЗапросSQL)
ВыбВладелец это элемент диалога с типом Справочник.Номенклатура
а (Комплектация.DESCR) IS NOT NULL  может быть нулевым, например у номенклатуры подчиненный справочник комплектация, номенклатура будет выводится и та у которой комплектующих нет, мне этого не нада, вот и поставил условие. Мне нужна номенклатура только где есть комплекты
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Подскажите, что делаю не так! Хочу выбирать и группы и эллементы
Ответ #7 - 15. Апреля 2011 :: 11:01
Печать  
Еще раз..
Условие на справочник Номенклатура   делай в ветке where, на справочник Комплектухи - в условии присоединения справочников.
  
Наверх
 
IP записан
 
Vix
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 25. Марта 2011
Re: Подскажите, что делаю не так! Хочу выбирать и группы и эллементы
Ответ #8 - 15. Апреля 2011 :: 11:24
Печать  
я уже по разному делал, то выдает все как без фильтра, то при выборе эллемента выдает комплекты этого эллемента, если ничего не выбираеш выводит все изделия с пакетами, но если выбираеш группу то ничего не происходит.
  
Наверх
 
IP записан
 
Vix
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 25. Марта 2011
Re: Подскажите, что делаю не так! Хочу выбирать и группы и эллементы
Ответ #9 - 15. Апреля 2011 :: 11:33
Печать  
Вот последний вариант когда при выборе ВыбКомплект пустое значение высыпает все как и должно быть, при выборе элемента выводит элемент и все подчиненные комплекты, а при выборе группы ничего не выводит
[code]
Запрос = СоздатьОбъект("ЗапросSQL");
           Запрос.ДобавитьУсловие("Спр", "DESCR", "", ВыбВладелец.Наименование, "");
           Запрос.Текст = "
                |SELECT
              |   Спр.DESCR As Изделие,                        
              |   Комплектация.DESCR As Комплектующее          
                  |   ,Count($Комплектация.Количество) Количество 
     //             |   ,Спр.ISFOLDER As ЭтоГруппа
                  |   ,GROUPING(Комплектация.DESCR) as ГруппаКомплектующие       
              |FROM                                                          
              |    $Справочник.Номенклатура  As  Спр (NOLOCK)
              |LEFT JOIN $Справочник.Комплектация As Комплектация (NOLOCK) ON Спр.ID = Комплектация.PARENTEXT 
              |           AND Комплектация.ISMARK = 0                                                               
                  |           AND %DESCR
                  |WHERE {Условие}                                 
                  |GROUP BY Спр.DESCR,
                  |         Комплектация.DESCR WITH ROLLUP
                  |HAVING (Спр.DESCR) IS NOT NULL AND Count($Комплектация.Количество) <> 0          
                  |ORDER BY Спр.DESCR, ГруппаКомплектующие DESC
                  |"; 
           Если ПустоеЗначение(ВыбВладелец) = 1 Тогда
                 стр       =      "Спр.ISFOLDER = 2" ;
           Иначе
                 стр       =      "Спр.ISFOLDER = 2" ;
           КонецЕсли;
           Запрос.Текст =      СтрЗаменить(Запрос.Текст, "{Условие}", стр) ;
         тз = Запрос.Выполнить();
           тз.ВыбратьСтроку(); 
[/code]
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Подскажите, что делаю не так! Хочу выбирать и группы и эллементы
Ответ #10 - 15. Апреля 2011 :: 11:35
Печать  
Покажи, что выводит
Запрос.Отладка(1);
  
Наверх
 
IP записан
 
Vix
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 24
Зарегистрирован: 25. Марта 2011
Re: Подскажите, что делаю не так! Хочу выбирать и группы и эллементы
Ответ #11 - 15. Апреля 2011 :: 11:39
Печать  
Прошу меня извенить, нашел косяк. Привожу рабочий вариант
[code]
       Запрос = СоздатьОбъект("ЗапросSQL");
           Запрос.ДобавитьУсловие("Комплектация", "PARENTEXT", "", ВыбВладелец, "");
           Запрос.Текст = "
                |SELECT
              |   Спр.DESCR As Изделие,                        
              |   Комплектация.DESCR As Комплектующее          
                  |   ,Count($Комплектация.Количество) Количество  
     //             |   ,Спр.ISFOLDER As ЭтоГруппа
                  |   ,GROUPING(Комплектация.DESCR) as ГруппаКомплектующие        
              |FROM                                                          
              |    $Справочник.Номенклатура  As  Спр (NOLOCK)
              |LEFT JOIN $Справочник.Комплектация As Комплектация (NOLOCK) ON Спр.ID = Комплектация.PARENTEXT  
              |           AND Комплектация.ISMARK = 0                                                              
                  |           AND %PARENTEXT
                  |WHERE {Условие}                                
                  |GROUP BY Спр.DESCR,
                  |         Комплектация.DESCR WITH ROLLUP
                  |HAVING (Спр.DESCR) IS NOT NULL AND Count($Комплектация.Количество) <> 0          
                  |ORDER BY Спр.DESCR, ГруппаКомплектующие DESC
                  |";  
           Если ПустоеЗначение(ВыбВладелец) = 1 Тогда
                 стр       =      "Спр.ISFOLDER = 2" ;
           Иначе
                 стр       =      "Спр.ISFOLDER = 2" ;
           КонецЕсли;
           Запрос.Текст =      СтрЗаменить(Запрос.Текст, "{Условие}", стр) ;
         тз = Запрос.Выполнить();
         тз.ВыбратьСтроку();  
[/code]

тут ошибка Запрос.ДобавитьУсловие("Комплектация", "PARENTEXT", "", ВыбВладелец, "");
и тут AND %PARENTEXT
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать