15.11.2006, 11:19 | #1 |
NavAx
|
Диапазон условий
Здравствуйте всем.
Подскажите, если кто знает. Имеюстя 2 строки условий, например "A1..A5, A7" и "A3..A8, A11", каким образом эти две строки превратить в фильтр по одному полю? Цель - получить пересечение (исправил, было "объединение") значений. Последний раз редактировалось Roman777; 15.11.2006 в 11:35. |
|
15.11.2006, 11:32 | #2 |
Axapta
|
X++: static void Job68(Args _args) { Table t; Query q = new query(); QueryRun qr; str s = 'A1..A5, A7'; str s1 = 'A3..A8, A11'; ; q.addDataSource(tableNum(Table)).addRange(fieldNum(Table, Field)).value(s+','+s1); qr = new QueryRun(q); while (qr.next()) { t = qr.getNo(1); info(strfmt('%1', t.Field)); } } |
|
15.11.2006, 11:33 | #3 |
Moderator
|
А если просто сцепить через запятую: "A1..A5, A7" + ", " + "A3..A8, A11" ?
А если просто сделать 2 Range по одному полю? По одному полю они же как OR идут? |
|
15.11.2006, 11:34 | #4 |
NavAx
|
Извиняюсь, не о том написал - нужно именно пересечение.
|
|
15.11.2006, 11:40 | #5 |
----------------
|
join таблицы сама с собой
на первую первый фильтр, на вторую - второй |
|
15.11.2006, 11:42 | #6 |
NavAx
|
|
|
15.11.2006, 11:49 | #7 |
Moderator
|
Гы! Если бы это были ячейки Excel (а нотация напоминает, согласитесь), то можно было бы вот так забавно воспользоваться "совершенно другой оперой":
? Application.Intersect( Range("A1:A5, A7"), Range("A3:A8, A11")).Address $A$3:$A$5,$A$7 Ответ такой должен быть? A3..A5, A7 ? |
|
15.11.2006, 11:51 | #8 |
NavAx
|
Цитата:
|
|
15.11.2006, 12:08 | #9 |
Axapta
|
Написать парсер строк, который, например, из
X++: str s = '1..7,9'; str s1 = '7..9,12'; X++: resStr = '(((Field1 >= 1) && (Field1 <=7)) || (Field1=9)) && ((((Field1 >= 7) && (Field1 <=9)) || (Field1=12)))'; |
|
|
За это сообщение автора поблагодарили: Roman777 (2). |
15.11.2006, 12:10 | #10 |
Участник
|
Хм. А вы знаете, какой фильтр должен получиться в результате пересечения?
Не знаю, или это подойдет, но есть метод mergeRanges() у класса SysQuery Может как раз то, что Вам нужно? |
|
|
За это сообщение автора поблагодарили: oip (1). |
15.11.2006, 12:14 | #11 |
Дмитрий Ерин
|
А двойное отрицание не прокатывает? Что-то типа:
str s1 = 'A1..A5, A7'; str s2 = 'A3..A8, A11'; strfmt("! ( ! (%1), ! (%2) )", s1, s2);
__________________
|
|
15.11.2006, 12:18 | #12 |
Участник
|
Цитата:
!1,!2 дать должно результат not 1 and not 2, а не ожидаемый or |
|
15.11.2006, 13:46 | #13 |
NavAx
|
Наверное остается только делать парсер строк.
|
|
15.11.2006, 13:56 | #14 |
Axapta
|
Ну он пишется минут за 15.
|
|
15.11.2006, 14:00 | #15 |
Moderator
|
|
|
15.11.2006, 14:07 | #16 |
NavAx
|
Цитата:
Но для парсера по аналитикам есть такая мысль: 1. повесить диапазон как условие на таблицу Dimensions по интересующему виду аналитики, заполнить получеными значениями множество. 2. проделать то же самое со вторым диапазоном, заполнив второе множество 3. получить пересечение множеств 4. из этого пересечения составить новый Range |
|
13.01.2011, 13:58 | #17 |
Участник
|
Только что придумал ещё один способ. Без джойна, но с созданием вьюхи
Идея состоит в том чтобы обмануть Query и создать во View два "виртуальных" поля ссылающихся на одно и тоже поле реальной таблицы. Тогда на каждое "виртуалное" поле можно будет повесить своё условие. Система будет думать что это разные поля и соеденит условия по логическому "И". |
|
13.01.2011, 15:25 | #18 |
Участник
|
|
|