Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   Знатоки СКД, убейте меня веником. (http://forums.kuban.ru/f1040/znatoki_skd_ubejte_menya_venikom-2244165.html)

Sadovnikov 23.02.2012 14:17

Знатоки СКД, убейте меня веником.
 
Запрос:
SELECT
(ВЫБОР
КОГДА Выборка.Касса = НЕОПРЕДЕЛЕНО ТОГДА NULL
ИНАЧЕ Выборка.Касса
КОНЕЦ) ВыборкаКасса,
Выборка.НачОстКасса,
Выборка.КонОстКасса,
Выборка.ПриходКасса,
Выборка.РасходКасса,
(ВЫБОР
КОГДА Выборка.Регистратор = НЕОПРЕДЕЛЕНО ТОГДА NULL
ИНАЧЕ Выборка.Регистратор
КОНЕЦ) Регистратор,
Выборка.ПериодСекунда
FROM
(
SELECT
регКасса.Касса Касса,
регКасса.СуммаНачальныйОстаток НачОстКасса,
регКасса.СуммаКонечныйОстаток КонОстКасса,
регКасса.СуммаПриход ПриходКасса,
регКасса.СуммаРасход РасходКасса,
регКасса.ПериодСекунда ПериодСекунда,
регКасса.Регистратор
FROM
РегистрНакопления.ОстаткиВКассе.ОстаткиИОбороты(**&НачПериода**, **&КонПериода**, Авто) регКасса

) Выборка

При детализации Касса/Регистратор получаем:
Нач. остаток - 0
Приход - 1300
Расход - 0
Кон. остаток - 1300.

Эти цифры - верные.
Убираю галку с детализации Регистратор и получаю:

Нач. остаток - 2700
Приход - 1300
Расход - 0
Кон. остаток - 4000.

Вот кто дурак и что делать?

Маус 23.02.2012 14:19

СКД - это вынос мозга... Бежать, пора бежать!;-)

Sadovnikov 23.02.2012 14:19

2-Маус > Я бы с радостью. Но ранее взятые обязательства надо выполнять.

Reaper 23.02.2012 14:46

1. Убрать вложенный запрос
2. Проверить наличие соответствующих ролей остатков у полей компоновки

Если не спасет, то
3. Автозаполнение СКД отключить, описывать поля в запросе конструкциями СКД. Роли установить вручную.

Sadovnikov 23.02.2012 14:49

4-Reaper >
1. Нельзя. Во вложенном запросе будет несколько подзапросов, объединенных UNION. На данный момент все убрано для локализации ошибки.
2. В ролях Нач и Кон остатки указано: "Остатки", Имя: "Группа", Тип - соответствующий тип.
3. Вот здесь не понял. Вроде, элементарный запрос? Зачем такие сложности?

roma n 23.02.2012 14:55

5-Sadovnikov > а тексты реально исполняемых запросов не смотрел?
ИМХО ПериодСекунда без Регистратор такую шутку играют

Sadovnikov 23.02.2012 14:56

6-roma n > Смотрел, конечно:

ВЫБРАТЬ
ВЫБОР
КОГДА Выборка.Касса = НЕОПРЕДЕЛЕНО
ТОГДА NULL
ИНАЧЕ Выборка.Касса
КОНЕЦ КАК ВыборкаКасса,
Выборка.НачОстКасса КАК НачОстКасса,
Выборка.КонОстКасса КАК КонОстКасса,
Выборка.ПриходКасса КАК ПриходКасса,
Выборка.РасходКасса КАК РасходКасса,
ПРЕДСТАВЛЕНИЕССЫЛКИ(ВЫБОР
КОГДА Выборка.Касса = НЕОПРЕДЕЛЕНО
ТОГДА NULL
ИНАЧЕ Выборка.Касса
КОНЕЦ) КАК ВыборкаКассаПредставление
ИЗ
(ВЫБРАТЬ
регКасса.Касса КАК Касса,
регКасса.СуммаНачальныйОстаток КАК НачОстКасса,
регКасса.СуммаКонечныйОстаток КАК КонОстКасса,
регКасса.СуммаПриход КАК ПриходКасса,
регКасса.СуммаРасход КАК РасходКасса,
регКасса.ПериодСекунда КАК ПериодСекунда,
регКасса.Регистратор КАК Регистратор
ИЗ
РегистрНакопления.ОстаткиВКассе.ОстаткиИОбороты(&П2, &П, Авто, , ) КАК регКасса) КАК Выборка
КонПериода: 29.02.2012 23:59:59
НачПериода: 01.02.2012 0:00:00
П: 29.02.2012 23:59:59
П2: 01.02.2012 0:00:00
Период: 01.02.2012 - 29.02.2012

Sadovnikov 23.02.2012 14:58

Твою ж мать... Поставил галку "Обязательный" тому самому ПериодСекунда. И цифры стали правильными...

6-roma n > Спасибо огромное!!!

Reaper 23.02.2012 15:04

5-Sadovnikov >
1. Я бы использовал объединение простых наборов данных
2. Все верно
3. Оптимизатор иногда так доставляет при автозаполнении, что диву даешься.

7-Sadovnikov > Это при втором варианте? Ну вот тебе и ответ - оптимизатор из вложенного запроса не выбросил ни секунду, ни регистратор. Либо избавься от вложенного запроса, либо пиши конструкциями компоновки разрешение на манипуляцию с полями вложенного запроса, причем псевдонимы полей для вложенного запроса и для основного должны совпадать, чтобы оптимизатор их синхронно выкидывал...

Sadovnikov 23.02.2012 15:05

9-Reaper > В том-то и дело, что выбросил... Секунду. И посчитал погоду в результате...

Reaper 23.02.2012 15:09

(10) При второй настройке ни секунда, ни регистратор во [b]вложенном[/b] запросе не нужны вообще. Но они остались и записей в результирующий набор данных попало больше, чем нужно. Записей по совпадающим значениям группировок несколько, а периода нигде нет - вот компоновщик и охренел мальца. Ты сейчас искусственно заставишь тащить из базы все, вплоть до регистратора - это решит проблему, но запрос виртуальной таблицы будет сложнее, чем минимально нужный. Вот и все. Дальше смотри по обстановке, нужно бороться за производительность или и так сойдет.

Sadovnikov 23.02.2012 15:11

11-Reaper > "Ты сейчас искусственно заставишь тащить из базы все" - и, если честно, тихо охреневаю от этого...
И еще больше охреневаю от конструкции:

(ВЫБОР
КОГДА Выборка.Регистратор = НЕОПРЕДЕЛЕНО ТОГДА NULL
ИНАЧЕ Выборка.Регистратор
КОНЕЦ) Регистратор,

Reaper 23.02.2012 15:18

12-Sadovnikov > От этих выборов я еще на старте мальца охренел. Потом списал на объединение с какими-то еще запросами. Потому, что я бы их выбросил нафик. Ну и повторюсь - правильный вариант это не обязательное использование секунды, а указание полей доступных для выбора компоновщику под одинаковыми псевдонимами.
Я тут с месяц назад отчет по анализу цен закупок ваял в условиях когда закупки то в евро, то в злотых, то в юанях... вот уж где мы с оптимизатором набодались. Он мне такие запросы к курсам валют, такие пересчеты делал - диво дивное. Пришлось отрубать автозаполнение и собирать мозаику вручную...

Пудель 23.02.2012 15:18

Неопределено - это значение (аналогично пустой ссылке - хоть и пустая, но есть). NULL - отсутствие значения.

Sadovnikov 23.02.2012 15:20

13-Reaper > Да я понимаю, когда отчет - сложный. Там и у прогера башню снесет. Не то что у оптимизатора.
Но когда вот такая элементарщина... Тут уже начинаешь задумываться: а вот это, в чем я отчет пишу, точно - учетная программа нового поколения?

Reaper 23.02.2012 15:21

(15) *ворчит: "Сразу надо было вложенный запрос вышвырнуть, и сделать несколько простых наборов данных в объединении"*

Sadovnikov 23.02.2012 15:22

14-Пудель > Гениальная мысль :)
Но вот только к чему она в данном случае?

Sadovnikov 23.02.2012 15:24

16-Reaper> Я буду думать эту мысль :)

Sadovnikov 23.02.2012 15:25

16-Reaper > А как при этом отработает Нач и Кон остаток? Не получу ли я новых проблем?

Reaper 23.02.2012 15:31

(19) Отработает. Главное осознать мысль, что подсчетом занимается всегда компоновщик, а не запрос. При этом если будет несколько записей с одинаковыми группировками - они будут просуммированы в лоб. Подсчет нарастающих итогов начнется только если будет отметка времени. Что нужно проконтролировать - это чтобы отметка времени включалась одновременно для всех наборов данных.

Helen 1986 23.02.2012 15:55

ближайшее будущее Раскольн....... тьфу, Sadovnikov-а



[img]http://www.prikolnianekdot.ru/fotogallery/data/2009091501.jpg[/img]

Sadovnikov 23.02.2012 16:00

Продолжение банкета...
SELECT
(ВЫБОР
КОГДА Выборка.Касса = НЕОПРЕДЕЛЕНО ТОГДА NULL
ИНАЧЕ Выборка.Касса
КОНЕЦ) ВыборкаКасса,

Выборка.НачОстКасса,
Выборка.КонОстКасса,
Выборка.ПриходКасса,
Выборка.РасходКасса,

Выборка.НачОстПодотчет,
Выборка.КонОстПодотчет,
Выборка.ПриходПодотчет,
Выборка.РасходПодотчет,

Выборка.ИтогоНачОст ИтогоНачОст,
Выборка.ИтогоКонОст ИтогоКонОст,

(ВЫБОР
КОГДА Выборка.Регистратор = НЕОПРЕДЕЛЕНО ТОГДА NULL
ИНАЧЕ Выборка.Регистратор
КОНЕЦ) Регистратор,
Выборка.ПериодСекунда
FROM
(
SELECT
регПодотчет.Регистратор.Касса Касса,

0 НачОстКасса,
0 КонОстКасса,
0 ПриходКасса,
0 РасходКасса,

регПодотчет.СуммаНачальныйОстаток НачОстПодотчет,
регПодотчет.СуммаКонечныйОстаток КонОстПодотчет,
регПодотчет.СуммаПриход ПриходПодотчет,
регПодотчет.СуммаРасход РасходПодотчет,

регПодотчет.СуммаНачальныйОстаток ИтогоНачОст,
регПодотчет.СуммаКонечныйОстаток ИтогоКонОст,

регПодотчет.ПериодСекунда,
регПодотчет.Регистратор
FROM
РегистрНакопления.Подотчет.ОстаткиИОбороты(**&НачПериода**, **&КонПериода**, Авто) регПодотчет
) Выборка

Имеем НачОстПодотчет в виде какой-то вообще бешеной цифры. Хотя, должен быть 0.

Reaper 23.02.2012 16:05

Ну так та же петрушка ведь(секунда во вложенном запросе без секунды во внешнем), только вид сбоку. Подотчет, коль скоро это своя группа показателей, должен был быть независимым набором данных, связанным с предыдущим набором по кассе и по секунде.

Sadovnikov 23.02.2012 16:09

23-Reaper > Ну, вроде, не должен во второй раз на те же грабли наступать. Вот выполняемый запрос:

ВЫБРАТЬ
ВЫБОР
КОГДА Выборка.Касса = НЕОПРЕДЕЛЕНО
ТОГДА NULL
ИНАЧЕ Выборка.Касса
КОНЕЦ КАК ВыборкаКасса,
Выборка.НачОстКасса КАК НачОстКасса,
Выборка.КонОстКасса КАК КонОстКасса,
Выборка.ПриходКасса КАК ПриходКасса,
Выборка.РасходКасса КАК РасходКасса,
Выборка.НачОстПодотчет КАК НачОстПодотчет,
Выборка.КонОстПодотчет КАК КонОстПодотчет,
Выборка.ПриходПодотчет КАК ПриходПодотчет,
Выборка.РасходПодотчет КАК РасходПодотчет,
Выборка.ИтогоНачОст КАК ИтогоНачОст,
Выборка.ИтогоКонОст КАК ИтогоКонОст,
ВЫБОР
КОГДА Выборка.Регистратор = НЕОПРЕДЕЛЕНО
ТОГДА NULL
ИНАЧЕ Выборка.Регистратор
КОНЕЦ КАК Регистратор,
Выборка.ПериодСекунда КАК ПериодСекунда,
ПРЕДСТАВЛЕНИЕССЫЛКИ(ВЫБОР
КОГДА Выборка.Касса = НЕОПРЕДЕЛЕНО
ТОГДА NULL
ИНАЧЕ Выборка.Касса
КОНЕЦ) КАК ВыборкаКассаПредставление,
ПРЕДСТАВЛЕНИЕССЫЛКИ(ВЫБОР
КОГДА Выборка.Регистратор = НЕОПРЕДЕЛЕНО
ТОГДА NULL
ИНАЧЕ Выборка.Регистратор
КОНЕЦ) КАК РегистраторПредставление
ИЗ
(ВЫБРАТЬ
регПодотчет.Регистратор.Касса КАК Касса,
0 КАК НачОстКасса,
0 КАК КонОстКасса,
0 КАК ПриходКасса,
0 КАК РасходКасса,
регПодотчет.СуммаНачальныйОстаток КАК НачОстПодотчет,
регПодотчет.СуммаКонечныйОстаток КАК КонОстПодотчет,
регПодотчет.СуммаПриход КАК ПриходПодотчет,
регПодотчет.СуммаРасход КАК РасходПодотчет,
регПодотчет.СуммаНачальныйОстаток КАК ИтогоНачОст,
регПодотчет.СуммаКонечныйОстаток КАК ИтогоКонОст,
регПодотчет.ПериодСекунда КАК ПериодСекунда,
регПодотчет.Регистратор КАК Регистратор
ИЗ
РегистрНакопления.Подотчет.ОстаткиИОбороты(&П2, &П, Авто, , ) КАК регПодотчет) КАК Выборка

Есть там секунда...
Отличие от первого запроса - "Касса" - не измерения, е реквизит регистратора. Регистраторов у регистра 2 вида. У обоих есть реквизит "Касса".

roma n 23.02.2012 16:19

24-Sadovnikov > Регистратор обязательно в "верхний" запрос включи.
Это, сколько помню, даже на ИТС было
- обязательно парные итоги (и Нач и Кон)
- обязательно родительское поле

Sadovnikov 23.02.2012 16:24

25-roma n > Есть регистратор в "верхнем" запросе... :

ВЫБОР
КОГДА Выборка.Регистратор = НЕОПРЕДЕЛЕНО
ТОГДА NULL
ИНАЧЕ Выборка.Регистратор

Парные итоги и родительское поле тоже есть.

Медитирую вот над этим:
"не позволяется группировать по реквизитам поля Регистратор".

Уродам, кто прогил ИТС - что б вам гробу поикалось. Дабы копи-паст там не отрубали.

Sadovnikov 23.02.2012 16:31

Вопрос отменяется. Сам ступил.

2Green 24.02.2012 11:49

[img]http://images01.olx.ru/ui/4/39/60/1267706627_78163960_1----.jpg[/img]

Sadovnikov 24.02.2012 12:09

28-2Green > Пасиба :)


Текущее время: 12:23. Часовой пояс GMT +3.