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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.05.2010, 15:44   #1  
Nosta is offline
Nosta
Участник
 
23 / 10 (1) +
Регистрация: 28.07.2009
всем привет!

есть нетривиальная (как по мне) задачка:
имеется строка фильтра по полю А для таблицы Х. например, 120..158
имеется значение поля А. например, 136
необходимо проверить попадает ли значение 136 в отфильтрованный набор 120..158?

сначала решил просто и прямо: накладываю фильтр и перебираю записи пока не найду нужное мне значение. если нету, значит не попадает
потом решил дописывать к строке фильтра доп. условия: '('+фильтр+')&'+значение. если находит первую запись, значит попадает.

первый вариант надежен, но на больших объемах данных кушает много времени и ресурсов.
второй вариант ровно в два раза быстрее, но имею смутные подозрения на счет его надежности применимо к разным типам данных.

есть ли более быстрые и изящные способы определения вхождения в отфильтрованный набор?
Старый 31.05.2010, 16:02   #2  
Milk is offline
Milk
Участник
 
242 / 12 (1) ++
Регистрация: 08.06.2006
Проще всего, наверное, воспользоваться группами фильтров. Наложить на одном уровне 120..158, на другом 136, и посмотреть, найдется ли запись.
Старый 31.05.2010, 16:19   #3  
Nosta is offline
Nosta
Участник
 
23 / 10 (1) +
Регистрация: 28.07.2009
Цитата:
Сообщение от Milk Посмотреть сообщение
Проще всего, наверное, воспользоваться группами фильтров. Наложить на одном уровне 120..158, на другом 136, и посмотреть, найдется ли запись.
осмелюсь показаться наглым: а можно посмотреть как это реализовать в коде? никогда не работал с группами фильтров (
Старый 31.05.2010, 16:29   #4  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Цитата:
Сообщение от Nosta Посмотреть сообщение
всем привет!

есть нетривиальная (как по мне) задачка:
имеется строка фильтра по полю А для таблицы Х. например, 120..158
имеется значение поля А. например, 136
необходимо проверить попадает ли значение 136 в отфильтрованный набор 120..158?

сначала решил просто и прямо: накладываю фильтр и перебираю записи пока не найду нужное мне значение. если нету, значит не попадает
потом решил дописывать к строке фильтра доп. условия: '('+фильтр+')&'+значение. если находит первую запись, значит попадает.

первый вариант надежен, но на больших объемах данных кушает много времени и ресурсов.
второй вариант ровно в два раза быстрее, но имею смутные подозрения на счет его надежности применимо к разным типам данных.

есть ли более быстрые и изящные способы определения вхождения в отфильтрованный набор?
А откуда растут ноги у такой задачи? Я что-то не слышал, что бы фильтры криво отрабатывали.
Старый 31.05.2010, 16:32   #5  
Raul is offline
Raul
Участник
 
35 / 10 (1) +
Регистрация: 15.03.2006
Если есть запись, для которой нужно проверить попадает она в какой-то отфильтрованный набор, то нужно
1. установить фильтры на нужные поля этой записи Rec.SETFILTER или использовать Rec.SETVIEW
2. вызвать Rec.FIND, если запись попадает в набор то вернется TRUE
Старый 31.05.2010, 16:38   #6  
Nosta is offline
Nosta
Участник
 
23 / 10 (1) +
Регистрация: 28.07.2009
Цитата:
Сообщение от Fordewind Посмотреть сообщение
Цитата:
Сообщение от Nosta Посмотреть сообщение
всем привет!

есть нетривиальная (как по мне) задачка:
<.........>
потом решил дописывать к строке фильтра доп. условия: '('+фильтр+')&'+значение. если находит первую запись, значит попадает.

первый вариант надежен, но на больших объемах данных кушает много времени и ресурсов.
второй вариант ровно в два раза быстрее, но имею смутные подозрения на счет его надежности применимо к разным типам данных.

есть ли более быстрые и изящные способы определения вхождения в отфильтрованный набор?
А откуда растут ноги у такой задачи? Я что-то не слышал, что бы фильтры криво отрабатывали.
задача в принципе простая: ограничить пользователю выбор допустимых значений по полю Х в зависимости от значения поля Y. например, если поле Х попадает в диапазон 125А..146Р, то допустимые значения для поля Y должны быть в диапазоне 'B..I|S..V'. и вот когда пользователь пытается ввести в поле Y, например, К, то система должна его грязно выругать.
Старый 31.05.2010, 16:43   #7  
Milk is offline
Milk
Участник
 
242 / 12 (1) ++
Регистрация: 08.06.2006
Цитата:
Сообщение от Nosta Посмотреть сообщение
Цитата:
Сообщение от Milk Посмотреть сообщение
Проще всего, наверное, воспользоваться группами фильтров. Наложить на одном уровне 120..158, на другом 136, и посмотреть, найдется ли запись.
осмелюсь показаться наглым: а можно посмотреть как это реализовать в коде? никогда не работал с группами фильтров (
Например, написать

recX.FILTERGROUP(2);
recX.SETFILTER(A, '120..158');
recX.FILTERGROUP(0);
recX.SETFILTER(A, '136');
if recX.FINDFIRST THEN ...

и не забыть потом сделать записи RESET, чтобы снять фильтры.

Цитата:
Сообщение от Raul Посмотреть сообщение
Если есть запись, для которой нужно проверить попадает она в какой-то отфильтрованный набор, то нужно
1. установить фильтры на нужные поля этой записи Rec.SETFILTER или использовать Rec.SETVIEW
2. вызвать Rec.FIND, если запись попадает в набор то вернется TRUE
Один нюанс: такой метод наверняка сработает, только если выбран первичный ключ. А он может быть неудобен, если поле, по которому накладывают фильтр, в него не входит, а записей много.
Старый 31.05.2010, 16:49   #8  
Raul is offline
Raul
Участник
 
35 / 10 (1) +
Регистрация: 15.03.2006
Цитата:
Сообщение от Milk Посмотреть сообщение
Цитата:
Сообщение от Nosta Посмотреть сообщение
Цитата:
Сообщение от Milk Посмотреть сообщение
Проще всего, наверное, воспользоваться группами фильтров. Наложить на одном уровне 120..158, на другом 136, и посмотреть, найдется ли запись.
осмелюсь показаться наглым: а можно посмотреть как это реализовать в коде? никогда не работал с группами фильтров (
Например, написать

recX.FILTERGROUP(2);
recX.SETFILTER(A, '120..158');
recX.FILTERGROUP(0);
recX.SETFILTER(A, '136');
if recX.FINDFIRST THEN ...

и не забыть потом сделать записи RESET, чтобы снять фильтры.

Цитата:
Сообщение от Raul Посмотреть сообщение
Если есть запись, для которой нужно проверить попадает она в какой-то отфильтрованный набор, то нужно
1. установить фильтры на нужные поля этой записи Rec.SETFILTER или использовать Rec.SETVIEW
2. вызвать Rec.FIND, если запись попадает в набор то вернется TRUE
Один нюанс: такой метод наверняка сработает, только если выбран первичный ключ. А он может быть неудобен, если поле, по которому накладывают фильтр, в него не входит, а записей много.
Нет ключ тут может быть любым, нюанс только один проверяемая запись должна существовать в таблице.
Старый 31.05.2010, 16:54   #9  
Milk is offline
Milk
Участник
 
242 / 12 (1) ++
Регистрация: 08.06.2006
Насколько я понимаю, если ключ не первичный, FIND может найти не ту запись. В хелпе к функции FIND специально это отмечается:
If the current key is not the primary key, there is a chance that several records might have the same values in current key fields.
Старый 31.05.2010, 17:00   #10  
Raul is offline
Raul
Участник
 
35 / 10 (1) +
Регистрация: 15.03.2006
Цитата:
Сообщение от Milk Посмотреть сообщение
Насколько я понимаю, если ключ не первичный, FIND может найти не ту запись. В хелпе к функции FIND специально это отмечается:
If the current key is not the primary key, there is a chance that several records might have the same values in current key fields.
Речь идет о вызове FIND без параметров, что равнозначно FIND('='), при таком вызове к существующим фильтрам на записи прибавляется фильтр по первичному ключу/ключам. Такой вызов FIND в принципе не может вернуть больше одной записи.
Старый 31.05.2010, 17:32   #11  
Nosta is offline
Nosta
Участник
 
23 / 10 (1) +
Регистрация: 28.07.2009
с фильтр группами отработало на ура. спасибо!
Старый 01.06.2010, 13:25   #12  
Storkich is offline
Storkich
Участник
 
149 / 10 (1) +
Регистрация: 08.03.2007
Задача тривиальная! Название темы не соответсвует содержимому.

Вот задачка чтоб подумать. В настроках есть строка с навороченым фильтром(250 символов). При вставе в таблицу необходимо проверять. соответсвует ли значение поля указанному фильтру.
Старый 01.06.2010, 13:33   #13  
Storkich is offline
Storkich
Участник
 
149 / 10 (1) +
Регистрация: 08.03.2007
Есть у поля таблицы свойство TableRelation его можно правильно заполнить, и кодить не надо будет.
Старый 01.06.2010, 13:45   #14  
Storkich is offline
Storkich
Участник
 
149 / 10 (1) +
Регистрация: 08.03.2007
Цитата:
Сообщение от Raul Посмотреть сообщение
Цитата:
Сообщение от Milk Посмотреть сообщение
Насколько я понимаю, если ключ не первичный, FIND может найти не ту запись. В хелпе к функции FIND специально это отмечается:
If the current key is not the primary key, there is a chance that several records might have the same values in current key fields.
Речь идет о вызове FIND без параметров, что равнозначно FIND('='), при таком вызове к существующим фильтрам на записи прибавляется фильтр по первичному ключу/ключам. Такой вызов FIND в принципе не может вернуть больше одной записи.
фильтр по значению первичного текущей записи. Неправильно восприятие, ведет к неправильным выводам и действиям.
Старый 29.06.2010, 23:41   #15  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Цитата:
Сообщение от Storkich Посмотреть сообщение
Цитата:
Сообщение от Raul Посмотреть сообщение
Цитата:
Сообщение от Milk Посмотреть сообщение
Насколько я понимаю, если ключ не первичный, FIND может найти не ту запись. В хелпе к функции FIND специально это отмечается:
If the current key is not the primary key, there is a chance that several records might have the same values in current key fields.
Речь идет о вызове FIND без параметров, что равнозначно FIND('='), при таком вызове к существующим фильтрам на записи прибавляется фильтр по первичному ключу/ключам. Такой вызов FIND в принципе не может вернуть больше одной записи.
фильтр по значению первичного текущей записи. Неправильно восприятие, ведет к неправильным выводам и действиям.
Ага. Написать можно было вот так.

Код:
Rec.SETFILTER(Code, '120..158');
Rec.Code := '136';
Exist := Rec.FIND;
 


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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 23:18.