Имя: Пароль:
1C
1С v8
Помогите с запросом
0 abuca
 
08.11.13
09:31
Вот код:
    Запрос = Новый Запрос;
    МВТ = Новый МенеджерВременныхТаблиц;
    Запрос.МенеджерВременныхТаблиц = МВТ;
    Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 100
                   |    ШкалыПриборовУчета.Ссылка КАК Шкала,
                   |    ШкалыПриборовУчета.Владелец КАК Прибор
                   |ПОМЕСТИТЬ ТАБ1
                   |ИЗ
                   |    Справочник.ШкалыПриборовУчета КАК ШкалыПриборовУчета";
    Запрос1 = Новый Запрос;
    Запрос1.МенеджерВременныхТаблиц = МВТ;
    Запрос1.Текст = "ВЫБРАТЬ ПЕРВЫЕ 400
                    |    ПоказанияПриборовСрезПоследних.Шкала,
                    |    ПоказанияПриборовСрезПоследних.Период,
                    |    ПоказанияПриборовСрезПоследних.Показание
                    |ПОМЕСТИТЬ Таб2
                    |ИЗ
                    |    РегистрСведений.ПоказанияПриборов.СрезПоследних(&Период, ) КАК ПоказанияПриборовСрезПоследних";
    Запрос.УстановитьПараметр("Период",ДатаПоказаний);
    Запрос.Выполнить();
    Запрос1.Выполнить();
                    
    Запрос2 = Новый Запрос;
    Запрос2.МенеджерВременныхТаблиц = МВТ;
    Запрос2.Текст ="ВЫБРАТЬ
                   |    Таб1.Шкала,
                   |    Таб1.Прибор,
                   |    Таб2.Показание
                   |ИЗ
                   |    Таб1 КАК Таб1
                   |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таб2 КАК Таб2
                   |        ПО Таб1.Шкала = Таб2.Шкала";
                  
    Таб = Запрос2.Выполнить().Выгрузить();


Задача:
В запросе 2 должны выбираться НЕ ВСЕ показания, а заданное количество (например только 3 последних показания) на выбранную дату.

Совсем запутался, помогите, пожалуйста.
1 zak555
 
08.11.13
09:33
бери сразу данные из ПоказанияПриборов
2 Анютик
 
08.11.13
09:35
сортировка по дате по убыванию и потом топ 3. по идее должно сработать.
3 Анютик
 
08.11.13
09:36
и не понятно, зачем на 2 таблицы делите? одним запросом нельзя? ну со вложенным.
4 ИсчадиеADO
 
08.11.13
09:39
ПЕРВЫЕ 3  ... УПОРЯДОЧИТЬ ПО ...
5 Анютик
 
08.11.13
09:42
(4) ну а я что сказала?:)))
6 abuca
 
08.11.13
10:17
(2)(4)Поменял Запрос1  

    Запрос1 = Новый Запрос;
    Запрос1.МенеджерВременныхТаблиц = МВТ;
    Запрос1.Текст = "ВЫБРАТЬ ПЕРВЫЕ 3
                    |    ПоказанияПриборовСрезПоследних.Шкала,
                    |    ПоказанияПриборовСрезПоследних.Период КАК Период,
                    |    ПоказанияПриборовСрезПоследних.Показание
                    |ПОМЕСТИТЬ Таб2
                    |ИЗ
                    |    РегистрСведений.ПоказанияПриборов.СрезПоследних(&Период, ) КАК ПоказанияПриборовСрезПоследних
                    |
                    |УПОРЯДОЧИТЬ ПО
                    |    Период УБЫВ";



В этом случае выполнение запроса2 Формирует только 3 записи.

(3) япривел только часть пакета для наглядности. На самом деле первый запрос берет данные сразу из 2 регистров и трех справочников. И есть еще регистр накопления, но с ним проблем нет. Делю для того, чтобы показания приборов прилеплять в отчете в виде столбцов к соответствующему прибору, а не дублировать строки.
7 rphosts
 
08.11.13
10:32
(6) схема:
1.в манагера запроса отбираем первые 3 от соединение 3 справочников.

2.пакетный запрос:
2.1.отбираем срез 1 условием, что измерение в выборке Таб1, результат помещаем в ВТ.
2.2.отбираем срез 2 условием, что измерение в выборке Таб1, результат помещаем в ВТ.
2.3.соежиняем то что получили на 1., 2.1, 2.2
8 ИсчадиеADO
 
08.11.13
10:50
(5) пардон, у меня дурная привычка не читать все))
9 abuca
 
08.11.13
10:54
(7) ...я не волшебник, я только учусь (с)
ты мне мозг взорвал
1. как реализовать. знаю только как в МВТ закинуть таблицу целиком

2. если по показаниям около 500000 записей мы будем поднимать их как минимум 2 раза: в Запрос2, затем в пакетном запросе уже из ВТ
надо как-то сразу избавиться от лишнего. Брать только 3 записи.
Может правда подумать про вложенный запрос к показаниям (3):
Все формируем одним запросом, где приборы - вложенный запрос.

Затем строим саму печформу уже в ней сортируем по 3 строки вложенным циклом прилепляем столбцы.
10 rphosts
 
08.11.13
11:01
(9) ВТ = временная таблица, если условие воткнуть в параметры среза - будет построен другой запрос для получения среза, который учтёт условие наилучшим образом, условие типа такого:
Шкала В (Выбрать Таб1.Шкала Из Таб1 КАК Таб1)

получится что в манагере у тебя будет храниться максимум 3 записи, в 2.1 - максимум 3 записи и в 2.2 максимум 3 записи. соединить 3 выборки в которых не более чем по 3 записи - не вопрос.
11 rphosts
 
08.11.13
11:05
(9) > ...я не волшебник, я только учусь (с)
у мну стажа на 9 мес меньше
12 abuca
 
08.11.13
11:25
(10)Сейчас сильно подумаю.
(11)Ты счастливый человек, если хотя бы 50% своего времени можешь потратить на основное направление своей деятельности. Тем самым повышая уровень своего образования.
13 abuca
 
08.11.13
14:03
Сделал вложенным запросом.

Запрос.Текст = "ВЫБРАТЬ
               |    ШкалыПриборовУчета.Владелец,
               |    ШкалыПриборовУчета.Ссылка КАК Шкала,
               |    ВложенныйЗапрос.Период,
               |    ВложенныйЗапрос.Показание
               |ИЗ
               |    Справочник.ШкалыПриборовУчета КАК ШкалыПриборовУчета
               |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 3
               |            ПоказанияПриборов.Период КАК Период,
               |            ПоказанияПриборов.Шкала КАК Шкала,
               |            ПоказанияПриборов.Показание КАК Показание,
               |            ШкалыПриборовУчета.Ссылка КАК Ссылка,
               |            ШкалыПриборовУчета.Владелец КАК Владелец
               |        ИЗ
               |            Справочник.ШкалыПриборовУчета КАК ШкалыПриборовУчета
               |                ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПоказанияПриборов КАК ПоказанияПриборов
               |                ПО ШкалыПриборовУчета.Ссылка = ПоказанияПриборов.Шкала
               |        ГДЕ
               |            ШкалыПриборовУчета.Владелец = &Прибор) КАК ВложенныйЗапрос
               |        ПО ШкалыПриборовУчета.Ссылка = ВложенныйЗапрос.Шкала
               |ГДЕ
               |    ШкалыПриборовУчета.Владелец = &Прибор"

Результат - пустой.
Если Убрать "ПЕРВЫЕ 3" тогда в результат попадают все показания по каждой шкале.
Где я ошибся с соединениями во вложенном запросе???
14 abuca
 
08.11.13
14:08
Нашел:
ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 3
заменить на:
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 3
15 abuca
 
08.11.13
14:13
Только вот все-равно непонятно. Если всего шкал 10, Данные я получу как 3 строки на каждую шкалу. итого 30 строк.
А в результирующую таблицу надо расположить как:

Прибор : Шкала : Показание1 : Показание2: Показание3

Должно быть 10 строк, показания должны прилепляться отдельными столбцами.

Как сделать обход результата в цикле - я знаю. Но это некрасиво и медленно. А в запросе можно было бы назначить 3 переменные типа Показание1,2,3 которые вывести уже в столбцы.
Ну, гении, где вы?
16 dk
 
08.11.13
14:27
(15) через группировку и выбор обычно решается
ты накидай пример
исходная таблица ....
конечная ...
---
или тупо в колонках показания отсортированы?
а если пропуски будут?
17 rphosts
 
08.11.13
17:30
(12).2 время как хорошая бельгийская резина - понятие растяжимое... ночь-то на что?
18 rphosts
 
08.11.13
17:32
(15) что значит назначить переменные который вывести?
одно и то-же число для любой строки выборки?
19 Classic
 
08.11.13
17:35
Не понял вопрос.
Какие показания являются последними для выбранной даты?
Давай пример
20 Classic
 
08.11.13
17:36
Ты хочешь последние 3 по каждой шкале и прибору?
21 rphosts
 
08.11.13
17:36
(19) имхо, это лишнее, т.к. чел старается сделать сам!
22 Classic
 
08.11.13
17:37
(21)
А мисту используется в качестве лога? :)
23 Classic
 
08.11.13
17:39
В общем.
Таблица
Прибор  Шкала Период Значение

Последние три выбираются так
ВЫБРАТЬ
   ТЗ.*
ИЗ ТЗ КАК ТЗ
ГДЕ ТЗ.Период В
( ВЫБРАТЬ ПЕРВЫЕ 3
     ТЗ1.Период
  ИЗ ТЗ КАК ТЗ1
  ГДЕ ТЗ1.Шкала = ТЗ.ШКАЛА  
  УПОРЯДОЧИТЬ ПО ТЗ1.Период УБЫВ
)
24 viktor_vv
 
08.11.13
17:57
(23) Если у разных шкал есть одинаковые периоды может быть косяк. надежнее так будет

ВЫБРАТЬ
   ТЗ.*
ИЗ ТЗ КАК ТЗ
Внутреннее соединение
( ВЫБРАТЬ
     ТЗ1.Период ,
     ТЗ1.Шкала ,
     Количество(ТЗ2.Период)
  ИЗ ТЗ КАК ТЗ1 ,
     Левое соединение ТЗ КАК ТЗ2
      ПО ТЗ1.Шкала = ТЗ2.ШКАЛА  И  ТЗ1.Период >= ТЗ2.Период
  Группировать ПО ТЗ1.Период ,ТЗ1.Шкала
  Имеющие Количество(ТЗ2.Период) <=3
) КАК ПервыеТри ПО ПервыеТри.Шкала = ТЗ.Шкала и ПервыеТри.Период = ТЗ.Период
25 Classic
 
08.11.13
17:58
(24)
Не будет там косяка
26 viktor_vv
 
08.11.13
18:01
(25) Например есть период 01.11.2013 у двух шкал, но у одной он входит в первые три, а у второй не входит, но по (23) для второй он выведется, соотвественно будет четыре первых значения.
27 Classic
 
08.11.13
18:04
(26)
Не выведется
в подзапросе есть
ГДЕ ТЗ1.Шкала = ТЗ.Шкала
28 viktor_vv
 
08.11.13
18:10
(27) Че-то мне имхается, что не поможет это равенство. Точнее оно помогло бы, если бы поле Период было уникальным в таблице ТЗ.
29 Classic
 
08.11.13
18:26
(28)
Зачем имхаться? Проверь на любом РСе
30 viktor_vv
 
08.11.13
18:28
(29) Проверил на Заказе покупателя

     ТекстЗапроса = "ВЫБРАТЬ
     |    ЗаказПокупателя.Контрагент,
     |    ЗаказПокупателя.Ссылка,
     |    ЗаказПокупателя.Дата
     |ИЗ
     |    Документ.ЗаказПокупателя КАК ЗаказПокупателя
     |Где
     |    ЗаказПокупателя.Дата В
     |    (Выбрать Первые 1
     |        ЗаказПокупателя.Дата
     |    ИЗ
     |        Документ.ЗаказПокупателя КАК ЗаказПокупателя2
     |    Где
     |        ЗаказПокупателя2.Контрагент = ЗаказПокупателя.Контрагент
     |    Упорядочить ПО ЗаказПокупателя2.Дата УБЫВ
     |)
     |Упорядочить ПО ЗаказПокупателя.Контрагент.Наименование
     |";
    
     Запрос = Новый Запрос ;
    
     Запрос.Текст = Текстзапроса ;
    
     ТЗ = Запрос.Выполнить().Выгрузить();
    
     ТЗ.ВыбратьСтроку() ;


если дату время у двух заказов поставить одинаковые, то выводит два заказа для контаргента.
31 viktor_vv
 
08.11.13
18:28
(30)+ У двух заказов одного контаргента.
32 viktor_vv
 
08.11.13
18:29
(31)+ Упс, не прав. Сейчас попробую у разных.
33 Classic
 
08.11.13
18:32
(31)
При условии неуникальности периодов в рамках одной шкалы - да, будут некоторые проблеммы. Может оказаться больше трех значений.
Но у (0) период и шкала достаются с РСа, а там свяка Шкала/Период уникальны.
34 viktor_vv
 
08.11.13
18:44
(33) И кстати (30) там специально ничего не надо моделировать, он и так выводит фигню, но никак не последний заказ по контаргенту.
35 Classic
 
08.11.13
18:46
(34)
Потому что в подзапросе надо писать
ВЫБРАТЬ
  ЗаказПокупателя2.Дата
36 Classic
 
08.11.13
18:46
ПЕРВЫЕ 1

ну ты понил:)
37 viktor_vv
 
08.11.13
18:51
(36) Семен Семеныч :)). первые 1 там есть, а вот таблица явно не та :).
38 viktor_vv
 
08.11.13
19:04
Да, таки работает нормально. Че-то я загнался.
39 GROOVY
 
08.11.13
19:42
Неужели из стольких тем с подобным названием нет ответа на Ваш вопрос?

https://www.google.ru/search?q=помогите+с+запросом+site%3Aforum.mista.ru
40 sapphire
 
08.11.13
20:08
(39) Ага, и что это даст? Оне читать и думать не умеют :)
Пашь, миста нонче не та, нужен только готовый код.
Только готовый код, только хардкор:)
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан