|
v7: Получение цен прямой запрос по таблице дат | ☑ | ||
---|---|---|---|---|
0
zenon46
17.12.19
✎
16:22
|
Доброго дня!
Есть два запроса, не получается их соединить в месте, для получения цены на каждый день. Главная загвоздка для меня, мне не понятно как в выражение ($ПоследнееЗначение.Цены.Цена(СпрЦены.ID, :ДатаЦен), передать Дату для получения цены из таблицы ДатыТовары. Вот собственно запросы : Формируется таблица из Дат и переданного товара : |SET NOCOUNT ON; |IF EXISTS(SELECT * FROM tempdb..sysobjects WHERE id = object_id('tempdb..#Период')) |DROP TABLE #Период; |CREATE TABLE #Период (val char(9) PRIMARY KEY); |DECLARE @НачДата as DATETIME |SET @НачДата = '"+метаДата.ПолучитьСтрИзДаты(НачДатаПрод)+"' |DECLARE @КонДата as DATETIME |SET @КонДата = '"+метаДата.ПолучитьСтрИзДаты(КонДатаПрод)+"' |WHILE @НачДата <= @КонДата |BEGIN |INSERT INTO #Период VALUES (CONVERT(char(8), @НачДата, 112)) |SET @НачДата = DATEADD(DAY, 1, @НачДата) |END; |SELECT | Товары.CODE as [Код $Строка], | ДатыТовары.Товар as [Номенклатура $Справочник.Номенклатура], | ДатыТовары.Дата as [Дата $Дата] |FROM |( |SELECT | #Период.val as [Дата], | #TempTable.val as [Товар] |FROM | #Период CROSS JOIN #TempTable |) as ДатыТовары |LEFT JOIN $Справочник.Номенклатура as Товары ON ДатыТовары.Товар = Товары.ID |ORDER BY | ДатыТовары.Дата |DROP TABLE #Период; |SET NOCOUNT OFF; Вот запрос на получение цены товары на дату : |SELECT |СпрНоменклатура.ID AS [Номенклатура $Справочник.Номенклатура], |ISNULL(СпрЦены.ID,$ПустойИД) AS [НайденнаяЦена $Справочник.Цены], |ISNULL($ПоследнееЗначение.Цены.Цена(СпрЦены.ID, :ДатаЦен),0) AS ЦенаЦены |FROM |$Справочник.Номенклатура AS СпрНоменклатура With (NOLOCK) |LEFT JOIN |$Справочник.Цены AS СпрЦены With (NOLOCK) ON (СпрЦены.ParentExt = СпрНоменклатура.ID) |AND ($СпрЦены.ТипЦен = :ТипЦены) |WHERE |СпрНоменклатура.ID = :ВбрНомен |
|||
1
zenon46
17.12.19
✎
16:27
|
Идея всего, на графике посмотреть изменение цены за период.
|
|||
2
Дык ё
17.12.19
✎
17:07
|
(0) как то сложно написано. можно запросом к 1sconst получить всю историю без этих заморочек
|
|||
3
Злопчинский
17.12.19
✎
17:51
|
А надо ли это все прямым запросом? судя "для графика.." - скорость тут не особо важна
|
|||
4
unbred
17.12.19
✎
17:54
|
(3) хороший понт дороже денег.
|
|||
5
Злопчинский
17.12.19
✎
17:56
|
посмори, может пригодится http://catalog.mista.ru/public/76287/
|
|||
6
Злопчинский
17.12.19
✎
17:58
|
..и у меня есть обработка типа, задаем типы цен, период.
рисует шахматку Цены-днипериода с раскладкой по изменению цен отсноительно предыдущего дня, плюс/минус в абсолютном выражении и в процентах. показывает "новые" цены. делал когда-то давно на фармотпте, там цены плавали часто и сильно, надо было мониторить после автообновления прайсов (манин мегапрайс тогда как класс отсутсвоал да и сейчас не умеет коечто из того что мое "прайс-аналит" умел"... |
|||
7
Злопчинский
17.12.19
✎
17:59
|
в обработке еще ворота изменения можно задать, чтобы быстро фильтровать и еще что-то, не помню...
|
|||
8
zenon46
17.12.19
✎
18:08
|
(3) как раз скорость очень важна, представьте, выбираем номенклатуру, нажимаем кнопочку и ждем((((
|
|||
9
zenon46
17.12.19
✎
18:08
|
(2) это как ?
|
|||
10
Злопчинский
17.12.19
✎
18:13
|
(8) нифига не важна.
для разовых эпизодических - подождут секунд ..надцать для ОДНОГО ГРАФИКА. если графика много и часто - чтото в консерватории не то. надо вытаскивать что решают с помощью этих графиков как и зачем. у меня были попытки графиков, но неудачные, все равно все сваливались потому к цифрам. графики тупо оценить тенденцию на периоде. нахрен на каждый день, точка - 1 неделя. динамику будет видно тренд. имхо, тупо. |
|||
11
Djelf
17.12.19
✎
18:25
|
(9) На 1sqlite так. Поправить под mssql не сильно сложно.
И этот запрос будет значительно быстрее, чем дергать в цикле $ПоследнееЗначение. |
|||
12
trad
17.12.19
✎
21:08
|
(0) по семантике не скажу - не вникал.
по синтаксису: тут так CREATE TABLE #Период (val datetime PRIMARY KEY); тут так INSERT INTO #Период VALUES (@НачДата) ну и SELECT Товары.CODE as Код, ДатыТовары.Товар as [Номенклатура $Справочник.Номенклатура], ДатыТовары.Дата as Дата, $ПоследнееЗначение.Цены.Цена(ДатыТовары.Товар, ДатыТовары.Дата) as Цена |
|||
13
GreyK
18.12.19
✎
04:14
|
Как всё с "прямыми" сложно, толи дело просто в пофигураторе создал запрос, подсунул ему в формулу расчет цены и сидишь в ус не дуешь. Мне даже интересно что быстрее отработает, я ставлю на кривые запросы 1С.
|
|||
14
Sserj
18.12.19
✎
07:53
|
SELECT
#Период.val as [Дата], #TempTable.val as [Товар], $ПоследнееЗначение.Цены.Цена(select СпрЦены.id from $Справочник.Цены as СпрЦены where СпрЦены.parentext = #TempTable.val and $СпрЦены.ТипЦен = :ТипЦены, #Период.val),0) AS Цена FROM #Период CROSS JOIN #TempTable |
|||
15
DeMi4
18.12.19
✎
08:45
|
(13) Быстрее однозначно ПрямойЗапрос, если он не через полупопие написан!
|
|||
16
zenon46
18.12.19
✎
20:49
|
С датами и ценой на каждую дату разобрался. А как имея СЗ из ТиповЦен, сформировать таблицу в которой бы полями были эти самые типы цен, и на каждую номенклатуру была бы одна строка, а то у меня получилось только так что количество строк равно номенклатура*количество типов цен.
Тут уже без дат, пытаюсь на одну дату это сделать : |SELECT | СпрНоменклатура.ID AS [Номенклатура $Справочник.Номенклатура], | ISNULL($ПоследнееЗначение.Цены.Цена(СпрЦены.ID, :ДатаЦен),0) AS ЦенаЦены, | СпрТипыЦен.id AS [ТипЦены $Справочник.ТипыЦен] |FROM | $Справочник.Номенклатура AS СпрНоменклатура With (NOLOCK) |LEFT JOIN | $Справочник.Цены AS СпрЦены With (NOLOCK) ON (СпрЦены.ParentExt = СпрНоменклатура.ID) |LEFT JOIN | $Справочник.ТипыЦен AS СпрТипыЦен With (NOLOCK) ON ($СпрЦены.ТипЦен = СпрТипыЦен.id) |WHERE | СпрНоменклатура.ID in (SELECT val FROM #TempTable) | AND СпрТипыЦен.ID in (SELECT val FROM #TempTablePrice) |
|||
17
zenon46
19.12.19
✎
09:19
|
Подниму темку....
|
|||
18
trad
19.12.19
✎
09:54
|
ТекстЗапроса = "
|SELECT | СпрНоменклатура.ID [Номенклатура $Справочник.Номенклатура] | /*ЦенаПоТипу*/ |FROM | $Справочник.Номенклатура AS СпрНоменклатура With (NOLOCK) |"; Для Тек = 1 По сз.РазмерСписка() Цикл ТипЦены = сз.ПолучитьЗначение(Тек); рс.установитьтекстовыйпараметр("ТипЦены" + Тек, ТипЦены); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "/*ЦенаПоТипу*/", " ,ISNULL( | $ПоследнееЗначение.Цены.Цена( | ( | select top 1 | СпрЦены.ID | from $Справочник.Цены AS СпрЦены With (NOLOCK) | where СпрЦены.ParentExt = СпрНоменклатура.ID | and $СпрЦены.ТипЦен = :Типцены" + Тек + " | ), :ДатаЦен | ), 0 | ) AS ЦенаПоТипу" + Тек + " | /*ЦенаПоТипу*/ |"); КонецЦикла |
|||
19
trad
19.12.19
✎
09:54
|
как то так
|
|||
20
zenon46
19.12.19
✎
13:35
|
(18) как только не пробовал, все время вываливается ошибка "Meta name parser error: неизвестное метаимя или алиас "$Справочник"", хотя и текст запроса проверял, не понятно.
|
|||
21
trad
19.12.19
✎
15:27
|
(20) должен сказать, я запрос не проверял, писал на коленке
|
|||
22
trad
19.12.19
✎
15:29
|
возможно, нужно будет сделать вложенные запросы
во вложенном вычислить вот это (select top 1 СпрЦены.ID ... $СпрЦены.ТипЦен = :Типцены" + Тек + ") а во внешнем уже $ПоследнееЗначение.Цены.Цена(... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |