3.3.1 记录的输入P71⒊使用INSERT-SQL命令追加记录⒋使用APPEND与APPEND FROM命令追加记录APPEND BLANK,可以追加新记录。
⒊使用INSERT-SQL命令追加记录在程序中向一张表中追加记录,通常使用INSERT-SQL命令。
命令格式如下。
INSERT INTO TableName[(FieldName1 [,FieldName2, … …])\] VALUES (eExpression1[,eExpression2, … …])例如:可以用以下命令向XS表中插入一条新记录:INSERT INTO XS(xh,xm,xb,ximing) VALUES ("950106","高山","男","")⒋使用APPEND与APPEND FROM命令追加记录APPEND [BLANK] [IN nWorkArea| cTableAlias]其中,BLANK用于说明向表中追加一条空记录,缺省时系统向表中追加一条空记录,并打开浏览窗口以便用户输入该记录的数据。
当表处于浏览状态时,利用―表/追加记录‖,选中数据来源的文件后,即可追加数据。
常用的可追加的文件类型有表文件.dbf、文本文件.txt(DELIMIED)和Excel文件.xls。
使用APPEND FROM 命令从其他文件中导入数据。
APPEND FROM FileName [DLIMITED|XLS]3.3.3 记录的定位当用户向表中输入数据时,VFP为每个记录都按输入顺序指定了‖记录号―。
第一个输入的记录,其记录号为1,依次类推。
⒈`记录指针当一个表文件被打开后,系统中自动生成三个控制标志:记录的开始标志、记录指针标志、记录的结束标志,如图。
记录的开始标志介于表结构和记录之间,前面是表结构,后面是第一条记录。
记录指针用于指示当前处理的记录位置,记录指针指向的那个记录称为当前记录。
记录的结束标志是整个表记录结束的标志。
记录指针是一个非常重要的概念。
它是VFP 系统内部的一个指示器,可以将记录指针理解为保存当前记录号的变量。
每当打开一个表文件时,记录指针总是指向第一条记录。
在进行数据处理时,经常要移动记录指针,使记录指针指向用户所需要操作的那个记录,这个过程即是记录的定位。
测试当前记录指针的值可用函数RECNO()进行测试。
也可以从VFP主窗口的状态栏上看出记录指针的值。
在处理记录的过程中,记录指针会不停地移动。
记录指针是否指在记录的有效范围内,可以BOF()函数和EOF()函数进行测试。
当记录指针指向记录的开始标志时,BOF()函数值为.T.,否则为.F.。
当记录指针指向记录结束标志时,EOF ()函数的值为.T.,否则为.F.。
表3-2列出了一张表被打开后,未作记录移动操作时RECNO()、BOF()和EOF ()函数的值。
记录指针的初始值总是1,不可能为0或负数。
⒉记录的定位记录的定位即记录指针的定位。
定位方式可分为记录指针的绝对定位、记录指针的相对定位、条件定位。
指针的绝对定位是指把指针移动到指定位置;相对定位是指把指针从当前位置开始,相对于当前记录向前或向后移动若干条记录的位置;条件定位是指按照一定的条件自动地在整张表中查找符合该条件的记录,找到则将指针定位在该记录上,找不到,则定位到整张表的末尾EOF()。
⑵使用命令进行记录定位对于在当前工作区打开的表,用户可以使用GOTO命令进行记录的绝对定位,使用SKIP 命令进行记录的相对定位,使用LOCATE命令进行条件定位。
命令格式:GOTO nRecordNumber [IN nWorkArea| IN cTableAlias]|TOP|BOTTOMSKIP [nRcords][IN nWorkArea|cTableAlias]LOCATE FOR lExpression[Scope]其中nRecordNumber必须在表记录的有效范围内;TOP指第一条记录;BOTTOM 指最后那条记录;记录数nRecord指记录指针需要移动的记录个数,缺省时为1。
条件表达式lExpression用于表示记录的定位条件;范围Scope指进行条件的范围。
例:13下列命令是记录定位的示例CLOSE TABLES ALLUSE XSGOTO 4GOTO TOPSKIP 4SKIP -2LOCATE FOR XM="李刚"在使用命令定位时,需注意:P774-1①如果从第一个记录向上移动一个记录,指针将指向记录起始标志,BOF()函数将返回(.T.),RECNO()函数返回值为1。
如果再执行SKIP –1命令,系统将显示出错信息:已到文件头。
此时,记录指针仍然指向记录起始标志。
⒉使用命令修改记录修改记录字段的命令有两个:UPDATE-SQL命令和REPLACE命令。
这两个命令都能对表中一个或多个字段的一个或多个记录进行修改,都是适用于编程方式。
UPDATE-SQL命令UPDATE-SQL命令的语法格式:UPDATE 表名SET 字段名1 =表达式1[,字段名2;= 表达式2 ...] WHERE 条件表达式参数:表名——指定要更新记录的表。
字段名1=表达式1 [,字段名2=表达式2 ...]——指定要更新的列以及这些列的新值。
WHERE 条件表达式——指定要更新的记录,缺省时表示所有记录。
用该命令更新表时,被更新的表不必事先打开。
REPLACE命令需注意:使用该命令时表必须事先打开。
REPLACE命令命令的语法格式:REPLACE FieldName1 with eExpression1 [ADDITIVE] [,FieldName2 witheEpression2 [ADDITIVE] … …[Scope] [FOR lExpression]其中字段名FieldName与表达式eExpression用于指定要更新的字段以及这些字段的新值;ADDITIVE仅对备注型字段有效,使用时表示替换的内容追加到原备注中,否则替换原内容;FOR子句和范围Scope用于指定要更新的记录,当均缺省时表示仅对当前记录。
执行该命令后,记录指针位于指定范围的结尾。
例子例14,将JS表中所有工龄满30年(假如不考虑月日)的教师的基本工资加100UPDATE JS SET jbgz=js.jbgz+100 WHEREyear(date())-year(gzrq)>29例15CLOSE TABLES ALLUSE JSREPLACE JBGZ WITH JBGZ+100 FOR YEAR(DATE()) - YEAR(GZRQ())>29 3.3.5 记录的删除P78⒉采用命令方式用DELETE或DELETE-SQL命令标记要删除的记录,它们的区别在于前者只能对已打开的表进行操作,后者无需事先打开表。
DELETE命令的基本语法格式:DELETE [Scope][for lExpression] [IN nWorkAlias|cTableAlias]范围、条件、工作区或表别名CLOSE TABLES ALLUSE JSDELETE FOR (DATE()-CSRQ)/365>60 ⒉采用命令方式用DELETE或DELETE-SQL命令标记要删除的记录语法:DELETE FROM 表名[WHERE 过滤条件表达式]参数:FROM 表名——指定要删除记录的表。
[WHERE 过滤条件表达式]——指定只给满足条件的记录做删除标记。
例如,要删除教师表中年龄在60岁以上的记录的命令是:DELETE FROM js WHERE year(date())-year(js.csrq)>60⒉恢复带删除标记的记录如果表的浏览窗口处于打开状态,可以在浏览窗口中单击一下带删除标记记录的小方框,小方框将由黑变白,这样就恢复了这个记录。
同样也可以有选择地恢复一组记录。
从―表‖菜单中选择―恢复记录‖,然后输入恢复条件。
使用RECALL命令恢复带删除标记的记录语法:RECALL [范围] [FOR 条件表达式1] [WHILE 条件表达式2]例如:RECALL &&恢复当前记录RECALL ALL &&恢复所有记录RECALL ALL FOR xb=‖男‖&&恢复所有性别为―男‖的记录⒊彻底删除记录P80被设置了删除标记的记录,可以被彻底删除或被恢复。
如果表的浏览窗口处于打开状态,可从―表‖菜单中选择―彻底删除‖,这个过程将删除已有标记过的记录,并重新构造表中余下的记录。
经过这一步之后,被删除的记录不能再被恢复。
PACK命令具有与菜单同样的功能。
如果要删除一个表的所有记录,只留下表结构,可使用ZAP命令。
ZAP 不管记录是否带删除标记,一概彻底删除。
所以在实际使用中应慎用此命令。
PACK 命令与ZAP命令都需要以独占方式使用表。
3.3.6 数据的复制P80利用COPY TO 命令可以将表(在当前工作区中已经打开)中的数据复制到其他表文件或其他类型的文件中。
COPY TO 命令的常用格式:COPY TO FileName[FIELDS Fieldlist][Scope] [FOR lExpression] [[TYPE] SDF|XLS|DELIMITED[WITHDelimiter|WITH BLANK|WITH TAB|WITH CHARACTER Delimiter]] p81Copy to xs01 for xb='女'COPY TO XS02 FIELDS XH,XM SDF &&XS02.TXT仅包含XH与XMCOPY TO XS03 XLS &&生成一个XS03.xls文件3.3.7 数据的统计利用COUNT、SUM和AVERAGE命令可以对表数据进行统计。
其中,COUNT命令用于统计记录数,SUM命令用于统计某数值型字段的值的总和,AVERAGE命令用于统计某数值型字段的值的平均值。
这些命令的常用语法格式如下:COUNT [Scope] [FOR lExpression][TOVarName] SUM [nExpression][Scope][FOR lExpression][TO VarName]AVERAGE [nExpression][Scope][FOR lExpression] [TO VarName]例子:CLOSE TABLES ALLUSE cjCount for cj<60 to A1 &&统计60分以下的人数,并将结果保存在变量A1中SUM CJ TO A2 FOR cj<60 &&统计60分以下的总分,并将结果保存在变量A2中AVERAGE cj TO A3 &&统计平均分,并将结果保存在变量A3中。