Database 版 (精华区)
发信人: mengy (LEAR DLLS 命令时,将从内存中清除), 信区: Database
标 题: 在VFP 的 报表生成器中巧构IIF()函数实现统计
发信站: 哈工大紫丁香 (2000年12月13日09:11:07 星期三), 站内信件
在VFP 的 报 表 生 成 器 中 巧 构IIF() 函 数 实 现 条 件 统 计
----
一 . 问 题 的 提 出
---- 在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.227.121]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:206.110毫秒