Переключение на Главную Страницу Страницы: 1 2 3 [4]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Помогите разобраться с глюком! (число прочтений - 15037 )
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 2 3 [4] 
ОтправитьПечать