180 likes | 364 Views
第 7 章 记录的定位与查询. 7.1 记录的定位概念 无条件记录定位 :goto skip 有条件记录定位 : 直接(顺序)定位和索引(快速)定位 定位命令仅仅是对记录指针进行定位的一种操作,它并不能显示定位的记录内容。如要显示,则需要使用并且只能使用 Display 命令。. 7.2 顺序 ( 直接 ) 定位 所谓顺序定位是指在表中从第一条记录开始,按照顺序搜索表,把记录指针定位在满足条件的 第一条 记录上。 顺序定位适合于 复杂条件 或 小型表 的定位。 命令格式 : 1) 找首条:
E N D
7.1 记录的定位概念 无条件记录定位:goto skip 有条件记录定位:直接(顺序)定位和索引(快速)定位 定位命令仅仅是对记录指针进行定位的一种操作,它并不能显示定位的记录内容。如要显示,则需要使用并且只能使用Display命令。
7.2 顺序(直接)定位 所谓顺序定位是指在表中从第一条记录开始,按照顺序搜索表,把记录指针定位在满足条件的第一条记录上。 顺序定位适合于复杂条件或小型表的定位。 命令格式: 1)找首条: Locate For <条件表达式> [范围] 2)找后续(继续查询): Continue &&按照Locate指定的条件继续定位下一条记录
参数说明: ◆ Locate是直接在表文件(不需要对表进行排序或索引)中,按照[范围]、For<条件表达式>从表文件的头至尾顺序来定位符合条件的第一条记录。如果存在多条满足For<条件表达式>的记录,可以使用Continue命令继续定位下一条记录。 ◆ Continue命令的作用是从当前相匹配记录的下一条记录位置开始,继续执行由Locate命令指定的范围、满足条件的下一条记录的定位操作。Continue只能和Locate配套使用,不能单独使用。
◆ 如果Locate命令定位成功,即在当前表中找到了一条与条件相匹配的记录,就将记录指针指向该条记录。这时,Found()函数返回逻辑真.T.,Eof()函数返回逻辑假.F.。Recno()函数返回相匹配记录的记录号。 如果Locate命令定位不成功,即在当前表中没有找到任何一条与条件相匹配的记录,则Found()函数返回逻辑假.F.,Eof()函数返回逻辑真.T,Recno()函数返回Recc()+1的值。 ◆ Locate 命令支持模糊查询,也就是说,只要知道查询数据的部分内容时(主要指字符型数据)就可以进行查询,实现模糊查询要用到包含函数$。
例:在学生挡案表.Dbf表中,定位显示班级为“99212”并 且籍贯为“浙江”的记录。 Use 学生挡案表 Locate For 班级=”99212”.And.籍贯=”浙江” Display &&显示第一条满足条件的记录 ? Found() &&返回逻辑真.T. ? Eof() &&返回逻辑假.F Continue Display &&无记录显示 ? Found() &&返回逻辑假.F. ? Eof() &&返回逻辑真.T Use
例:在学生挡案表.Dbf表中,定位计算机系99级或98级并且年龄小于20的学生。注:学号的第一、二位表示年级,第三位为“2”的表示计算机系。例:在学生挡案表.Dbf表中,定位计算机系99级或98级并且年龄小于20的学生。注:学号的第一、二位表示年级,第三位为“2”的表示计算机系。 Use 学生挡案表 Locate For (Subs(学号,1,3)=”992” .Or. Subs(学号,1,3)=”982”).And.年龄<20 ?Found() &&如Found()函数为.T. ?Eof() && Eof()的结果是什么? Display &&是否有记录显示? Continue &&继续定位下一个记录,如果不用 Continue而用Locate For (Subs(学号,1,3)=”992”.Or.Subs(学号,1,3)=”982”).And.年龄<23,其结果会如何? ?Found() && Found()函数为.F说明什么? ?Eof() && Eof()的结果是什么?
例: 在学生挡案表.Dbf表中,查找姓“王”的学生。 Use 学生挡案表 Locate For Subs(姓名,1,2)=”王” &&如果用Locate For "王"$姓名可能会产生什么问题? Display &&显示查询结果 Continue &&继续定位查询下一个记录 ?Found() && Found()函数为.T. Display &&显示第二条”王”姓记录 Continue &&“End Of Locate Scope”显示定位结束 ?Eof() && Eof())函数为.T.
7.3 索引定位 索引定位是一种快速定位记录的方法,利用索引定位将明显提高查询效率,适用于大型表的查询。 它要求数据表文件的记录是有序的,所以,事先必须对数据表文件进行索引,而且要求查询内容所在的字段或表达式必须是索引文件的索引关键字段或表达式。 (查什么按什么索引)
索引定位有两种命令格式: 格式一:Seek <表达式> 格式二:Find <表达式> 1.FIND命令 (1) 命令方式 命令格式: FIND <字符串>/<数值> 功能: 在打开的以查询内容所在字段为索引关键字的索引文件中,快速查找关键字段等于<字符串>或<数值>的第一个记录。
说明: ① 执行命令前,必须首先建立以查询内容所在字段或表达式为索引关键字的索引文件,若已存在则打开该索引文件,且将其设置为主索引。 ② FIND命令通常适用于字符数据类型及数值型,字符串中的字符可以不用定界符。 ④ 可以用内存变量代替字符串作为查找的数据,但必须用宏代换函数(&)。 ⑤ 如果查找成功,则把记录指针指向逻辑顺序中第一条符合条件的记录,且FOUND()函数的值为.T.,否则,记录指针指向文件未尾,FOUND()函数的值为.F.。
例题: 例题1:在学生档案中,用FIND命令查找学号为“9832101”的学生。 USE 学生档案表 index on 学号 to xh FIND 9832101 DISPLAY 例题2.在学生档案表.DBF数据表文件中,以变量的形式,用FIND命令查找姓名为 “刘丽红”的学生(以姓名为索引关键字的索引文件XM.IDX已建立)。
2.SEEK命令 FIND命令不能对日期型和逻辑型的数据进行查找,在某些情况下使用起来不方便,为此,系统中又提供了功能更强的SEEK命令。 格式:SEEK <表达式> 功能:在打开的以查询内容所在字段为索引关键字的索引文件中,快速查找关键字段等于<表达式>值的第一个记录。
其中: (1)SEEK命令适用于一切数据类型(C、N、D、L),表达式可以是常量、变量和函数所组成,但必须与索引表达式一致。表达式为C、D、L(.T.,.F.)常量时,必须使用相应的定界符,如:“ ”、{ }。 (2)表达式为变量时,要直接使用,不需要用宏代换函数。 (3)如果查找成功,则把记录指针指向逻辑顺序中第一条符合条件的记录,且FOUND()函数的值为.T.,否则,记录指针指向文件未尾,FOUND()函数的值为.F.。
例题3:在学生档案XSDA.DBF数据表文件中,用SEEK命令查找学号为“9921201”的学生(以学号为索引关键字的索引文件XH.IDX已建立)。例题3:在学生档案XSDA.DBF数据表文件中,用SEEK命令查找学号为“9921201”的学生(以学号为索引关键字的索引文件XH.IDX已建立)。 USE xsda INDEX xh &&打开以学号为索引关键字的索引文件XH.IDX SEEK “9921201” &&必须使用定界符 DISPLAY
例题4.在学生档案表.DBF数据表文件中,以变量的形式,用SEEK命令查找姓名为“刘丽红”的学生(以姓名为索引关键字的索引文件XM.IDX已建立)。例题4.在学生档案表.DBF数据表文件中,以变量的形式,用SEEK命令查找姓名为“刘丽红”的学生(以姓名为索引关键字的索引文件XM.IDX已建立)。 USE 学生档案表 INDEX xm STORE “刘丽红” TO a1 SEEK a1 &&不需使用宏代换函数 DISPLAY 例题5.在学生档案XSDA.DBF数据表文件中,以常量的方式查找班级为“98321”、籍贯为“浙江”的学生。
小结: • LOCATE和SEEK、FIND都是用于在数据表文件中查询 • 定位记录指针,即把记录指针定位在满足条件的记录 • 上。特别强调:仅仅是定位记录指针。如要显示定位的 • 记录内容,则需要用DISPLAY命令。 • (2) LOCATE和SEEK、FIND的不同之处: • ① LOCATE是顺序查询定位,可以直接利用原数据表进行 • 定位操作,而SEEK、FIND命令是索引查询定位,必须 • 首先对原数据表按定位数据所在字段或表达式进行索 • 引,建立相应的索引文件或打开相应的索引文件、索引 • 标识的前提下才能进行定位操作。 • ② LOCATE和CONTINUE相配合可以连续查询定位多条记 • 录,而SEEK、FIND只能查询定位单条记录。 • ③ LOCATE是用条件表达式的形式来定位,而SEEK、 • FIND是用常量、变量或变量组成的表达式的形式来定位。
(3) SEEK和FIND的不同之处: ①SEEK命令适用于一切数据类型(C、N、D、L),但若为C、D、L常量时,必须使用相应的定界符,如:“ ”、{ }、‘ ’。表达式为变量时,要直接使用,不需要用宏代换函数。 ② FIND命令通常适用于字符数据类型,不可用于日期型和逻辑型数据类型。表达式为字符常量时,不须使用相应的定界符。表达式为变量时,不可直接使用,必须使用宏代换函数。