Форум » [x]Harbour » Неправильное построение индексов при работе с ADS » Ответить

Неправильное построение индексов при работе с ADS

NickSam: Добрый день, коллеги! Есть программа на Harbour 3.2., работает с RDD DBFCDX. Эта же самая программа, переведенная на работу под ADS, неправильно строит индексные файлы для русских символов. То есть сначала идет все по алфавиту, а потом после "Я" снова идет набор строк начиная с "А". Преред переиндексацией индексные файлы удаляю. Подскажите, пожалуйста, где копать данную проблему?

Ответов - 12

Dima: NickSam Версия ADS ? Кодировка базы ? Ключ индекса ? Сделай не большой тест , сырец сюда , проверю у себя

NickSam: Версия 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

PSP: Вы забываете, что сначала идут большие буквы (прописные), а потом маленькие (строчные). Приведите всё к одному регистру.


Dima: NickSam пишет: rddRegister("ADS",1) Это не юзаю NickSam пишет: rddsetdefault( "ADS" ) А такое бывает ? У меня так для 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.)

NickSam: 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

Dima: Прогнал тест Вот результат https://cloud.mail.ru/public/C5xx/Wp4n5kiLC

Dima: NickSam пишет: Да, и такая деталь, если впрямую не указывать расширение индексного файла при индексации, то создается .IDX. Это фича и делай так например index on CLNT TAG FCLI1 ordsetfocus('FCLI1')

Pasha: Dima пишет: Кодировка у Вас 866 у меня по ходу тоже но в настройках ADS у меня стоит так OEM Charset Set - Russian Ну да. На сервере должна быть эта настройка. 866 кодировка это OEM. Задать ANSI Character Set недостаточно, это нужно если используется RU1251.

NickSam: Dima, Огромное спасибо! Все заработало, ключевым моментом было отсутствие строки: AdsSetCharType(ADS_OEM, .t.) Без нее Upper() не отрабатывал с русскими буквами. PSP Вы забываете, что сначала идут большие буквы (прописные), а потом маленькие (строчные). Приведите всё к одному регистру. Тоже большое спасибо за это напоминание.

NickSam: Pasha пишет: Ну да. На сервере должна быть эта настройка. 866 кодировка это OEM. Задать ANSI Character Set недостаточно, это нужно если используется RU1251. Пробовал как с ANSI Character Set - ANSII, так и с ANSI Character Set - Russian на сервере. Сейчас все нормально работает независимо от этой настройки.

Dima: NickSam Из доки [pre2] $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. [/pre2]

PSP: NickSam пишет: PSP  цитата: Вы забываете, что сначала идут большие буквы (прописные), а потом маленькие (строчные). Приведите всё к одному регистру. Тоже большое спасибо за это напоминание. Ну не заметил Upper(), с кем не бывает))))))))



полная версия страницы