?? vfp報(bào)表生成器中巧構(gòu)iif.txt
字號(hào):
在VFP 的 報(bào) 表 生 成 器 中 巧 構(gòu)IIF() 函 數(shù) 實(shí) 現(xiàn) 條 件 統(tǒng) 計(jì)
----
一 . 問(wèn) 題 的 提 出
---- 在Visual Foxpro for Windows( 以 下 簡(jiǎn) 稱VFP) 中, 利 用 報(bào) 表 生 成 器 可 以 非 常 容 易、 快 速 地 制 作 一 些 精 美 的 報(bào) 表。 但 是, 我 們 卻 發(fā) 現(xiàn), 在VFP 中 報(bào) 表 生 成 器 存 在 一 個(gè) 不 小 的 缺 憾, 即 它 只 能 讓 所 有 的 記 錄 參 加 統(tǒng) 計(jì), 而 無(wú) 法 對(duì) 其 中 部 分 滿 足 條 件 的 記 錄 進(jìn) 行 統(tǒng) 計(jì)。 在“ 學(xué) 生 成 績(jī) 管 理 系 統(tǒng)” 中, 要 求 在 成 績(jī) 分 析 模 塊 中 打 印 出 如 下 報(bào) 表:
課程名稱 平均分 90分以上人數(shù)
80-90人數(shù) 70-80人數(shù) 60-70人數(shù)
60分以下人數(shù)
高數(shù) ① ②
英語(yǔ)
計(jì)算機(jī)
存放學(xué)生成績(jī)的數(shù)據(jù)表為 SCORE.DBF,數(shù)據(jù)庫(kù)結(jié)構(gòu)如下:
字段名 類型 寬度 小數(shù)位數(shù)
XH N 2
GS N 5 1
YY N 5 1
JSJ N 5 1
---- 以 上 字 段 名 分 別 表 示 學(xué) 號(hào)、 高 數(shù) 成 績(jī)、 英 語(yǔ) 成 績(jī) 和 計(jì) 算 機(jī) 成 績(jī)。
---- 在 這 個(gè) 例 子 里, 在 ① 框 中, 是 對(duì) 所 有 的 數(shù) 據(jù) 記 錄 求 英 語(yǔ) 平 均 分, 可 以 利 用 報(bào) 表 生 成 器 很 快 地 實(shí) 現(xiàn):
---- 1 . 啟 動(dòng) 報(bào) 表 生 成 器
---- 2 . 在“ 頁(yè) 注 腳 區(qū)” 域 設(shè) 置 一 個(gè)“ 域 控 件”, 在“ 表 達(dá) 式” 對(duì) 話 框 中 填 入 SCORE.GS
---- 點(diǎn) 下“ 計(jì) 算” 按 鈕, 在 對(duì) 話 框 中 選 擇“ 平 均 值”, 按 下“ 確 定” 按 鈕 即 可。
---- 但 是 對(duì) 上 表 中 的 ②, 也 用 同 樣 方 法 設(shè) 計(jì) 時(shí), 卻 發(fā) 現(xiàn) 輸 出 的 人 數(shù) 與 實(shí) 際 情 況 有 出 入, 為 什 么 呢 ? 這 就 是VFP 報(bào) 表 生 成 器 的 缺 憾。 因 為 在“ 域 控 件” 的“ 計(jì) 算” 窗 口 中 只 能 選 擇 統(tǒng) 計(jì) 的 類 型“ 計(jì) 數(shù)”, 在“ 表 達(dá) 式” 對(duì) 話 框 中 只 能 指 定 參 于 計(jì) 算 的 數(shù) 據(jù) 字 段 表 達(dá) 式, 而 無(wú) 法 指 定 哪 些 記 錄 參 加 統(tǒng) 計(jì)。 即COUNT FOR SCORE.GS >=90 命 令 中 的FOR 選 項(xiàng) 無(wú) 法 在 此 作 出 設(shè) 定。 該 如 何 解 決 這 個(gè) 問(wèn) 題 呢 ?
二 . 尋 求 解 決
---- 報(bào) 表 生 成 器 實(shí) 現(xiàn) 統(tǒng) 計(jì) 的 原 理 在 于: 逐 條 移 動(dòng) 記 錄 指 針, 把 當(dāng) 前 記 錄 中 由“ 表 達(dá) 式” 對(duì) 話 框 中 所 指 定 的 表 達(dá) 式 值 根 據(jù)“ 計(jì) 算” 中 所 指 定 的 統(tǒng) 計(jì) 類 型 進(jìn) 行 統(tǒng) 計(jì)。 所 以 解 決 問(wèn) 題 的 關(guān) 鍵 是 如 何 處 理“ 表 達(dá) 式” 對(duì) 話 框 并 選 用 適 當(dāng) 的 統(tǒng) 計(jì) 類 型。 這 里 我 想 到 以 下 利 用 程 序 實(shí) 現(xiàn) 的 統(tǒng) 計(jì) 方 式:
S=0 &&S 用 以 存 放 滿 足 條 件 的 記 錄 數(shù)
USE SCORE
DO WHILE NOT EOF()
IF (SCORE.GS>=90)
S=S+1
ENDIF
SKIP
ENDD
---- 上 面 的 程 序 設(shè) 計(jì) 中, 主 要 的 設(shè) 計(jì) 思 路 也 是 逐 條 對(duì) 記 錄 進(jìn) 行 判 定, 若SCORE.GS>=90 則S 加1, 否 則 不 加( 即S=S+0)。 這 樣 對(duì) 人 數(shù) 的 統(tǒng) 計(jì) 就 轉(zhuǎn) 換 成 對(duì)1 的 累 加。 記 錄 指 針 每 移 動(dòng) 一 次, 若 所 指 向 的 記 錄 能 使IF 語(yǔ) 句 的 條 件 表 達(dá) 式 成 立 就 對(duì)1 累 加 一 次。 于 是 機(jī) 會(huì) 出 現(xiàn) 了, 我 們 只 需 要 在“ 表 達(dá) 式” 對(duì) 話 框 中 填 入 一 個(gè) 能 實(shí) 現(xiàn)IF 語(yǔ) 句 功 能 的 合 法 表 達(dá) 式( 因 為 在“ 表 達(dá) 式” 對(duì) 話 框 中 只 能 填 表 達(dá) 式, 不 能 填 語(yǔ) 句), 于 是IIF() 函 數(shù) 成 了 理 所 當(dāng) 然 的 唯 一 的 人 選。 由 于 此 時(shí) 已 轉(zhuǎn) 變 成 對(duì)1 的 累 加, 因 此 在“ 計(jì) 算” 窗 口 中, 統(tǒng) 計(jì) 類 型 只 能 選“ 求 和” 而 不 能 選“ 計(jì) 數(shù)”, 問(wèn) 題 就 迎 刃 而 解 了。 用 這 種 方 法 不 論 數(shù) 據(jù) 庫(kù) 中 的 記 錄 值 增 加、 刪 除 或 發(fā) 生 變 動(dòng), 都 無(wú) 須 對(duì) 報(bào) 表 進(jìn) 行 修 改 即 能 輸 出 最 新 的 統(tǒng) 計(jì) 數(shù) 據(jù)。
三 . 實(shí) 現(xiàn) 步 驟:
---- 1 . 在 報(bào) 表 生 成 器 的“ 頁(yè) 腳 注” 區(qū) 域 實(shí) 現(xiàn), 若 在“ 頁(yè) 標(biāo) 題” 區(qū) 域 統(tǒng) 計(jì), 則 會(huì) 因 為 記 錄 指 針 尚 末 開(kāi) 始 移 動(dòng) 而 無(wú) 法 統(tǒng) 計(jì); 若 在“ 細(xì) 節(jié)” 區(qū) 域 統(tǒng) 計(jì) 則 當(dāng) 記 錄 指 針 每 移 動(dòng) 一 條 記 錄, 就 顯 示 一 次 當(dāng) 前 的 統(tǒng) 計(jì) 結(jié) 果。
---- 2 . 在“ 頁(yè) 腳 注” 區(qū) 域 中 先 在 適 當(dāng) 位 置 用“ 標(biāo) 簽” 工 具 寫(xiě) 上 行、 列 標(biāo) 題。
---- 3 . 在 ② 的 位 置 設(shè) 置 一 個(gè)“ 域 控 件”, 在“ 表 達(dá) 式” 中 填 入:IIF(SCORE.GS >=90,1,0) 在” 計(jì) 算” 窗 口 中 統(tǒng) 計(jì) 類 型 選 擇“ 求 和” 即 可。
---- 4 . 保 存 并 運(yùn) 行, 即 可 看 到 在 指 定 的 位 置 上 顯 示 出 了 高 數(shù) 成 績(jī) 在90 分 以 上 的 學(xué) 生 人 數(shù)。
---- 5 . 其 余 的 空 格 依 次 設(shè) 計(jì)。
---- 6 . 最 后 利 用 畫(huà) 線 工 具 畫(huà) 線 邊 框。
四 . 如 何 構(gòu) 造IIF() 函 數(shù)
---- 在 上 面 的 例 子 中 解 題 的 關(guān) 鍵 在 于 巧 妙 地 構(gòu) 造IIF() 函 數(shù),IIF() 函 數(shù) 的 第 一 個(gè) 參 數(shù) 為 條 件:SCORE.GS >=90, 比 較 好 構(gòu) 造; 而 第 二 個(gè) 參 數(shù) 為 條 件 滿 足 時(shí) 參 加 統(tǒng) 計(jì) 的 數(shù) 據(jù): 1( 在 此 是 加1 運(yùn) 算); 第 三 個(gè) 參 數(shù) 為 條 件 不 滿 足 時(shí) 參 加 統(tǒng) 計(jì) 的 數(shù) 據(jù):0( 在 此 是 不 參 加 累 加, 而 根 據(jù) 報(bào) 表 生 成 器 的 原 理 實(shí) 際 上 必 須 參 加 累 加 但 又 不 影 響 累 加 結(jié) 果, 因 此 只 能 設(shè) 置 成0)。 由 此 可 以 看 出 構(gòu) 造IIF() 函 數(shù) 的 第 二、 三 個(gè) 參 數(shù) 不 僅 要 根 據(jù) 統(tǒng) 計(jì) 的 類 型, 還 需 要 一 定 的 技 巧, 特 別 是 第 三 個(gè) 參 數(shù), 設(shè) 置 起 來(lái) 有 一 定 的 難 度。 以 下 通 過(guò) 一 些 例 子 加 以 說(shuō) 明。
---- 1 . 求 高 數(shù) 成 績(jī) 在90 分 以 上 的 同 學(xué) 的 高 數(shù) 成 績(jī) 總 分:
---- 在 適 當(dāng) 地 方 設(shè) 置“ 域 控 件”, 在“ 表 達(dá) 式” 中 寫(xiě) 上 如 下 的 表 達(dá) 式:
---- IIF(SCORE.GS>=90,SCORE.GS,0)
---- 在” 計(jì) 算” 選 項(xiàng) 中 選 取“ 求 和”,
---- 分 析: 在 這 里, 判 定 某 條 記 錄 是 否 參 加 累 加 的 條 件 是: 高 數(shù) 成 績(jī) 在90 分 以 上, 因 此IIF() 的 第 一 個(gè) 參 數(shù) 為:SCORE.GS>=90; 滿 足 條 件 的 記 錄 中 高 數(shù) 成 績(jī) 參 加 累 加, 因 此 第 二 個(gè) 參 數(shù) 為 SCORE.GS; 不 滿 足 條 件 的 記 錄 不 參 加 累 加, 即 加0, 因 此 第 三 個(gè) 參 數(shù) 為: 0。
---- 2. 求 女 生 英 語(yǔ) 成 績(jī) 的 最 低 分
---- 在 適 當(dāng) 位 置 設(shè) 置“ 域 控 件”, 在“ 表 達(dá) 式” 中 填 寫(xiě):
---- IIF(XS.XB=' 女’,SCORE.YY,101) ; 在“ 計(jì) 算” 窗 口 中 選 擇“ 最 大 值”。
---- 分 析: 在 這 里, 判 定 的 條 件 是: 學(xué) 生 的 性 別, 因 此IIF() 函 數(shù) 的 第 一 個(gè) 參 數(shù) 為:XS.XB=' 女’; 滿 足 條 件 的 記 錄 英 語(yǔ) 成 績(jī) 參 加 比 較, 因 此 第 二 個(gè) 參 數(shù) 為:SCORE.YY; 不 滿 足 條 件 的 記 錄 數(shù) 據(jù) 不 能 參 加 比 較, 而 在 報(bào) 表 生 成 器 中 不 參 加 比 較 是 不 可 能 的, 因 此 應(yīng) 設(shè) 置 成 一 個(gè) 數(shù), 不 影 響 比 較 結(jié) 果。 該 設(shè) 置 成 什 么 呢 ? 由 于 成 績(jī) 肯 定 低 于101 分( 假 設(shè) 滿 分 為100 分), 所 以 第 三 個(gè) 參 數(shù) 設(shè) 置 成:101( 若 設(shè) 置 成 其 它 正 數(shù) 如23, 有 可 能 當(dāng) 所 有 女 生 的 成 績(jī) 都 高 于23 分 時(shí), 出 現(xiàn) 異 常 結(jié) 果; 其 中XS.SB 字 段 存 放 在XS.DBF 中, 并 且 已 與SCORE.DBF 建 立 關(guān) 聯(lián))。 同 理, 若 是 求 最 高 分, 則 第 三 個(gè) 參 數(shù) 就 必 須 設(shè) 置 成:0。
---- 3 . 求 女 生 的 高 數(shù) 成 績(jī) 平 均 分
---- 在 這 里, 由 于VFP 的“ 平 均 值” 統(tǒng) 計(jì) 工 具 會(huì) 根 據(jù)“ 表 達(dá) 式” 中 的 值 先 求 總 和 再 依 據(jù) 記 錄 指 針 移 過(guò) 的 記 錄 數(shù) 求 平 均 分, 而“ 表 達(dá) 式” 對(duì) 話 框 中 的IIF() 函 數(shù) 無(wú) 法 控 制 記 錄 指 針 不 指 向 男 生 的 記 錄。 因 此 必 須 先 自 行 求 出 滿 足 條 件 的 總 分 和 人 數(shù), 再 根 據(jù): 平 均 分= 總 分/ 人 數(shù) 來(lái) 求。 不 論 是 總 分 還 是 人 數(shù), 都 必 須 先 利 用“ 求 和” 和IIF() 函 數(shù) 分 別 統(tǒng) 計(jì), 再 求 平 均 分。 因 此, 我 們 必 須
---- 1) 在“ 命 令” 窗 口 中 打 開(kāi) 數(shù) 據(jù) 庫(kù)SCORE.DBF 和XS.DBF, 并 對(duì) 它 們 根 據(jù) 學(xué) 號(hào) 建 立 關(guān) 聯(lián)。
---- 2) 利 用 主 菜 單 條 上 的“ 報(bào) 表” 下 拉 子 菜 單“ 變 量” 定 義 兩 個(gè) 變 量S 和N, 分 別 如 下:
---- 變 量S: 存 放 女 生 高 數(shù) 成 績(jī) 總 分。 在” 計(jì) 算” 窗 口 中 選 擇“ 求 和”, 在“ 表 達(dá) 式” 對(duì) 話 框 中 填 入: IIF(XS.SB=' 女’,SCORE.GS,0), 并 且 把“ 重 置” 設(shè) 置 成“ 報(bào) 表 尾”。
---- 變 量N: 存 放 女 生 人 數(shù)。 在” 計(jì) 算” 窗 口 中 選 擇“ 求 和”, 在“ 表 達(dá) 式” 對(duì) 話 框 中 填 入:IIF(XS.XB=' 女’,1,0), 并 且 把“ 重 置” 設(shè) 置 成“ 報(bào) 表 尾”。
---- 3) 在“ 頁(yè) 腳 注” 區(qū) 域 中 適 當(dāng) 位 置 設(shè) 一 個(gè)“ 域 控 件”, 在“ 表 達(dá) 式” 對(duì) 話 框 填 入:S/N, 即 大 功 告 成。
五 . 總 結(jié)
---- 從 以 上 可 以 看 出, 在“ 表 達(dá) 式” 對(duì) 話 框 中 靈 活 地 利 用IIF() 函 數(shù) 并 巧 妙 地 構(gòu) 造 參 數(shù), 關(guān) 鍵 在 于 構(gòu) 造 第 二、 三 個(gè) 參 數(shù), 只 要 合 理 設(shè) 置 第 二、 三 個(gè) 參 數(shù), 就 可 以 直 接 快 速 地 在 報(bào) 表 生 成 器 中 實(shí) 現(xiàn) 各 式 各 樣 的 統(tǒng) 計(jì)。
---- 以 上 的 設(shè) 計(jì) 均 已 在Visual Foxpro for Windows 中 實(shí) 現(xiàn)。
--------------------------------------------------------------------------------
中國(guó)計(jì)算機(jī)世界出版服務(wù)公司版權(quán)所有
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -