Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема DBF и поиск по строке (число прочтений - 3015 )
mixsture
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 14
Зарегистрирован: 17. Июня 2008
DBF и поиск по строке
25. Июня 2008 :: 14:52
Печать  
В sql-варианте поиск like регистронезависимый, а в dbf - зависит от регистра. Можно как-нибудь изменить на независимый?
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: DBF и поиск по строке
Ответ #1 - 25. Июня 2008 :: 15:12
Печать  
mixsture писал(а) 25. Июня 2008 :: 14:52:
В sql-варианте поиск like регистронезависимый, а в dbf - зависит от регистра. Можно как-нибудь изменить на независимый?

Может попробовать поиск выполнять с преобразованием в большие символы (как UPPER в T-SQL).
Хотя это может ощутимо замедлить выполнение запроса.

Можно подсмотреть здесь:
http://msdn.microsoft.com/en-us/library/f2x2b62b(VS.80).aspx
  
Наверх
IP записан
 
mixsture
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 14
Зарегистрирован: 17. Июня 2008
Re: DBF и поиск по строке
Ответ #2 - 25. Июня 2008 :: 15:25
Печать  
Спасибо. Что-то не думал об этом Улыбка
  
Наверх
 
IP записан
 
mixsture
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 14
Зарегистрирован: 17. Июня 2008
Re: DBF и поиск по строке
Ответ #3 - 26. Июня 2008 :: 07:43
Печать  
Сейчас (vfp-драйвер) сравнение происходит так: UPPER(Спр.Descr) like UPPER('%что-то%'). Я так понимаю, индекс при такой функции не задействуется.

А даст ли выигрыш в скорости использование 1sqlite?
Цитата:
Версия 1.0.0.8
Движок SQLite пропатчен на предмет регистронезависимости. Регистронезависимость теперь работает для всех символов, не только для латинских.


  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: DBF и поиск по строке
Ответ #4 - 26. Июня 2008 :: 08:08
Печать  
mixsture писал(а) 26. Июня 2008 :: 07:43:
Сейчас (vfp-драйвер) сравнение происходит так: UPPER(Спр.Descr) like UPPER('%что-то%'). Я так понимаю, индекс при такой функции не задействуется.

А даст ли выигрыш в скорости использование 1sqlite?
Цитата:
Версия 1.0.0.8
Движок SQLite пропатчен на предмет регистронезависимости. Регистронезависимость теперь работает для всех символов, не только для латинских.




Индекс задействуется, если вместо UPPER('%что-то%') ты ищешь UPPER('что-то%') (нет первого %)
и это зависит не от Fox или  SqlLite или еще от чего то , а от структуры CDX файлов(индекс алфавитно
упорядочен, как глоссарий в книге).
И еще - если индекс UPPER он и в Африке UPPER и драйвер его ну никак не переделает .

P.S> В Fox чтобы оптимизировать поиск вида ('что-то%') слева от "=" нужно выписать полное выражение индекса
Для наименования
Код
Выбрать все
UPPER(МойСпр.Descr) LIKE UPPER('что-то%')  


Для строкового реквизита со свойством отбора :
Код
Выбрать все
UPPER($МойСпр.МойРекв)+UPPER(descr) LIKE UPPER('что-то%')  

  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: DBF и поиск по строке
Ответ #5 - 26. Июня 2008 :: 08:39
Печать  
Еще вдогонку - особенности строковых параметров.
Использование некоторых символов в запросах Fox OLEDB вызовет ошибку.
Для этого нужно производить замену
Код
Выбрать все
ВыбСимв="'";
Если Найти(МойСтроковыйПараметр,ВыбСимв)>0 Тогда
 МойСтроковыйПараметр=СтрЗаменить(МойСтроковыйПараметр,ВыбСимв,"'+CHR(39)+'");
КонецЕсли;
ВыбСимв=РазделительСтрок;
// эта замена вторая
Если Найти(МойСтроковыйПараметр,ВыбСимв)>0 Тогда
 МойСтроковыйПараметр=СтрЗаменить(МойСтроковыйПараметр,ВыбСимв,"'+CHR(13)+'");
КонецЕсли;
 


так как эти символы относятся к служебным символам FoxPro

P.S> Особенно часто служебные символы цепляются при копировании пользователями Артикулов и Наименований из Exel
« Последняя редакция: 27. Июня 2008 :: 09:02 - kiruha »  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: DBF и поиск по строке
Ответ #6 - 27. Июня 2008 :: 08:43
Печать  
mixsture писал(а) 26. Июня 2008 :: 07:43:
Сейчас (vfp-драйвер) сравнение происходит так: UPPER(Спр.Descr) like UPPER('%что-то%'). Я так понимаю, индекс при такой функции не задействуется.

А даст ли выигрыш в скорости использование 1sqlite?
Цитата:
Версия 1.0.0.8
Движок SQLite пропатчен на предмет регистронезависимости. Регистронезависимость теперь работает для всех символов, не только для латинских.



Так и пиши.
where descr like '%ЧтоТо%'

В текущей реализации 1sqlite индекс для проверки like-условия задействован не будет, даже для условий
like 'ЧтоТо%'
, то бишь такое условие надо расписывать вручную
where descr >= 'ЧтоТо' and descr < 'ЧтоТП'
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: DBF и поиск по строке
Ответ #7 - 27. Июня 2008 :: 08:47
Печать  
orefkov писал(а) 27. Июня 2008 :: 08:43:
mixsture писал(а) 26. Июня 2008 :: 07:43:
Сейчас (vfp-драйвер) сравнение происходит так: UPPER(Спр.Descr) like UPPER('%что-то%'). Я так понимаю, индекс при такой функции не задействуется.

А даст ли выигрыш в скорости использование 1sqlite?
Цитата:
Версия 1.0.0.8
Движок SQLite пропатчен на предмет регистронезависимости. Регистронезависимость теперь работает для всех символов, не только для латинских.



Так и пиши.
where descr like '%ЧтоТо%'

В текущей реализации 1sqlite индекс для проверки like-условия задействован не будет, даже для условий
like 'ЧтоТо%'
, то бишь такое условие надо расписывать вручную
where descr >= 'ЧтоТо' and descr < 'ЧтоТП'


Саш, добавь, плиз, эту инфу в доку на свою ВК, чтобы народ помнил и знал.
Слишком уж популярная задача Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: DBF и поиск по строке
Ответ #8 - 27. Июня 2008 :: 09:16
Печать  
В принципе, если операция
Код
Выбрать все
Спр.Descr like '%что-то%' 


используется очень интенсивно можно создать спец справочник с 2-мя полями -
при изменении наименования добавлять 10(например) элементов в этот спр вида
Спр.Descr
Сред(Спр.Descr,1)
Сред(Спр.Descr,2)
Сред(Спр.Descr,3)
....
Сред(Спр.Descr,10)

а во второе поле ссылку на элемент. К сожалению, если длина наименования >>10
объем такого спр будет(Длина наименования)*(Количество элементов в спр )
  
Наверх
 
IP записан
 
mixsture
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 14
Зарегистрирован: 17. Июня 2008
Re: DBF и поиск по строке
Ответ #9 - 27. Июня 2008 :: 10:32
Печать  
Замедление при не попадании по индексу не критично для моего случая (поиск в справочнике по введенной пользователем строке). Номенклатура 4000 элементов - 600 мсек

Просто думал, может есть простой путь Улыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать