|
Получить запросом непрерывные интервалы - можно? | ☑ | ||
---|---|---|---|---|
0
Живой Ископаемый
04.06.09
✎
14:24
|
Например сейчас запросом, который приведу ниже, я получаю такое:
Сотрудник1 Отпуск ежегодный 07.05.2009 Сотрудник1 Отпуск ежегодный 08.05.2009 Сотрудник1 Отпуск ежегодный 18.05.2009 Сотрудник1 Отпуск ежегодный 19.05.2009 ==== Хочу каким-нибудь образом получать такое: Сотрудник1 Отпуск ежегодный Интервал1 07.05.2009-08.05.2009 Сотрудник1 Отпуск ежегодный Интервал2 18.05.2009-19.05.2009 ===== Только потом кодом и в ТЗ? |
|||
1
Живой Ископаемый
04.06.09
✎
14:29
|
скажите, что нельзя и я пойду...
|
|||
2
Широкий
04.06.09
✎
14:30
|
уходи
|
|||
3
Deon
04.06.09
✎
14:30
|
да можно, наверно, надо подумать только как
|
|||
4
IronDemon
04.06.09
✎
14:33
|
Есть реквизит по которому можно определить начало это или конец?
|
|||
5
Deon
04.06.09
✎
14:35
|
(0) Как выглядит табличка из которой ты тягаешь данные?
|
|||
6
Живой Ископаемый
04.06.09
✎
14:37
|
(4,5) ну.. пока нет.. Это просто регистр сведений независимый, периодический до дня.. за день собственно указывается сам факт невыхода... Стало быть если сильно хочу, то нужно добавить... хорошо, спасибо...
|
|||
7
Deon
04.06.09
✎
14:42
|
(6) Выбирай из это регистра только те записи, для который нет значения с предыдущей датой. Это будут начала интервалов. Концы интервалов надо выбирать, как минимальная дата, которая больше начала интервала и на следущую дату у которой нет записи.
Надеюсь внятно выразился |
|||
8
Живой Ископаемый
04.06.09
✎
14:46
|
понял, спасибо....
|
|||
9
КонецЕсли
04.06.09
✎
14:48
|
(7) ну-ну.
07.05.2009 10.05.2009 из (7) интервал с 7 по 10 |
|||
10
Deon
04.06.09
✎
14:51
|
(9) Под "следующей" и "предыдущей" я имею ввиду дату, отличающуюся на 1 день. Для 07.05 следующей даты (08.05) нет, поэтому это конец интервала
|
|||
11
Deon
04.06.09
✎
14:52
|
(9) Или, если ты об этом "которая больше начала интервала", то, конечно надо так:
"которая >= начала интервала" |
|||
12
Bober
04.06.09
✎
14:57
|
ВЫБРАТЬ
РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ) КАК РАЗНОСТЬДАТ ПОМЕСТИТЬ КолДней ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ 1 КАК Число ПОМЕСТИТЬ Числа ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 9 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 0 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Ед.Число + 10 * Десятки.Число + 100 * Сотни.Число КАК НомерПериода ПОМЕСТИТЬ Периоды ИЗ Числа КАК Ед ПОЛНОЕ СОЕДИНЕНИЕ Числа КАК Десятки ПО (ИСТИНА) ПОЛНОЕ СОЕДИНЕНИЕ Числа КАК Сотни ПО (ИСТИНА) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, Периоды.НомерПериода) КАК Период ИЗ КолДней КАК КолДней ЛЕВОЕ СОЕДИНЕНИЕ Периоды КАК Периоды ПО КолДней.РАЗНОСТЬДАТ >= Периоды.НомерПериода УПОРЯДОЧИТЬ ПО Период |
|||
13
КонецЕсли
04.06.09
✎
14:59
|
Первая мысль по топику - нужна рекурсия. Один запрос не прокатит.
|
|||
14
Jaap Vduul
04.06.09
✎
15:06
|
+7
Как-то так: ВЫБРАТЬ "Иванов" КАК Сотрудник, "Отпуск" КАК Состояние, ДАТАВРЕМЯ(2009, 5, 7) КАК Дата ПОМЕСТИТЬ Невыходы ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Иванов", "Отпуск", ДАТАВРЕМЯ(2009, 5, 8) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Иванов", "Отпуск", ДАТАВРЕМЯ(2009, 5, 9) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Иванов", "Отпуск", ДАТАВРЕМЯ(2009, 5, 18) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Иванов", "Отпуск", ДАТАВРЕМЯ(2009, 5, 19) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Иванов", "Отпуск", ДАТАВРЕМЯ(2009, 5, 20) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Невыходы.Сотрудник, Невыходы.Состояние, Невыходы.Дата КАК НАЧАЛО, Невыходы1.Дата КАК КОНЕЦ ИЗ Невыходы КАК Невыходы ЛЕВОЕ СОЕДИНЕНИЕ Невыходы КАК Невыходы2 ПО Невыходы.Сотрудник = Невыходы2.Сотрудник И Невыходы.Состояние = Невыходы2.Состояние И (Невыходы2.Дата = ДОБАВИТЬКДАТЕ(Невыходы.Дата, ДЕНЬ, -1)) ВНУТРЕННЕЕ СОЕДИНЕНИЕ Невыходы КАК Невыходы1 ПО Невыходы.Сотрудник = Невыходы1.Сотрудник И Невыходы.Состояние = Невыходы1.Состояние И (Невыходы1.Дата В (ВЫБРАТЬ МИНИМУМ(Н.Дата) ИЗ Невыходы КАК Н ЛЕВОЕ СОЕДИНЕНИЕ Невыходы КАК Н1 ПО Н.Сотрудник = Н1.Сотрудник И Н.Состояние = Н1.Состояние И Н1.Дата = ДОБАВИТЬКДАТЕ(Н.Дата, ДЕНЬ, 1) ГДЕ Н.Дата > Невыходы.Дата И Н.Сотрудник = Невыходы.Сотрудник И Н.Состояние = Невыходы.Состояние И Н1.Дата ЕСТЬ NULL)) ГДЕ Невыходы2.Дата ЕСТЬ NULL |
|||
15
Deon
04.06.09
✎
15:11
|
(14) Умница, но не учел справедливое замечание из (9)
|
|||
16
Deon
04.06.09
✎
15:12
|
(0) тебе повезло, даже запрос готовый написали
|
|||
17
Jaap Vduul
04.06.09
✎
15:15
|
(15)
в (9) фигня какая-то... |
|||
18
Jaap Vduul
04.06.09
✎
15:17
|
+17
А, понял. Не сработает, если интервал = 1 день |
|||
19
КонецЕсли
04.06.09
✎
15:21
|
+(13)Вторая мысль - а почему бы нет?..
|
|||
20
Jaap Vduul
04.06.09
✎
15:26
|
+18
Итого: ВЫБРАТЬ Невыходы.Сотрудник, Невыходы.Состояние, Невыходы.Дата КАК НАЧАЛО, Невыходы1.Дата КАК КОНЕЦ ИЗ Невыходы КАК Невыходы ЛЕВОЕ СОЕДИНЕНИЕ Невыходы КАК Невыходы2 ПО Невыходы.Сотрудник = Невыходы2.Сотрудник И Невыходы.Состояние = Невыходы2.Состояние И (Невыходы2.Дата = ДОБАВИТЬКДАТЕ(Невыходы.Дата, ДЕНЬ, -1)) ЛЕВОЕ СОЕДИНЕНИЕ Невыходы КАК Невыходы1 ПО Невыходы.Сотрудник = Невыходы1.Сотрудник И Невыходы.Состояние = Невыходы1.Состояние И (Невыходы1.Дата В (ВЫБРАТЬ МИНИМУМ(Н.Дата) ИЗ Невыходы КАК Н ЛЕВОЕ СОЕДИНЕНИЕ Невыходы КАК Н1 ПО Н.Сотрудник = Н1.Сотрудник И Н.Состояние = Н1.Состояние И Н1.Дата = ДОБАВИТЬКДАТЕ(Н.Дата, ДЕНЬ, 1) ГДЕ Н.Дата >= Невыходы.Дата И Н.Сотрудник = Невыходы.Сотрудник И Н.Состояние = Невыходы.Состояние И Н1.Дата ЕСТЬ NULL )) ГДЕ Невыходы2.Дата ЕСТЬ NULL |
|||
21
TormozIT
гуру
04.06.09
✎
15:26
|
||||
22
Живой Ископаемый
04.06.09
✎
15:35
|
(9) у меня такого нет.. Если человек был в отпуске с 7 по 10, то в РС 4 записи - на 7,8,9,10.. Если только две - 7 и 10, то это два интервала...
|
|||
23
Живой Ископаемый
04.06.09
✎
15:37
|
так-так.. даже не ожидал.. Сейчас буду пробовать...
|
|||
24
Deon
04.06.09
✎
15:37
|
(21) Часто встречающаяся задача, давно бы уже 1С сделала специальную функцию для определения количества дней наличия товара на складе
|
|||
25
Deon
04.06.09
✎
15:38
|
(19) Ну вырази уже свою мысль в на холсте конфигуратора :)
|
|||
26
Ненавижу 1С
гуру
04.06.09
✎
15:40
|
пример, выдает непрерывные участки дат, когда были заданы валюты (хотя бы одной, без фильтра по валютам):
ВЫБРАТЬ ВложенныйЗапрос.ПериодНач КАК ПериодНач, ВложенныйЗапрос.ПериодКон ИЗ (ВЫБРАТЬ КурсыВалютНач.Период КАК ПериодНач, КурсыВалютКон.Период КАК ПериодКон ИЗ РегистрСведений.КурсыВалют КАК КурсыВалютНач ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалютКон ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалютК ПО (РАЗНОСТЬДАТ(КурсыВалютКон.Период, КурсыВалютК.Период, ДЕНЬ) = 1) ПО КурсыВалютНач.Период <= КурсыВалютКон.Период ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалютН ПО (РАЗНОСТЬДАТ(КурсыВалютН.Период, КурсыВалютНач.Период, ДЕНЬ) = 1) ГДЕ КурсыВалютН.Период ЕСТЬ NULL И КурсыВалютК.Период ЕСТЬ NULL ) КАК ВложенныйЗапрос ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют ПО (КурсыВалют.Период МЕЖДУ ВложенныйЗапрос.ПериодНач И ВложенныйЗапрос.ПериодКон) СГРУППИРОВАТЬ ПО ВложенныйЗапрос.ПериодНач, ВложенныйЗапрос.ПериодКон ИМЕЮЩИЕ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ КурсыВалют.Период) = РАЗНОСТЬДАТ(ВложенныйЗапрос.ПериодНач, ВложенныйЗапрос.ПериодКон, ДЕНЬ) + 1 УПОРЯДОЧИТЬ ПО ПериодНач |
|||
27
TormozIT
гуру
04.06.09
✎
15:41
|
(21) А, не. Здесь мимо. Наверное по регистрам расчета можно более эффективно посчитать.
|
|||
28
Живой Ископаемый
04.06.09
✎
15:41
|
(27) не РР, РС.. буквально скопирован с КурсовВалют
|
|||
29
Живой Ископаемый
04.06.09
✎
15:44
|
(26) Почти супер, потому что у меня РС "Невыходы" скопирован с РС КурсыВалют, но я правда изменил семантику - если нет за какой-то день записи, то стало быть это не то же самое состояние, а нет невыхода... :(
|
|||
30
КонецЕсли
04.06.09
✎
15:45
|
(25) Дак уже выразил в консоли, перед тем как запостить (19). Только я ставил эксперементы на себе (нафига мне ждать пока он весь персонал обработает) и в запрос встроил отбор по физлицу. Автору такие оганичения нафиг нужны были, поэтому постить сюда не стал. Выглядит запрос как дальний родственник (20)
|
|||
31
Deon
04.06.09
✎
15:47
|
(29) А чем тебе (20) не вштырило?
|
|||
32
Ненавижу 1С
гуру
04.06.09
✎
15:47
|
(29) условия поставь
|
|||
33
Ненавижу 1С
гуру
04.06.09
✎
15:48
|
(32) тьфу, а тут тоже самое, он выводит даты на которые проставлен курс валют
|
|||
34
Ненавижу 1С
гуру
04.06.09
✎
15:48
|
в (26) получилось так:
ПериодНач ПериодКон 01.01.1980 01.01.1980 25.11.2008 25.11.2008 01.12.2008 29.03.2009 31.03.2009 04.06.2009 |
|||
35
Живой Ископаемый
04.06.09
✎
15:52
|
(31) с конца начал.. сейчас...
|
|||
36
kumena
04.06.09
✎
16:03
|
Это что за конфигурация где надо свой регистр для учета невыходов создавать?
|
|||
37
Живой Ископаемый
04.06.09
✎
16:06
|
БП...
|
|||
38
Ненавижу 1С
гуру
04.06.09
✎
16:09
|
(37) я тебе в (26) дал ответ
|
|||
39
Живой Ископаемый
04.06.09
✎
16:12
|
(38) Еще одна причина по которой не катит (26) - нужно соединять не только ПО период, но и по Сотрудник, Организация, Причина... у меня не вышло.. Пробую 20 пока
|
|||
40
kumena
04.06.09
✎
16:17
|
я так и не понял, начало от конца отпуска можно отличить?
|
|||
41
Живой Ископаемый
04.06.09
✎
16:17
|
жирни, вкусни! кжается 20 действительно работает:
==== ВЫБРАТЬ Невыходы.Сотрудник, Невыходы.Причина, Невыходы.Период КАК НАЧАЛО, Невыходы1.Период КАК КОНЕЦ ИЗ РегистрСведений.НевыходыРаботниковОрганизаций КАК Невыходы ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НевыходыРаботниковОрганизаций КАК Невыходы2 ПО Невыходы.Сотрудник = Невыходы2.Сотрудник И Невыходы.Причина = Невыходы2.Причина И (Невыходы2.Период = ДОБАВИТЬКДАТЕ(Невыходы.Период, ДЕНЬ, -1)) ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НевыходыРаботниковОрганизаций КАК Невыходы1 ПО Невыходы.Сотрудник = Невыходы1.Сотрудник И Невыходы.Причина = Невыходы1.Причина И (Невыходы1.Период В (ВЫБРАТЬ МИНИМУМ(Н.Период) ИЗ РегистрСведений.НевыходыРаботниковОрганизаций КАК Н ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НевыходыРаботниковОрганизаций КАК Н1 ПО Н.Сотрудник = Н1.Сотрудник И Н.Причина = Н1.Причина И Н1.Период = ДОБАВИТЬКДАТЕ(Н.Период, ДЕНЬ, 1) ГДЕ Н.Период >= Невыходы.Период И Н.Сотрудник = Невыходы.Сотрудник И Н.Причина = Невыходы.Причина И Н1.Период ЕСТЬ NULL )) ГДЕ Невыходы2.Период ЕСТЬ NULL |
|||
42
Живой Ископаемый
04.06.09
✎
16:28
|
(40) Ну смотри... можно отличить разырвом между записями.. в самой записи признаков нет:
http://docs.google.com/View?id=df8g2nxh_305gjfffcwj http://docs.google.com/View?id=df8g2nxh_307cjn67tgf На первой картинке видим что два непрерывных интервала Невыходов - с 6-го по 10 и с 18 по 31... Попытался как смог показать записи из РС по каждому из интервалов(для первого интервала не все записи в списке видны) Запрос из 20 правильно поделил эти интервалы... Спасибо огромное.. Сам бы я наверное такой запрос не написал |
|||
43
МихаилМ
04.06.09
✎
17:07
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |