Страница 1 из 1

Btrieve и регистронезависимый поиск

Добавлено: 11 Май 2019, 8:44
finsoftrz
Заметил такую штуку. Если в программе не задавать LOCALE с CLACOLSEQ, то сортировка в ключе по строковому полю с NOCASE регистронезависимая только для латиницы. Если задаем LOCALE с CLACOLSEQ, то получается зависимость от регистра. То есть NOCASE игнорируется. Получается, что на драйвере Btrieve не получается реализовать регистронезависимый поиск для кириллицы, как в tps, или я что-то не знаю?

Btrieve и регистронезависимый поиск

Добавлено: 11 Май 2019, 9:14
finsoftrz
Наверно, надо уточнить. Смотрю на pervasiveSQL 10, формат 9.5.

Btrieve и регистронезависимый поиск

Добавлено: 11 Май 2019, 10:23
Игорь Столяров
Здесь 2 момента …

1. Что такое "регистронезависимый поиск" ? Речь идёт о LOCATOR для позицирования засветки в BROWSE по первым символам ?

2. BTRIEVE действительно создаёт ключи без учёта CLACOLSEQ. Наверно, это верно для любой БД c поддержкой на стороне сервера.
Если посмотреть заголовок TPS файла, то в нём прописан CLACOLSEQ на момент создания файла. В MKD такого нет, используется
последовательность ANSI без поддержки национальных кодовых страниц.

Btrieve и регистронезависимый поиск

Добавлено: 11 Май 2019, 10:26
finsoftrz
Да, речь идёт о LOCATOR для позицирования засветки в BROWSE по первым символам. Аналогично и порядок следования записей в броузе по этому ключу.

Btrieve и регистронезависимый поиск

Добавлено: 11 Май 2019, 10:29
finsoftrz
Как я понял, CLACOLSEQ все же используется. Если ставить в ней разные значения, то разным будет и следование записей в ключе. Но при ее использовании не работает NOCASE.

Btrieve и регистронезависимый поиск

Добавлено: 11 Май 2019, 10:34
finsoftrz
В help есть такая фраза:

Btrieve supports an alternate collating sequence. However, NLM 6 does not support both NOCASE and an alternate collating sequence. If you specify both, the NOCASE attribute takes precedence. No error is returned fromThe SEND function.

Btrieve и регистронезависимый поиск

Добавлено: 11 Май 2019, 10:35
Игорь Столяров
finsoftrz писал(а): 11 Май 2019, 10:26Аналогично и порядок следования записей в броузе по этому ключу.
Ну да. LOCATOR работает по ключу, а ключ BTRIEVE не будет регистронезависимым.
Наверно это всё связано с поддержкой UNICODE (точнее её отсутствием), ведь БД может быть интернациональной.
Видимо в данном случае нужно делать именно регистронезависимый контекстный поиск (FILTER),
что-то вроде: Match(Tovar:Name,Loc:FindString,17)

Btrieve и регистронезависимый поиск

Добавлено: 11 Май 2019, 11:22
finsoftrz
Отсутствие NOCASE в локаторе пережить можно. Тут больше вопрос совместимости решения на btrieve с решением на tps. В tps я особо не парюсь, делаю в справочниках так называемый мач-код простым over на поле с наименованием. Наименование может быть длинным, а мач-код короткий, по первым символам наименования. Ключ и локатор строятся по мач-коду. В btrieve в этом случае получаем некрасивую картинку, как на скриншоте. В этом случае надо делать не over, а обычное поле, в которое писать значение lower(name)...
btrw.jpg

Btrieve и регистронезависимый поиск

Добавлено: 11 Май 2019, 11:34
Игорь Столяров
finsoftrz писал(а): 11 Май 2019, 11:22Тут больше вопрос совместимости решения на btrieve с решением на tps
В данном случае, есть смысл привести списки приложений с разными структурами БД к общему виду.
Например, задав Locale('CLACOLSEQ','WINDOWS')

Btrieve и регистронезависимый поиск

Добавлено: 11 Май 2019, 11:43
finsoftrz
Оно так и есть, только CLACOLSEQ явный. Но не решает проблему с отсутствием NOCASE. Если мач-код переводить в отдельное поле, то таких таблиц 60+. И вместо элегантного решения с OVER на tps получаем не очень красиво дополнительные поля в таблицах, которые надо не забывать заполнить, и поиск только по строчным буквам...

Btrieve и регистронезависимый поиск

Добавлено: 11 Май 2019, 12:07
Игорь Столяров
Можно точно утверждать 2 вещи:

1. Регистронезависимые ключи в списках для MKD нельзя получить также просто, как для TPS.

2. Здесь надо копать установку параметра /LACS=country_ID,code_page для драйвера Btrieve.
Как я понимаю, именно она отвечает за последовательность сортировки символов в ключах.

Btrieve и регистронезависимый поиск

Добавлено: 11 Май 2019, 12:57
finsoftrz
LACS я проверял. Ноль эмоций, когда через send и ошибка файловой системы, если включить в декларации таблицы.

Btrieve и регистронезависимый поиск

Добавлено: 11 Май 2019, 13:53
Игорь Столяров
finsoftrz писал(а): 11 Май 2019, 12:57если включить в декларации таблицы
А Вы пробовали создавать новый MKD файл с установленными параметрами /LACS=country_ID,code_page ?
Там ещё надо посмотреть, в справке к Actian Database как-то путанно про значения этих кодов.

Btrieve и регистронезависимый поиск

Добавлено: 11 Май 2019, 14:23
finsoftrz
Конечно, создавал новый. Судя по доке, последовательность символов для сортировки в ключах сохраняется в mkd файле при его создании.