|
Запрос в цикле (обороты за разные периоды) | ☑ | ||
---|---|---|---|---|
0
badboychik
05.04.12
✎
10:21
|
Такая ситуация - надо получить таблицу
"Клиент, Долг клиента на сегодня, Обороты за период", но период для оборотов у каждого клиента разный - число дней указано в договоре. Коррелированные подзапросы в 1С не поддерживаются (нельзя во вложенном подставить поле из внешнего запроса), остается циклом? Еще в СКД можно передать в набор параметр из другого, пробую пока |
|||
1
mirosh
05.04.12
✎
10:22
|
придется вытаскивать на каждый день
|
|||
2
Cube
05.04.12
✎
10:24
|
(0) Возьми полную таблицу регистра, не виртуальную.
|
|||
3
badboychik
05.04.12
✎
10:26
|
(2) а дальше что с ней делать
|
|||
4
Cube
05.04.12
✎
10:27
|
(3) Условие по периоду накладывай и вперде
|
|||
5
John83
05.04.12
✎
10:29
|
(2) да можно и виртуальную, только периодичность поставить
|
|||
6
John83
05.04.12
✎
10:29
|
посмотри тут
v8: Отчет с "хитрой" периодичностью |
|||
7
badboychik
05.04.12
✎
10:34
|
(4) значение в условии оно одно для всех, а мне надо чтоб для каждого клиента обороты считались за разные периоды
|
|||
8
Cube
05.04.12
✎
10:37
|
(7) Да ты не в условия пихай свой отбор по периоду а делай вычисляемое поле запроса, типа такого:
ВЫБОР КОГДА Обороты.Период <= Договор.ДатаОкончания И Обороты.Период >= Договор.ДатаНачала ТОГДА Обороты.СуммаОборот ИНАЧЕ 0 КОНЕЦ |
|||
9
badboychik
05.04.12
✎
10:55
|
хм.. похоже на решение, только надо выборку по регистру за 45 дней делать, т.к. период может колебаться от 5 до 45 дней
|
|||
10
badboychik
05.04.12
✎
12:35
|
удалось в СКД сделать
|
|||
11
Kashemir
05.04.12
✎
12:36
|
(0) Коррелированные запросы поддерживаются, но только для конструкций В ()
|
|||
12
badboychik
05.04.12
✎
12:50
|
Точно? Из этих скобок можно обращаться к полям главного запроса?
|
|||
13
Cube
05.04.12
✎
12:54
|
(12) Нет, можно туда вписать ещё один мини-запросик:
ВЫБРАТЬ КурсыВалютСрезПоследних.Валюта, КурсыВалютСрезПоследних.Курс, КурсыВалютСрезПоследних.Кратность ИЗ РегистрСведений.КурсыВалют.СрезПоследних( &Период, Валюта В (ВЫБРАТЬ Валюты.Ссылка ИЗ Справочник.Валюты КАК Валюты ГДЕ Валюты.Код <> "643")) КАК КурсыВалютСрезПоследних |
|||
14
Kashemir
05.04.12
✎
12:57
|
(12)Можно
В развитие примера (суть масло масленная) ВЫБРАТЬ КурсыВалютСрезПоследних.Валюта, КурсыВалютСрезПоследних.Курс, КурсыВалютСрезПоследних.Кратность ИЗ РегистрСведений.КурсыВалют.СрезПоследних( &Период, Валюта В (ВЫБРАТЬ Валюты.Ссылка ИЗ Справочник.Валюты КАК Валюты ГДЕ Валюты.Ссылка = КурсыВалютСрезПоследних.Валюта)) КАК КурсыВалютСрезПоследних |
|||
15
Cube
05.04.12
✎
12:58
|
(14) Тупой копипастинг!!! :D
|
|||
16
Cube
05.04.12
✎
12:59
|
+(15) Так, что-то я поторопился с выводами... :)
|
|||
17
badboychik
05.04.12
✎
13:00
|
(13) это обычный подзапрос! Вот в (14) корреляция есть. Только я сомневаюсь что он заработает
|
|||
18
Cube
05.04.12
✎
13:00
|
(14) Не фурычит, ошибка:
Поле не найдено "КурсыВалютСрезПоследних.Валюта" Валюты.Ссылка = <<?>>КурсыВалютСрезПоследних.Валюта)) КАК КурсыВалютСрезПоследних |
|||
19
badboychik
05.04.12
✎
13:01
|
тото и оно :D
|
|||
20
Kashemir
05.04.12
✎
13:02
|
ВЫБРАТЬ
КурсыВалют.Период, КурсыВалют.Валюта, КурсыВалют.Курс, КурсыВалют.Кратность ИЗ РегистрСведений.КурсыВалют КАК КурсыВалют ГДЕ КурсыВалют.Период В (ВЫБРАТЬ МАКСИМУМ(КВ.Период) КАК Период ИЗ РегистрСведений.КурсыВалют КАК КВ ГДЕ КВ.Валюта = КурсыВалют.Валюта) |
|||
21
ssh2006
05.04.12
✎
13:02
|
(0) >...Коррелированные подзапросы в 1С не поддерживаются
Поддерживаются. Можно использовать поле внешней таблицы в подзапросе в условии соединения или в условии запроса. |
|||
22
Kashemir
05.04.12
✎
13:02
|
(20) Имитация среза последних по физической таблице
|
|||
23
badboychik
05.04.12
✎
13:03
|
интересно... У 1С что, свой скуль-движок в ядре, который в корне отличается от MS SQL и не умеет такие вещи делать?
|
|||
24
Kashemir
05.04.12
✎
13:04
|
(23) Не - просто SDBL это упрощенная модель TSQL имеющая ряд ограничений, правда и плюсов (в читаемости)
|
|||
25
badboychik
05.04.12
✎
13:05
|
(21) "в условии запроса" ? в (14) это сделано и не пашет. А условие соединения это не корреляция
|
|||
26
Kashemir
05.04.12
✎
13:05
|
(25) В 14 просто виртуальная таблица ... я навскидку написал. Посмотри 20.
|
|||
27
ssh2006
05.04.12
✎
13:06
|
(25) > ... "в условии запроса"
секция ГДЕ |
|||
28
Cube
05.04.12
✎
13:07
|
(20) Ну... Что ж вы нам тухлые помидоры под видом спелых мандарин продаете?))))
|
|||
29
Kashemir
05.04.12
✎
13:08
|
(28) Что не так ?
|
|||
30
Axel2009
05.04.12
✎
13:10
|
НАЧАЛОПЕРИОДА(Период, зависит от условий договора)
ОБОРОТЫ (, , День) |
|||
31
badboychik
05.04.12
✎
13:17
|
На СКД медленно работает.
Кажется оно просто за меня выполняет в цикле запрос по второму набору |
|||
32
Cube
05.04.12
✎
13:19
|
(31) Запрос в студию
|
|||
33
badboychik
05.04.12
✎
13:24
|
там два запроса и три связи между наборами
|
|||
34
Cube
05.04.12
✎
13:25
|
(33) А че в одном запросе не сделал?
|
|||
35
badboychik
05.04.12
✎
13:30
|
чтоб как в (8) ? Решил все таки СКД победить :)
|
|||
36
badboychik
05.04.12
✎
13:31
|
Вот пример запроса со вложенным кореллированным.
Тупой запрос, но все равно не работает. ВЫБРАТЬ Т.Номенклатура, СУММА(Т.Количество) КАК Количество, СУММА(Т.Сумма) КАК Сумма ИЗ Документ.РеализацияТоваровУслуг.Товары КАК Т ГДЕ Т.Ссылка В( ВЫБРАТЬ Документы.Ссылка КАК Ссылка ИЗ Документ.РеализацияТоваровУслуг КАК Документы ГДЕ Документы.Контрагент = Т.Контрагент // ВОТ ССЫЛКА НА ВНЕШНЕЕ ПОЛЕ, ТУТ ОШИБКА ВЫЛАЗИТ И Документы.Дата > &Дата) СГРУППИРОВАТЬ ПО Т.Номенклатура |
|||
37
ssh2006
05.04.12
✎
13:34
|
(36) Нет такого поля во внешнем запросе - Т.Контрагент
|
|||
38
badboychik
05.04.12
✎
13:36
|
и что? в SQL будет работать, потому что Т это таблица и доступны все ее поля
|
|||
39
badboychik
05.04.12
✎
13:37
|
даже если добавить Т.Контрагент в главный, все равное не работает
|
|||
40
Kashemir
05.04.12
✎
13:39
|
(36) Ты ж к ТЧ обращаешся. Там нет контрагента. Так надо:
ВЫБРАТЬ Т.Номенклатура, СУММА(Т.Количество) КАК Количество, СУММА(Т.Сумма) КАК Сумма ИЗ Документ.РеализацияТоваровУслуг.Товары КАК Т ГДЕ Т.Ссылка В (ВЫБРАТЬ Документы.Ссылка КАК Ссылка ИЗ Документ.РеализацияТоваровУслуг КАК Документы ГДЕ Документы.Контрагент = Т.Ссылка.Контрагент И Документы.Дата > &Дата) СГРУППИРОВАТЬ ПО Т.Номенклатура |
|||
41
badboychik
05.04.12
✎
13:40
|
оппппа! работает )
|
|||
42
Cube
05.04.12
✎
13:40
|
(35) Может я чего не догднал, но:
ВЫБРАТЬ ВзаиморасчетыСКонтрагентамиОстатки.Организация, ВзаиморасчетыСКонтрагентамиОстатки.Контрагент, ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента, ВзаиморасчетыСКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток КАК Сальдо, СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовПриход, 0)) КАК Приход, СУММА(ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход, 0)) КАК Расход ИЗ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(&Период, ) КАК ВзаиморасчетыСКонтрагентамиОстатки ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(&НачалоПериода, &КонецПериода, Запись, ) КАК ВзаиморасчетыСКонтрагентамиОбороты ПО ВзаиморасчетыСКонтрагентамиОстатки.Контрагент = ВзаиморасчетыСКонтрагентамиОбороты.Контрагент И ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента = ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента И ВзаиморасчетыСКонтрагентамиОстатки.Организация = ВзаиморасчетыСКонтрагентамиОбороты.Организация И (ВзаиморасчетыСКонтрагентамиОбороты.Период <= ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента.СрокДействия) И (ВзаиморасчетыСКонтрагентамиОбороты.Период >= ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента.Дата) СГРУППИРОВАТЬ ПО ВзаиморасчетыСКонтрагентамиОстатки.Организация, ВзаиморасчетыСКонтрагентамиОстатки.Контрагент, ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента, ВзаиморасчетыСКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток Строк в запросе 1519, время выполнения меньше секунды... |
|||
43
ssh2006
05.04.12
✎
13:41
|
(41) копи паст из документации на эту тему:
"Заметим, что из запроса операции В возможно обращение к полям таблиц, которые встречались во внешнем запросе до появления операции. Пример: Копировать в буфер обмена // Выбрать названия товаров, которые присутствовали // в расходных накладных ВЫБРАТЬ Товары.Наименование ИЗ Справочник.Номенклатура КАК Товары ГДЕ Товары.Ссылка В (ВЫБРАТЬ РасходнаяНакладнаяСостав.Номенклатура ИЗ Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав ГДЕ РасходнаяНакладнаяСостав.Номенклатура = Товары.Ссылка)" |
|||
44
Kashemir
05.04.12
✎
13:43
|
+(40) Хотя нафига тут корреляционный запрос не пойму. Чем отличается результат от :
ВЫБРАТЬ Т.Номенклатура, СУММА(Т.Количество) КАК Количество, СУММА(Т.Сумма) КАК Сумма ИЗ Документ.РеализацияТоваровУслуг.Товары КАК Т ГДЕ Т.Ссылка.Дата > &Дата СГРУППИРОВАТЬ ПО Т.Номенклатура |
|||
45
badboychik
05.04.12
✎
13:45
|
(44) я ж для примера привел, ничего лучше не придумал )
|
|||
46
Kashemir
05.04.12
✎
13:46
|
(45) Ааа ок :)
|
|||
47
Cube
05.04.12
✎
14:05
|
Так на чем остановились-то?
|
|||
48
badboychik
05.04.12
✎
14:08
|
Вот черт, похоже (42) это реально проще вариант
|
|||
49
Kashemir
05.04.12
✎
14:10
|
(48) Группировка по остатку - тебе так реально и надо ?
|
|||
50
Cube
05.04.12
✎
14:12
|
(49) Не вижу в этом ничего плохого. Задачу из (0) выполняет на ура.
|
|||
51
Kashemir
05.04.12
✎
14:13
|
(50) А чем к примеру агрегация через максимум хуже ?
|
|||
52
Cube
05.04.12
✎
14:14
|
(52) Отличия?
|
|||
53
Kashemir
05.04.12
✎
14:17
|
(52) Логичнее и наверняка быстрее (нет индексов для ресурса)
|
|||
54
Cube
05.04.12
✎
14:18
|
(53) Хз... Мне кажется без разницы. Да, к тому же, куда уж быстрее :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |