Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Ошибка в запросе (JOIN многих таблиц) (число прочтений - 3654 )
Onegsky
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 15. Апреля 2009
Ошибка в запросе (JOIN многих таблиц)
15. Апреля 2009 :: 10:04
Печать  
Здравствуйте, Люди!

Делаю запрос:
     ТекстЗапроса = " SELECT
     | Жур.IDDoc                        as [Док $Документ.Квитанция],
     | Жур.IDDocDef                        as Док_вид,
     | RTRIM(LTRIM(Жур.DocNo))      as НомДок,
     |  "+ ДатаПоФормату +"            as ДатаДок,      
     |  $Док.Клиент                        as [ПлательщикОрг, $Справочник.Контрагенты],
     |  $Док.ОтпрОрг                  as [ОтпрОрг, $Справочник.Контрагенты],
     |  $Док.ОтпрГород                  as ОтпрГород,
     | RTRIM(СпрГ_Отпр.Descr)      as ОтпрГородНаим,
     |  $Док.ПолОрг                        as [ПолОрг, $Справочник.Контрагенты],
     |  $Док.ПолГород                  as ПолГород,
     | RTRIM(СпрГ_Пол.Descr)            as ПолГородНаим,
     |  $СпрГ_Отпр.Организация      as ФирмаОтпр,
     |  $СпрГ_Пол.Организация      as ФирмаПол,
     |  $Док.ВесИндекс                  as ВесИндекс,
     |  $Док.СуммаМежгород            as СуммаМежгород,
     |  $Док.Доставка1                  as ДоставкаПол,
     |  $Док.Доставка                  as ДоставкаОтпр,
     |  $Док.Упаковка                  as Упаковка,
     | ($Док.СуммаМежгород + $Док.Доставка1 + $Док.Доставка + $Док.Упаковка) as Итог,
     | СпрМенеджерыОтпр.ID            as  [МенеджерОтпр $Справочник.Менеджеры],
     | СпрМенеджерыПол.ID            as  [МенеджерПол $Справочник.Менеджеры],
     | СпрМенеджерыПлат.ID            as  [МенеджерПлат $Справочник.Менеджеры],
     | СпрДоговорыОтпр.Code            as НомДоговораОтпр,
     | $СпрДоговорыОтпр.Дата1      as ДатаДоговораОтпр,
     | СпрДоговорыПол.Code            as НомДоговораПол,
     | $СпрДоговорыПол.Дата1            as ДатаДоговораПол,
     | СпрДоговорыПлат.Code            as НомДоговораПлат,
     | $СпрДоговорыПлат.Дата1      as ДатаДоговораПлат
     |
     |FROM
     |  _1SJourn as Жур
     |INNER JOIN
     |  $Документ.Квитанция            as Док ON Док.IDDoc = Жур.IDDoc
     |INNER JOIN
     |  $Справочник.Контрагенты      as СпрК_Отпр ON СпрК_Отпр.ID  = $Док.ОтпрОрг
     |INNER JOIN
     |  $Справочник.Города            as СпрГ_Отпр ON СпрГ_Отпр.ID = $Док.ОтпрГород
     |INNER JOIN
     |  $Справочник.Контрагенты      as СпрК_Пол ON СпрК_Пол.ID  = $Док.ПолОрг
     |INNER JOIN
     |  $Справочник.Города            as СпрГ_Пол ON СпрГ_Пол.ID = $Док.ПолГород
     |INNER JOIN
     |  $Справочник.Контрагенты      as СпрК_Плат ON СпрК_Плат.ID  = $Док.Клиент
     |INNER JOIN
     |  $Справочник.Фирмы            as СпрФОтпр ON СпрФОтпр.ID = $СпрГ_Отпр.Организация
     |INNER JOIN
     |  $Справочник.Фирмы            as СпрФПол ON СпрФПол.ID = $СпрГ_Пол.Организация
     |RIGHT OUTER JOIN
     |  $Справочник.Договоры            as СпрДоговорыОтпр ON  СпрДоговорыОтпр.ParentExt = СпрК_Отпр.ID
     |RIGHT OUTER JOIN
     |  $Справочник.Договоры      as СпрДоговорыПол ON  СпрДоговорыПол.ParentExt = СпрК_Пол.ID
     |RIGHT OUTER JOIN
     |  $Справочник.Договоры      as СпрДоговорыПлат ON  СпрДоговорыПлат.ParentExt = СпрК_Плат.ID
     |RIGHT OUTER JOIN
     |  $Справочник.Менеджеры      as СпрМенеджерыОтпр ON  СпрМенеджерыОтпр.ID = $СпрК_Отпр.Менеджер
     |RIGHT OUTER JOIN
     |  $Справочник.Менеджеры      as СпрМенеджерыПол ON  СпрМенеджерыПол.ID = $СпрК_Пол.Менеджер
     |RIGHT OUTER JOIN
     |  $Справочник.Менеджеры      as СпрМенеджерыПлат ON  СпрМенеджерыПлат.ID = $СпрК_Плат.Менеджер
     |INNER JOIN
     |  _1SCRDOC Отбор ON Отбор.ChildID = Жур.IDDoc      AND
     |                   Отбор.MDID = 0                  AND
     |                   RIGHT(Отбор.ParentVal, 9) = Док.IDDoc
     |
     |WHERE
     |  Жур.Date_Time_IDDoc BETWEEN "+ Д1 +" AND "+ Д2 +" AND
     //|  Жур.Date_Time_IDDoc BETWEEN :"+ Д1 +" AND :"+ Д2 +"~ AND
     |  Жур.IDDocDef = $ВидДокумента.Квитанция AND
     |  Жур.Closed & 1 = 1"; // только проведенные документы

В ответ получаю в лоб:
глODBCRecodSet.ВыполнитьИнструкцию(ТекстЗапроса).Выгрузить(тзРезЗапроса);
{\\SERVER\SG2_BMT_TEST\EXTFORMS\ОТЧЕТЫ\ПРОДАЖИ.ERT(177)}: Meta name parser error: неизвестное метаимя или алиас "$Док"

Ошибка появляется после того, как я добавляю в запрос СпрДоговорыОтпр, СпрДоговорыПол и СпрДоговорыПлат.
Подскажите, пожалуйста, где я ошибся.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Ошибка в запросе (JOIN многих таблиц)
Ответ #1 - 15. Апреля 2009 :: 10:22
Печать  
Может вместо RIGHT OUTER JOIN
надо использовать LEFT JOIN.
  
Наверх
 
IP записан
 
Onegsky
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 15. Апреля 2009
Re: Ошибка в запросе (JOIN многих таблиц)
Ответ #2 - 15. Апреля 2009 :: 10:39
Печать  
Если я использую
LEFT JOIN
$Справочник.Договоры      as СпрДоговорыПол ON  CпрДоговорыПол.ParentExt = СпрК_Пол.ID

то несовпавшие по условию записи правой таблицы (СпрК_Пол) будут отброшены в результирующем наборе.
А мне нужно оставить их.
Контрагентов больше чем договоров.
Не у каждого контрагента есть договор.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Ошибка в запросе (JOIN многих таблиц)
Ответ #3 - 15. Апреля 2009 :: 10:52
Печать  
Попробуй вместо
Код
Выбрать все
| Жур.IDDoc				as [Док $Документ.Квитанция],
     | Жур.IDDocDef				as Док_вид, 



Код
Выбрать все
| Жур.IDDoc				as [Док2 $Документ.Квитанция],
 


  
Наверх
 
IP записан
 
Onegsky
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 15. Апреля 2009
Re: Ошибка в запросе (JOIN многих таблиц)
Ответ #4 - 15. Апреля 2009 :: 11:12
Печать  
kiruha писал(а) 15. Апреля 2009 :: 10:52:
Попробуй вместо
Код
Выбрать все
| Жур.IDDoc				as [Док $Документ.Квитанция],
     | Жур.IDDocDef				as Док_вид, 



Код
Выбрать все
| Жур.IDDoc				as [Док2 $Документ.Квитанция],
 




Попробовал.
Все равно ругается:
глODBCRecodSet.ВыполнитьИнструкцию(ТекстЗапроса).Выгрузить(тзРезЗапроса);
{\\SERVER\SG2_BMT_TEST\EXTFORMS\ОТЧЕТЫ\ПРОДАЖИ.ERT(177)}: Meta name parser error: неизвестное метаимя или алиас "$Док"
  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: Ошибка в запросе (JOIN многих таблиц)
Ответ #5 - 15. Апреля 2009 :: 11:32
Печать  
Код
Выбрать все
|INNER JOIN
|  _1SCRDOC as Отбор ON Отбор.ChildID = Жур.IDDoc	AND
|			 Отбор.MDID = 0			AND
|			 SUBSTRING(Отбор.ParentVal,7, 9) = Док.IDDoc
 



Отбор.ParentVal это строка длинной 23
  
Наверх
 
IP записан
 
Onegsky
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 15. Апреля 2009
Re: Ошибка в запросе (JOIN многих таблиц)
Ответ #6 - 15. Апреля 2009 :: 11:51
Печать  
Поправил, но ошибка не исчезла.
Печаль
  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: Ошибка в запросе (JOIN многих таблиц)
Ответ #7 - 15. Апреля 2009 :: 11:53
Печать  
Код
Выбрать все
|  $Док.ОтпрОрг  as [ОтпрОрг, $Справочник.Контрагенты],
 



Запятую убери
  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: Ошибка в запросе (JOIN многих таблиц)
Ответ #8 - 15. Апреля 2009 :: 11:55
Печать  
Код
Выбрать все
     |  $Док.Клиент				as [ПлательщикОрг, $Справочник.Контрагенты],
     |  $Док.ОтпрОрг			as [ОтпрОрг, $Справочник.Контрагенты],
     |  $Док.ОтпрГород			as ОтпрГород,
     | RTRIM(СпрГ_Отпр.Descr)	as ОтпрГородНаим,
     |  $Док.ПолОрг				as [ПолОрг, $Справочник.Контрагенты],
 



И здесь тоже
  
Наверх
 
IP записан
 
Onegsky
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 15. Апреля 2009
Re: Ошибка в запросе (JOIN многих таблиц)
Ответ #9 - 15. Апреля 2009 :: 12:45
Печать  
Поправил. Ошибка осталась.  Печаль
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Ошибка в запросе (JOIN многих таблиц)
Ответ #10 - 15. Апреля 2009 :: 12:56
Печать  
Onegsky писал(а) 15. Апреля 2009 :: 12:45:
Поправил. Ошибка осталась.  Печаль


А ты приведи полный код запроса, который Отладка() выдает.
  
Наверх
 
IP записан
 
Onegsky
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 15. Апреля 2009
Re: Ошибка в запросе (JOIN многих таблиц)
Ответ #11 - 15. Апреля 2009 :: 13:01
Печать  
Отладка() ничего не выдает.
Ошибка возникает раньше.
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Ошибка в запросе (JOIN многих таблиц)
Ответ #12 - 15. Апреля 2009 :: 13:52
Печать  
Onegsky писал(а) 15. Апреля 2009 :: 13:01:
Отладка() ничего не выдает.
Ошибка возникает раньше.


Запрос.Отладка(1) попробуй! И то, что получилось - закинь в 1-ый пост.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Ошибка в запросе (JOIN многих таблиц)
Ответ #13 - 15. Апреля 2009 :: 13:55
Печать  
RIGHT OUTER JOIN

не катит - null нельзя складывать.
| ($Док.СуммаМежгород + $Док.Доставка1 + $Док.Доставка + $Док.Упаковка) as Итог,

и функции

| RTRIM(СпрГ_Отпр.Descr)      as ОтпрГородНаим,

...
попробуй для отладки  везде INNER

И вообще все закомментируй кроме одного INNER и шапку аналогично  - и по строчке раскомментирывай
пока ошибка не появится
  
Наверх
 
IP записан
 
Onegsky
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 15. Апреля 2009
Re: Ошибка в запросе (JOIN многих таблиц)
Ответ #14 - 15. Апреля 2009 :: 14:59
Печать  
Спасибо. Пойду пока домой. Завтра буду домучивать.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать