Форум » [x]Harbour » Фильтр ASCAN по массиву строковых значений » Ответить

Фильтр ASCAN по массиву строковых значений

Pasha: Может быть это уже неактуально, но, помнится, был такой вопрос. Просто мне пришлось решить подобную задачу. Надо установить фильтр - поиск по символьному массиву, вида: {|| ASCAN(aValues, <cFieldName>) # 0} Если делать фильтр как блок кода, то СУБД типа Ads/Leto не показывают своих преимуществ, и выполняют его медленно. Вот функция, которая формирует символьную строку для выполнения такого фильтра: Function ArrFillter(cFld, aValues) Local cRet := '', cc if len(aValues) == 1 cRet := FldCompare(cFld, aValues[1]) else cRet := '' for each cc in aValues if ! Empty(cRet) cRet += ',' endif cRet += ChrValue(cc) next cRet := 'ASCAN({' + cRet + '},' + cFld + ')#0' endif Return cRet Function FldCompare(cFld, cVal, lUpper) Local cFilter if lUpper # nil cFilter := ChrValue(cVal) + '$Upper(' + cFld + ')' else cFilter := cFld + '=' + ChrValue(cVal) endif Return cFilter Static Function ChrValue(cStr) Local cRet if At('"', cStr) == 0 cRet := '"' + cStr + '"' elseif At("'", cStr) == 0 cRet := "'" + cStr + "'" elseif At("[", cStr) == 0 .and. At("]", cStr) == 0 cRet := "[" + cStr + "]" else cRet := '"' + StrTran(cStr, '"', '"+Chr(34)+"') + '"' endif Return cRet

Ответов - 0



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