Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос к ms sql с базой данных 1с. Прайс-лист / 9 сообщений из 9, страница 1 из 1
19.11.2019, 08:25
    #39890881
livesid
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к ms sql с базой данных 1с. Прайс-лист
Добрый день. Подскажите как выполнить запрос.

Есть документ
_Document6395 - Документ.ТоварнаяНоменклатураСборки
У него есть табличная часть, где указаны номенклатуры и план (количество) по каждой позиции. !!!Цена и итог не указано!!!
_Document6395_VT6404 - Документ.ТоварнаяНоменклатураСборки.НоменклатураТЧ

задача вывести список или в моем случае общую сумму: количество, ценаДействующая, ценаСтабильная. (ценаДействующая и ценаСтабильная - это виды цен в таблице _InfoRg3676 - РегистрСведений.ЦеныНоменклатуры). Где цена документа указана на момент даты документа Документ.ТоварнаяНоменклатураСборки.

Смог только реализовать, сумму: количество, ценаДействующая, ценаСтабильная по цене на текущий день.
Как брать цену в регистре сведений - ЦеныНоменклатуры на момент даты документа Документ.ТоварнаяНоменклатураСборки?


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
--План с документа - Документ.ТоварнаяНоменклатураСборки
DECLARE @period date;
SET @period='01.01.4019';

WITH tm_price(id_nomen, nomenclature, id_type, type_price, cost)
	as(
		SELECT T1._nomen as id_nomen, nomen._Description as nomenclature, T1._type as id_type, typePrice._Description as type_price, T1.cost as cost
		FROM (
			SELECT	T4._period as _period,
					T4._Fld3677RRef as _nomen,
					T4._Fld3678RRef as _type,
					T4._Fld3680 as cost
			FROM (
				SELECT  T3._Fld3677RRef as _nomen, T3._Fld3678RRef as _type,
						max(T3._period) as max_period
				FROM _InfoRg3676 as T3
				GROUP BY T3._Fld3677RRef, T3._Fld3678RRef
				) as T2
			INNER JOIN _InfoRg3676 as T4 on T2._nomen = T4._Fld3677RRef and T2._type = T4._Fld3678RRef and T2.max_period = T4._Period) T1
			LEFT JOIN _Reference25 as nomen on T1._nomen = nomen._IDRRef --Справочник.Номенклатура
			LEFT JOIN _Reference56 as typePrice on T1._type = typePrice._IDRRef
		WHERE typePrice._Description in ('Действующая', 'Стабильная')
	)


SELECT doc_plan._Fld6397 as date_plan, doc_plan._Fld6398 as date_plan_month,
	sum(tp_doc_plan._Fld6407) as amount_plan, sum(tp_doc_plan._Fld6407*priceCurrent.cost) as sum_current_plan, sum(tp_doc_plan._Fld6407*priceStable.cost) as sum_stable_plan
FROM _Document6395 as doc_plan --Документ.ТоварнаяНоменклатураСборки
	LEFT JOIN _Document6395_VT6404 as tp_doc_plan on doc_plan._IDRRef = tp_doc_plan._Document6395_IDRRef --Документ.ТоварнаяНоменклатураСборки.НоменклатураТЧ
	LEFT JOIN _Reference25 as nomen on tp_doc_plan._Fld6406RRef = nomen._IDRRef --Справочник.Номенклатура
	LEFT JOIN _Reference25 as nomen_parent on nomen_parent._IDRRef = nomen._ParentIDRRef --Справочник.Номенклатура.Родитель
	LEFT JOIN tm_price as priceCurrent on priceCurrent.id_nomen = tp_doc_plan._Fld6406RRef and priceCurrent.type_price = 'Действующая'
	LEFT JOIN tm_price as priceStable on priceStable.id_nomen = tp_doc_plan._Fld6406RRef and priceStable.type_price = 'Стабильная'
WHERE CONVERT(varchar(max), doc_plan._marked, 2) = '00' and CONVERT(varchar(max), doc_plan._posted, 2) = '01'
	and CAST(doc_plan._date_time as date) >= @period
	and nomen_parent._Code NOT IN (27764, 29491)
GROUP BY doc_plan._Fld6397, doc_plan._Fld6398
...
Рейтинг: 0 / 0
19.11.2019, 09:17
    #39890897
PsyMisha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к ms sql с базой данных 1с. Прайс-лист
livesid,

Конечно, не видя данных перед глазами комплексно советы давать - но сходу - а почему бы не делать inner join к РС [ЦеныНоменклатуры] по периоду через BETWEEN - к справочнику цен, у которого есть ДатаНачалаСрокаДействияЦены и ДатаКонцаСрокаДействияЦены?
Джойним [Документ.ТоварнаяНоменклатураСборки] и [Справочник.Номенклатура] - по ID номенклатуры. Из [Документ.ТоварнаяНоменклатураСборки] получаем фактическую дату и ведем ее в [ЦеныНоменклатуры] используя BETWEEN между границами?
Если Даты окончания периода нет - можно предварительно этот регистр обработать в CTE, искусственно создав для него крайнюю границу как максимальное ДатаВремя
Получатся такие островки, куда можно будет попадать извне, как бы

Если я правильно понял задачу, естественно
...
Рейтинг: 0 / 0
19.11.2019, 09:17
    #39890901
PsyMisha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к ms sql с базой данных 1с. Прайс-лист
PsyMisha
livesid,

Конечно, не видя данных перед глазами комплексно советы давать - но сходу - а почему бы не делать inner join к РС [ЦеныНоменклатуры] по периоду через BETWEEN - к справочнику цен, у которого есть ДатаНачалаСрокаДействияЦены и ДатаКонцаСрокаДействияЦены?
Джойним [Документ.ТоварнаяНоменклатураСборки] и [Справочник.Номенклатура] - по ID номенклатуры. Из [Документ.ТоварнаяНоменклатураСборки] получаем фактическую дату и ведем ее в [ЦеныНоменклатуры] используя BETWEEN между границами?
Если Даты окончания периода нет - можно предварительно этот регистр обработать в CTE, искусственно создав для него крайнюю границу как максимальное ДатаВремя
Получатся такие островки, куда можно будет попадать извне, как бы

Если я правильно понял задачу, естественно
...
Рейтинг: 0 / 0
19.11.2019, 09:38
    #39890909
livesid
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к ms sql с базой данных 1с. Прайс-лист
Попытался накидать в ексель.

BETWEEN - хорошая идея, если правильно понял, создаем виртуальную таблицу Price, где будут указаны периоды начала и конца действия цены для номенклатуры?
...
Рейтинг: 0 / 0
19.11.2019, 09:51
    #39890917
PsyMisha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к ms sql с базой данных 1с. Прайс-лист
livesid,

Ну как-то так, да

Вообще, по идее - такие сущности, как ЦеныНоменклатуры должны изначально, с уровня источника данных - идти с периодами, даже в 1С они есть. Под рукой кода сейчас нет, - пороюсь в архивах - если найду - то продемонстрирую

А насчет паттерна соваться в справочник к его датам через BETWEEN с даты, идущей с факта - да, это вполне рациональное рабочее решение
...
Рейтинг: 0 / 0
19.11.2019, 10:05
    #39890919
1C Developer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к ms sql с базой данных 1с. Прайс-лист
livesid
Как брать цену в регистре сведений - ЦеныНоменклатуры на момент даты документа Документ.ТоварнаяНоменклатураСборки?


РегистрСведений.ЦеныНоменклатуры - периодический, Вам нужен срез последних на дату документа, т.е. по интересующим Вас номенклатурам нужно найти значения цен с максимальной датой меньшей либо равной дате документа.

P.S. А почему бы Вам не решить данную задачу на стороне 1С?

P.P.S. Для t-sql есть универсальный способ представления даты - YYYYMMDD - лучше всегда пользоваться им, а не

Код: sql
1.
SET @period='01.01.4019';
...
Рейтинг: 0 / 0
19.11.2019, 10:26
    #39890930
livesid
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к ms sql с базой данных 1с. Прайс-лист
Сделал так. Буду связывать через between
+2000 год, это так храниться в бд

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
WITH tm_price
	as (
		SELECT TOP 1000  ROW_NUMBER() OVER(PARTITION BY nomen._Description, typePrice._Description ORDER BY price._Period ASC) AS RowNumber,
			price._Period as date_price, nomen._Description as nomen, typePrice._Description as type_price, price._Fld3680 as cost
		FROM _InfoRg3676 as price
			LEFT JOIN _Reference25 as nomen on price._Fld3677RRef = nomen._IDRRef --Справочник.Номенклатура
			LEFT JOIN _Reference56 as typePrice on price._Fld3678RRef = typePrice._IDRRef
		WHERE typePrice._Description in ('Действующая', 'Стабильная')	
		)

SELECT tm1.RowNumber, tm1.nomen, tm1.type_price, tm1.cost, 
	tm1.date_price, ISNULL(tm2.date_price, DATEADD(year, +2000, GETDATE())) as date_price2
FROM tm_price as tm1
	LEFT JOIN tm_price as tm2 on tm1.nomen = tm2.nomen and tm1.type_price = tm2.type_price and tm1.RowNumber = tm2.RowNumber-1
...
Рейтинг: 0 / 0
19.11.2019, 10:27
    #39890933
livesid
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к ms sql с базой данных 1с. Прайс-лист
1C Developer,
к сожалению на стороне 1с, никто делать не будет
...
Рейтинг: 0 / 0
19.11.2019, 10:29
    #39890935
livesid
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос к ms sql с базой данных 1с. Прайс-лист
1C Developer,

SET @period='40190101'; - так имеется в виду?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос к ms sql с базой данных 1с. Прайс-лист / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]