为 了 保 证 数 据 表 中 存 储 数 据 的 准 确 与 及 时, 并 提 供 正 确 和 及 时 的 查 询, 必 须 对 数 据 表 进 行 人 工 维 护( 包 括 数 据 录 入), 因 此 必 须 开 发 数 据 表 维 护 屏 幕 作 为 人 机 对 话 的 界 面。 而 数 据 表 维 护 屏 幕 要 求 有 新 增( 增 加 新 记 录)、 编 辑( 记 录 修 改)、 删 除( 记 录 删 除) 以 及 漫 游( 指 记 录 指 针 上 移、 下 移、 到 顶、 到 底 和 各 种 查 找 记 录 定 位) 功 能。 同 时 必 须 对 用 户 输 入 的 数 据 进 行 合 法 性 检 查, 特 别 是 对 输 入 关 键 字 的 合 法 性 检 查。 这 些 需 求 给 开 发 数 据 表 维 护 屏 幕 增 加 了 复 杂 性, 为 此 笔 者 使 用 伪 代 码 来 解 决 上 述 问 题。 数 据 表 维 护 屏 幕 的 代 码 虽 然 比 较 复 杂, 但 它 们 都 有 很 强 的 共 性, 可 以 预 先 编 写 一 套 可 被 各 种 不 同 的 数 据 表 维 护 屏 幕 套 用 的 伪 代 码, 以 后 编 写 数 据 表 维 护 屏 幕 代 码 时 就 不 必 从 零 开 始, 而 是 从 伪 代 码 开 始。 伪 代 码 虽 然 不 能 被 直 接 编 译 运 行, 但 大 部 分 开 发 人 员 都 能 把 伪 代 码 改 写 成 正 式 代 码。
---- 下 面 介 绍 在Visual Foxpro 中 使 用 伪 代 码 开 发 数 据 表 维 护 屏 幕 的 方 法。 伪 代 码 由 一 个Custom 类 和 一 些Procdure 构 成。 为 了 方 便 套 用 伪 代 码, 尽 可 能 地 把Form 中 的 嵌 入 代 码 外 移, 在 嵌 入 代 码 中 使 用do ... 下 面 的 伪 代 码 在 使 用 时 绝 大 部 分 无 需 修 改, 仅 是 需 修 改 一 小 部 分, 而 这 一 小 部 分 又 非 常 简 单。 下 面 是 使 用 伪 代 码 设 计 数 据 表 维 护 屏 幕 的 具 体 步 骤。
---- 准 备 工 作
---- 1. 先 建 立 如 下 一 个 工 作 面 表 格
编号 工作面名称 主索引名称 注释
1
2
3
4
.
.
.
16
---- 这 个 表 格 适 用 于 整 个 应 用 程 序。 这 里 所 说 的 工 作 面 与 平 时 所 说 的 有 些 不 一 样, 它 把 处 于 同 一 工 作 面 但 不 同 主 索 引 的 情 况 也 作 为 不 同 的 工 作 面, 使 用 不 同 的 编 号。 2. 根 据 工 作 面 表 格 改 写 以 下 伪 代 码, 使 之 成 为 可 以 编 译 与 运 行 的 正 式 代 码。
{ 伪 代 码 开 始}
public theWorkStat
theWorkStat=CreateObject(“WorkStat”)
* *== 以 下 是 工 作 状 态 类== * *
define class WorkStat as custom
curWS=1
declare Ai[16],Or[16]
* * 以 下 是 工 作 状 态 定 义
* *1
{
Ai[1]=“A1” & & 工 作 面
Or[1]=“O1” & &ORDER 序
Ai[2]=“A2” & & 工 作 面
Or[2]=“” & & 自 然 序, 无 主 索 引
...
* *16
Ai[16〗=“A16”
Or[16〗=“O16”
}
func Get
retu curWS
endfunc
proc Set
para p
sele (Ai[p])
set order to (Or[p])
curWS=p
endproc
func KeyExist
para pws,pk
local n,y,rec
set exact on
n=this.Get();
this.Set(pws)
if eof().or.bof()
rec= -1
else
rec=recno()
endif
seek pk
if found()
y=.t.
else
y=.f.
endif
if rec!= -1
go rec
endif
this.Set(n)
retu y
endfunc
func Find
para pws,pk,IsExact
local n,y,rec
if IsExact
set Exact on
else
set Exact off
endif
n=this.Get();
this.Set(pws)
if eof().or.bof()
rec= -1
else
rec=recno()
endif
seek pk
if found()
y=.t.
else
y=.f.
if rec!= -1
go rec
endif
this.Set(n)
endif
retu y
endfunc
endfine
{ 伪 代 码 结 束}
---- 在 程 序 的 适 当 入 口 处 运 行 这 段 代 码, 运 行 之 后, 当 要 用 的 数 据 表 被 打 开 时 就 可 以 调 用 以 下 对 象:
x=theWorkStat.Get() 取 得 当 前 工 作 面 号;
theWorkStat.Set(n) 把 当 前 工 作 面 设 置 成n 号;
x=theWorkStat.KeyExist(n,key) 测 试 在n 号 工 作 面 中 是 否 存 在 关 键 字key, 存 在 回 送T; 不 存 在 回 送F, 此 函 数 不 改 变 现 状;
x=theWorkStat.Find(n,key,IsExact) 在n 号 工 作 面 中 查 找 关 键 字key。 查 到 则 定 位 之 并 回 送T; 查 不 到 则 不 改 变 现 状 并 回 送F;IsExact 为T 或F 决 定 是 否 按 精 确 匹 配 方 式 查 找。
---- 以 上 这 些 对 象 方 法 在 以 后 的 伪 代 码 中 也 可 以 由 用 户 根 据 需 要 使 用。
---- 判 定 数 据 表 维 护 屏 幕 模 式
---- 笔 者 把 数 据 表 维 护 屏 幕 分 为 以 下 三 种 模 式:
---- 1. 新 增 模 式
---- 在 该 模 式 下 只 有 新 增( 增 加 新 记 录) 功 能, 主 要 用 于 数 据 录 入( 也 有 不 少 数 据 录 入 要 求 对 已 录 入 的 内 容 有 返 回 修 改 的 功 能, 这 就 必 须 使 用 新 增 + 编 辑 模 式)。
---- 2. 编 辑 模 式
---- 在 该 模 式 下 只 有 编 辑、 删 除 与 漫 游 功 能 而 无 新 增 功 能。
---- 3. 新 增 + 编 辑 模 式
---- 在 该 模 式 下 有 新 增、 编 辑、 删 除 与 漫 游 功 能, 可 以 说 是 全 功 能 的。 这 种 模 式 使 用 面 最 广, 占 所 有 数 据 表 维 护 屏 幕 的 一 半 以 上。
---- 改 写 伪 代 码
---- 根 据 选 定 的 模 式 改 写 伪 代 码, 使 之 成 为 可 以 编 译 与 运 行 的 正 式 代 码。
---- 经 过 上 述 步 骤, 一 个 数 据 表 维 护 屏 幕 设 计 的 有 关 代 码 就 基 本 完 成。
关键词:在VFP中用伪代码开发数据表维护屏幕