Delphi7->После индексации оператор LIKE сошел с ума!!!

Grigoriy 11.03.2004 - 17:17 | Ситуация: есть таблица dbtPrice. по ней делаю sql запрос: QueryStr:='Наименование LIKE '''+QueryStr; QueryStr:=UpperCase(QueryStr); while QueryStr<>AnsiReplaceStr(QueryStr,' ', ' ' ) do QueryStr:=AnsiReplaceStr(QueryStr,' ', ' '); QueryStr:=AnsiReplaceStr(QueryStr,'%', '&%' ); QueryStr:=AnsiReplaceStr(QueryStr,'_', '&_' ); QueryStr:=AnsiReplaceStr(QueryStr,'*', '%' ); QueryStr:=AnsiReplaceStr(QueryStr,'?', '_' ); with Query1 do begin S:=dbtPrice.TableName+'.db'; S:='SELECT * FROM ' +s+' WHERE '+QueryStr+''' ESCAPE ''&'' ORDER BY Цена, Наименование DESC, Производитель'; Active:=False; SQL.Clear; SQL.Add(s); Active:=True; end; В результате строка типа 'Ябл' оператором LIKE стала восприниматься как 'Ябл%', что есть бред и недопустимо Однако если в результирующем запросе будет "Я_л", то всё становится на свои места и "Я_л%"<>"Я_л". Всё это стало происходить после того, как я проиндексировал таблицу. До этого все работало нормально, А теперь без _ и % не работает
Grigoriy 1 - 12.03.2004 - 12:26 | так глухо?
tvv 2 - 12.03.2004 - 16:50 | а каким запрос получается после всех этих манипуляций ?
Grigoriy 3 - 13.03.2004 - 15:53 | Ну скажем (я упрощаю) SELECT * FROM MyTab WHERE Наименование LIKE 'Ябл' ESCAPE "&" ORDER BY Цена, Наименование DESC, Производитель. Вот такой запрос стал эквивалентен такому: SELECT * FROM MyTab WHERE Наименование LIKE 'Ябл%' ESCAPE "&" ORDER BY Цена, Наименование DESC, Производитель. Т.е. после индексации оператор Like стал "жадным". Как это исправить?
tvv 4 - 14.03.2004 - 01:20 | Странно я что то не пойму, а зачем ты используешь ESCAPE "&", ведь ESCAPE, насколько я понял, нужно использовать когда в строке для поиска встречаются символы '%' или '_' которые нужно трактовать не как символы подстановки, а как обычные символы. Вот тогда перед таким символом ('%' или '_') и помещается символ, который объявлен после ESCAPE. В твоем случае это "&". Но в твоем примере я не вижу необходимости использования ESCAPE "&".
Grigoriy 5 - 14.03.2004 - 19:23 | Я пишу БД для фармацевтики. Там бывает такое (5% раствор и т.п.) НО я отключал Escape. Не помогало. Дело в индексации, 100 % Может ли Interbase спасти положение?
tvv 6 - 15.03.2004 - 14:49 | Так чтоб бы было найдено только 'Ябл' то можно написать так: SELECT * FROM MyTab WHERE Наименование='Ябл'
leschakon2003 7 - 15.03.2004 - 17:55 | Тут индексация непричем. Запрс LIKE не использует индексацию. Может искать все яблоки так? SELECT * FROM MyTab WHERE Наименование='Ябл%'
Grigoriy 8 - 15.03.2004 - 23:38 | Не, народ, ну как ни при чем? Отключаю - всё работает, включаю - перестает. В мануале к Perl нашел похожую ситуацию, оттуда и взял термин "жадность" Кроме того, мне надо искать, к примеру, "яблоки зеленые". без индексации "ябл%зел%" надет что надо, а вот после индексации "ябл%зел%"="ябл%" Что просто дебилизм. Похоже с Парадокса придется переползать. И еще - стоит набрать "я_л%лел%", как всё работает нормально. Видимо подстановочные элементы по одному не работают в индексированных полях
Delphist 9 - 16.03.2004 - 12:05 | Я с Парадоксом намучился в свое время и могу сказать: 1) переползать НАДО (если нервы бережешь) 2) дело может быть не в индексации, а в покоцанной базе. Соответственно, индекс будет тоже коцанный и искать будет и яблоки, и груши. А развал базы на Парадоксе - дело частое под Win98 и старше. Особенно при использовании компонента TTable (заменить на TQuery) и многопользовательской работе.
tvv 10 - 16.03.2004 - 14:06 | Если база не большая и не нужна работа в сети, то paradox самое то. Так как по количеству глюков (FB/YA/IB) + (средства доступа) многократно превосходят paradox.
Grigoriy 11 - 16.03.2004 - 14:30 | база небольшая, каждый раз создаю ее в рантайме заново (из 20 Excel файлов всё кидаю в массив, потом из этого массива заполняю базу) и сразу после заполнения делаю AddIndex('iName','Наименование',[ixPrimary]); Работаю на WinXP. Работа в сети пока не предполагается, прога однопользовательская. Тоже решил, что более-менее отлаженная работа возможна именно на Paradox, но если я не смогу победить этот глюк, то придется либо переползать, либо вместо отображения проиндексированного Ttable, отказаться от индексов и показывать в Query через select * from Чего ОЧЕНЬ не хотелось бы делать... Ни в LocalSqc.hlp, ни в доках по sql-92 я не нашел фичи про LIKE+Индексация
leschakon2003 12 - 16.03.2004 - 15:06 | Grigoriy а какой у тебя языковый драйвер для парадокса ? Я сейчас пробую твой пример...
Grigoriy 13 - 16.03.2004 - 15:58 | Хороший вопрос... не знаю. Где глянуть это?
leschakon2003 14 - 16.03.2004 - 16:30 | Grigoriy я сейчас Вашу ситуацию пытаюсь моделировать. Но что-то у меня в парадокс таблицу никак русские не вводятся блин (: Хотел ввести Яблоко, Яблоки Ябло и так далее. А языковой драйвер можно посмотреть в DBE Admin -> Configuration->Drivers->Nativ->Paradox->Langdriver
Delphist 15 - 16.03.2004 - 16:36 | #11 Для такой ситуации уж лучше использовать DBF, тем более что Excel умеет экспортировать в DBF-формат. Через OLE-automation можно сделать этот экспорт автоматически. Единственная фишка - версия DBF. Ее лучше ставить в младшую сторону, т.к. иначе будут глюки с русским текстом.
Grigoriy 16 - 16.03.2004 - 18:24 | 2leschakon2003: Драйвер :'ascii' ANSI проблем не возникало, более того, и поля у меня русскими буквами. 2Delphist:А можно поподробнее? Дело в том, что Excel запускать никто не будет. Моя прога читает Excel-файл согласно шаблону (цена - в колонке номер 3, наименование в кол. №5 и т.п.) В массив. Далее я проверяю нет ли засад (буквы там где цифры, дата в тупом формате, всё через try делать нельзя - рабоает в 10 раз медленнее). Потом из массива, элементы которого типа record, я заполняю БД (связь через TTable). Ну и потом запрос по таблице. Который и не прокатил...
Delphist 17 - 16.03.2004 - 18:55 | Читаешь согласно шаблону? А через что? Сырой файл, компонент, OLE automation?
leschakon2003 18 - 16.03.2004 - 19:50 | Grigoriy У тебф следующая ситыеция Гриша. Длайверы Парадокс некорректно работают с русским языком. Я сделал эксперимент и попробывал запросы LIKE с полями содержащими английский, и нет проблем. С индексом или без все работает с латинскими символами. Слушай а может тебе не мучится и действительно взять формат DBF , он самый простой в использовании. Или бери БД ACCESS + компоненты ADO. Плюс с ADO ты без проблем залезишь в Exel (пример могу дать). А BDE выкинь ты нафиг, это эже старая вещь...
Grigoriy 19 - 17.03.2004 - 10:12 | 2Delphist: XLApp := CreateOleObject('Excel.Application'); Читаю согласно шаблону (цена в 2 колонке, первая строка=3 и т.д.) Вроде нашел компонту прямого доступа к файлам... 2leschakon2003: А проверял ли ты русский вариант? Может и правда драйвер... Насчет перехода на DBF - т.к. программа пока только строиться, то проблем быть не должно, тем более мне dbf еще читать и читать (БЭСТ-4). Вся хитрость в том, что Paradox хвалили как локальную БД. А ADO ругали за скорость доступа... (пример был бы желателен, у меня всё затыкается на этапе логина)
leschakon2003 20 - 17.03.2004 - 13:47 | 19 Grigoriy у меня русские символы даже не получилось в таблицу ввести, и я прекратил с ними возню (я помница мне давно бился с русскими в Interbase очень долго и поборол, но не помню как, давно это было). А с латиницей поэкперементировал на примере поставляемой БД парадокс с делфи 7 (biolife.db) LIKE делает что нужно с индексом и без. Насчет ADO по скорости может и ругают, но зато она универсальная для Windows. Ежели хочешь могу бросить тебе на мыло пример соединения с Exel c использованием TAdoConnection и TAdoQuery (работает как часы) Также при помощи ADO можешь и к DBF подключаться. ADO поддерживает транзакции и SQL .
leschakon2003 21 - 17.03.2004 - 13:52 | 19 Grigoriy После использования ADO проще потом переходить от использования локальных баз на SQL сервер ...
Grigoriy 22 - 17.03.2004 - 14:15 | Кинь, буду благодарен :)
leschakon2003 23 - 17.03.2004 - 17:47 | Grigoriy уже послал

>>