C-dBASEⅢ SET FILTER TO的使用 河北 王文会 1994-12-16 在一定范围内对数据库中的记录进行操作,可以利用FOR来指定命令的有效范围。在同一范围内进行多种数据操作时,利用过滤条件过滤后再进行各种操作,不必每次都使用FOR来指定范围,使用起来具有明显的优点。但是,C-dBASEⅢ中,SET FILTER TO命令有一个缺陷,如果在使用中不加注意,尤其是在命令文件中使用有时会出现差错。 C-dBASEⅢ中,SET FILTER TO命令执行后,并不改变当记录指针,因此当前记录不一定是满足过滤条件的第一个记录。 例如:有一工资数据库GZ.DBF USE GZ BROW FIELDS编号,姓名,单位,职务工资 编号 姓名 单位 职务工次 A001 刘军 A 110.00 A002 陈成 A 120.00 A003 赵卫国 A 100.00 B001 张强 B 100.00 B002 李新 B 90.00 B003 王刚 B 130.00 SET FILTER TO 单位=‘B' BROW FIELDS编号,姓名,单位,职务工资 A001 刘军 A 110.00 B001 张强 B 100.00 B002 李新 B 90.00 B003 王刚 B 130.00 对当前记录进行操作的命令,会出现将不满足条件的记录也进行操作的情况。如果在命令文件中遇到这种情况时,运算结果将会出现差错。 例如,将上面工资 数据库中的数据按单位输出,利用下面程序输出“B单位时即会出错。 …… USE GZ @5,10 SAY'请输入单位:'GET DW READ SET FILTER TO 单位='&DW' SET DEVICE TO PRINT DO WHILE .NOT.EOF() @PROW()+1,5 SAY编号+姓名+STR(职务工资,6,2) SKIP ENDDO …… 为了避免这种情况的出现,可以先进行记录定位,将记录指针指向满足条件的第一条记录,然后再利用过滤条件进行过滤,这样即可克服过滤条件不改变当前记录指针的缺陷。 如在上面程序中的过滤条件前加一条语句: LOCA FOR单位='&DW'即可使程序正确运行。 (河北 王文会)