Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема объединение и $ПоследнееЗначение (число прочтений - 4265 )
PVL
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 20
Местоположение: г.Томск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
объединение и $ПоследнееЗначение
27. Сентября 2006 :: 10:19
Печать  
Почему-то не могу подружить между собой объединение(UNION ALL) и $ПоследнееЗначение.
Пораздельности все отрабатывает нормально, а вместе никак  Плачущий
$ПоследнееЗначение вычеслил методом исключения.

Код
Выбрать все
ТекстЗапроса="
|SELECT
|    ЖурЧек.IDDOCDEF as Док_вид,
|    ЖурЧек.IDDOC as [Док $Документ],
|    $Чек.Касса [Касса $Справочник.Кассы],
|    left(ЖурЧек.DATE_TIME_IDDOC,9) ДатаДок,
|    $ДокСтроки.Номенклатура AS [Товар $Справочник.Номенклатура],
|    $СпрНом1.Производитель AS [Поставщик $Справочник.Контрагенты],
|    $Чек.Продавец AS [Прод $Справочник.ФизЛица],
|    ТабЦенЧ.ЦенаЧ*$ДокСтроки.Количество [СебСто $Число],
|    $ДокСтроки.Количество [Колич $Число],
|    $ДокСтроки.Всего [Сумма $Число]
|FROM
|    _1sjourn ЖурЧек (nolock)
|    left join $ДокументСтроки.ЧекККМ ДокСтроки (nolock) on ДокСтроки.iddoc=ЖурЧек.iddoc
|    left join $Справочник.Номенклатура СпрНом1 (NOLOCK) ON
|											СпрНом1.id=$ДокСтроки.Номенклатура
|    left join $Документ.ЧекККМ Чек (nolock) on Чек.iddoc=ЖурЧек.iddoc
|    left join (SELECT
|			  СпрНомЧ.ID ТоварЧ,
|			$ПоследнееЗначение.Цены.Цена(ЦеныЧ.ID, :КонДата) ЦенаЧ
|		FROM
|			$Справочник.ТипыЦен СпрТипыЧ,$Справочник.Номенклатура СпрНомЧ
|	 		left join $Справочник.Цены ЦеныЧ on (ЦеныЧ.PARENTEXT=СпрНомЧ.ID
|						and $ЦеныЧ.ТипЦен='    1Y   ' or $ЦеныЧ.ТипЦен is NULL)
|		WHERE  СпрТипыЧ.ID='    1Y   '
|		) ТабЦенЧ on ТабЦенЧ.ТоварЧ=$ДокСтроки.Номенклатура
|WHERE
|    (ЖурЧек.closed & 1 = 1) and (ЖурЧек.IDDOCDEF=$ВидДокумента.ЧекККМ)
|    and (ЖурЧек.ISMARK = 0)
|    and (ЖурЧек.DATE_TIME_IDDOC between :НачДата and :КонДата~)
|    and ($ДокСтроки.Номенклатура IS NOT NULL)
|
|UNION ALL
|
|SELECT
|    ЖурВозв.iddocdef Док_вид,
|    ЖурВозв.iddoc [Док $Документ],
|    ТабЧек.Касса [Касса $Справочник.Кассы],
|    left(ЖурВозв.DATE_TIME_IDDOC,9) ДатаДок,
|    $ДокСтрокиВ.Номенклатура AS [Товар $Справочник.Номенклатура],
|    $СпрНом2.Производитель AS [Поставщик $Справочник.Контрагенты],
|    ТабЧек.Продавец as [Прод $Справочник.ФизЛица],
|    ТабЦенВ.ЦенаВ*(-$ДокСтрокиВ.Количество) [СебСто $Число],
|    -($ДокСтрокиВ.Количество) [Колич $Число],
|    -($ДокСтрокиВ.Всего) [Сумма $Число]
|FROM
|    _1sjourn ЖурВозв (nolock),
|    inner join $Документ.ВозвратОтПокупателя Возв (nolock) on Возв.iddoc=ЖурВозв.iddoc
|    left join $ДокументСтроки.ВозвратОтПокупателя ДокСтрокиВ (nolock) on
|														     ДокСтрокиВ.iddoc=ЖурВозв.iddoc
|    inner join (SELECT
|					j_p.iddocdef,
|			     	j_p.iddoc,
|	 			$Чек.Продавец Продавец,
|	 			$Чек.Касса Касса,
|	 			cr.childid
|	 		FROM _1sjourn j_p (nolock)
|	 			inner join $Документ.ЧекККМ Чек (nolock) on Чек.iddoc = j_p.iddoc
|				  inner join _1scrdoc cr (nolock) on mdid=0
|							and cr.ParentVal = 'O1' + $ВидДокумента36.ЧекККМ + j_p.iddoc
|	 			inner join _1sjourn j_c (nolock) on j_c.iddoc = cr.childid
|	 		WHERE (j_c.IDDOCDEF=$ВидДокумента.ВозвратОтПокупателя) and
|						(j_c.Closed & 1 = 1) "+УслКассаЧ+УслДокЧ+УслПродЧ+"
|		)ТабЧек on ТабЧек.CHILDID=Возв.iddoc
|    left join $Справочник.Номенклатура СпрНом2 (NOLOCK) ON
|							 СпрНом2.id=$ДокСтрокиВ.Номенклатура
|    left join (SELECT
|			СпрНомВ.ID ТоварВ,
|			$ПоследнееЗначение.Цены.Цена(ЦеныВ.ID, :КонДата) ЦенаВ
|	 	FROM
|			$Справочник.ТипыЦен СпрТипыВ,$Справочник.Номенклатура СпрНомВ
|			left join $Справочник.Цены ЦеныВ on (ЦеныВ.PARENTEXT=СпрНомВ.ID
|					and $ЦеныВ.ТипЦен='    1Y   ' or $ЦеныВ.ТипЦен is NULL)
|		WHERE  СпрТипыВ.ID='    1Y   '
|			)ТабЦенВ on ТабЦенВ.ТоварВ=$ДокСтрокиВ.Номенклатура
|WHERE
|    (ЖурВозв.closed & 1 = 1) and
|    (ЖурВозв.IDDOCDEF=$ВидДокумента.ВозвратОтПокупателя) and
|    (ЖурВозв.ISMARK = 0) and
|    (ЖурВозв.DATE_TIME_IDDOC between :НачДата and :КонДата~)
|ORDER by 1
|";
 



Выдает ошибку: "State 42000, native 104, message [Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select list if the statement contains a UNION operator."
Без $ПоследнееЗначение можно даже и без ORDER ..
Не могу понять причину ошибки..  Нерешительный
  
Наверх
 
IP записан
 
PVL
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 20
Местоположение: г.Томск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: объединение и $ПоследнееЗначение
Ответ #1 - 27. Сентября 2006 :: 10:34
Печать  
Для наглядности маленько упростил:
Код
Выбрать все
ТекстЗапроса="
|SELECT
|    ЖурЧек.IDDOCDEF as Док_вид,
|    ЖурЧек.IDDOC as [Док $Документ],
|    ТабЦенЧ.ЦенаЧ*$ДокСтроки.Количество [СебСто $Число]
|FROM
|    _1sjourn ЖурЧек (nolock)
|    left join $ДокументСтроки.ЧекККМ ДокСтроки (nolock) on ДокСтроки.iddoc=ЖурЧек.iddoc
|    left join (SELECT
|				   СпрНомЧ.ID ТоварЧ,
|		$ПоследнееЗначение.Цены.Цена(ЦеныЧ.ID, :КонДата) ЦенаЧ
|	FROM
|		$Справочник.ТипыЦен СпрТипыЧ,$Справочник.Номенклатура СпрНомЧ
|	 		left join $Справочник.Цены ЦеныЧ on (ЦеныЧ.PARENTEXT=СпрНомЧ.ID
|			and $ЦеныЧ.ТипЦен='    1Y   ' or $ЦеныЧ.ТипЦен is NULL)
|	WHERE  СпрТипыЧ.ID='    1Y   '
|	) ТабЦенЧ on ТабЦенЧ.ТоварЧ=$ДокСтроки.Номенклатура
|WHERE
|    (ЖурЧек.closed & 1 = 1) and (ЖурЧек.IDDOCDEF=$ВидДокумента.ЧекККМ)
|    and (ЖурЧек.ISMARK = 0)
|    and (ЖурЧек.DATE_TIME_IDDOC between :НачДата and :КонДата~)
|    and ($ДокСтроки.Номенклатура IS NOT NULL)
|
|UNION ALL
|
|SELECT
|    ЖурВозв.iddocdef Док_вид,
|    ЖурВозв.iddoc [Док $Документ],
|    ТабЦенВ.ЦенаВ*(-$ДокСтрокиВ.Количество) [СебСто $Число]
|FROM
|    _1sjourn ЖурВозв (nolock),
|    left join $ДокументСтроки.ВозвратОтПокупателя ДокСтрокиВ (nolock) on
|														     ДокСтрокиВ.iddoc=ЖурВозв.iddoc
|    left join (SELECT
|				   СпрНомВ.ID ТоварВ,
|		 $ПоследнееЗначение.Цены.Цена(ЦеныВ.ID, :КонДата) ЦенаВ
|	 	FROM
|		 $Справочник.ТипыЦен СпрТипыВ,$Справочник.Номенклатура СпрНомВ
|		  left join $Справочник.Цены ЦеныВ on (ЦеныВ.PARENTEXT=СпрНомВ.ID
|			and $ЦеныВ.ТипЦен='    1Y   ' or $ЦеныВ.ТипЦен is NULL)
|	WHERE  СпрТипыВ.ID='    1Y   '
|	)ТабЦенВ on ТабЦенВ.ТоварВ=$ДокСтрокиВ.Номенклатура
|WHERE
|    (ЖурВозв.closed & 1 = 1) and
|    (ЖурВозв.IDDOCDEF=$ВидДокумента.ВозвратОтПокупателя) and
|    (ЖурВозв.ISMARK = 0) and
|    (ЖурВозв.DATE_TIME_IDDOC between :НачДата and :КонДата~)
|ORDER by 1
|";
 

  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: объединение и $ПоследнееЗначение
Ответ #2 - 27. Сентября 2006 :: 10:45
Печать  
Считай это багом парсера SQL Server.
Вариант обхода:
Код
Выбрать все
тз = рс.ВыполнитьИнструкцию(ТекстЗапроса1);
тз = рс.ВыполнитьИнструкцию(ТекстЗапроса2, тз, 0); 

  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
PVL
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 20
Местоположение: г.Томск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: объединение и $ПоследнееЗначение
Ответ #3 - 28. Сентября 2006 :: 03:22
Печать  
Спасибо,  berezdetsky! Этот вариант имеет право на жизнь!  Подмигивание
Но при этом возникает маленькое неудобство: после выполнения первого запроса небходимо заново устонавливать текстовые параметры. Если их не много, то это не страшно, а если т. параметры устанавливаются по выполнению опред. условий, то здесь возникает неудобство..  Печаль
А вобще-то, подзапрос (c $ПоследнееЗначение) был сделан с целью решить проблему отсутсвия у товара определенного типа цены. При отсутсвии цены должен получаться "0", а у меня исключался такой товар из списка, что совсем некорректно было. Одним из вариантов решения был данный подзапрос, может кто подскажет еще какой-то вариант?
  
Наверх
 
IP записан
 
PVL
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 20
Местоположение: г.Томск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: объединение и $ПоследнееЗначение
Ответ #4 - 28. Сентября 2006 :: 06:34
Печать  
Действительно баг операторов UNION и ORDER:
http://www.sql.ru/forum/actualthread.aspx?tid=86557&hl=order+items+appear+select...
  
Наверх
 
IP записан
 
PVL
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 20
Местоположение: г.Томск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: объединение и $ПоследнееЗначение
Ответ #5 - 28. Сентября 2006 :: 06:54
Печать  
А вот зесь решение проблемы от DmitrO:
http://www.itland.ru/forum/lofiversion/index.php/t6968.html
И это действительно помогло!  Круглые глаза
  
Наверх
 
IP записан
 
PVL
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 20
Местоположение: г.Томск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: объединение и $ПоследнееЗначение
Ответ #6 - 28. Сентября 2006 :: 08:23
Печать  
Может это решение стоит занести в FAQ?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать