Имя: Пароль:
1C
1C 7.7
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 не сильно сложно.

SELECT
       Цены.PARENTEXT  [Номенклатура $Справочник.Номенклатура],
    Цены.ТипЦен [ТипЦен :Справочник.ТипыЦен],
    Константы.VALUE [Цена :Число.15.2],
    Константы.DATE [ДатаЦен :Дата]
FROM __1S_Const AS Константы
LEFT JOIN Справочник_Цены AS Цены ON Цены.ID=Константы.OBJID
WHERE   Константы.ID=:ИсторияРеквизита.Цены.Цена
ORDER BY Цены.PARENTEXT,Цены.ТипЦен,Константы.DATE


И этот запрос будет значительно быстрее, чем дергать в цикле $ПоследнееЗначение.
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 ... $СпрЦены.ТипЦен = :Типцены" + Тек + ")
а во внешнем уже $ПоследнееЗначение.Цены.Цена(...