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

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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