Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Помогите с запросом! (число прочтений - 3581 )
U_zer
Экс-Участник


Помогите с запросом!
21. Ноября 2013 :: 06:46
Печать  
Всем привет!
База dbf класс - ПрямойЗапрос, но не суть ...
Есть запрос:
Код
Выбрать все
|Выбрать
	|$j.ДатаДокумента [Дни $дата],
	|$ДокЗак.ТекущийДокумент [ДокЗак $Документ.ЗаявкаПокупателя],
	|$ДокР.ТекущийДокумент [ДокР $Документ.Реализация],
	|$Вып.ТекущийДокумент [ДокВып $Документ.СтрокаВыпискиПриход],
	|$Пко.ТекущийДокумент [ДокПко $Документ.ПКО],
	|$ДокЗак.Контрагент [Клиент $Справочник.Контрагенты],
	|$j.НомерДокумента [НомВх $Строка],
	|isNull($ДокЗак.Сумма,0) [СуммаДок $число],
	|isNull($Вып.Сумма,0) [СуммаВып $число],
	|isNull($Пко.Сумма,0) [СуммаПко $число]
	|Из ЖурналДокументов j $nolock
	|ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаявкаПокупателя ДокЗак $nolock ПО ДокЗак.iddoc = j.iddoc
	|ЛЕВОЕ СОЕДИНЕНИЕ Документ.Реализация ДокР $nolock ПО ПРАВО($ДокР.ДокОснование,9) = ДокЗак.iddoc И $ДокР.Контрагент = $ДокЗак.Контрагент
	|ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПКО Пко $nolock ПО ПРАВО($Пко.ДокОснование,9) = ДокР.iddoc И $Пко.Контрагент = $ДокЗак.Контрагент
	|ЛЕВОЕ СОЕДИНЕНИЕ Документ.СтрокаВыпискиПриход Вып $nolock ПО (ПРАВО($Вып.ДокОснование,9) = ДокЗак.iddoc ИЛИ ПРАВО($Вып.ДокОснование,9) = ДокР.iddoc) И ($Вып.Контрагент = $ДокЗак.Контрагент Или $Вып.Контрагент = $ДокР.Контрагент)
	|Где $j.ДатаДокумента МЕЖДУ :ДатаНач И :ДатаКон~ И j.Closed = 1 "+?(ВыбКлиент.Выбран() = 1," И $ДокЗак.Контрагент = :ВыбКл","")+"
 



Результат:
кл  докзаказ1 Отгр1  Опл1
кл  докзаказ1 Отгр1  Опл2
кл  докзаказ1 Отгр2  Опл1
кл  докзаказ1 Отгр2  Опл2

А мне надо:

кл  докзаказ1 Отгр1  Опл1
кл  докзаказ1 Отгр2  Опл2

Помогите!
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с запросом!
Ответ #1 - 21. Ноября 2013 :: 07:26
Печать  
SELECT DISTINCT
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Помогите с запросом!
Ответ #2 - 21. Ноября 2013 :: 08:30
Печать  
Не помогает.

Поясню, может быть такая ситуация:

ДокЗак ->ДокРасх1
           ->ДокРасх2
           ->ДокОпл1
           ->ДокОпл2

т. е 4 документа подчинены 1.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с запросом!
Ответ #3 - 21. Ноября 2013 :: 09:07
Печать  
Т.е, вторую оплату надо выкинуть ?
Улыбка)))

Как ты из этого
Цитата:
кл  докзаказ1 Отгр1  Опл1
кл  докзаказ1 Отгр1  Опл2


делаешь это ?

Цитата:
кл  докзаказ1 Отгр1  Опл1


на Опл2 фиолетово ?
Тогда выбирай из максимума или через top 1 оплат
  
Наверх
 
IP записан
 
U_zer
Экс-Участник


Re: Помогите с запросом!
Ответ #4 - 21. Ноября 2013 :: 09:55
Печать  
Eprst писал(а) 21. Ноября 2013 :: 09:07:
Т.е, вторую оплату надо выкинуть ?
Улыбка)))

Как ты из этого
Цитата:
кл  докзаказ1 Отгр1  Опл1
кл  докзаказ1 Отгр1  Опл2


делаешь это ?

Цитата:
кл  докзаказ1 Отгр1  Опл1


на Опл2 фиолетово ?
Тогда выбирай из максимума или через top 1 оплат


Нет!

Я же написал как было:

кл  докзаказ1 Отгр1  Опл1
кл  докзаказ1 Отгр1  Опл2
кл  докзаказ1 Отгр2  Опл1
кл  докзаказ1 Отгр2  Опл2

А нужно:
кл  докзаказ1 Отгр1  Опл1
кл  докзаказ1 Отгр2  Опл2
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с запросом!
Ответ #5 - 21. Ноября 2013 :: 11:45
Печать  
Улыбка))))))))

еще раз посмотри, что ты пишешь.
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Помогите с запросом!
Ответ #6 - 21. Ноября 2013 :: 11:57
Печать  
Угу... явно озвучь правило, по которому из 4-х строк получается 2. Тогда уже можно будет говорить об алгоритме.
  
Наверх
ICQ  
IP записан
 
U_zer
Экс-Участник


Re: Помогите с запросом!
Ответ #7 - 22. Ноября 2013 :: 06:38
Печать  
Нужно чтобы в результат включались все различные оплаты и различные отгрузки.

Если у документа заявки одна отгрузка и одна оплата -
получается правильно, одна строка типа:

ДокЗаказ -> докОтгр -> докОпл.

Если же у документа заказ несколько подчиненных отгрузок и оплат, получается:

докзаказ1 Отгр1  Опл1
докзаказ1 Отгр1  Опл2
докзаказ1 Отгр2  Опл1
докзаказ1 Отгр2  Опл2

А нужно
докзаказ1 Отгр1  Опл1
докзаказ1 Отгр2  Опл2

потому что для заказа было 2 оплаты и 2 отгрузки,
иначе сумма по отгрузкам и оплатам увеличивается.

Так понятно?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с запросом!
Ответ #8 - 22. Ноября 2013 :: 07:39
Печать  
Нет


ЗЫ:
По какому правилу, ты исключил
докзаказ1 Отгр1  Опл2
и
докзаказ1 Отгр2  Опл1 ?
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Помогите с запросом!
Ответ #9 - 22. Ноября 2013 :: 10:14
Печать  
А что, если для двух отгрузок будет лишь одна оплата? А если две отгрузки и 4 оплаты?
  
Наверх
ICQ  
IP записан
 
U_zer
Экс-Участник


Re: Помогите с запросом!
Ответ #10 - 22. Ноября 2013 :: 10:23
Печать  
Salimbek писал(а) 22. Ноября 2013 :: 10:14:
А что, если для двух отгрузок будет лишь одна оплата? А если две отгрузки и 4 оплаты?


Да пофиг!
Оплаты к отгрузкам не привязаны, а привязаны к заказам.
Если для 2-х отгрузок будет 1 оплата, то будет:

ДокЗаказ - Отгрузка1 - Оплата1
ДокЗаказ - Отгрузка2

Если 2 отгрузки и 4 оплаты, то:

ДокЗаказ - Отгрузка1 - Оплата1
ДокЗаказ - Отгрузка2 - Оплата2
ДокЗаказ -  - Оплата3
ДокЗаказ -  - Оплата4
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Помогите с запросом!
Ответ #11 - 25. Ноября 2013 :: 03:10
Печать  
Начну с того, что в селект-листе запроса 10 колонок, а в "результат - мне надо" - всего 4.
И лично я не могу даже идентифицировать, какими из 10 эти 4 являются.

Далее, как уже верно заметили, правил (скажем так - стандартных) уменьшения количества строк в выборке не так уж и много - групбай сильно разгуляться не даст.

Соответственно, если колонки Отгр и Опл числовые - то видимо, тебя интересует sum() по ни.
Если это документы - то (select top 1 from ... order by <нужные тебе критерии>) в общем случае или max()/min() в частном.
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Помогите с запросом!
Ответ #12 - 25. Ноября 2013 :: 04:26
Печать  
Цитата:
Да пофиг!
Оплаты к отгрузкам не привязаны, а привязаны к заказам.
Если для 2-х отгрузок будет 1 оплата, то будет:

ДокЗаказ - Отгрузка1 - Оплата1
ДокЗаказ - Отгрузка2

Если 2 отгрузки и 4 оплаты, то:

ДокЗаказ - Отгрузка1 - Оплата1
ДокЗаказ - Отгрузка2 - Оплата2
ДокЗаказ -  - Оплата3
ДокЗаказ -  - Оплата4

Хм... Я задумался над одним вариантом, однако он у тебя в посте (0) расписан. Если так не срабатывает, то попробуй как-нибудь так:
Код
Выбрать все
select
ДокЗаказ
,Отгрузка
,Оплата
FROM
(select
ДокЗаказ
,Отгрузка
FROM
ЖурналЗаказов
ЛЕВОЕ СОЕДИНЕНИЕ
ЖурналОтгрузок ПО ДокЗаказ=Док) КАК ПерваяЧасть
ЛЕВОЕ СОЕДИНЕНИЕ
ЖурналОплат ПО ДокЗаказ=Док 

  
Наверх
ICQ  
IP записан
 
U_zer
Экс-Участник


Re: Помогите с запросом!
Ответ #13 - 25. Ноября 2013 :: 06:12
Печать  
Тупо сделал так:

Код
Выбрать все
Если Док.ВыбратьПодчиненныеДокументы(НачДата,КонДата,тДокПр.ДокЗак)>0 Тогда
	Пока Док.ПолучитьДокумент() = 1 Цикл
		Если Док.Проведен() = 0 Тогда
			Продолжить;
		КонецЕсли;
		Если Док.Вид() = "СтрокаВыпискиПриход" Тогда
			Если ТабОпл.НайтиЗначение("ДокВып", Док.ТекущийДокумент())<=0 Тогда
				ТабОпл.ВыбратьСтроки(); Ф = 0;
				Пока ТабОпл.ПолучитьСтроку() = 1 Цикл
					Если (ТабОпл.ДокПко.Выбран() = 1) Или (ТабОпл.ДокВып.Выбран() = 1) Тогда
						Продолжить;
					Иначе
						Ф = 1;
						Прервать;
					КонецЕсли;
				КонецЦикла;
				Если Ф = 0 Тогда
					ТабОпл.НоваяСтрока();
					ТабОпл.ДокР = ПолучитьПустоеЗначение("Документ.Реализация");
					ТабОпл.СуммаР = 0;
				КонецЕсли;
				ТабОпл.ДокВып = Док.ТекущийДокумент();
				ТабОпл.ДокПко = ПолучитьПустоеЗначение("Документ.ПКО");
				ТабОпл.СуммаВып = Док.Сумма;
				ТабОпл.СуммаПко = 0;
			КонецЕсли;
		ИначеЕсли Док.Вид() = "Реализация" Тогда
			Если ТабОпл.НайтиЗначение("ДокР", Док.ТекущийДокумент())<=0 Тогда
				ТабОпл.НоваяСтрока();
				ТабОпл.ДокВып = ПолучитьПустоеЗначение("Документ.СтрокаВыпискиПриход");
				ТабОпл.ДокПко = ПолучитьПустоеЗначение("Документ.ПКО");
				ТабОпл.ДокР = Док.ТекущийДокумент();
				ТабОпл.СуммаР = Док.Итог("Сумма");
				ТабОпл.СуммаВып = 0;
				ТабОпл.СуммаПко = 0;
				Если Док1.ВыбратьПодчиненныеДокументы(НачДата,КонДата,Док.ТекущийДокумент())>0 Тогда
					Пока Док1.ПолучитьДокумент() = 1 Цикл
						Если Док1.Вид() = "СтрокаВыпискиПриход" Тогда
							Если ТабОпл.НайтиЗначение("ДокВып", Док1.ТекущийДокумент())<=0 Тогда
								ТабОпл.ВыбратьСтроки(); Ф = 0;
								Пока ТабОпл.ПолучитьСтроку() = 1 Цикл
									Если (ТабОпл.ДокПко.Выбран() = 1) Или (ТабОпл.ДокВып.Выбран() = 1) Тогда
										Продолжить;
									Иначе
										Ф = 1;
										Прервать;
									КонецЕсли;
								КонецЦикла;
								Если Ф = 0 Тогда
									ТабОпл.НоваяСтрока();
									ТабОпл.ДокР = ПолучитьПустоеЗначение("Документ.Реализация");
									ТабОпл.СуммаР = 0;
								КонецЕсли;
								ТабОпл.ДокВып = Док1.ТекущийДокумент();
								ТабОпл.СуммаВып = Док1.Сумма;
								ТабОпл.ДокПко = ПолучитьПустоеЗначение("Документ.ПКО");
								ТабОпл.СуммаПко = 0
							КонецЕсли;
						ИначеЕсли Док1.Вид() = "ПКО" Тогда
							Если ТабОпл.НайтиЗначение("ДокПко", Док1.ТекущийДокумент())<=0 Тогда
								ТабОпл.ВыбратьСтроки(); Ф = 0;
								Пока ТабОпл.ПолучитьСтроку() = 1 Цикл
									Если (ТабОпл.ДокПко.Выбран() = 1) Или (ТабОпл.ДокВып.Выбран() = 1) Тогда
										Продолжить;
									Иначе
										Ф = 1;
										Прервать;
									КонецЕсли;
								КонецЦикла;
								Если Ф = 0 Тогда
									ТабОпл.НоваяСтрока();
									ТабОпл.ДокР = ПолучитьПустоеЗначение("Документ.Реализация");
									ТабОпл.СуммаР = 0;
								КонецЕсли;
								ТабОпл.ДокПко = Док1.ТекущийДокумент();
								ТабОпл.СуммаПко = Док1.Сумма;
								ТабОпл.ДокВып = ПолучитьПустоеЗначение("Документ.СтрокаВыпискиПриход");
								ТабОпл.СуммаВып = 0
							КонецЕсли;
						КонецЕсли;
					КонецЦикла;
				КонецЕсли;

			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
КонецЕсли;
 



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