Имя: Пароль:
1C
1С v8
Запрос
0 impulse9
 
28.08.13
05:25
Предположим, есть ТЗ с колонками:

Товар, Цена, Количество, Дата


Как запросом получить ТЗ с теми же колонками, но отбору по самой последней дате?


    Запрос=Новый запрос;
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    МенеджерТаблицыДанных = Запрос.МенеджерВременныхТаблиц;
    Запрос.Текст="ВЫБРАТЬ
                     |    ТЗ.Дата,
                     |    ТЗ.Количество,
                     |    ТЗ.Цена,
                     |    ТЗ.Товар
                     |ПОМЕСТИТЬ ТаблицаДанных
                     |ИЗ
                     |    &ТЗ КАК ТЗ";
    Запрос.УстановитьПараметр("ТЗ",ВходящаяТаблица);
    Запрос.Выполнить();    
    
    ЗапросКбазеДанных = Новый Запрос;
    ЗапросКбазеДанных.МенеджерВременныхТаблиц = МенеджерТаблицыДанных;
    ЗапросКбазеДанных.Текст = ?????
1 impulse9
 
28.08.13
05:29
Например, входящие данные:

Булка 60 1 11.01.13
Булка 15 1 10.01.13
Вилка 10 1 11.01.13
Вилка 15 1 12.01.13

Исходящие данные должны быть:

Булка 60 1 11.01.13
Вилка 15 1 12.01.13
2 Rie
 
28.08.13
05:31
(0) Сначала сгруппировать по первым трём колонкам и получить МАКСИМУМ от даты.
А затем - соединить с исходной таблицей по дате (ну и, наверное, товару? или что там для Вас важно).
3 Rie
 
28.08.13
05:35
+(2) Конечно, не по трём - а по товару (или что там для Вас важно).
4 impulse9
 
28.08.13
05:35
(2) А другого способа нет?

Поясню: в моем случае входящие данные - это не ТЗ, а результат запроса, и хотелось бы просто доработать сам запрос, а не выгружать его в ТЗ и обрабатывать.
5 Гефест
 
28.08.13
05:38
Это в запросе и делается
6 impulse9
 
28.08.13
05:42
(5) Поясняю: Запрос выполняется около 10 минут. Чтобы получить нужные данные по схеме (2), надо выполнить запрос 2 раза, т.е. потратить 20 минут. Или выгрузить в ТЗ и еще одним запросом получить нужные данные за 1 секунду.... но это будет уже 2й запрос, и будет некрасиво
7 Rie
 
28.08.13
05:45
(4) Именно в запросе.
Запрос.Текст=
"ВЫБРАТЬ
|    ТЗ.Дата,
|    ТЗ.Количество,
|    ТЗ.Цена,
|    ТЗ.Товар
|ПОМЕСТИТЬ ТаблицаДанных
|ИЗ
|    &ТЗ КАК ТЗ;
// это был Ваш запрос
|ВЫБРАТЬ
|    Товар
|,   МАКСИМУМ(Дата)
|ИЗ
|    ТаблицаДанных
|ПОМЕСТИТЬ ПоследниеДаты;
|ВЫБРАТЬ
|    ТаблицаДанных.Товар
|,   ТаблицаДанных.Цена
|,   ТаблицаДанных.Количество
|ИЗ
|    ТаблицаДанных
|    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПоследниеДаты
|        ПО ТаблицаДанных.Товар = ПоследниеДаты.Товар
|        И ТаблицаДанных.Дата = ПоследниеДаты.Дата";
8 Rie
 
28.08.13
05:45
+(7) Всё - в одном запросе.
9 impulse9
 
28.08.13
05:51
(8) Возможно, мне не удалось объяснить свою мысль.

В любом случае, Ваше решение рабочее и меня пока устраивает =)

Спасибо
10 Rie
 
28.08.13
05:52
(9) Насчёт эффективности? Не беспокойтесь. Это - максимально эффективно.
11 Wobland
 
28.08.13
05:54
(10) ты ж не знаешь, насколько эффективным путём он пришёл к этой своей ТЗ ;)
12 Rie
 
28.08.13
05:57
(11) "Ну, с моей стороны пули вылетели. Значит, проблема - у вас" (c) старый анекдот об админах