Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Очень популярная тема (более 25 ответов) Как получить значение периодического реквизита (число прочтений - 6771 )
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Как получить значение периодического реквизита
16. Августа 2010 :: 12:30
Печать  
Надо получить периодический реквизит справочника.
Код есть, работает:
Код
Выбрать все
	ТекстЗапроса = "
	|SELECT
	|	СпрКонтрагенты.ID as [Контрагент $Справочник.Контаргенты],
	|	ПериодическиеРеквизиты.ЗначениеРеквизита AS ЗначениеРеквизита,
	|	ПериодическиеРеквизиты.ДатаРеквизита
	|FROM
	|	$Справочник.Контрагенты СпрКонтрагенты
	|LEFT JOIN (
	|	SELECT
	|		ПериодическиеРеквизиты.objid as objid,
	|		ПериодическиеРеквизиты.value as ЗначениеРеквизита,
	|		ПериодическиеРеквизиты.date AS ДатаРеквизита
	|	FROM _1sconst as ПериодическиеРеквизиты
	|	WHERE
	|		ПериодическиеРеквизиты.date IN
	|		(SELECT MAX(Константа.date)
	|			FROM _1sconst as Константа
	|			WHERE
	|				(Константа.id = $ИсторияРеквизита.Абоненты.НаименованиеОрганизации)
	|				AND
	|				(Константа.objid = ПериодическиеРеквизиты.objid)
	|		)
	|		AND
	|		ПериодическиеРеквизиты.id = $ИсторияРеквизита.Абоненты.НаименованиеОрганизации
	|	) as ПериодическиеРеквизиты ON ПериодическиеРеквизиты.objid = СпрКонтрагенты.id   ";
 



Но Есть некоторые контрагенты, у которых бухи умудрились установить несколько значений периодического реквизита в одну дату.
Соответственно в результат запроса мне попадает для одного контрагента две строки по этому реквизиту. Как мне взять из них только первую строку?
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как получить значение периодического реквизита
Ответ #1 - 16. Августа 2010 :: 12:42
Печать  
Отсортируй в нужном тебе порядке и TOP 1
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как получить значение периодического реквизита
Ответ #2 - 16. Августа 2010 :: 13:03
Печать  
а куда это ТОР 1 вставить?
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как получить значение периодического реквизита
Ответ #3 - 16. Августа 2010 :: 13:05
Печать  
если так как ниже - то не работает - возвращается только для одного абонента
Код
Выбрать все
	|LEFT JOIN (
	|	SELECT ТОР 1
	|		ПериодическиеРеквизиты.objid as objid,
	|		ПериодическиеРеквизиты.value as ЗначениеРеквизита,
	|		ПериодическиеРеквизиты.date AS ДатаРеквизита
	|	FROM _1sconst as ПериодическиеРеквизиты
	|	WHERE
	|		ПериодическиеРеквизиты.date IN
	|		(SELECT MAX(Константа.date)
	|			FROM _1sconst as Константа
	|			WHERE
	|				(Константа.id = $ИсторияРеквизита.Абоненты.НаименованиеОрганизации)
	|				AND
	|				(Константа.objid = ПериодическиеРеквизиты.objid)
	|		)
	|		AND
	|		ПериодическиеРеквизиты.id = $ИсторияРеквизита.Абоненты.НаименованиеОрганизации
	|	) as ПериодическиеРеквизиты ON ПериодическиеРеквизиты.objid = СпрКонтрагенты.id   ";
  


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


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как получить значение периодического реквизита
Ответ #4 - 17. Августа 2010 :: 08:48
Печать  
Видимо, имелось ввиду
Код
Выбрать все
|LEFT JOIN (SELECT
|		ПериодическиеРеквизиты.objid as objid,
|		ПериодическиеРеквизиты.value as ЗначениеРеквизита,
|		ПериодическиеРеквизиты.date AS ДатаРеквизита
|	FROM _1sconst as ПериодическиеРеквизиты (nolock)
|	WHERE
|		ПериодическиеРеквизиты.row_id =
|			(SELECT top 1 Константа.row_id
|			FROM _1sconst as Константа (nolock)
|			WHERE
|				(Константа.id = $ИсторияРеквизита.Абоненты.НаименованиеОрганизации)
|				AND
|				(Константа.objid = ПериодическиеРеквизиты.objid)
|			ORDER BY Константа.date desc, Константа.time desc, Константа.docid desc
|			)
|		AND
|		ПериодическиеРеквизиты.id = $ИсторияРеквизита.Абоненты.НаименованиеОрганизации
|	) as ПериодическиеРеквизиты ON ПериодическиеРеквизиты.objid = СпрКонтрагенты.id   ";
 

  

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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как получить значение периодического реквизита
Ответ #5 - 20. Сентября 2010 :: 08:45
Печать  
После продолжительного перерыва я снова занялся запросом по периодическим реквизитам
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как получить значение периодического реквизита
Ответ #6 - 20. Сентября 2010 :: 08:46
Печать  
berezdetsky
спасибо, твой код работает
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как получить значение периодического реквизита
Ответ #7 - 20. Сентября 2010 :: 08:51
Печать  
еще появилось два вопроса:

1) если в запросе надо выбрать несколько периодических реквизитов, то надо делать такую же конструкцию несколько раз для каждого реквизита? Я правильно понимаю?

Код
Выбрать все
|LEFT JOIN (SELECT   // для реквизита 1
|		ПериодическиеРеквизиты.objid as objid,
|		ПериодическиеРеквизиты.value as ЗначениеРеквизита,
|		ПериодическиеРеквизиты.date AS ДатаРеквизита
|	FROM _1sconst as ПериодическиеРеквизиты (nolock)
|	WHERE
|		ПериодическиеРеквизиты.row_id =
|
|LEFT JOIN (SELECT   // для реквизита 2
|		ПериодическиеРеквизиты2.objid as objid,
|		ПериодическиеРеквизиты2.value as ЗначениеРеквизита,
|		ПериодическиеРеквизиты2.date AS ДатаРеквизита
|	FROM _1sconst as ПериодическиеРеквизиты2 (nolock)
|	WHERE
|		ПериодическиеРеквизиты2.row_id =
 



2) Периодические реквизиты типа "дата" хранятся в SQL как строки. Как можно в запросе сразу их преобразовать в тип "Дата"?
Есть ли для этого какой-нибудь модификатор или что-то еще в 1С++.
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как получить значение периодического реквизита
Ответ #8 - 20. Сентября 2010 :: 09:33
Печать  
1. для периодики используй
ПоследнееЗначение
http://www.1cpp.ru/docum/icpp/html/ODBC.html#id38
2. Просто типизируй к дате, если надо.. если нужно явно преобразовать в запросе, то можешь Cast или Convert использовать

ЗЫ:"явно" преобразовать, имелось ввиду получить строку на выходе в нужном представлении, например, 01.01.2009 или еще как, а так, достаточно [Дата $Дата]
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как получить значение периодического реквизита
Ответ #9 - 20. Сентября 2010 :: 09:59
Печать  
1) Поможет ли $ПоследнееЗначение если в запросе нужно накладывать какие либо условия по значению периодического реквизита? Если да, то как написать правильно запрос?

Код
Выбрать все
|SELECT
|	$ПоследнееЗначение.Цены.Цена(СпрЦ.ID, :ВыбДата) Цена
|FROM
|	$Справочник.Цены СпрЦ
|WHERE
|	Цена <= 1000
 



Так можно написать? Что-то мне кажется вряд ли
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как получить значение периодического реквизита
Ответ #10 - 20. Сентября 2010 :: 10:17
Печать  
ну, для начала, использовать псевдоним в ветке where из селекта недопустимо, ибо селект обрабатывается позже ветки where..
А так,
where $ПоследнееЗначение.Цены.Цена(СпрЦ.ID, :ВыбДата)<= 1000

и всё
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как получить значение периодического реквизита
Ответ #11 - 20. Сентября 2010 :: 10:18
Печать  
По пункту (2): если делаю для периодической даты типизацию
[МояДата $Дата], то всегда получается пустая дата
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как получить значение периодического реквизита
Ответ #12 - 20. Сентября 2010 :: 10:19
Печать  
es3000 писал(а) 20. Сентября 2010 :: 10:18:
По пункту (2): если делаю для периодической даты типизацию
[МояДата $Дата], то всегда получается пустая дата


а в МояДата у тебя что ?
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как получить значение периодического реквизита
Ответ #13 - 20. Сентября 2010 :: 10:20
Печать  
Eprst писал(а) 20. Сентября 2010 :: 10:17:
ну, для начала, использовать псевдоним в ветке where из селекта недопустимо, ибо селект обрабатывается позже ветки where..
А так,
where $ПоследнееЗначение.Цены.Цена(СпрЦ.ID, :ВыбДата)<= 1000

и всё


А не будет ли при этом подзапрос выполняться дважды? Скорее всего да. Один раз в SELECT и один раз в WHERE. А если мне надо выбрать пять периодических реквизитов из справочника, то это приведет к значительным замедлениям
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как получить значение периодического реквизита
Ответ #14 - 20. Сентября 2010 :: 10:21
Печать  
es3000 писал(а) 20. Сентября 2010 :: 10:20:
А не будет ли при этом подзапрос выполняться дважды? Скорее всего да. Один раз в SELECT и один раз в WHERE. А если мне надо выбрать пять периодических реквизитов из справочника, то это приведет к значительным замедлениям


Конечно нет.
Еще раз, в данном тексте, в начале идет обработка ветки from, потом полученные строки фильтруются в where и только потом select
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать