On-line: PSP, Haz, гостей 4. Всего: 6 [подробнее..]
АвторСообщение



Пост N: 4
Зарегистрирован: 30.01.18
ссылка на сообщение  Отправлено: 19.02.18 16:55. Заголовок: Неправильное построение индексов при работе с ADS


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


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 12 [только новые]


администратор




Пост N: 6732
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 19.02.18 17:30. Заголовок: NickSam Версия ADS ..


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

Спасибо: 0 
ПрофильЦитата Ответить



Пост 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


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1380
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 19.02.18 18:38. Заголовок: Вы забываете, что сн..


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6733
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 19.02.18 18:51. Заголовок: NickSam пишет: rddR..


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.)


Спасибо: 0 
ПрофильЦитата Ответить



Пост 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


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6734
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 19.02.18 19:51. Заголовок: Прогнал тест Вот рез..


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6735
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 19.02.18 20:01. Заголовок: NickSam пишет: Да, ..


NickSam пишет:

 цитата:
Да, и такая деталь, если впрямую не указывать расширение индексного файла при индексации,
то создается .IDX.


Это фича и делай так например
index on CLNT TAG FCLI1

ordsetfocus('FCLI1')


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3692
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 19.02.18 20:03. Заголовок: Dima пишет: Кодиров..


Dima пишет:

 цитата:
Кодировка у Вас 866 у меня по ходу тоже но в настройках ADS у меня стоит так
OEM Charset Set - Russian



Ну да. На сервере должна быть эта настройка. 866 кодировка это OEM. Задать ANSI Character Set недостаточно, это нужно если используется RU1251.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 8
Зарегистрирован: 30.01.18
ссылка на сообщение  Отправлено: 19.02.18 20:45. Заголовок: Dima, Огромное спаси..


Dima,
Огромное спасибо! Все заработало, ключевым моментом было отсутствие строки:
AdsSetCharType(ADS_OEM, .t.)
Без нее Upper() не отрабатывал с русскими буквами.

PSP

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


Тоже большое спасибо за это напоминание.


Спасибо: 0 
ПрофильЦитата Ответить



Пост 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 на сервере. Сейчас все нормально работает независимо от этой настройки.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост 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.



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1381
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 19.02.18 21:33. Заголовок: NickSam пишет: PSP ..


NickSam пишет:

 цитата:
PSP

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


Тоже большое спасибо за это напоминание.



Ну не заметил Upper(), с кем не бывает))))))))

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 369
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет