whenyoutoldme:高手进!VF的一个问题?

来源:百度文库 编辑:高校问答 时间:2024/05/08 01:52:00
我在VF的命令窗口里输入?"abc">"a"时主窗口显示的是.F.但是我只是把这个式子倒了一下,换成了?"a"<"abc",这时输出来的结果怎么变成了.T.难道说"abc">"a"和"a"<"abc"这两个式子不相同吗?但是在数学里这两个式子是绝对相等的啊?为什么在VF里就不相等了啊?请高手帮忙指点迷津下,谢谢啦!

排序次序准则
在选择排序次序时要考虑如下问题:

如果希望对国际化字符进行正确排序,应避免使用 Machine 排序次序。因为 Machine 排序次序按国际化字符的 ASCII 码顺序排序。例如,注意 Çar 是排在 straße 之后。

有注音符号的字符与没有注音符号的字符排序不同。例如,在“General”和“Spanish”排序次序中,注意 äa 排在 ab 之前,而 ab 排在 äb 之前。

连字如 ß ,按等价的分解字符来排序。例如 straße 与 Strasse 排序结果相同,而 Cæsar 与 Caesar 排序结果相同。

在某些语言中,两个字符做为一个字符排序。例如,在西班牙语中,Char 中的 Ch 作为 C 和 D 之间的一另个字母进行排序。
下面几节说明如何指定排序次序,检测当前排序次序及认识排序次序的影响。

指定排序次序
可以在如下的索引和排序操作中为字符型字段指定排序次序。

若要指定排序次序

在“工具”菜单中选择“选项”。

选择“数据”选项卡。

在“排序序列”框中,选择适当的排序次序。
要将此设置用于以后的 Visual FoxPro 操作,选择“设置为默认值”。

提示 也可以使用 SET COLLATE TO 命令或在 Config.fpw 文件中的 COLLATE 语句里指定排序次序。有关 Config.fpw 的详细内容,请参阅《安装指南》中的的第三章“配置 Visual FoxPro”。

当前的排序次序并不影响以前创建的索引。然而,它对比较结果和 SEEK、SELECT - SQL 等命令确有影响。有关详细内容,请参阅本章稍后的“认识排序次序的影响”。

可以在任何时刻更改排序次序。例如,在打开一个 customer 表后,可以创建索引标识来代表不同的排序次序,如下列代码所示。然后,只需使用不同的索引标识就可改变排序次序。

USE customer
SET COLLATE TO "GENERAL"
INDEX ON fname TAG mygeneral ADDITIVE
SET COLLATE TO "MACHINE"
INDEX ON custid TAG mymachine ADDITIVE
SET COLLATE TO "DUTCH"
INDEX ON lname TAG mydutch ADDITIVE

注释 索引的排序次序会覆盖当前的排序次序。

当前的代码页决定了哪种排序次序可供使用。当前的代码页不支持用 SET COLLATE 命令指定的排序次序,Visual FoxPro 会报告出错。另外,如果当前的代码页不支持在 Config.fpw 中指定的排序次序,那么将使用默认值“Machine”。

检查排序次序
可使用 SET ('COLLATE') 函数来确定当前的排序次序。例如,可保存当前的排序次序,将当前的排序次序设置为“Machine”,执行所需的任何工作,然后使用如下代码恢复原有的排序次序:

cCurrentOrder=SET('COLLATE')
SET COLLATE TO 'MACHINE'
*
* 需要 Machine 排序次序的代码
*
SET COLLATE TO cCurrentOrder && 返回到前一个排序次序

此外,可使用 IDXCOLLATE( ) 函数来决定索引和索引标识的排序次序。

认识排序次序的影响
排序次序对字符串比较、SEEK 及 SELECT - SQL 等命令的结果有影响,如下所述。

字符串比较
除“Machine”和“Unique Weight”排序次序外,其余排序次序都忽略大小写,这意味着在索引表达式中不一定要使用 UPPER( ) 函数。

当前的排序次序将影响字符串比较的结果。例如,当把排序次序设为“General”时,下面的表达式返回“真”(.T.):

?"A" = "a"
?"Straße"="Strasse"
?"æ"= "ae"

然而,当使用“Machine”排序次序时,所有这些语句返回“假”(.F.)。因为字符串是按照字节进行精确比较的。

字符串比较操作符 (==) 同于按值比较,或使用“Machine”排序次序(即按字节比较)进行的比较。例如,下面的语句返回“假”(.F.):

? "Straße" == "Strasse"

注释 当使用字符串比较操作符 (==) 时,Visual FoxPro 将忽略 SET EXACT 设置。

使用 SEEK
当在执行一个部分查找时,Visual FoxPro 将忽略注音符号。如果表达式长度小于关键字长度则发生部分查找。如果注音符号很重要,则应考虑使用 SCAN FOR ... ENDSCAN 或 LOCATE FOR ... CONTINUE,而不是 SEEK。

使用 SCAN 和 LOCATE 比使用 SEEK 有如下的优点:

SCAN 和 LOCATE 对注音符号敏感。

如果当前的排序次序为“Machine”或“Unique Weight”时,Visual FoxPro 对 SCAN 或 LOCATE 的结果进行全面优化,而对 SEEK 结果仅进行部分优化。

SCAN 和 LOCATE 能记录使用它们所需的条件,允许在条件循环重复时使用它们。相比之下,SEEK 将置于索引中的某个位置,然后 SKIP 从那一点继续搜寻。因此,使用国际化数据,SEEK 可能得不到需要的结果。

使用 SELECT - SQL
SELECT - SQL 命令使用当前的排序次序,如果拥有基于“General”排序次序的索引标识,并且当前的排序次序(由 SET ('COLLATE') 返回)为“Machine”,则 SELECT - SQL 的结果则基于“Machine”。

要使用当前排序次序,请使用 SELECT - SQL的 ORDER BY 子句。

使用索引
排序次序决定了索引表中记录的排序。在使用带排序次序的索引时请考虑如下规则:

如果想使用非“Machine”的排序次序,请重建早期 FoxPro 版本创建的索引。

重建 dBASE 索引,以便利用 Visual FoxPro 排序次序的优点。.

使用 REINDEX 命令来重建索引,因为 REINDEX 不会改变排序次序。

处理双字节字符集
Visual FoxPro 支持 DBCS(双字节字符集)— 用一个以上的字节代表一个字符的字符集。某些语言文字是双字节字符集,象简体中文、繁体中文、日文及韩文。

Visual FoxPro 支持 DBCS,这样就允许您创建国际化的应用程序。例如,如果您运行的是日语版本的 Windows,则可以用一个美语版的 Visual FoxPro 创建一个日语的应用程序。Visual FoxPro 的 DBCS 函数不仅可在日文字符集中正常的运行,而且支持日文排序序列。

注释 Visual FoxPro 为 DBCS 环境提供处理字符串的程序设计函数。有关详细内容,请参阅本章稍后的“在 DBCS 环境下处理字符串”。

使用 DBCS 字符命名对象
Visual FoxPro 允许您使用 DBCS 字符命名应用程序中的元素。一般在 Visual FoxPro 中,元素名称需要遵循以下约定:

最长不超过 254 个字节,其中可包含单字节字符和双字节字符。例如,如果全部使用双字节字符,那么最多可创建一个包含 127 个字符的名字。

以字母、数字、下划线或双字节字符开头。

只包含字母、数字、下划线或 DBCS 字符。

这些规则适用于变量、对象(窗口、菜单等等)、函数和过程名,类和子类名,别名及常量。也可以使用双字节字符命名文件。为避免文件名中的字符无意间被当成分隔符,将文件名放在引号内是最安全的。

注释 Visual FoxPro 中字串长度限制是以单字节字符数描述的。字段名、索引表达式、变量名、窗口名等使用双字节字符,可以显著地缩短名字的长度。例如,在自由表中一个字段名最多可以使用 10 个字节,所以一个字段名可以由 10 个单字节字符组成,但是只能有 5 个双字节字符。有关 Visual FoxPro 系统容量的详细内容,请参阅“Visual FoxPro 系统容量”。

排序 DBCS 数据
为了有助于在 DBCS 环境下排序信息,Visual FoxPro 支持简体中文、繁体中文、日文及韩文的排序序列。排序序列帮助您为每种文字正确排序表中的字符字段。

下表列出了 Visual FoxPro 排序序列的选项及其所对应的语言。

选项 语言
JAPANESE 日语
KOREAN 朝鲜语
PINYIN 简体中文
STROKE 简体与繁体中文

有关指定排序序列的详细内容,请参阅本章稍前的“指定排序次序”。

创建或修改程序
遵循如下规则,可以避免一些代码的本地化问题。

测试国际化版本
对于您的应用程序,确定 Visual FoxPro 正在运行何种语言非常重要,可以调用 VERSION( ) 函数。这样知道语言环境后,就可以帮助您确定显示何种文字,如何设置数据格式等等。例如,下面的代码确定了 Visual FoxPro 运行的语言环境,然后运行指定语言的表单:

IF VERSION(3) = 34 THEN
* Running in Spanish--display Spanish form
DO FORM CST_SPN.SCX
ELSE
* Display English form
DO FORM CST_ENU.SCX
ENDIF

注释 只有 Visual FoxPro 3.0b 以上的版本支持双字节字符串。如果应用程序依赖于 DBCS 功能,应该调用 VERSION(1) 函数查看 Visual FoxPro 版本号。

使用字符串
在代码中直接使用字符串会使本地化十分困难。例如,在代码中,不要把日期和货币标志包括在字符串中。如果可能,使代码从不同于源程序的文件或表中检索字符串。

注释 当把所有的字符串移出源程序时,代码的运行效率会受到影响。例如,程序如果需要在一个循环内查找字符串,移出字符串后程序的性能就会降低。

对于将要转换的应用程序,处理字符串的一种方法是在整个应用程序中使用字符串常量。可以在一个单独的文本文件中定义有关这些常量的文本,程序可以使用 #INCLUDE 预处理器引用这个文件。例如,可以使用 ERR_FILE_NOT_FOUND 常量,而不是嵌入“没有找到文件。”错误信息。这个常量的文本在名为 ERR_TEXT.H 的文件中。使用这种技术的程序可以如下所示:

#INCLUDE ERR_TEXT.H

* processing here

IF ERR THEN
MESSAGEBOX( ERR_FILE_NOT_FOUND )
ENDIF

本地化