Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Помогите разобраться с глюком! (число прочтений - 15035 )
Alex37
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Помогите разобраться с глюком!
13. Мая 2013 :: 15:46
Печать  
Доброе время суток!
Помогите, пожалуйста, разобраться с непонятной ошибкой.
Я написал запрос по получению остатков товара на каждый день на основе готового, что на форуме выложен уже несколько раз. Из изменений - по нескольким реквизитам (которые выбираются на форме). Я выложил кусок сгенериованного текста запроса, если надо - выложу и генератор Улыбка
Код
Выбрать все
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
ID=OBJECT_ID('tempdb..#ВремОстатки') AND sysstat & 0xf = 3 )
DROP TABLE #ВремОстатки

SELECT ОстаткиТМЦ.Период
	, ОстаткиТМЦ.Фирма
	, ОстаткиТМЦ.Склад
	, ОстаткиТМЦ.Номенклатура
	, ОстаткиТМЦ.КоличествоКонечныйОстаток as Остаток
Into #ВремОстатки
From $РегистрОстаткиОбороты.ОстаткиТМЦ('20130501','20130508Z',День,,,
			,(Фирма,Склад,Номенклатура),(Количество)) as ОстаткиТМЦ

SELECT кросс.день as Период
	, кросс.Фирма
	, кросс.Склад
	, кросс.Номенклатура
	, Ост.Остаток
From (Select DISTINCT дни.день
	, Фирма
	, Склад
	, Номенклатура
	From (
		Select DATEADD(day,(aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d),CAST('20130501' as DateTime)) as день
		From	   (Select 0 AS a UNION Select 1 UNION Select 2 UNION Select 3 UNION Select 4 UNION Select 5 UNION Select 6 UNION Select 7 UNION Select 8 UNION Select 9) AS aa
		CROSS JOIN (Select 0 AS b UNION Select 1 UNION Select 2 UNION Select 3 UNION Select 4 UNION Select 5 UNION Select 6 UNION Select 7 UNION Select 8 UNION Select 9) AS bb
		CROSS JOIN (Select 0 AS c UNION Select 1 UNION Select 2 UNION Select 3 UNION Select 4 UNION Select 5 UNION Select 6 UNION Select 7 UNION Select 8 UNION Select 9) AS cc
		CROSS JOIN (Select 0 AS d UNION Select 1 UNION Select 2 UNION Select 3 UNION Select 4 UNION Select 5 UNION Select 6 UNION Select 7 UNION Select 8 UNION Select 9) AS dd
		Where aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= 7
		) as дни
	CROSS JOIN #ВремОстатки
	) as Кросс
	LEFT JOIN (Select об1.Период as ДатаС
		, MIN(CASE WHEN об2.Период Is NULL THEN DATEADD(day,1,CAST('20130508' as DateTime)) ELSE DATEADD(day,-1,об2.Период) END) as ДатаПо
		, об1.Остаток
	, об1.Фирма
	, об1.Склад
	, об1.Номенклатура
		From #ВремОстатки об1
			LEFT JOIN #ВремОстатки об2 on об1.Период < об2.Период
Group By об1.Период,об1.Остаток,об1.Фирма,об1.Склад,об1.Номенклатура
) as Ост on кросс.день BETWEEN Ост.ДатаС AND Ост.ДатаПо AND кросс.Фирма = Ост.Фирма AND кросс.Склад = Ост.Склад AND кросс.Номенклатура = Ост.Номенклатура
Where Ост.Остаток <> 0

глРС.ВыполнитьИнструкцию(ТекстЗапросаОстатков,ИТЗ);
{\\TSCLIENT\E\1С\АНАЛИЗ ТМЦ ПО ПЕРИОДАМ.ERT(646)}: State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'Остаток'. 



Текст запроса - рабочий, вот только 1С как-то непонятно реагирует на него.
При изменении (добавлении) колонок (Фирма, Склад, Номенклатура) - SQL выкидывает ошибки про их отсутствие (колонок). Такое чувство, что что-то не так с временными таблицами...

Другой кусок кода с использованием временных таблиц был такой же нерабочий, когда я его переделал с использованием
вложенных запросов - заработал. С использованием таблиц данные выдавались в SQL Query Analyzer, а 1С падала.
Я уже всю голову сломал.
Остался только дурной путь вместо временной таблицы вставить этот запрос 3 раза!
Если что - 1С 7.7 "Торговля и Склад", MS SQL Server 2000 SP4
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Помогите разобраться с глюком!
Ответ #1 - 13. Мая 2013 :: 16:07
Печать  
Глубоко в запрс не вникал, но у тебя же в виртуальной таблице Ост нет поля Остаток в селекте, вот оно и ругается
  
Наверх
 
IP записан
 
Alex37
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #2 - 13. Мая 2013 :: 16:13
Печать  
Код
Выбрать все
LEFT JOIN (Select об1.Период as ДатаС
		, MIN(CASE WHEN об2.Период Is NULL THEN DATEADD(day,1,CAST('20130508' as DateTime)) ELSE DATEADD(day,-1,об2.Период) END) as ДатаПо
		, об1.Остаток
			  , об1.Фирма
			  , об1.Склад
			 , об1.Номенклатура
		From #ВремОстатки об1
			LEFT JOIN #ВремОстатки об2 on об1.Период < об2.Период
Group By об1.Период,об1.Остаток,об1.Фирма,об1.Склад,об1.Номенклатура
) as Ост 


Как раз есть...
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Помогите разобраться с глюком!
Ответ #3 - 13. Мая 2013 :: 16:26
Печать  
а, да точно, сори Улыбка
ну я запустил твой запрос у себя, работает. Только в 1CQA сначала инсерт во временную таблицу, потом вторым батчем селект. Пашет
попробуй сначала инсерт и посмотри какие там поля во временной таблице, может увидишь че-то не то)
и еще совет, допиши в наало батча set nocount on, иначе сервер возвращает сообщение с колвом обработанных записей и тд, бывают всякие глюки в 1С
  
Наверх
 
IP записан
 
Alex37
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #4 - 13. Мая 2013 :: 16:52
Печать  
set nocount on есть в основном тетсте запроса, в данном случае он не влияет.
По частям запрос тоже пробовал, поэтому и пишу, что код рабочий.

Я уж сделал отдельный файл отчета для экспериментов, вот такой код (не сгенерированный, а руками писанный) работает
Код
Выбрать все
	ТекстЗапроса = "
		|Set NoCount On
		|SELECT Выборка.Период as Период
		|	, Выборка.Фирма as Фирма
		|	, Выборка.Склад as Склад
		|	, Выборка.Номенклатура as Номенклатура
		|	, Выборка.НачОст as НачОст
		|	, Выборка.Приход as Приход
		|	, Выборка.Расход as Расход
		|	, Выборка.КонОст as КонОст
		|Into #ВремТабОстОб
		|FROM (
		|
		|SELECT ОстаткиТМЦ.Период as Период
		|	, ОстаткиТМЦ.Фирма as Фирма
		|	, ОстаткиТМЦ.Склад as Склад
		|	, ОстаткиТМЦ.Номенклатура AS Номенклатура
		|	, ОстаткиТМЦ.КоличествоНачальныйОстаток as НачОст
		|	, ОстаткиТМЦ.КоличествоПриход as Приход
		|	, ОстаткиТМЦ.КоличествоРасход as Расход
		|	, ОстаткиТМЦ.КоличествоКонечныйОстаток as КонОст
		|From олучитьСтрИзДаты(ДатаКонца)+"Z',День,,,
		|			Номенклатура = '"+МД.ЗначениеВСтрокуБД(ВыбТМЦ)+"',(Фирма,Склад,Номенклатура),(Количество)) as ОстаткиТМЦ
		|
		|) as Выборка
		|
		|SELECT кросс.день as Период
		|	, Кросс.Фирма Фирма
		|	, Кросс.Склад Склад
		|	, Кросс.Номенклатура Номенклатура
		|	, Ост.КонОст as КонОст
		|Into #ВремОбороты
		|From (
		|	Select DISTINCT дни.день
		|	,Фирма as Фирма
		|	,Склад as Склад
		|	,Номенклатура as Номенклатура
		|	From (
		|		Select DATEADD(day,(aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d),CAST('"+МД.ПолучитьСтрИзДаты(ДатаНачала)+"' as DateTime)) as день
		|		From	   (Select 0 AS a UNION Select 1 UNION Select 2 UNION Select 3 UNION Select 4 UNION Select 5 UNION Select 6 UNION Select 7 UNION Select 8 UNION Select 9) AS aa
		|		CROSS JOIN (Select 0 AS b UNION Select 1 UNION Select 2 UNION Select 3 UNION Select 4 UNION Select 5 UNION Select 6 UNION Select 7 UNION Select 8 UNION Select 9) AS bb
		|		CROSS JOIN (Select 0 AS c UNION Select 1 UNION Select 2 UNION Select 3 UNION Select 4 UNION Select 5 UNION Select 6 UNION Select 7 UNION Select 8 UNION Select 9) AS cc
		|		CROSS JOIN (Select 0 AS d UNION Select 1 UNION Select 2 UNION Select 3 UNION Select 4 UNION Select 5 UNION Select 6 UNION Select 7 UNION Select 8 UNION Select 9) AS dd
		|		Where aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= "+КолДней+"
		|		) as дни
		|	CROSS JOIN #ВремТабОстОб
		|	) as Кросс
		|	LEFT JOIN (
		|				Select
		|					об1.Период as ДатаС,
		|					MIN(CASE WHEN об2.Период Is NULL THEN DATEADD(day,1,CAST('"+МД.ПолучитьСтрИзДаты(ДатаКонца)+"' as DateTime)) ELSE DATEADD(day,-1,об2.Период) END) as ДатаПо,
		|					об1.КонОст,
		|					об1.Фирма,
		|					об1.Склад,
		|					об1.Номенклатура
		|				From #ВремТабОстОб об1
		|				LEFT JOIN #ВремТабОстОб об2 on об1.Номенклатура = об2.Номенклатура
		|					and об1.Фирма = об2.Фирма
		|					and об1.Склад = об2.Склад
		|					and об1.Период < об2.Период
		|				Group By об1.Период,об1.Номенклатура,об1.Фирма,об1.Склад,об1.КонОст
		|			) as Ост on кросс.Номенклатура = Ост.Номенклатура
		|					and кросс.Фирма = Ост.Фирма
		|					and кросс.Склад = Ост.Склад
		|			and кросс.день BETWEEN Ост.ДатаС AND Ост.ДатаПо
		|Where Ост.КонОст <> 0
		|ORDER BY 1,2
		|
		|SELECT * FROM #ВремОбороты
		|";
 



Но он с жестким количеством колонок.

Где-то у меня барабашка живет, причем и дома и на работе одинаковые ошибки, т.е. проблема системная
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Помогите разобраться с глюком!
Ответ #5 - 13. Мая 2013 :: 17:30
Печать  
Что-то я честно говоря, ничего не понял. Все запросы рабочие, откуда ошибки тогда? Проблема в том, что генератор кода запроса строит запрос, который в какой-то момент выдает ошибки? Ну так разбей код генерируемых запросов на отдельные батчи, дроп таблицы, инсерт, селект. Поставь там временно контрольные запросы к временным таблицам, уже будет легче отлаживать. Посмотри в профайлере каждый конкретный запуск отчета. Хз, вообщем, може я туплю, тада сори Улыбка
  
Наверх
 
IP записан
 
Alex37
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #6 - 13. Мая 2013 :: 17:58
Печать  
В отчете всего 2 батча (не считая очистки таблиц), первая часть простая, все отрабатывает
Код
Выбрать все
SELECT ОстаткиТМЦ.Период
	, ОстаткиТМЦ.Фирма
	, ОстаткиТМЦ.Склад
	, ОстаткиТМЦ.Номенклатура
	, ОстаткиТМЦ.КоличествоКонечныйОстаток as Остаток
Into #ВремОстатки
From $РегистрОстаткиОбороты.ОстаткиТМЦ('20130501','20130508Z',День,,,
			,(Фирма,Склад,Номенклатура),(Количество)) as ОстаткиТМЦ
Select * From #ВремОстатки
 



Вторая сложная, я её не могу без первой проверить, т.к. она использует таблицу #ВремОстатки 3 раза.
Может дело в оперативке? Данных в первой таблице дофига, а после разворота по дням их, видимо, становится ещё больше...
  
Наверх
 
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: Помогите разобраться с глюком!
Ответ #7 - 13. Мая 2013 :: 18:28
Печать  
врядли при нехватке оперативы сервер бы недовставлял поле во временную таблицу). Ну поставь инсерт топ 100(в генераторе), проверь на небольших массивах данных. Если перед тем супер-запросом поставить простую контрольку, вывести просто все поля, select top 1 * from #ВремТаблица, что будет такое, что поле в этом запросе есть, а сложный запрос ругается на отсутствие этого поля? Чудеса какие-то..
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Помогите разобраться с глюком!
Ответ #8 - 14. Мая 2013 :: 02:30
Печать  
Код
Выбрать все
Select
	DATEADD(day,(aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d),CAST('20130501' as DateTime)) as день
From
	(Select 0 AS a UNION Select 1 UNION Select 2 UNION Select 3 UNION Select 4 UNION Select 5 UNION Select 6 UNION Select 7 UNION Select 8 UNION Select 9) AS aa
	CROSS JOIN (Select 0 AS b UNION Select 1 UNION Select 2 UNION Select 3 UNION Select 4 UNION Select 5 UNION Select 6 UNION Select 7 UNION Select 8 UNION Select 9) AS bb
	CROSS JOIN (Select 0 AS c UNION Select 1 UNION Select 2 UNION Select 3 UNION Select 4 UNION Select 5 UNION Select 6 UNION Select 7 UNION Select 8 UNION Select 9) AS cc
	CROSS JOIN (Select 0 AS d UNION Select 1 UNION Select 2 UNION Select 3 UNION Select 4 UNION Select 5 UNION Select 6 UNION Select 7 UNION Select 8 UNION Select 9) AS dd
Where
	aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= 7
 



Для начала нифига не понял, зачем нужно такое извращение.
Т.е. оно понятно, что должна давать конструкция из кросс-джойнов и (aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d), но после условия в WHERE достаточно только первого селект-юниона, без кросс-джойнов остальных...
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите разобраться с глюком!
Ответ #9 - 14. Мая 2013 :: 06:10
Печать  
(0) табличку с датами, лучше лепить так:

Код
Выбрать все
select dateadd(day,(a.number+b.number*256),:НачДата) as Dat
from master..spt_values a, master..spt_values b
where a.type='P' and b.type='P'

    and b.number<=datediff(day,:НачДата,:КонДата)/256
    and a.number<=(datediff(day,:НачДата,:КонДата)-b.number*256)
©Дык ё
 




ЗЫ: явно задавай алиясы во вложенных запросах, типа
, об1.Остаток as Остаток + во втором тексте у тебя там
, об1.КонОст еще
  
Наверх
 
IP записан
 
Alex37
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #10 - 14. Мая 2013 :: 07:01
Печать  
Satans Claws писал(а) 14. Мая 2013 :: 02:30:
Для начала нифига не понял, зачем нужно такое извращение.

Этот текст я взял уже готовый, он здесь несколько раз встречается, он делает табличку с датами.

Eprst писал(а) 14. Мая 2013 :: 06:10:
(0) табличку с датами, лучше лепить так:

Переделаю

Eprst писал(а) 14. Мая 2013 :: 06:10:
(0) ЗЫ: явно задавай алиясы во вложенных запросах

они были, но когда sql начал ругаться на отсутствие колонок - я попробовал их убрать. Сейчас восстановлю

Как все сделаю, отпишусь
  
Наверх
 
IP записан
 
Alex37
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #11 - 14. Мая 2013 :: 07:56
Печать  
Все рекомендации сделал, но ошибка осталась
Код
Выбрать все
Set NoCount On


IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
ID=OBJECT_ID('tempdb..#ВремОстатки') AND sysstat & 0xf = 3 )
DROP TABLE #ВремОстатки

SELECT ОстаткиТМЦ.Период as Период
	, ОстаткиТМЦ.Фирма as Фирма
	, ОстаткиТМЦ.Склад as Склад
	, ОстаткиТМЦ.КоличествоКонечныйОстаток as Остаток
Into #ВремОстатки
From #TB1C378DD8A294C54BD2D6F452A54B673 as ОстаткиТМЦ

SELECT ПартииНаличие.Период as Период
	, ПартииНаличие.Фирма [Фирма $Справочник.Фирмы]
	, ПартииНаличие.Склад [Склад $Справочник.Склады]
	, Sum(ПартииНаличие.Остаток) as Остаток
FROM (

SELECT CASE WHEN Рег.Период<'20130501' THEN '20130501' ELSE Рег.Период END as Период
	, Рег.Фирма as Фирма
	, Рег.Склад as Склад
	, Рег.Остаток as Остаток
FROM (
SELECT кросс.день as Период
	, кросс.Фирма as Фирма
	, кросс.Склад as Склад
	, Ост.Остаток AS Остаток
From (Select DISTINCT дни.день
	, Фирма as Фирма
	, Склад as Склад
	From (
		select dateadd(day,(a.number+b.number*256),CAST('20130501' as DateTime)) as день
		from master..spt_values a, master..spt_values b
		where a.type='P' and b.type='P'
		    and b.number<=datediff(day,CAST('20130501' as DateTime),CAST('20130514' as DateTime))/256
		    and a.number<=(datediff(day,CAST('20130501' as DateTime),CAST('20130514' as DateTime))-b.number*256)
		) as дни
	CROSS JOIN #ВремОстатки
	) as Кросс
	LEFT JOIN (Select об1.Период as ДатаС
		, MIN(CASE WHEN об2.Период Is NULL THEN DATEADD(day,1,CAST('20130514' as DateTime)) ELSE DATEADD(day,-1,об2.Период) END) as ДатаПо
		, об1.Остаток as Остаток
	, об1.Фирма as Фирма
	, об1.Склад as Склад
		From #ВремОстатки об1
			LEFT JOIN #ВремОстатки об2 on об1.Период < об2.Период
Group By об1.Период,об1.Остаток,об1.Фирма,об1.Склад
) as Ост on кросс.день BETWEEN Ост.ДатаС AND Ост.ДатаПо AND кросс.Фирма = Ост.Фирма AND кросс.Склад = Ост.Склад
Where Ост.Остаток <> 0

) as Рег
	) as ПартииНаличие
GROUP BY ПартииНаличие.Период,ПартииНаличие.Фирма,ПартииНаличие.Склад
ORDER BY 1
глРС.ВыполнитьИнструкцию(ТекстЗапроса,ИТЗ);
{D:\TEMP\АНАЛИЗ ТМЦ ПО ПЕРИОДАМ.ERT(418)}: State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'Фирма'. 


Причем эта ошибка плавающая, иногда запрос может отработать.

А если мне надо получить Остатки ТМЦ по различным периодам (день, месяц и т.п.), что надо сделать?
Переделать получение кросса (заменить день на выбранные даты конца?)
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите разобраться с глюком!
Ответ #12 - 14. Мая 2013 :: 08:17
Печать  
вот тут явно укажи, из какой таблички брать фирму и склад:

From (Select DISTINCT дни.день

, TableAlias.Фирма as Фирма
     , Склад as Склад

  
Наверх
 
IP записан
 
Alex37
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #13 - 14. Мая 2013 :: 08:26
Печать  
Eprst писал(а) 14. Мая 2013 :: 08:17:
вот тут явно укажи, из какой таблички брать фирму и склад:


Не помогло...

Код
Выбрать все
Set NoCount On


IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
ID=OBJECT_ID('tempdb..#ВремОстатки') AND sysstat & 0xf = 3 )
DROP TABLE #ВремОстатки

SELECT ОстаткиТМЦ.Период as Период
	, ОстаткиТМЦ.Фирма as Фирма
	, ОстаткиТМЦ.Номенклатура AS Номенклатура
	, ОстаткиТМЦ.КоличествоКонечныйОстаток as Остаток
Into #ВремОстатки
From #T701A59CEB74F4F2489E789148B971F73 as ОстаткиТМЦ

SELECT ПартииНаличие.Период as Период
	, ПартииНаличие.Фирма [Фирма $Справочник.Фирмы]
	, ПартииНаличие.Номенклатура [Номенклатура $Справочник.Номенклатура]
	, Sum(ПартииНаличие.Остаток) as Остаток
FROM (

SELECT CASE WHEN Рег.Период<'20130501' THEN '20130501' ELSE Рег.Период END as Период
	, Рег.Фирма as Фирма
	, Рег.Номенклатура
	, Рег.Остаток as Остаток
FROM (
SELECT кросс.день as Период
	, кросс.Фирма as Фирма
	, кросс.Номенклатура AS Номенклатура
	, Ост.Остаток AS Остаток
From (Select DISTINCT дни.день
	, Остатки.Фирма as Фирма
	, Остатки.Номенклатура AS Номенклатура
	From (
		select dateadd(day,(a.number+b.number*256),CAST('20130501' as DateTime)) as день
		from master..spt_values a, master..spt_values b
		where a.type='P' and b.type='P'
		    and b.number<=datediff(day,CAST('20130501' as DateTime),CAST('20130514' as DateTime))/256
		    and a.number<=(datediff(day,CAST('20130501' as DateTime),CAST('20130514' as DateTime))-b.number*256)
		) as дни
	CROSS JOIN #ВремОстатки as Остатки
	) as Кросс
	LEFT JOIN (Select об1.Период as ДатаС
		, MIN(CASE WHEN об2.Период Is NULL THEN DATEADD(day,1,CAST('20130514' as DateTime)) ELSE DATEADD(day,-1,об2.Период) END) as ДатаПо
		, об1.Остаток as Остаток
	, об1.Фирма as Фирма
	, об1.Номенклатура
		From #ВремОстатки об1
			LEFT JOIN #ВремОстатки об2 on об1.Период < об2.Период
Group By об1.Период,об1.Остаток,об1.Фирма,об1.Номенклатура
) as Ост on кросс.день BETWEEN Ост.ДатаС AND Ост.ДатаПо AND кросс.Фирма = Ост.Фирма AND кросс.Номенклатура = Ост.Номенклатура
Where Ост.Остаток <> 0

) as Рег
	) as ПартииНаличие
GROUP BY ПартииНаличие.Период,ПартииНаличие.Фирма,ПартииНаличие.Номенклатура
ORDER BY 1
глРС.ВыполнитьИнструкцию(ТекстЗапроса,ИТЗ);
{D:\TEMP\АНАЛИЗ ТМЦ ПО ПЕРИОДАМ.ERT(420)}: State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'Фирма'. 



P.S. Сейчас у меня запрос отрабатывает только при одной выбранной колонке Номенклатура и корректно показывает только при периоде день.

Я уж вложил саму ert'шку, отчет ещё не готов, не судите строго.
Задача - получить остатки / движения по выбранным периодам
Сейчас отрабатывает только номенклатуру по датам
В ней используются класс Множественный фильтр (чуть изменённый)
  

_______________________001.zip ( 21 KB | Загрузки )
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите разобраться с глюком!
Ответ #14 - 14. Мая 2013 :: 08:34
Печать  
T701A59CEB74F4F2489E789148B971F73

вот эта табличка откуда взялась ? И зачем еще раз её в другую временную пихать ?
  
Наверх
 
IP записан
 
Alex37
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #15 - 14. Мая 2013 :: 08:37
Печать  
Eprst писал(а) 14. Мая 2013 :: 08:34:
T701A59CEB74F4F2489E789148B971F73

вот эта табличка откуда взялась ? И зачем еще раз её в другую временную пихать ?

Это виртуальная таблица так сработала
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите разобраться с глюком!
Ответ #16 - 14. Мая 2013 :: 08:42
Печать  
вот это занафига ?
МД.ПолучитьСтрИзДаты(ДатаНачала)

когда достаточно просто установить текстовый параметр для даты и усё.
  
Наверх
 
IP записан
 
Alex37
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #17 - 14. Мая 2013 :: 08:48
Печать  
Как раз это не мешает вообще. А строк кода - меньше.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите разобраться с глюком!
Ответ #18 - 14. Мая 2013 :: 08:49
Печать  
Покажи код текста запроса из отладки и без перед выполнить инструкцию.

+ не видно, откуда ты там виртуальную табличку "
Это виртуальная таблица так сработала " берешь
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите разобраться с глюком!
Ответ #19 - 14. Мая 2013 :: 08:50
Печать  
Alex37 писал(а) 14. Мая 2013 :: 08:48:
Как раз это не мешает вообще. А строк кода - меньше.


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


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #20 - 14. Мая 2013 :: 08:53
Печать  
Запрос при о тладке
Код
Выбрать все
Set NoCount On


IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
ID=OBJECT_ID('tempdb..#ВремОстатки') AND sysstat & 0xf = 3 )
DROP TABLE #ВремОстатки

SELECT ОстаткиТМЦ.Период as Период
	, ОстаткиТМЦ.Фирма as Фирма
	, ОстаткиТМЦ.Склад as Склад
	, ОстаткиТМЦ.Номенклатура AS Номенклатура
	, ОстаткиТМЦ.КоличествоКонечныйОстаток as Остаток
Into #ВремОстатки
From #TBFD6C5782E2D48D2A038A9C21BA3F180 as ОстаткиТМЦ

SELECT ПартииНаличие.Период as Период
	, ПартииНаличие.Фирма [Фирма $Справочник.Фирмы]
	, ПартииНаличие.Склад [Склад $Справочник.Склады]
	, ПартииНаличие.Номенклатура [Номенклатура $Справочник.Номенклатура]
	, Sum(ПартииНаличие.Остаток) as Остаток
FROM (

SELECT CASE WHEN Рег.Период<'20130501' THEN '20130501' ELSE Рег.Период END as Период
	, Рег.Фирма as Фирма
	, Рег.Склад as Склад
	, Рег.Номенклатура
	, Рег.Остаток as Остаток
FROM (
SELECT кросс.день as Период
	, кросс.Фирма as Фирма
	, кросс.Склад as Склад
	, кросс.Номенклатура AS Номенклатура
	, Ост.Остаток AS Остаток
From (Select DISTINCT дни.день
	, Остатки.Фирма as Фирма
	, Остатки.Склад as Склад
	, Остатки.Номенклатура AS Номенклатура
	From (
		select dateadd(day,(a.number+b.number*256),CAST('20130501' as DateTime)) as день
		from master..spt_values a, master..spt_values b
		where a.type='P' and b.type='P'
		    and b.number<=datediff(day,CAST('20130501' as DateTime),CAST('20130514' as DateTime))/256
		    and a.number<=(datediff(day,CAST('20130501' as DateTime),CAST('20130514' as DateTime))-b.number*256)
		) as дни
	CROSS JOIN #ВремОстатки as Остатки
	) as Кросс
	LEFT JOIN (Select об1.Период as ДатаС
		, MIN(CASE WHEN об2.Период Is NULL THEN DATEADD(day,1,CAST('20130514' as DateTime)) ELSE DATEADD(day,-1,об2.Период) END) as ДатаПо
		, об1.Остаток as Остаток
	, об1.Фирма as Фирма
	, об1.Склад as Склад
	, об1.Номенклатура
		From #ВремОстатки об1
			LEFT JOIN #ВремОстатки об2 on об1.Период < об2.Период
Group By об1.Период,об1.Остаток,об1.Фирма,об1.Склад,об1.Номенклатура
) as Ост on кросс.день BETWEEN Ост.ДатаС AND Ост.ДатаПо AND кросс.Фирма = Ост.Фирма AND кросс.Склад = Ост.Склад AND кросс.Номенклатура = Ост.Номенклатура
Where Ост.Остаток <> 0

) as Рег
	) as ПартииНаличие
GROUP BY клатура
ORDER BY 1
глРС.ВыполнитьИнструкцию(ТекстЗапроса,ИТЗ);
{D:\TEMP\АНАЛИЗ ТМЦ ПО ПЕРИОДАМ.ERT(420)}: State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'Фирма'. 



ТекстЗапроса оригинал
Код
Выбрать все
Set NoCount On


IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
ID=OBJECT_ID('tempdb..#ВремОстатки') AND sysstat & 0xf = 3 )
DROP TABLE #ВремОстатки

SELECT ОстаткиТМЦ.Период as Период
	, ОстаткиТМЦ.Фирма as Фирма
	, ОстаткиТМЦ.Склад as Склад
	, ОстаткиТМЦ.Номенклатура AS Номенклатура
	, ОстаткиТМЦ.КоличествоКонечныйОстаток as Остаток
Into #ВремОстатки
From $РегистрОстаткиОбороты.ОстаткиТМЦ('20130501','20130514Z',День,,,
			(Номенклатура = '   4VO   '),(Фирма,Склад,Номенклатура),(Количество)) as ОстаткиТМЦ

SELECT ПартииНаличие.Период as Период
	, ПартииНаличие.Фирма [Фирма $Справочник.Фирмы]
	, ПартииНаличие.Склад [Склад $Справочник.Склады]
	, ПартииНаличие.Номенклатура [Номенклатура $Справочник.Номенклатура]
	, Sum(ПартииНаличие.Остаток) as Остаток
FROM (

SELECT CASE WHEN Рег.Период<'20130501' THEN '20130501' ELSE Рег.Период END as Период
	, Рег.Фирма as Фирма
	, Рег.Склад as Склад
	, Рег.Номенклатура
	, Рег.Остаток as Остаток
FROM (
SELECT кросс.день as Период
	, кросс.Фирма as Фирма
	, кросс.Склад as Склад
	, кросс.Номенклатура AS Номенклатура
	, Ост.Остаток AS Остаток
From (Select DISTINCT дни.день
	, Остатки.Фирма as Фирма
	, Остатки.Склад as Склад
	, Остатки.Номенклатура AS Номенклатура
	From (
		select dateadd(day,(a.number+b.number*256),CAST('20130501' as DateTime)) as день
		from master..spt_values a, master..spt_values b
		where a.type='P' and b.type='P'
		    and b.number<=datediff(day,CAST('20130501' as DateTime),CAST('20130514' as DateTime))/256
		    and a.number<=(datediff(day,CAST('20130501' as DateTime),CAST('20130514' as DateTime))-b.number*256)
		) as дни
	CROSS JOIN #ВремОстатки as Остатки
	) as Кросс
	LEFT JOIN (Select об1.Период as ДатаС
		, MIN(CASE WHEN об2.Период Is NULL THEN DATEADD(day,1,CAST('20130514' as DateTime)) ELSE DATEADD(day,-1,об2.Период) END) as ДатаПо
		, об1.Остаток as Остаток
	, об1.Фирма as Фирма
	, об1.Склад as Склад
	, об1.Номенклатура
		From #ВремОстатки об1
			LEFT JOIN #ВремОстатки об2 on об1.Период < об2.Период
Group By об1.Период,об1.Остаток,об1.Фирма,об1.Склад,об1.Номенклатура
) as Ост on кросс.день BETWEEN Ост.ДатаС AND Ост.ДатаПо AND кросс.Фирма = Ост.Фирма AND кросс.Склад = Ост.Склад AND кросс.Номенклатура = Ост.Номенклатура
Where Ост.Остаток <> 0

	) as Рег
) as ПартииНаличие
GROUP BY клатура
ORDER BY 1 

  
Наверх
 
IP записан
 
Alex37
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #21 - 14. Мая 2013 :: 09:01
Печать  
Продублирую, я, наверно,  зря поправил старый пост

Сейчас у меня запрос отрабатывает только при одной выбранной колонке Номенклатура и корректно показывает только при периоде день.

Я уж вложил саму ert'шку, отчет ещё не готов, не судите строго.
Задача - получить остатки / движения по выбранным периодам
Сейчас отрабатывает только номенклатуру по датам
В ней используются класс Множественный фильтр (чуть изменённый)
  

_______________________002.zip ( 21 KB | Загрузки )
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите разобраться с глюком!
Ответ #22 - 14. Мая 2013 :: 09:19
Печать  
тест на вшивость, это работает (если целиком скопирять и подставить) ?

Код
Выбрать все
|Set NoCount On
|IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
|ID=OBJECT_ID('tempdb..#ВремОстатки') AND sysstat & 0xf = 3 )
|DROP TABLE #ВремОстатки
|;
|SELECT ОстаткиТМЦ.Период as Период
|     ,ОстаткиТМЦ.Фирма as Фирма
|     ,ОстаткиТМЦ.Склад as Склад
|     ,ОстаткиТМЦ.Номенклатура AS Номенклатура
|     ,ОстаткиТМЦ.КоличествоКонечныйОстаток as Остаток
|Into #ВремОстатки
|From $РегистрОстаткиОбороты.ОстаткиТМЦ('20130501','20130514Z',День,,,(Номенклатура = '   4VO   '),(Фирма,Склад,Номенклатура),(Количество)) as ОстаткиТМЦ
|;
|SELECT ПартииНаличие.Период as Период
|	,ПартииНаличие.Фирма [Фирма $Справочник.Фирмы]
|	,ПартииНаличие.Склад [Склад $Справочник.Склады]
|	,ПартииНаличие.Номенклатура [Номенклатура $Справочник.Номенклатура]
|	,Sum(ПартииНаличие.Остаток) as Остаток
|FROM (
|	 SELECT CASE WHEN Рег.Период<'20130501' THEN '20130501' ELSE Рег.Период END as Период
|		 ,Рег.Фирма as Фирма
|		 ,Рег.Склад as Склад
|		 ,Рег.Номенклатура as Номенклатура
|		 ,Рег.Остаток as Остаток
|	 FROM (
|		  SELECT   кросс.День as Период
|			    ,кросс.Фирма as Фирма
|			    ,кросс.Склад as Склад
|			    ,кросс.Номенклатура AS Номенклатура
|			    ,Ост.Остаток AS Остаток
|		  From (
|			   Select DISTINCT дни.день as День
|				    ,Остатки.Фирма as Фирма
|				    ,Остатки.Склад as Склад
|				    ,Остатки.Номенклатура AS Номенклатура
|			   From (
|					  select dateadd(day,(a.number+b.number*256),CAST('20130501' as DateTime)) as День
|			     	from master..spt_values a, master..spt_values b
|				   where a.type='P' and b.type='P'
|				   and b.number<=datediff(day,CAST('20130501' as DateTime),CAST('20130514' as DateTime))/256
|				   and a.number<=(datediff(day,CAST('20130501' as DateTime),CAST('20130514' as DateTime))-b.number*256)
|				  ) as дни
|			  CROSS JOIN #ВремОстатки as Остатки
|			 ) as Кросс
|     LEFT JOIN (
|		     Select об1.Период as ДатаС
|				,MIN(CASE WHEN об2.Период Is NULL THEN DATEADD(day,1,CAST('20130514' as DateTime)) ELSE DATEADD(day,-1,об2.Период) END) as ДатаПо
|				,об1.Остаток as Остаток
|				,об1.Фирма as Фирма
|				,об1.Склад as Склад
|				,об1.Номенклатура as Номенклатура
|		     From #ВремОстатки об1
|		     LEFT JOIN #ВремОстатки об2 on об1.Период < об2.Период
|		     Group By об1.Период,об1.Остаток,об1.Фирма,об1.Склад,об1.Номенклатура
|		     ) as Ост on кросс.день BETWEEN Ост.ДатаС AND Ост.ДатаПо AND кросс.Фирма = Ост.Фирма AND кросс.Склад = Ост.Склад AND кросс.Номенклатура = Ост.Номенклатура
|     Where Ост.Остаток <> 0
|   ) as Рег
|) as ПартииНаличие
|GROUP BY клатура
|ORDER BY 1  

  
Наверх
 
IP записан
 
Alex37
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #23 - 14. Мая 2013 :: 09:22
Печать  
Eprst писал(а) 14. Мая 2013 :: 09:19:
тест на вшивость, это работает (если целиком скопирять и подставить) ?

Нет
Код
Выбрать все
Set NoCount On


IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
ID=OBJECT_ID('tempdb..#ВремОстатки') AND sysstat & 0xf = 3 )
DROP TABLE #ВремОстатки

SELECT ОстаткиТМЦ.Период as Период
	, ОстаткиТМЦ.Фирма as Фирма
	, ОстаткиТМЦ.Склад as Склад
	, ОстаткиТМЦ.Номенклатура AS Номенклатура
	, ОстаткиТМЦ.КоличествоКонечныйОстаток as Остаток
Into #ВремОстатки
From $РегистрОстаткиОбороты.ОстаткиТМЦ('20130501','20130514Z',День,,,
			(Номенклатура = '   4VO   '),(Фирма,Склад,Номенклатура),(Количество)) as ОстаткиТМЦ

SELECT ПартииНаличие.Период as Период
	, ПартииНаличие.Фирма [Фирма $Справочник.Фирмы]
	, ПартииНаличие.Склад [Склад $Справочник.Склады]
	, ПартииНаличие.Номенклатура [Номенклатура $Справочник.Номенклатура]
	, Sum(ПартииНаличие.Остаток) as Остаток
FROM (

SELECT CASE WHEN Рег.Период<'20130501' THEN '20130501' ELSE Рег.Период END as Период
	, Рег.Фирма as Фирма
	, Рег.Склад as Склад
	, Рег.Номенклатура
	, Рег.Остаток as Остаток
FROM (
SELECT кросс.день as Период
	, кросс.Фирма as Фирма
	, кросс.Склад as Склад
	, кросс.Номенклатура AS Номенклатура
	, Ост.Остаток AS Остаток
From (Select DISTINCT дни.день
	, Остатки.Фирма as Фирма
	, Остатки.Склад as Склад
	, Остатки.Номенклатура AS Номенклатура
	From (
		select dateadd(day,(a.number+b.number*256),CAST('20130501' as DateTime)) as день
		from master..spt_values a, master..spt_values b
		where a.type='P' and b.type='P'
		    and b.number<=datediff(day,CAST('20130501' as DateTime),CAST('20130514' as DateTime))/256
		    and a.number<=(datediff(day,CAST('20130501' as DateTime),CAST('20130514' as DateTime))-b.number*256)
		) as дни
	CROSS JOIN #ВремОстатки as Остатки
	) as Кросс
	LEFT JOIN (Select об1.Период as ДатаС
		, MIN(CASE WHEN об2.Период Is NULL THEN DATEADD(day,1,CAST('20130514' as DateTime)) ELSE DATEADD(day,-1,об2.Период) END) as ДатаПо
		, об1.Остаток as Остаток
	, об1.Фирма as Фирма
	, об1.Склад as Склад
	, об1.Номенклатура
		From #ВремОстатки об1
			LEFT JOIN #ВремОстатки об2 on об1.Период < об2.Период
Group By об1.Период,об1.Остаток,об1.Фирма,об1.Склад,об1.Номенклатура
) as Ост on кросс.день BETWEEN Ост.ДатаС AND Ост.ДатаПо AND кросс.Фирма = Ост.Фирма AND кросс.Склад = Ост.Склад AND кросс.Номенклатура = Ост.Номенклатура
Where Ост.Остаток <> 0

	) as Рег
) as ПартииНаличие
GROUP BY клатура
ORDER BY 1
глРС.ВыполнитьИнструкцию(ТекстЗапроса,ИТЗ);
{D:\TEMP\АНАЛИЗ ТМЦ ПО ПЕРИОДАМ.ERT(482)}: State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'Фирма'. 




P.S. А можно это переписать без временной таблицы?
P.P.S.  Или как написать чтобы остатки ТМЦ были по выбранному периоду (день и т.п.) в выбранных разрезах?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите разобраться с глюком!
Ответ #24 - 14. Мая 2013 :: 09:30
Печать  
У тя случаем, фирма не реквизит регистра ?
Улыбка

По-отдельности запросы выполняются ?
вот этот хотя бы ?

SELECT ОстаткиТМЦ.Период as Период
     , ОстаткиТМЦ.Фирма as Фирма
     , ОстаткиТМЦ.Склад as Склад
     , ОстаткиТМЦ.Номенклатура AS Номенклатура
     , ОстаткиТМЦ.КоличествоКонечныйОстаток as Остаток
Into #ВремОстатки
From $РегистрОстаткиОбороты.ОстаткиТМЦ('20130501','20130514Z',День,,,
                 (Номенклатура = '   4VO   '),(Фирма,Склад,Номенклатура),(Количество)) as ОстаткиТМЦ
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите разобраться с глюком!
Ответ #25 - 14. Мая 2013 :: 09:33
Печать  
И это, ты не мой код же выполняешь!!!!!!!!!!!!!!!

скопируй целиком с форума и помести его в текстЗапроса как есть
  
Наверх
 
IP записан
 
Alex37
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #26 - 14. Мая 2013 :: 09:35
Печать  
Eprst писал(а) 14. Мая 2013 :: 09:30:
У тя случаем, фирма не реквизит регистра ?
Улыбка

По-отдельности запросы выполняются ?


все же измерение Улыбка

Код
Выбрать все
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
ID=OBJECT_ID('tempdb..#ВремОстатки') AND sysstat & 0xf = 3 )
DROP TABLE #ВремОстатки

SELECT ОстаткиТМЦ.Период as Период
, ОстаткиТМЦ.Фирма as Фирма
, ОстаткиТМЦ.Склад as Склад
, ОстаткиТМЦ.Номенклатура AS Номенклатура
, ОстаткиТМЦ.КоличествоКонечныйОстаток as Остаток
Into #ВремОстатки
From #TC48D4DA6378F414FA73472934D7774A5 as ОстаткиТМЦ

select *  from #ВремОстатки
 


прекрасно выполняется
  
Наверх
 
IP записан
 
Alex37
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #27 - 14. Мая 2013 :: 09:41
Печать  
Eprst писал(а) 14. Мая 2013 :: 09:33:
И это, ты не мой код же выполняешь!!!!!!!!!!!!!!!

скопируй целиком с форума и помести его в текстЗапроса как есть

Сработало! Я очень прошу прощения.

Вот только в первый раз я все же вроде просто скопировал...
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите разобраться с глюком!
Ответ #28 - 14. Мая 2013 :: 09:45
Печать  
Ага.. баян значится (это я про метапарсер)

Убирай табуляцию из текста запроса и наслаждайся, можешь даже так сделать:

ТекстЗапроса = СтрЗаменить(ТекстЗапроса,СимволТабуляции," ");
  
Наверх
 
IP записан
 
Alex37
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #29 - 14. Мая 2013 :: 09:51
Печать  
Eprst писал(а) 14. Мая 2013 :: 09:45:
Ага.. баян значится (это я про метапарсер)

Обалдеть!!! Вы гений, я уже всю голову сломал за несколько дней.... Спасибо, теперь можно работать дальше.

  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Помогите разобраться с глюком!
Ответ #30 - 14. Мая 2013 :: 10:18
Печать  
Eprst писал(а) 14. Мая 2013 :: 09:45:
Ага.. баян значится (это я про метапарсер)



А, чо-чо?
Есть запись в багтрекере (или подробное описание, как и когда проявляется)?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите разобраться с глюком!
Ответ #31 - 14. Мая 2013 :: 10:27
Печать  
Да вроде есть, этому приколу сто лет в обед, то исправили его, то он опять появляется. Не любит метапарсер символы табуляции в тексте запроса.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Помогите разобраться с глюком!
Ответ #32 - 14. Мая 2013 :: 10:45
Печать  
Стрянно

у меня все всюду форматируется табляциями - и норм все
хотя... я виртуальный таблицы не использую - у меня для этого есть свой функционал в классе ТОтчет.Запрос
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите разобраться с глюком!
Ответ #33 - 14. Мая 2013 :: 10:51
Печать  
Это какой то плавающий глюк, причем, на разных машинах один и тот же текст запроса может не работать.
Да и не простейшем запросе с селектом может не отработать из-за табов
  
Наверх
 
IP записан
 
Alex37
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #34 - 15. Мая 2013 :: 16:26
Печать  
Продолжение истории.
Вот этот текст запроса тоже не отрабатывает
Табуляцию я убрал из текста, вместо него только пробелы. И глюк опять плавающий.
Текст запроса генерируется, я его ещё буду править (сейчас генерируется лишний вложенный запрос), но запрос рабочий.

Вот текст оригинального запроса
Код
Выбрать все
Set NoCount On

IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
ID=OBJECT_ID('tempdb..#ВремОстатки') AND sysstat & 0xf = 3 )
DROP TABLE #ВремОстатки

SELECT CAST('20130501' as DateTime) as Период
   , ОстаткиТМЦ.Номенклатура AS Номенклатура
   , ОстаткиТМЦ.КоличествоКонечныйОстаток  as Остаток
Into #ВремОстатки
From $РегистрОстаткиОбороты.ОстаткиТМЦ('20130501','20130508Z',Период,,,(Номенклатура = '   G7N   '),(Номенклатура),(Количество)) as ОстаткиТМЦ
WHERE ОстаткиТМЦ.КоличествоКонечныйОстаток <> 0

SELECT ПартииНаличие.Период as Период
   , ПартииНаличие.Номенклатура [Номенклатура $Справочник.Номенклатура]
   , Sum(ПартииНаличие.Остаток) as Остаток
FROM (
SELECT CASE WHEN CAST('20130501' as DateTime)<'20130501' THEN '20130501' ELSE CAST('20130501' as DateTime) END as Период
   , Рег.Номенклатура
   , Рег.Остаток as Остаток
FROM (
SELECT кросс.День as Период
   , кросс.Номенклатура AS Номенклатура
   , Ост.Остаток AS Остаток
From (Select DISTINCT дни.dateE as День
   , Остатки.Номенклатура AS Номенклатура
   From #tmp_dates as Дни
   CROSS JOIN #ВремОстатки as Остатки
   ) as Кросс
   LEFT JOIN (Select об1.Период as ДатаС
      , MIN(CASE WHEN об2.Период Is NULL THEN DATEADD(day,1,CAST('20130508' as DateTime)) ELSE DATEADD(day,-1,об2.Период) END) as ДатаПо
      , об1.Остаток as Остаток
   , об1.Номенклатура AS Номенклатура
   From #ВремОстатки об1
      LEFT JOIN #ВремОстатки об2 on об1.Период < об2.Период
Group By об1.Период,об1.Остаток,об1.Номенклатура
) as Ост on кросс.день BETWEEN Ост.ДатаС AND Ост.ДатаПо AND кросс.Номенклатура = Ост.Номенклатура
Where Ост.Остаток <> 0
) as Рег
) as ПартииНаличие
GROUP BY ПартииНаличие.Период,ПартииНаличие.Номенклатура
ORDER BY 1
глРС.ВыполнитьИнструкцию(ТекстЗапроса,ИТЗ);
{\\TSCLIENT\E\1С\АНАЛИЗ ТМЦ ПО ПЕРИОДАМ.ERT(477)}: State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'Номенклатура'. 




Вот он при отладке
Код
Выбрать все
Set NoCount On

IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
ID=OBJECT_ID('tempdb..#ВремОстатки') AND sysstat & 0xf = 3 )
DROP TABLE #ВремОстатки

SELECT CAST('20130501' as DateTime) as Период
   , ОстаткиТМЦ.Номенклатура AS Номенклатура
   , ОстаткиТМЦ.КоличествоКонечныйОстаток  as Остаток
Into #ВремОстатки
From (
select
rb2412_vt.Номенклатура,
sum(rb2412_vt.КоличествоОстаток) as КоличествоНачальныйОстаток,
sum(rb2412_vt.КоличествоПриход) as КоличествоПриход,
sum(rb2412_vt.КоличествоРасход) as КоличествоРасход,
sum(rb2412_vt.КоличествоОстаток) + sum(rb2412_vt.КоличествоПриход) - sum(rb2412_vt.КоличествоРасход) as КоличествоКонечныйОстаток
from (
select
ra2412_vt.sp2406 as Номенклатура,
case when ra2412_vt.debkred = 0 then ra2412_vt.sp2410 else 0 end as КоличествоПриход,
case when ra2412_vt.debkred = 1 then ra2412_vt.sp2410 else 0 end as КоличествоРасход,
0 as КоличествоОстаток
from ra2412 as ra2412_vt (nolock)
inner join _1sjourn as j2412_vt (nolock) on j2412_vt.iddoc = ra2412_vt.iddoc
where j2412_vt.date_time_iddoc > '20130501' and j2412_vt.date_time_iddoc < '20130508AHX3Y8 2PNWY  0'
and j2412_vt.rf2412 = 0x1
and ((ra2412_vt.sp2406 = '   G7N   '))
union all
select
rg2412_vt.sp2406 as Номенклатура,
0,
0,
rg2412_vt.sp2410
from rg2412 as rg2412_vt (nolock)
where rg2412_vt.period={d '2013-04-01'}
and ((rg2412_vt.sp2406 = '   G7N   '))
) as rb2412_vt
group by
rb2412_vt.Номенклатура
having
sum(rb2412_vt.КоличествоОстаток) <> 0 or
sum(rb2412_vt.КоличествоПриход) <> 0 or
sum(rb2412_vt.КоличествоРасход) <> 0 or
sum(rb2412_vt.КоличествоОстаток) + sum(rb2412_vt.КоличествоПриход) - sum(rb2412_vt.КоличествоРасход) <> 0
) as ОстаткиТМЦ
WHERE ОстаткиТМЦ.КоличествоКонечныйОстаток <> 0

SELECT ПартииНаличие.Период as Период
   , ПартииНаличие.Номенклатура [Номенклатура $Справочник.Номенклатура]
   , Sum(ПартииНаличие.Остаток) as Остаток
FROM (
SELECT CASE WHEN CAST('20130501' as DateTime)<'20130501' THEN '20130501' ELSE CAST('20130501' as DateTime) END as Период
   , Рег.Номенклатура
   , Рег.Остаток as Остаток
FROM (
SELECT кросс.День as Период
   , кросс.Номенклатура AS Номенклатура
   , Ост.Остаток AS Остаток
From (Select DISTINCT дни.dateE as День
   , Остатки.Номенклатура AS Номенклатура
   From #tmp_dates as Дни
   CROSS JOIN #ВремОстатки as Остатки
   ) as Кросс
   LEFT JOIN (Select об1.Период as ДатаС
      , MIN(CASE WHEN об2.Период Is NULL THEN DATEADD(day,1,CAST('20130508' as DateTime)) ELSE DATEADD(day,-1,об2.Период) END) as ДатаПо
      , об1.Остаток as Остаток
   , об1.Номенклатура AS Номенклатура
   From #ВремОстатки об1
      LEFT JOIN #ВремОстатки об2 on об1.Период < об2.Период
Group By об1.Период,об1.Остаток,об1.Номенклатура
) as Ост on кросс.день BETWEEN Ост.ДатаС AND Ост.ДатаПо AND кросс.Номенклатура = Ост.Номенклатура
Where Ост.Остаток <> 0
) as Рег
) as ПартииНаличие
GROUP BY ПартииНаличие.Период,ПартииНаличие.Номенклатура
ORDER BY 1
глРС.ВыполнитьИнструкцию(ТекстЗапроса,ИТЗ);
{\\TSCLIENT\E\1С\АНАЛИЗ ТМЦ ПО ПЕРИОДАМ.ERT(477)}: State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'Номенклатура'. 

  
Наверх
 
IP записан
 
Alex37
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #35 - 15. Мая 2013 :: 16:36
Печать  
Результат из Query Anilyzer
Код
Выбрать все
select * from #ВремОстатки 


Колонка Номенклатура там есть
Период                 Номенклатура            Остаток
Код
Выбрать все
2013-05-01 00:00:00.000    G7N   	494.00000	 

  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите разобраться с глюком!
Ответ #36 - 16. Мая 2013 :: 04:58
Печать  
SELECT CASE WHEN CAST('20130501' as DateTime)<'20130501' THEN '20130501' ELSE CAST('20130501' as DateTime) END as Период
   , Рег.Номенклатура as Номенклатура

алиясы везде указывай
  
Наверх
 
IP записан
 
Alex37
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #37 - 16. Мая 2013 :: 06:16
Печать  
Подставил, один раз сработало... Ну а сейчас что ему не хватает?
Код
Выбрать все
Set NoCount On

IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
ID=OBJECT_ID('tempdb..#ВремОстатки') AND sysstat & 0xf = 3 )
DROP TABLE #ВремОстатки

SELECT ОстаткиТМЦ.Период as Период
   , ОстаткиТМЦ.Фирма as Фирма
   , $Номенклатура.ГруппаТовара as ГруппаТМЦ
   , ОстаткиТМЦ.КоличествоКонечныйОстаток  as Остаток
Into #ВремОстатки
From $РегистрОстаткиОбороты.ОстаткиТМЦ('20130101','20130514Z',Месяц,,,(Номенклатура IN (SELECT Val FROM #РеквизитАнализТМЦПоПериодамНоменклатура)),(Фирма,Номенклатура),(Количество)) as ОстаткиТМЦ
   INNER JOIN $Справочник.Номенклатура as Номенклатура ON Номенклатура.ID = ОстаткиТМЦ.Номенклатура
WHERE ОстаткиТМЦ.КоличествоКонечныйОстаток <> 0

SELECT ПартииНаличие.Период as Период
   , ПартииНаличие.Фирма [Фирма $Справочник.Фирмы]
   , ПартииНаличие.ГруппаТМЦ [ГруппаТМЦ $Справочник.ГруппаТовара]
   , Sum(ПартииНаличие.Остаток) as Остаток
FROM (
SELECT CASE WHEN dateadd(day,1-day(Рег.Период),Рег.Период)<'20130101' THEN '20130101' ELSE dateadd(day,1-day(Рег.Период),Рег.Период) END as Период
   , Рег.Фирма as Фирма
   , Рег.ГруппаТМЦ as ГруппаТМЦ
   , Рег.Остаток as Остаток
FROM (
SELECT кросс.День as Период
   , кросс.Фирма as Фирма
   , кросс.ГруппаТМЦ as ГруппаТМЦ
   , Ост.Остаток AS Остаток
From (Select DISTINCT дни.dateE as День
   , Остатки.Фирма as Фирма
   , Остатки.ГруппаТМЦ AS ГруппаТМЦ
   From #tmp_dates as Дни
   CROSS JOIN #ВремОстатки as Остатки
   ) as Кросс
   LEFT JOIN (Select об1.Период as ДатаС
	, MIN(CASE WHEN об2.Период Is NULL THEN DATEADD(day,1,CAST('20130514' as DateTime)) ELSE DATEADD(day,-1,об2.Период) END) as ДатаПо
	, об1.Остаток as Остаток
   , об1.Фирма as Фирма
   , об1.ГруппаТМЦ AS ГруппаТМЦ
   From #ВремОстатки об1
	LEFT JOIN #ВремОстатки об2 on об1.Период < об2.Период
Group By об1.Период,об1.Остаток,об1.Фирма,об1.ГруппаТМЦ
) as Ост on кросс.день BETWEEN Ост.ДатаС AND Ост.ДатаПо AND кросс.Фирма = Ост.Фирма AND кросс.ГруппаТМЦ = Ост.ГруппаТМЦ
Where Ост.Остаток <> 0
) as Рег
) as ПартииНаличие
GROUP BY ПартииНаличие.Период,ПартииНаличие.Фирма,ПартииНаличие.ГруппаТМЦ
ORDER BY 1
глРС.ВыполнитьИнструкцию(ТекстЗапроса,ИТЗ);
{D:\TEMP\АНАЛИЗ ТМЦ ПО ПЕРИОДАМ.ERT(476)}: State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'Фирма'. 

  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Помогите разобраться с глюком!
Ответ #38 - 16. Мая 2013 :: 08:37
Печать  
От табов точно избавился?
ибо, если это досимвольно тот текст запроса, который отдается на исполнение - то табы в нем присутствуют

(например, тут - "      LEFT JOIN #ВремОстатки об2 on об1.Период < об2.Период")
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #39 - 16. Мая 2013 :: 10:04
Печать  
OFF.

Eprst писал(а) 14. Мая 2013 :: 10:51:
Это какой то плавающий глюк, причем, на разных машинах один и тот же текст запроса может не работать.
Да и не простейшем запросе с селектом может не отработать из-за табов

Эмм.. А на пальцах показать можешь? Я к чему спрашиваю - мой конструктор отродясь запросы табами форматировал, а связанных с этим багрепортов я ни разу не получал.  Озадачен
  

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите разобраться с глюком!
Ответ #40 - 16. Мая 2013 :: 10:40
Печать  
Да запросто Улыбка

Код
Выбрать все
	ТекстЗапроса = "
	|select
	|	$Док.Контрагент
	|from  $Документ.Реализация as	Док
	|"; 



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


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #41 - 16. Мая 2013 :: 11:43
Печать  
Satans Claws писал(а) 16. Мая 2013 :: 08:37:
От табов точно избавился?
ибо, если это досимвольно тот текст запроса, который отдается на исполнение - то табы в нем присутствуют

(например, тут - "      LEFT JOIN #ВремОстатки об2 on об1.Период < об2.Период")


Я уже тест на это поставил
Код
Выбрать все
Если СтрЧислоВхождений(ТекстЗапроса,СимволТабуляции) <> 0 Тогда Предупреждение("Застрелись!");
	КонецЕсли;
 



В оригинале там 6 пробелов

P.S. Чуть переделал запрос, вот такой текст сейчас (временно) работает
Код
Выбрать все
Set NoCount On

IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
ID=OBJECT_ID('tempdb..#ВремОстатки') AND sysstat & 0xf = 3 )
DROP TABLE #ВремОстатки

SELECT CAST('20130501' as DateTime) as Период
   , $Номенклатура.ГруппаТовара as ГруппаТМЦ
   , ОстаткиТМЦ.КоличествоКонечныйОстаток  as Остаток
Into #ВремОстатки
From ),(Количество)) as ОстаткиТМЦ
   INNER JOIN $Справочник.Номенклатура as Номенклатура ON Номенклатура.ID = ОстаткиТМЦ.Номенклатура
WHERE ОстаткиТМЦ.КоличествоКонечныйОстаток <> 0

SELECT ПартииНаличие.Период as Период
   , ПартииНаличие.ГруппаТМЦ [ГруппаТМЦ $Справочник.ГруппаТовара]
   , Sum(ПартииНаличие.Остаток) as Остаток
FROM (
SELECT кросс.День as Период
   , кросс.ГруппаТМЦ as ГруппаТМЦ
   , Ост.Остаток AS Остаток
From (Select DISTINCT дни.dateB as День
   , Остатки.ГруппаТМЦ AS ГруппаТМЦ
   From #tmp_dates as Дни
   CROSS JOIN #ВремОстатки as Остатки
   ) as Кросс
   LEFT JOIN (Select об1.Период as ДатаС
	, MIN(CASE WHEN об2.Период Is NULL THEN DATEADD(day,1,CAST('20130516' as DateTime)) ELSE DATEADD(day,-1,об2.Период) END) as ДатаПо
	, об1.Остаток as Остаток
   , об1.ГруппаТМЦ AS ГруппаТМЦ
   From #ВремОстатки об1
	LEFT JOIN #ВремОстатки об2 on об1.Период < об2.Период
Group By об1.Период,об1.Остаток,об1.ГруппаТМЦ
) as Ост on (кросс.день BETWEEN Ост.ДатаС AND Ост.ДатаПо) AND кросс.ГруппаТМЦ = Ост.ГруппаТМЦ
Where Ост.Остаток <> 0
) as ПартииНаличие
GROUP BY ПартииНаличие.Период,ПартииНаличие.ГруппаТМЦ
ORDER BY 1
10.39 сек., 63 строк 



а с заменой одной переменной на другую - нет
Код
Выбрать все
Set NoCount On

IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
ID=OBJECT_ID('tempdb..#ВремОстатки') AND sysstat & 0xf = 3 )
DROP TABLE #ВремОстатки

SELECT CAST('20130501' as DateTime) as Период
   , ОстаткиТМЦ.Склад as Склад
   , ОстаткиТМЦ.КоличествоКонечныйОстаток  as Остаток
Into #ВремОстатки
From чество)) as ОстаткиТМЦ
WHERE ОстаткиТМЦ.КоличествоКонечныйОстаток <> 0

SELECT ПартииНаличие.Период as Период
   , ПартииНаличие.Склад [Склад $Справочник.Склады]
   , Sum(ПартииНаличие.Остаток) as Остаток
FROM (
SELECT кросс.День as Период
   , кросс.Склад as Склад
   , Ост.Остаток AS Остаток
From (Select DISTINCT дни.dateB as День
   , Остатки.Склад as Склад
   From #tmp_dates as Дни
   CROSS JOIN #ВремОстатки as Остатки
   ) as Кросс
   LEFT JOIN (Select об1.Период as ДатаС
	, MIN(CASE WHEN об2.Период Is NULL THEN DATEADD(day,1,CAST('20130516' as DateTime)) ELSE DATEADD(day,-1,об2.Период) END) as ДатаПо
	, об1.Остаток as Остаток
   , об1.Склад as Склад
   From #ВремОстатки об1
	LEFT JOIN #ВремОстатки об2 on об1.Период < об2.Период
Group By об1.Период,об1.Остаток,об1.Склад
) as Ост on (кросс.день BETWEEN Ост.ДатаС AND Ост.ДатаПо) AND кросс.Склад = Ост.Склад
Where Ост.Остаток <> 0
) as ПартииНаличие
GROUP BY ПартииНаличие.Период,ПартииНаличие.Склад
ORDER BY 1
глРС.ВыполнитьИнструкцию(ТекстЗапроса,ИТЗ);
{D:\TEMP\АНАЛИЗ ТМЦ ПО ПЕРИОДАМ.ERT(490)}: State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'Склад'. 

  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите разобраться с глюком!
Ответ #42 - 16. Мая 2013 :: 12:28
Печать  
выполняй кусками по частям
  
Наверх
 
IP записан
 
Alex37
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #43 - 16. Мая 2013 :: 13:16
Печать  
В Query Anilyzer'е запрос выполняется. Я сделал таблицу дат, таблицу остатков и запустил батч
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите разобраться с глюком!
Ответ #44 - 16. Мая 2013 :: 13:54
Печать  
ну не знаю, раздели запросы через ; что ли..
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Помогите разобраться с глюком!
Ответ #45 - 17. Мая 2013 :: 08:27
Печать  
Eprst писал(а) 16. Мая 2013 :: 10:40:
Да запросто Улыбка

Код
Выбрать все
	ТекстЗапроса = "
	|select
	|	$Док.Контрагент
	|from  $Документ.Реализация as	Док
	|"; 



если после as во фроме будет стоять таб, усё.. метапарсер не видит псевдоним таблички



а-а-а-а
ну, это сильно извращенно, ибо а) использовать таб в качестве разделителя у алиасов - это ж надо догадаться и б) кроме как для табличного поля as не является обязательным - вот и не пишется нигде Улыбка
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите разобраться с глюком!
Ответ #46 - 17. Мая 2013 :: 08:33
Печать  
Да не вопрос, так тоже будет ошибка:

Код
Выбрать все
	ТекстЗапроса = "
	|select
	|	$Док.Контрагент
	|from  $Документ.Реализация	Док
	|"; 

  
Наверх
 
IP записан
 
Alex37
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #47 - 18. Мая 2013 :: 07:58
Печать  
У меня по ходу что-то не так с временными таблицами, конкретно с заполнением их INSERT INTO и просто INTO. Я их практически почти не использую на работе, обхожусь как-то вложенными запросами...
Я начал писать другой вариант запроса, но походу смысла нет.
Вот несколько вариантов выполнения запроса

1. Не отработал
Код
Выбрать все
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
ID=OBJECT_ID('tempdb..#tmp') AND sysstat & 0xf = 3 )
DROP TABLE #tmp
CREATE TABLE #tmp (
   Период          datetime      DEFAULT '17530101' NOT NULL
   , ГруппаТМЦ           char(9)       DEFAULT '     0   '  NOT NULL
   , Остаток         numeric(19,5) DEFAULT 0          NOT NULL
UNIQUE CLUSTERED (Период,Остаток,ГруппаТМЦ))
INSERT INTO #tmp
SELECT ОстаткиТМЦ.Период as Период
   , Номенклатура.sp11470 as ГруппаТМЦ
   , ОстаткиТМЦ.КоличествоКонечныйОстаток  as Остаток
From #T66016D8B3FF64D1D8B0C35DCD0DCB250 as ОстаткиТМЦ
   INNER JOIN sc335 as Номенклатура ON Номенклатура.ID = ОстаткиТМЦ.Номенклатура
WHERE ОстаткиТМЦ.КоличествоКонечныйОстаток <> 0
select * from #tmp
глРС.ВыполнитьИнструкцию(ТекстЗапроса,ИТЗ);
{\\TSCLIENT\E\1С\АНАЛИЗ ТМЦ ПО ПЕРИОДАМ.ERT(542)}: State HY007, native 0, message [Microsoft][ODBC SQL Server Driver]Связанная инструкция не подготовлена 



2. Выдает пустые данные, в Query Analyzer есть данные
Код
Выбрать все
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
ID=OBJECT_ID('tempdb..#tmp') AND sysstat & 0xf = 3 )
DROP TABLE #tmp
CREATE TABLE #tmp (
   Период          datetime      DEFAULT '17530101' NOT NULL
   , Фирма           char(9)       DEFAULT '     0   '  NOT NULL
   , Остаток         numeric(19,5) DEFAULT 0          NOT NULL
UNIQUE CLUSTERED (Период,Остаток,Фирма))
INSERT INTO #tmp
SELECT ОстаткиТМЦ.Период as Период
   , ОстаткиТМЦ.Фирма as Фирма
   , ОстаткиТМЦ.КоличествоКонечныйОстаток  as Остаток
From #T928C5CD84A624468A4BA630720281EFB as ОстаткиТМЦ
WHERE ОстаткиТМЦ.КоличествоКонечныйОстаток <> 0
select * from #tmp
1.77 сек., 0 строк 



3. Не отрабатывает
Код
Выбрать все
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
ID=OBJECT_ID('tempdb..#tmp') AND sysstat & 0xf = 3 )
DROP TABLE #tmp
CREATE TABLE #tmp (
   Период          datetime      DEFAULT '17530101' NOT NULL
   , Склад           char(9)       DEFAULT '     0   '  NOT NULL
   , ГруппаТМЦ           char(9)       DEFAULT '     0   '  NOT NULL
   , Остаток         numeric(19,5) DEFAULT 0          NOT NULL
UNIQUE CLUSTERED (Период,Остаток,Склад,ГруппаТМЦ))
INSERT INTO #tmp
SELECT ОстаткиТМЦ.Период as Период
   , ОстаткиТМЦ.Склад as Склад
   , Номенклатура.sp11470 as ГруппаТМЦ
   , ОстаткиТМЦ.КоличествоКонечныйОстаток  as Остаток
From #T20C18217C4D147F8BB71D0ABB9B1140C as ОстаткиТМЦ
   INNER JOIN sc335 as Номенклатура ON Номенклатура.ID = ОстаткиТМЦ.Номенклатура
WHERE ОстаткиТМЦ.КоличествоКонечныйОстаток <> 0
select * from #tmp
глРС.ВыполнитьИнструкцию(ТекстЗапроса,ИТЗ);
{\\TSCLIENT\E\1С\АНАЛИЗ ТМЦ ПО ПЕРИОДАМ.ERT(542)}: State 21S01, native 213, message [Microsoft][ODBC SQL Server Driver][SQL Server]Insert Error: Column name or number of supplied values does not match table definition. 



4. По номенклатура - опять пустые данные
Код
Выбрать все
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
ID=OBJECT_ID('tempdb..#tmp') AND sysstat & 0xf = 3 )
DROP TABLE #tmp
CREATE TABLE #tmp (
   Период          datetime      DEFAULT '17530101' NOT NULL
   , Номенклатура           char(9)       DEFAULT '     0   '  NOT NULL
   , Остаток         numeric(19,5) DEFAULT 0          NOT NULL
UNIQUE CLUSTERED (Период,Остаток,Номенклатура))
INSERT INTO #tmp
SELECT CAST('20130501' as DateTime) as Период
   , ОстаткиТМЦ.Номенклатура AS Номенклатура
   , ОстаткиТМЦ.КоличествоКонечныйОстаток  as Остаток
From (
select
rb2412_vt.Номенклатура,
sum(rb2412_vt.КоличествоОстаток) as КоличествоНачальныйОстаток,
sum(rb2412_vt.КоличествоПриход) as КоличествоПриход,
sum(rb2412_vt.КоличествоРасход) as КоличествоРасход,
sum(rb2412_vt.КоличествоОстаток) + sum(rb2412_vt.КоличествоПриход) - sum(rb2412_vt.КоличествоРасход) as КоличествоКонечныйОстаток
from (
select
ra2412_vt.sp2406 as Номенклатура,
case when ra2412_vt.debkred = 0 then ra2412_vt.sp2410 else 0 end as КоличествоПриход,
case when ra2412_vt.debkred = 1 then ra2412_vt.sp2410 else 0 end as КоличествоРасход,
0 as КоличествоОстаток
from ra2412 as ra2412_vt (nolock)
inner join _1sjourn as j2412_vt (nolock) on j2412_vt.iddoc = ra2412_vt.iddoc
where j2412_vt.date_time_iddoc > '20130501' and j2412_vt.date_time_iddoc < '20130508AHX3Y8 2PNWY  0'
and j2412_vt.rf2412 = 0x1
union all
select
rg2412_vt.sp2406 as Номенклатура,
0,
0,
rg2412_vt.sp2410
from rg2412 as rg2412_vt (nolock)
where rg2412_vt.period={d '2013-04-01'}
) as rb2412_vt
group by
rb2412_vt.Номенклатура
having
sum(rb2412_vt.КоличествоОстаток) <> 0 or
sum(rb2412_vt.КоличествоПриход) <> 0 or
sum(rb2412_vt.КоличествоРасход) <> 0 or
sum(rb2412_vt.КоличествоОстаток) + sum(rb2412_vt.КоличествоПриход) - sum(rb2412_vt.КоличествоРасход) <> 0
) as ОстаткиТМЦ
WHERE ОстаткиТМЦ.КоличествоКонечныйОстаток <> 0
select * from #tmp
1.83 сек., 0 строк
 



Вопрос на засыпку: можно ли написать запрос с остатками по периодами / разными группировкам без заполнения в отчете временных таблиц, только вложенными запросами? Таблицы из УложитьСписокОбъектов принимаются на ура...

P.S. Позже попробую разбить на части, выполнить запрос с ВТ ОстаткиОбороты, затем создать временную таблицу и отдельным запросом её заполнить чтоли...
« Последняя редакция: 18. Мая 2013 :: 19:04 - Alex37 »  
Наверх
 
IP записан
 
Alex37
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #48 - 18. Мая 2013 :: 19:14
Печать  
Вопрос на засыпку снимается, в итоге я добился своего, разбив все на части:
1) создал таблицу периодов
2) создал таблицу продаж
Код
Выбрать все
CREATE TABLE #tmp (
   Период          datetime      DEFAULT '17530101' NOT NULL
   , Фирма           char(9)       DEFAULT $ПустойИд  NOT NULL
   , Склад           char(9)       DEFAULT $ПустойИд  NOT NULL
   , ГруппаТМЦ           char(9)       DEFAULT $ПустойИд  NOT NULL
   , Остаток         numeric(19,5) DEFAULT 0          NOT NULL
UNIQUE CLUSTERED (Период,Остаток,Фирма,Склад,ГруппаТМЦ)) 


3) выполнил запрос ОстаткиОбороты в ТЗ
Код
Выбрать все
SELECT ОстаткиТМЦ.Период as Период
   , ОстаткиТМЦ.Фирма as Фирма
   , ОстаткиТМЦ.Склад as Склад
   , $Номенклатура.ГруппаТовара as ГруппаТМЦ
   , ОстаткиТМЦ.КоличествоКонечныйОстаток  as Остаток
From оменклатура),(Количество)) as ОстаткиТМЦ
   INNER JOIN $Справочник.Номенклатура as Номенклатура ON Номенклатура.ID = ОстаткиТМЦ.Номенклатура
WHERE ОстаткиТМЦ.КоличествоКонечныйОстаток <> 0 


4) заполнил через параметризированный запрос временную таблицу
Код
Выбрать все
insert into #tmp(Период,Фирма,Склад,ГруппаТМЦ,Остаток)
select ?  Период
   , ?  Фирма
   , ?  Склад
   , ?  ГруппаТМЦ
   , ?  Остаток 


5) ну и уже получение остатков по дням
Код
Выбрать все
Set NoCount On
SELECT ПартииНаличие.Период as Период
   , ПартииНаличие.Фирма [Фирма $Справочник.Фирмы]
   , ПартииНаличие.Склад [Склад $Справочник.Склады]
   , ПартииНаличие.ГруппаТМЦ [ГруппаТМЦ $Справочник.ГруппаТовара]
   , Sum(ПартииНаличие.Остаток) as Остаток
FROM (
SELECT кросс.День as Период
   , кросс.Фирма as Фирма
   , кросс.Склад as Склад
   , кросс.ГруппаТМЦ as ГруппаТМЦ
   , Ост.Остаток AS Остаток
FROM (
Select DISTINCT дни.dateB as День
   , Остатки.Фирма as Фирма
   , Остатки.Склад as Склад
   , Остатки.ГруппаТМЦ AS ГруппаТМЦ
   From #tmp_dates as Дни
   CROSS JOIN #tmp as Остатки
   ) as Кросс
   LEFT JOIN (Select об1.Период as ДатаС
      , MIN(CASE WHEN об2.Период Is NULL THEN DATEADD(day,1,CAST('20130508' as DateTime)) ELSE DATEADD(day,-1,об2.Период) END) as ДатаПо
      , об1.Остаток as Остаток
   , об1.Фирма as Фирма
   , об1.Склад as Склад
   , об1.ГруппаТМЦ AS ГруппаТМЦ
   From #tmp об1
      LEFT JOIN #tmp об2 on об1.Период < об2.Период
Group By об1.Период,об1.Остаток,об1.Фирма,об1.Склад,об1.ГруппаТМЦ
) as Ост on (кросс.день BETWEEN Ост.ДатаС AND Ост.ДатаПо) AND кросс.Фирма = Ост.Фирма AND кросс.Склад = Ост.Склад AND кросс.ГруппаТМЦ = Ост.ГруппаТМЦ
Where Ост.Остаток <> 0
) as ПартииНаличие
GROUP BY аТМЦ
ORDER BY 1 

  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Помогите разобраться с глюком!
Ответ #49 - 20. Мая 2013 :: 03:48
Печать  
Код
Выбрать все
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
ID=OBJECT_ID('tempdb..#tmp') AND sysstat & 0xf = 3 )
DROP TABLE #tmp 



И это...
вместо таких извращений есть более удобный способ работы - именовать временные таблицы ГУИДами и дропать их сразу, как только они становятся не нужны

А даже если запрос (точнее, пакет) схлопнулся по ошибке и таблица не дропнулась - ничего особо страшного нет: за счет гуидования используемых имен на следующий запрос она не повлияет, а при завершения коннекта скуль сам их дропнет.
  
Наверх
 
IP записан
 
Alex37
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 23
Зарегистрирован: 13. Мая 2013
Пол: Мужской
Re: Помогите разобраться с глюком!
Ответ #50 - 20. Мая 2013 :: 06:34
Печать  
Satans Claws писал(а) 20. Мая 2013 :: 03:48:
именовать временные таблицы ГУИДами и дропать их сразу, как только они становятся не нужны

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