Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 VFP dBase Driver почему может криво работать функция UPPER  [new]
zloyGamer
Member

Откуда:
Сообщений: 481
что то не то с кодировками, незнаю как и где поправить
даже если тупо в запросе написать:

SELECT
k.name,
UPPER(k.name)
FROM
mytable k

то данные в кодировке ANSI вовсе не к верхнему регистру преобразуются,
вот пример строк:

возмещение земельного налога
бозмегение земел¦ного налога

Пеня
Пен¦

разница в тарифе
Lазни¦а б TаLи-е


такая ерунда не тока с этим драйвером, а вообще с любым, уже пробывал разные версии ставить для dBase файлов, такое происходит у всех кроме MSjet - он нормально все преобразует,
видимо он на своей волне работает, но рисовать запросы для него невозможно - по мне так слишком кривые структуры запросов

подскажите что тут можно поправить чтобы нормально с кодировками драйвера работали?
я пробывал в реестре(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage)
кодовые страницы 1252-1255 в c_1251.nls выставить - непомогло!
8 апр 09, 16:20    [7040323]     Ответить | Цитировать Сообщить модератору
 Re: VFP dBase Driver почему может криво работать функция UPPER  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Если в самом файле DBF не указан признак кодовой страницы, то ничего не поможет.

Признак кодовой стрницы - это содержимое 29 байта заголовка файла DBF (первый байт имеет порядковый номер 0). Что там записано?
8 апр 09, 17:11    [7040811]     Ответить | Цитировать Сообщить модератору
 Re: VFP dBase Driver почему может криво работать функция UPPER  [new]
zloyGamer
Member

Откуда:
Сообщений: 481
29й байт нулевой,
это так и задумано? если нет то блин..
как можно поменять этот байт у кучи файлов часто и без проблем,
и на что его надо поменять?
8 апр 09, 17:56    [7041081]     Ответить | Цитировать Сообщить модератору
 Re: VFP dBase Driver почему может криво работать функция UPPER  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Если 29 байт нулевой, то, скорее всего, это таблица в DOS-кодировке. Т.е. с кодовой страницей 866. Просто в те времена не было необходимости специально контролировать кодовую страницу. Вот этот признак и не устанавливали.

Вариантов решения проблемы два:

1. Отказаться от драйвера VFP, а вместо него использовать простейшие драйвера для работы с таблицами DBF. Все эти драйвера исходят из предположения, что кодовая страница как раз под DOS. И берется из настроек текущей операционной системы. Для русской локализации Windows это и будет 866

Примеры строк подключения можно посмотреть здесь

Connection strings for DBF / FoxPro

Кстати, все эти драйвера есть на любой машине, устанавливать их специально нет необходимости. Хотя, разумеется, возможности этих драйверов более ограничены, чем драйвера VFP


2. Принудительно поставить признак кодовой страницы в 29 байте

866 = ASCII-код 101 = h65
1251 = ASCII-код 201 = hC9

На работу DOS-приложений это не повлияет никак. Однако надо будет каждый раз проверять факт наличия значения в 29 байте, поскольку, раз приложение его не контролирует, то, при определенных условиях, может и удалять.
8 апр 09, 18:18    [7041233]     Ответить | Цитировать Сообщить модератору
 Re: VFP dBase Driver почему может криво работать функция UPPER  [new]
zloyGamer
Member

Откуда:
Сообщений: 481
отлично спасибо огромное ближайшее время поэксперементирую
8 апр 09, 19:30    [7041481]     Ответить | Цитировать Сообщить модератору
 Re: VFP dBase Driver почему может криво работать функция UPPER  [new]
zloyGamer
Member

Откуда:
Сообщений: 481
а насчет
>Кстати, все эти драйвера есть на любой машине, устанавливать их специально нет необходимости. Хотя, разумеется, возможности этих драйверов более ограничены, чем драйвера VFP

не у всех драйверов есть функция UPPER, SUBSTR, LEN и другие, или они не так очевидны
например в моем любимом MSjet, фуннкция приведения в верхний регистр очень оригинально обозвана: UCASE - нигде больше такого не встречал, и уже 2 раза на поиски её названия потерял больше часа, в душу она мне запала :)

чет в инете пока невстречал справочников по функциям к стандартным драйверам,
подскажите где их можно подглядеть?
8 апр 09, 19:47    [7041521]     Ответить | Цитировать Сообщить модератору
 Re: VFP dBase Driver почему может криво работать функция UPPER  [new]
zloyGamer
Member

Откуда:
Сообщений: 481
нет не помогло, менял нулевой 29й байт на 101 и на 201 - все также работает,
и соседние байты также менял,
или ты имел ввиду 29й байт в шестнадцатиричной системе?
9 апр 09, 12:54    [7044091]     Ответить | Цитировать Сообщить модератору
 Re: VFP dBase Driver почему может криво работать функция UPPER  [new]
kiruha
Member

Откуда:
Сообщений: 124
Если речь о vfpoledb то
в подключении явно указывать кодировку
ConnectString = "
	|Provider=VFPOLEDB.1;
	|Null = Yes;
	|Exclusive = No;
	|SourceType = DBF;
	|Data Source=D:\DemoDB;
	|Mode=ReadWrite;
	|CODEPAGE=1251;"
В МСДН нет нормального описания.
Опытным путем установлено, что кроме стандартных в подключении
можно указывать параметры из конфиг. файла, а также команды SET (но без SET),
причем вместо булевых употреблять 0, -1
9 апр 09, 17:14    [7046112]     Ответить | Цитировать Сообщить модератору
 Re: VFP dBase Driver почему может криво работать функция UPPER  [new]
kiruha
Member

Откуда:
Сообщений: 124
Еще один параметр - порядок сортировки

Collating Sequence=MACHINE;

или какой там у вас - тоже влияет
9 апр 09, 17:17    [7046126]     Ответить | Цитировать Сообщить модератору
 Re: VFP dBase Driver почему может криво работать функция UPPER  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
zloyGamer
нет не помогло, менял нулевой 29й байт на 101 и на 201 - все также работает,
и соседние байты также менял,
или ты имел ввиду 29й байт в шестнадцатиричной системе?

Это для VFP, но в отношении 29 байта для DOS-таблиц то же самое

Структура табличного файла (.dbc, .dbf, .frx, .lbx, .mnx, .pjx, .scx, .vcx)

В одном байте 8 бит. Это значит, что в 10-ричной системе в него можно записать число в диапазоне от 0 до 255 (2 в 8 степени минус 1). ASCII-коды - это коды в 10-ричной системе.

Попробуй выполнить запрос (разумеется, через драйвер FoxPro) вида

SELECT CPDBF() as cpdbf, CPCURRENT() as cpCur from MyTab where recno()=1

Какие значения получились? Проблемы могут быть, если CPDBF() отлично от CPCURRENT()
9 апр 09, 18:35    [7046586]     Ответить | Цитировать Сообщить модератору
 Re: VFP dBase Driver почему может криво работать функция UPPER  [new]
zloyGamer
Member

Откуда:
Сообщений: 481
kiruha
ConnectString = "
|Provider=VFPOLEDB.1;
|Null = Yes;
|Exclusive = No;
|SourceType = DBF;
|Data Source=D:\DemoDB;
|Mode=ReadWrite;
|CODEPAGE=1251;"

спасибо огроммное, чуствую такое детально-параметризированое подклюдчение к любимому драйверу спасет мир! завтра обязательно попробую отпишусь

автор
Collating Sequence=MACHINE;

я и MACHINE и RUSSIAN пробывал - непомогает.

ВладимирМ
Попробуй выполнить запрос (разумеется, через драйвер FoxPro) вида

SELECT CPDBF() as cpdbf, CPCURRENT() as cpCur from MyTab where recno()=1

дома неполучается, оказывается на домашнем компе вообще нет никаких драйверов для дбф
ВладимирМ
стати, все эти драйвера есть на любой машине, устанавливать их специально нет необходимости.
нашел тока для оракла,мсскл и мсжет который отказывается работать..

ВладимирМ
В одном байте 8 бит. Это значит, что в 10-ричной системе в него можно записать число в диапазоне от 0 до 255 (2 в 8 степени минус 1). ASCII-коды - это коды в 10-ричной системе.
нет, ненадо, неговори мне такое, я не дерево! (но иногда чуствую себя растением :) )
видимо здесь
йа
или ты имел ввиду 29й байт в шестнадцатиричной системе?
ты меня неправельно понял, или я неверно выразился, я имелл ввиду h29 - байт, вот его я менять ещё не пробывал...

вообщем пока проблема нерешена буду эксперементировать
спасибо за помощь как решу напишу
9 апр 09, 23:18    [7047204]     Ответить | Цитировать Сообщить модератору
 Re: VFP dBase Driver почему может криво работать функция UPPER  [new]
kiruha
Member

Откуда:
Сообщений: 124
Официально драйвер
Microsoft OLE DB Provider for Visual FoxPro 9.0 (Sp 2)
http://www.microsoft.com/downloads/details.aspx?FamilyId=E1A87D8F-2D58-491F-A0FA-95A3289C5FD4&displaylang=en
драйвер ODBC не поддерживается несколько лет
драйвера dBase никакого отношения к fox не имеют и синтаксис свой
т.е. только один драйвер Microsoft OLE DB Provider for Visual FoxPro 9.0
10 апр 09, 10:52    [7048273]     Ответить | Цитировать Сообщить модератору
 Re: VFP dBase Driver почему может криво работать функция UPPER  [new]
zloyGamer
Member

Откуда:
Сообщений: 481
ОТЛИЧНО и ЗАМЕЧАТЕЛЬНО
все работает, спасибо огроммное за невероятную помощь..

итак.., что сделал:
1) подключился:
йа
Provider=VFPOLEDB.1;CODEPAGE=1251;Null = Yes;SourceType = DBF;Data Source=./TDBF

2) запрос:
йа
SELECT
CPDBF(),
CPCURRENT(),
t.name,
UPPER(t.name),
LOWER(t.name),

1
FROM myTable t

3) результат:
CPDBF = 0, CPCURRENT = 1251
регистр как обычно меняется криво!!


меняю 29й байт на 201
пробую все тоже самое ещё раз:
3) результат:
CPDBF = 1251, CPCURRENT = 1251
регистр как обычно меняется криво!!

меняю 29й байт на 101
пробую все тоже самое ещё раз:
3) результат:
CPDBF = 866, CPCURRENT = 1251
и что вы думаете? все ПРОСТО ЗАМЕЧАТЕЛЬНО работает!!

СПАСИБО ОГРОМНОЕ ВладимирМ за наводку на 29й байт, без тебя я бы на него не скоро вышел..
и ещё, :
ВладимирМ
Проблемы могут быть, если CPDBF() отлично от CPCURRENT()

тут ты был неправ..

хотя если менять строку подключения на:
йа
Provider=VFPOLEDB.1;CODEPAGE=866;Null = Yes;SourceType = DBF;Data Source=./TDBF

то всеравно CPCURRENT = 1251 !!

вообщем все работает (независимо от строки подключения) надо было просто нормально поменять 29й байт и !!переподключиться!!(что я видимо и не сделал прошлый раз)

ещё раз всем спасибо
если кому надо могу выложить програмки для пакетной смены 29го байта и выполнения запросов с вашими любимыми драйверами, пишите..
10 апр 09, 13:11    [7049447]     Ответить | Цитировать Сообщить модератору
 Re: VFP dBase Driver почему может криво работать функция UPPER  [new]
kiruha
Member

Откуда:
Сообщений: 124
А если поставить
SET TABLEVALIDATE TO 0 (проверка заголовка файла не выполняется)

или в подключении
TABLEVALIDATE=0;

Все равно нужно менять 29 байт?


P.S. CPCURRENT() в vfpoledb непонятно что должен показывать, конфиг. файл отсутствует в принципе,
а при отсутствии функция показывает тек установку ОС (по документации).
13 апр 09, 11:07    [7055894]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить