C-dBASEⅢ SET FILTER TO的使用

Author: 河北 王文会 Date: 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'即可使程序正确运行。
        (河北  王文会)