260 likes | 394 Views
Visual FoxPro 程序设计教程. 第 12 章 检 索 数 据. 1. 查询的本质. SELECT-SQL 语句是 SQL 查询的心脏。其语法格式为: SELECT [ALL | DISTINCT] [Alias.] Select_Item [AS Column_Name] [, [Alias.] Select_Item [AS Column_Name] ...] FROM [DatabaseName!]Table [[AS] Local_Alias]
E N D
第12章 检 索 数 据 1 查询的本质 SELECT-SQL语句是SQL查询的心脏。其语法格式为: SELECT [ALL | DISTINCT] [Alias.] Select_Item [AS Column_Name] [, [Alias.] Select_Item [AS Column_Name] ...] FROM [DatabaseName!]Table [[AS] Local_Alias] [[INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN DatabaseName!] Table [[AS] Local_Alias][ON JoinCondition ]] [[INTO Destination] | [TO FILE FileName [ADDITIVE] | TO PRINTER [PROMPT] | TO SCREEN]]
[PREFERENCE PreferenceName] [NOCONSOLE] [PLAIN] [NOWAIT] [WHERE JoinCondition [AND JoinCondition ...][AND | OR FilterCondition...]] [GROUP BY GroupColumn [, GroupColumn ...]] [HAVING FilterCondition] [UNION [ALL] SELECTCommand] [ORDER BY Order_Item [ASC | DESC] [, Order_Item [ASC | DESC] ...]] 其中各子句的说明可以参见联机帮助。使用“查询设计器”可以快速创建一个查询,通过察看“查询”中的语句可以帮助我们学习SELECT-SQL语法;反过来,掌握了SELECT-SQL语法又可以更加灵活地建立“查询”。 总复习教学进程
2 用“查询设计器”创建查询 建立查询的步骤为: ① 使用“查询设计器”开始建立查询。 ② 选择出现在查询结果中的字段。 ③ 设置选择条件来查找可给出所需结果的记录。 ④ 设置排序或分组选项来组织查询结果。 ⑤ 选择查询结果的输入类型:表、报表、浏览等等。 ⑥ 运行查询。 总复习教学进程
启动“查询设计器” 启动“查询设计器”的步骤如下: ① 从“文件”菜单中选择“新建”命令,或者单击常用工具栏上的“新建”按钮。 ② 在“新建”对话框中,选中“查询”单选钮,然后单击“新建文件”按钮。 ③ 在创建新查询时,系统打开“添加表或视图”对话框,提示从当前数据库或自由表中选择表或视图,如图12-1。 依次选择所需要的表或视图,按“添加”按钮,最后按“关闭”按钮,Visual FoxPro将显示“查询设计器”窗口,如图12-2所示。 总复习教学进程
图12-1 选择要查询的表或视图 图12-2 “查询设计器”窗口 若要添加和移去表,其操作步骤为: ① 选择当前表,再选择“查询设计器”工具栏上的“移去表”按钮。 ② 从“查询设计器”工具栏上选择“添加表”按钮,再选择想要的的表或视图。 总复习教学进程
3 查询的SQL语句 在查询中添加注释 如果想以某种方式标识查询,或对它作一些注释说明,可以在查询中添加备注,这对以后确认查询及其目的很有帮助。给查询添加注释的步骤如下: ① 从“查询”菜单中选择“备注”。 ② 在“备注”框中,键入任何与查询有关的附注,如图12-9所示。 图12-9 在查询中添加注释 ③ 选择“确定”。 总复习教学进程
4 在表单中使用查询 【例12-1】设计一个数据查询表单,可以查询数据库中优秀学生的成绩、平均成绩前5名以及成绩不及格的学生名单。如图12-12所示。 其中成绩优秀是指某门课程的成绩 > 85分。 图12-12 数据查询表单 总复习教学进程
设计步骤如下: (1) 建立应用程序用户界面与设置对象属性。 (2) 创建数据环境。 (3) 编写程序代码。 编写表单的Load事件代码: THIS.Tag="SELECT Student.学号, Student.姓名, Bj.班级名称, Kc.课程名, Cj.成绩 "; + "FROM bj INNER JOIN student "; + " INNER JOIN cj "; + " INNER JOIN kc "; + " ON Kc.课程号 = Cj.课程号 "; + " ON Student.学号 = Cj.学号 "; + " ON Bj.班级编号 = Student.班级编号 "; + " ORDER BY Student.学号 INTO CURSOR Qu" 总复习教学进程
编写表单的Activate事件代码: WITH THIS.Grid1 .Top = THIS.OptionGroup1.Height .Left = 0 .Width = THIS.Width .Height = THIS.Height - .Top ENDWITH 编写表格Grid1的Init事件代码: THIS.RecordSource = THISFORM.Tag 编写按钮组中第1个按钮Option1的Click事件代码: THISFORM.Grid1.RecordSource=THISFORM.Tag THISFORM.Grid1.Refresh 总复习教学进程
编写按钮组中第2个按钮Option1的Click事件代码:编写按钮组中第2个按钮Option1的Click事件代码: THIS.Tag = "SELECT Student.学号, Student.姓名, Bj.班级名称, Kc.课程名, Cj.成绩 "; + "FROM 学生管理!bj INNER JOIN 学生管理!student "; + " INNER JOIN 学生管理!cj "; + " INNER JOIN 学生管理!kc "; + " ON Kc.课程号 = Cj.课程号 "; + " ON Student.学号 = Cj.学号 "; + " ON Bj.班级编号 = Student.班级编号 "; + " WHERE (Kc.课程名 = '大学' "; + " AND Cj.成绩 > 85) "; + " OR (Kc.课程名 = '高等' "; + " AND Cj.成绩 > 85) "; + " ORDER BY Student.学号 "; + " DESC INTO CURSOR Que" THISFORM.Grid1.RecordSource = THIS.Tag THISFORM.Grid1.Refresh 总复习教学进程
编写按钮组中第3个按钮Option1的Click事件代码:编写按钮组中第3个按钮Option1的Click事件代码: THIS.Tag="SELECT TOP 5 Student.学号,Student.姓名,Bj.班级名称,AVG(Cj.成绩) as 平均成绩 "; + " FROM 学生管理!bj INNER JOIN 学生管理!student "; + " INNER JOIN 学生管理!cj "; + " INNER JOIN 学生管理!kc "; + " ON Kc.课程号 = Cj.课程号 "; + " ON Student.学号 = Cj.学号 "; + " ON Bj.班级编号 = Student.班级编号 "; + " GROUP BY Student.学号 ORDER BY 平均成绩 DESC INTO CURSOR Que" THISFORM.Grid1.RecordSource = THIS.Tag THISFORM.Grid1.Refresh 总复习教学进程
编写按钮组中第4个按钮Option1的Click事件代码:编写按钮组中第4个按钮Option1的Click事件代码: THIS.Tag = "SELECT Student.学号, Student.姓名, Bj.班级名称, Kc.课程名, Cj.成绩 "; + " FROM 学生管理!bj INNER JOIN 学生管理!student "; + " INNER JOIN 学生管理!cj "; + " INNER JOIN 学生管理!kc "; + " ON Kc.课程号 = Cj.课程号 "; + " ON Student.学号 = Cj.学号 "; + " ON Bj.班级编号 = Student.班级编号 "; + " WHERE (Kc.课程名 = '大学' "; + " AND Cj.成绩 < 60) "; + " OR (Kc.课程名 = '高等' "; + " AND Cj.成绩 < 60) "; + " ORDER BY Student.学号 "; + " DESC INTO CURSOR Que" THISFORM.Grid1.RecordSource=THIS.Tag THISFORM.Grid1.Refresh 总复习教学进程
【例12-2】设计一个数据查询表单,可以按“班级”和“课程”的组合查询数据库中的数据。如图12-13所示。【例12-2】设计一个数据查询表单,可以按“班级”和“课程”的组合查询数据库中的数据。如图12-13所示。 图12-13 数据查询表单 总复习教学进程
(1) 创建数据环境。 (2) 建立应用程序用户界面与设置对象属性 (3) 编写程序代码。 ●表单的Load事件代码: THIS.Tag="SELECT Student.学号, Student.姓名, Bj.班级名称, Kc.课程名, Cj.成绩 "; + "FROM bj INNER JOIN student "; + " INNER JOIN cj "; + " INNER JOIN kc "; + " ON Kc.课程号 = Cj.课程号 "; + " ON Student.学号 = Cj.学号 "; + " ON Bj.班级编号 = Student.班级编号 "; + " ORDER BY Student.学号 INTO CURSOR Qu" 总复习教学进程
● 表单的Activate事件代码: WITH THIS.Grid1 .Top = THIS.Container1.Height .Left = 0 .Width = THIS.Width .Height = THIS.Height – .Top ENDWITH ●编写组合框Combo1的Click事件代码: THIS.Tag = THIS.DisplayValue DO CASE CASE THIS.Parent.Check1.Value = 0 AND THIS.Parent.Check2.Value = 0 qa1 = " .T. " CASE THIS.Parent.Check1.Value = 1 AND THIS.Parent.Check2.Value = 0
qa1 = "Student.班级编号 = THIS.Tag " CASE THIS.Parent.Check1.Value = 0 AND THIS.Parent.Check2.Value = 1 qa1 = " Cj.课程号 = THIS.Parent.Combo2.Tag " CASE THIS.Parent.Check1.Value = 1 AND THIS.Parent.Check2.Value = 1 qa1 = "Student.班级编号 = THIS.Tag AND Cj.课程号 = THIS.Parent.Combo2.Tag “ ENDCASE THISFORM.Tag = "SELECT Student.学号, Student.姓名, Bj.班级名称, Kc.课程名, Cj.成绩 "; + "FROM 学生管理!bj INNER JOIN 学生管理!student "; + " INNER JOIN 学生管理!cj "; + " INNER JOIN 学生管理!kc "; + " ON Kc.课程号 = Cj.课程号 ";
+ " ON Student.学号 = Cj.学号 "; + " ON Bj.班级编号 = Student.班级编号 "; + " WHERE " + qa1 ; + " ORDER BY Student.学号 DESC INTO CURSOR Que" THISFORM.Grid1.RecordSource=THISFORM.Tag THISFORM.Grid1.Refresh ●编写组合框Combo2的Click事件代码: THIS.Tag = THIS.DisplayValue DO CASE CASE THIS.Parent.Check1.Value=0 AND THIS.Parent.Check2.Value=0 qa1 = " .t. " CASE THIS.Parent.Check1.Value=1 AND
THIS.Parent.Check2.Value=0 qa1 = " Student.班级编号 = THIS.Parent.Combo1.Tag " CASE THIS.Parent.Check1.Value=0 AND THIS.Parent.Check2.Value=1 qa1 = " Cj.课程号 = THIS.Tag " CASE THIS.Parent.Check1.Value=1 AND THIS.Parent.Check2.Value=1 qa1 = " Student.班级编号 = THIS.Parent.Combo1.Tag AND Cj.课程号 = THIS.Tag " ENDCASE THISFORM.Tag = "SELECT Student.学号, Student.姓名, Bj.班级名称, Kc.课程名, Cj.成绩 ";
+ "FROM 学生管理!bj INNER JOIN 学生管理!student "; + " INNER JOIN 学生管理!cj "; + " INNER JOIN 学生管理!kc "; + " ON Kc.课程号 = Cj.课程号 "; + " ON Student.学号 = Cj.学号 "; + " ON Bj.班级编号 = Student.班级编号 "; + " WHERE " + qa1 ; + " ORDER BY Student.学号 DESC INTO CURSOR Que" THISFORM.Grid1.RecordSource=THISFORM.Tag THISFORM.Grid1.Refresh ●编写复选框Check1的Click事件代码: THIS.Parent.Combo1.Click ●编写复选框Check2的Click事件代码: THIS.Parent.Combo2.Click ()
【例12-3】修改例10-7,使用下拉列表框来输入“班级编号”(如图12-14)。【例12-3】修改例10-7,使用下拉列表框来输入“班级编号”(如图12-14)。 图12-14 使用下拉列表框输入“班级编号
在例10-7的基础之上进行修改,具体步骤如下:在例10-7的基础之上进行修改,具体步骤如下: (1) 在表单中增加一个数组属性ss(1),用来存放查询所得到的班级编号。 (2) 修改表单, (3) 修改组合框的属性 (4) 修改自定义方法disi()的代码: LPARAMETERS L THIS.PageFrame1.Page1.SetAll("Enabled",IIF(L,.T.,.F.),"TextBox") THIS.PageFrame1.Page1.SetAll("Enabled",IIF(L,.T.,.F.),"OptionGroup") THIS.PageFrame1.Page1.SetAll("Enabled",IIF(L,.T.,.F.),"Editbox") THIS.PageFrame1.Page1.SetAll("Enabled",IIF(L,.T.,.F.),"Combobox") THIS.CommandGroup1.Enabled=IIF(L,.F.,.T.)
(5) 编写窗体的Load事件代码: SELECT DISTINCT Student.班级编号 FROM student INTO ARRAY THIS.ss (6) 修改“增加”按钮Command1的Click事件代码: IF THIS.Caption = "添加" THIS.Caption = "保存" THIS.Parent.Command2.Caption = "取消" THISFORM.disi(.t.) THIS.Parent.Tag = STR(RECNO()) APPEND BLANK ELSE
THIS.Caption="添加" THIS.Parent.Command2.Caption="编辑" THISFORM.disi(.f.) TABLEUPDATE() SELECT DISTINCT Student.班级编号 FROM student INTO ARRAY THISFORM.ss ENDIF THISFORM.PageFrame1.Refresh (7) 编写组合框Combo1的KeyPress事件代码: LPARAMETERS nKeyCode, nShiftAltCtrl THISFORM.xx=THIS.DisplayValue IF nkeycode = 13 AINS(THISFORM.ss,1) THISFORM.ss(1) = THIS.DisplayValue ENDIF
习题12 12.1 设计一个查询,输出职工数据库中各部门的人数以及工资总数。 12.2 设计一个查询,输出职工数据库中各部门的男职工人数以及平均工资。 12.3 设计一个查询,输出职工数据库中的中级职称的人数以及平均工资。 12.4 在表单中使用习题12.1、12.2、12.3所设计的查询。如图12-15所示。 12.5 修改习题12.4,使用SQL语句代替查询文件。 12.6 修改习题10.10,使用SQL语句代替SET FILTER进行对数据的筛选。