Форум » Clipper » [?] m6_evalpartial , aofResolvePartial » Ответить

[?] m6_evalpartial , aofResolvePartial

Dima: в SIX конструкция m6_evalpartial(nhand,{|| "25" $ cod}) работает в ADS аналог якобы aofResolvePartial(nhand,{|| "25" $ cod}) не работает. В чем прикол ?

Ответов - 18

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

Dima: Локальный фильтр стоит однако. Видимо придется свою сделать ;)

suv2: проверь в asc.exe установи фильтр, проверь, что он с хэндлом (AltF, запомнить кол-во записей, посмотреть в инфо хэндл), далее Ctrl-Alt-?, aofResolvePartial...., Enter, снова Alt-F b и сравнить новое кол-во записей Возможно также, что выражение всегда возвращает .T. Ну и свою написать нетрудно, конечно Кроме этого кто мешает установить фильтр сразу с той частью, которую ты даешь в evalapartial


Dima: suv2 пишет: Кроме этого кто мешает установить фильтр сразу с той частью, которую ты даешь в evalapartial Попробую , спасибо. Не найду в гайде , как удалить запись из фильтра AOF , как добавить есть а удалить то как ? Сначала AOF я заполнил через ряд aofAddRange и вот теперь мне нужно убрать записи которые не удовлетворяеют условию.

Dima: Dima пишет: Не найду в гайде , как удалить запись из фильтра AOF , как добавить есть а удалить то как ? Совсем слепой стал ;)))))))) aofRemoveRecord( <nHandle>, <nRecord> ) -> логическое значение

Dima: Не так все просто оказалось как я думал однако........ Вообщем грубо пока сделал так (работает) Что бы отсеять записи которые есть в фильтре но не удовлетворяющие условию , путем их удлаления из клиентского фильтра: figa:=aofCountRecords(handl) aofgotop(handl) for i=1 to figa // не думал что для сравнения придется чекать реальную запись // скорее всего я не верно представлял себе как это работает volvo->(dbgoto(aofGetRecord(handl))) if &cblch==.f. // это условие переданное в символьном виде , не важно в обчем ;) aofRemoveRecord(handl,aofGetRecord(handl)) endif aofskip(handl) next Что скажешь Юра ? ;) ЗЫ Сверил по тому же условию локально под SIX , одинаковый результат ;)

Dima: Идейка посетила ;) В принципе все эти клиентские фильтра можно реализовать средствами Clipper и работать будет не на много медленнее. В кратце можно забрасывать валидные записи в отдельную базу на сервере , в которой будет одно поле хранящее номер записи , а затем в браузере ходить по этим записям и тд итп

suv2: Dima пишет: Что скажешь Юра ? ;) да фигня какая-то про aofgotop и прочие перемещения ваще забудь. все эти виртуальные указатели во-первых глючат, во-вторых не нужны надо использолвать реальные перемещения по базе второе. как я уже сказал - для заморочек нужны ОСНОВАНИЯ! Я уверен, что у тебя не тот случай, когда ты сможешь сделать выборку эффективней, чем сам сикс с помощью ПРОСТОГО SET FILTER TO &ПолноеИОкончательноеУсловиеФильтра зачем делать addRange, а потом бегать выкидывать записи вместо одного единственного set filter to? Можешь объяснить?

Dima: suv2 пишет: зачем делать addRange Человек может выбрать марку автомобиля , фирму производителя , группу товара - это все формирую с помощью addrange , при чем выбор может быть списком. Выражение фильтра может получится очень длинным и clipper вместе c ADS его не поймет. Не помню но вроде максимальная длина была 254 символа. И уже потом я выкидываю из фильтра записи если чел еще делает запрос на поиск кода и названия по вхождению. Например он выбрал марку авто NISSAN и хочет что бы были показаны те запчасти в индексе (код товара) присутсвует скажем MS25. Ну и как это безобразие реализовать с помощью обычного SET FILTER ? ;)

Dima: Кстати подскажи тогда как корректней сделать figa:=aofCountRecords(handl) aofgotop(handl) // это пожалуй можно убрать , согласен for i=1 to figa volvo->(dbgoto(aofGetRecord(handl))) if &cblch==.f. // это условие переданное в символьном виде , не важно в обчем ;) aofRemoveRecord(handl,aofGetRecord(handl)) endif aofskip(handl) next

suv2: Dima пишет: Выражение фильтра может получится очень длинным и clipper вместе c ADS его не поймет. Не помню но вроде максимальная длина была 254 символа. Ограничение на длину - понятно. Задача решается так: вместо set filter to A="A" .and.B="B" set filter to A="A" ; F1:=m6_FiltCopy(m6_GetAreaHandle()) set filter to B="B" ; F2:=m6_FiltCopy(m6_GetAreaHandle()) m6_FiltJoin(F1,F2,JOIN_INTERSECT) m6_SetAreaFilter(F1) Непонятно, как связана задача преодоление ограничения длины выражения фильтра и твоё выкидывание из фильтра. В твоем случае (nissan + MS25) ничего выкидывать не надо set filter to marka="NISSAN" .and. "MS25" $ KODTOVARA Если выражение длинное - делай как сказано выше.

Dima: suv2 пишет: set filter to A="A" ; F1:=m6_FiltCopy(m6_GetAreaHandle()) set filter to B="B" ; F2:=m6_FiltCopy(m6_GetAreaHandle()) Интерестный подход , надо взять на вооружение ;) Фигово что сервак уже отдал и не на чем отладиться.....но что нить придумаю. А SIX не покатит , задача под ADS и set axs locking on ;) Спасибо за идею !!!!!! ЗЫ Век живи , век учись ;)

suv2: в адс есть аналогичные функции правда я остановился на адс-клиенте 5.0 - в более поздних версиях влиента все фильтры и операции с ними вели себя совершенно не так (или глюки или полностью изменившееся поведение) Еще мысль - в адс есть серверные фильтры и там возможно ограничение 256 символов на выражение фильтра не действует. проверь

Dima: suv2 пишет: в адс есть аналогичные функции На всякий случай для тех кто не знает The following is an alphabetized list of the "Client" Advantage Optimized Filter functions and the equivalent MachSix and ClipMore functions, if applicable. Keep in mind that the Client Advantage Optimized Filter function may not be an EXACT match in syntax and functionality to the MachSix and ClipMore functions listed: aofAddRange Equivalent functions: M6_AddScoped, rlSetLoHigh aofAddRecord Equivalent functions: M6_FiltAddRec, rlSet aofAndFilter Equivalent functions: M6_FiltJoin, rlAnd aofCopyFilter Equivalent functions: M6_FiltCopy, rlNewDup aofCountRecords Equivalent functions: M6_FiltCount, M6_RecCount, rlCount, cmFiltCount aofCreateFilter Equivalent functions: M6_NewFilter, rlNew, rlNewQuery aofDbEval Equivalent functions: M6_dbEval aofDestroyFilter Equivalent functions: cmDestroyFilter aofErrorCode Equivalent functions: M6_Error aofFileToFilter Equivalent functions: M6_FiltRestore aofFilterInfo Equivalent functions: M6_FiltInfo aofFiltToFile Equivalent functions: M6_FiltSave aofFiltToSystem Equivalent functions: M6_SetAreaFilter, rlSetFilter aofFiltToUser Equivalent functions: M6_ChgOwner, rlExFilter aofFreeFilter Equivalent functions: M6_FreeFilter, rlDestroy aofGetAutoResolve Equivalent functions: cmGetLinear aofGetFilterHandle Equivalent functions: M6_GetAreaFilter, rlGetFilter aofGetMaxRecords Equivalent functions: rlLen aofGetOptLevel Equivalent functions: M6_IsFilter, rlOptLevel aofGetRecord Equivalent functions: none aofGetVersion Equivalent functions: M6_Version, cmVersion aofGoBottom Equivalent functions: M6_FiltBott aofGoRecord Equivalent functions: M6_FiltGoRec aofGoTop Equivalent functions: M6_FiltTop aofHasPartials Equivalent functions: rlHasMaybe aofIsOptimizable Equivalent functions: M6_IsOptimize aofIsRecordInFilter Equivalent functions: M6_IsFiltRec, rlTest aofKeyCount Equivalent functions: cmKeyCount aofKeyGoto Equivalent functions: cmKeyGoto aofKeyNo Equivalent functions: cmKeyNo aofNotFilter Equivalent functions: M6_FiltInverse, rlNot aofOrFilter Equivalent functions: M6_FiltJoin, rlOr aofRebuildFilter Equivalent functions: M6_RefreshFilter aofReFilter Equivalent functions: cmReFilter aofRemoveRecord Equivalent functions: M6_FiltDropRec, rlClear aofResolvePartial Equivalent functions: M6_EvalPartial, rlMaybeEval, cmDoLinear aofRestoreFilter Equivalent functions: cmRestFilter aofSaveFilter Equivalent functions: cmSaveFilter aofSetAutoResolve Equivalent functions: cmSetLinear aofSetFilter Equivalent functions: M6_SetFilter, cmFilter aofSkip Equivalent functions: M6_FiltSkip, rlNextRecno, rlPrevRecno aofSmartFilter Equivalent functions: cmSmartFilter aofToggleRecord Equivalent functions: M6_FiltChgRec aofVarToString Equivalent functions: cm2Str dbClearFilter Equivalent functions: cmClrFilter dbSkip Equivalent functions: cmKeySkip

Dima: suv2 Юрчик насчет эффективного (не избытычного) использования фильтров я понял. Может подскажешь как эффективно под ADS (без SIX) производить поиск по вхождению. Записей в базе порядка 1 500 000 :)

suv2: гипертекстовый индекс (*.hsx) см asc.exe

Dima: suv2 пишет: гипертекстовый индекс (*.hsx) Вопросики :) Установка set axs locking on не будет мешать ? Могу ли я создавать и корректировать эти индексы если база открыта в Shared ?

suv2: 1.не будет 2. да. но коррекция индексов в hsx идет не на уровне RDD, а на уровне пользователя rlock field:="new" hsReplace(HsxHandle,HsxKey) unlock можно запихнуть вызов обновления hsx-ключа в функцию dbrUnlock/sx_Unlock (добавления в append blank. удаления в dbDelete() восстановления в recall) но если используется техника блокировки всего файла целиком (вместо блокировки отдельных записей) - это не поможет



полная версия страницы