Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Виртуальная таблица остатков и оборотов (число прочтений - 7500 )
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Виртуальная таблица остатков и оборотов
28. Февраля 2008 :: 12:56
Печать  
Следующий запрос через виртуальную таблицу остатков и оборотов не может работать по причине того, что IDDocDef не понятен для SQL

Код
Выбрать все
	Зпр = СоздатьОбъект("ODBCRecordset");
	Зпр.УстановитьТекстовыйПараметр("НачПериода", ВыбНачПериода);
	Зпр.УстановитьТекстовыйПараметр("КонПериода", ВыбКонПериода);
	//{ПрямойЗапрос
	ТекстЗ = "
	|SELECT
	|	Reg.Магазин as [Магазин $Справочник.МестаХранения],
	|	Reg.Товар as [Товар $Справочник.Номенклатура],
	|	Tovr.Descr as НаимТов,
	|	$Tovr.Артикул as Артикул,
	|	$Tovr.ХолдКод as ХолдКод,
	|	Reg.ОстатокТовараНачальныйОстаток as НачОст,
	|	Reg.ОстатокТовараРасход as РасхКол,
	|	Reg.ОстатокТовараКонечныйОстаток as КонОст,
	|	Reg.ПродСтоимостьРасход as РасхСум
	|
	|FROM
	|   $РегистрОстаткиОбороты.ТоварыВМагазине(:НачПериода, :КонПериода~, "+?(флПоНеделям=1,"Неделя, Движения","Период,")+",
	|
	|		LEFT JOIN $Справочник.Номенклатура as Tov ON Товар = Tov.ID,
	|		IDDocDef = $ВидДокумента.ОтчетКассовойСмены
	|			and Магазин IN (SELECT Val From #SMag)
	|			and Tov.ID IN (SELECT Val From #Stov),
	|		(Магазин,Товар), (ОстатокТовара, ПродСтоимость)) as Reg,
	|	_1sjourn as Jurn,
	|	$Справочник.Номенклатура as Tovr
	|WHERE
	|	Reg.Товар = Tovr.ID
	//|		and Jurn.IDDocDef = $ВидДокумента.ОтчетКассовойСмены
	|
	|GROUP BY
	|	Reg.Товар, Tovr.Descr, $Tovr.Артикул, $Tovr.ХолдКод, Reg.Магазин
	|"//}прямойЗАПРОС
	;
	Зпр.УложитьСписокОбъектов(СписМагазин,"#SMag");
	Зпр.УложитьСписокОбъектов(СписМагазин,"#Stov","Номенклатура");
	Зпр.Отладка(1);
	Зпр.ВыполнитьИнструкцию(ТекстЗ,ТЗ); 



а как было бы здорово, если бы виртуальная таблица имела еще 1 параметр - фильтр по виду документа.

А может быть кто-то подскажет другое решение - я в тупике...
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Виртуальная таблица остатков и оборотов
Ответ #1 - 29. Февраля 2008 :: 04:45
Печать  
Попробую подсказать. Но жизнь тебе это не упростит  Улыбка

Прежде чем писать прямые запросы неплохо бы как минимум а) разобраться на базовом уровне с языком SQL; б) разобраться с тем, как 1С хранит данные в своей базе (http://metaprog.co.ua/secrprog). ;
Виртуальные таблицы - это конечно замечательно, но всё же лучше понимать, что они там у себя внутре делают.

Ответ мальца иезуитский, согласен.  Но читать про фильтры по реквизитам в виртуальной таблице остатков уже подзадолбало.
  
Наверх
 
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Виртуальная таблица остатков и оборотов
Ответ #2 - 29. Февраля 2008 :: 06:04
Печать  
ADirks писал(а) 29. Февраля 2008 :: 04:45:
Попробую подсказать. Но жизнь тебе это не упростит  Улыбка

Прежде чем писать прямые запросы неплохо бы как минимум а) разобраться на базовом уровне с языком SQL; б) разобраться с тем, как 1С хранит данные в своей базе (http://metaprog.co.ua/secrprog).  


С языком Скуля я четно говоря профан, но со структурой таблиц я разбирался, когда пришлось писать отчет прямыми запросами, отлаживал которые в Артизане. Но времени на написание прямыми запросами уходит гораздо больше, нежели с использованием 1С++, да и работают они только в разделенном режиме отдельной сессией, и некоторые типы данных, которые возвращает ОЛЯ, непонятны для 1Сины, из-за чего приходилось дополнительно конвертировать их в запросе.
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Виртуальная таблица остатков и оборотов
Ответ #3 - 29. Февраля 2008 :: 06:10
Печать  
sml писал(а) 29. Февраля 2008 :: 06:04:
С языком Скуля я четно говоря профан, но со структурой таблиц я разбирался, когда пришлось писать отчет прямыми запросами, отлаживал которые в Артизане. Но времени на написание прямыми запросами уходит гораздо больше, нежели с использованием 1С++, да и работают они только в разделенном режиме отдельной сессией, и некоторые типы данных, которые возвращает ОЛЯ, непонятны для 1Сины, из-за чего приходилось дополнительно конвертировать их в запросе.


Не путай теплое с мягким. То, что ты написал в (0) и есть прямой запрос. Просто, разработчки 1С++ взяли на себя часть твоей работы и скрыли кусок запроса, запихав его в компоненту.
Прислушайся к ADirks-у и почитай описание T-SQL. Без этого нечего даже и браться за написание запросов - вопросы и проблемы начнут появляться на ровном месте...
  
Наверх
 
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Виртуальная таблица остатков и оборотов
Ответ #4 - 29. Февраля 2008 :: 09:07
Печать  
sadovnikov писал(а) 29. Февраля 2008 :: 06:10:
Прислушайся к ADirks-у и почитай описание T-SQL. Без этого нечего даже и браться за написание запросов - вопросы и проблемы начнут появляться на ровном месте...


а где лучше почитать, если не трудно, дайте ссылку.

и все же ткните носом, что не так (в результате дает пустую ТЗ):

Код
Выбрать все
	Зпр.УстановитьТекстовыйПараметр("НачПериода", ВыбНачПериода);
	Зпр.УстановитьТекстовыйПараметр("КонПериода", ВыбКонПериода);
	//{ПрямойЗапрос
	ТекстЗ = "
	|SELECT
	|	Max(Reg.ВидДокумента) as Док_вид,
	|	Reg.Магазин as [Магазин $Справочник.МестаХранения],
	|	Reg.Товар as [Товар $Справочник.Номенклатура],
	|	Tovr.Descr as НаимТов,
	|	$Tovr.Артикул as Артикул,
	|	$Tovr.ХолдКод as ХолдКод,
	|	sum(Reg.ОстатокТовараНачальныйОстаток) as НачОст,
	|	sum(Reg.ОстатокТовараРасход) as РасхКол,
	|	sum(Reg.ОстатокТовараКонечныйОстаток) as КонОст,
	|	sum(Reg.ПродСтоимостьРасход) as РасхСум
	|
	|FROM
	|   $РегистрОстаткиОбороты.ТоварыВМагазине(:НачПериода, :КонПериода~, Документ, Движения,
	|
	|		LEFT JOIN $Справочник.Номенклатура as Tov ON Товар = Tov.ID,
	|			Магазин IN (SELECT Val From #SMag) and
	|			Tov.ID IN (SELECT Val From #Stov),
	|		(Магазин,Товар), (ОстатокТовара, ПродСтоимость)) as Reg
	|INNER JOIN
	|	$Справочник.Номенклатура as Tovr ON Reg.Товар = Tovr.ID
	|WHERE
	|
	|	Reg.ВидДокумента = $ВидДокумента.ОтчетКассовойСмены
	|
	|GROUP BY
	|	Reg.Товар, Tovr.Descr, $Tovr.Артикул, $Tovr.ХолдКод, Reg.Магазин
	|"//}прямойЗАПРОС
	;
	Зпр.УложитьСписокОбъектов(СписМагазин,"#SMag");
	Зпр.УложитьСписокОбъектов(СписМагазин,"#Stov","Номенклатура");
	Зпр.Отладка(1);
	ТЗ = СоздатьОбъект("ТаблицаЗначений"); 



я прально понимаю, ТЗ - это 1Сая таблица значений?
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Виртуальная таблица остатков и оборотов
Ответ #5 - 29. Февраля 2008 :: 09:11
Печать  
А где само выполнения запроса-то?
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Виртуальная таблица остатков и оборотов
Ответ #6 - 29. Февраля 2008 :: 09:35
Печать  
sml писал(а) 29. Февраля 2008 :: 09:07:
Код
Выбрать все
	Зпр.УложитьСписокОбъектов(СписМагазин,"#SMag");
	Зпр.УложитьСписокОбъектов(СписМагазин,"#Stov","Номенклатура"); 


  

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


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Виртуальная таблица остатков и оборотов
Ответ #7 - 29. Февраля 2008 :: 10:01
Печать  
berezdetsky писал(а) 29. Февраля 2008 :: 09:35:
sml писал(а) 29. Февраля 2008 :: 09:07:
Код
Выбрать все
	Зпр.УложитьСписокОбъектов(СписМагазин,"#SMag");
	Зпр.УложитьСписокОбъектов(СписМагазин,"#Stov","Номенклатура"); 




вот, лажанулся, спасибки
  
Наверх
 
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Виртуальная таблица остатков и оборотов
Ответ #8 - 05. Марта 2008 :: 08:21
Печать  
Код
Выбрать все
SELECT
	Tr.ГрпТов as [ГрпТов $Справочник.Номенклатура],
	Tr.НаимТов,
	Tr.Артикул as Артикул,
	Tr.ХолдКод as ХолдКод,
	Tr.Штрихкод as Штрихкод,
	Tr.Магазин,
	Tr.НаимМаг ,
	Tr.НачОст,
	Tr.РасхКол,
	Tr.КонОст,
	Tr.РасхСум
FROM
(SELECT
	WS.Магазин,
	WS.НаимМаг,
	WW.Товар,
	Выб.НачОст,
	Выб.РасхКол,
	Выб.КонОст,
	Выб.РасхСум,
	WW.ГрпТов,
	WW.НаимТов,
	WW.Артикул,
	WW.ХолдКод,
	WW.Штрихкод

FROM
(SELECT  DISTINCT
	Skl.Descr as НаимМаг,
	RegM.Магазин as Магазин
FROM
   #TC44EDFB15537417DB0869A49C4374922 as RegM
	, sc31 as Skl
WHERE	RegM.ВидДокумента = 6179
		and skl.ID = RegM.Магазин
) as WS,

(SELECT  DISTINCT
	RegT.Товар as Товар,
	Tovr.PARENTID as ГрпТов,
	Tovr.Descr as НаимТов,
	Tovr.sp3752 as Артикул,
	Tovr.sp6394 as ХолдКод,
	Tovr.sp3559 as Штрихкод
FROM
   #T6930CF8F5C254E5AB3834BB8AAA841D6 as RegT
INNER JOIN
	sc33 as Tovr ON RegT.Товар = Tovr.ID
	WHERE	Tovr.ID IN (SELECT Val From #Stov)
		AND RegT.ВидДокумента = 6179
) as WW
LEFT JOIN
 (SELECT
	Max(Reg.ВидДокумента) as Док_вид,
	Reg.Магазин as Магазин,
	Reg.Товар as Товар,
	sum(Reg.ОстатокТовараНачальныйОстаток) as НачОст,
	sum(Reg.ОстатокТовараРасход) as РасхКол,
	sum(Reg.ОстатокТовараКонечныйОстаток) as КонОст,
	sum(Reg.ПродСтоимостьРасход) as РасхСум
FROM
   #T977D7DC332984B49A3A65A9204001B11 as Reg
WHERE	Reg.ВидДокумента = 6179

GROUP BY
	Reg.Товар, Reg.Магазин
) as Выб
  ON  WS.Магазин = Выб.Магазин AND WW.Товар = Выб.Товар
) as Tr

ORDER BY
	Tr.ГрпТов, Tr.НаимТов, Tr.НаимМаг  


скуль выдает ошибку:
State 42000, native 107, message [Microsoft][ODBC SQL Server Driver][SQL Server]The column prefix 'WS' does not match with a table name or alias name used

что может быть не так??? Поможите, пожалуйста.

И еще вопрос: Можно ли как-то получить запрос целиком (с учетом подзапросов, формирующих виртуальные таблицы остатков), чтобы можно было скопировать запрос для отладки из 1С, напр., в DB Artizan, который хоть строку с ошибкой показывает.
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Виртуальная таблица остатков и оборотов
Ответ #9 - 05. Марта 2008 :: 10:14
Печать  
Связывание WW нормально пропиши. Не хороший тон использовать в одном запросе Join и связывание с использованием просто запятой. Вот скуль тебя и не понял.
И задай нормальные алиасы...
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Виртуальная таблица остатков и оборотов
Ответ #10 - 05. Марта 2008 :: 10:15
Печать  
sml писал(а) 05. Марта 2008 :: 08:21:
И еще вопрос: Можно ли как-то получить запрос целиком (с учетом подзапросов, формирующих виртуальные таблицы остатков), чтобы можно было скопировать запрос для отладки из 1С, напр., в DB Artizan, который хоть строку с ошибкой показывает.


Включи отладку. Или посмотри в профилере.
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Виртуальная таблица остатков и оборотов
Ответ #11 - 05. Марта 2008 :: 10:43
Печать  
>>DB Artizan
Что это?  Ужас
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Виртуальная таблица остатков и оборотов
Ответ #12 - 05. Марта 2008 :: 10:45
Печать  
Цитата:
>>DB Artizan
Что это?  Ужас


http://www.embarcadero.com/products/dbartisan/
  
Наверх
 
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: Виртуальная таблица остатков и оборотов
Ответ #13 - 05. Марта 2008 :: 10:49
Печать  
sadovnikov писал(а) 05. Марта 2008 :: 10:14:
Связывание WW нормально пропиши. Не хороший тон использовать в одном запросе Join и связывание с использованием просто запятой. Вот скуль тебя и не понял.
И задай нормальные алиасы...


те же яйца, тока вид сбоку:
Код
Выбрать все
 SELECT
	Магаз.Магазин,
	Магаз.НаимМаг,
	Номен.Товар,
	Выб.НачОст,
	Выб.РасхКол,
	Выб.КонОст,
	Выб.РасхСум,
	Номен.ГрпТов,
	Номен.НаимТов,
	Номен.Артикул,
	Номен.ХолдКод,
	Номен.Штрихкод

FROM
(SELECT  DISTINCT
	Skl.Descr as НаимМаг,
	RegM.Магазин as Магазин
FROM
   #T77F6AA80FBB44946B8973EBE24983C8D as RegM
 INNER JOIN	 sc31 as Skl
	ON skl.ID = RegM.Магазин
 WHERE	RegM.ВидДокумента = 6179
) as Магаз ,
(
SELECT  DISTINCT
	RegT.Товар as Товар,
	Tovr.PARENTID as ГрпТов,
	Tovr.Descr as НаимТов,
	Tovr.sp3752 as Артикул,
	Tovr.sp6394 as ХолдКод,
	Tovr.sp3559 as Штрихкод
FROM
   #T5A3EF36223C14AC3AAB02909843AEFA9 as RegT
INNER JOIN
	sc33 as Tovr ON RegT.Товар = Tovr.ID
	WHERE	Tovr.ID IN (SELECT Val From #Stov)
) as Номен
LEFT JOIN
 (SELECT
	Max(Reg.ВидДокумента) as Док_вид,
	Reg.Магазин as Магазин,
	Reg.Товар as Товар,
	sum(Reg.ОстатокТовараНачальныйОстаток) as НачОст,
	sum(Reg.ОстатокТовараРасход) as РасхКол,
	sum(Reg.ОстатокТовараКонечныйОстаток) as КонОст,
	sum(Reg.ПродСтоимостьРасход) as РасхСум
FROM
   #T084FDCEBEBBE414E93AD78A960544411 as Reg
WHERE	Reg.ВидДокумента = 6179

GROUP BY
	Reg.Товар, Reg.Магазин
) as Выб
  ON  Магаз.Магазин = Выб.Магазин AND Номен.Товар = Выб.Товар


The column prefix 'Магаз' does not match with a table name or alias name used in the query. 



кстати, все 3 вложенных запроса по отдельности работают на ура
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Виртуальная таблица остатков и оборотов
Ответ #14 - 05. Марта 2008 :: 10:52
Печать  
Это ты так связывание переписал?
Вот это что такое?:

Код
Выбрать все
) as Магаз ,
(
SELECT  DISTINCT
 



Именно этот кусок я имел ввиду.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать