|
Помогите с запросом | ☑ | ||
---|---|---|---|---|
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) Ага, и что это даст? Оне читать и думать не умеют :)
Пашь, миста нонче не та, нужен только готовый код. Только готовый код, только хардкор:) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |