AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.12.2005, 15:13   #1  
Ardak is offline
Ardak
Участник
 
48 / 11 (1) +
Регистрация: 13.07.2006
Помогите плиз с фильтром!
Есть 2 поля "Starting Action Date" и "Ending Action Date".
как создать фильтр чтобы выдавал данные если любой из двух попадает в заданный диапазон?
Старый 01.12.2005, 15:20   #2  
DA_NEAL is offline
DA_NEAL
Участник
Аватар для DA_NEAL
Лучший по профессии 2017
Лучший по профессии 2009
 
788 / 54 (3) ++++
Регистрация: 05.08.2002
Адрес: Королев
тут без программирования не обойтись... есть такая вещь MARK называется... вот и её и пользуйте
__________________
Want to believe...
Старый 01.12.2005, 16:45   #3  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
SETFILTER("Starting Action Date", '>%1&<%2', BeginDatePeriod, EndDatePeriod)
SETFILTER("Ending Action Date", '>%1&<%2', BeginDatePeriod, EndDatePeriod)
IF FIND('-') THEN ...
Старый 01.12.2005, 17:03   #4  
DA_NEAL is offline
DA_NEAL
Участник
Аватар для DA_NEAL
Лучший по профессии 2017
Лучший по профессии 2009
 
788 / 54 (3) ++++
Регистрация: 05.08.2002
Адрес: Королев
2 Romeo

А если еще подумать и вопрос перечитать?
__________________
Want to believe...
Старый 01.12.2005, 17:24   #5  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Не сдаемся .. Тагда ..
Если с достоверностью гарантируется, что Starting Action Date меньше Ending Action Date, то пишем так:
SETFILTER("Starting Action Date", '>%1', BeginDatePeriod)
SETFILTER("Ending Action Date", '<%1', EndDatePeriod)
IF FIND('-') THEN ...
-)
Старый 01.12.2005, 18:16   #6  
Alterant is offline
Alterant
Участник
 
378 / 10 (1) +
Регистрация: 31.03.2004
Цитата:
Сообщение от romeo Посмотреть сообщение
Не сдаемся .. Тагда ..
Если с достоверностью гарантируется, что Starting Action Date меньше Ending Action Date, то пишем так:
SETFILTER("Starting Action Date", '>%1', BeginDatePeriod)
SETFILTER("Ending Action Date", '<%1', EndDatePeriod)
IF FIND('-') THEN ...
-)
Возьмем, например, период 01.01.05..10.01.05.

Запись со "Starting Action Date" = 05.01.05 и "Ending Action Date" = 31.12.9999.

По Вашему алгоритму она в результирующий набор не попадет, а должна.
Нет в Навике ИЛИ фильтров по полям, Ardak, используйте MARK, как Вам советовал DA_NEAL.
Старый 01.12.2005, 18:29   #7  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Цитата:
Сообщение от Alterant Посмотреть сообщение
Цитата:
Сообщение от romeo Посмотреть сообщение
Не сдаемся .. Тагда ..
Если с достоверностью гарантируется, что Starting Action Date меньше Ending Action Date, то пишем так:
SETFILTER("Starting Action Date", '>%1', BeginDatePeriod)
SETFILTER("Ending Action Date", '<%1', EndDatePeriod)
IF FIND('-') THEN ...
-)
Возьмем, например, период 01.01.05..10.01.05.

Запись со "Starting Action Date" = 05.01.05 и "Ending Action Date" = 31.12.9999.

По Вашему алгоритму она в результирующий набор не попадет, а должна.
Нет в Навике ИЛИ фильтров по полям, Ardak, используйте MARK, как Вам советовал DA_NEAL.
Не сдаемся .. В этом случае необходимо четко указать, какие условия на даты. И не понимаю, почему запись должна попасть в выборку, если обе даты должны лечь в указанный диапазон. Вторая выпадает из него ..
Старый 02.12.2005, 09:06   #8  
Alterant is offline
Alterant
Участник
 
378 / 10 (1) +
Регистрация: 31.03.2004
Цитата:
Сообщение от romeo Посмотреть сообщение
Не сдаемся .. В этом случае необходимо четко указать, какие условия на даты. И не понимаю, почему запись должна попасть в выборку, если обе даты должны лечь в указанный диапазон. Вторая выпадает из него ..
Читайте условия задачи, т.е. первое сообщение в топике.
Старый 02.12.2005, 09:27   #9  
Eugeny_F is offline
Eugeny_F
Участник
 
371 / 30 (2) +++
Регистрация: 18.11.2003
Адрес: Москва
А оператор IF тут не поможет? Типа:

SETRANGE("Starting Action Date",BeginDatePeriod, EndDatePeriod);
IF FIND('-') THEN BEGIN
...........
END
ELSE BEGIN
SETRANGE("Starting Action Date");
SETRANGE("Ending Action Date",BeginDatePeriod, EndDatePeriod);
IF FIND('-') THEN BEGIN
............
END;
END
Старый 02.12.2005, 09:55   #10  
DA_NEAL is offline
DA_NEAL
Участник
Аватар для DA_NEAL
Лучший по профессии 2017
Лучший по профессии 2009
 
788 / 54 (3) ++++
Регистрация: 05.08.2002
Адрес: Королев
2 Alterant

Они (romeo,Eugeny_F) прикалываются по ходу дела
__________________
Want to believe...
Старый 02.12.2005, 10:04   #11  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Цитата:
Сообщение от Alterant Посмотреть сообщение
Цитата:
Сообщение от romeo Посмотреть сообщение
Не сдаемся .. В этом случае необходимо четко указать, какие условия на даты. И не понимаю, почему запись должна попасть в выборку, если обе даты должны лечь в указанный диапазон. Вторая выпадает из него ..
Читайте условия задачи, т.е. первое сообщение в топике.
Прочитал. В условии сказано - запись удовлетворяет, если ЛЮБАЯ из дат, то есть ОБЕ, то есть И - Starting Action Date и Ending Action Date - попадает в диапазон. Не понимаю, чем не удовлетворяет написанное мной:
SETFILTER("Starting Action Date", '>%1&<%2', BeginDatePeriod, EndDatePeriod)
SETFILTER("Ending Action Date", '>%1&<%2', BeginDatePeriod, EndDatePeriod)
IF FIND('-') THEN ...
Объясните.
Старый 02.12.2005, 11:10   #12  
Greggy_imported is offline
Greggy_imported
Участник
Аватар для Greggy_imported
 
291 / 10 (1) +
Регистрация: 24.09.2004
тут имелось я так понимаю если хоть одна дата из двух попадает в диапазон... то есть условие ИЛИ
Старый 02.12.2005, 11:22   #13  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Цитата:
Сообщение от Greggy Посмотреть сообщение
тут имелось я так понимаю если хоть одна дата из двух попадает в диапазон... то есть условие ИЛИ
Если так, то согласен на MARK.
Старый 02.12.2005, 11:50   #14  
Alterant is offline
Alterant
Участник
 
378 / 10 (1) +
Регистрация: 31.03.2004
Цитата:
Сообщение от romeo Посмотреть сообщение
... ЛЮБАЯ из дат, то есть ОБЕ ..
Любая - это значит или первая, или вторая, или обе, а отнудь не обе.
Старый 02.12.2005, 11:56   #15  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Цитата:
Сообщение от Alterant Посмотреть сообщение
Цитата:
Сообщение от romeo Посмотреть сообщение
... ЛЮБАЯ из дат, то есть ОБЕ ..
Любая - это значит или первая, или вторая, или обе, а отнудь не обе.
Спор приобретает философский характер. Полагаю, что вопрос уже решен.
Старый 02.12.2005, 14:20   #16  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
Цитата:
Сообщение от romeo Посмотреть сообщение
Спор приобретает философский характер. Полагаю, что вопрос уже решен.
Ромка! не сдавайся!
Старый 02.12.2005, 15:53   #17  
Ardak is offline
Ardak
Участник
 
48 / 11 (1) +
Регистрация: 13.07.2006
Спасибо всем!!! получился вариант с Mark,MarkedOnly
вот код:
OnPreDataItem()

REPEAT

IF ("Starting Action Date">=StartDate) AND ("Starting Action Date"<=EndDate) THEN MARK(TRUE);
IF ("Ending Action Date">=StartDate) AND ("Ending Action Date"<=EndDate) THEN MARK(TRUE);

UNTIL NEXT = 0;

MARKEDONLY(TRUE);

Старый 02.12.2005, 16:07   #18  
e-statik is offline
e-statik
Участник
 
102 / 11 (1) +
Регистрация: 06.07.2005
Хех, тема аналогичная моей ("Когда фильтров уже нехватает...")
Старый 02.12.2005, 16:21   #19  
Alterant is offline
Alterant
Участник
 
378 / 10 (1) +
Регистрация: 31.03.2004
Цитата:
Сообщение от Ardak Посмотреть сообщение
Спасибо всем!!! получился вариант с Mark,MarkedOnly
вот код:
OnPreDataItem()

REPEAT

IF ("Starting Action Date">=StartDate) AND ("Starting Action Date"<=EndDate) THEN MARK(TRUE);
IF ("Ending Action Date">=StartDate) AND ("Ending Action Date"<=EndDate) THEN MARK(TRUE);

UNTIL NEXT = 0;

MARKEDONLY(TRUE);

Я бы убрал точку с запятой после первой строки и поставил else перед второй, а если по "Starting Action Date" и по "Ending Action Date" есть ключи (не обязательно один ключ на оба поля), где эти поля находятся относительно не далеко от начала ключа, то пользовался бы фильтрами.
Т.е.
REPEAT
IF ("Starting Action Date">=StartDate) AND ("Starting Action Date"<=EndDate) THEN
MARK(TRUE)
ELSE IF ("Ending Action Date">=StartDate) AND ("Ending Action Date"<=EndDate) THEN
MARK(TRUE);
UNTIL NEXT = 0;

MARKEDONLY(TRUE);


или если с ключами

SETCURRENTKEY(..., "Starting Action Date", ...); //чем меньше полей до "Starting Action Date", тем лучше
SETRANGE("Starting Action Date", StartDate, EndDate);
IF FIND('-') THEN REPEAT
MARK(TRUE);
UNTIL NEXT = 0;
SETRANGE("Starting Action Date");
SETCURRENTKEY(..., "Ending Action Date", ...); //чем меньше полей до "Ending Action Date", тем лучше
SETRANGE("Ending Action Date", StartDate, EndDate);
IF FIND('-') THEN REPEAT
MARK(TRUE);
UNTIL NEXT = 0;
MARKEDONLY(TRUE);
Старый 02.12.2005, 16:57   #20  
Wizard_imported is offline
Wizard_imported
Участник
 
157 / 10 (1) +
Регистрация: 25.11.2004
при сортировке НЕ по первичному ключу
использование MARKEDONLY(true)
приведет к тормозам при большом объеме данных.
Будьте бдительны.
 


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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:38.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.