2013-1VFP第11部分(索引、查询统计及扫描循环).ppt_第1页
2013-1VFP第11部分(索引、查询统计及扫描循环).ppt_第2页
2013-1VFP第11部分(索引、查询统计及扫描循环).ppt_第3页
2013-1VFP第11部分(索引、查询统计及扫描循环).ppt_第4页
2013-1VFP第11部分(索引、查询统计及扫描循环).ppt_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Visual Foxpro 6.0,程序设计基础,要点: 1. 掌握索引排序 2. 了解多工作区操作 3. 掌握表中的数据查询 4.掌握表中的数据统计 5.掌握数据表中的扫描循环,第十一讲 数据表的查询统计,数据表的索引,索引是按索引关键字表达式的值使数据表中的记录有序排列的一种技术,在Visual FoxPro系统中是借助于索引文件实现的。,1、什么是索引,索引关键字的值、记录号,(教科书P132),按成绩降序排列,索引文件,Visual FoxPro系统提供了四种不同的索引类型,它们分别是:,2、索引的类型,主索引:仅适用于数据库表,不允许关键字段有重复值,一个数据表只能建一个主索引。 候

2、选索引:不允许索引关键字段有重复值 普通索引:最常用的索引类型,无任何限制 唯一索引:允许索引关键字段有重复值,3、索引文件的类型,(1)结构化复合索引文件 结构化复合索引文件(.cdx)可以在同一个文件中包含多个索引,其中每个索引称为索引标识。,更重要的是,对于结构复合索引,无论何时打开表文件,该索引都会自动打开。 其文件名与表名相同,一个表文件只产生一个结构化复合索引文件。,(2)独立复合索引文件(略),(3)单索引文件(略) 单索引文件是每个索引存放在一个独立的文件(.idx)中。,4、索引的建立,(教科书P133-134),Index on tag ascending|descendi

3、ng ,结构化复合索引文件的建立 (命令方式),特别注意: 建立索引时,当涉及到两个或两个以上的不同类型的字段时: 1)顺序若相同,则将非字符型转换为字符型,然后用“+”连接成一个字符表达式。,学号(c) 入学总分(n) 出生日期(d),Index on 学号+str(入学总分,5,1)+dtoc(出生日期,1) tag x1,学号(c) 入学总分(n) 出生日期(d),Index on 学号+str(入学总分,5,1)+dtoc(出生日期,1) tag x1 desc,2)顺序若不同,则以字符型字段的顺序为准,若数字型字段的顺序与字符型不同,则用一个较大数减去该字段,再转化为字符型;若日期型

4、字段的顺序与字符型不同,则用一个较大的日期减去该字段,再转化为字符型,然后用“+”连接成一个字符表达式。,学号(c) 入学总分(n) 出生日期(d),Index on 学号+str(1000-入学总分,5,1)+dtoc(出生日期,1) tag x1,学号(c) 入学总分(n) 出生日期(d),Index on 学号+str(入学总分,5,1)+str(date()-出生日期) tag x1 desc,5、索引的使用,一个表文件可以建立多个索引,在操作中可以同时打开多个索引,但是任何时候只有一个索引起作用。 索引依赖于表文件而存在,它随表的关闭而自动关闭。,当前起作用的索引标识称为主控索引。

5、要使用索引必须满足以下条件: 打开表; 确定主控索引;,set order to tag ,(1)确定主控索引,命令格式:,(教科书P136-137),(2)删除索引,delete tag all | ,(3)索引更新,使用索引文件后,虽然表中各记录的物理顺序并未改变。但记录指针不再按物理顺序移动,而是按主控索引文件中记录的逻辑顺序移动,于是整个表中的记录是按索引关键表达式值排序的效果。 使用索引文件时,还要特别注意以下几点: (1)在使用GO命令时,GO 使记录指针指向具体的物理记录号,而与索引无关,而GO TOP|BOTTOM将使记录指针指向逻辑首或逻辑尾记录,这时GO TOP不再等同于G

6、O 1。 (2)SKIP命令按逻辑顺序移动记录指针。 (3)表被打开后,记录指针位于TOP位置。,多工作区操作,若要使用多个表,就要使用多个工作区。一个工作区是一个编号区域,它标识一个已打开的表。在应用程序中通常通过使用工作区号和工作区别名来标识。,(教科书P138-139),1、工作区号 Visual foxPro提供了32767个工作区,编号从1到32767。 每个工作区只允许打开一个表,一个表只能在一个工作区打开,系统默认的工作区为1号工作区。,2、别名 (1)前十个工作区除了可用110来标识外,还可用AJ来表示工作区的别名。 (2)定义别名,use alias ,格式:,3、选择当前工

7、作区,select |,如没有给表定义别名,则可以用数据表名作为别名。,sele 0 表示选定当前未使用的最小号工作区。,use in |,不改变当前工作区,引用非当前工作区表的字段必须冠以别名,引用格式为: 别名.字段名 别名-字段名,bof():文件开始的测试函数 eof():文件结束的测试函数 recno():返回当前记录号 select():返回当前工作区区号,4、工作区常用函数,建立表间的关联关系(临时关系),要在两个或两个以上的表之间进行数据操作时,通常有关联和连接两种方法。,1、关联的概念 每个工作区打开的表中都存在一个记录指针,指针指向的记录是当前记录,如果表之间没有关系,则各

8、个表的记录指针相互独立,即当前工作区指针移动时,其他工作区的指针不移动。,所谓关联,就是让不同工作区数据表的记录指针建立一种临时的联动关系。使一个表的记录指针移动时,能带动另一个表的记录指针按一定的条件作相应地移动。前者称为关联表(主动表、父表),后者称为被关联表(被动表、子表),建立表间的关联 建立数据库文件中表间关联, 一是要保证建立关系的表具有相同的字段值(关键字值); 二是子表要以该字段建立索引。,建立两个表之间的“一对一”和“多对一”关联的步骤: 找到两个表中能够建立关联的字段(字段名可以不同,类型、宽度、小数位数必须相同) 根据关键字值确定父表,再确定子表; 选择一个工作区,打开子

9、表,建立索引; 选择另一个工作区,打开父表建立关联。,有重复值为父表,set rela to into , into additive,说明:发出关联命令所在工作区的表是父表,建立关联的命令,(教科书P139),子表必须对关联字段索引 是关联的关键字 不同名的字段只要类型和数值相同也可建立关联。 关联后,父表指针移动带动子表指针移动;而如果当前工作区是子表,其指针移动,父表指针不会移动。,additive 一般用于三个或三个以上的表之间建立多重关联,第2、3个关联使用该选项。 关联后,当前工作区字段名可以直接使用,子表的字段在使用时要加“别名.字段名”。 set rela to recn()+

10、N into 把记录号作关键字建立关联。(例子见后) 关闭或重新打开数据表,关联就会消失。(故称为临时关系),BB AA(利用记录号建关联),Recno()+2,Sele 1 Use AA Sele 2 Use BB Set rela to Recno()+2 into A(或 AA或1),BB AA (利用关键字相等建关联),Sele 1 Use AA inde on 字段 tag zd Sele 2 Use BB Set rela to 字段 into A(或 AA或1),字段,AA BB CC 或 AA BB AA CC,字段1,字段2,字段1,字段2,Sele 1 Use CC ind

11、e on 字段2 tag zd Sele 2 Use BB Set rela to 字段2 into A(或 CC或1) inde on 字段1 tag zd Sele 3 Use AA Set rela to 字段1 into B(或 BB或2)ADDI,Sele 1 Use CC inde on 字段1 tag zd Sele 2 Use BB inde on 字段2 tag zd Sele 3 Use AA Set rela to 字段1 into A(或 CC或1) Set rela to 字段2 into B(或 BB或2)ADDI,Ex1:显示借阅图书的书名,借阅图书的读者姓名和借

12、阅日期。,表格“grid1”的Init事件代码: set safety off select 1 use 图书 index on 书号 tag sh select 2 use 读者 index on 读者编号 tag bh select 3 use 借阅 set relation to 书号 into a set relation to 读者编号 into b additive copy to temp fields a.书名,b.读者姓名,借阅日期 thisform.grid1.recordsourcetype=0 thisform.grid1.recordsource=temp,表单的Un

13、Load事件代码:close all,产生一个新的数据表,1.顺序查询(条件定位),locate 范围 for ,命令格式:,继续查找命令,命令格式:,continue,不能单独使用,(教科书P150),数据表的查询,【例6-1】在读者信息表中逐条显示男读者信息。,表单Form1的Init事件代码如下: LOCATE FOR 性别=男” “下一条”按钮的Click事件代码如下: Continue if found()或 not eof() thisform.refresh else messagebox(已查询完毕!) this.enabled=.f. endif,命令按钮呈灰色显示,ex2.

14、设计如图所示表单,将下表所示的产品信息数据表 (CP.DBF)添加到表单的数据环境中。,表单运行后在文本框Text1中输入产品编号,按回车键后,将显示该产品的名称、规格及单价。编写文本框TEXT1的VALID事件代码。,文本框text1的“Valid”事件代码如下: x=alltrim(thisform.text1.value) locate for 产品编号=x thisform.text2.value=商品名称 thisform.text3.value=规格 thisform.text4.value=单价,ex3.设计如图(左)所示表单,将表所示教师表(JS.DBF)添加到表单的数据环境中

15、。,表单运行后,在组合框combo1中选择教师编号(其中combo1中显示的是教师编号的字段值),单击“查询”按钮,将按如图(右)所示显示该教师的信息。编写“查询”按钮的Click事件代码。,“查询”按钮的“Click”事件代码如下: locate for 教师编号=bo1.value thisform.text1.value=姓名 thisform.text2.value=性别 thisform.text3.value=职称 thisform.label5.caption=出生年月:+ str(year(生日),4)+年+str(month(生日),2)+月,ex4.有两个数据表: 销售员表

16、(EMP.DBF)和销售业绩表 (SALE.DBF)。其数据如表所示:,销售员表 (EMP.DBF),销售业绩表 (SALE.DBF),设计如图(左)所示的表单,将销售员表 (EMP.DBF)和销售业绩表(SALE.DBF)添加到 表单的数据环境中,并且设置两个表的exclusive 属性为.t.。,表单form1的load事件代码如下: select emp index on 编号 tag bh select sale set relation to 编号 into emp 表单运行后,在组合框(与CEL.DBF的编号字段绑定)中选择一个编号,在标签label2中显示如图(右)所示。编写组合

17、框combo1的InteractiveChange事件代码。,组合框combo1的InteractiveChange事件代码: x=allt(bo1.value) locate for 编号=x thisform.label2.caption=emp.姓名+超额业绩量 为:+str(一季度+二季度+三季度+四季度)- emp.指标,5,2),2. 查询,find |& seek |,命令格式:,可以不加引号,字符、数值、日期、逻辑值组成的表达式,索引,找什么索引什么,(教科书P150),【例6-2】在读者信息表中为性别字段建立普通索引,并利用该索引查找并显示出所有女读者信息。,表单Form1的

18、Init事件代码如下: Set order to 性别 Find 女 或 seek “女”,找不到,指针指到结束位置,“下一条”按钮的Click事件代码如下: If eof() messagebox(“没有满足条件的记录”) else skip if 性别=女” thisform.refresh else messagebox(已查询完毕!) this.enabled=.f. skip -1 thisform.refresh endif endif,Find和seek没有配套的继续查询的命令。,扫描循环(scanendscan循环) 格式: (见教科书153页),该循环只对数据表中的指定记录逐

19、个进行某种处理,【EX5】设计如图所示表单,在编辑框中显示所有读者的姓名、办证日期,单位和联系电话。,数据来源于读者.dbf表, 打开表,对表中的每一条记录 进行逐条扫描 用循环对每条记录做同样的处理,在编辑框中输出记录,数据表扫描循环的三要素: 循环变量记录指针,初值为1, go top 循环条件记录指针没有到文件结束not eof() 循环条件的改变记录指针逐条后移skip,怎样构成数据表扫描循环?,thisform.edit1.value=读者姓名 办证日期 单位 联系电话 Do while not eof() x=读者姓名+space(2)+dtoc(办证日 期)+space(2)+单

20、位+space(2)+联系电话 thisform.edit1.value=thisform.edit1.value+ chr(13)+x skip enddo thisform.refresh,命令按钮command1的click事件代码:,方法1:,thisform.edit1.value=读者姓名 办证日期 单位 联系电话 scan x=读者姓名+space(2)+dtoc(办证日 期)+space(2)+单位+space(2)+联系电话 thisform.edit1.value=thisform.edit1.value+ chr(13)+x endscan thisform.refres

21、h,命令按钮command1的click事件代码:,方法2:,条件循环 go top do whil not eof() 处理一个记录 skip endd,扫描循环 scan 处理一个记录 ends,【EX6】设计如图所示表单,在组合框中选择任一出版社,在编辑框中显示该出版社的图书的书名、价格和数量。,thisform.edit1.value=“书名 价格 数量 cbs=alltrim(bo1.value) locate for alltrim(出版社)=cbs Do while not eof() x=书名+space(2)+str(价格,5,1)+str(数量,5) thisform.ed

22、it1.value=thisform.edit1.value+ chr(13)+x continue enddo thisform.refresh,组合框combo1的Interactivechange事件代码:,方法1:,thisform.edit1.value=“书名 价格 数量 cbs=alltrim(bo1.value) scan for alltrim(出版社)=cbs x=书名+space(2)+str(价格,5,1)+str(数量,5) thisform.edit1.value=thisform.edit1.value+chr(13)+x endscan thisform.refresh,组合框combo1的Interactivechange事件代码:,方法2:,数据表的统计运算,统计:主要是对于数据表中的记录数、数字型字段进行纵向统计。 1.统计记录个数,count for to ,命令格式:,(教科书P157),3.数值字段求平均值 命令格式:,average to ,2.数值字段求和 命令格式:,sum to ,(教科书P157),(教科书P158),4.多功能计算命令 命令格式:,calculate to ,CNT()、SUM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论