|
дан регистр сведений. В нем есть объект и каждый день фиксируется состояние объекта | ☑ | ||
---|---|---|---|---|
0
Dmitriy1C_
Rookie 29.03.21
✎
16:36
|
дан регистр сведений. В нем есть объект и каждый день фиксируется состояние объекта действителен или нет. нужно сделать отчет в котором будет объекты и их промежутки времени когда они были действительны. Как это можно сделать?
|
|||
1
Dmitriy1C_
Rookie 29.03.21
✎
16:38
|
Непериодический регистр сведений нужно разбить на периоды
|
|||
2
Dmitriy1C_
Rookie 29.03.21
✎
16:39
|
не понимаю как можно разбить даты на периоды в отчете
|
|||
3
Kassern
29.03.21
✎
16:43
|
(2) и как ты себе это представляешь? Представь себе объект и его история 1-5 действителен, далее 7,9,11. В остальные дни не действителен. Как ты себе представляешь вывод периодами? Если ты выведешь даты как отдельные колонки таблицы, а объект в строки это подойдет?
|
|||
4
RomanYS
29.03.21
✎
16:46
|
||||
5
Dmitriy1C_
Rookie 29.03.21
✎
16:51
|
объект1 1.01.2000 действителен
объект1 2.01.2000 действителен объект1 3.01.2000 действителен объект1 4.01.2000 недействителен объект1 5.01.2000 недействителен объект1 6.01.2000 действителен должно вывестись ОБЪЕКТЫ С ПО объект1 1.01.2000 3.01.2000 объект1 6,01,2000 сегодня |
|||
6
Dmitriy1C_
Rookie 29.03.21
✎
16:52
|
и это нужно сделать в виде отчета
|
|||
7
Kassern
29.03.21
✎
16:57
|
(5) можно попробовать соединить с этой же таблицей. В соединении привязать по объекту, дату сделать больше чем в левой таблице и указать, что недействителен. В правой таблице взять минимум по дате.
|
|||
8
Kassern
29.03.21
✎
16:58
|
(7) если "По" null, тогда текушая дата
|
|||
9
Kassern
29.03.21
✎
17:02
|
(7) грубо говоря ты привяжешь 2 одинаковые таблицы, в первой таблице у тебя должны быть только строки с "действителен", во второй - только с "недействителен". Дата второй таблицы должна быть больше чем в первой и взять минимальную дату по этой таблице.
|
|||
10
Alres
29.03.21
✎
17:05
|
т.е. для каждой строки нужно подтянуть дату когда значение этой строки изменилось, это минимум по дате из всех следующих записей с противоположным состоянием.
Потом эту таблицу свернуть соотв. по минимуму текущей даты |
|||
11
Dmitriy1C_
Rookie 29.03.21
✎
18:13
|
ВЫБРАТЬ
СостояниеРаботыУстройств.Устройство КАК Устройство, СостояниеРаботыУстройств.Включено КАК Состояние, СостояниеРаботыУстройств.ДатаСостояния КАК НачПериод, МИНИМУМ(СостояниеРаботыУстройств1.ДатаСостояния) КАК КонПериод ИЗ РегистрСведений.СостояниеРаботыУстройств КАК СостояниеРаботыУстройств ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостояниеРаботыУстройств КАК СостояниеРаботыУстройств1 ПО (СостояниеРаботыУстройств.Устройство = СостояниеРаботыУстройств1.Устройство) И (СостояниеРаботыУстройств.ДатаСостояния < СостояниеРаботыУстройств1.ДатаСостояния) СГРУППИРОВАТЬ ПО СостояниеРаботыУстройств.Устройство, СостояниеРаботыУстройств.ДатаСостояния, СостояниеРаботыУстройств.Включено УПОРЯДОЧИТЬ ПО СостояниеРаботыУстройств.Устройство выводит объект1 4.01.2000 5.01.2000 недействителен объект1 5.01.2000 5.01.2000 недействителен |
|||
12
Kesim
29.03.21
✎
18:24
|
имхо: вывести полную таблицу, обойти кодом, вывести в табдок
|
|||
13
Eiffil123
29.03.21
✎
18:36
|
Сделать регистр расчета, там настроить вытеснение по двум видам расчета ))
но вообще в качестве затравки можно так: 1. получить даты изменения состояния - соединяем таблицу с собой же по объекту и дате - прибавляем 1 день. Будет таблица вида Объект Дата состояния Состояние на текущую дату Состояние на прошлую дату 2. Фильтруем полученную таблицу, где состояние текущее и предыдущее не равно. 3. Соединяем полученную таблицу с собой же по максимуму даты (а-ля срез последних) и объекту. ps задача интересная для собеседования |
|||
14
b_ru
29.03.21
✎
20:21
|
(11) Во-первых забыл связь по состояние1 <> состояние2. Во-вторых должно быть 2 последовательных операции группировки. Как-то так:
ВЫБРАТЬ СостояниеРаботыУстройств.Устройство, СостояниеРаботыУстройств.Состояние, МИНИМУМ(СостояниеРаботыУстройств.НачПериод), СостояниеРаботыУстройств1.КонПериод ИЗ (ВЫБРАТЬ СостояниеРаботыУстройств.Устройство КАК Устройство, СостояниеРаботыУстройств.Включено КАК Состояние, СостояниеРаботыУстройств.ДатаСостояния КАК НачПериод, МИНИМУМ(СостояниеРаботыУстройств1.ДатаСостояния) КАК КонПериод ИЗ РегистрСведений.СостояниеРаботыУстройств КАК СостояниеРаботыУстройств ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостояниеРаботыУстройств КАК СостояниеРаботыУстройств1 ПО (СостояниеРаботыУстройств.Устройство = СостояниеРаботыУстройств1.Устройство) И (СостояниеРаботыУстройств.ДатаСостояния < СостояниеРаботыУстройств1.ДатаСостояния) И (СостояниеРаботыУстройств.Включено <> СостояниеРаботыУстройств1.Включено) СГРУППИРОВАТЬ ПО СостояниеРаботыУстройств.Устройство, СостояниеРаботыУстройств.ДатаСостояния, СостояниеРаботыУстройств.Включено УПОРЯДОЧИТЬ ПО СостояниеРаботыУстройств.Устройство) КАК СостояниеРаботыУстройств СГРУППИРОВАТЬ ПО СостояниеРаботыУстройств.Устройство, СостояниеРаботыУстройств.Состояние, СостояниеРаботыУстройств.КонПериод |
|||
15
Dmitriy1C_
Rookie 29.03.21
✎
21:07
|
(11) поле не найдено СостояниеРаботыУстройств1.КонПериод (5 строка)
|
|||
16
Dmitriy1C_
Rookie 29.03.21
✎
21:15
|
СостояниеРаботыУстройств1.КонПериод нужно заменить на СостояниеРаботыУстройств.КонПериод
|
|||
17
mikecool
29.03.21
✎
21:20
|
в 4 был ответ
можно еще поискать тета-соединение в запросе |
|||
18
mikecool
29.03.21
✎
21:21
|
||||
19
mikecool
29.03.21
✎
21:21
|
вот те два Покритикуйте решение - выборка количества пересекающихся периодов
но тут есть дефекты |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |