Database 版 (精华区)

发信人: starstar (星语心愿), 信区: Database
标  题: 在VFP 的 报 表 生 成 器 中 巧 构IIF() 函 数 实 现
发信站: 哈工大紫丁香 (2001年05月19日20:38:15 星期六), 站内信件

一 . 问 题 的 提 出
---- 在Visual Foxpro for Windows( 以 下 简 称VFP) 中, 利 用 报 表 生
 成 器 可 以 非 常 容 易、 快 速 地 制 作 一 些 精 美 的 报 表。 但 是,
 我 们 却 发 现, 在VFP 中 报 表 生 成 器 存 在 一 个 不 小 的 缺 憾, 
即 它 只 能 让 所 有 的 记 录 参 加 统 计, 而 无 法 对 其 中 部 分 满 
足 条 件 的 记 录 进 行 统 计。 在“ 学 生 成 绩 管 理 系 统” 中, 要 
求 在 成 绩 分 析 模 块 中 打 印 出 如 下 报 表: 

课程名称    平均分  90分以上人数
        80—90人数  70—80人数 60—70人数   
       60分以下人数

高数     ①     ②              
英语                        
计算机                      

  存放学生成绩的数据表为 SCORE.DBF,数据库结构如下:
      字段名      类型      宽度     小数位数
         XH         N          2           
         GS         N          5        1 
         YY         N          5        1
        JSJ         N          5        1

---- 以 上 字 段 名 分 别 表 示 学 号、 高 数 成 绩、 英 语 成 绩 和 计
 算 机 成 绩。 

---- 在 这 个 例 子 里, 在 ① 框 中, 是 对 所 有 的 数 据 记 录 求 英
 语 平 均 分, 可 以 利 用 报 表 生 成 器 很 快 地 实 现: 

---- 1 . 启 动 报 表 生 成 器 

---- 2 . 在“ 页 注 脚 区” 域 设 置 一 个“ 域 控 件”, 在“ 表 达 式
” 对 话 框 中 填 入 SCORE.GS 

---- 点 下“ 计 算” 按 钮, 在 对 话 框 中 选 择“ 平 均 值”, 按 下“
 确 定” 按 钮 即 可。 

---- 但 是 对 上 表 中 的 ②, 也 用 同 样 方 法 设 计 时, 却 发 现 输
 出 的 人 数 与 实 际 情 况 有 出 入, 为 什 么 呢 ? 这 就 是VFP 报 表
 生 成 器 的 缺 憾。 因 为 在“ 域 控 件” 的“ 计 算” 窗 口 中 只 能 
选 择 统 计 的 类 型“ 计 数”, 在“ 表 达 式” 对 话 框 中 只 能 指 定
 参 于 计 算 的 数 据 字 段 表 达 式, 而 无 法 指 定 哪 些 记 录 参 加
 统 计。 即COUNT FOR SCORE.GS >=90 命 令 中 的FOR 选 项 无 法 在 此 作 
出 设 定。 该 如 何 解 决 这 个 问 题 呢 ? 

二 . 寻 求 解 决 
---- 报 表 生 成 器 实 现 统 计 的 原 理 在 于: 逐 条 移 动 记 录 指 针
, 把 当 前 记 录 中 由“ 表 达 式” 对 话 框 中 所 指 定 的 表 达 式 值
 根 据“ 计 算” 中 所 指 定 的 统 计 类 型 进 行 统 计。 所 以 解 决 问
 题 的 关 键 是 如 何 处 理“ 表 达 式” 对 话 框 并 选 用 适 当 的 统 
计 类 型。 这 里 我 想 到 以 下 利 用 程 序 实 现 的 统 计 方 式: 

      S=0       &&S 用 以 存 放 满 足 条 件 的 记 录 数
      USE   SCORE
      DO  WHILE   NOT  EOF()
           IF  (SCORE.GS>=90)
                     S=S+1
           ENDIF
           SKIP
     ENDD

---- 上 面 的 程 序 设 计 中, 主 要 的 设 计 思 路 也 是 逐 条 对 记 录
 进 行 判 定, 若SCORE.GS>=90 则S 加1, 否 则 不 加( 即S=S+0)。 这 样
 对 人 数 的 统 计 就 转 换 成 对1 的 累 加。 记 录 指 针 每 移 动 一 次
, 若 所 指 向 的 记 录 能 使IF 语 句 的 条 件 表 达 式 成 立 就 对1 累
 加 一 次。 于 是 机 会 出 现 了, 我 们 只 需 要 在“ 表 达 式” 对 话
 框 中 填 入 一 个 能 实 现IF 语 句 功 能 的 合 法 表 达 式( 因 为 在“
 表 达 式” 对 话 框 中 只 能 填 表 达 式, 不 能 填 语 句), 于 是IIF
() 函 数 成 了 理 所 当 然 的 唯 一 的 人 选。 由 于 此 时 已 转 变 成
 对1 的 累 加, 因 此 在“ 计 算” 窗 口 中, 统 计 类 型 只 能 选“ 求
 和” 而 不 能 选“ 计 数”, 问 题 就 迎 刃 而 解 了。 用 这 种 方 法 
不 论 数 据 库 中 的 记 录 值 增 加、 删 除 或 发 生 变 动, 都 无 须 对
 报 表 进 行 修 改 即 能 输 出 最 新 的 统 计 数 据。 

三 . 实 现 步 骤:
---- 1 . 在 报 表 生 成 器 的“ 页 脚 注” 区 域 实 现, 若 在“ 页 标
 题” 区 域 统 计, 则 会 因 为 记 录 指 针 尚 末 开 始 移 动 而 无 法 
统 计; 若 在“ 细 节” 区 域 统 计 则 当 记 录 指 针 每 移 动 一 条 记
 录, 就 显 示 一 次 当 前 的 统 计 结 果。 

---- 2 . 在“ 页 脚 注” 区 域 中 先 在 适 当 位 置 用“ 标 签” 工 具
 写 上 行、 列 标 题。 

---- 3 . 在 ② 的 位 置 设 置 一 个“ 域 控 件”, 在“ 表 达 式” 中 
填 入:IIF(SCORE.GS >=90,1,0) 在” 计 算” 窗 口 中 统 计 类 型 选 择
“ 求 和” 即 可。 

---- 4 . 保 存 并 运 行, 即 可 看 到 在 指 定 的 位 置 上 显 示 出 了
 高 数 成 绩 在90 分 以 上 的 学 生 人 数。 

---- 5 . 其 余 的 空 格 依 次 设 计。 

---- 6 . 最 后 利 用 画 线 工 具 画 线 边 框。 

四 . 如 何 构 造IIF() 函 数
---- 在 上 面 的 例 子 中 解 题 的 关 键 在 于 巧 妙 地 构 造IIF() 函
 数,IIF() 函 数 的 第 一 个 参 数 为 条 件:SCORE.GS >=90, 比 较 好
 构 造; 而 第 二 个 参 数 为 条 件 满 足 时 参 加 统 计 的 数 据: 1(
 在 此 是 加1 运 算); 第 三 个 参 数 为 条 件 不 满 足 时 参 加 统 计
 的 数 据:0( 在 此 是 不 参 加 累 加, 而 根 据 报 表 生 成 器 的 原 
理 实 际 上 必 须 参 加 累 加 但 又 不 影 响 累 加 结 果, 因 此 只 能 
设 置 成0)。 由 此 可 以 看 出 构 造IIF() 函 数 的 第 二、 三 个 参 
数 不 仅 要 根 据 统 计 的 类 型, 还 需 要 一 定 的 技 巧, 特 别 是 第
 三 个 参 数, 设 置 起 来 有 一 定 的 难 度。 以 下 通 过 一 些 例 子 
加 以 说 明。 

---- 1 . 求 高 数 成 绩 在90 分 以 上 的 同 学 的 高 数 成 绩 总 分: 


---- 在 适 当 地 方 设 置“ 域 控 件”, 在“ 表 达 式” 中 写 上 如 下
 的 表 达 式: 

---- IIF(SCORE.GS>=90,SCORE.GS,0) 

---- 在” 计 算” 选 项 中 选 取“ 求 和”, 

---- 分 析: 在 这 里, 判 定 某 条 记 录 是 否 参 加 累 加 的 条 件 是
: 高 数 成 绩 在90 分 以 上, 因 此IIF() 的 第 一 个 参 数 为:
SCORE.GS>=90; 满 足 条 件 的 记 录 中 高 数 成 绩 参 加 累 加, 因 此 
第 二 个 参 数 为 SCORE.GS; 不 满 足 条 件 的 记 录 不 参 加 累 加, 即
 加0, 因 此 第 三 个 参 数 为: 0。 

---- 2. 求 女 生 英 语 成 绩 的 最 低 分 

---- 在 适 当 位 置 设 置“ 域 控 件”, 在“ 表 达 式” 中 填 写: 

---- IIF(XS.XB=’ 女’,SCORE.YY,101) ; 在“ 计 算” 窗 口 中 选 择“
 最 大 值”。 

---- 分 析: 在 这 里, 判 定 的 条 件 是: 学 生 的 性 别, 因 此IIF(
) 函 数 的 第 一 个 参 数 为:XS.XB=’ 女’; 满 足 条 件 的 记 录 英 
语 成 绩 参 加 比 较, 因 此 第 二 个 参 数 为:SCORE.YY; 不 满 足 条 
件 的 记 录 数 据 不 能 参 加 比 较, 而 在 报 表 生 成 器 中 不 参 加 
比 较 是 不 可 能 的, 因 此 应 设 置 成 一 个 数, 不 影 响 比 较 结 果
。 该 设 置 成 什 么 呢 ? 由 于 成 绩 肯 定 低 于101 分( 假 设 满 分 
为100 分), 所 以 第 三 个 参 数 设 置 成:101( 若 设 置 成 其 它 正 
数 如23, 有 可 能 当 所 有 女 生 的 成 绩 都 高 于23 分 时, 出 现 异 
常 结 果; 其 中XS.SB 字 段 存 放 在XS.DBF 中, 并 且 已 与SCORE.DBF 建 
立 关 联)。 同 理, 若 是 求 最 高 分, 则 第 三 个 参 数 就 必 须 设 
置 成:0。 

---- 3 . 求 女 生 的 高 数 成 绩 平 均 分 

---- 在 这 里, 由 于VFP 的“ 平 均 值” 统 计 工 具 会 根 据“ 表 达 式
” 中 的 值 先 求 总 和 再 依 据 记 录 指 针 移 过 的 记 录 数 求 平 均
 分, 而“ 表 达 式” 对 话 框 中 的IIF() 函 数 无 法 控 制 记 录 指 
针 不 指 向 男 生 的 记 录。 因 此 必 须 先 自 行 求 出 满 足 条 件 的 
总 分 和 人 数, 再 根 据: 平 均 分= 总 分/ 人 数 来 求。 不 论 是 总 
分 还 是 人 数, 都 必 须 先 利 用“ 求 和” 和IIF() 函 数 分 别 统 计
, 再 求 平 均 分。 因 此, 我 们 必 须 

---- 1) 在“ 命 令” 窗 口 中 打 开 数 据 库SCORE.DBF 和XS.DBF, 并 对 
它 们 根 据 学 号 建 立 关 联。 

---- 2) 利 用 主 菜 单 条 上 的“ 报 表” 下 拉 子 菜 单“ 变 量” 定 
义 两 个 变 量S 和N, 分 别 如 下: 

---- 变 量S: 存 放 女 生 高 数 成 绩 总 分。 在” 计 算” 窗 口 中 选 
择“ 求 和”, 在“ 表 达 式” 对 话 框 中 填 入: IIF(XS.SB=’ 女’,
SCORE.GS,0), 并 且 把“ 重 置” 设 置 成“ 报 表 尾”。 

---- 变 量N: 存 放 女 生 人 数。 在” 计 算” 窗 口 中 选 择“ 求 和”
, 在“ 表 达 式” 对 话 框 中 填 入:IIF(XS.XB=’ 女’,1,0), 并 且 把
“ 重 置” 设 置 成“ 报 表 尾”。 

---- 3) 在“ 页 脚 注” 区 域 中 适 当 位 置 设 一 个“ 域 控 件”, 在
“ 表 达 式” 对 话 框 填 入:S/N, 即 大 功 告 成。 

五 . 总 结
---- 从 以 上 可 以 看 出, 在“ 表 达 式” 对 话 框 中 灵 活 地 利 用
IIF() 函 数 并 巧 妙 地 构 造 参 数, 关 键 在 于 构 造 第 二、 三 个
 参 数, 只 要 合 理 设 置 第 二、 三 个 参 数, 就 可 以 直 接 快 速 地
 在 报 表 生 成 器 中 实 现 各 式 各 样 的 统 计。 

---- 以 上 的 设 计 均 已 在Visual Foxpro for Windows 中 实 现。 

--
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.239.32]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:228.543毫秒