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



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


а в МояДата у тебя что ?


Код
Выбрать все
ТекстЗапроса = "
	|SELECT
	|	СпрКонтрагенты.ID as [Контрагент $Справочник.Контаргенты],
	|	ПериодическиеРеквизиты.ЗначениеРеквизита AS МояДата

...

|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   "

 



если я здесь ставлю типизацию, то получается всегда пустая дата
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



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


Конечно нет.
Еще раз, в данном тексте, в начале идет обработка ветки from, потом полученные строки фильтруются в where и только потом select


Хорошо, попробую
Если разницы по времени выполнения с явным подзапросом к _1sconst (как сделано выше) не будет, тогда просто прекрасно!
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как получить значение периодического реквизита
Ответ #17 - 20. Сентября 2010 :: 10:27
Печать  
У тебя периодический реквизит с типом ДАТА ?
Улыбка))))

Или всё же будешь дату его смотреть?
Код
Выбрать все
//ПериодическиеРеквизиты.ЗначениеРеквизита AS МояДата
ПериодическиеРеквизиты.ДатаРеквизита [МояДата $Дата]
 



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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как получить значение периодического реквизита
Ответ #18 - 20. Сентября 2010 :: 10:45
Печать  
Цитата:
У тебя периодический реквизит с типом ДАТА ?

Да.
Сам реквизит называется "ДатаОкончанияДоговора". Он периодический, его тип "Дата". Мне нужна не дата его изменения (т.е. не ДатаРеквизита), а само его значение (ЗначениеРеквизита). Желательно уже приведенное к 1С-кому типу "Дата"
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как получить значение периодического реквизита
Ответ #19 - 20. Сентября 2010 :: 11:07
Печать  
es3000 писал(а) 20. Сентября 2010 :: 10:45:
Цитата:
У тебя периодический реквизит с типом ДАТА ?

Да.
Сам реквизит называется "ДатаОкончанияДоговора". Он периодический, его тип "Дата". Мне нужна не дата его изменения (т.е. не ДатаРеквизита), а само его значение (ЗначениеРеквизита). Желательно уже приведенное к 1С-кому типу "Дата"

Может дату окончания договора хранить в самом договоре ?
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как получить значение периодического реквизита
Ответ #20 - 20. Сентября 2010 :: 11:21
Печать  
Цитата:
Может дату окончания договора хранить в самом договоре ?


Если б все было так легко  Злой
Конфигурация самописная, написана 5 лет назад. Сейчас серьезных изменений делать не хочется. Надеемся со следующего года перейдем на новую программу.

А сейчас реквизиты договора - это периодические реквизиты справочника контрагентов.
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как получить значение периодического реквизита
Ответ #21 - 20. Сентября 2010 :: 11:24
Печать  
Ну так тогда:
Код
Выбрать все
 [Дата $Дата], 

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как получить значение периодического реквизита
Ответ #22 - 20. Сентября 2010 :: 11:46
Печать  
es3000 писал(а) 20. Сентября 2010 :: 11:21:
Цитата:
Может дату окончания договора хранить в самом договоре ?


Если б все было так легко  Злой
Конфигурация самописная, написана 5 лет назад. Сейчас серьезных изменений делать не хочется. Надеемся со следующего года перейдем на новую программу.

А сейчас реквизиты договора - это периодические реквизиты справочника контрагентов.

Ну тогда получается
несерьезные изменения алгоритмов и структуры данных  влекут серьезную нагрузку на базу данных
Серьезные( и грамотные) изменения алгоритмов и структуры данных влекут
несерьезную нагрузку на базу данных
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как получить значение периодического реквизита
Ответ #23 - 20. Сентября 2010 :: 12:10
Печать  
Eprst писал(а) 20. Сентября 2010 :: 11:24:
Ну так тогда:
Код
Выбрать все
 [Дата $Дата], 



Ага.

Я пока сделал через CONVERT(DateTime, ЗначениеРеквизита, 104). В этом случае не нужна типизация [МояДата $Дата]
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как получить значение периодического реквизита
Ответ #24 - 20. Сентября 2010 :: 12:12
Печать  
Z1 писал(а) 20. Сентября 2010 :: 11:46:
Ну тогда получается
несерьезные изменения алгоритмов и структуры данных  влекут серьезную нагрузку на базу данных
Серьезные( и грамотные) изменения алгоритмов и структуры данных влекут
несерьезную нагрузку на базу данных


Абсолютно согласен.
Но сейчас я данное изменение сделать не могу, есть другая срочная работа. Позже конечно же к этому надо будет вернуться
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как получить значение периодического реквизита
Ответ #25 - 20. Сентября 2010 :: 12:15
Печать  
Eprst писал(а) 20. Сентября 2010 :: 12:14:
es3000 писал(а) 20. Сентября 2010 :: 12:10:
Я пока сделал через CONVERT(DateTime, ЗначениеРеквизита, 104). В этом случае не нужна типизация [МояДата $Дата]


И че, неужели строку '01.01.2010' к DateTime конвертнуло ???
Не ВЕРЮ.


Все даты конвернтунло.
А почему бы нет?
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как получить значение периодического реквизита
Ответ #26 - 20. Сентября 2010 :: 12:16
Печать  
Для этого я указал параметр "104", который обозначает формат конвертируемой даты
  
Наверх
ICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как получить значение периодического реквизита
Ответ #27 - 20. Сентября 2010 :: 12:17
Печать  
es3000 писал(а) 20. Сентября 2010 :: 12:15:
Eprst писал(а) 20. Сентября 2010 :: 12:14:
es3000 писал(а) 20. Сентября 2010 :: 12:10:
Я пока сделал через CONVERT(DateTime, ЗначениеРеквизита, 104). В этом случае не нужна типизация [МояДата $Дата]


И че, неужели строку '01.01.2010' к DateTime конвертнуло ???
Не ВЕРЮ.


Все даты конвернтунло.
А почему бы нет?


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

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать