20131vfp第11部分(索引、查询统计及扫描循环)

上传人:t****d 文档编号:242967286 上传时间:2024-09-13 格式:PPT 页数:67 大小:600.50KB
返回 下载 相关 举报
20131vfp第11部分(索引、查询统计及扫描循环)_第1页
第1页 / 共67页
20131vfp第11部分(索引、查询统计及扫描循环)_第2页
第2页 / 共67页
20131vfp第11部分(索引、查询统计及扫描循环)_第3页
第3页 / 共67页
点击查看更多>>
资源描述
,*,Visual Foxpro 6.0,程序设计基础,1,要点:,1.,掌握索引排序,2.,了解多工作区操作,3.,掌握表中的数据查询,4.,掌握表中的数据统计,5.,掌握数据表中的扫描循环,第十一讲 数据表的查询统计,数据表的索引,索引是按索引关键字表达式的值使数据表中的记录有序排列的一种技术,在,Visual FoxPro,系统中是借助于,索引文件,实现的。,1,、什么是索引,索引关键字的值、记录号,(教科书,P132,),记录号,学号,姓名,成绩,1,001,吴辉,78,2,002,李丽,95,3,003,章意,48,4,004,王鹏,73,5,005,刘星,52,记录号,成绩,2,95,1,78,4,73,5,52,3,48,按成绩降序排列,索引文件,Visual FoxPro,系统提供了四种不同的索引类型,它们分别是:,2,、索引的类型,主索引,:,仅适用于数据库表,,不允许关键字段有重复值,,一个数据表只能建一个主索引。,候选索引,:不允许索引关键字段有重复值,普通索引,:最常用的索引类型,无任何限制,唯一索引,:允许索引关键字段有重复值,Visual FoxPro,系统支持单,索引文件(,.idx,)和复合索,引文件(,.cdx,)。,3,、索引文件的类型,(,1,)结构化复合索引文件,结构化复合索引文件(,.cdx,)可以在同一个文件中包含多个索引,其中每个索引称为,索引标识,。,更重要的是,对于结构复合索引,,无论何时打开表文件,该索引都会自动打开。,其文件名与表名相同,一个表文件只产生一个结构化复合索引文件,。,(,2,)独立复合索引文件(略),(,3,)单索引文件(略),单索引文件是每个索引存放在一个独立的文件(,.idx),中。,4,、索引的建立,(教科书,P133-134,),Index on tag ,ascending|descending ,结构化复合索引文件的建立,(,命令方式,),自动产生与表同名的,.CDX,文件,特别注意:,建立索引时,当,涉及到两个或两个以上的不同类型的字段时:,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,)顺序若不同,则以字符型字段的顺序为准,,若数字型字段的顺序与字符型不同,则用一个较大数减去该字段,再转化为字符型,;,若日期型字段的顺序与字符型不同,则用一个较大的日期减去该字段,再转化为字符型,,然后用“,+”,连接成一个字符表达式。,学号(,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,、索引的使用,一个表文件可以建立多个索引,在操作中可以同时打开多个索引,但是,任何时候只有一个索引起作用,。,索引依赖于表文件而存在,,它随表的关闭而自动关闭。,当前起作用的索引标识称为主控索引,。,要使用索引必须满足以下条件:,打开表;,确定主控索引;,set order to tag ,(,1,)确定主控索引,命令格式:,(教科书,P136-137,),(,2,)删除索引,delete tag all | ,(,3,)索引更新,自动更新,使用索引文件后,虽然表中各记录的物理顺序并未改变。但,记录指针不再按物理顺序移动,而是按主控索引文件中记录的逻辑顺序移动,,于是整个表中的记录是按索引关键表达式值排序的效果。,使用索引文件时,还要特别注意以下几点:,(,1,)在使用,GO,命令时,,GO ,使记录指针指向具体的物理记录号,而与索引无关,而,GO TOP|BOTTOM,将使记录指针指向逻辑首或逻辑尾记录,这时,GO TOP,不再等同于,GO 1,。,(,2,),SKIP,命令按逻辑顺序移动记录指针。,(,3,)表被打开后,记录指针位于,TOP,位置,。,多工作区操作,若要使用多个表,就要使用多个工作区。一个工作区是一个编号区域,它标识一个已打开的表。在应用程序中通常通过使用,工作区号,和,工作区别名,来标识。,(教科书,P138-139,),1,、工作区号,Visual foxPro,提供了,32767,个工作区,编号从,1,到,32767,。,每个工作区只允许打开一个表,一个表只能在一个工作区打开,系统默认的工作区为,1,号工作区。,2,、别名,(,1,)前十个工作区除了可用,1,10,来标识外,还可用,A,J,来表示,工作区的别名,。,(,2,)定义别名,use alias ,格式:,3,、选择当前工作区,select |,如没有给表定义别名,则可以用数据表名作为别名。,sele 0,表示选定当前未使用的最小号工作区。,use in |,不改变当前工作区,引用非当前工作区表的字段必须冠以别名,引用格式为:,别名,.,字段名,别名,-,字段名,bof(),:文件开始的测试函数,eof(),:文件结束的测试函数,recno(),:返回当前记录号,select(),:返回当前工作区区号,4,、工作区常用函数,建立表间的关联关系(临时关系),要在两个或两个以上的表之间进行数据操作时,通常有,关联和连接,两种方法。,1,、关联的概念,每个工作区打开的表中都存在一个记录指针,指针指向的记录是当前记录,如果表之间没有关系,则各个表的记录指针,相互独立,,即当前工作区指针移动时,其他工作区的指针不移动。,所谓关联,就是让不同工作区数据表的记录指针建立一种临时的联动关系。使一个表的记录指针移动时,能带动另一个表的记录指针按一定的条件作相应地移动。,前者称为关联表(主动表、父表),后者称为被关联表(被动表、子表),关键字为唯一值 关键字为唯一值,一,一,关键字为重复值 关键字为唯一值,多,一,关键字为唯一值 关键字为重复值,一,多,关键字为重复值 关键字为重复值,多,多,父表,子表,主动,被动,建立表间的关联,建立数据库文件中表间关联,,一是要保证建立关系的表具有相同的,字段值(关键字值);,二是子表要以该字段建立,索引,。,建立两个表之间的,“,一对一,”,和,“,多对一,”,关联的步骤:,找到两个表中能够建立关联的字段(,字段名可以不同,类型、宽度、小数位数必须相同,),根据关键字值确定父表,再确定子表;,选择一个工作区,打开子表,建立索引;,选择另一个工作区,打开父表建立关联。,有重复值为父表,set rela to into ,,,,, into additive,说明:,发出关联命令所在工作区的表是父表,建立关联的命令,(教科书,P139,),子表必须对关联字段索引,是关联的关键字,不同名的字段只要,类型和数值,相同也可建立关联,。,关联后,父表指针移动带动子表指针移动;而,如果当前工作区是子表,其指针移动,父表指针不会移动,。,additive,一般用于三个或三个以上的表之间建立多重关联,第,2,、,3,个关联使用该选项。,关联后,当前工作区字段名可以直接使用,子表的字段在使用时要加,“,别名,.,字段名,”,。,set rela to recn()+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,),字段,父表:,BB,书号,1 0003,2 0001,3 0004,4 0003,5 0002,6 0001,7 0001,子表:,AA,书号,1 0001,2 0002,3 0003,4 0004,AA BB CC,或,AA BB,AA CC,字段,1,字段,2,字段,1,字段,2,Sele 1,Use CC,inde 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,:显示借阅图书的书名,借阅图书的读者姓名和借阅日期。,表格“,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,表单的,UnLoad,事件代码:,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.,设计如图所示表单,将下表所示的产品信息数据表,(,CP.DBF,)添加到表单的数据环境中。,产品编号,商品名称,规格,单价,001,电视机,CTV-0134,2980,002,电冰箱,EBG-02187,3160,003,洗衣机,XYJ-03405,1880,表单运行后在文本框,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),添加到表单的数据环境中。,教师编号,姓名,性别,职称,生日,J820213,毛峰,男,教授,1960-2-24,F820308,菊豆,女,副教授,1964-3-3,S821034,章潜,女,讲师,1970-3-12,S821105,王绍坪,男,讲师,1985-3-8,表单运行后,在组合框,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.,有两个数据表: 销售员表(,EMP.DBF,)和销售业绩表,(,SALE.DBF,)。其数据如表所示:,编号,姓 名,性别,片区,指标,周君宇,女,A,22,王心江,女,A,21,章世平,男,B,20,周海龙,男,C,23,陈康平,男,C,22,邓,娟,女,B,20,编号,一季度,二季度,三季度,四季度,5.55,6.10,4.58,5.45,6.45,5.65,5.67,7.76,7.60,6.67,7.56,5.56,4.35,4.56,4.67,5.65,5.2,8.3,4.5,5.23,4.5,4.69,5.02,4.55,销售员表,(,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,中显示如图(右)所示。,编写组合框,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,的,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,没有配套的继续查询的命令。,查询完毕,显示最后,一条记录的内容,扫描循环(,scan,endscan,循环),格式,: (见教科书,153,页),该循环,只对数据表,中的指定记录逐个进行某种处理,【EX5】,设计如图所示表单,在编辑框中显示所有读者的姓名、办证日期,单位和联系电话。,数据输入,数据处理,数据输出,数据来源于读者,.dbf,表,,打开表,对表中的每一条记录,进行逐条扫描,用循环对每条记录做同样的处理,在编辑框中输出记录,数据表扫描循环的三要素:,循环变量,记录指针,初值为,1,go top,循环条件,记录指针没有到文件结束,not eof(),循环条件的改变,记录指针逐条后移,skip,怎样构成数据表扫描循环?,thisform.edit1.value=,读者姓名 办证日期 单位 联系电话,Do while not eof(),x=,读者姓名,+space(2)+dtoc(,办证日,期,)+space(2)+,单位,+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.refresh,命令按钮,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.edit1.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(),、,AVG(),、,MAX(),、,MIN(),C,、,N,、,D,(教科书,P158,),学号,姓名,英语,计算机,数学,001,张三,85,82,76,002,李四,70,95,63,003,王武,40,70,83,Sum,英语,计算机,数学,英语,+,计算机,+,数学,to yy1,jsj1,sx1,zf1,Average,英语,计算机,数学,英语,+,计算机,+,数学,to yy2,jsj2,sx2,zf2,Count to rs,Calculate sum(,计算机,),avg(,英语,),cnt(),max(,英语,+,计算机,+,数学,),min(,数学,) to jsj3,yy3,zf3,sx3,纵向求和,纵向求平均,统计记录数,=,(,85+82+76,),+,(,70+95+63,),+,(,40+70+83,),5.,分类汇总,命令格式:,total on to fields ,汇总字段,必须是数值型字段,必须索引或排序,关闭的表文件,(教科书,P159,),【,例,6-9】,计算图书表中每个出版社的图书数量。,表单,Form1,的,Init,事件代码如下:,set safety off,use,图书,index on,出版社,tag,cbs,total to,sl,on,出版社,fields,数量,use,sl,copy to sl1 fields,出版社,数量,thisform.grid1.recordsourcetype=0,thisform.grid1.recordsource=sl1,set safety on,学号,姓名,性别,年龄,积分,001,张三,男,30,20,002,李四,女,25,10,003,王五,男,40,50,004,赵七,男,22,30,005,孙六,女,50,20,【EXM7】,有如下数据表,jf.dbf,,按性别汇总积分。,命令按钮的,click,事件代码:,Set safety off,index on,性别,tag xb,total on,性别,to hz,fields,积分,thisform.grid1.recordsource=hz,thisform.refresh,Set safety on,表单的,Unload,事件代码:,Close all,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!