Форум » [x]Harbour » ADSADT + OEM » Ответить

ADSADT + OEM

Dima: Создал Free базу ADT с символьным полем , создал индекс по этому полю. Заполнил данными в OEM. Сортировка получилась не правильная. Первая запись началась с буквы "Ш". Так и должно быть ? PS AdsSetCharType(2, .t.)

Ответов - 12

Vlad04: Нет не должно Использую local ADS с DBF в OEM кодировке . Но думаю, разница нет с ADT. Посмотри , что у тебя записано в файлах adslocal.cfg У меня ANSI_CHAR_SET=Russian ... OEM_CHAR_SET=RUSSIAN

Dima: Vlad04 пишет: что у тебя записано в файлах adslocal.cfg У меня так же. В доке пишут: "Note that ADT tables only use the ANSI collation"

SergKis: Dima Со времен S87 для OEM (3и языка) использую для индексов и подводов ф-ю "правильной" сортировки для "C" полей.


Dima: SergKis пишет: подводов ф-ю "правильной" сортировки для "C" полей что за функция такая ? самопал ?

SergKis: Dima пишет самопал ? Да, в clipper была Cишной, сейчас такая [pre2] FUNCTION ELRU( cTxt, nLen, nPos ) LOCAL i, k, n, cTx STATIC a_ELRu_arr If a_ELRu_arr == Nil a_ELRu_arr := array(255) aFill(a_ELRu_arr, chr(254)) cTx := '!#$%&()*+,-./:;<=>?@\^{|}~[]"'+['] n := 32 For i := 1 To n; a_ELRu_arr[ i ] := chr(n) Next For i := 1 To len(cTx) n++ If n == 34 .or. n == 39; n++ EndIf k := asc(subs(cTx, i, 1)) a_ELRu_arr[ k ] := chr(n) Next cTx := '0123456789_AĀАaāаBБbбCČcčВвГгDДdдEĒЕeēеFfGĢЖgģжЗзHhIĪИiīиЙйJjKĶКkķкLĻЛlļл' cTx += 'MМmмNŅНnņнOОoоPПpпRРrрSŠСsšсTТtтUŪУuūуVvWwфФXХxхYyЦцЧчZŽzžШшЩщЪъЫыЬьЭэЮюЯя' For i := 1 To len(cTx) n++ If n == 91 .or. n == 93 .or. n == 96; n++ EndIf k := asc(subs(cTx, i, 1)) a_ELRu_arr[ k ] := chr(n) Next EndIf If cTxt == Nil RETURN a_ELRu_arr Else If ! hb_IsNumeric(nPos); nPos := 1 EndIf If hb_IsNumeric(nLen); cTxt := subs(cTxt, nPos, nLen) EndIf FOR EACH k IN @cTxt n := asc(k) k := a_ELRu_arr[ n ] NEXT EndIf RETURN cTxt [/pre2]

Dima: SergKis В ADSADT как и в самом ADS такой фокус не прокатит.

SergKis: Dima Возможно прокатит заполнение спец. поля, введенное для индекса и спец. заполнением, для соблюдения сортировки. Т.е. Dos2Ansi или еще кой вариант

Dima: SergKis Там косяк не в этом , ADT таблица заполнена данными в OEM , а ADS у меня такое впечатление индекс строит думая что данные в ANSI и получается каша.

SergKis: Dima Если читает и пишет нормально для oem и проблема в индексе, подсунь поле для индекса в ansi или числах-эквивалентах

Haz: Dima пишет: Там косяк не в этом , ADT таблица заполнена данными в OEM , а ADS у меня такое впечатление индекс строит думая что данные в ANSI и получается каша. У ADS есть Advantage ANSI Collation Utility, которая позволяет создавать свои таблицы символов и сортировок. В данном случае это поможет, но возможно позже вылезет еще где. Бороться с подменой ANSI/OEM через доп поля и дополнительные функции - это заранее создавать себе проблемы. Если ADS написал что ADT таблица должна быть в ANSI , то это значит что ANSI кодировка используется : - При выборке / записи в таблице - При индексации - При выполнении SQL запросов ( включая сортировку ORDER BY ) - При операциях FTS - И непонятно где еще Можно последовательно со всем этим бороться ( по мере поступления проблем), а можно перескочить на базу в ANSI кодировке и забыть Если желание перескочить на ADT таблицы твердое , то придется перескакивать и на ANSI. Причин работать с базой именно в OEM , я не вижу Вот тут https://sftserv.ru/help/index.html?install_ads_2.htm как раз и меняют родной CHR на измененный. Ну и как самое простое - проверить установки сервера по OEM и ANSI в обоих случаях должно быть RUSSIAN

Haz: Вот тут https://sftserv.ru/help/index.html?install_ads_2.htm как раз и меняют родной CHR на измененный. Ну и как самое простое - проверить установки сервера по OEM и ANSI в обоих случаях должно быть RUSSIAN

Dima: Haz пишет: Ну и как самое простое - проверить установки сервера по OEM и ANSI в обоих случаях должно быть RUSSIAN Так и стоит я выше писал. Тему можно считать закрытой...



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