Переключение на Главную Страницу Страницы: 1 ... 18 19 [20] 21 22 ... 51 ОтправитьПечать
Очень популярная тема (более 25 ответов) Класс "ПрямойЗапрос" - обсуждения. Часть № 2. (число прочтений - 258714 )
ReLock
Full Member
***
Отсутствует



Сообщений: 155
Местоположение: За компом
Зарегистрирован: 01. Февраля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #285 - 17. Февраля 2012 :: 09:12
Печать  
Спасибо за рекомендации!  Улыбка
  
Наверх
 
IP записан
 
Sk0rp
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 24. Февраля 2012
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #286 - 24. Февраля 2012 :: 16:01
Печать  
Натолкнулся на учень не эффективное получение периодических реквизитов. Использовал вот такой код:
Код
Выбрать все
|ВЫБРАТЬ Цены.*
|ИЗ
|	$СрезПоследних.Цены(:НаДату
|		, (Цена, Валюта, Единица)
|		, ($СпрЦен.ПометкаУдаления = 0
|			И $СпрЦен.КатегорияЦены В (:ТипЗакупа, :ТипРозница)
|			И $СпрЦен.Владелец В (SELECT val FROM #ВыбранныеТовары))
|		, ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Цены КАК СпрЦен $nolock
|			ПО $СпрЦен.ТекущийЭлемент = ТекущийЭлемент
|		,0
|	) КАК Цены
 


Он разворачивается в 7 (!!!) вложенных select и исполняется у меня более 12 секунд. (на DBF 65 секунд)
Код
Выбрать все
SELECT Цены.*
FROM
	(
	select
		vt_slicelast_SC3772.ТекущийЭлемент

		,max(vt_slicelast_SC3772.Валюта) as Валюта
		,max(vt_slicelast_SC3772.Единица) as Единица
		,max(vt_slicelast_SC3772.Цена) as Цена
	from (
		select
			slicelast_SC3772.objid ТекущийЭлемент

			,case when slicelast_SC3772.id = 3776 then LEFT(slicelast_SC3772.VALUE,9) end Валюта
			,case when slicelast_SC3772.id = 3863 then LEFT(slicelast_SC3772.VALUE,9) end Единица
			,case when slicelast_SC3772.id = 3775 then slicelast_SC3772.VALUE end Цена
		from (

			select tconst_4.objid, tconst_4.id, tconst_4.date, tconst_4.time, tconst_4.docid, tconst_4.value
			from (
				select tconst_3.objid, tconst_3.id, tconst_3.date, tconst_3.time, max(tconst_3.docid) docid
				from (
					select tconst_2.objid, tconst_2.id, tconst_2.date, max(tconst_2.time) time
					from (
						select tconst_1.objid, tconst_1.id, max(tconst_1.date) date
						from _1SCONST tconst_1 (nolock)
						LEFT JOIN SC3772 AS СпрЦен (nolock)
			ON СпрЦен.ID = tconst_1.objid
						where tconst_1.date <= '20120131'
						and tconst_1.id in (3776,3863,3775)
						and (CASE WHEN СпрЦен.ISMARK = 1 THEN 1 ELSE 0 END = 0
			AND СпрЦен.SP3787 IN ('     4   ', '     3   ')
			AND СпрЦен.PARENTEXT IN (SELECT val FROM #ВыбранныеТовары))
						group by tconst_1.id, tconst_1.objid) slicelast_SC37721
					inner join _1SCONST tconst_2 (nolock)
					on slicelast_SC37721.id = tconst_2.id
					and slicelast_SC37721.objid = tconst_2.objid
					and slicelast_SC37721.date = tconst_2.date
					group by tconst_2.id, tconst_2.objid, tconst_2.date) slicelast_SC37722
				inner join _1SCONST tconst_3 (nolock)
				on slicelast_SC37722.id = tconst_3.id
				and slicelast_SC37722.objid = tconst_3.objid
				and slicelast_SC37722.date = tconst_3.date
				and slicelast_SC37722.time = tconst_3.time
				group by tconst_3.id, tconst_3.objid, tconst_3.date, tconst_3.time) slicelast_SC37723
			inner join _1SCONST tconst_4 (nolock)
			on slicelast_SC37723.id = tconst_4.id
			and slicelast_SC37723.objid = tconst_4.objid
			and slicelast_SC37723.date = tconst_4.date
			and slicelast_SC37723.time = tconst_4.time
			and slicelast_SC37723.docid = tconst_4.docid
		) slicelast_SC3772
	) vt_slicelast_SC3772
	group by vt_slicelast_SC3772.ТекущийЭлемент


) AS Цены
 



При замене на вот такой код прямого запроса 1С++:
Код
Выбрать все
|SELECT
|	ВыбранныеТовары.val AS [Товар $Справочник.Номенклатура],
|	$СпрЦен.КатегорияЦены AS [КатегорияЦены $Справочник.КатегорииЦен],
|	$ПоследнееЗначение.Цены.Цена(СпрЦен.ID, :КонДата) AS [Цена $Число],
|	$ПоследнееЗначение.Цены.Единица(СпрЦен.ID, :КонДата) AS [Единица $Справочник.Единицы],
|	$ПоследнееЗначение.Цены.Валюта(СпрЦен.ID, :КонДата) AS [Валюта $Справочник.Валюты]
|FROM #ВыбранныеТовары AS ВыбранныеТовары
|LEFT JOIN $Справочник.Цены AS СпрЦен (nolock)
|	ON ВыбранныеТовары.val = СпрЦен.PARENTEXT
|WHERE
|	СпрЦен.ISMARK = 0
|	AND $СпрЦен.КатегорияЦены IN (:ТипЗакупа, :ТипРозница)
|ORDER BY
|	ВыбранныеТовары.val, $СпрЦен.КатегорияЦены
 



Разворачивается он в:
Код
Выбрать все
SELECT
	ВыбранныеТовары.val AS [Товар $Справочник.Номенклатура],
	СпрЦен.sp3787 AS [КатегорияЦены $Справочник.КатегорииЦен],
	(
select top 1
cast(c3775_vv.value as numeric(14, 2))
from
_1sconst as c3775_vv (nolock)
where
c3775_vv.id = 3775 and
c3775_vv.objid = СпрЦен.ID and
(c3775_vv.date <= '20120131')
order by c3775_vv.date desc, c3775_vv.time desc, c3775_vv.docid desc, c3775_vv.row_id desc
) AS [Цена $Число],
	(
select top 1
left(c3863_vv.value, 9)
from
_1sconst as c3863_vv (nolock)
where
c3863_vv.id = 3863 and
c3863_vv.objid = СпрЦен.ID and
(c3863_vv.date <= '20120131')
order by c3863_vv.date desc, c3863_vv.time desc, c3863_vv.docid desc, c3863_vv.row_id desc
) AS [Единица $Справочник.Единицы],
	(
select top 1
left(c3776_vv.value, 9)
from
_1sconst as c3776_vv (nolock)
where
c3776_vv.id = 3776 and
c3776_vv.objid = СпрЦен.ID and
(c3776_vv.date <= '20120131')
order by c3776_vv.date desc, c3776_vv.time desc, c3776_vv.docid desc, c3776_vv.row_id desc
) AS [Валюта $Справочник.Валюты]
FROM #ВыбранныеТовары AS ВыбранныеТовары
LEFT JOIN sc3772 AS СпрЦен (nolock)
	ON ВыбранныеТовары.val = СпрЦен.PARENTEXT
WHERE
	СпрЦен.ISMARK = 0
	AND СпрЦен.sp3787 IN ('     4   ', '     3   ')
ORDER BY
	ВыбранныеТовары.val, СпрЦен.sp3787
 



Запрос выдает все те же данные, (даже больше, т.к. есть явная связь со справочником цен)
Выполняется за 0.1 секунды, т.е более чем в 100 (!!!) раз быстрее.

Надо сказать, что если получать тоже самое обычным 1С-ным циклом по справочнику без запроса, то все равно выходит в 10 раз быстрее (за 1 секунду) чем через $СрезПоследних. (на DBF 1С-ный код работает с той же скоростью, что и быстрый запрос на 1С++ в SQL, т.е. менее чем 0.1 секунды)

Я чего-то не учел или $СрезПоследних на самом деле такой не быстрый?
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #287 - 24. Февраля 2012 :: 20:46
Печать  
Вот попробуй этот вариант.
Для DBF эффективность среза и последнее значение у меня на тестах в среднем сопоставимы стали.
Для SQL на маленьких выборках (мало строк, мало реквизитов) срез проигрывает, на больших сопоставимо или выигрывает.
В целом все равно лучше чем было.

1.8.4 от 25.02.12 г.
- Оптимизирован сбор данных вирт. таблиц СрезПоследних и СрезПервых
« Последняя редакция: 24. Февраля 2012 :: 22:34 - vandalsvq »  

1Cv7_query_010.rar ( 234 KB | Загрузки )

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Sk0rp
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 24. Февраля 2012
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #288 - 27. Февраля 2012 :: 09:26
Печать  
vandalsvq писал(а) 24. Февраля 2012 :: 20:46:
Вот попробуй этот вариант.
Для DBF эффективность среза и последнее значение у меня на тестах в среднем сопоставимы стали.
Для SQL на маленьких выборках (мало строк, мало реквизитов) срез проигрывает, на больших сопоставимо или выигрывает.
В целом все равно лучше чем было.
1.8.4 от 25.02.12 г.
- Оптимизирован сбор данных вирт. таблиц СрезПоследних и СрезПервых

В #ВыбранныеТовары 140 позиций.
Прогонял каждый запрос по 3 раза, что бы все закешировалось.

SQL:
Код
Выбрать все
SELECT Цены.*
FROM
	(
	select
		vt_slicelast_SC3772.ТекущийЭлемент

		,max(vt_slicelast_SC3772.Валюта) as Валюта
		,max(vt_slicelast_SC3772.Единица) as Единица
		,max(vt_slicelast_SC3772.Цена) as Цена
	from (
		select
			slicelast_SC3772.objid ТекущийЭлемент

			,case when slicelast_SC3772.id = 3776 then LEFT(slicelast_SC3772.VALUE,9) end Валюта
			,case when slicelast_SC3772.id = 3863 then LEFT(slicelast_SC3772.VALUE,9) end Единица
			,case when slicelast_SC3772.id = 3775 then slicelast_SC3772.VALUE end Цена
		from (

			select tconst_4.objid, tconst_4.id, tconst_4.date, tconst_4.time, tconst_4.docid, tconst_4.value
			from (
				select tconst_3.objid, tconst_3.id, tconst_3.date, tconst_3.time, max(tconst_3.docid) docid
				from (
					select tconst_2.objid, tconst_2.id, tconst_2.date, max(tconst_2.time) time
					from (
						select tconst_1.objid, tconst_1.id, max(tconst_1.date) date
						from _1SCONST tconst_1 (nolock)
						LEFT JOIN SC3772 AS СпрЦен (nolock)
			ON СпрЦен.ID = tconst_1.objid
						where tconst_1.date <= '20120131'
						and tconst_1.id in (3776,3863,3775)
						and (CASE WHEN СпрЦен.ISMARK = 1 THEN 1 ELSE 0 END = 0
			AND СпрЦен.SP3787 IN ('     4   ', '     3   ')
			AND СпрЦен.PARENTEXT IN (SELECT val FROM #ВыбранныеТовары))
						group by tconst_1.id, tconst_1.objid) slicelast_SC37721
					inner join _1SCONST tconst_2 (nolock)
					on slicelast_SC37721.id = tconst_2.id
					and slicelast_SC37721.objid = tconst_2.objid
					and slicelast_SC37721.date = tconst_2.date
					group by tconst_2.id, tconst_2.objid, tconst_2.date) slicelast_SC37722
				inner join _1SCONST tconst_3 (nolock)
				on slicelast_SC37722.id = tconst_3.id
				and slicelast_SC37722.objid = tconst_3.objid
				and slicelast_SC37722.date = tconst_3.date
				and slicelast_SC37722.time = tconst_3.time
				group by tconst_3.id, tconst_3.objid, tconst_3.date, tconst_3.time) slicelast_SC37723
			inner join _1SCONST tconst_4 (nolock)
			on slicelast_SC37723.id = tconst_4.id
			and slicelast_SC37723.objid = tconst_4.objid
			and slicelast_SC37723.date = tconst_4.date
			and slicelast_SC37723.time = tconst_4.time
			and slicelast_SC37723.docid = tconst_4.docid
		) slicelast_SC3772
	) vt_slicelast_SC3772
	group by vt_slicelast_SC3772.ТекущийЭлемент


) AS Цены 


Время подготовки запроса: 20 мс, время выполнения запроса: 11877 мс.
(Первый прогон: 40 сек, второй 14 сек). Размер таблицы: 280 (по 2 цены на товар)
На DBF:
Код
Выбрать все
SELECT Цены.*
FROM
	(
	select
		vt_slicelast_SC3772.ТекущийЭлемент

		,max(vt_slicelast_SC3772.Валюта) as Валюта
		,max(vt_slicelast_SC3772.Единица) as Единица
		,max(vt_slicelast_SC3772.Цена) as Цена
	from (
		select
			slicelast_SC3772.objid ТекущийЭлемент

			,case when slicelast_SC3772.id = ' 2WW' then SUBSTR(slicelast_SC3772.VALUE,1,9) end Валюта
			,case when slicelast_SC3772.id = ' 2ZB' then SUBSTR(slicelast_SC3772.VALUE,1,9) end Единица
			,case when slicelast_SC3772.id = ' 2WV' then slicelast_SC3772.VALUE end Цена
		from (

			select tconst_2.objid, tconst_2.id, tconst_2.date, tconst_2.time, tconst_2.docid, tconst_2.value
			from (select tconst_1.objid, tconst_1.id, max(const_j.idx_date_time_iddoc) date_time_iddoc
				from [_1S.CONST] tconst_1
					left join [Журнал] const_j
					on tconst_1.docid = const_j.iddoc
				LEFT JOIN [Справочник.Цены] AS СпрЦен
			ON СпрЦен.ID = tconst_1.objid
				where tconst_1.date <= '20120131'
				and tconst_1.id in (' 2WW',' 2ZB',' 2WV')
				and (CASE WHEN СпрЦен.ISMARK = '*' THEN 1 ELSE 0 END = 0
			AND СпрЦен.КатегорияЦены IN ('     4   ', '     3   ')
			AND СпрЦен.PARENTEXT IN (SELECT val FROM vt_ВыбранныеТовары))
				group by tconst_1.id, tconst_1.objid) slicelast_SC37721
			left join [_1S.CONST] tconst_2
			on slicelast_SC37721.id = tconst_2.id
			and slicelast_SC37721.objid = tconst_2.objid
			and substr(slicelast_SC37721.date_time_iddoc, 1, 8) = tconst_2.date
			and substr(slicelast_SC37721.date_time_iddoc, 9, 6) = tconst_2.time
			and substr(slicelast_SC37721.date_time_iddoc, 15, 9) = tconst_2.docid
		) slicelast_SC3772
	) vt_slicelast_SC3772
	group by vt_slicelast_SC3772.ТекущийЭлемент


) AS Цены
Подбор индекса для таблицы 1SCONST:
	Ограничения: DATE<=;
	Упорядочить: ID, OBJID,
	Найдено в кэше
	Выбран индекс IDD: ID+OBJID+DTOS(DATE)+TIME+DOCID+STR(PARTNO,3)
	Попадает в сортировку
	Стоимость: 66
Подбор индекса для таблицы 1SJOURN:
	Ограничения: IDDOC=;
	Найдено в кэше
	Выбран индекс IDDOC: IDDOC
	Стоимость: 20
Подбор индекса для таблицы SC3772:
	Ограничения: ID=;
	Найдено в кэше
	Выбран индекс IDD: ID
	Стоимость: 20
Подбор индекса для таблицы 1SCONST:
	Ограничения: DATE=; TIME=; DOCID=; OBJID=; ID=;
	Найдено в кэше
	Выбран индекс IDD: ID+OBJID+DTOS(DATE)+TIME+DOCID+STR(PARTNO,3)
	Стоимость: 26 


Время подготовки запроса: 14 мс, время выполнения запроса: 111766 мс
(Первый прогон 200 сек, второй 111 сек). Размер таблицы 280.

SQL принципиально не поменялось, DBF замедлилось Печаль
  
Наверх
 
IP записан
 
Sk0rp
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 24. Февраля 2012
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #289 - 27. Февраля 2012 :: 10:16
Печать  
На этой-же базе.

В SQL:
Код
Выбрать все
|SELECT
|	ВыбранныеТовары.val AS [Товар $Справочник.Номенклатура],
|	$СпрЦен.КатегорияЦены AS [КатегорияЦены $Справочник.КатегорииЦен],
|	$ПоследнееЗначение.Цены.Цена(СпрЦен.ID, :НаДату) AS [Цена $Число],
|	$ПоследнееЗначение.Цены.Единица(СпрЦен.ID, :НаДату) AS [Единица $Справочник.Единицы],
|	$ПоследнееЗначение.Цены.Валюта(СпрЦен.ID, :НаДату) AS [Валюта $Справочник.Валюты]
|FROM #ВыбранныеТовары AS ВыбранныеТовары
|LEFT JOIN $Справочник.Цены AS СпрЦен (nolock)
|	ON ВыбранныеТовары.val = СпрЦен.PARENTEXT
|WHERE
|	СпрЦен.ISMARK = 0
|	AND $СпрЦен.КатегорияЦены IN (:ТипЗакупа, :ТипРозница)
|ORDER BY
|	ВыбранныеТовары.val, $СпрЦен.КатегорияЦены 

Время выполнения:    0.151


В DBF:
Код
Выбрать все
ТЗ.НоваяКолонка("Товар");
ТЗ.НоваяКолонка("КатегорияЦены");
ТЗ.НоваяКолонка("Цена");
ТЗ.НоваяКолонка("Единица");
ТЗ.НоваяКолонка("Валюта");

ТипЗакупа = Константа.ЗакупочнаяКатегорияЦен;
ТипРозница = Константа.РозничнаяКатегорияЦен;

Цены = СоздатьОбъект("Справочник.Цены");
Цены.ИспользоватьДату(НаДату);

Размер = СписокТоваровДляОтчета.РазмерСписка();
Для й = 1 По Размер Цикл
	Цены.ИспользоватьВладельца(СписокТоваровДляОтчета.ПолучитьЗначение(й));
	Цены.ВыбратьЭлементы();
	Пока Цены.ПолучитьЭлемент() = 1 Цикл
		Если Цены.ПометкаУдаления() = 1 Тогда
			Продолжить;
		КонецЕсли;

		КатегорияЦены = Цены.КатегорияЦены;
		Если (КатегорияЦены = ТипЗакупа) ИЛИ (КатегорияЦены = ТипРозница) Тогда
			ТЗ.НоваяСтрока();
			ТЗ.Товар = Цены.Владелец;
			ТЗ.КатегорияЦены = Цены.КатегорияЦены;
			ТЗ.Цена = Цены.Цена;
			ТЗ.Единица = Цены.Единица;
			ТЗ.Валюта = Цены.Валюта;
		КонецЕсли;
	КонецЦикла;
КонецЦикла; 

Время выполнения:    0.067

Результаты работы совпадают с "ПрямойЗапрос"


Размер SC3772.DBF - 40 Мб
Размер 1SCONST.DBF - 270 Мб
Размер 1sjourn.dbf - 42 Мб
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #290 - 27. Февраля 2012 :: 16:53
Печать  
Видимо я что-то не то выложил... вот чуть более правильный...

Если не поможет, давайте признаем срез неудавшимся экспериментом Улыбка
  

1Cv7_query_007.rar ( 234 KB | Загрузки )

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Sk0rp
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 4
Зарегистрирован: 24. Февраля 2012
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #291 - 27. Февраля 2012 :: 20:27
Печать  
На SQL поправилось, теперь общее время выполнения всего пакета запросов 0.830 секунды.
Здорово!
Правда я не понял зачем в запросе который добавляет данные в #const_ стоит:
     inner join _1SJOURN const_j (nolock)
           on tconst_1.docid = const_j.iddoc
Журнал нигде потом не используется.

На DBF эта версия класса дает ровно тот же запрос, что и 1.8.4. Выполняется одидаемо за те же 111 секунд Улыбка
Старая версия класса от 30.12.11 на DBF генерит запрос, который отрабатывает за 58 секунд.

Эксперимент ни в коем случае неудачным признавать не стоит. Функционал СрезПоследних намного богаче голого 1С++ и очень хотелось бы иметь его одинаково эффективным в SQL и DBF.
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #292 - 11. Марта 2012 :: 19:38
Печать  
Теперь в теме про поставщика будет и информация про обновления класса "ПрямойЗапрос". Так что если что обновления брать тут
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
tsarevich
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 18
Зарегистрирован: 02. Февраля 2012
Пол: Мужской
Re: Класс "ПрямойЗапрос". Часть № 2.
Ответ #293 - 28. Марта 2012 :: 09:47
Печать  
vandalsvq писал(а) 11. Ноября 2010 :: 05:58:
Вообще-то остатки как и обороты при передачи в качестве значения документа считаются строго "до" этого документа (можно вкл. режим отладки и посмотреть). Так что показывай результат выполнения если "ПрямойЗапрос.РежимОтладки = 1".

2 Salimbek
Позицию документа в качестве значения параметра передать нельзя.


Тогда подскажите, как при проведении документа получить остатки в регистре с учетом возможно сделанных движений документа - не на ТА, а по документ ?
Какой параметр в качестве КонецПериода нужно передать в $РегистрОстатки.<ИмяРегистра>(КонецПериода, Условие, Измерения, Ресурсы, Соединения)
Смысл в чем: проводится документ, документ сделал некоторые расходные движения в регистре.
Но после этого требуется проверить- остались ли какие-нибудь хвосты в регистре. если эти хвосты остались, то их нужно полностью списать.

Либо нужно заново делать запрос по остаткам, вычитать из него сделанные движения и затем анализировать результат ?
  
Наверх
 
IP записан
 
Jarad
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 35
Зарегистрирован: 22. Мая 2006
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #294 - 29. Марта 2012 :: 09:51
Печать  
Обнаружилась интересная особенность парсинга. Если в исходном запросе есть обращения к нескольким разным периодчиским реквизитам, то в версии 1.8.3, парсинг выдает н-этажный запрос со многими подзапросами, но работает правильно и выдает результат.
В версии 1.8.4. генерятся несколько временных таблиц, но срез данных по периодическому значению (а их несколько) каждый раз "убивает" предыдущую временную таблицу создает новую и добавляет результаты среза, т.е. на момент выполнения основного запроса во временной таблице "уже нет" данных о периодческом значении А, потому что оно "затерлось" значениями п.з. Б.
Исходные данные:
Код
Выбрать все
ТекстЗапроса = "
		|ВЫБРАТЬ  	ЦеныВДолларе.Квартира  [Квартира $Справочник],ЦеныВДолларе.КатегорияЦены  [КатегорияЦены $Справочник.КатегорииЦен],
		| 			СпрВалюты.ID [Валюта $Справочник.Валюты],
	 	| 			CASE WHEN ISNULL(ЦеныСправочникНеДоллар.Цена,0) <> 0 THEN
		|	       		ISNULL(ЦеныСправочникНеДоллар.Цена,0)
		|	  		ELSE
		|			CASE WHEN (СпрВалюты.ID <> ЦеныВДолларе.Валюта) AND (cast( СрезКурсы.КурсУправленческийПокупка  as real) <> 0)  THEN
		|	        	(cast(ЦеныВДолларе.Цена as real) *  cast(СрезКурсДоллар.КурсУправленческийПродажа as real)  /   cast( СрезКурсы.КурсУправленческийПокупка  as real) )
	 	| 		 	ELSE ЦеныВДолларе.Цена  END
	    | 			END AS Цена,
		| 			CASE WHEN   (СпрВалюты.ID = :ВалДоллар)  THEN 0
		| 	  		WHEN ISNULL(ЦеныСправочникНеДоллар.Цена,0) <> 0 THEN
		|				0
		| 			ELSE 1 END AS ФлагРасчета
		|FROM Справочник.Валюты КАК СпрВалюты $nolock
		|CROSS JOIN (
		|				ВЫБРАТЬ $СпрЦены.РеализуемыйЭлемент КАК Квартира, $СпрЦены.КатегорияЦены КАК КатегорияЦены,
		|			 			$СпрЦены.Валюта Валюта ,
		| 			 			Цена Цена
		|				ИЗ $СрезПоследних.Цены(:РабочаяДата~ ,(Цена),,) КАК СрезЦены
		|				ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Цены КАК СпрЦены $nolock ПО $СпрЦены.ТекущийЭлемент = СрезЦены.ТекущийЭлемент
		|				ГДЕ ($СпрЦены.ПометкаУдаления = 0) И ($СпрЦены.Валюта = :ВалДоллар )   И ($СпрЦены.РеализуемыйЭлемент = :Владелец~ )  
		|			) КАК ЦеныВДолларе
		|ЛЕВОЕ СОЕДИНЕНИЕ (
		|						ВЫБРАТЬ $СпрЦены.РеализуемыйЭлемент КАК Квартира,$СпрЦены.КатегорияЦены КАК КатегорияЦены,
		|					 		$СпрЦены.Валюта Валюта ,
		|		 			 		Цена Цена
		|						ИЗ $СрезПоследних.Цены(:РабочаяДата~ ,(Цена),,	) КАК СрезЦены
		|						ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Цены КАК СпрЦены $nolock ПО $СпрЦены.ТекущийЭлемент = СрезЦены.ТекущийЭлемент
		|
		|						ГДЕ ($СпрЦены.ПометкаУдаления = 0) И ($СпрЦены.Валюта <> :ВалДоллар )   И ($СпрЦены.РеализуемыйЭлемент = :Владелец~ )  
		|				  ) КАК ЦеныСправочникНеДоллар ПО
		|					(ЦеныСправочникНеДоллар.Валюта =  СпрВалюты.ID) И
		|					(ЦеныВДолларе.Квартира = ЦеныСправочникНеДоллар.Квартира) И
		|					(ЦеныВДолларе.КатегорияЦены = ЦеныСправочникНеДоллар.КатегорияЦены)
		|ЛЕВОЕ СОЕДИНЕНИЕ $СрезПоследних.Валюты(:РабочаяДата~ ,(КурсУправленческийПокупка),,) КАК СрезКурсы
		|				  ПО $СпрВалюты.ТекущийЭлемент = СрезКурсы.ТекущийЭлемент
		|ЛЕВОЕ СОЕДИНЕНИЕ $СрезПоследних.Валюты(:РабочаяДата~ ,(КурсУправленческийПродажа),,) КАК СрезКурсДоллар
		|				  ПО ЦеныВДолларе.Валюта = СрезКурсДоллар.ТекущийЭлемент"; 


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


I Love YaBB 2!

Сообщений: 35
Зарегистрирован: 22. Мая 2006
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #295 - 29. Марта 2012 :: 09:54
Печать  
Вот результаты парсинга (версия 1.8.3.):
  

pasrer183.txt ( 9 KB | Загрузки )
Наверх
 
IP записан
 
Jarad
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 35
Зарегистрирован: 22. Мая 2006
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #296 - 29. Марта 2012 :: 09:55
Печать  
Результаты парсинга (1.8.4.) - результат запроса - пустая таблица.
  

pasrer184.txt ( 10 KB | Загрузки )
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #297 - 29. Марта 2012 :: 16:43
Печать  
Понял. Исправим
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
ziflex
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 76
Местоположение: Владивосток
Зарегистрирован: 05. Мая 2011
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #298 - 12. Апреля 2012 :: 03:58
Печать  
"УложитьСписокГрупп()"
либо я чего-то неправильно делаю, либо этот метод не работает должным образом.

Простецкий пример:
Код
Выбрать все
|ВЫБРАТЬ
	|	Контрагенты.ID КАК [Ссылка $Справочник.Контрагенты]
	|ИЗ
	|	Справочник.Контрагенты КАК Контрагенты $nolock
	|ГДЕ
	|	Контрагенты.ID В (ВЫБРАТЬ val ИЗ #Контрагенты) 



выдает мне тот же элемент (группу), что и передается в метод "УложитьСписокГрупп()"
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Класс "ПрямойЗапрос" - обсуждения. Часть № 2.
Ответ #299 - 12. Апреля 2012 :: 05:45
Печать  
Код
Выбрать все
	|	$Контрагенты.Родитель В (ВЫБРАТЬ val ИЗ #Контрагенты) 

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