就业数据资源平台
当前位置:首页 > Visual FoxPro
计算机等级考试:二级VFP机试第18套

 

第十八套


一、基本操作题(共四小题,第1和2题是7分、第3和4题是8分)



    在考生文件夹下完成如下操作:



    1. 打开"订货管理"数据库,并将表order_list添加到该数据库中。



    2. 在"订货管理"数据库中建立表order_detail,表结构描述如下:



        订单号     字符型(6)



        器件号     字符型(6)



        器件名     字符型(16)



        单价       浮动型(10.2)



        数量       整型



    3. 为新建立的order_detail表建立一个普通索引,索引名和索引表达式均



       是"订单号"。



4. 建立表order_list和表order_detail间的永久联系(通过"订单号"字段)。



本题主要考核点:



将一个自由表添加到数据库中、表结构的建立、两个表之间建立永久联系等知识点



本题解题思路:



第一步:打开考生文件夹下的"订货管理"数据库



第二步:打开数据库菜单选择"添加表(A)",在弹出的"打开"对话框中,选定考生文件夹下的order_list表,再点击"确定"即可



第三步:再次打开数据库菜单选择"新建表(N)",在弹出的对话框中选择"新建表",并在弹出"创建"对话框中选定考生文件夹,在输入表名中填入"order_detail",再点击保存。



第四步:在弹出的表设计器中按题面的要求依次输入各个字段的定义,选择"索引"标签,在索引名列中填入"订单号",在索引类型列中选择"普通索引",在索引表达式列中填入"订单号",点击"确定"按钮,保存表结构.



第五步:单击选中order_list中的主索引"订单号",并拖拽到order_detail的"订单号"索引上,鼠标箭头会变成小矩形;释放鼠标后,即出现了关系符号,这样便可以建立起永久关系。



二、简单应用(2小题,每题20分,计40分)



    在考生文件夹下完成如下简单应用:



    1. 将 order_detail1表中的全部记录追加到order_detail表中,然后用SQL



       SELECT语句完成查询:列出所有订购单的订单号、订购日期、器件号、器件



       名和总金额(按订单号升序,订单号相同再按总金额降序)



       并将结果存储到results表中(其中订单号、订购日期、总金额取自    



       order_list表,器件号、器件名取自order_detail表)。



    2. 打开modi1.prg命令文件,该命令文件包含3条SQL语句,每条SQL语句中都有



       一个错误,请改正之(注意:在出现错误的地方直接改正,不可以改变SQL



语句的结构和SQL短语的顺序)。



本题主要考核点:



     SQL中的查询SELECT查询,联接查询,查询的排序,查询的结果的去向和SELECT中的短语的正确使用。



解题思路:



第一小题:将order_detail1中的全部记录追加到order_detail中,要将一个表的所有记录追加到另一个表中使用APPEND FROM 命令,首先打开order_detail:USE ORDER_DETAIL,在APPEND FROM的后面是要追加到order_DETAIL的表名,这里是order_DETAIL1。查询表中的数据要用到SELECT命令,要查询的数据来源于ORDER_DETAIL和order_list表,将它们置于FROM的后面,并用逗号隔开,并分别为它们指定一个别名DetAlias和 LisAlias;由于是联接查询要指明查询的条件,将联接条件DetAlias.订单号=LisAlias.订单号放在WHERE短语的后面,同时要对结果集按照订单号的升序和总金额的降序进行排序,所以要将:订单号,总金额 DESC放在ORDER BY 短语的后面,结果集要存储到results表中,所以要将:results放在INTO TABLE 后面。由于查询的结果不是所有的属性,所以需要指明结果的属性,并且订单号在两个表中都存在,所以要特别指定此属性来自那一个源表(这里用表的别名来代替)。这样就形成了一个完整的查询语句:



SELECT LisAlias.订单号,订购日期,器件号,器件名,总金额;



FROM ORDER_LIST LisAlias,ORDER_DETAIL DetAlias;



WHERE LisAlias.订单号=DetAlias.订单号;



ORDER BY LisAlias.订单号,总金额 DESC;



INTO TABLE RESULTS



第二题:&&所有器件的单价增加5元



 UPDATE order_detail1 SET 单价 WITH 单价 + 5



 &&这里混淆了SQL语句和FoxPro命令。用SQL语句中的UPDATE可以更新记录的内容,而不是



 &&用WITH,而是用等号。所以应该改为:UPDATE ORDER_DETAIL1 SET 单价=单价+5



&&计算每种器件的平均单价



SELECT 器件号,AVG(单价) AS 平均价 FROM order_detail1 ORDER BY 器件号 INTO CURSOR lsb



&&这里将分组的子句GROUP BY与排序的子句ORDER BY相混淆了,这里应该用分组的子句&&GROUP BY来代替排序的子句ORDER BY子句。



&&查询平均价小于500的记录



SELECT * FROM lsb FOR 平均价 < 500



     &&在SQL的查询语句中表示条件的是用WHERE子句,与在FoxPro中的List命令用FOR不同。




三、综合应用(1小题,计30分)



    在做本题前首先确认在基础操作中已经正确地建立了order_detail表,在简单



    应用中已经成功地将记录追加到order_detail表。



    当order_detail表中的单价修改后,应该根据该表的"单价"和"数量"字段修改



    order_list表的总金额字段,现在有部分order_list记录的总金额字段值不正



    确,请编写程序挑出这些记录,并将这些记录存放到一个名为od_mod的表中



   (与order_list表结构相同,自己建立),然后根据order_detail表的"单



    价"和"数量"字段修改od_mod表的总金额字段(注意一个od_mod记录可能对应几



    条order_detail记录),最后od_mod表的结果要求按总金额升序排序,编写的



    程序最后保存为prog1.prg。



本题主要考核点:



程序的建立方法、程序中循环结构的使用、SQL查询语句的使用、记录的修改方法等知识点



本题解题思路:



第一步:在VisualFoxPro主窗口下按组合键Ctrl+N,系统弹出"新建"对话框,在"文件类型"中选择"程序",再点击"新建文件"按钮,则系统弹出程序编辑窗口;



第二步:在弹出的窗中中输入以下代码:



SET TALK ON



SET SAFETY ON



&&计算出每个订单的总金额



SELECT 订单号,SUM(单价*数量) AS 总金额;



FROM ORDER_DETAIL;



GROUP BY 订单号;



INTO CURSOR CurTable



&&首先应该得到每一订单的总金额。由于同一个订单由多种商品组成,所以要求出



&&同一订单的总金额应该将同一订单所包含的商品合计在一起,这就作到了SUM函数



&&其分组的依据是订单号放在ORDER BY子句的后面,将结果集放入一个临时表CurTable,



&&将临时表名CurTable放在INTO CURSOR子句的后面



SELECT ORDER_LIST.*;



FROM ORDER_LIST,CurTable;



WHERE ORDER_LIST.订单号=CurTable.订单号 AND ORDER_LIST.总金额<>CurTable.总金额;



INTO TABLE OD_MOD



&&根据上面所得到的临时表中每一订单的总金额来得到order_list中不正确的记录



&&由于要在一个查询中用到另一个表所以要用到查询,将它们分别放在FROM子句



&&的后面,两个表名之间用逗号隔开;在WHERE子句中放入联接的条件和查询的条件



&& ORDER_LIST.订单号=CurTable.订单号 AND ORDER_LIST.总金额<>CurTable.总金额



&&查询的结果集要放入永久表OD_MOD中,将OD_MOD放在INTO TABLE子句的后面



USE OD_MOD



DO WHILE NOT EOF()     &&遍历OD_MOD中的每一条记录



    SELECT CurTable.总金额 FROM CurTable;



    WHERE CurTable.订单号=OD_MOD.订单号;



    INTO ARRAY AFieldsValue



    &&从临时表CurTable中得到与当前记录的订单号相同的订单的正确的总金额



    &&将条件CurTable.订单号=OD_MOD.订单号,放在WHERE子句的后面;



    &&将结果放入一个数组变量AFieldsValue中



    REPLACE 总金额 WITH AFieldsValue



    &&用正确的总金额来代替原来的总金额



    SKIP



ENDDO



CLOSE ALL



&&先生成一个临时表



SELECT * FROM OD_MOD ORDER BY 总金额;



INTO CURSOR CurTable



&&再从临时表生成表,并覆盖原表



SELECT * FROM CurTable INTO TABLE OD_MOD



SET TALK OFF



SET SAFETY OFF



第三步:单击"保存"工具栏按钮,以文件名prog1.prg保存程序文件在考生文件夹下,并运行程序。

就业数据资源平台