Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Бдешный Upper( Я )<>Upper( я ) [dBase, FoxPro]


Страницы:   1 2 3

Serginio ©   (2002-12-30 16:04:00) 

Проблема BDE в запросах и идексах. И таких вещей я насчитал около 10-15. Как с этим бороться. Для примера если у вас есть в поле Яблоко и вы напишите Select * From xx Where descr=Upper("яблоко"), то запрос ничего не найдет.


sniknik   (2003-01-05 18:43:00) [21]

а по моему ничего тебе не понятно
попытайся перечитать еще раз, про #192-А и #128-А (как думаеш равны?) и "перекодировка идет через драйвер".


Nil   (2003-01-05 18:30:00) [22]

Спасибо!


Serginio   (2003-01-05 18:19:00) [23]

Да это все понятно. Непонятно только почему
AnsiUpperCase(ч)<>Upper(ч)=ч
AnsiUpperCase(я)<>Upper(я)=џ

Поэтому в запросе
Select * From xx Where Upper(descr)=Upper("яблоко")
не будет ни чего найдено если descr=Яблоко

Еще раз для проверки.
Создана таблица с индексом IdxName=UPPER(ID)
procedure TForm1.Button8Click(Sender: TObject);
var
Buf:TIndexChar;
TempStr:String;
Props: CurProps;
j,i:Integer;
NewIndex: IDXDesc;
hCur:hDBICUR;

begin
check(DbiOpenTable(C1db,Pchar("UppInd.dbf"),Pchar(szFoxPro),Pchar("UppInd.CDX"),Pchar("IdxName"),0,dbiREADWrite,dbiOpenShared,xltNONE,True,nil,hCur));
dbiSetToBegin(Hcur);
Check(DbiGetCursorProps(hCur,Props));
SetLength(TempStr,Props.IkeySize);
StringGrid1.Cells[3,1]:=IntToStr(Props.IkeySize);
j:=1;
For i:=1 to 255 do
Begin
buf.Id:=Char(i);
Check(DbiExtractKey(hCur,@buf,PChar(TempStr)));
ArrStr:=Arrstr+","+IntToStr(Ord(TempStr[1]));
If AnsiUpperCase(Char(i))<>TempStr[1] Then
memo1.Lines.Add("AnsiUpperCase("+Char(i)+")="+AnsiUpperCase(Char(i))+"<>"+TempStr);
end;
dbiCloseCursor(hCur);
end;


sniknik   (2003-01-05 17:45:00) [24]

вобщето это к базам не относится.

руская раскладка для разных кодировок разная, для ANSI (виндовс) начинается с #192-А и до #255-я (цыфры ничего не напоминают?). в дос с #128-А и дальше с разрывами.
перекодировка идет через драйвер / или не идет если драйвер "ascii" ANSI и кодовая страница соответсвующая.
...
ладно, хотел подробно описать, но кажется не смогу, долго. сразу резюме.
1 Если ты даеш символы в одной кодировке а UPPER делает для другой то попадаеш на символы псевдографики для которых нет значения UPPER.
2 BDE работает правильно.
3 вылечить нельзя, оно так живет. можно только правильно настроить.
4 выполни код
s:= "а";
Label1.Caption:= IntToStr(Ord(s[1]));
s:= AnsiUpperCase(s);
Label2.Caption:= IntToStr(Ord(s[1]));
s:= "я";
s1:= "Я";
if AnsiUpperCase(s) = s1 then Label3.Caption:= "Сошлось!"
else Label3.Caption:= "А пошли вы все!";

может и поймеш чего.


Serginio   (2003-01-05 14:57:00) [25]

Дело в том, что bdeшный Upper не правильно работает со всеми кодировками. И это касается
AnsiUpperCase(ч)=Ч<>ч Upper(ч)=ч
AnsiUpperCase(я)=Я<>џ Upper(я)=џ
И вообще это возможно вылечить


sniknik   (2002-12-30 18:54:00) [26]

DBASE.LangDriver сорру
"ascii" ANSI аналог ANCYRR


sniknik   (2002-12-30 18:51:00) [27]

а драйвер тот? и видел откуда руские буквы начинаются?

1 ODBC Driver Visual Foxpro - 1С таблици открывает правильно с рускими буквами //независимо от установок
2 Microsoft.Jet.OLEDB.4.0; dBase IV; 1С таблици открывает правильно если убрать индексы, если стоит
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase\DataCodePage = ANSI
3 BDE открывает 1С таблици с русскими если в BDE Administratore DBASE = ANCYRR


Serginio   (2002-12-30 18:18:00) [28]

Не перевалило. Цикл от 1 То 255


sniknik   (2002-12-30 17:59:00) [29]

Юлия сделай запрос вида
SELECT *, CHR(RecNo()+191) AS AddChar, RecNo()+191 AS NumChar FROM sc2222 //sc2222 - таблица из 1С
через ODBC Driver Visual Foxpro. удивишся //см. чтобы значение не перевалило через 255 не перевалило CHR ругатся будет.


Serginio   (2002-12-30 16:49:00) [30]

Создал таблицу с полем ID типа сhar заполнил его от 1 до 255 добавил индекс "UPPER(ID)" и с помощью Check(DbiExtractKey(hCur,@buf,PChar(TempStr))); получил значение ключа. Вот какие не соответствия получились. С права стоит бдеешный Upper
AnsiUpperCase(ѓ)=Ѓ<>ѓ
AnsiUpperCase(ђ)=Ђ<>ђ
AnsiUpperCase(ќ)=Ќ<>ќ
AnsiUpperCase(ћ)=Ћ<>ћ
AnsiUpperCase(џ)=Џ<>џ
AnsiUpperCase(ў)=Ў<>ў
AnsiUpperCase(і)=І<>і
AnsiUpperCase(ґ)=Ґ<>ґ
AnsiUpperCase(ё)=Ё<>ё
AnsiUpperCase(є)=Є<>є
AnsiUpperCase(ј)=Ј<>ј
AnsiUpperCase(ѕ)=Ѕ<>ѕ
AnsiUpperCase(ї)=Ї<>ї
AnsiUpperCase(ч)=Ч<>ч
AnsiUpperCase(я)=Я<>џ


sniknik   (2002-12-30 16:27:00) [31]

упс.

Serginio (30.12.02 16:24)
> Работаю с 1С таблицами.
нормально их ODBC Driver Visual Foxpro открывает. лутше через ADO, наверное и с BDE получится проверь.


Serginio   (2002-12-30 16:26:00) [32]

(Alexander_K) Спасибо просто ошибся- конечно использую как у тебя. Сейчас попробую вывести все несоответствия.


passm   (2002-12-30 16:25:00) [33]

Serginio (30.12.02 16:04)> Пардон, снова я :)
Помимо кодировки есть вот еще что:
Select * From xx Where descr=Upper("яблоко")
descr="Яблоко"
В запросе: "Яблоко" = "ЯБЛОКО"
Т. о.:
Select * From xx Where Upper(descr)=Upper("яблоко")


sniknik   (2002-12-30 16:25:00) [34]

Serginio (30.12.02 16:17)
> Или такая ситуация только у меня???

похоже, у меня полный список.
а если руками занести "dBASE RUS cp866"?

или DBASE используй только Lavel = 25 поставь, тоже фохпро.


Serginio   (2002-12-30 16:24:00) [35]

Работаю с 1С таблицами. Нужен Cirillic 1251.
И чтобы бдкшный Upper=AnsiUpperCase.


Alexander_K   (2002-12-30 16:22:00) [36]

А ты навсякий случай попробуй
Select * From xx Where Upper(descr)like Upper("яблоко")
или
Select * From xx Where Upper(descr) like Upper("%яблоко%")


Delirium^.Tremens   (2002-12-30 16:19:00) [37]


> Для FoxPro тольк -> Langdriver "ascii" ANSI.
> Еще какие предложения. Или такая ситуация только у меня???

dBASE RUS cp866


Serginio   (2002-12-30 16:17:00) [38]

Для FoxPro тольк -> Langdriver "ascii" ANSI.
Еще какие предложения. Или такая ситуация только у меня???


Serginio   (2002-12-30 16:13:00) [39]

Стоит "ascii" ANSI. Попробую Pdox ANSI Cyrillic


Delirium^.Tremens   (2002-12-30 16:09:00) [40]

P.S. Для случая DBASE - dBASE RUS cp866


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо