Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
20 мая 2024, 06:42

Cрез последних своими руками

Автор sashakamen, 29 ноя 2023, 08:56

0 Пользователей и 1 гость просматривают эту тему.

sashakamen

Задача состоит в следующем: Создать таблицу значений, передать её на вход в запрос, и для каждой строки определить цену на данный момент.
Я сделал таблицу, и заполнил её:
   КвалификаторыСтроки = Новый КвалификаторыСтроки(50);
   
    ТаблицаНоменклатуры = Новый ТаблицаЗначений;
    ТаблицаНоменклатуры.Колонки.Добавить("Номенклатура",     Новый ОписаниеТипов("Строка", ,КвалификаторыСтроки));
    ТаблицаНоменклатуры.Колонки.Добавить("Цена",        Новый ОписаниеТипов("Число"));
   //ТаблицаНоменклатуры.Колонки.Добавить("Цена1",    Новый ОписаниеТипов("Число"));
    ТаблицаНоменклатуры.Колонки.Добавить("Период",    Новый ОписаниеТипов("Дата"));

     
    НоваяСтрока = ТаблицаНоменклатуры.Добавить();
    НоваяСтрока.Номенклатура = "Ручка";
    НоваяСтрока.Цена = "50";
   НоваяСтрока.Период = "20230101";
   
    НоваяСтрока = ТаблицаНоменклатуры.Добавить();
    НоваяСтрока.Номенклатура = "Карандаш";
    НоваяСтрока.Цена = "100";
   НоваяСтрока.Период = "20230102";

    НоваяСтрока = ТаблицаНоменклатуры.Добавить();
    НоваяСтрока.Номенклатура = "Ручка";
    НоваяСтрока.Цена = "150";
   НоваяСтрока.Период = "20230103";
   
   НоваяСтрока = ТаблицаНоменклатуры.Добавить();
    НоваяСтрока.Номенклатура = "Ручка";
    НоваяСтрока.Цена = "240";
   НоваяСтрока.Период = "20230105";
   
   НоваяСтрока = ТаблицаНоменклатуры.Добавить();
    НоваяСтрока.Номенклатура = "Ручка";
    НоваяСтрока.Цена = "210";
   НоваяСтрока.Период = "20230106";

Написал следующий запрос:

   Запрос = Новый Запрос;
   Запрос.Текст =
      "ВЫБРАТЬ
      |   ВременнаяТаблица.Номенклатура КАК Номенклатура,
      |   ВременнаяТаблица.Цена КАК Цена,
      |   ВременнаяТаблица.Период КАК Период
      |ПОМЕСТИТЬ ВТНоменклатура
      |ИЗ
      |   &ВременнаяТаблица КАК ВременнаяТаблица
      |;
      |
      |////////////////////////////////////////////////////////////////////////////////
      |ВЫБРАТЬ
      |   ВТНоменклатура.Номенклатура КАК Номенклатура,
      |   ВТНоменклатура.Цена КАК Цена,
      |   ВТНоменклатура1.Цена КАК Цена1,
      |   МАКСИМУМ(ВТНоменклатура.Период) КАК Период,
      |   ВТНоменклатура1.Период КАК Период1
      |ИЗ
      |   ВТНоменклатура КАК ВТНоменклатура
      |      ЛЕВОЕ СОЕДИНЕНИЕ ВТНоменклатура КАК ВТНоменклатура1
      |      ПО ВТНоменклатура.Номенклатура = ВТНоменклатура1.Номенклатура
      |         И ВТНоменклатура.Период >= ВТНоменклатура1.Период
      |ГДЕ
      |   ВТНоменклатура.Период <= &Период
      |   И ВТНоменклатура1.Номенклатура = ВТНоменклатура.Номенклатура
      |
      |СГРУППИРОВАТЬ ПО
      |   ВТНоменклатура.Цена,
      |   ВТНоменклатура1.Цена,
      |   ВТНоменклатура.Номенклатура,
      |   ВТНоменклатура1.Период";
   
    Запрос.УстановитьПараметр("ВременнаяТаблица", ТаблицаНоменклатуры);
   Запрос.УстановитьПараметр("Период", ТекущаяДата());


     
    Выборка = Запрос.Выполнить().Выгрузить();
 Запрос двоит записи и выводит не то что надо :(
Как исправить запрос?

LexaK

sashakamen, возможны несколько вариантов запроса, вот один из них,
часть запроса, проверено в консоли, работает
выбрать //сначала общий отбор на интересующую дату, дата среза
таб.*
поместить втОтборНаДату
из
ВТНоменклатура таб
где       
таб.период <= &Период
;

выбрать //оставляем только последние
таб.*
из
втОтборНаДату таб
левое соединение втОтборНаДату таб2
по таб.Номенклатура = таб2.Номенклатура
и таб.Период < таб2.Период
где       
таб2.период есть null

если помогло нажмите: Спасибо!

fruitella

sashakamen, Не так передал таблицу в параметрах, ты передаешь только ТипЗнач(ТаблицаЗначений), надо вот так:
Запрос.УстановитьПараметр("ВременнаяТаблица", ТаблицаНоменклатуры.Выгрузить());

LexaK

Цитата: fruitella от 29 ноя 2023, 11:00sashakamen, Не так передал таблицу в параметрах, ты передаешь только ТипЗнач(ТаблицаЗначений), надо вот так:
Запрос.УстановитьПараметр("ВременнаяТаблица", ТаблицаНоменклатуры.Выгрузить());
из таблицы значений не надо выгружать таблицу значений что бы передать ее в параметр запроса  :befhbt:
(вы хотя бы проверяли сначала представленный код)
если помогло нажмите: Спасибо!

fruitella

LexaK, Недавно проверял, все ок

sashakamen

LexaK, попытался по аналогии сделать, все равно не получается :( может быть у меня ошибка в запросе?
ВЫБРАТЬ
    ВременнаяТаблица.Номенклатура КАК Номенклатура,
    ВременнаяТаблица.Цена КАК Цена,
    ВременнаяТаблица.Период КАК Период
ПОМЕСТИТЬ ВТНоменклатура
ИЗ
    &ВременнаяТаблица КАК ВременнаяТаблица
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТНоменклатура.Номенклатура КАК Номенклатура,
    ВТНоменклатура.Цена КАК Цена,
    МАКСИМУМ(ВТНоменклатура.Период) КАК Период
ПОМЕСТИТЬ втОтборНаДату
ИЗ
    ВТНоменклатура КАК ВТНоменклатура
ГДЕ
    ВТНоменклатура.Период <= &Период

СГРУППИРОВАТЬ ПО
    ВТНоменклатура.Номенклатура,
    ВТНоменклатура.Цена
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТНоменклатура.Номенклатура КАК Номенклатура,
    ВТНоменклатура.Цена КАК Цена,
    ВТНоменклатура.Период КАК Период,
    втОтборНаДату.Цена КАК Цена1
ИЗ
    ВТНоменклатура КАК ВТНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ втОтборНаДату КАК втОтборНаДату
        ПО ВТНоменклатура.Номенклатура = втОтборНаДату.Номенклатура
            И ВТНоменклатура.Период < втОтборНаДату.Период

antoneus

Во втором запросе не надо цену выбирать.

ВЫБРАТЬ
    ВременнаяТаблица.Номенклатура КАК Номенклатура,
    ВременнаяТаблица.Цена КАК Цена,
    ВременнаяТаблица.Период КАК Период
ПОМЕСТИТЬ ВТНоменклатура
ИЗ
    &ВременнаяТаблица КАК ВременнаяТаблица
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТНоменклатура.Номенклатура КАК Номенклатура,
    МАКСИМУМ(ВТНоменклатура.Период) КАК Период
ПОМЕСТИТЬ втОтборНаДату
ИЗ
    ВТНоменклатура КАК ВТНоменклатура
ГДЕ
    ВТНоменклатура.Период <= &Период

СГРУППИРОВАТЬ ПО
    ВТНоменклатура.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТНоменклатура.Номенклатура КАК Номенклатура,
    ВТНоменклатура.Период КАК Период,
    втОтборНаДату.Цена КАК Цена
ИЗ
    ВТНоменклатура КАК ВТНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ втОтборНаДату КАК втОтборНаДату
        ПО ВТНоменклатура.Номенклатура = втОтборНаДату.Номенклатура
            И ВТНоменклатура.Период = втОтборНаДату.Период

LexaK

sashakamen, (странные люди)
вам присылают проверенный рабочий код (текст запроса)
вы себе в программу вставляете какую-то бредятину, и удивляетесь что она не работает!
получается что вы даже скопи-постить код не можете!
(а ведь на этом 80% работы программиста строится, именно скопировать чужой рабочий код и вставить его в свою программу)

если помогло нажмите: Спасибо!

sashakamen

LexaK, ещё раз пересмотрел ваш код, все получилось! спасибо большое :ehtwj:

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск