31.05.2010, 15:44 | #1 |
Участник
|
всем привет!
есть нетривиальная (как по мне) задачка: имеется строка фильтра по полю А для таблицы Х. например, 120..158 имеется значение поля А. например, 136 необходимо проверить попадает ли значение 136 в отфильтрованный набор 120..158? сначала решил просто и прямо: накладываю фильтр и перебираю записи пока не найду нужное мне значение. если нету, значит не попадает потом решил дописывать к строке фильтра доп. условия: '('+фильтр+')&'+значение. если находит первую запись, значит попадает. первый вариант надежен, но на больших объемах данных кушает много времени и ресурсов. второй вариант ровно в два раза быстрее, но имею смутные подозрения на счет его надежности применимо к разным типам данных. есть ли более быстрые и изящные способы определения вхождения в отфильтрованный набор? |
|
31.05.2010, 16:02 | #2 |
Участник
|
Проще всего, наверное, воспользоваться группами фильтров. Наложить на одном уровне 120..158, на другом 136, и посмотреть, найдется ли запись.
|
|
31.05.2010, 16:19 | #3 |
Участник
|
|
|
31.05.2010, 16:29 | #4 |
Участник
|
Цитата:
Сообщение от Nosta
всем привет!
есть нетривиальная (как по мне) задачка: имеется строка фильтра по полю А для таблицы Х. например, 120..158 имеется значение поля А. например, 136 необходимо проверить попадает ли значение 136 в отфильтрованный набор 120..158? сначала решил просто и прямо: накладываю фильтр и перебираю записи пока не найду нужное мне значение. если нету, значит не попадает потом решил дописывать к строке фильтра доп. условия: '('+фильтр+')&'+значение. если находит первую запись, значит попадает. первый вариант надежен, но на больших объемах данных кушает много времени и ресурсов. второй вариант ровно в два раза быстрее, но имею смутные подозрения на счет его надежности применимо к разным типам данных. есть ли более быстрые и изящные способы определения вхождения в отфильтрованный набор? |
|
31.05.2010, 16:32 | #5 |
Участник
|
Если есть запись, для которой нужно проверить попадает она в какой-то отфильтрованный набор, то нужно
1. установить фильтры на нужные поля этой записи Rec.SETFILTER или использовать Rec.SETVIEW 2. вызвать Rec.FIND, если запись попадает в набор то вернется TRUE |
|
31.05.2010, 16:38 | #6 |
Участник
|
Цитата:
Сообщение от Fordewind
Цитата:
Сообщение от Nosta
всем привет!
есть нетривиальная (как по мне) задачка: <.........> потом решил дописывать к строке фильтра доп. условия: '('+фильтр+')&'+значение. если находит первую запись, значит попадает. первый вариант надежен, но на больших объемах данных кушает много времени и ресурсов. второй вариант ровно в два раза быстрее, но имею смутные подозрения на счет его надежности применимо к разным типам данных. есть ли более быстрые и изящные способы определения вхождения в отфильтрованный набор? |
|
31.05.2010, 16:43 | #7 |
Участник
|
Например, написать
recX.FILTERGROUP(2); recX.SETFILTER(A, '120..158'); recX.FILTERGROUP(0); recX.SETFILTER(A, '136'); if recX.FINDFIRST THEN ... и не забыть потом сделать записи RESET, чтобы снять фильтры. Один нюанс: такой метод наверняка сработает, только если выбран первичный ключ. А он может быть неудобен, если поле, по которому накладывают фильтр, в него не входит, а записей много. |
|
31.05.2010, 16:49 | #8 |
Участник
|
Цитата:
Сообщение от Milk
Например, написать
recX.FILTERGROUP(2); recX.SETFILTER(A, '120..158'); recX.FILTERGROUP(0); recX.SETFILTER(A, '136'); if recX.FINDFIRST THEN ... и не забыть потом сделать записи RESET, чтобы снять фильтры. Один нюанс: такой метод наверняка сработает, только если выбран первичный ключ. А он может быть неудобен, если поле, по которому накладывают фильтр, в него не входит, а записей много. |
|
31.05.2010, 16:54 | #9 |
Участник
|
Насколько я понимаю, если ключ не первичный, 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 |
Участник
|
Речь идет о вызове FIND без параметров, что равнозначно FIND('='), при таком вызове к существующим фильтрам на записи прибавляется фильтр по первичному ключу/ключам. Такой вызов FIND в принципе не может вернуть больше одной записи.
|
|
31.05.2010, 17:32 | #11 |
Участник
|
с фильтр группами отработало на ура. спасибо!
|
|
01.06.2010, 13:25 | #12 |
Участник
|
Задача тривиальная! Название темы не соответсвует содержимому.
Вот задачка чтоб подумать. В настроках есть строка с навороченым фильтром(250 символов). При вставе в таблицу необходимо проверять. соответсвует ли значение поля указанному фильтру. |
|
01.06.2010, 13:33 | #13 |
Участник
|
Есть у поля таблицы свойство TableRelation его можно правильно заполнить, и кодить не надо будет.
|
|
01.06.2010, 13:45 | #14 |
Участник
|
фильтр по значению первичного текущей записи. Неправильно восприятие, ведет к неправильным выводам и действиям.
|
|
29.06.2010, 23:41 | #15 |
Участник
|
Цитата:
Сообщение от Storkich
фильтр по значению первичного текущей записи. Неправильно восприятие, ведет к неправильным выводам и действиям.
Код: Rec.SETFILTER(Code, '120..158'); Rec.Code := '136'; Exist := Rec.FIND; |
|