《第4章结构化查询语言SQL和报表》由会员分享,可在线阅读,更多相关《第4章结构化查询语言SQL和报表(115页珍藏版)》请在金锄头文库上搜索。
1、第4章 结构化查询语言SQL和报表SQL语言的基本概述数据定义语言DDL数据操纵语言DML查询和SELECT命令报表和标签小结2024/9/114.1SQL语言的基本概述结构化查询语言(StructuredQueryLanguage,简称SQL)SQL是用于对存放在计算机数据库中的数据进行组织、管理和检索的工具,是一种用于和数据库进行交互通信的计算机语言。SQL是1974年由Boyce和Chamberlin提出的,并在IBM公司研制的SystemR上首次实现了这种语言,由于它的功能丰富,使用方式灵活和语言简洁易学等突出特点,很受计算机界的欢迎。现在SQL语言已成为关系型数据库操纵语言的国际标准
2、。VFP提供了SQL语言支持2024/9/124.1.1SQL语言的基本概念SQL语言支持关系型数据库的三级模式结构,其中外模式对应于视图和部分基本表,模式对应于基本表,内模式对应于存储文件。在SQL语言中,一个关系就对应于一个表,基本表本身是独立存在的表,对应一个存储文件;存储文件的逻辑结构组成了关系型数据库的内模式。视图是从基本表或其他视图导出的表,视图只是一个虚表。在用户看来,视图和基本表都是关系,而存储文件对用户是透明的。2024/9/134.1.2SQL的基本功能SQL语言由3部分组成:数据定义语言DDL(DateDefinitionLanguage)。数据操纵语言DML(DateM
3、anipulationLanguage)。数据控制语言DCL(DateControlLanguage)。其主要命令如表4-1所示。SQL功能命令数据定义语言DDLCreate、Drop、Alter数据操纵语言DMLSelect、Insert、Update、Delete数据控制语言DCLGrant、Revoke其中,数据定义语言DDL提供了完整的定义数据库所必需的语言工具,用来创建、修改、删除数据库对象;数据操纵语言DML用于查询或者修改数据;数据控制语言DCL用来管理用户的访问权限,由于VFP没有权限管理功能,所以不支持DCL命令。 2024/9/144.2 数据定义语言DDL数据定义语言是对
4、关系模式的一级定义,用来定义被存放数据的结构和组织,以及数据项之间的关系。SQL数据定义语言可以用来定义数据表、视图和索引。Create语句:用于定义和生成数据对象,比如创建表、视图和索引。Drop语句:用于删除一个现有的数据对象,比如视图、表、索引。Alter语句:用于改变一个数据库对象。比如对一个表的字段进行删除、添加和修改,或者修改表的结构。2024/9/154.2.1 用Create语句创建基本表命令格式:CREATETABLE表名FREE( (宽度, 小数)NULLNOTNULLCHECKERRORDEFAULTPRIMARYKEY/UNIQUE,) 命令功能:创建数据表的结构。 2
5、024/9/164.2.1用Create语句创建基本表(续)命令说明:CREATETABLE表名:指定创建表文件名。FREE:在数据库打开的情况下创建的是自由表。默认在数据库未打开时创建的是自由表,在数据库打开时创建的是数据库表。CHECK:为字段值指定约束条件;ERROR:用来指定当不满足约束条件时显示的出错信息。DFAULT:指定默认的字段值。PRIMARYKEY:指定当前字段为主索引关键字;UNIQUE:指定当前字段为候选索引关键字。NULL/NOTNULL:表示该字段是否可以为空。2024/9/174.2.1用Create语句创建基本表(续)【例4.1】在图书馆管理系统中创建dzzl(
6、读者种类)表,包含zlbh(种类编号)、zlmc(种类名称)、jssl(借书数量)、jsqx(借书期限)、bz(备注)几个字段。OPENDATABASE图书馆管理CTEATETABLEdzzl(zlbhc(10)notnull,zlmcc(10)notnull,jsslc(8),jsqxc(8),Bzc(20) 若在命令窗口执行MODIFYSTRUCTURE命令,就可以在弹出的对话框中见到dzzl表结构,如图4-2所示。 图图4-2 创建的创建的dzzl表结构表结构2024/9/184.2.1用Create语句创建基本表(续)【例4.2】创建一个名为“通讯录”的自由表,包含姓名、工作单位、电话
7、号码、家庭住址4个字段,所得的表预览如图4-3所示。CREATETABLE通讯录FREE(姓名C(10),工作单位C(20),电话号码C(12),家庭住址C(20)BROWSE由于没有向表中添加任何记录,所以在预览时看不见任何的记录。图图4-3 创建的通讯录表创建的通讯录表2024/9/194.2.1用Create语句创建基本表(续)【例4.3】创建一个“图书订单”的数据库,并在此数据库中创建一个“图书”表,图书表含有订单号、图书编号、书名、单价、数量等字段。CREATEDATEBASE图书订单CREATETABLE图书(订单号C(10);DEFAULT10001,图书编号C(10)PRIMA
8、RYKEY,;书名C(10),单价N(8,2);数量N(6)CHECK数量=100AND数量=1000;ERROR数量范围在100和1000之间)图图4-4 图书表的索引图图书表的索引图预览此表的设计器可以看见“图书编号”已经被设为主索引,如图4-4所示。 2024/9/1104.2.1用Create语句创建基本表(续)【例4.4】在图书订单数据库中建立一个新表“订单”表,含有订单编号、图书编号、客户编号、订货日期、发货日期几个字段。OPENDATABASE图书订单CREATETABLE订单(订单编号C(10)PRIMARYKEY,;客户编号C(10),订货日期D,发货日期D;图书编号C(10
9、),FOREIGNKEY图书编号;TAG图书编号REFERENCES图书) 图图4-5 图书表和订单表之间的关系图书表和订单表之间的关系在命令窗口中输入“MODIFYDATABASE订数订单”命令,可在弹出的“数据库设计器”窗口中见到图书表和订单表之间已建立的关系,如图4-5所示。 2024/9/1114.2.2用Alter修改基本表命令格式1:ALTER TABLE ADD/ALTERCOLUMN (字段宽度,小数位数) NULLNOT NULL CHECKERROR DEFAULT PRIMARY KEY/UNIQUE REFERENCESTAG 命令功能:修改表中原有的字段,或者在表中增
10、加新的字段。2024/9/1124.2.2用Alter修改基本表(续)命令说明:ADDCOLUMN(字段宽度,小数位数):增加新字段,并指定新增字段的名称、类型、字段宽度及小数位数。NULLNOTNULL:指定新字段是否接受空值。ALTERCOLUMN(字段宽度,小数位数):修改原有字段,并指定修改后的字段名称、类型、字段宽度及小数位数。其他的参数含义同CREATETABLE。2024/9/1134.2.2用Alter修改基本表(续)【例4.5】修改在例4.2中创建的通讯录表,增加一个“性别”字段,SQL命令如下:ALTERTABLE通讯录ADDCOLUMN性别C(10)再把表中字段“家庭住址
11、”修改为“工作地址”,SQL命令如下:ALTERTABLE通讯录RENAMECOLUMN家庭住址TO工作地址预览修改后的表如图4-6所示,与图4-3对比就可以发现多出了一个字段“性别”,字段“家庭住址”改为了“工作地址”。 图图4-6 修改后的通讯录表修改后的通讯录表2024/9/1144.2.2用Alter修改基本表(续)【例4.6】修改例4.3中创建的图书表,将“书名”字段的宽度改为20且不准为空值。SQL命令如下:OPENDATABASE图书订单ALTERTABLE图书ALTER书名C(20)NOTNULL命令格式2:ALTERTABLEALTERCOLUMNNULLNOTNULLSET
12、CHECKERRORSETDEFAULTDROPCHECKDROPDEFAULT 2024/9/1154.2.2用Alter修改基本表(续)命令功能:删除或者设置字段的默认值或约束条件。命令说明:SETCHECKERROR:为字段设置约束条件。SETDEFAULT:设置默认值。DROPDEFAULT:删除默认值。DROPCHECK:删除约束条件。 2024/9/1164.2.2用Alter修改基本表(续)【例4.7】在例4.3创建的图书表中,为“图书编号”字段设置一个默认值200601并删除数量的约束条件,SQL命令如下:ALTER TABLE 图 书 ALTER 图 书 编 号 SETDEF
13、AULT200601ALTERTABLE图书ALTER数量DROPCHECK2024/9/1174.2.2用Alter修改基本表(续)命令格式3:ALTERTABLEDROPCOLUMNADDPRIMARYKEYTAGDROPPRIMARYKEYADDUNIQUETAGDROPUNIQUETAGSETCHECKERRORDROPCHECKADDFOREIGNKEYTAGREFERENCESTAGDROPFOREIGNKEYTAGSAVERENAMECOLUMNTO 2024/9/1184.2.2用Alter修改基本表(续)命令功能:删除表中的字段、设置或删除表的主索引、候选索引、对字段重新命名
14、或者删除指定的字段的约束条件。命令说明:DROPCOLUMN:删除指定的字段。ADDPRIMARYKEYTAG:建立主索引。DROPPRIMARYKEY:删除主索引。ADDUNIQUETAG:建立候选索引。DROPUNIQUETAG:删除候选索引。ADDFOREIGNKEYTAG:建立外索引。REFERENCESTAG:指定建立关联的父表。DROPFOREIGNKEYTAGSAVE:删除外索引。RENAMECOLUMNTO:对字段重新命名。 2024/9/1194.2.2用Alter修改基本表(续)【例4.8】在例4.3创建的图书表中,为“书名”创建一个候选索引,并且删除“数量”字段,如图4-
15、7所示。SQL语句如下:ALTERTABLE图书ADDUNIQUE书名;ALTERTABLE图书DROPCOLUMN数量图图4-7 例例4.8图图在图4-7中,字段“数量”被删除,并创建候选索引“书名”。 2024/9/1204.2.2用Alter修改基本表(续)【例4.9】在第1章创建的“图书管理系统”的dzzl中,为jssl创建一个默认值15,当输入有错误时就会显示“值为15”,删除表中的候选索引。SQL语句如下:ALETERTABLEdzzlALTERjsslSETDEFAULT15;ERROR“值为15”;ALETERTABLEdzzlDROPUNIQUETAGzlbh 2024/9/
16、1214.2.3用DROP命令删除一个表随着数据库设计的变化,数据库的结构也在不断的变化,新建的表就会不断地代替旧表,这时某些旧表就不再需要了,可以用DROP TABLE 命令删除它。命令格式:DROP TABLE 命令功能:删除一个表,包括在这个表上建立的索引。命令说明:指定被删除的表。【例4.10】删除在例4.2中创建的通讯录表,SQL命令如下:DROPTABLE通讯录 2024/9/1224.3数据操纵语言DML数据操纵实际上就是管理数据,这也是创建表的基本目的,主要是对关系中的具体数据进行查询、更新、删除和插入,但不能够改变数据的结构。DML命令如表4-2所示。命令功能UPDATE更新
17、数据库中的已有数据DELETE用于从数据表中删除数据INSERT增加一个新的数据到表中SELECT数据查询表表4-2 DML的命令及功能的命令及功能2024/9/1234.3.1INSERT命令用CREATETABLE命令创建一个表后,创建的表中没有具体的数据,可以用INSERT命令向表中插入数据。命令格式:INSERTINTO表名(列名1,列名2,)VALUES(,)命令说明:INTO表名:指定接受新数据的目标表。VALUES:指明增加记录的字段值。向表中添加的数据必须与指定字段名的类型相匹配。字符串要用单引号或者双引号括起来,日期型可用CTOD函数处理或者直接引用。2024/9/1244.
18、3.1INSERT命令(续)【例4.11】在例4.4创建的订单表中插入一个新的记录:订单编号:200601读者编号:10001订货日期:2006-02-1发货日期:2006-02-10图书编号:100012使用INSERT语句把该记录插入到订单表中,SQL语句如下:INSERTINTO订单(订单编号,读者编号,订货日期,发货日期,图书编号);VALUES(200601,10001,CTOD(02-1-06),CTOD(02-10-06),100012)2024/9/1254.3.2UPDATE命令UPDATE语句用来更新表中的记录。命令格式:UPDATESET=,=WHERE命令说明:UPDA
19、TE:指明要修改的记录的表的名称。SET:指明更新的字段名和字段值。WHERE:限定要修改的行,如果没有WHERE子句,该字段下的所有字段值都将被新值替换。2024/9/1264.3.2UPDATE命令(续)【例4.12】把第1章中创建的SJ表中“价格”大于30元且“页数”大于300的图书的“备注”改为“珍贵图书”,SQL命令如下:UPDATESJSETBZ=珍贵图书WHEREJG30ANDYS300若把价格大于30元的或页数大于300页的图书的备注(bz)改为珍贵图书,SQL命令如下:UPDATESJSETBZ=珍贵图书WHEREJG30ORYS300 2024/9/1274.3.3DELE
20、TE命令DELETE命令用来删除一行或者多行记录。命令格式:DELETEFROMWHERE命令说明:FROM子句:指出将删除的目标表。WHERE:指明被删除的记录满足的条件,若没有WHERE子句则删除所有记录。【例4.13】在第1章创建的SJ表中,把“价格”大于30元且“页数”大于300的图书记录删掉,SQL语句如下:DELETEFROMSJWHEREJG30ANDYS3002024/9/1284.4查询和SELECT命令SELECT是数据查询命令。SELECT命令虽然属于数据操纵范围,但它是SQL的核心,在SQL命令中使用的是最多的,我们将它和查询单独作为一节。VFP6.0的查询设计器或SE
21、LECT-SQL语句可用来方便地检索存储在表或者视图中的信息。利用查询设计器可以搜索满足条件的记录,并且可将查询保存在.qpr文件中。2024/9/1294.4.1创建和添加查询1启动查询设计器若要打开查询设计器,应首先打开一个要查询的数据库,然后采用以下方式之一:(1)“文件”菜单启动查询设计器(2)从“工具”菜单启动查询设计器(3)使用CREATEQUERY命令打开查询设计器2024/9/130(1)“文件”菜单启动查询设计器从“文件”菜单中选择“打开”命令,启动“打开”对话框,并在对话框的“文件类型”中选择“项目”类型,再选取要打开的项目名称,最后单击“确定”按钮,出现项目管理器对话框。
22、在项目管理器中选择“数据”选项卡,再选取“查询”选项。单击“新建”按钮,此时出现“添加表或视图”对话框,然后从数据库下拉列表框中选择待查询的数据库名称。再从“选定”栏中选择“表”或“视图”,本例选择了“表”。从“数据库中的表”列表框中选择要添加的表。重复这一步骤,直到选取了所需要的全部表。单击“关闭”按钮,返回“查询设计器”窗口,如图4-8所示。2024/9/131(1)“文件”菜单启动查询设计器(续)图4-8查询设计器2024/9/132(2)从“工具”菜单启动查询设计器在VFP6.0主菜单中,选择“工具”,指向“向导”,选择“查询”,弹出“向导选取”对话框,再选择“查询向导”,可根据查询向
23、导的提示创建查询。(3)使用CREATEQUERY命令打开查询设计器在命令窗口中输入CREATEQUERY即可打开查询设计器。2024/9/1332创建查询(1)查询设计器查询设计器的窗口如图4-8所示。在查询设计器上半部分的窗口中,列出用户已选定的要查询的表或视图。表或视图之间的连线表示表之间的连接关系。查询设计器下半部分的窗口中有6个选项卡:“字段”:选定包含在查询结果中的字段。“联接”:确定各数据表或视图之间的连接关系。“筛选”:相当于命令SETFILTERTO,利用过滤的方法查找一个特定的数据子集。“排序依据”:决定查询结果输出中记录或行的排列顺序“分组依据”:所谓分组就是将一组类似的
24、记录压缩成一个结果记录,这样就可以完成基于一组的计算。“杂项”:指定是否要对重复记录进行检索,同时是否对记录(返回记录的最大数目或最大百分比)做限制。 2024/9/134(2)创建查询的步骤1)按上面介绍的方法打开查询设计器。2)添加出现在查询结果中的表或视图。如本例已打开“图书馆管理”数据库,并已选择添加了Dz.dbf、Jy.dbf和Sj.dbf三个表。3)选定要包含在查询结果中的字段。在“字段”选项卡中,从可用字段列表框中选择需要的字段,即单击需要的字段,再单击“添加”按钮;或者双击需要的字段。4)如果要“可用字段”列表框中的全部字段都包含在查询结果中,可单击“全部添加”按钮;单击“全部
25、移去”按钮,则将已选定的字段(列于选定字段列表框中)全部作废。此时单击“运行”按钮即可看到查询结果。5)保存查询。从“文件”菜单中选择“保存”命令,打开如图4-9所示的“另存为”对话框中,在“保存类型”下拉框中选择“查询”类型,在“保存文档为:”文本框中输入查询文件名,本例取名为“读者借阅”,然后单击“保存”按钮即可。 2024/9/135(2)创建查询的步骤(续)图4-9“另存为”对话框2024/9/136(2)创建查询的步骤(续)【例4.14】查询书籍表中的部分信息。将Sj.dbf表添加到查询设计器中,即只对Sj.dbf表操作。操作如下:1)首先打开“图书馆管理”数据库,然后打开查询设计器
26、,添加表Sj.dbf。2)选定要包含在查询结果中的字段。方法是在“字段”选项卡中,从可用字段列表框中选择需要的字段,即单击需要的字段,再单击“添加”按钮;或者双击需要的字段。图4-10列出了本例选择的全部字段。3)单击“运行”按钮得到查询结果,如图4-11所示。 2024/9/137(2)创建查询的步骤(续)4)保存查询结果。单击“文件”菜单的“保存”命令,打开“保存”对话框,将查询结果保存。 图图4-10 例例4.14图图图图4-11 例例4.14的查询结果的查询结果2024/9/138(2)创建查询的步骤(续)【例4.15】统计表Sj.dbf中记录书籍的价格、页数和书名等信息。为完成统计所
27、有书籍的价格和页数的查询,应将Sj.dbf表添加到查询设计器中。由于本例只要求统计所有书籍的价格和页数,因此只需要选择书籍名称、价格和页数三个字段即可。选择所需的字段后,单击“查询”按钮即可看到查询结果,如图4-12所示。图图4-12 例例4.15 的的“书籍价格书籍价格”查询结果查询结果2024/9/1393创建SELECT-SQL语句(1)认识SELECT-SQL语句利用查询设计器可以方便地创建查询而SELECT-SQL则是一个功能更强大的查询工具,它可直接从一个或多个表中检索数据,其查询结果可用于创建报表、BROWSE或新的数据库表或是临时表,并且SELECT-SQL语句可直接加入到程序
28、中。利用查询设计器创建查询时,系统会自动创建相应的SQL查询语句。单击“查询设计器工具栏”上的“显示SQL窗口”按钮,如图4-13所示,可打开SQL窗口,窗口中所列出的语句就是刚刚利用查询设计器创建的与查询相对应的SQL语句。2024/9/1403创建SELECT-SQL语句(续)表4-3所列是上两例使用查询设计器创建查询得到的SQL语句。在命令窗口中键入MODIFYCOMMANDexample命令,打开程序编辑窗口,再输入下述命令,可得到与使用查询设计器相同的查询结果。1)在命令窗口中输入任一SELECT-SQL语句,然后按Ctrl+W键保存所输入的内容。2)DOexample例例4.14的
29、的SELECT SQL语句语句例例4.15的的SELECT SQL语句语句 SELECT sj.sjbh, sj.sjmc, sj.sjzz, sj.cbs; FROM 图书馆管理图书馆管理!sjSELECT sj.sjmc, sj.jg, sj.ys; FROM 图书馆管理图书馆管理!sj表表4-3 查询设计器创建的查询设计器创建的SELECT SQL语句语句图图4-13 查询设计器查询设计器工具栏工具栏2024/9/141(2)SELECT-SQL语句的语法格式SELECT ALL | DISTINCT TOP nExpr PERCENTAlias. Select_Item AS Colu
30、mn_Name, Alias. Select_Item AS Column_Name .FROM FORCEDatabaseName!Table AS Local_AliasINNER | LEFT OUTER | RIGHT OUTER | FULL OUTER JOIN DatabaseName!Table AS Local_Alias ON JoinCondition INTO Destination | TO FILE FileName ADDITIVE | TO PRINTER PROMPT | TO SCREENPREFERENCE PreferenceNameNOCONSOLEP
31、LAINNOWAITWHERE JoinCondition AND JoinCondition .AND | OR FilterCondition AND | OR FilterCondition .GROUP BY GroupColumn , GroupColumn .HAVING FilterConditionUNION ALL SELECTCommandORDER BY Order_Item ASC | DESC , Order_Item ASC | DESC .2024/9/142(2)SELECT-SQL语句的语法格式(续)SELECT-SQL语句相当复杂,它既可以用于单表的查询,也
32、可以用于多表的查询。1)SELECT子句:在SELECT子句中指定在查询结果中包含的字段、表达式。2)FROM子句:指定所有从中检索数据的表。如果表没有打开,VFP6.0显示“打开”对话框,以便指定文件位置。表打开以后,直到查询结束时才关闭。如果包含FORCE关键字,则在建立查询时会严格按照FROM子句中描述的顺序连接表;若不包含FORCE关键字,则对查询进行优化。使用FORCE关键字,可加快查询速度。DatabaseName!用来指定数据的名称。当包含表的数据库不是当前数据库时,必须指定数据库名称,并且应在数据库名称之后表名之前加上感叹号(!)分隔符。例如,“图书馆管理!sj”表示数据管理数
33、据库的sj表。2024/9/143(2)SELECT-SQL语句的语法格式(续)【例4-16】对图书馆管理数据库,使用FROM子句,查看所有读者的编号、姓名和性别。其中,SELECT子句指定要查询的字段名称,dz.dzbh、dz.dzxm和dz.dzxb分别对应dz表中的编号、姓名和性别。FROM子句表示要查询的字段来自“图书馆管理”数据库的dz表。SELECTdz.dzbh,dz.dzxm,dz.dzxb;FROMdz注意:下面的SELECT语句和上面的语句具有相同的效果:SELECTdz.dzbh,dz.dzxm,dz.dzxb;FROM图书馆管理!dz 2024/9/1444.定义查询结
34、果(1)使用排序选项排序能决定查询输出结果中记录或行的顺序。例如,可按书籍的价格以升序或降序方式对书籍记录进行排序。利用排序依据选项卡可设置查询的排序次序。在“排序依据”选项卡中,“选定字段”可选择要用来排序的关键字段。选定后,添加到“排序条件”框,“排序条件”框中字段的次序决定了查询结果排序时的条件,第一个字段决定了主排序次序,其余字段决定了第二排序次序。例如,在“排序条件”框中的字段顺序是sj.jg、sj.ys,则查询结果将首先按sj.jg进行排序,如果sj表中有一个以上的记录具有同样的jg字段值,这些记录则再按ys进行排序。 2024/9/1454.定义查询结果(续)【例4.17】建立查
35、询按书籍价格从低到高排序。观察例4.15的查询结果,可以发现其结果并没有完全按书籍价格的高低输出,若要使输出按书籍价格从低到高排列,可按以下步骤操作:1)打开查询设计器,首先选择“排序依据”选项卡。其中,“选定字段”列出了可用来排序的字段,供用户选择,“排序条件”是用户已选择好的用来排序的字段。2)从“选定字段”框中选定用来排序的字段,由于本例要按书籍价格从小到大的顺序排序,所以应选择字段sj.jg,然后单击“添加”按钮,把它移到“排序条件”框中。3)从“排序选项”的两个单选按钮“升序”和“降序”中选择一个,本例选择“升序”。4)单击常用工具栏中的“运行”按钮。将查询结果同例4.15比较。20
36、24/9/1464.定义查询结果(续)对查询结果进行排序时,在对应的SELECT-SQL命令中可包括ORDERBY子句,它的格式如下:ORDERBYOrder_itemASC|DESC其中,Order_item是排序条件框中选定的排序字段,字段间用逗号(,)分隔。另外,Order_item也可以是一个数字表达式,表示查询结果中列的位置(最左边列的编号为1)。ASC指定查询结果根据排序以升序排序,DESC指定以降序排列,缺省时为升序。如果不使用ORDERBY子句指定查询结果的排列顺序,则查询结果不排序。例4.17对应的SELECT-SQL语句如下:SELECTsj.sjmc,sj.jg,sj.y
37、s;FROM图书馆管理!sjORDERBYsj.jg2024/9/147(2)给字段添加说明标题为使查询结果易于阅读和理解,可以给字段添加说明标题,又称别名。给前面设计的“书籍价格”添加说明标题,操作步骤如下:1)打开“书籍价格”查询。2)在“函数和表达式”文本框中键入字段名,接着输入AS和说明标题,如下所示:sj.sjmcAS书籍名称3)单击“添加”按钮,在“选定字段”框中放置带有别名的字段。4)重复步骤2)、3),分别给sj.jg和sj.ys添加说明标题“书籍价格”和“书籍页数”。5)单击“运行”按钮,查询结果中各字段名称已变成相应的汉字说明。对应的SELECT语句如下:SELECTsj.
38、sjbhAS书籍编号,sj.jgAS书籍价格,sj.ysAS书籍页数;FROM图书馆管理!sj2024/9/148(3)使用选择条件选择数据库或表中符合条件的一部分记录而不是全部记录是查询的重要任务。例如,要查询一定日期范围内的借书记录、查询所有女性读者的基本情况等。在查询设计器中,“筛选”选项卡可确定用于选择记录的字段和比较准则,以及输入与该字段进行比较的示例值。设置筛选条件是指设置筛选的逻辑表达式,这个表达式由字段、操作符和数值组成。逻辑表达式主要有下述形式:字段操作符表达式其中,字段是要查询的表中的字段。操作符的含义及使用示例如表4-4所示。2024/9/149(3)使用选择条件(续)在
39、表4-4中,Like筛选操作符的含义是查找每个与字符表达式相匹配的字段。在字符串表达式中可使用百分号“%”和下划线“_”通配符,下划线表示字符串中的任意一个字符,百分号表示任意长度的字符串。 操作符操作符比较关系比较关系举例举例=相等相等xk.cj = 60, xk.kcbm = 02=完全相等完全相等xk.cj = 60, xk.kcbm = 02Like不精确匹配不精确匹配xk.xh LIKE 19964%,查查询询所所有有学学号号前前五五位位是是“19964”的的学学生生大于大于xk.cj 60, xk.kcbm 02=大于等于大于等于xk.cj = 60, xk.kcbm = 02小于
40、小于xk.cj 60, xk.kcbm 02=小于等于小于等于xk.cj = 60, xk.kcbm =30,选择“否”按钮后,变为sj.jg=操作符。4)在“实例”文本框中输入30。对应的SELECT语句如下:SELECTsj.sjmcAS书籍名称,sj.jgAS书籍价格,sj.ysAS书籍页数;FROM图书馆管理!sj;WHEREsj.jg=302024/9/152(3)使用选择条件(续)【例4.19】在例4.15创建的“书籍价格”查询中,使用LIKE操作符,筛选出书籍名为软件工程的记录。1)打开“统计学生成绩”查询,并选择“筛选”选项卡。2)在“字段”下拉列表中选择sj.sjmc字段。3
41、)在“条件”下拉列表中选择LIKE操作符。4)在“实例”文本框中输入“软件工程”。对应的SELECT语句如下:SELECTsj.sjmc,sj.jg,sj.ys;FROM图书馆管理!sjWHEREsj.sjmcLIKE软件工程2024/9/153(4)多个筛选条件的组合使用实际使用中,经常需要查询某一范围内的记录。例如,书籍价格在30元以下或者50元以上的所有书籍,或者书籍页数在300页以上且价格在40元以上的书籍等。由于可能同时需要输入两个筛选条件,因此需要考虑筛选条件之间的关系问题。在VFP中,筛选条件间共有三种关系,即与(and)、或(or)和否(not)。例如,“书籍价格在30元以下或
42、者50元以上”可写成sj.jg=50,而“书籍页数在300页以上且价格在40元以上的书籍”可写成sj.ys=300andsj.jg=40。在“筛选”选项卡中,可同时输入多个筛选条件,每一个筛选条件占一行,行与行之间的缺省逻辑关系是“与”(AND),当选择其他关系时,可通过逻辑项对应行的列表来选择。2024/9/154(4)多个筛选条件的组合使用(续)【例4.20】设置“与”筛选条件。前面已经分析过,“书籍页数在300页以上且价格在40元以上的书籍”,可看成两个筛选条件的组合,即sj.ys=300andsj.jg=40。首先建立筛选条件sj.ys=300,然后再建立另一个筛选条件sj.jg=40
43、。由于两个筛选条件之间是“与”的关系,因此不用设置“逻辑”选项。对应的SELECT语句如下:SELECTsj.sjmc,sj.jg,sj.ys;FROM图书馆管理!sjWHEREsj.ys=300andsj.jg=40 2024/9/155(4)多个筛选条件的组合使用(续)【例4.21】设置“或”(OR)筛选条件。统计“书籍价格在30元以下或者50元以上”的所有书籍,其筛选条件可写成sj.jg=50。在“筛选”选项卡中首先建立两个筛选条件,第一个是sj.jg=50。由于两个筛选条件是“或”关系,因此,还要在第一个筛选条件对应的“逻辑”下拉列表中选择OR运算符。对应的SELECT语句如下:SEL
44、ECTsj.sjmc,sj.jg,sj.ys;FROM图书馆管理!sjWHEREsj.jg=502024/9/156(4)多个筛选条件的组合使用(续)【例4.22】设置“非”(NOT)筛选条件。查询“所有书名不是软件工程的书籍”。考察“所有书名不是软件工程的书籍”和“所有书名是软件工程的书籍”是互为否定的。“所有书名是软件工程的书籍”可写成“LIKE”软件工程“”,可先设置筛选条件“LIKE”软件工程“”,然后单击该筛选条件行对应的“否”按钮。对应的SELECT语句是:SELECTsj.sjmc,sj.jg,sj.ys;FROM图书馆管理!sjWHEREsj.sjmcNOTlike软件工程20
45、24/9/1575定向输出查询结果VFP允许查询结果以不同的形式输出。例如,可输出到文件、打印机、临时表和屏幕等。缺省形式是将查询结果显示在浏览窗口中。选择查询结果输出形式的方法是:(1)从“查询”菜单中选择“查询去向”命令,打开“查询去向”对话框,如图4-14所示。打开该对话框的另一个方法是在“查询设计器”工具栏中单击“查询去向”按钮。(2)“查询去向”对话框中列出了7个查询结果的输出形式,且均以按钮形式给出。选择需要的按钮,并单击“确定”按钮即可。 图图4-14 “查询去向查询去向”对话框对话框2024/9/1585定向输出查询结果(续)定向输出对应的SELECT子句是INTODestin
46、ation子句。表4-5为该子句常用格式。如输出到临时表“学生成绩清单”中可写成“INTOCURSOR学生成绩清单”,输出到活动窗口中,可写成TOSCREEN。如果只想暂时保存结果,可将它们发送到数组或临时表中。若要永久保存结果,将它发送到一个表中。查询结果输出形式SELECT子句格式独立的表INTOTABLE表名称数组INTOARRAY数组名称临时表INTOCURSOR临时表名称活动窗口TOSCREEN浏览窗口系统缺省值表表4-5 定向输出查询结果子句形式定向输出查询结果子句形式2024/9/1594.4.2运行查询1运行查询在完成了查询设计并指定了输出目的地后,可以单击“运行”按钮启动该查
47、询,也可以在命令窗口使用DO命令。例如,运行“数籍价格”查询,可在命令窗口输入:DO书籍价格.qpr 2024/9/1602分组查询(1)分组查询。所谓分组就是将一组类似的记录压缩成一个结果记录,这样就可以完成基于一组记录的计算。【例4.23】将读者按家庭住址分组。操作步骤如下:1)新建一个“按读者住址查询”,选择读者表的所有字段。2)选择“分组依据”选项卡,选择dz.jtzz,并单击“添加”按钮。3)为保证分组正确,在“排序依据”选项卡中设置排序条件。例如dz.dzbh。4)运行查询,结果如图4-15所示。 2024/9/161(1)分组查询(续)【例4.24】统计在书籍表中每个出版社出版的
48、书籍的数目。操作步骤如下:1)建立一个查询,选择sj表中的所有字段,在“分组依据”选项卡中选择sj.cbs,在“排序依据”选项卡中选择sj.sjbh。2)在“字段”选项卡中,在“函数和表达式”框中输入“count(sj.cbs)as数量”,并单击“添加”按钮。3)运行查询,其结果如图4-16所示。图图4-16 统计出版社的出版数量统计出版社的出版数量2024/9/162(2)为查询增加计算字段【例4.25】统计每个出版社的所出书中价格最低的书籍,可按如下步骤操作:1)创建一个查询,选择书籍表中的sj.sjmc、sj.sjzz、sj.jg,sj.ys。2)选择“字段”选项卡,在“函数和表达式”文
49、本框中输入“MIN(sj.jg)AS最便宜的图书”。3)单击“添加”按钮。4)选择“分组依据”选项卡,选择sj.cbs,并单击“添加”按钮。5)若需要排序,此时可在“排序依据”选项卡中设置排序条件,如sj.ys。“MIN(sj.jg)AS最便宜的图书”是一个函数表达式,在查询结果中以“最便宜的图书”名称给出。此列不是表中原有的字段,而是在生成查询的过程中经过计算得到的,又称为计算列或计算字段。2024/9/163(2)为查询增加计算字段(续)VFP提供了“字符串、数学、逻辑和日期”4类函数。表4-6列出了在SELECT-SQL中经常使用的列函数。列函数均产生一个单值,因此以下查询求出所有图书的
50、总价格。SELECTsj.mcsj.jgsj.sjbhSUM(sj.jg)AS总价格;FROMsj函数功能AVG(列名)求出指定列上的平均值,只适用于数字类型的列SUM(列名)求出指定列上的和。只适用于数字类型的列MIN(列名)求出指定列上的最小值。列可以是数字型、字符型或日期型MAX(列名)求出指定列上的最大值,列可以是数字型、字符型或日期型COUNT(列名)求出指定列上的值的出现个数表表4-6 常用列函数常用列函数2024/9/164(2)为查询增加计算字段(续)在“函数和表达式”文本框中输入函数可以使用表达式生成器,单击“函数和表达式”文本框旁的“.”按钮可启动表达式生成器,如图4-17
51、所示。在表达式生成器中,有“字符串、数学、逻辑和日期”4类函数,每一类函数对应一个下拉列表,在列表中可选择相应的函数,然后再输入相应的变量。图图4-17 表达式生成器表达式生成器2024/9/165(2)为查询增加计算字段(续)例,“SUM(sj.jg)AS总价格”函数的输入方法如下:1)在“数学”下拉列表中选择SUM函数,表达式文本框中出现SUM(expN)。2)选取expN。3)在“字段”列表框中选择需要的字段变量或从键盘输入相应的表达式,例如si.jg以便代替expN。4)在“表达式”文本框的SUM函数后添加“AS总价格”,将表达式修改成“SUM(sj.jg)AS总价格”。5)单击“检验
52、”按钮可检验输入的表达式的正确性,若正确无误后,可单击“确定”按钮,返回查询设计器。此时在“函数和表达式”框中出现“SUM(sj.jg)AS总成绩”。6)单击“添加”按钮,“总成绩”项将出现在查询结果中。2024/9/166(2)为查询增加计算字段(续)【例4.26】已知sj表,可以使用AVG()列函数求每个出版社的书籍的平均价格。下面给出SELECT语句:SELECTsj.mc,sj.jg,sj.ys,sj.sjzz,;AVG(sj.jg)AS平均价格;FROMsj;GROUPBYsj.cbs;ORDERBYsj.sjbh【例4.27】在“统计平均价格”查询中,添加“总价格”列。相应的SEL
53、ECT语句如下:SELECTsj.mc,sj.jg,sj.ys,sj.sjzz,;AVG(sj.jg)AS平均价格,SUM(sj.jg);FROMsj;GROUPBYsj.cbs;ORDERBYsj.sjbh2024/9/1673筛选分组WHERE、HAVING子句都能为查询提供过滤条件。一般来说,HAVING子句用来过滤GROUPBY后的分组结果,用WHERE子句过滤一般表的元组。下面SELECT语句输出家住在北京且读者编号小于2006005的读者记录。SELECTDz.dzbh,Dz.dzxm,Dz.jtzz,Dz.dznl;FROM图书馆管理!dz;WHEREDz.jtzz=北京ANDD
54、z.dzbh20060005;GROUPBYDz.dzbh;ORDERBYDz.dzbh如果要查询年龄小于等于30的读者,可继续修改SELECT语句:SELECTDz.dzbh,Dz.dzxm,Dz.jtzz,Dz.dznl;FROM图书馆管理!dz;WHEREDz.jtzz=北京ANDDz.dzbh20060005;GROUPBYDz.dzbh;ORDERBYDz.dzbh;HAVINGDz.dznl=302024/9/1684查询多个表数据库中的表之间的关系可由表间的公共字段体现。例如,“图书馆管理”数据库中,表dz.dbf、jy.dbf和sj.dbf、dz.dbf和jy.dbf之间由公共
55、字段dzbh相连接,jy.dbf和sj.dbf之间由公共字段sjbh相连接。当需要获取存储在两个或更多表或视图中的信息时,需要指出这些表或视图之间的连接关系。使用SELECT-SQL的INNERJOIN子句可完成表间的连接。2024/9/1694查询多个表(续)在VFP中,表之间的连接有4种类型,如表4-8所示。 连接类型查询内容(条件)内部连接(INNER)两个表中仅满足条件的记录,这是最普通的连接类型左连接表中在连接条件左边的所有记录,和表中连接条件右边的且满足连接条件的记录右连接表中在连接条件右边的所有记录,和表中连接条件左边的且满足连接条件的记录完全连接表中不论是否满足条件的所有记录表
56、表4-8 表间联接类型及使用条件表间联接类型及使用条件2024/9/1704查询多个表(续)在多表间建立查询和单表基本相同,惟一不同的是要指明表间的关系。【例4.28】统计借书的读者和他们所借的书籍,要求包括“读者姓名”和“书籍名称”等字段。1)首先打开“图书馆管理”数据库,然后打开查询设计器。因为本例要求包含“读者姓名”和“书籍名称”,故需添加dz.dbf、sj.dbf和jy.dbf三个表。2)选定要包含在查询结果中的字段。在“字段”选项卡中,从“可用字段”列表框中选择需要的字段,单击这些字段,再单击“添加”按钮;或者双击需要的字段。相应的SELECT语句是:SELECTDz.dzxm,sj
57、.sjmc,Jy.cjrq,Jy.sjbh;FROM图书馆管理!dzINNERJOIN图书馆管理!jy;INNERJOIN图书馆管理!sj;ONsj.sjbh=Jy.sjbh;ONDz.dzbh=Jy.dzbh2024/9/1714查询多个表(续)图4-18列出了上例选择的全部字段。单击“运行”按钮可看到例4.28的查询结果,如图4-19所示。图图4-18 例例4.28选定的字段选定的字段图图4-19 例例4.28查询结果查询结果2024/9/1724.5报表和标签报表和标签是将需要的数据表格化的重要工具。本节主要介绍如何快速创建报表,并将应用程序有机地连接起来。2024/9/1734.5.1
58、VisualFoxPro的报表和标签报表包括两个基本组成部分:数据源和布局。数据源通常是数据库中的表,或是视图、查询或临时表。报表布局定义了报表打印格式。在定义表和视图或查询后,便可创建报表或标签。创建报表的过程包括定义报表的样式并指定数据源。系统将报表样式保存在报表文件中,报表文件的扩展名为.frx,其相关文件是.frt。报表文件指定了想要的字段、要打印的文本(数据源)及数据在页面上的位置。报表文件不存储每个数据字段的值,只存储特定数据库或表中各字段值在报表中的位置和格式信息。标签的创建过程和创建报表基本相同,标签保存在.lbx文件中,相关文件为.lbt。2024/9/1741创建报表布局创
59、建报表之前,首先应该确定报表的常规格式,系统提供了几种基本的报表布局,列报表、行报表、一对多报表、多栏报表和标签。每种报表布局的一般用途如表4-8所示。用户可以使用“报表设计器”进行修改布局,直至符合用户的要求为止。布局类型说明示例列报表每行一条记录,每条记录的字段在页面上按水平方向放置分组/总计报表、财政报表、存货清单和销售总结行报表每列一字段,每条记录的字段在一侧竖直放置列表一对多一条记录或一对多关系发票多列多列记录,每条记录的字段沿左边缘竖直放置电话号码薄,名片标签多列的记录,每条记录的字段左边缘竖直放置,打印在特殊纸上邮件标签,名签表表4-8 报表常规布局及用途报表常规布局及用途202
60、4/9/175(1)用报表向导创建报表VFP6.0提供了3种方法创建报表布局:用报表向导创建简单的单表或多表的布局用快速报表从单表中创建一个简单报表用报表设计器修改已有的报表或创建自己的报表。每种方法创建的报表布局文件都可以用“报表设计器”进行修改。“报表向导”是创建报表的最简单途径,它自动提供很多“报表设计器”的定制功能。“快速报表”是创建简单布局的最迅速途径。直接在“报表设计器”内创建报表,“报表设计器”提供一个空白布局。 2024/9/176(2)用“快速报表”命令创建报表详细步骤如下:1)在“文件”菜单中选择“新建”命令,打开“新建”对话框,并在该对话框中选择“报表”单选按钮,然后单击
61、“新建文件”命令按钮。此时将打开“报表设计器”,同时在菜单中增加“报表”菜单项,如图4-20所示。2)在“报表”菜单中选择“快速报表”命令,此时出现“打开”对话框,用户可在此对话框中选择报表要使用的表或视图。例如选择dz.dbf表。3)选择完报表要使用的数据源后,系统出现“快速报表”对话框,如图4-21所示。在“快速报表”对话框中,提供了简单的字段布局,例如列布局或行布局。2024/9/177(2)用“快速报表”命令创建报表(续)4)可在字段布局、标题和别名选项中做出选择。如果不想让表中的所有字段全部出现在报表中,可单击“字段”按钮,在字段选择器对话框中选择适当的字段后,单击“确定”按钮,返回
62、“快速报表”对话框。5)在“快速报表”对话框中单击“确定”按钮返回报表设计器。用户所做的选择反映在报表设计器中。用户可在报表设计器中继续修改报表,直至符合要求为止。图图4-20 “报表报表”菜单项菜单项图图4-21 “快速报表快速报表”对话框对话框2024/9/178(3)使用报表设计器创建报表报表设计器可用来设计报表布局,规划数据在页面上的打印位置以及添加各种组件。可通过“文件”菜单的“新建”命令,打开一个具有空白报表的报表设计器;也可以通过“文件”菜单的“打开”命令,打开一个已存在的报表。图4-22是报表设计器窗口。图图4-22 报表设计器窗口报表设计器窗口2024/9/179(3)使用报
63、表设计器创建报表(续)【例4.29】已知有dz.dbf表,请设计一个报表,显示读者信息。1)打开报表设计器2)单击“报表”菜单的“快速报表”命令。3)选择需要的表。本例选择表dz.dbf,此时已生成了一个简单的表。单击“打印预览”按钮可看到运行结果。2024/9/180(4)报表带区VFP将报表的不同部分定义成不同的带区,不同的带区可根据需要在报表设计器中进行增加或取消。图4-22中列出了报表完整的带区,表4-9给出了这些带区的用途。名称用途添加方法标题每报表出现一次,用来放置标题、日期、页码、公司标志或围绕标题的各种式样的框从“报表”菜单中选择“标题/总结”带区页标头每页面出现一次,用来放置
64、日期、页码和列标题默认组标头每组出现一次,组标头个数和分组数相等,用来放置分组字段和分隔线等从“报表”菜单中选择“数据分组”细节带区每记录出现一次,用来放置数据和说明性文本等默认组注脚区每组出现一次,用来放置分组总计、小计文本等从“报表”菜单中选择“数据分组”页注脚每页面出现一次,用来放置日期、页码、分类总计及说明性文本等默认总结每报表出现一次,用来放置有关总计文本从“报表”菜单中选择“标题/总结”带区表表4-9 报表带区用途报表带区用途2024/9/1812打开报表布局利用下面的命令可打开如图4-22所示的报表设计器:MODIFYREPORT报表名称其中,报表名称文件的扩展名是.frx。已创
65、建的报表布局不符合设计要求时,可利用报表设计器修改。用报表设计器可更改数据环境、页面设置或报表控件。数据环境定义了报表中将包含的数据源,而页面设置定义了报表页面和报表带区的总体形状,报表控件定义了出现于页面上的数据项。修改报表布局主要包括设置报表数据环境,修改报表带区,修改或添加控件,调整控件位置和大小,定义字段格式,更改报表中的字体,添加线条、矩形和圆形,向报表添加图片,向报表添加注释、在布局上分组数据等。2024/9/1823报表控件的使用(1)控件工具栏在报表设计器中可插入各种控件,包括标签、字段、变量和表达式。如图4-23所示是报表设计器中的控件工具栏。表4-10列出了报表控件及其作用
66、。控件名称作用域用来显示表的字段、变量和其他表达式标签用来显示文本线条用来显示直线矩形用来显示框和边界圆角矩形用来显示圆、椭圆、圆角矩形和边界图片/ActiveX用来显示位图或通用字段表表4-10 报表控件名称及作用报表控件名称及作用图图4-23 控件工具栏控件工具栏2024/9/183(2)添加域控件可以采用以下方式之一添加域控件:1)从数据环境中添加字段。在报表设计器中,打开报表数据环境,选择需要的表或视图,并将需要的字段拖放到报表布局上。2)从工具栏添加字段。在报表控件工具栏中:选择“域控件”,弹出如图4-24所示的报表表达式对话框;然后在“报表表达式”对话框中,选择“表达式”框后的“”
67、按钮,出现“表达式生成器”对话框,如图4-25所示。在“表达式生成器”对话框的“字段”列表框中,列出了已添加到数据环境中的表或视图中包含的字段,双击想要的字段名。表名和字段名将出现在“报表字段的表达式”框内;最后,单击“检验”按钮,可检验表达式的正确性。2024/9/184(2)添加域控件(续)图图4-24 “报表表达式报表表达式”对话框对话框图图4-25 “表达式生成器表达式生成器”对话框对话框 2024/9/185(3)选择和移动报表控件可通过移动或者改变的大小来调整报表布局上已存在控件的布局。选择控件的方法是:1)选择单个控件:单击控件,已选择的控件周围会出现若干个黑色控点。2)选择多个
68、控件:按住Shift键,单击要选择的控件或者在控件周围拖动,将需要选择的控件均置于拖出的方框中。已选择的多个控件可一起移动、复制、删除或改变格式。控件在布局内移动位置的增量并不是连续的。增量取决于网格的设置。按住Ctrl键再拖动控件时,则可忽略网格的作用。2024/9/186(4)调整控件大小1)手动调整控件大小:首先选择要调整大小的控件,然后将鼠标指针指向控件周围的控点,最后拖动即可。2)自动匹配控件大小:先选定这些控件,再单击“格式”菜单中的“大小”命令。“大小”命令中提供了5种调整控件的方法,分别是“对齐网格”、“调整到最高”、“调整到最窄”、“调整到最宽”、“调整到最短”,可按照需要选
69、择,系统自动匹配控件大小。2024/9/187(5)对齐报表控件将彼此有关系的控件相互对齐,以便它们能整齐地显示或打印在表格中。VFP6.0中提供了若干种对齐选项,主要有左对齐、右对齐、底对齐和顶对齐等13种,如图4-26所示。按先选取要对齐的控件再单击控件工具栏中的相应对齐按钮的方法操作。图图4-26 布局工具栏布局工具栏2024/9/1884报表分组系统允许在一个报表中添加一个或多个组,已建立的分组可根据需要改变组的顺序,重复组标头或者更改或删除组带区。报表分组之后,报表布局就有了组标头和组注脚带区,可向其中添加控件。组注脚通常包含组总计和其他组总结性信息。报表分组并不重排数据记录,只是按
70、记录原来的顺序进行分组,而不会将表中所有具有相同分组特性的记录分在一个组。报表内最多可定义20级数据分组。嵌套分组有助于组织不同层次的数据和总表达式。2024/9/189(1)添加单个组一个单组报表具有基于输入表达式的一级数据分组。例如,在前面建立的dz表中,按读者性别进行分组,即将女读者放在一组,男读者放在另一组。1)从“报表”菜单中选择组,打开“数据分组”对话框。2)在“数据分组”对话框中,输入分组表达式,或者单击分组表达式框后面的“”按钮,在表达式生成器中输入分组表达式。本例的表达式是:dz.dzxb=“女”。3)在组属性区域中选定想要的属性。组属性主要用来为组指定页面分隔选项VFP6.
71、0提供了4个选项。4)添加表达式后,可在带区内放置任何希望的控件。例如,说明性文字、求和、求平均值,以及求分组个数统计等。2024/9/190(1)添加单个组(续)图4-27显示了增加组带区后的报表设计器画面,其中只选了读者表中的4个属性。图4-28是报表的运行结果。图图4-27 添加一个报表设计器添加一个报表设计器图图4-28 本例的报表本例的报表2024/9/191(2)添加多个数据分组若要添加多个数据分组,可从“报表”中选择“数据分组”。在第一个“分组表达式”框下方键入新的分组表达式,然后在“组属性”区域选择想要的属性。分组顺序将利用“组注脚X”(其中X=1,2,3,.)来标识其次序。2
72、024/9/192(3)更改组带区若要更改分组表达式和组打印选项,可从“报表”菜单中选择“数据分组”,然后在“数据分组”对话框中选定要更改的分组表达式,并输入新的表达式。(4)删除组带区若要删除组带区,可从“报表”菜单中选择“数据分组”,选定希望删除的组,然后选择“删除”按钮,则该组带区将从布局中删除。2024/9/1935使用标签向导标签是多列报表布局。在VFP6.0中,提供“标签向导”、标签设计器和语言三种方法创建标签。用户可根据标签向导提示逐步完成标签的布局设计。使用标签向导完成的标签布局不一定完全符合用户的要求,用户还可以使用“标签设计器”进行修改布局,直至符合用户的要求为止。2024
73、/9/1946标签设计器标签设计器是报表设计器的一部分,它们使用相同的菜单和工具栏。设计标签和设计报表的方法是一样的。详细请参见“报表设计”部分。2024/9/1957预览报表报表在设计过程中或设计完成后,可通过报表预览查看报表的页面外观;检查数据列的对齐和间隔;查看报表是否返回希望的数据。可以采用以下方式之一预览报表:菜单方法。从“显示”菜单中选择“预览”,或单击“常用”工具栏中的“预览”按钮。命令方法。VFP6.0提供了命令方法预览报表或标签。命令格式如下:REPORTFORM报表名称PREVIEW2024/9/1968打印报表可以采用以下方式之一打印报表:菜单方法:从“文件”菜单中选择“
74、打印”命令,在弹出的“打印选项”对话框中,可配置有关打印机的属性、纸张大小、打印份数和打印页码范围。命令方法:此方法可直接写入程序中。例如,将“读者表”报表送打印机打印,可执行下述命令:REPORTFORM读者表TOPRINTER打印报表时,通过提供选择条件可限制出现在报表中的记录数目;通过指定一个数量或范围为记录选择范围;生成FOR表达式来选定与条件相匹配的记录;生成WHILE表达式来选定记录直到发现与条件不匹配的记录为止。2024/9/1974.5.2向应用程序添加报表和标签向应用程序添加报表和标签主要包括:控制数据源定义报表页面和报表变量在域控件中使用表达式和函数域控件格式化控制报表和标
75、签的输出集成查询和报表2024/9/1981控制数据源数据环境定义了报表中包含的数据源。所谓数据源就是用来填充到报表中的数据所在的表或视图。向数据环境中添加表或视图的方法如下:(1)从“显示”菜单中选择“数据环境”命令,打开数据环境设计器。(2)选择“数据环境”菜单的“添加”命令,此时若已经打开了某个数据库或视图,将出现“添加表或视图”对话框,否则将出现“打开”对话框。(3)选择要添加到数据环境中的表或视图,在“添加表或视图”对话框中单击“添加”按钮,在“打开”对话框中单击“确定”按钮,系统返回到“添加表或视图”对话框中。(4)单击“关闭”按钮。2024/9/1992定义报表页面和报表变量(1
76、)修改报表布局和更改报表页面。修改已设计好的报表或标签,可按以下方法操作:1)设计报表带区内容。使用报表带区可以决定报表的每页、分组及开始与结尾的样式。选择“报表”菜单中的“标题/总结”,弹出如图4-29所示的“标题/总结”对话框;然后单击“标题带区”和“总结带区”复选框,最后单击“确定”按钮,则报表设计画面如图4-30所示。在“标题/总结”对话框中,两个“新页”复选框用于决定打印完标题带区或总结带区后是否走一页纸。2)修改表带区。在“报表设计器”中,可以通过拖动带区栏达到适当高度,来调整每个带区的带区大小。2024/9/11002定义报表页面和报表变量(续)3)放置控件。向标题带区放置图片和
77、标题文字等控件。在本例中,分别向标题带区放一图片和标题文字,并在细节区上下画一条直线以分离记录。4)报表预览。单击报表预览按钮,运行结果如图4-31所示。图图4-29 “标题标题/总结总结”对话框对话框图图4-30 增加总结带区的报表设计器窗口增加总结带区的报表设计器窗口2024/9/11012定义报表页面和报表变量(续)5)更改页面。页面设置定义了报表页面和报表带区的总体形状。从“文件”菜单中选择“页面设置”。在如图4-32所示的对话框中,各选项的意义如下:页面布局:提供页面的一种图形表示,反映报表或标签设计器中的布局,以及在“页面布局”对话框中选择或键入的设置值。列数:指定页面上要打印的列
78、数。宽度:指定一列的宽度,以英寸或厘米为单位。间隔:指定列之间的空间,以英寸或厘米为单位。单位:指定计算列宽和间隔的单位(英寸或厘米)。打印区域:如选择“可打印页”选项,则指定由当前选用的打印机驱动程序确定最小页边距。如选择“整页”选项,则指定由打印纸尺寸确定最小页边距。打印顺序:在用户有多列时,指定记录如何换行。左页边距:指定左边距宽度,以英寸或厘米为单位。打印设置:显示“打印设置”对话框,从中可以选择打印机、打印机路径和纸张设置。 2024/9/1102(2)定义报表变量在报表中使用报表变量,可以计算各种值,并且可以用这些值来计算其他相关值。定义报表变量的步骤如下:1)打开或创建一个报表。
79、2)从“报表”菜单中选择“变量”命令,弹出“报表变量”对话框,如图4-33所示。3)在“报表变量”对话框中,选择“变量”框并键入一变量名。4)在“要存储的值”框中,键入一个字段名或其他表达式。5)选择合适的计算选项。6)在“初始值”框中键入一个设置初始值的表达式。7)单击“确定”按钮。2024/9/11033将域控件连接成字段表达式添加表字段后,可能出现它们没有按所设想的方式打印在页面上的情况。【例4.30】将读者报表中的的dzbh和jtzz字段连接成一个字段表达式。1)从“报表控件”工具栏中插入一个“域控件”,或者双击dzbh字段域打开“报表表达式”对话框。2)在“报表表达式”对话框选择“表
80、达式”框后的“”按钮。3)在表达式生成器中,从“字符串”框中选择ALLTRIM(expC)。4)双击字段dzbh。该字段名将取代expC,变成ALLTRIM(dz.dzbh)。5)在ALLTRIM(dz.dzbh)函数后键入加号(+)或者从“数学”框中选定“+”。6)从“字符串”框中选定“文本”,此时在“报表字段的表达式”框的“+”号出现一对双引号(“”)。在双引号中输入分隔符。2024/9/11043将域控件连接成字段表达式(续)7)对其他字段重复3)6)步完成表达式,然后选择“确定”按钮。生成的表达式如下(表达式中每行最后的分号“;”表示续行):ALLTRIM(dx.dzbh)+,+;AL
81、LTRIM(dz.jtzz)+,+;8)删除重复的dzbh、jtzz字段域。添加字段表达式后的运行结果如图4-34所示。图图4-34 添加字段表达添加字段表达式后的读者报表式后的读者报表2024/9/11054定义域控件格式插入“字段”控件后,可更改该控件的数据类型和打印格式。数据类型有字符型、数值型或日期型。每一数据类型都有自己的格式选项,包括创建格式模板的选项。格式决定打印报表或标签时,字段的显示形式。可直接在“报表表达式”对话框中的“报表字段的表达式”框输入格式函数,也可从“格式”对话框中选择选项。格式函数和SAY命令的PICTURE子句相同。PICTURE子句主要有三种功能符:字符型、
82、数字型和日期型,这些在“格式”对话框中均有体现。 2024/9/11064定义域控件格式(续)PICTURE子句包括功能符和匹配符两种。功能符影响该输入输出项所有位的格式,如表4-11所示。匹配符只限制指定位的单个字符,如表4-12所示。使用时,功能符和匹配符需要用定界符括起来,并且在PICTURE子句中使用功能符时,功能符前必须冠以符号,且功能符在前,匹配符在后,两者之间须用空格分隔。2024/9/11074定义域控件格式(续)格式化域控件的方法是,在“报表表达式”对话框中,选择“格式”框后面的“”按钮。在“格式”对话框中,选择字段的数据类型,这些数据类型仅适用于报表控件。它反映了表达式的数
83、据类型,但并不改变表中字段的数据类型。“格式”对话框根据所选择的数据类型显示不同的选项。也可以创建一个格式模板,方法是在“格式”框中输入相应的功能符或匹配符。例如,在格式框中输入Z 999.99,其含义是该字段共有6位,整数有3位,小数2位。仅允许数字型或字符型数据输入数字和正负号。当字段为零时显示为空格。 2024/9/11085控制报表和标签的输出报表输出一般按数据源中记录出现的顺序处理记录。在打印一个报表文件之前,应该检验数据源能否正确地对数据进行排序。如果表是数据库的一部分,创建视图并且把它添加到报表的数据环境中,该视图将排序数据。如果数据源是一个自由表,可创建并运行查询,并将查询结果
84、输出到报表。2024/9/1109(1)打印一定数量或范围的记录限制记录数量的途径是指定记录的数量或范围。使用“范围”选项,可选定一条记录或文件中连续放置的一组记录。单击“打印”对话框中的“选项”按钮,在出现的“打印选项”对话框中单击“选项”按钮,出现“报表和标签打印选项”对话框,可在其中按需要选择“作用范围”:全部(All)、后续(Next)、记录(Record)或其余(Rest)。2024/9/1110(2)建立FOR表达式筛选记录有时,需要打印的记录在表内不是连续分布的,打印的方法是建立一个FOR逻辑表达式筛选出要打印的记录。例如,要打印所有男读者的总成绩:ALLTRIM(查询.dzxb
85、)=“男”(3)建立WHILE表达式筛选记录WHILE条件和FOR条件的建立方法相同。例如,要打印家庭住址为北京的所有记录,可建立如下的WHILE逻辑表达式筛选记录:Dz.jtzz=北京2024/9/11116集成查询和报表用户可以将执行查询或报表的代码添加到应用程序的表单按钮、菜单项或工具栏按钮对象中。添加方法是使用下述命令格式:DO查询名称.qprDO查询名称.frx2024/9/11122024/9/11134.6小结查询的任务是快速、准确地从数据库中检索出需要的信息。报表能直观地反映查询结果。查询设计器和SELECT-SQL语句是创建查询的两种方法。用查询设计器可以直观地设计查询,而SELECT-SQL语句是功能强大的查询语言,可以直接嵌入程序中。分组查询和筛选是检索信息的重要手段。创建表或视图间连接类型和连接方法,是多表查询的重要前提。2024/9/11144.6小结(续)表或视图间的连接类型主要有内部连接、左连接、右连接和完全连接。报表和标签是查询结果的输出形式。编制报表的两个重要步骤是数据和报表布局。数据源是数据库中的表、视图或查询结果,是报表中的数据来源。报表布局主要有列报表、行报表、一对多报表、多栏报表和标签等5种基本类型。2024/9/1115