Текущее время: Ср, июл 23 2025, 13:27

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: сравнить два ranges (на предмет пересечения интервалов)
СообщениеДобавлено: Чт, июн 21 2012, 08:13 
Ассистент
Ассистент

Зарегистрирован:
Ср, янв 18 2012, 07:36
Сообщения: 41
Откуда: Югорск
Пол: Мужской
Есть какой ФМ или чтото, что может сравнить два заполненных отднотипных ranges/select-options (с учётом всевозможных сочетаний BT,GE,NE)?

напрямую range1 in range2 - не работает.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: сравнить два ranges (на предмет пересечения интервалов)
СообщениеДобавлено: Чт, июн 21 2012, 08:38 
Старший специалист
Старший специалист

Зарегистрирован:
Вт, ноя 18 2008, 10:40
Сообщения: 342
Откуда: Пермь
Пол: Мужской
Если range связан с полем, имеющим небольшой список значений, можно проверить так
Code:
ranges:
  r1 for tab1-field1,
  r2 for tab1-field1.
select single count( * )
from tab1
where
  field1 in r1 and
  field1 in r2.
if sy-dbcnt > 0.
  есть пересечение
endif.

Минус такого метода в том, что если пересечение есть по значению, которого нет в проверочной таблице, вы этого не увидите.

Для ranges к полям целочисленного типа и дат можно написать несложную проверку и без использования проверочной таблицы


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: сравнить два ranges (на предмет пересечения интервалов)
СообщениеДобавлено: Чт, июн 21 2012, 08:47 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Ср, апр 18 2012, 14:20
Сообщения: 252
Откуда: РБ, г. Гомель
Пол: Мужской
Как-то пытался передать RANGE OF в качестве параметра в свой ФМ, не получается напрямую указать TYPE RANGE OF или LIKE RANGE OF, только тип описывать и уже его передавать. Поэтому вряд ли есть такой ФМ. А зачем их пересекать? value IN range1 AND value IN range2 вот и пересечение.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: сравнить два ranges (на предмет пересечения интервалов)
СообщениеДобавлено: Чт, июн 21 2012, 10:23 
Ассистент
Ассистент

Зарегистрирован:
Ср, янв 18 2012, 07:36
Сообщения: 41
Откуда: Югорск
Пол: Мужской
мне не для выборок из БД нужно.
Есть два ranges - один наполнен правилами проверки допустимых значений поля (довольно замысловатыми, включая BT,EQ,CP). В общем случае правила могут пересекаться. Второй range - то что собственно надо проверить на попадание хоть в одно правило проверки (причём второй range тоже может содержать несколько диапазонов GE,BT, в т.ч. пересекающихся друг с другом).

Нужен некий функциональный аналог VBAшного Application.Intersect - т.е. определяющий, пересекаются ли два сложных набора/диапазона условий или нет.

Можно конечно парзер написать, но вдруг готовое чтото есть.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: сравнить два ranges (на предмет пересечения интервалов)
СообщениеДобавлено: Чт, июн 21 2012, 11:00 
Старший специалист
Старший специалист

Зарегистрирован:
Вт, ноя 18 2008, 10:40
Сообщения: 342
Откуда: Пермь
Пол: Мужской
Тип данных какой у range?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: сравнить два ranges (на предмет пересечения интервалов)
СообщениеДобавлено: Чт, июн 21 2012, 11:47 
Ассистент
Ассистент

Зарегистрирован:
Ср, янв 18 2012, 07:36
Сообщения: 41
Откуда: Югорск
Пол: Мужской
дата (BUDAT)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: сравнить два ranges (на предмет пересечения интервалов)
СообщениеДобавлено: Чт, июн 21 2012, 12:24 
Старший специалист
Старший специалист

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: сравнить два ranges (на предмет пересечения интервалов)
СообщениеДобавлено: Чт, июн 21 2012, 15:16 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, июл 16 2010, 09:57
Сообщения: 106
Откуда: СПб
Пол: Мужской
Pavel Berezin написал:
Нужен некий функциональный аналог VBAшного Application.Intersect - т.е. определяющий, пересекаются ли два сложных набора/диапазона условий или нет.
zsap написал:
Тип данных какой у range?
Pavel Berezin написал:
дата (BUDAT)

Ну и супер! Красивое решение через Excel по OLE2 может получиться. Причем на обозримое будущее с лихвой хватит даже версии 2003 с ее 65 тысячами строк.
Набрасываю крупными мазками. Следите за моим движением:

1. Пусть есть три диапазона, для которых надо найти пересечение:

01.06.2012 - 20.06.2012
05.06.2012 - 12.06.2012
08.06.2012 - 18.06.2012

2. Если включить в Excel для этих дат формат "Общий", то увидим соответствующие целые числа:

41061 - 41080
41065 - 41072
41068 - 41078

3. А если предвключить какую-нибудь латинскую букву, ну A, чтобы далеко не ходить, то можно и так записать:

Range("A41061:A41080")
Range("A41065:A41072")
Range("A41068:A41078")

4. В окне отладки редактора VBA исполняем:

? Application.Intersect( Range("A41061:A41080"), Range("A41065:A41072"), Range("A41068:A41078") ).Address(false,false)

получаем: A41068:A41072

5. Откусываем буквы A и превращаем обратно в даты:

41068 - 41072 => 08.06.12 - 12.06.12

Похоже? :)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: сравнить два ranges (на предмет пересечения интервалов)
СообщениеДобавлено: Чт, июн 21 2012, 20:02 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 20:32
Сообщения: 2470
Пол: Мужской
Gustav написал:
Похоже? :)

Офигеть :)
А как быть с фоновым режимом?

_________________
- Может ли настоящий мастер кунг-фу получить по морде?
- Настоящий мастер может все!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: сравнить два ranges (на предмет пересечения интервалов)
СообщениеДобавлено: Пт, июн 22 2012, 08:33 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Ср, апр 18 2012, 14:20
Сообщения: 252
Откуда: РБ, г. Гомель
Пол: Мужской
Пересекать диапазоны дат Excel-ем? Можно еще нанять специального человека с календариком, пересекателя дат.
Проще сравнивать строки selection table поля low и high для option=BT.
и как в Excele быть с патернами CP NP.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: сравнить два ranges (на предмет пересечения интервалов)
СообщениеДобавлено: Пт, июн 22 2012, 10:16 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, июл 16 2010, 09:57
Сообщения: 106
Откуда: СПб
Пол: Мужской
ArmAnn написал:
А как быть с фоновым режимом?
Вспомнился анекдот про мышей, филина и ёжиков, заканчивающийся сакраментальной фразой филина: "Я стратегией занимаюсь" :) Ну как с ним быть... наверное, как и с любым взаимодействием SAP и Excel - что-то можно, что-то нельзя... насколько я понимаю, если аппликейшн сервер не на Винде и/или на нем не установлен Excel, то очевидно никак не быть...
MantiCore1977 написал:
Пересекать диапазоны дат Excel-ем? Можно еще нанять специального человека с календариком, пересекателя дат.
Это ж фантазия, импровизация - насильно никто не уговаривается, просто демонстрируется нетрадиционный подход. Неужели не любопытно?
MantiCore1977 написал:
и как в Excele быть с патернами CP NP.
Так же, как в SAPе, например, с формулами массива - никак, хотя обе штуки мощные :) У любого способа выполнить что-то, как правило, есть свои ограничения и области применения. На практике ничто не идеально.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: сравнить два ranges (на предмет пересечения интервалов)
СообщениеДобавлено: Пт, июн 22 2012, 10:46 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, май 12 2008, 09:07
Сообщения: 334
Откуда: Tbilisi, GE
Пол: Мужской
Уж лучше последовательно сформировать две выборки.
Сначала общую по диапазону правил - отправить результаты в itab.
А потом пройти по itab с поиском значений, удовлетворяющих второй range.

Обнаруженные результаты и будут пересечением.
Если нет возможности "выбирать" даты - прогнать цикл с приростом в 1 день между максимально граничными датами и в itab отправлять даты удовлетворяющие первому range.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: сравнить два ranges (на предмет пересечения интервалов)
СообщениеДобавлено: Пт, июн 22 2012, 13:26 
Начинающий
Начинающий

Зарегистрирован:
Ср, май 16 2012, 10:07
Сообщения: 22
А если так:
Code:
LOOP AT RANGE1
   WHERE LOW IN RANGE2
        OR HIGH IN RANGE2.
   APPEND RANGE1 TO TABLE RANGE3.
ENDLOOP.

LOOP AT RANGE2
   WHERE LOW IN RANGE1.
        OR HIGH IN RANGE1.
   APPEND RANGE2 TO TABLE RANGE3.
ENDLOOP.

LOOP AT RANGE3.
   APPEND RANGE3-LOW TO IT_RANGE_FIELD_TYPE.
   APPEND RANGE3-HIGH TO IT_RANGE_FIELD_TYPE.
ENDLOOP.

SORT IT_RANGE_FIELD_TYPE.
DELETE ADJACENT DUPLICATES FROM IT_RANGE_FIELD_TYPE COMPARING ALL FIELDS.

LOOP AT IT_RANGE_FIELD_TYPE
   WHERE IT_RANGE_FIELD_TYPE-<FIELD> IN RANGE1
       AND IT_RANGE_FIELD_TYPE-<FIELD> IN RANGE2.
   WRITE / 'ranges пересекаются'.
   EXIT.
ENDLOOP.

Мне кажется, так можно достичь цели.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: сравнить два ranges (на предмет пересечения интервалов)
СообщениеДобавлено: Пт, июн 22 2012, 14:43 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
roah написал(а):
Мне кажется, так можно достичь цели.

Только в случае, если OPTION = 'EQ'. :wink:

Самый надежный способ - у Chirva. Если результат затем "свернуть" с помощью BT.

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: сравнить два ranges (на предмет пересечения интервалов)
СообщениеДобавлено: Пн, июл 02 2012, 04:07 
Специалист
Специалист

Зарегистрирован:
Ср, янв 26 2005, 05:11
Сообщения: 185
Пол: Мужской
Еще можно попробовать ФМ RRK_RANGE_INTERSECT


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

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


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

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


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

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