Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Запрос: кривые руки али не тот подход? (число прочтений - 3422 )
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2344
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Запрос: кривые руки али не тот подход?
07. Августа 2006 :: 15:03
Печать  
Вобщем такая задачка:
Торг 8.7.....
Надо проверить правильно ли распределяются ГТД при оприходовании товаров в рег-ре "ПатрииТоваров"
Соотв-но приходуются они доком-приходная накладная, но хранятся в док-те "регистрация чсета-фактуры"
Итак запрос:
Код
Выбрать все
		|SELECT DISTINCT
		|   ДокРегСчФ.IDDoc as [СамДокРСчф $Документ.РегистрацияСчета_Фактуры]
		|   , Jrn.IdDoc as [СамДокОснования $Документ]
		|   , Jrn.IdDocDef as СамДокОснования_вид
		|   , COALESCE(SUBSTRING($ДокРегСчФ_с.Товар,7,9),$Рег_ПартииТоваров.Товар) as [Товар $Справочник.Номенклатура]
		|   , COALESCE($Рег_ПартииТоваров.ГТД,$ДокРегСчФ_с.ГТД) as [ГТД $Справочник.ГТД]
		|--   , COALESCE($Рег_ПартииТоваров.ГТД,$ДокРегСчФ_с.ГТД) as ГТД2
		|   , $Рег_ПартииТоваров.ОстатокТовара as РАсход
		|   , ($ДокРегСчФ_с.Количество * $ДокРегСчФ_с.Коэффициент) as КолДок
		|--   , SUM($Рег_ПартииТоваров.ОстатокТовара) as РАсход
		|
		|FROM    
		|   $Документ.РегистрацияСчета_Фактуры as ДокРегСчФ
		|   left JOIN _1SJOURN as Jrn on (Jrn.IdDoc = RIGHT($ДокРегСчФ.ДокументОснование,9))
		|   left JOIN $ДокументСтроки.РегистрацияСчета_Фактуры as ДокРегСчФ_с on (ДокРегСчФ.IdDoc = ДокРегСчФ_с.IdDoc)
		|   left JOIN $Регистр.ПартииТоваров as Рег_ПартииТоваров on (Рег_ПартииТоваров.IdDoc = Jrn.IdDoc)
		|WHERE
		|   $Рег_ПартииТоваров.Товар = SUBSTRING($ДокРегСчФ_с.Товар,7,9)
		|   AND $Рег_ПартииТоваров.Фирма = Jrn.$ОбщийРеквизит.Фирма
		|   AND $Рег_ПартииТоваров.ОстатокТовара<>($ДокРегСчФ_с.Количество * $ДокРегСчФ_с.Коэффициент)
		|	AND SUBSTRING($ДокРегСчФ_с.Товар,7,9)<>'     0   '
		|    AND $ДокРегСчФ_с.ГТД <>'     0   '
		|	AND $ДокРегСчФ.ДокументОснование <>'   0     0   '
		|
		|ORDER BY ДокРегСчФ.IDDoc, Jrn.IdDoc
		|

 


вопрос: правильна ли технология запроса данных или надо было подругому? Кривовато он как-то отрабатывает в некоторых случаях....
Тут составная группировка требуется по совокупности строки (СЧФ+Приходная) как её сбацать?
PS: ЗАМУЧАЛ ОН МЕНЯ......
  
Наверх
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос: кривые руки али не тот подход?
Ответ #1 - 07. Августа 2006 :: 15:42
Печать  
"Кривовато" отрабатывает, когда есть счет-фактура и нет приходной накладной?
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2344
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос: кривые руки али не тот подход?
Ответ #2 - 07. Августа 2006 :: 16:12
Печать  
berezdetsky писал(а) 07. Августа 2006 :: 15:42:
"Кривовато" отрабатывает, когда есть счет-фактура и нет приходной накладной?

Где то раядом, но не уверен где...
Надо принцыпы "сложения" где нить посмотреть...
  
Наверх
IP записан
 
DrACe
1c++ donor
1c++ power user
Отсутствует


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос: кривые руки али не тот подход?
Ответ #3 - 08. Августа 2006 :: 04:20
Печать  
ОФФ: вчера вечером дома, на модеме я начал писать ответ в эту тему, просидев минут 20, долбая клавишами, нажал кнопку "Отправить" и... О, Ужас!!! модем отвалился, а Internet Explorer злорадно сказал, что мол невозможно отобразить страницу... все, что накропал погибло... Смущённый я, поматерив всех геев и гейтцев, пошел спать...

итак, для начала - что ты хочешь выяснить этим запросом? Я так понял - тебе нужно увидеть соответствие Количества Товара-ГТД в разрезе счетов-фактур и накладных двумя запросами: по Фактурам и по Регистру (фактически оприходовано). Если это так, то это все таки - 2 запроса, их можно попытаться соединить так, как пробовал ты, но по опыту знаю, запрос, где есть слово DISTINCT и требуются количественные показатели до добра не доводит - значит будем объединять! Например так:
Код
Выбрать все
	ТекстЗапроса = "
		|SELECT
		|	Подзапрос.Товар				as [Товар $Справочник.Номенклатура],
		|	Подзапрос.ГТД				as [ГТД $Справочник.ГТД],
		|	Подзапрос.Фактура				as [СамДокРСчф $Документ.РегистрацияСчета_Фактуры],
		|	Подзапрос.Накладная			as [СамДокОснования $Документ.Накладная],
		|	SUM(Подзапрос.КоличествоСчФ)		as КолДок,
		|	SUM(Подзапрос.КоличествоРег)		as РАсход
		|FROM (
		|	SELECT
		|		SUBSTRING($ДокРегСчФ_с.Товар,7,9)			AS Товар,
		|		$ДокРегСчФ_с.ГТД					AS ГТД,
		|		ДокРегСчФ_с.IdDoc					AS Фактура,
		|		RIGHT($ДокРегСчФ.ДокументОснование,9)			AS Накладная,
		|		($ДокРегСчФ_с.Количество * $ДокРегСчФ_с.Коэффициент)	AS КоличествоСчФ,
		|		0			AS КоличествоРег
		|	FROM $ДокументСтроки.РегистрацияСчета_Фактуры as ДокРегСчФ_с
		|		INNER JOIN $Документ.РегистрацияСчета_Фактуры as ДокРегСчФ on (ДокРегСчФ.IdDoc = ДокРегСчФ_с.IdDoc)
		|
		|	UNION ALL
		|
		|	SELECT
		|		$Рег_ПартииТоваров.Товар			AS Товар,
		|		$Рег_ПартииТоваров.ГТД				AS ГТД,
		|		ДокРегСчФ.IdDoc					AS Фактура,
		|		Рег_ПартииТоваров.IdDoc				AS Накладная,
		|		0									AS КоличествоСчФ,
		|		$Рег_ПартииТоваров.ОстатокТовара				AS КоличествоРег
		|	FROM $Регистр.ПартииТоваров as Рег_ПартииТоваров (NOLOCK)
		|		LEFT JOIN $Документ.РегистрацияСчета_Фактуры as ДокРегСчФ on (Рег_ПартииТоваров.IdDoc = RIGHT($ДокРегСчФ.ДокументОснование,9))
		|	) AS Подзапрос
		|GROUP BY
		|	Подзапрос.Товар,
		|	Подзапрос.ГТД,
		|	Подзапрос.Фактура,
		|	Подзапрос.Накладная
		|	";
 



Можно и по-другому совсем написать, но мне кажется, что нужно именно объединять, так как соединение многие ко многим (ведь здесь табличные части) может приводить к дублированию количества, IMHO

PS так и не разобрался, как правильно табуляцией выравнивать код - в 1Се все нормально, на форуме - лесенка-чудесенка... Нерешительный
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос: кривые руки али не тот подход?
Ответ #4 - 08. Августа 2006 :: 08:43
Печать  
trdm писал(а) 07. Августа 2006 :: 16:12:
berezdetsky писал(а) 07. Августа 2006 :: 15:42:
"Кривовато" отрабатывает, когда есть счет-фактура и нет приходной накладной?

Где то раядом, но не уверен где...
Надо принцыпы "сложения" где нить посмотреть...

На сколько я понимаю твою секцию WHERE, все твои LEFT JOIN плавно превращаются в INNER (имеется ввиду результат запроса, а не порядок выбора таблиц). Соответственно, при отсутствии приходной накладной счет-фактуру ты не увидишь. Это так и задумано? Ну или выбрось всё и последуй совету DrAce.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2344
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос: кривые руки али не тот подход?
Ответ #5 - 08. Августа 2006 :: 09:04
Печать  
berezdetsky писал(а) 08. Августа 2006 :: 08:43:
Соответственно, при отсутствии приходной накладной счет-фактуру ты не увидишь. Это так и задумано? Ну или выбрось всё и последуй совету DrAce.

Конечно, тут связь жесткая данные по распределению партий по ГТД в накладной берутся из счета-фактуры.
DrAce Biiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiig thankssssssssssssss ....
Уже последовал (полуокончательный вариант...):
Код
Выбрать все
 SELECT
	 Номенклатура.Descr as Naimen,
	 Подзапрос.Товар				as [Товар $Справочник.Номенклатура],
	 Подзапрос.ГТД				as [ГТД $Справочник.ГТД],
	 Подзапрос.Фактура				as [СамДокРСчф $Документ.РегистрацияСчета_Фактуры],
	 JRN.IdDocDef			 as СамДокОснования_вид ,
	 Подзапрос.Накладная			as [СамДокОснования $Документ],
	 SUM(Подзапрос.КоличествоСчФ)		as КолДок,
	 SUM(Подзапрос.КоличествоРег)		as РАсход
 FROM (
	 SELECT
		 SUBSTRING($ДокРегСчФ_с.Товар,7,9)			AS Товар,
		 $ДокРегСчФ_с.ГТД					AS ГТД,
		 ДокРегСчФ_с.IdDoc					AS Фактура,
		 RIGHT($ДокРегСчФ.ДокументОснование,9)			AS Накладная,
		 ($ДокРегСчФ_с.Количество * $ДокРегСчФ_с.Коэффициент)	AS КоличествоСчФ,
		 0			AS КоличествоРег
	 FROM $ДокументСтроки.РегистрацияСчета_Фактуры as ДокРегСчФ_с
		 INNER JOIN $Документ.РегистрацияСчета_Фактуры as ДокРегСчФ on (ДокРегСчФ.IdDoc = ДокРегСчФ_с.IdDoc)
	 WHERE
		RIGHT($ДокРегСчФ.ДокументОснование,9)<>'     0   '
		AND $ДокРегСчФ_с.ГТД<>'     0   '
		AND $ДокРегСчФ.ДокументОснование <> '   0     0   '
	 UNION ALL

	 SELECT
		 $Рег_ПартииТоваров.Товар    AS Товар,
		 $Рег_ПартииТоваров.ГТД    AS ГТД,
		 ДокРегСчФ.IdDoc	     AS Фактура,
		 Рег_ПартииТоваров.IdDoc   AS Накладная,
		 0									AS КоличествоСчФ,
		 $Рег_ПартииТоваров.ОстатокТовара				AS КоличествоРег
	 FROM $Регистр.ПартииТоваров as Рег_ПартииТоваров (NOLOCK)
		 LEFT JOIN $Документ.РегистрацияСчета_Фактуры as ДокРегСчФ on (Рег_ПартииТоваров.IdDoc = RIGHT($ДокРегСчФ.ДокументОснование,9))
	 WHERE
		$Рег_ПартииТоваров.ГТД<>'     0   '
		AND Рег_ПартииТоваров.DEBKRED = 0
		AND $ДокРегСчФ.ДокументОснование <>'     0   '
	 ) AS Подзапрос
	 LEFT JOIN _1SJOURN AS JRN on (Подзапрос.Накладная = JRN.IdDoc)
	 LEFT JOIN $Справочник.Номенклатура AS Номенклатура on (Номенклатура.ID = Подзапрос.Товар)

 GROUP BY
	 Номенклатура.Descr,
	 Подзапрос.Товар,
	 Подзапрос.ГТД,
	 Подзапрос.Фактура,
	 Подзапрос.Накладная,
	 JRN.IdDocDef
--WHERE	  Подзапрос.Фактура<>'     0   '
HAVING
	 SUM(Подзапрос.КоличествоСчФ)<>    SUM(Подзапрос.КоличествоРег)
 


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



Сообщений: 2344
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос: кривые руки али не тот подход?
Ответ #6 - 08. Августа 2006 :: 09:08
Печать  
Тут еще правда вариант со вводом партий товаров, но там все достаточно просто и проверить легко..
А по запросам мне еще тренироваться, тренироваться и тренироваться........
  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать