VFP设计查询
- 格式:doc
- 大小:42.00 KB
- 文档页数:5
【最新整理,下载后即可编辑】
教学设计
示2分钟
学生自学、讨论教师通过磁盘上,是一种文本形式的文件。
创建查询的方法:
菜单或工具栏
CREATE QUERY
查询向导可以引导用户快速设计一个查
询。
下面将示例使用查询向导设计一个简
单的单表查询:从GXGLXT数据库的
Student表中查询系部代号为“04”且是
99级的所有学生的信息。
操作过程如下:首先从“项目管理
器”开始,选择【数据】卡片中的“查
询”,然后单击【新建】按钮,则出现设
计查询的方式选择对话框。
自学
课件
和课
本内
容,
互相
讨论
教
师
通
过
设
置
问
题
加
强
学
生
的
理
解
和
设置问题加强学生的理解和
记忆3分钟
课件显示3学生
展开
讨论
自由
发言
记
忆
学
生
展
开
讨
论
自
由
发
言
教
师
分钟
学
生展学生
讲
解
,
结
合
课
件
进
行
重
点
、
难
点
分
析。
VFP查询系统实现技巧六则-电脑资料用VFP6.0编写完整的应用程序时煵檠系统往往是不可缺少的重要部分,。
而开发一个优秀的查询系统需要很多的应用技巧。
由于工作原因,笔者经常开发查询系统模块,现将个人编程中总结的一些技巧介绍给大家,希望对读者的应用开发有所帮助。
任务进度条的实现在查询的过程中,如果数据较多,需要用户等待时,查询系统中应有进度条加以显示,才能使系统更加具有规范性。
具体实现方法如下:1.选择VFP的系统选单“工具”中“选项”条,弹出“选项”窗口,在窗口中点击“ActiveX控件”栏,添加任务进度栏控件Microsoft ProgressBar Control Version5.0(SP2)至ActiveX工具箱中。
2.选定表单控件工具栏中“ActiveX控件”,添加控件Microsoft ProgressBar Control Version6.0至查询的表单Form1中,并设置其属性Max值为1000。
3.将下列代码添加到数据查询程序代码之后:for i=1 to 1000for j=1 to 2000j=j+1endforthisform.olecontrol1.value=ii=i+1endformessagebox('数据查询完毕,OK!',0+64)thisform.releaseclear events通过这样的设置,在查询时如果时间较长,查询进度条会为用户显示查询任务的运行情况。
应用宏命令实现组合查询在组合查询中,需要查询的组合项通常很多,如果每项都使用不同的变量,编程会非常烦琐。
笔者使用宏命令轻松实现查询组合条件,具体实现的方法是在查询按钮里加入如下代码:LOCAL cFilter,nCnt,cConditionFOR nCnt = 1 to THISFORM.ControlCountIF TYPE('THISFORM.Controls(nCnt).controlSource') <> "U" THENIF !EMPTY(THISFORM.Controls(nCnt).ControlSource) AND ;TYPE('THISFORM.Controls(nCnt).value') <> "U" THEN cCondition=THIS.Parent.parseCondition(THISFORM.Controls(nC nt).value,THISFORM.Controls(nCnt).controlSource)IF !EMPTY(cCondition) THENcFilter = cFilter + " AND " cConditionENDIFENDIFENDIFENDFOR通过这样的设置,虽然有多个查询条件,但查询的组合条件为cFilter,以后的应用只要对cFilter进行处理即可,电脑资料《VFP查询系统实现技巧六则》(https://)。
vfp中的数据查询vfp中的数据查询时间:2007-05-09 本站Visual FoxPro 语言体系包括三个部分:一是传统的Xbase 语言体系,二是结构化查询语言(SQL),三是面向对象化(OOP)程序设计语言。
笔者认为,Visual FoxPro 这三部分语言都具有数据查询的功能。
可能对于Xbase语言和SQL语言具有数据查询功能大家是没有异议的,但Visual FoxPro中的OOP语言应不会有数据查询功能,因为一般认为在Visual FoxPro中数据处理是非面向对象的,就此可以得出Visual FoxPro中的OOP语言应不具备数据查询功能。
其实则不然,当我们在Visual FoxPro中通过OOP语言导入当前流行的RDO或ADO数据处理模型时,我们就会得出不同的答案。
本文想集中精力讨论Visual FoxPro 中有关Xbase语言和SQL语言的数据查询方法。
在我们开始之前,先让我们分清Xbase语言和SQL语言在数据查询中扮演的不同角色。
一句话:SQL语言侧重用于批量数据查询及复杂的关系型操作。
由于篇幅关系我们不可能在此详细讲述SELECT—SQL 语句的所有内容。
读者有兴趣可以参看本站推出的《结构化的查询语言(SQL)》。
作为优秀的数据处理语言(DML),Xbase 中许多命令、函数有数据查询功能,我们可以讲Browse、List这样的命令也能查找数据,但这在数据库系统开发中有多大作用?所以我们不讨论它们。
首先,我们通过以下命令营建一个Demo环境。
要求:查找COL1=9023时COL2的值。
CLOSE ALLCREATE TABLE ABC (COL1 I, COL2 I)FOR I=1 TO 10000?INSERT INTO ABC (COL1, COL2) VALUES (I, RAND()*100000) ENDFORINDEX ON COL1 TAG COL1USE使用LOCATE 命令USE ABCLOCATE FOR COL1=9023IIF(FOUND(),MESSAGEBOX("COL2="+STR(COL2)),MESSAGE BOX("没有找到"))USE笔者认为:LOCATE命令速度很慢,就上例来说记录指针运动了9022次,如果我有1亿条记录呢?为了解决这类问题,FoxPro提出了RUSHMORE技术用于优化FOR 子句,但其本质仍是索引技术。
⼀. 查询的应⽤在实际应⽤中,可以将查询结果⽤表单的列表框控件显⽰出来.例如,显⽰职⼯的编号,姓名及⼯资的信息步骤:1.新建表单,添加三个标签,caption属性分别设为"编号","姓名","⼯资".再添加⼀个列表框控件list1,2.将列表框控件list1的rowsourcetype属性设为3(即可⽤Sql语句选择数据项),再将其rowsource属性设为"select 编号,姓名,⼯资from 职⼯档案".另外,将list1的columncount属性设为33.保存并运⾏表单.⼆.视图:前⾯介绍的查询可以很⽅便的从表中检索出所需的数据,但不能修改所查出的数据.如果既要查询⼜要修改数据,可以使⽤视图.视图是数据库的⼀部分,与数据库表有很多相似的地⽅.视图是⼀个虚表,其中存放的是数据库表的定义.在⼤多数场合下,视图的作⽤等同于表,数据库表的特性,⽐如给字段设置标题等,同样适⽤于视图.在VFP中,有两种类型的视图:本地视图和远程视图.本地视图能够更新存放在本地计算机上的表,远程视图能够更新存放在远程服务器上的表.三.创建本地视图:1.使⽤命令⽅式:可以⽤下列命令直接创建视图:格式:create sql view 视图名 as select_sql语句例如,创建视图zgda,选择"职⼯档案"表的全部信息,命令如下:create sql zgda as select * from 职⼯档案也可以使⽤已有的select_sql语句来创建视图,只要把select_sql语句存⼊⼀个变量,然后⽤宏替换在create sql view命令中调⽤即可例如,上⾯创建视图的命令,可以改成下列的格式:x="select * from 职⼯档案"create sql view zgda as &x2.使⽤"视图设计器"创建视图的步骤如下(1)启动"视图设计器"(2)添加表或视图(3)建⽴表间的关联(4)选择字段(5)筛选记录(6)排序记录(7)设置更新条件."视图设计器"的窗⼝与"查询设计器"窗⼝相类似,这⾥不再介绍.四.使⽤"视图设计器"创建视图:1.启动"视图设计器":(1)在项⽬管理器中选择"全部"或"数据"选项卡,选择"本地视图",单击"新建"按钮,单出"新建本地视图"对话框,如图62(2)在"新建本地视图"对话框中单击"新建视图"按钮,进⼊"视图设计器"窗⼝,与"查询设计器"窗⼝相⽐较,除了多了个"更新条件"选项卡之外,其他都是相同的.2.添加表:步骤如下(1)打开"视图设计器"窗⼝后,弹出"添加表或视图"对话框(2)在该对话框中,选中要添加的表,单周"添加"3.其余操作同查询4.设置更新条件:在"更新条件"选项卡中,选中"发送SQL更新"复选框,并设置更新字段,即可使⽤视图更新基表中的数据五.视图的使⽤:1.视图的打开:视图不作为单独的⽂件存在,是数据库的⼀部分.要打开视图,必须先打开数据库,格式如下:open database 数据库名use 视图名browse2.显⽰视图的结构:如只需要打开视图并显⽰其结构,⽽不必下载数据时,可使⽤带nodata⼦句的use命令.对于远程视图,这个选项更有⽤.格式如下: use 视图名 nodatabrowse3.关闭视图:公关闭视图,⽤下列命令:select 视图名use关闭数据库中所有表和视图,⽤下列命令:close tables关闭数据库,则库中的表和视图也⼀起关闭:close database。
查询和视图
1.已知学生(XS)表中含有字符型字段班级编号(bjbh)和日期型字段出生日期(csrq)。
在TEST项目中已存在查询chaxun,按如下要求修改该查询:
基于学生(XS)表以班级为单位,按出生年份统计各班各年份出生的人数,要求输出字段为:bjbh、出生年份、人数,查询结果首先按班级编号升序排序,一个班级中再按人数多少降序排序,查询结果输出到临时表xsnfrs。
SELECT Xs.bjbh, year(csrq) as 出生年份, count(*) as 人数;
FROM sjk!xs;
GROUP BY Xs.bjbh, 2;
ORDER BY Xs.bjbh, 3 DESC INTO CURSOR xsnfrs
2.已知学生(XS)表中含有字符型字段班级编号(bjbh)和日期型字段出生日期(csrq)。
在TEST项目中已存在查询chaxun,按如下要求修改该查询:
基于学生(XS)表以班级为单位,按出生月份统计各班上半年和下半年出生的人数,要求输出字段为:bjbh、时间、人数。
如果出生月份在1至6月,则时间为“上半年”,如果出生月份在7至12月,则时间为“下半年”,查询结果首先按班级编号升序排序,一个班级中再按时间降序排序,查询结果输出到临时表xsrs。
SELECT Xs.bjbh, IIF(MONTH(csrq)<7,"上半年","下半年") AS 时间,;
COUNT(*) AS 人数;
FROM sjk!xs;
GROUP BY Xs.bjbh, 2;
ORDER BY Xs.bjbh, 3 DESC INTO CURSOR xsrs
3.在TEST项目中已存在查询chaxun,且在SJK中包含一个名为XSCJVIEW的视图。
按如下要求修改查询:
基于XSCJVIEW视图和KC表统计各学生所学必修课的门数和总学分,学生所学课程的学分必须当成绩(cj)在60分以上时才能取
得。
要求输出字段为:xh、xm、门数、总学分,查询结果按学号
升序排序。
(分组。
筛选)
SELECT Xscjview.xh, Xscjview.xm, COUNT(*) AS 门数,;
SUM(iif(xscjview.cj>=60,kc.xf,0)) as 总学分;
F ROM sjk!xscjview INNER JOIN sjk!kc ON Xscjview.kcdh = Kc.kcdh;
WHERE Kc.bxk = .t.;
G ROUP BY Xscjview.xh;
O RDER BY Xscjview.xh
4.在TEST项目中已存在查询chaxun,且在SJK中包含一个名为XSCJVIEW的视图。
按如下要求修改查询:
基于XSCJVIEW视图和KC表统计各学生必修课和非必修课的门数和总学分,学生所学课程的学分必须当成绩(cj)在60分以上时
才能取得。
要求输出字段为:xh、xm、课程性质、门数、总学分,其中“课程性质”字段依据KC表中的bxk字段取值为“必修”
或“选修”(若bxk字段值为“.T.”,则“课程性质”字段取值为
“必修”,否则取值为“选修”)。
查询结果按学号和课程性质升序
排序。
SELECT Xscjview.xh, Xscjview.xm, IIF(Kc.bxk,"必修","选修") AS 课程性质,;
COUNT(*) AS 门数, SUM(IIF(Xscjview.cj=>60,Kc.xf,0)) AS 总学分;
FROM sjk!xscjview INNER JOIN sjk!kc ON Xscjview.kcdh = Kc.kcdh;
GROUP BY Xscjview.xh, 3;
ORDER BY Xscjview.xh, 3
5.在TEST项目中已存在查询chaxun,按如下要求修改查询:
基于两个工资表(GZ和GZC)查询同一个教师在两个表中的基本工资(jbgz)不一致的记录。
要求输出gh、xm字段以及两个表中的jbgz字段,并按两个jbgz差的绝对值的降序排序。
SELECT Gzc.gh, Gzc.xm, Gz.jbgz, Gzc.jbgz, ABS(Gz.jbgz-Gzc.jbgz) AS 差额;
FROM sjk!gz INNER JOIN gzc ON Gz.gh = Gzc.gh;
WHERE Gz.jbgz <> gzc.jbgz;
ORDER BY 5 DESC
6.假设现有GZ表中的若干工资项将有所变动:基本工资(jbgz)每人增加120元;岗位津贴(gwjt)每人增加20%;男女职工的综合津贴(zhjt)分别加10元和50元。
但暂时又不希望更改GZ表中的数据,希望通过查询预览一下变动后的工资情况,按如下要求修改TEST 项目中的查询chaxun:
基于JS表和GZ表查询变动后的工资情况,输出字段为:gh, xm, xb, jbgz, jbgz2, gwjt, gwjt2, zhjt, zhjt2,其中字段名末位是“2”的字段表示变动后的工资项。
要求按gh升序排序,且仅显示排在前10%的记录,结果输出到VFP主窗口中。
SELECT TOP 10.00 PERCENT Js.gh, Js.xm, Js.xb, Gz.jbgz, ;
Gz.jbgz+120 AS jbgz2, Gz.gwjt, Gz.gwjt*1.2 AS gwjt2, Gz.zhjt, ;
Gz.zhjt+IIF(xb="男",10,50) AS zhjt2;
FROM sjk!js INNER JOIN sjk!gz ON Js.gh = Gz.gh;
ORDER BY Js.gh TO SCREEN
RKVIEW的视图,该视图中包含每个专业的开课情况,其中有所开课程的课程代号(kcdh),课程名称(kcm)以及上课教师的工号(gh),在SJK中存在另一个名为JSST的视图,其中有每一个教师的职称(zc)及参加工作日期(gzrq)。
按如下要求修改查询:基于RKVIEW视图和JSST视图查询kcdh是’01’的任课教师的基本情况。
要求输出字段为:kcdh、gh、xm、xb、zc、参加工作年份,查询结果中无重复行且按gh的升序排序。
SELECT DISTINCT Rkview.kcdh, Jsst.gh, Jsst.xm, Jsst.xb, Jsst.zc,;
year(jsst.gzrq) as 参加工作年份;
FROM sjk!rkview INNER JOIN sjk!jsst ON Rkview.gh = Jsst.gh;
WHERE Rkview.kcdh = "01";
ORDER BY Jsst.gh
8.在TEST项目中已存在查询chaxun,且在SJK中包含一个名为JSZCRK的视图,该视图中包含教师的职称和任课情况。
假定课程(KS)表中的课时数(kss)字段表示的是周课时数,一学期为20周。
按如下要求修改查询:
基于JSZCRK视图和课程(KS)表查询各类职称教师一学期的平均课时数。
要求输出字段为: zc,教师数,总课时,平均课时,查询结果按平均课时降序排序。
SELECT Jszcrk.zc, count(*) as 教师数, sum(kc.kss*20) as 总课时,;
avg(kc.kss*20) as 平均课时;
FROM sjk!jszcRK INNER JOIN sjk!kc ON Jszcrk.kcdh = Kc.kcdh;
GROUP BY Jszcrk.zc;
ORDER BY 4 DESC
RKST的视图,该视图中包含每个专业的开课情况,其中有专业代号(zydh)、专业名称(zymc)、所开课程的课程代号(kcdh),KC表中含每一门课的课程名称(kcm)。
按如下要求修改查询:
基于RKST视图和KC表查询有哪些专业开了kcdh是’01’的这门课。
要求输出字段为:zydh、zymc、kcdh、kcm,查询结果中不允许有重复的行,并按zydh的升序排序。
SELECT DISTINCT Rkst.zydh, Rkst.zymc, Kc.kcdh, Kc.kcm;
FROM sjk!rkst INNER JOIN sjk!kc ON Rkst.kcdh = Kc.kcdh;
WHERE Rkst.kcdh = "01";
ORDER BY Rkst.zydh
10.在TEST项目中已存在查询CHAXUN,且在SJK中包含一个名为RKVIEW的视图,该视图中包含每个专业的开课情况,其中有所开课程的课程代号(kcdh)、课程名称(kcm)以及上课教师的工号(gh),在SJK中存在另一个名为JSST的视图,其中有每一个教师的职称(zc)及参加工作日期(gzrq)。
按如下要求修改查询:
基于RKST视图和KC表查询有哪些专业开了kcdh是“01”的这门课。
要求输出字段为:zydh、zymc、kcdh、kcm,查询结果中不允许有重复的行,并按zydh的升序排序。
SELECT DISTINCT Rkst.zydh, Rkst.zymc, Kc.kcdh, Kc.kcm;
FROM sjk!rkst INNER JOIN sjk!kc ON Rkst.kcdh = Kc.kcdh;
WHERE Rkst.kcdh = "01";
ORDER BY Rkst.zydh。