Имя: Пароль:
1C
1C 7.7
v7: Не получается добавить поле в прямой запрос
0 zenon46
 
09.12.19
20:34
Доброго вечера!
Есть прямой запрос, получения остатков и поступлений по дням, не получается добавить Поле, в идеале поле "контрагент" из документа Поступления, но и саму ссылку на документ не получается добавить. Текст запроса ниже, что касаемо документа или контрагента убрал, этот запрос полностью рабочий :

    |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
    |;
    |IF EXISTS(SELECT * FROM tempdb..sysobjects WHERE id = object_id('tempdb..#Итоги'))
    |    DROP TABLE #Итоги
    |;
    |CREATE TABLE #Итоги (Дата char(8), Товар char(9), Остаток int, Оборот int, Поступление int)
    |;
    |CREATE INDEX DateItem ON #Итоги (Товар,Дата)
    |;
    |INSERT INTO #Итоги (Дата,Товар,Остаток,Оборот,Поступление)
    |SELECT
    |    ДатыТовары.Дата             as [Дата $Дата],
    |    ДатыТовары.Товар            as [Товар $Справочник.Номенклатура],
    |    SUM(ДатыТовары.Остаток)     as [Остаток $Число],
    |    SUM(ДатыТовары.Оборот)      as [Оборот $Число],
    |    SUM(ДатыТовары.Поступление) as [Поступление $Число]
    |FROM
    |  (SELECT
    |     #Период.val    as [Дата],
    |     #TempTable.val as [Товар],
    |     0              as [Остаток],
    |     0              as [Оборот],
    |     0              as [Поступление]
    |  FROM
    |    #Период CROSS JOIN #TempTable
    |UNION ALL
    |  SELECT
    |     :НачДата,
    |     Остатки.Номенклатура,
    |     Остатки.КоличествоОстаток,
    |     0,
    |     0
    |FROM
    |    $РегистрОстатки.ОстаткиТМЦ(:НачДата,,Фирма = :ВыбФирма AND Номенклатура IN (SELECT val FROM #TempTable),(Номенклатура),(Количество)) as Остатки
    |UNION ALL
    |   SELECT
    |      SUBSTRING(Обороты.Date_Time_Iddoc,1,8)                                                                     AS [Дата],
    |      $Обороты.Номенклатура                                                                                       AS [Товар],
    |      0                                                                                                         AS [Остаток],
    |      SUM(CASE WHEN Обороты.DEBKRED = 0 THEN $Обороты.Количество ELSE $Обороты.Количество * (-1) END)             AS [Оборот],
    |      SUM(CASE WHEN Обороты.IDDOCDEF = $ВидДокумента.ПоступлениеТМЦ_Склад THEN $Обороты.Количество ELSE 0 END) AS [Поступление]
    |    FROM
    |      $Регистр.ОстаткиТМЦ as Обороты
    |    WHERE
    |      Обороты.Date_Time_Iddoc between :НачДата AND :КонДата~ AND
    |      $Обороты.Номенклатура IN (SELECT val FROM #TempTable) AND
    |       $Обороты.Фирма = :ВыбФирма
    |    GROUP BY
    |       SUBSTRING(Обороты.Date_Time_Iddoc, 1, 8), $Обороты.Номенклатура, Обороты.IDDoc    
    |  ) as ДатыТовары
    |GROUP BY
    |  ДатыТовары.Дата, ДатыТовары.Товар
    |;
    |DROP TABLE #Период
    |;
    |DECLARE @CurrentMove   as int
    |DECLARE @CurrentQty    as int
    |DECLARE @NextQty       as int
    |DECLARE @CurrentItem   as char(9)
    |DECLARE @LastItem      as char(9)
    |SET @LastItem = ''
    |
    |DECLARE cur CURSOR LOCAL FORWARD_ONLY FOR
    |SELECT Оборот,Товар,Остаток
    |FROM #Итоги
    |ORDER BY Товар,Дата
    |FOR UPDATE
    |
    |OPEN cur
    |FETCH NEXT FROM cur INTO @CurrentMove, @CurrentItem, @CurrentQty
    |WHILE @@FETCH_STATUS = 0
    |BEGIN
    |  IF NOT @LastItem = @CurrentItem
    |    BEGIN
    |       SET @NextQty = @CurrentQty + @CurrentMove
    |       SET @LastItem = @CurrentItem
    |    END
    |  ELSE
    |    BEGIN
    |      UPDATE #Итоги
    |      SET Остаток = @NextQty
    |      WHERE CURRENT OF cur
    |      SET @NextQty = @NextQty + @CurrentMove
    |    END
    |FETCH NEXT FROM cur INTO @CurrentMove, @CurrentItem, @CurrentQty
    |END
    |;
    |CLOSE cur
    |;
    |deallocate cur
    |;
    |SELECT
    |    Товары.CODE       as [Код $Строка],
    |    Итоги.Товар       as [Номенклатура $Справочник.Номенклатура],
    |    Итоги.Остаток     as [Остаток $Число],
    |    Итоги.Поступление as [Поступление $Число],    
    |    Итоги.Дата        as [Дата $Дата]
    |FROM
    |   #Итоги as Итоги
    |   JOIN $Справочник.Номенклатура as Товары ON Итоги.Товар = Товары.ID
    |ORDER BY
    |   Итоги.Дата, Товары.DESCR, Товары.ID
    |;
    |DROP TABLE #Итоги
    |;
    |SET NOCOUNT OFF
    |";
1 Franchiser
 
гуру
09.12.19
21:40
Контрагента в Итоги?
2 zenon46
 
09.12.19
21:58
(1) ну скорей сюда надо добавить as ДатыТовары, Контрагента из Документа ПоступлениеТМЦ_Склад
3 mikecool
 
09.12.19
23:22
(2) остатки тмц в разрезе контрагентов?
4 zenon46
 
10.12.19
07:19
Вопрос снимаю, т.к. изначально выбрал не правильный путь, получения данных.
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс