Текущее время: Вс, июл 20 2025, 19:55

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Сделать RANGE с датами БЕЗ исключений
СообщениеДобавлено: Ср, окт 26 2011, 07:03 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пн, фев 18 2008, 11:25
Сообщения: 100
Привет всем.
Кто подскажет, есть ли стандартный механизм преобразования range таблицы с датами в такой же range, но без исключений. Итоговая цель вообще строка, но лучше для начала таблица.
Чтобы бало понятнее простой пример (на деле может быть гораздо сложнее):
есть таблица
I BT 01.01.2011 10.01.2011
E BT 02.01.2011 04.01.2011
E EQ 07.01.2011 или I NE 07.01.2011

цель:
I EQ 01.01.2011
I BT 05.01.2011 06.01.2011
I BT 08.01.2011 10.01.2011

Ну а в строке должно выглядеть примерно так в итоге: 01.01.2011, 05.01.2011-06.01.2011, 08.01.2011-10.01.2011. Исключения в строке отобразить проблемотично, к тому же это надо не только для строки.
Если нет стандартного решения, то может кто-то делал, поделитесь, пжлст, опытом.
Спасибо!

ПС: поиском попытался поискать, но че-то даже не знаю как запрос сформулировать((


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сделать RANGE с датами БЕЗ исключений
СообщениеДобавлено: Ср, окт 26 2011, 07:26 
Специалист
Специалист

Зарегистрирован:
Ср, дек 22 2010, 19:49
Сообщения: 114
Как вариант, можно использовать следующий алгоритм. Создаем внутреннюю таблицу itab на 365 (366) значений с 0101 по 3112. После применения к ней DELETE itab WHERE NOT исх. RANGE-таблица, остаются только нужные даты. И нет проблемы пробежать по ним в цикле, и вытащить смежные (для BT) или одиночные (для EQ).

_________________
Человек готов работать 24 часа в сутки, лишь бы ничего не делать.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сделать RANGE с датами БЕЗ исключений
СообщениеДобавлено: Ср, окт 26 2011, 08:07 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пн, фев 18 2008, 11:25
Сообщения: 100
Как быть если промежуток дат несколько лет?
Была мысль бежать по всем датам и проверять удобвлетворяет ли она этому ренджу, но как тогда определить первую и последнюю входящие в рендж даты? Не бежать же с 01.01.1800 по 31.12.9999 и хардкодить типа с 2000 по 2100 год совсем не хочется. К тому же, это уже грубо говоря 36500 итераций. но даже определение последней и первой записи тоже вероятно не спасет, может же быть например I GT 01.01.2011 и тогда последняя дата будет 31.12.9999.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сделать RANGE с датами БЕЗ исключений
СообщениеДобавлено: Ср, окт 26 2011, 08:47 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
Refresh написал(а):
Как быть если промежуток дат несколько лет?
Была мысль бежать по всем датам и проверять удобвлетворяет ли она этому ренджу, но как тогда определить первую и последнюю входящие в рендж даты? Не бежать же с 01.01.1800 по 31.12.9999 и хардкодить типа с 2000 по 2100 год совсем не хочется. К тому же, это уже грубо говоря 36500 итераций. но даже определение последней и первой записи тоже вероятно не спасет, может же быть например I GT 01.01.2011 и тогда последняя дата будет 31.12.9999.

Зачем Вам бежать по всей временной шкале? К датам же вроде не применим оператор CP.
Так что просто составьте из всех дат (отсортированных) соответствующие отрезки и проверяйте на соответствие диапазону.
Code:
   01.01.2011
   02.01.2011
   04.01.2011
   07.01.2011
   10.01.2011

   || Формируем отдельно внутренрий интервал и
   \/ граничные точки

01.01.1800 01.01.1800
02.01.1800 31.12.2010
01.01.2011 01.01.2011
02.01.2011 02.01.2011
03.01.2011 03.01.2011
04.01.2011 04.01.2011
05.01.2011 06.01.2011
07.01.2011 07.01.2011
08.01.2011 09.01.2011
10.01.2011 10.01.2011
11.01.2011 30.12.9999
31.12.9999 31.12.9999

   || проверяем первую дату на in RANGE
   \/

01.01.2011 01.01.2011
05.01.2011 06.01.2011
08.01.2011 09.01.2011
10.01.2011 10.01.2011

   || переводим в RANGE, склеив смежные даты через PROVIDE
   \/

I EQ 01.01.2011
I BT 05.01.2011 06.01.2011
I BT 08.01.2011 10.01.2011


Муторно, но без полного перебора

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сделать RANGE с датами БЕЗ исключений
СообщениеДобавлено: Ср, окт 26 2011, 09:02 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Пн, май 14 2007, 13:05
Сообщения: 561
Откуда: Москва
Refresh написал(а):
Кто подскажет, есть ли стандартный механизм преобразования range таблицы с датами в такой же range, но без исключений. Итоговая цель вообще строка, но лучше для начала таблица.
Стандартного не знаю, но предложу вариант с некоторыми ограничениями.
Range - таблица дорабатывается, обязательно использование только операций EQ и BT, причем при EQ поле High = Low.
Далее эта ранг-табличка разбивается на две таблицы I и Е.
И к этим двум табличкам применяется оператор Provide, который автоматически создаст новые периоды стыковок, анализируя которые (если есть период только из I)выберете нужные вам периоды. Можно записать данные как в таблицу, так и в строку.

_________________
Sapere aude!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сделать RANGE с датами БЕЗ исключений
СообщениеДобавлено: Ср, окт 26 2011, 09:56 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
N/A написал(а):
Refresh написал(а):
Кто подскажет, есть ли стандартный механизм преобразования range таблицы с датами в такой же range, но без исключений. Итоговая цель вообще строка, но лучше для начала таблица.
Стандартного не знаю, но предложу вариант с некоторыми ограничениями.
Range - таблица дорабатывается, обязательно использование только операций EQ и BT, причем при EQ поле High = Low.
Далее эта ранг-табличка разбивается на две таблицы I и Е.

Можно пойти дальше и запретить закладки с исключениями. Тогда проблема отпадет сама собой ;)

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сделать RANGE с датами БЕЗ исключений
СообщениеДобавлено: Ср, окт 26 2011, 10:20 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Пн, май 14 2007, 13:05
Сообщения: 561
Откуда: Москва
Удав написал(а):
Можно пойти дальше и запретить закладки с исключениями. Тогда проблема отпадет сама собой ;)
Ценю Ваш юмор :)
Но у ТС в одном из условий так и сказано "E EQ 07.01.2011 или I NE 07.01.2011" , поэтому думаю под EQ и BT ранг можно привести.

_________________
Sapere aude!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сделать RANGE с датами БЕЗ исключений
СообщениеДобавлено: Ср, окт 26 2011, 10:26 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
N/A написал(а):
Но у ТС в одном из условий так и сказано "E EQ 07.01.2011 или I NE 07.01.2011" , поэтому думаю под EQ и BT ранг можно привести.

Так о этом и речь - к Вашим ограничениям по операциям добавить мои - по признаку включения :D

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сделать RANGE с датами БЕЗ исключений
СообщениеДобавлено: Ср, окт 26 2011, 12:10 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пн, фев 18 2008, 11:25
Сообщения: 100
2 Удав
А как это сделать? Ограничить select-options на ввод значений кроме исключений? Может быть на первое время бы и устроило.

2 N/A, что имеется ввиду под "Range - таблица дорабатывается"

2, sy-uname, была подобная мысль, но очень уж много получается "если". Как например быть, если особо способный пользователь сделает двойное отрицание, как его обрабатывать? Например E NE.

пожалуй имеет смысл для начала разделить все записи с I EQ, I BT, I GT, I GE, I LT, I LE и E NE, E NB в таблицу "позитивных". Остальные попадут в "негативные". Ничего не забыл?
Если встречается LE или LT значит минимальная дата 01.01.1800, аналогично для GE, GT максимальная дата 31.12.9999. Далее отсортировываю "позитивные" строки и ищу минимальную и максимальную даты(если нет LE, LT, GE, GT). Видимо все-таки стандарта для этого нет((. Пока все верно?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сделать RANGE с датами БЕЗ исключений
СообщениеДобавлено: Ср, окт 26 2011, 12:24 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
Refresh написал(а):
2 Удав
А как это сделать? Ограничить select-options на ввод значений кроме исключений? Может быть на первое время бы и устроило.

2 N/A, что имеется ввиду под "Range - таблица дорабатывается"

2, sy-uname, была подобная мысль, но очень уж много получается "если". Как например быть, если особо способный пользователь сделает двойное отрицание, как его обрабатывать? Например E NE.

пожалуй имеет смысл для начала разделить все записи с I EQ, I BT, I GT, I GE, I LT, I LE и E NE, E NB в таблицу "позитивных". Остальные попадут в "негативные". Ничего не забыл?
Если встречается LE или LT значит минимальная дата 01.01.1800, аналогично для GE, GT максимальная дата 31.12.9999. Далее отсортировываю "позитивные" строки и ищу минимальную и максимальную даты(если нет LE, LT, GE, GT). Видимо все-таки стандарта для этого нет((. Пока все верно?

Какая разница что сделает пользователь. Вы просто берёте даты не глядя на SIGN и OPTION, дополняете их LOW_DATE и HIGH_DATE, сортируете по возрастанию и убираете повторы. Составляете из дат соответствующие диапазоны и потом проверяете начальную дату диапазона на in RANGE. Всё.

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сделать RANGE с датами БЕЗ исключений
СообщениеДобавлено: Ср, окт 26 2011, 12:44 
Старший специалист
Старший специалист

Зарегистрирован:
Вт, ноя 18 2008, 10:40
Сообщения: 342
Откуда: Пермь
Пол: Мужской
Предложу такой вариант. Слепить все даты из low и high range-а в отдельную таблицу, добавляя к каждой из дат следующую и предыдущую. Далее чтобы получить диапазоны вместо полного перебора достаточно проверить только даты из этой таблицы. Если минимальная дата из таблицы входит в range, значит есть условие типа LE 01.01.2010, т.к. набор не ограничен снизу, ну и ограничение сверху проверяется аналогично


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Сделать RANGE с датами БЕЗ исключений
СообщениеДобавлено: Ср, окт 26 2011, 13:38 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Refresh написал(а):
2 Удав
А как это сделать? Ограничить select-options на ввод значений кроме исключений? Может быть на первое время бы и устроило.

ФМ SELECT_OPTIONS_RESTRICT.
Я так думаю, должно устроить навсегда, судя по названию темы :D

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB