Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Не работает  прямой запрос (число прочтений - 2588 )
Vic
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 11
Зарегистрирован: 18. Мая 2007
Не работает  прямой запрос
18. Мая 2007 :: 10:46
Печать  
Доброе время суток.
База ДБФ.
С помощью прямого запроса хочу получить таблицу вида
НоменклатураГруппа|Номенклатура|Склад  
Составляю запрос

ТекстЗапроса="
|SELECT                        
|      Номен.ID as [Номенклатура $Справочник.Номенклатура],                  
|      СпрСклады.ID as [Склад $Справочник.Склады],
|      НоменГруппа.ID as [НоменклатураГруппа $Справочник.Номенклатура]            
|FROM                        
|      $Справочник.Номенклатура as Номен,
|      , $Справочник.Склады as СпрСклады
|LEFT JOIN $Справочник.Номенклатура as НоменГруппа
|            ON Номен.PARENTID=НоменГруппа.ID            
|";                        

выдается ошибка
FAILED! ICommandText::Execute(): SQL: Column '     ' is not found.

Подскажите плиз, в чем может быть проблема.
  
Наверх
 
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Не работает  прямой запрос
Ответ #1 - 18. Мая 2007 :: 10:56
Печать  
Каким образом соотносятся Номенклатура/Группа и Склад? Тут нужно изменить текст запроса в 2 пуктах:

1.Писать
|SELECT                        
|      Номен.ID as [Номенклатура $Справочник.Номенклатура],                  
|      НоменГруппа.PARENTID as [НоменклатураГруппа $Справочник.Номенклатура]

т.к. PARENTID - это и есть группа

2.Сделать join к таблице $Справочник.Склады, но для join'а нужно условие, по которому будет производиться соединение
  
Наверх
 
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Не работает  прямой запрос
Ответ #2 - 18. Мая 2007 :: 10:57
Печать  
http://metaprog.co.ua/secrprog/const_spr.html здесь описание подсистемы справочников и констант, рекомендую почитать
  
Наверх
 
IP записан
 
Vic
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 11
Зарегистрирован: 18. Мая 2007
Re: Не работает  прямой запрос
Ответ #3 - 18. Мая 2007 :: 11:45
Печать  
по поводу PARENTID взято отсюда
http://www.1cpp.ru/forum/YaBB.pl?num=1175165797/25#25

такой запрос работает нормально
|SELECT                        
|      Номен.ID as [Номенклатура $Справочник.Номенклатура],                  
|      НоменГруппа.ID as [НоменклатураГруппа $Справочник.Номенклатура]            
|FROM                        
|      $Справочник.Номенклатура as Номен
|LEFT JOIN $Справочник.Номенклатура  as НоменГруппа
|            ON Номен.PARENTID=НоменГруппа.ID            
|WHERE
|      (Номен.ISFOLDER = 2) AND
| (Номен.ID IN (SELECT val FROM :ВремТаблНоменклатура))      
|";   

если возвращаться к изначальному запросу, то вроде по логике должно работать:
выгребаем все сочетания номенклатура, склад и к ним джойним по условию только ближайшего родителя

P.S. хотя, мне кажется,  как раз в логике здесь и есть прореха  Печаль
  
Наверх
 
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Не работает  прямой запрос
Ответ #4 - 18. Мая 2007 :: 12:41
Печать  
Vic писал(а) 18. Мая 2007 :: 11:45:
если возвращаться к изначальному запросу, то вроде по логике должно работать:
выгребаем все сочетания номенклатура, склад и к ним джойним по условию только ближайшего родителя


Не понятно, как ты собрался джойнить склады к номенклатуре? Что должно быть в результате? Номенклатура-Группа-Остаток? Или нет? По какому принципу выводить склад рядом с конкретным товаром/группой? Вот на какие вопросы надо придумать ответы
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Не работает  прямой запрос
Ответ #5 - 18. Мая 2007 :: 13:36
Печать  
pavel_tr писал(а) 18. Мая 2007 :: 12:41:
Vic писал(а) 18. Мая 2007 :: 11:45:
если возвращаться к изначальному запросу, то вроде по логике должно работать:
выгребаем все сочетания номенклатура, склад и к ним джойним по условию только ближайшего родителя


Не понятно, как ты собрался джойнить склады к номенклатуре? Что должно быть в результате? Номенклатура-Группа-Остаток? Или нет? По какому принципу выводить склад рядом с конкретным товаром/группой? Вот на какие вопросы надо придумать ответы


В результате - декартово произведение. Не умно , но допустимо.

Ошибки :
1. запятая лишняя в секции From
2. в ДБФ декартово не проходит.
  
Наверх
 
IP записан
 
Vic
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 11
Зарегистрирован: 18. Мая 2007
Re: Не работает  прямой запрос
Ответ #6 - 18. Мая 2007 :: 15:06
Печать  
Решил проблему. Оказалось что если брать запрос целиком, то такая(частная) постановка задачи отпадает Улыбка
цель была - вывести ближайшего родителя элемента и реквизиты склада в запросе по остаткам, чтобы потом не обращаться к базе, а работать только с таблицей. 

А далее использовать класс КроссТаблица и быстрый вывод в mxl

вот написал, может пригодится кому

SELECT
       НоменГруппа.DESCR as НоменклатураГруппаНаименование
       ,Номен.ID as [Номенклатура $Справочник.Номенклатура]
       ,Номен.CODE as НоменклатураКод
       ,Номен.DESCR as НоменклатураНаименование
       ,ИтогиИзРегистра.Склад as [Склад $Справочник.Склады]
       ,СпрСклад.DESCR as СкладНаименование
       ,СпрСклад.CODE as СкладКод
       ,$СпрСклад.ИндексСортировки as [ИндексСортировки $Число]
       ,SUM(CAST(ИтогиИзРегистра.КонечныйОстаток as NUMERIC(10,2))) as КО      
FROM
     $Справочник.Номенклатура as Номен
LEFT JOIN $Справочник.Номенклатура as НоменГруппа  
           ON Номен.PARENTID=НоменГруппа.ID

LEFT JOIN (
     SELECT
           Temp.Номенклатура as Номенклатура --[Номенклатура2 $Справочник.Номенклатура]
              ,Temp.Склад as Склад --ы[Склад $Справочник.Склады]
              ,SUM(CAST(Temp.КонечныйОстаток as NUMERIC(10,2))) as КонечныйОстаток      

     FROM (

           SELECT
                 $PrevPeriod.Номенклатура as Номенклатура
                    ,$PrevPeriod.Склад as Склад
                    ,$PrevPeriod.Количество as КонечныйОстаток

           FROM
                 $РегистрИтоги.ОстаткиТМЦ as PrevPeriod
                 WHERE
                 (PrevPeriod.PERIOD = :ЗапросПредыдущийПериод~~)
                 AND ($PrevPeriod.Номенклатура IN (SELECT VAL FROM :ВремТаблНоменклатура))

           UNION ALL

           SELECT
                 $CurrentPeriod.Номенклатура as Номенклатура
                   ,$CurrentPeriod.Склад as Склад      
                   ,$CurrentPeriod.Количество * (1 - CurrentPeriod.DEBKRED * 2) as КонечныйОстаток
                      FROM
                 $Регистр.ОстаткиТМЦ as CurrentPeriod
                     INNER JOIN 1SJOURN as Журн ON CurrentPeriod.IDDOC = Журн.IDDOC
                     WHERE
                 (Журн.DATE >= :ЗапросТекПериод~~)
                 AND (Журн.DATE < :ЗапросКонДата~~)
                 AND (Журн.$ФлагРегистра.ОстаткиТМЦ = 1)
                 AND ($CurrentPeriod.Номенклатура IN (SELECT VAL FROM :ВремТаблНоменклатура))
                   )as Temp

     GROUP BY
             Temp.Номенклатура
               ,Temp.Склад

     )as ИтогиИзРегистра
           ON ИтогиИзРегистра.Номенклатура = Номен.ID

INNER JOIN $Справочник.Склады as СпрСклад  
           ON ИтогиИзРегистра.Склад=СпрСклад.ID

WHERE
     (Номен.ISFOLDER = 2)
     AND (Номен.ID IN (SELECT val FROM :ВремТаблНоменклатура))      

GROUP BY
     НоменГруппа.DESCR
     ,Номен.ID
     ,Номен.DESCR
     ,Номен.CODE
       ,ИтогиИзРегистра.Склад
        ,СпрСклад.DESCR
       ,СпрСклад.CODE
      ,$СпрСклад.ИндексСортировки


Вроде все заработало.

Спасибо за сотрудничество Улыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать