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