4747
|
|
|
CODE PAGE & COLLATION SEQUENCE |
- Желаете Вы этого или нет, текущая CP
устанавливается, и Вы можете видеть какой именно
она установилась, используя функцию CPCURRENT()
[CPCURRENT(1) - основная у OS, CPCURRENT(2) - альтернативная у
OS]. А как она устанавливается?
- CP устанавливается при загрузки самой FPD/VFP и
берётся у OS, или из файла Config.fp(w) либо
непосредственно из exe / в текущем каталоге проги /
указанном через параметр для Config.fp(w). Факт только
в том, что она какой-то, так ил иначе,
устанавливается.
- Повторю, что текущая установка CP может быть
проверена через функцию CPCURRENT() [и для нас,
Русских, основная - Windows - 1251, альтернативная - DOS -
866]
- На всякий случай проверьте ?SET('CPCOMPILE') и см. также: SET CPCOMPILE TO ..., COMPILE ... AS ...
- При чтении любого dbf-основанного файла из его
заголовка вычитывается его CP, т.е. та, в которой
якобы хранятся данные в файле.
- Если CP-файла != CPCURRENT() - производится неявное
преобразование, как я понимаю, ещё при чтении из
буфера файла в память.
- Если CP-файла == CPCURRENT() - очевидно, что никаких
преобразований не делается. Очевидно, что в этом
случае время на преобразования не теряется.
- Отдельно для полей файла Вы можете отменить эти
неявные преобразования, используя SET NOCPTRANS TO
[FieldName1[,FieldName2...]] или определив тип Character(Binary)/Memo(Binary)
- Нужно отметить, что если у файла CP не
установлена, т.е. 0, то преобразования в 1251 (т.е. для
нас, Русских текущую) будут выполняться
некорректно, что можно наблюдать, например, при
попытке вставить в библиотеки (с не
установленной CP) русские буквы. Или просто, при
открытии любого FPD-dbf-файла с CP=0 в SHARED режиме из
Browse под VFP.
- Наконец, если файл открывается в EXCLUSIVE-режиме, и
CP файла = 0, и SET CPDIALOG ON, - то возникает CODE PAGE - диалог,
для установки кодовой страницы, якобы в которой
прописаны данные [если б точно знать:-)] (отдельно
этот диалог может быть вызван функцией GETCP()).
- Ну и конечно, Вы всегда можете использовать
функцию CPCONVERT() для явного преобразования строк
(что, кстати некстати :-() приходится делать в VFP,
читая FPD-dbf-файлы, у которых по тем или иным
причинам не установлена CP).
- Во-первых, в случае попытки открытия
dbf-основанного файла с не установленной CP в
EXCLUSIVE-режиме и при SET CPDIALOG ON
- Во-вторых, явно, используя утилиту \Tools\Cpzero\Cpzero.prg
с синтаксисом: DO ("<FullPath>Cpzero.prg") WITH
"<FullPath>MyFile", <nNewCP>
- Ну и, в-третьих, непосредственно при создании
файла, - при этом CP берётся из CPCURRENT()
- Во-первых, через пункт меню Tools\Options...[Data] Collation
Seqience +[Set As Default] (прописывается в системный реестр)
- Во-вторых, в Config.fp(w). Например, COLLATE="RUSSIAN" см.
также Замечания по поводу CODE PAGE,
Установка
- Ну и, в-третьих, явно из кода. Например, SET COLLATE TO
"RUSSIAN" для текущей DataSession.
- Значение Collation Seqience прописывается в свойство
tag-ов CDX-файлов на момент их создания/изменения
(берётся из SET('COLLATE') в текущей DataSession)
- Проверить Collation Seqience индекса можно функцией
IDXCOLLATE()
- Нужно отметить, что переустановка SET COLLATE TO
<Something> не влияет на уже созданные индексы
- Collation Seqience обеспечивает корректную
последовательность символов в операциях
индексации и сортировки данных.
-
- "MACHINE"- обеспечивает совместимость с
Xbase-последовательностями,
- "GENERAL" - для US и Западной Европы в более
ранних чем 2.5 версиях нужно было явно
использовать UPPER()/LOWER(), в более поздних
преобразования в UPPER() осуществляется
автоматически [последнее справедливо и для
"RUSSIAN" :-(]
-
- При выполнении SQL-SELECT, в случае создания
временного индекса для оптимизации запроса, VFP
имеет ошибку :-( Вот комментарий Майка по этому
поводу:
... Сколь я помню, это появилось в каком-то VFP3[ab],
потом _это_ пофиксили, потом это опять появилось в
каком-то VFP5 и ...
УРА! Пофиксили по-тихому в VFP6 SP5!
А В VFP7 _этого_ с самого начала не было...
Mike Korneev
см. Тестовый пример от Mike
демонстрации ошибки.
Как сказано выше, только путём изменения
индекса, при этом Collation Seqience берётся из SET('COLLATE')
текущей DataSession
**** start of any.prg
if cpcur()!=1251
activate screen
clear
? 'Please set in CONFIG.FPW'
? ' CodePage=1251'
?? chr(7)
return
endif
CLOSE DATA ALL
=CreateData()
set collate to 'Russian'
=RunQuery()
set collate to 'Machine'
=RunQuery()
move window (wontop()) by 0,20
*************
function RunQuery
select * from tbl1 where TblID not in (select TblID from tbl2) ;
into cursor ('Collate_'+set('collate'))
browse nowait
***********
function CreateData
close data
create cursor tbl1 (TblID I)
create cursor tbl2 (TblID I)
for i=1 TO 1000
insert into tbl1 values (i)
insert into tbl2 values (i)
endfor
**** end of any.prg
см. также в MSDN:
- Q129631 "Understanding Code Pages in Visual FoxPro"
- Q181085 "BUG: SET COLLATE & Queries - Additional Problem Scenarios"
В начало
Для версий VFP 5.0 и ниже, а также для Microsoft Visual FoxPro ODBC Driver, требуется наличие
файла FoxPro.int (Code page and collation sequence file) в Windows\System[32]
См. также:
Q141913 PRB: Error 1915 - Collating Sequence "" is not found
Q138614 Description of Foxpro.int Table
Q150502 PRB: Collating Sequences Not Displayed in the Setup Dialog
http://msdn.microsoft.com/vfoxpro/downloads/download.asp?ID=027 - Visual
FoxPro 6.0 ODBC Driver FoxPro.int Resource File
Индекс, Советы начинающим, Владимир Максимов.
Удаление записей в таблице, Советы начинающим, Владимир Максимов.