計(jì)算機(jī)等級(jí)考試二級(jí)VFP機(jī)試試題18

字號(hào):

第十八套
    一、基本操作題(共四小題,第1和2題是7分、第3和4題是8分)
     在考生文件夾下完成如下操作:
     1. 打開"訂貨管理"數(shù)據(jù)庫(kù),并將表order_list添加到該數(shù)據(jù)庫(kù)中。
     2. 在"訂貨管理"數(shù)據(jù)庫(kù)中建立表order_detail,表結(jié)構(gòu)描述如下:
     訂單號(hào) 字符型(6)
     器件號(hào) 字符型(6)
     器件名 字符型(16)
     單價(jià) 浮動(dòng)型(10.2)
     數(shù)量 整型
     3. 為新建立的order_detail表建立一個(gè)普通索引,索引名和索引表達(dá)式均
     是"訂單號(hào)"。
    4. 建立表order_list和表order_detail間的永久聯(lián)系(通過(guò)"訂單號(hào)"字段)。
    本題主要考核點(diǎn):
    將一個(gè)自由表添加到數(shù)據(jù)庫(kù)中、表結(jié)構(gòu)的建立、兩個(gè)表之間建立永久聯(lián)系等知識(shí)點(diǎn)
    本題解題思路:
    第一步:打開考生文件夾下的"訂貨管理"數(shù)據(jù)庫(kù)
    第二步:打開數(shù)據(jù)庫(kù)菜單選擇"添加表(A)",在彈出的"打開"對(duì)話框中,選定考生文件夾下的order_list表,再點(diǎn)擊"確定"即可
    第三步:再次打開數(shù)據(jù)庫(kù)菜單選擇"新建表(N)",在彈出的對(duì)話框中選擇"新建表",并在彈出"創(chuàng)建"對(duì)話框中選定考生文件夾,在輸入表名中填入"order_detail",再點(diǎn)擊保存。
    第四步:在彈出的表設(shè)計(jì)器中按題面的要求依次輸入各個(gè)字段的定義,選擇"索引"標(biāo)簽,在索引名列中填入"訂單號(hào)",在索引類型列中選擇"普通索引",在索引表達(dá)式列中填入"訂單號(hào)",點(diǎn)擊"確定"按鈕,保存表結(jié)構(gòu).
    第五步:?jiǎn)螕暨x中order_list中的主索引"訂單號(hào)",并拖拽到order_detail的"訂單號(hào)"索引上,鼠標(biāo)箭頭會(huì)變成小矩形;釋放鼠標(biāo)后,即出現(xiàn)了關(guān)系符號(hào),這樣便可以建立起永久關(guān)系。
    二、簡(jiǎn)單應(yīng)用(2小題,每題20分,計(jì)40分)
     在考生文件夾下完成如下簡(jiǎn)單應(yīng)用:
     1. 將 order_detail1表中的全部記錄追加到order_detail表中,然后用SQL
     SELECT語(yǔ)句完成查詢:列出所有訂購(gòu)單的訂單號(hào)、訂購(gòu)日期、器件號(hào)、器件
     名和總金額(按訂單號(hào)升序,訂單號(hào)相同再按總金額降序)
     并將結(jié)果存儲(chǔ)到results表中(其中訂單號(hào)、訂購(gòu)日期、總金額取自
     order_list表,器件號(hào)、器件名取自order_detail表)。
     2. 打開modi1.prg命令文件,該命令文件包含3條SQL語(yǔ)句,每條SQL語(yǔ)句中都有
     一個(gè)錯(cuò)誤,請(qǐng)改正之(注意:在出現(xiàn)錯(cuò)誤的地方直接改正,不可以改變SQL
    語(yǔ)句的結(jié)構(gòu)和SQL短語(yǔ)的順序)。
    本題主要考核點(diǎn):
     SQL中的查詢SELECT查詢,聯(lián)接查詢,查詢的排序,查詢的結(jié)果的去向和SELECT中的短語(yǔ)的正確使用。
    解題思路:
    第一小題:將order_detail1中的全部記錄追加到order_detail中,要將一個(gè)表的所有記錄追加到另一個(gè)表中使用APPEND FROM 命令,首先打開order_detail:USE ORDER_DETAIL,在APPEND FROM的后面是要追加到order_DETAIL的表名,這里是order_DETAIL1。查詢表中的數(shù)據(jù)要用到SELECT命令,要查詢的數(shù)據(jù)來(lái)源于ORDER_DETAIL和order_list表,將它們置于FROM的后面,并用逗號(hào)隔開,并分別為它們指定一個(gè)別名DetAlias和 LisAlias;由于是聯(lián)接查詢要指明查詢的條件,將聯(lián)接條件DetAlias.訂單號(hào)=LisAlias.訂單號(hào)放在WHERE短語(yǔ)的后面,同時(shí)要對(duì)結(jié)果集按照訂單號(hào)的升序和總金額的降序進(jìn)行排序,所以要將:訂單號(hào),總金額 DESC放在ORDER BY 短語(yǔ)的后面,結(jié)果集要存儲(chǔ)到results表中,所以要將:results放在INTO TABLE 后面。由于查詢的結(jié)果不是所有的屬性,所以需要指明結(jié)果的屬性,并且訂單號(hào)在兩個(gè)表中都存在,所以要特別指定此屬性來(lái)自那一個(gè)源表(這里用表的別名來(lái)代替)。這樣就形成了一個(gè)完整的查詢語(yǔ)句:
    SELECT LisAlias.訂單號(hào),訂購(gòu)日期,器件號(hào),器件名,總金額;
    FROM ORDER_LIST LisAlias,ORDER_DETAIL DetAlias;
    WHERE LisAlias.訂單號(hào)=DetAlias.訂單號(hào);
    ORDER BY LisAlias.訂單號(hào),總金額 DESC;
    INTO TABLE RESULTS
    第二題:&&所有器件的單價(jià)增加5元
     UPDATE order_detail1 SET 單價(jià) WITH 單價(jià) + 5
     &&這里混淆了SQL語(yǔ)句和FoxPro命令。用SQL語(yǔ)句中的UPDATE可以更新記錄的內(nèi)容,而不是
     &&用WITH,而是用等號(hào)。所以應(yīng)該改為:UPDATE ORDER_DETAIL1 SET 單價(jià)=單價(jià)+5
    &&計(jì)算每種器件的平均單價(jià)
    SELECT 器件號(hào),AVG(單價(jià)) AS 平均價(jià) FROM order_detail1 ORDER BY 器件號(hào) INTO CURSOR lsb
    &&這里將分組的子句GROUP BY與排序的子句ORDER BY相混淆了,這里應(yīng)該用分組的子句&&GROUP BY來(lái)代替排序的子句ORDER BY子句。
    &&查詢平均價(jià)小于500的記錄
    SELECT * FROM lsb FOR 平均價(jià) < 500
     &&在SQL的查詢語(yǔ)句中表示條件的是用WHERE子句,與在FoxPro中的List命令用FOR不同。
    三、綜合應(yīng)用(1小題,計(jì)30分)
     在做本題前首先確認(rèn)在基礎(chǔ)操作中已經(jīng)正確地建立了order_detail表,在簡(jiǎn)單
     應(yīng)用中已經(jīng)成功地將記錄追加到order_detail表。
     當(dāng)order_detail表中的單價(jià)修改后,應(yīng)該根據(jù)該表的"單價(jià)"和"數(shù)量"字段修改
     order_list表的總金額字段,現(xiàn)在有部分order_list記錄的總金額字段值不正
     確,請(qǐng)編寫程序挑出這些記錄,并將這些記錄存放到一個(gè)名為od_mod的表中
     (與order_list表結(jié)構(gòu)相同,自己建立),然后根據(jù)order_detail表的"單
     價(jià)"和"數(shù)量"字段修改od_mod表的總金額字段(注意一個(gè)od_mod記錄可能對(duì)應(yīng)幾
     條order_detail記錄),最后od_mod表的結(jié)果要求按總金額升序排序,編寫的
     程序最后保存為prog1.prg。
    本題主要考核點(diǎn):
    程序的建立方法、程序中循環(huán)結(jié)構(gòu)的使用、SQL查詢語(yǔ)句的使用、記錄的修改方法等知識(shí)點(diǎn)
    本題解題思路:
    第一步:在VisualFoxPro主窗口下按組合鍵Ctrl+N,系統(tǒng)彈出"新建"對(duì)話框,在"文件類型"中選擇"程序",再點(diǎn)擊"新建文件"按鈕,則系統(tǒng)彈出程序編輯窗口;
    第二步:在彈出的窗中中輸入以下代碼:
    SET TALK ON
    SET SAFETY ON
    &&計(jì)算出每個(gè)訂單的總金額
    SELECT 訂單號(hào),SUM(單價(jià)*數(shù)量) AS 總金額;
    FROM ORDER_DETAIL;
    GROUP BY 訂單號(hào);
    INTO CURSOR CurTable
    &&首先應(yīng)該得到每一訂單的總金額。由于同一個(gè)訂單由多種商品組成,所以要求出
    &&同一訂單的總金額應(yīng)該將同一訂單所包含的商品合計(jì)在一起,這就作到了SUM函數(shù)
    &&其分組的依據(jù)是訂單號(hào)放在ORDER BY子句的后面,將結(jié)果集放入一個(gè)臨時(shí)表CurTable,
    &&將臨時(shí)表名CurTable放在INTO CURSOR子句的后面
    SELECT ORDER_LIST.*;
    FROM ORDER_LIST,CurTable;
    WHERE ORDER_LIST.訂單號(hào)=CurTable.訂單號(hào) AND ORDER_LIST.總金額<>CurTable.總金額;
    INTO TABLE OD_MOD
    &&根據(jù)上面所得到的臨時(shí)表中每一訂單的總金額來(lái)得到order_list中不正確的記錄
    &&由于要在一個(gè)查詢中用到另一個(gè)表所以要用到查詢,將它們分別放在FROM子句
    &&的后面,兩個(gè)表名之間用逗號(hào)隔開;在WHERE子句中放入聯(lián)接的條件和查詢的條件
    && ORDER_LIST.訂單號(hào)=CurTable.訂單號(hào) AND ORDER_LIST.總金額<>CurTable.總金額
    &&查詢的結(jié)果集要放入永久表OD_MOD中,將OD_MOD放在INTO TABLE子句的后面
    USE OD_MOD
    DO WHILE NOT EOF() &&遍歷OD_MOD中的每一條記錄
     SELECT CurTable.總金額 FROM CurTable;
     WHERE CurTable.訂單號(hào)=OD_MOD.訂單號(hào);
     INTO ARRAY AFieldsValue
     &&從臨時(shí)表CurTable中得到與當(dāng)前記錄的訂單號(hào)相同的訂單的正確的總金額
     &&將條件CurTable.訂單號(hào)=OD_MOD.訂單號(hào),放在WHERE子句的后面;
     &&將結(jié)果放入一個(gè)數(shù)組變量AFieldsValue中
     REPLACE 總金額 WITH AFieldsValue
     &&用正確的總金額來(lái)代替原來(lái)的總金額
     SKIP
    ENDDO
    CLOSE ALL
    &&先生成一個(gè)臨時(shí)表
    SELECT * FROM OD_MOD ORDER BY 總金額;
    INTO CURSOR CurTable
    &&再?gòu)呐R時(shí)表生成表,并覆蓋原表
    SELECT * FROM CurTable INTO TABLE OD_MOD
    SET TALK OFF
    SET SAFETY OFF
    第三步:?jiǎn)螕?保存"工具欄按鈕,以文件名prog1.prg保存程序文件在考生文件夾下,并運(yùn)行程序。