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



Сообщений: 66
Местоположение: Москва
Зарегистрирован: 17. Июля 2007
Пол: Мужской
Помогите с запросом.
17. Июля 2007 :: 12:20
Печать  
Мой 1 запрос с использованием 1CPP:
     "|SELECT
     |ВВВЭксОС.ИнвНомер as [Инвном],
     |ВВВЭксОС.ОС as [Осср],
     |(ТбПостОС.Цена*1.18) as [Цена],
     |ТбПостОС.Контр as [Пост],
     |ТбПостОС.Догов as [Догпост],
     |ТбПостОС.ПостДата as [Дата]
     |FROM
     |$Документ.ВводВЭксплуатациюОС as ВВЭксОС
     |INNER JOIN
     |(
     |SELECT
     |$ДокСтПОС.Цена as Цена,
     |ДСтр.Контрагент as Контр,
     |ДСтр.Договор as Догов,
     |СпрОбСтрой.ID as ИдСпрОбСтрой,
     |ДСтр.ДатаПост as ПостДата
     |FROM    
     | $ДокументСтроки.ПоступлениеОС as ДокСтПОС
     |INNER JOIN  
     |$Справочник.ОбъектыСтроительства as СпрОбСтрой ON СпрОбСтрой.ID = $ДокСтПОС.ОбъектВнеоборотныхАктивов  
     |INNER JOIN
     |(
     |SELECT
     |СпрКонт.descr as Контрагент,
     |СпрДог.descr as Договор,
     |ДокПОС.IDDoc as ИДДокПОС,
     |$ДокПОС.ДатаДокВходящий as ДатаПост
     |FROM    
     | $Документ.ПоступлениеОС as ДокПОС
     |INNER JOIN  
     |$Справочник.Контрагенты as СпрКонт ON СпрКонт.ID = $ДокПОС.Контрагент  
     |INNER JOIN
     |  _1SJourn as Жур ON Жур.IDDoc = ДокПОС.IDDoc and
     |                     Жур.Date_Time_IDDoc BETWEEN  :НачДата AND :КонДата~ and
     |                     Жур.Closed & 1 = 1
     |INNER JOIN
     |$Справочник.Договоры as СпрДог ON СпрДог.ID = $ДокПОС.Договор
     | ) as ДСтр ON ДСтр.ИДДокПОС = ДокСтПОС.IDDoc
     |) as ТбПостОС ON ТбПостОС.ИдСпрОбСтрой=$ВВЭксОС.ОбъектВнеоборотныхАктивов
     |INNER JOIN
     |(
     |SELECT
     |СпрОС.code as ИнвНомер,
     |СпрОС.descr as ОС,
     |ДокСтВВОС.IDDoc as ИДДокСтВВОС
     |FROM    
     | $ДокументСтроки.ВводВЭксплуатациюОС as ДокСтВВОС
     |INNER JOIN  
     |$Справочник.ОсновныеСредства as СпрОС ON СпрОС.ID = $ДокСтВВОС.ОсновноеСредство  
     |INNER JOIN
     |  _1SJourn as Жур ON Жур.IDDoc = ДокСтВВОС.IDDoc and
     |                     Жур.Date_Time_IDDoc BETWEEN  :НачДата AND :КонДата~ and
     |                     Жур.Closed & 1 = 1
     |WHERE
     |$ДокСтВВОС.ОсновноеСредство IN (SELECT val FROM #Группа)
     |) as ВВВЭксОС ON ВВВЭксОС.ИДДокСтВВОС=ВВЭксОС.IDDoc
     |ORDER BY    [Инвном]
     |"//}}ЗАПРОС
1. Работает, но если отбирать по одному "основному средству", а оно через документ "ввод в эксплуатацию" соответствует элементу справочника "Объекты внеоборотных активов", а тот в свою очередь используется в 2(более 1) документах "ввод в эксплуатацию" т.е. соответствует 2(более 1) элементам справочника ОС то в отчете возникает задвоение. Инвном, Осср повторяется 2 (или больше) раз одинаковые по строчкам, а остальных ячейках выводятся данные из документов "Приобретение ОС" в которых участвует элемент справочника "Объекты внеоборотных активов".
Как это избежать? что не так?
2. Можно ли было написать покороче запрос?
Уважаемые, помогите разобраться!
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Помогите с запросом.
Ответ #1 - 17. Июля 2007 :: 13:30
Печать  
Для первого запроса это просто мегажесть!
Аж передернуло!

По сабжу:
Необходимо дополнительно условие в связи ON имхо
  

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



Сообщений: 66
Местоположение: Москва
Зарегистрирован: 17. Июля 2007
Пол: Мужской
Re: Помогите с запросом.
Ответ #2 - 18. Июля 2007 :: 08:49
Печать  
Попробывал через сравнение даты поступления и даты ввода в эксплуатацию, но бывает что 1 и тот же элемент справочника Внеоборотных активов по документам поступил несколько раз и тогда опять не получается. Плачущий
Вобщем вопрос: как точно идентифицировать всю цепочку от документа поступления до документа ввода в эксплуатацию? Озадачен
  
Наверх
 
IP записан
 
Berck
Junior Member
**
Отсутствует



Сообщений: 66
Местоположение: Москва
Зарегистрирован: 17. Июля 2007
Пол: Мужской
Re: Помогите с запросом.
Ответ #3 - 18. Июля 2007 :: 08:50
Печать  
Цитата:
Необходимо дополнительно условие в связи ON имхо

А поподробнее?
Что условия нехватает это понятно- но какого?
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Помогите с запросом.
Ответ #4 - 18. Июля 2007 :: 08:58
Печать  
Не проникся сабжем, извини
Нарисуй цепочку на бумажке и подумай
Как из многих выбрать одно, чем оно отличается и как связано
  

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



Сообщений: 66
Местоположение: Москва
Зарегистрирован: 17. Июля 2007
Пол: Мужской
Re: Помогите с запросом.
Ответ #5 - 18. Июля 2007 :: 09:36
Печать  
А можно как то отобрать последнюю строчку из задвоившихся? Озадачен
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Помогите с запросом.
Ответ #6 - 18. Июля 2007 :: 10:16
Печать  
Berck писал(а) 18. Июля 2007 :: 09:36:
А можно как то отобрать последнюю строчку из задвоившихся? Озадачен


GROUP BY НужныеПоляЧерезЗапятую. Числовые поля можно сохранять через MAX

Но лучше GROUP BY применять на стадии до соединения.

P.S> И почему везде INNER JOIN? По сравнению с LEFT JOIN как правило сильно медленнее.
  
Наверх
 
IP записан
 
Berck
Junior Member
**
Отсутствует



Сообщений: 66
Местоположение: Москва
Зарегистрирован: 17. Июля 2007
Пол: Мужской
Re: Помогите с запросом.
Ответ #7 - 18. Июля 2007 :: 10:54
Печать  
kiruha писал(а) 18. Июля 2007 :: 10:16:
P.S> И почему везде INNER JOIN? По сравнению с LEFT JOIN как правило сильно медленнее.

Мне нужны только соответствующие строчки из каждой таблицы - итак задвоение. Улыбка

group by не получается. выдает тоже самое. В строке то кроме Инвентарного номера и наименования - все разное.
« Последняя редакция: 18. Июля 2007 :: 11:55 - Berck »  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите с запросом.
Ответ #8 - 18. Июля 2007 :: 12:57
Печать  
Berck писал(а) 18. Июля 2007 :: 09:36:
А можно как то отобрать последнюю строчку из задвоившихся? Озадачен

И результат при этом будет соответствовать действительности?  Подмигивание

А про "покороче запрос" - попробуй
Код
Выбрать все
SELECT
	СпрОС.CODE as [Инвном],
	СпрОС.DESCR as [Осср],
	($ДокСтПОС.Цена*1.18) as [Цена],
	СпрКонт.descr as [Пост],
	СпрДог.descr as [Догпост],
	$ДокПОС.ДатаДокВходящий as [Дата]
FROM
	$ДокументСтроки.ПоступлениеОС as ДокСтПОС
	INNER JOIN $Документ.ВводВЭксплуатациюОС as ВВЭксОС ON $ВВЭксОС.ОбъектВнеоборотныхАктивов = $ДокСтПОС.ОбъектВнеоборотныхАктивов
	INNER JOIN $Документ.ПоступлениеОС as ДокПОС ON ДокПОС.IDDoc = ДокСтПОС.IDDoc
	INNER JOIN $Справочник.Контрагенты as СпрКонт ON СпрКонт.ID = $ДокПОС.Контрагент
	INNER JOIN _1SJourn as ЖурДокПОС ON ЖурДокПОС.IDDoc = ДокПОС.IDDoc
	INNER JOIN $Справочник.Договоры as СпрДог ON СпрДог.ID = $ДокПОС.Договор
	INNER JOIN $ДокументСтроки.ВводВЭксплуатациюОС as ДокСтВВОС ON ДокСтВВОС.IDDoc = ВВЭксОС.IDDoc
	INNER JOIN $Справочник.ОсновныеСредства as СпрОС ON СпрОС.ID = $ДокСтВВОС.ОсновноеСредство
	INNER JOIN _1SJourn as ЖурДокСтВВОС ON ЖурДокСтВВОС.IDDoc = ДокСтВВОС.IDDoc
WHERE
	(ЖурДокПОС.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)
	AND (ЖурДокПОС.Closed & 1 = 1)
	AND (ЖурДокСтВВОС.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)
	AND (ЖурДокСтВВОС.Closed & 1 = 1)
	AND ($ДокСтВВОС.ОсновноеСредство IN (SELECT val FROM #Группа))
ORDER BY СпрОС.CODE 

  

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



Сообщений: 66
Местоположение: Москва
Зарегистрирован: 17. Июля 2007
Пол: Мужской
Re: Помогите с запросом.
Ответ #9 - 18. Июля 2007 :: 14:17
Печать  
Спасибо!
Оказывается как все красиво может быть - коли умеючи. Круглые глаза

-И результат при этом будет соответствовать действительности?
Есть дата ввода в эксплуатацию - есть дата поставки.
Время (дата) поставки максимально близкая к дате ввода и будет правильной, т.е. относится к искомому ОС.


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


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите с запросом.
Ответ #10 - 18. Июля 2007 :: 15:03
Печать  
Berck писал(а) 18. Июля 2007 :: 14:17:
Есть дата ввода в эксплуатацию - есть дата поставки.
Время (дата) поставки максимально близкая к дате ввода и будет правильной, т.е. относится к искомому ОС.

ok. Есть две разных даты поставки и одна дата ввода в эксплуатацию - оба ОС ввели в эксплуатацию в один день. При такой постановке отчет по обоим ОС выдаст одинаковые даты поставки. Это правильно?
  

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



Сообщений: 66
Местоположение: Москва
Зарегистрирован: 17. Июля 2007
Пол: Мужской
Re: Помогите с запросом.
Ответ #11 - 19. Июля 2007 :: 07:29
Печать  
berezdetsky писал(а) 18. Июля 2007 :: 15:03:
ok. Есть две разных даты поставки и одна дата ввода в эксплуатацию - оба ОС ввели в эксплуатацию в один день. При такой постановке отчет по обоим ОС выдаст одинаковые даты поставки. Это правильно?

Конечно неправильно потому что в 1 день могут вводиться в эксплуатацию только разные элементы справочника внеоборотных активов. Если 1 элемент был использован в поставкеОС, то он не будет использован повторно в документе ПоставкаОС пока не будет использован в документе  ввод в эксплуатацию!
Вобщем я думаю так
WHERE
     ДокПОС.ПостДатаДок < ВВВЭксОС.ВВДата

а как получить максимальную дату поставки соответствующую данному элементу внеоборотных активов если этих элементов несколько и надо по каждому?
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Помогите с запросом.
Ответ #12 - 19. Июля 2007 :: 07:32
Печать  
Что-то ненадежные у тебя связи Улыбка
Попробуй max(ТвояДата)
  

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



Сообщений: 66
Местоположение: Москва
Зарегистрирован: 17. Июля 2007
Пол: Мужской
Re: Помогите с запросом.
Ответ #13 - 19. Июля 2007 :: 07:40
Печать  
MAX пробывал не выходит. может как то нетак использую.  Смущённый слабоват я пока в запросах.
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Помогите с запросом.
Ответ #14 - 19. Июля 2007 :: 07:51
Печать  
"не выходит" - так программист не должен говорить, надо приводить текст ошибки
Попробуй типа так:
select max(dat), sp100, sp300 from ra100 group by sp100, sp300
  

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



Сообщений: 66
Местоположение: Москва
Зарегистрирован: 17. Июля 2007
Пол: Мужской
Re: Помогите с запросом.
Ответ #15 - 19. Июля 2007 :: 08:02
Печать  
Цитата:
"не выходит" - так программист не должен говорить, надо приводить текст ошибки
Попробуй типа так:
select max(dat), sp100, sp300 from ra100 group by sp100, sp300

Да, но у меня  кроме инвентарного номера и наименования все остальные поля разные и нужна та строчка что соответствует максимальной дате!
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите с запросом.
Ответ #16 - 19. Июля 2007 :: 09:57
Печать  
Berck писал(а) 19. Июля 2007 :: 08:02:
Да, но у меня  кроме инвентарного номера и наименования все остальные поля разные и нужна та строчка что соответствует максимальной дате!

Попробуй так:
Код
Выбрать все
SELECT
	sq.Инвном,
	sq.Осср,
	($ДокСтПОС2.Цена*1.18) as [Цена],
	СпрКонт.descr as [Пост],
	СпрДог.descr as [Догпост],
	$ДокПОС2.ДатаДокВходящий as [Дата]
FROM (SELECT
		СпрОС.CODE as [Инвном],
		СпрОС.DESCR as [Осср],
		$ВВЭксОС.ОбъектВнеоборотныхАктивов ОВА,
		(SELECT TOP 1
			ЖурДокПОС.IDDoc
		FROM
			$ДокументСтроки.ПоступлениеОС as ДокСтПОС
			INNER JOIN _1SJourn as ЖурДокПОС ON ЖурДокПОС.IDDoc = ДокСтПОС.IDDoc
		WHERE
			($ВВЭксОС.ОбъектВнеоборотныхАктивов = $ДокСтПОС.ОбъектВнеоборотныхАктивов)
			AND (ЖурДокПОС.Date_Time_IDDoc < ЖурДокСтВВОС.Date_Time_IDDoc)
			AND (ЖурДокПОС.Closed & 1 = 1)
		ORDER BY
			ЖурДокПОС.Date_Time_IDDoc DESC
		) ДокПОСИд
	FROM
		$Документ.ВводВЭксплуатациюОС as ВВЭксОС
		INNER JOIN $ДокументСтроки.ВводВЭксплуатациюОС as ДокСтВВОС ON ДокСтВВОС.IDDoc = ВВЭксОС.IDDoc
		INNER JOIN $Справочник.ОсновныеСредства as СпрОС ON СпрОС.ID = $ДокСтВВОС.ОсновноеСредство
		INNER JOIN _1SJourn as ЖурДокСтВВОС ON ЖурДокСтВВОС.IDDoc = ДокСтВВОС.IDDoc
	WHERE
		(ЖурДокСтВВОС.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)
		AND (ЖурДокСтВВОС.Closed & 1 = 1)
		AND (СпрОС.ID IN (SELECT val FROM #Группа))
	ORDER BY
		СпрОС.CODE) sq
	INNER JOIN $ДокументСтроки.ПоступлениеОС as ДокСтПОС2 ON ДокСтПОС2.IDDoc = sq.ДокПОСИд
		AND $ДокСтПОС2.ОбъектВнеоборотныхАктивов = sq.ОВА
	INNER JOIN $Документ.ПоступлениеОС as ДокПОС2 ON ДокПОС2.IDDoc = sq.ДокПОСИд
	INNER JOIN $Справочник.Договоры as СпрДог ON СпрДог.ID = $ДокПОС2.Договор
	INNER JOIN $Справочник.Контрагенты as СпрКонт ON СпрКонт.ID = $ДокПОС2.Контрагент 


Может, даже будет работать. Улыбка Проверить не на чём.
  

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


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Помогите с запросом.
Ответ #17 - 19. Июля 2007 :: 10:07
Печать  
>>$ВВЭксОС.ОбъектВнеоборотныхАктивов ОВА,
>>(SELECT TOP 1

Мне кажецо что это будет очень медленно...
  

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



Сообщений: 66
Местоположение: Москва
Зарегистрирован: 17. Июля 2007
Пол: Мужской
Re: Помогите с запросом.
Ответ #18 - 19. Июля 2007 :: 11:16
Печать  
berezdetsky писал(а) 19. Июля 2007 :: 09:57:
Может, даже будет работать. Улыбка Проверить не на чём.


[Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY clause is invalid in views, inline functions, derived tables, and subqueries, unless TOP is also specified.

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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Помогите с запросом.
Ответ #19 - 19. Июля 2007 :: 11:17
Печать  
Цитата:
>>$ВВЭксОС.ОбъектВнеоборотныхАктивов ОВА,
>>(SELECT TOP 1

Мне кажецо что это будет очень медленно...


Можно вместо этого - как в получении периодического реквизита -
получить MAX(Date_Time_IDDoc)  и второй раз соединиться уже с Date_Time_IDDoc.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Помогите с запросом.
Ответ #20 - 19. Июля 2007 :: 11:25
Печать  
Berck писал(а) 19. Июля 2007 :: 11:16:
berezdetsky писал(а) 19. Июля 2007 :: 09:57:
Может, даже будет работать. Улыбка Проверить не на чём.


[Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY clause is invalid in views, inline functions, derived tables, and subqueries, unless TOP is also specified.

Да, ORDER BY СпрОС.CODE в подзапросе действительно лишнее. Смущённый
  

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



Сообщений: 66
Местоположение: Москва
Зарегистрирован: 17. Июля 2007
Пол: Мужской
Re: Помогите с запросом.
Ответ #21 - 19. Июля 2007 :: 11:37
Печать  
Почему лишнее - переставил в конец. Сортировка по коду нужна конечно.


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