Автор | Сообщение |
|
| |
Пост N: 4
Зарегистрирован: 30.01.18
|
|
Отправлено: 19.02.18 16:55. Заголовок: Неправильное построение индексов при работе с ADS
Добрый день, коллеги! Есть программа на Harbour 3.2., работает с RDD DBFCDX. Эта же самая программа, переведенная на работу под ADS, неправильно строит индексные файлы для русских символов. То есть сначала идет все по алфавиту, а потом после "Я" снова идет набор строк начиная с "А". Преред переиндексацией индексные файлы удаляю. Подскажите, пожалуйста, где копать данную проблему?
|
|
|
Ответов - 12
[только новые]
|
|
|
| |
Пост N: 6732
Зарегистрирован: 17.05.05
|
|
Отправлено: 19.02.18 17:30. Заголовок: NickSam Версия ADS ..
NickSam Версия ADS ? Кодировка базы ? Ключ индекса ? Сделай не большой тест , сырец сюда , проверю у себя
|
|
|
|
| |
Пост N: 5
Зарегистрирован: 30.01.18
|
|
Отправлено: 19.02.18 18:13. Заголовок: Версия ADS 11.10, ко..
Версия ADS 11.10, кодировка базы RU866. На сервере установлена настройка ANSI Character Set - ANSII. Если поставить Russian, то вообще полная ерунда с порядком сортировки получается. Вот тестовый пример, пишу из отсортированного файла в пустой такой же структуры. Вот здесь можно взять файлы: https://yadi.sk/d/5a2n5K4X3Sa9wt FUNCTION Main REQUEST ADS REQUEST HB_LANG_RU866 REQUEST HB_CODEPAGE_RU866 hb_cdpSelect( "RU866" ) hb_LangSelect( "RU866" ) rddRegister("ADS",1) rddsetdefault( "ADS" ) // Файл из которого пишем отсортированные строки dbusearea (.T., "ADS", 'FCLI', , .F.) index on STR(GCLI)+upper(CLNT) to ('FCLI1'+'.CDX') set index to ('FCLI1') // Файл куда пишем dbusearea (.T., "ADS", 'FCLI_TO', , .F.) zap select FCLI dbsetorder(1) dbgotop() do while !eof() if GCLI == 6 FCLI_TO->(dbappend()) replace FCLI_TO->NCLI with NCLI,; FCLI_TO->CLNT with CLNT endif dbskip() enddo RETURN
|
|
|
|
| постоянный участник
|
Пост N: 1380
Зарегистрирован: 27.01.07
|
|
Отправлено: 19.02.18 18:38. Заголовок: Вы забываете, что сн..
Вы забываете, что сначала идут большие буквы (прописные), а потом маленькие (строчные). Приведите всё к одному регистру.
|
|
|
|
| |
Пост N: 6733
Зарегистрирован: 17.05.05
|
|
Отправлено: 19.02.18 18:51. Заголовок: NickSam пишет: rddR..
NickSam пишет: Это не юзаю NickSam пишет: А такое бывает ? У меня так для CDX REQUEST ADS rddSetDefault( "ADSCDX" ) Ну и кроме этого не хватает AdsSetCharType(ADS_OEM, .t.) Кодировка у Вас 866 у меня по ходу тоже но в настройках ADS у меня стоит так OEM Charset Set - Russian Ansi Charset Set - Russian PS ADS 10 PS2 А еще у меня живут AdsSetServerType(ADS_REMOTE_SERVER) AdsSetFileType(ADS_CDX) AdsRightsCheck(.F.)
|
|
|
|
| |
Пост N: 6
Зарегистрирован: 30.01.18
|
|
Отправлено: 19.02.18 19:44. Заголовок: Dima, Поправил текст..
Dima, Поправил текст согласно рекомендациям, менял на сервере настройку на Ansi Charset Set - Russian, упростил ключ (просто символьное поле), результат тот же. Да, и такая деталь, если впрямую не указывать расширение индексного файла при индексации, то создается .IDX. Вы не могли бы прогнать мой пример на своем окружении, даже не знаю что и делать, уже думаю ADS 10 вместо 11 переставить. #include "Ads.ch" FUNCTION Main REQUEST ADS REQUEST HB_LANG_RU866 REQUEST HB_CODEPAGE_RU866 hb_cdpSelect( "RU866" ) hb_LangSelect( "RU866" ) rddsetdefault( "ADSCDX" ) AdsSetCharType(ADS_OEM, .t.) AdsSetServerType(ADS_REMOTE_SERVER) AdsSetFileType(ADS_CDX) AdsRightsCheck(.F.) // Файл из которого пишем отсортированные строки dbusearea (.T., "ADSCDX", 'FCLI', , .F.) index on CLNT to ('FCLI1'+'.CDX') //index on STR(GCLI)+upper(CLNT) to ('FCLI1') set index to ('FCLI1') // Файл куда пишем dbusearea (.T., "ADSCDX", 'FCLI_TO', , .F.) zap select FCLI dbsetorder(1) dbgotop() do while !eof() if GCLI == 6 FCLI_TO->(dbappend()) replace FCLI_TO->NCLI with NCLI,; FCLI_TO->CLNT with CLNT endif dbskip() enddo RETURN
|
|
|
|
| |
Пост N: 6734
Зарегистрирован: 17.05.05
|
|
Отправлено: 19.02.18 19:51. Заголовок: Прогнал тест Вот рез..
|
|
|
|
| |
Пост N: 6735
Зарегистрирован: 17.05.05
|
|
Отправлено: 19.02.18 20:01. Заголовок: NickSam пишет: Да, ..
NickSam пишет: цитата: | Да, и такая деталь, если впрямую не указывать расширение индексного файла при индексации, то создается .IDX. |
| Это фича и делай так например index on CLNT TAG FCLI1 ordsetfocus('FCLI1')
|
|
|
|
| Администратор
|
Пост N: 3692
Зарегистрирован: 23.05.05
|
|
Отправлено: 19.02.18 20:03. Заголовок: Dima пишет: Кодиров..
Dima пишет: цитата: | Кодировка у Вас 866 у меня по ходу тоже но в настройках ADS у меня стоит так OEM Charset Set - Russian |
| Ну да. На сервере должна быть эта настройка. 866 кодировка это OEM. Задать ANSI Character Set недостаточно, это нужно если используется RU1251.
|
|
|
|
| |
Пост N: 8
Зарегистрирован: 30.01.18
|
|
Отправлено: 19.02.18 20:45. Заголовок: Dima, Огромное спаси..
Dima, Огромное спасибо! Все заработало, ключевым моментом было отсутствие строки: AdsSetCharType(ADS_OEM, .t.) Без нее Upper() не отрабатывал с русскими буквами. PSP цитата: | Вы забываете, что сначала идут большие буквы (прописные), а потом маленькие (строчные). Приведите всё к одному регистру. |
| Тоже большое спасибо за это напоминание.
|
|
|
|
| |
Пост N: 9
Зарегистрирован: 30.01.18
|
|
Отправлено: 19.02.18 20:57. Заголовок: Pasha пишет: Ну да...
Pasha пишет: цитата: | Ну да. На сервере должна быть эта настройка. 866 кодировка это OEM. Задать ANSI Character Set недостаточно, это нужно если используется RU1251. |
| Пробовал как с ANSI Character Set - ANSII, так и с ANSI Character Set - Russian на сервере. Сейчас все нормально работает независимо от этой настройки.
|
|
|
|
| |
Пост N: 6736
Зарегистрирован: 17.05.05
|
|
Отправлено: 19.02.18 21:04. Заголовок: NickSam Из доки ..
NickSam Из доки $SYNTAX$ AdsSetCharType( <nCharType>, [lOEM] ) --> nPriorSetting $ARGUMENTS$ <nCharType> Type of character data in the table. From ADS docs: Options are ADS_ANSI and ADS_OEM. This indicates the type of character data to be stored in the table. For compatibility with DOS-based CA-Cl*pper applications, ADS_OEM should be specified. When usTableType is ADS_ADT, this parameter is ignored and ANSI is always used. <lOEM> This parameter used for console mode applications, when character data stored in OEM charset. If lOEM is passed as .T., rddads doesn't convert character data into ANSI charset.
|
|
|
|
|
| постоянный участник
|
Пост N: 1381
Зарегистрирован: 27.01.07
|
|
Отправлено: 19.02.18 21:33. Заголовок: NickSam пишет: PSP ..
NickSam пишет: цитата: | PSP цитата: Вы забываете, что сначала идут большие буквы (прописные), а потом маленькие (строчные). Приведите всё к одному регистру. Тоже большое спасибо за это напоминание. |
| Ну не заметил Upper(), с кем не бывает))))))))
|
|
|
|