Текущий архив: 2002.06.27;
Скачать: CL | DM;
Вниз
Сканировние Найти похожие ветки
← →
Филиппов Стас (2002-06-03 12:37) [0]Здравствуйте.
Необходимо просканировать поле таблици Table1 на соответствие тексту в Edit1.
Цель - игнорирование пробелов точек и т.д. при поиске.
Но таблица содержит несколько полей и надо получить их все, а у меня получается только
одно. Плюс ко всему в базе около 100 тысяч записей и сканирование происходит
довольно долго. Можно ли как нибудь усовершенствовать нижеследующий код.
var
i,j: Integer;
s,s1,s2 : String;
chars,lett: Set of Char;
begin
Query1.close;
lett:=["0".."9","a".."z","A".."Z","А".."Я","а".."я"];
chars:=[];
s2:=Edit1.Text;
Table1.First;
for i:=1 to length(s2) do
chars:=chars + [s2[i]];
for i:=0 to Table1.RecordCount-1 do begin
s:=Table1.Fields[1].AsString;
Table1.Next;
s1:="";
for j:=1 to Length(s) do
if (s[j] in chars) or (s[j] in lett) then s1 := s1 + s[j];
j:=Pos(Edit1.Text,s1);
if j<>0 then
begin
// Запись результатов в одно поле другой таблици
Table2.Append;
Table2.Fields[0].AsString:=s;
Table2.Post;
end;
end;
// Получение всех полей Select * from Tabl1, Tabl2 where Tabl1.Field = Tabl2.field
Query1.Open;
end;
← →
mike kouzmine (2002-06-03 13:16) [1]Используй filter := "ТмяПоля Like """%" + Edit1.Text + "%""""
или SQL с параметрами
← →
Филиппов Стас (2002-06-03 13:20) [2]Такой фльтр не игнорирует пробелы и точки. То есть 1234 не равно 1 2,3-4, а цель сканирования получить все записи где содержится ...1234...
← →
Nikolay M. (2002-06-03 14:36) [3]не знаю как называется в парадоксе функция замены символа, но должно быть что-то вроде
SELECT Name FROM MyTable WHERE replace(replace(replace(Name, ".", ""), ",", "") , " ", "") LIKE "%" + #39 + Edit1.Text + #39 + "%"
вот и весь поиск. соответственно, чтобы вставить в другую таблицу:
INSERT INTO NewTable (NewName) SELECT Name FROM ... (далее по тексту)
- все решается одним запросом
← →
Lord Warlock (2002-06-03 14:43) [4]Чтобы получить все поля, можно использовать Table2 с LookUp-полями из Table1, если в обоих таблицах есть ключевые поля, но скорость не гарантирована.
← →
Филиппов Стас (2002-06-03 16:35) [5]to Nikolay M. ©
В Paradox функции замены символа нет.
← →
Леха_ (2002-06-03 16:37) [6]а использовать Table1.DisableControls не пробовал?
← →
shiva1 (2002-06-03 18:21) [7]К сожалению на базе с большим количеством записей DisableControls не может решить проблему скорости, если осуществляется перебор в цикле.
Я бы предложил действительно покопаться с функциями замены символа в SQL. Пожалуй, это единственный способ быстро произвести поиск.
Либо создать специализированную дополнительную таблицу для поиска, в которую записывать тот "сухой остаток", по которому будет производится поиск. Так, если в основной таблице некая запись содержит значение 1 2,3-4 в искомом поле, то в другой таблице создается соответствующая запись со значением 1234 и идентификатором записи в первой таблице. Таким образом можно будет производить поиск по вспомогательной таблице, и из нее получать ссылки на записи в основной таблице.
← →
sniknik (2002-06-03 19:47) [8]функции замены не помогут если это Local SQL, там вообще с функциями туго а замены так и нет вовсе.
но подобная задачка уже проскакивала на этом форуме и было оригинальное решение (по моему), может и здесь это подойдет правда проигнорирует все символы а не только точки, хотя "и т.д. при поиске" в вопросе вселяет надежду что имено это и нужно :-).
SELECT * FROM PAYMENTS WHERE [Имя получателя] LIKE "%1%2%3%4%"
← →
Филиппов Стас (2002-06-04 14:30) [9]to sniknik ©
Такой запрос возвращает все записи где содержатся цифры 1234 причем не важно в каком порядке - это и 4321 и 1589 2987 34, а необходимо, что бы символы стояли подряд - ...1234...
← →
sniknik (2002-06-04 14:43) [10]да нет порядок здесь важен, а вот что между неважно, %- любая строка. проверь внимательней.
во всяком случае у меня LIKE "%1%2%" не возвращает строку "21", только типа такого "неважно что1неважно что2неважно что", а вообще тебе видней что именно тебе нужно.
Страницы: 1 вся ветка
Текущий архив: 2002.06.27;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.005 c