![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Бдешный Upper( Я )<>Upper( я ) [dBase, FoxPro]
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