Database 版 (精华区)
发信人: mengy (LEAR DLLS 命令时,将从内存中清除), 信区: Database
标 题: Visual FoxPro 5.0 应 用 开 发 技 巧
发信站: 哈工大紫丁香 (2000年12月13日09:17:03 星期三), 站内信件
Visual FoxPro 5.0 应 用 开 发 技 巧
湖 南 省 计 生 委 信 息 中 心
罗 辉
---- ( 所 有 图 均 略)Visual FoxPro 5.0 作 为 一 个 新 型 的 前 端 数 据
库 应 用 开 发 工 具, 其 功 能 之 强 大 足 以 让 FoxPro 用 户 和 其 它
数 据 库 应 用 开 发 人 员 莫 名 惊 喜 !
---- 本 文 特 将 作 者 在 Visual FoxPro 5.0 平 台 从 事 应 用 开 发 过
程 中 之 经 验 和 技 巧 总 结 出 来, 希 望 能 助 你 一 臂 之 力。 本 文
是 基 于 中 文 版 Visual FoxPro 5.0 平 台 展 开 讨 论 的。
---- 1、 充 分 利 用 数 据 词 典 功 能 简 化 表 单 设 计
---- Visual FoxPro 5.0 新 增 了 一 个 数 据 辞 典 的 特 性。 数 据 库 的
数 据 辞 典 特 性 便 于 用 来 设 计 与 字 段 层 次 相 关 联 的 对 象 所
属 的 对 象 类( 可 以 是 自 定 义 类), 并 且 可 以 让 用 户 通 过 快
速 拖 曳 的 方 式 来 直 接 设 计 所 需 的 用 户 表 单 中 的 编 辑 对 象
。 当 从 数 据 环 境 设 计 器、 数 据 库 设 计 器 或 者 项 目 管 理 器
中 把 表 或 字 段 拖 到 表 单 上 时, 将 直 接 创 建 默 认 的 控 件 类
型。 例 如, 当 把 一 个 字 符 型 字 段 拖 到 表 单 上 时,Visual FoxPro
将 创 建 一 个 文 本 框。
---- 在 表 设 计 器 中, 我 们 可 以 在 数 据 词 典 中 为 数 据 表 字 段
设 置 如 下 特 性:
---- * 指 定 输 入 和 显 示 字 段 的 格 式 属 性、 注 释 信 息, 它 们
将 在 表 单 设 计 器 中 使 用 拖 曳 技 术 来 设 计 编 辑 字 段 的 对 象
时, 控 制 该 对 象 的 显 示 属 性 如Format、InputMask、Caption、
Comment 等 属 性 的 值。
---- 格 式(Format): 指 定 表 达 式, 使 得 在“ 浏 览” 窗 口、 表 单
或 报 表 中, 确 定 字 段 显 示 时 的 大 小 写、 字 体 大 小 和 样 式。
---- 输 入 掩 码(InputMask): 指 定 字 段 中 输 入 数 值 的 格 式。 例
如, 电 话 号 码 的 格 式 为 (999) 999-9999。
---- 标 题(Caption): 指 定 在“ 浏 览” 窗 口、 表 单 或 报 表 中 代
表 字 段 的 标 签。 表 单 或 报 表 中 的 属 性 设 置 可 覆 盖 此 设 置
。
---- 字 段 注 释(Comment): 提 供 输 入 字 段 注 释 的 位 置。
---- * 指 定 字 段 类 型 匹 配 的 表 单 控 件 对 象 类, 当 在 将 字 段
拖 到 表 单 时, 自 动 用 指 定 的 控 件 类 为 字 段 创 建 相 应 的 控
件 对 象 类。
---- 显 示 库(Display Vcx): 指 定 类 库 的 路 径 和 文 件 名。 如 果
要 浏 览 文 件, 可 使 用 对 话 按 钮。
---- 显 示 类(Display Class): 指 定 字 段 的 默 认 控 件 类。
---- 例 如, 在 我 们 的 一 个 稿 件 系 统 中, 在 表 设 计 器 中 为 稿
件 表Contrib.dbf 中 的Contr_date( 投 稿 日 期) 字 段
---- 其 中, 我 们 设 置 了 输 入 掩 码 为“9999-99-99”, 标 题 为“ 投
稿 日 期”, 并 设 置 了 字 段 注 释“ 投 递 稿 件 的 邮 戳 时 间。”,
其 它 沿 用 默 认 值。
---- 在 表 单 设 计 器 窗 口 上, 将 稿 件 库 添 加 到 数 据 环 境 中,
然 后 拖 曳 数 据 环 境 中 稿 件 库 的Contr_date 字 段 到 表 单 中, 即
出 现 如 图1-2 所 示 的 状 态: 表 单 中 自 动 产 生 一 个 文 本 框 控
件 TxtContr_date, 其 对 应 的Format、Inputmask、Comment 属 性 对 应 为
表 设 计 器 中 Contr_date 字 段 的 格 式、 输 入 掩 码 和 注 释; 并 为
该 文 本 框 配 套 创 建 了 一 个 标 题 为“ 投 稿 日 期” 的 标 签。
---- 当 然, 你 可 以 在 数 据 环 境 中 一 次 选 择 多 个 字 段( 通 过
Shift 键 + 点 按 连 续 选 择, 或 通 过Ctrl 键 + 点 按 间 断 选 择),
然 后 拖 曳 到 表 单 上, 即 可 一 次 性 地 为 多 个 被 选 字 段 产 生
对 应 的 表 单 控 件。 而 且, 针 对 不 同 字 段 类 型, 将 自 动 映 象
套 用 产 生 不 同 的 控 件 类 型。 如 对 备 注 型 字 段, 自 动 套 用
编 辑 框 控 件; 对 逻 辑 型 字 段, 自 动 套 用 检 查 框 控 件; 对 通
用 型 字 段, 自 动 套 用 图 像 控 件, 等 等。
---- 利 用 数 据 词 典, 应 用 表 单 设 计 就 是 如 此 简 单 !
---- 2、 控 制 字 段 类 型 与 控 件 类 型 的 映 象 关 系
---- 上 面 已 经 提 到: 通 过 拖 曳 设 计 应 用 表 单 时, 针 对 不 同
字 段 类 型 可 以 创 建 不 同 的 控 件 类 型。 但 是, 有 时 我 们 可
能 需 要 改 变 字 段 类 型 与 控 件 类 型 的 这 种 默 认 的 映 象 关 系
, 以 达 到 定 制 的 目 的, 譬 如 说 对 字 符 型 字 段, 希 望 拖 曳 产
生 编 辑 框 控 件 而 不 是 默 认 的 文 本 框 控 件; 或 者 对 字 符 型
字 段, 希 望 拖 曳 产 生 我 们 特 制 的 文 本 框 控 件 而 不 是 默 认
的 文 本 框 控 件。 对 这 种 定 制 需 求, 分 两 种 情 况, 一 是 希 望
个 别 字 段 映 象 到 特 定 的 控 件 类 型; 二 是 希 望 某 一 种 字 段
类 型 都 映 象 产 生 特 定 的 控 件 类 型。
---- 如 果 只 是 希 望 个 别 字 段 需 要 映 象 产 生 特 定 的 控 件 类
型, 则 应 在 如 图1-1 的 表 设 计 器“ 匹 配 字 段 类 型 到 类” 框 中
选 择“ 显 示 类” 列 表 框 里 需 要 的 控 件 类 型, 而 不 是 沿 用“
默 认”。 如 果 要 设 置 的 控 件 类 型 不 是 系 统 提 供 的 基 类( 标
准 控 件), 则 你 首 先 需 要 在“ 显 示 库” 框 中 指 定 相 应 的 类
库 文 件, 然 后 再 选 择 其 中 的 类。
---- 如 果 你 希 望 在 所 有 的 表 单 设 计 中 某 一 种 字 段 类 型 都
映 象 为 特 定 的 控 件 类 型, 譬 如 希 望 所 有 的 字 符 型 字 段 都
映 象 产 生 编 辑 框 控 件 而 不 是 默 认 的 文 本 框 控 件, 此 时 则
应 该 改 变 该 字 段 类 型 映 象 到 控 件 类 型 的 默 认 值。 具 体 方
法 是:
---- 1、 选 择“ 工 具/ 选 项” 菜 单 项, 并 选 择 选 项 对 话 框 中 的
字 段 映 象 页, 其 中 的“ 将 字 段 类 型 映 象 到 类 中” 框 中, 显
示 了 系 统 支 持 的 所 有 字 段 类 型 与 控 件 类 之 间 当 前 的 映 象
关 系。 列 表 包 括:
---- 类 型: 数 据 库 支 持 的 所 有 数 据 类 型。 注 意: 其 中 还 额
外 提 供 了 两 个 数 据 库 不 支 持 的 类 型:“ 多 用 途 型” 和“ 标
签 型”。 它 们 的 作 用 是: 当 您 一 次 把 整 个 表 或 多 个 字 段 拖
到 表 单 上 时,“ 多 用 途 型” 用 来 指 定 将 要 创 建 的 类, 系 统
默 认 是 创 建 一 个 网 格 控 件; 而“ 标 签 型”, 则 用 来 指 定 为
字 段 标 题 创 建 的 类。
---- 类 库: 一 个 类 库, 该 类 库 包 含 映 象 到 一 个 字 段 类 型 的
类 定 义。 如 果 该 列 为 空, 表 示 该 字 段 类 型 将 映 象 到 一 个
Visual FoxPro 提 供 的 基 类 上。
---- 类 名: 一 个 字 段 类 型 将 要 映 象 的 类, 它 指 定 了 将 要 创
建 的 控 件 类 型。
---- 修 改: 选 择 该 按 钮 可 以 显 示 字 段 类 型 映 象 对 话 框, 从
中 可 为 选 中 的 字 段 类 型 指 定 一 个 不 同 的 映 象。
---- 2、 点 按 修 改 按 钮, 激 活 字 段 类 型 映 象 对 话 框。
---- 3、 在 字 段 类 型 映 象 对 话 框 内, 在 字 段 类 型 列 表 中 选
择 一 个 字 段 类 型。 若 要 设 置 在 拖 动 一 个 表 或 多 个 记 录 时
将 创 建 的 控 件 类, 则 选 择“ 多 用 途 型”。
---- 4、 在 类 信 息 框 中, 从 类 名 列 表 中 选 择 需 要 的 控 件 类
名 称。 如 果 不 是 基 类, 则 还 需 要 设 定 类 库 文 件 名(.VCX 文 件
), 该 类 库 包 含 您 希 望 与 选 中 字 段 类 型 联 系 在 一 起 的 控
件 类 型。
---- 5、 点 按 确 定 或 应 用 按 钮 来 接 受 这 种 映 象 关 系。
---- 在 这 里 有 必 要 强 调 的 是, 在 字 段 映 象 页 下 部 还 提 供 了
一 组 数 据 库 选 项, 这 些 选 项 也 将 影 响 我 们 结 合 数 据 词 典
通 过 拖 曳 设 计 表 单 的 效 果, 这 组 选 项 是:
---- 拖 放 字 段 标 题: 如 果 希 望 Visual FoxPro 使 用 字 段 的 标 题
为 即 将 创 建 的 控 件 额 外 创 建 一 个 标 签 型 标 题, 则 应 选 中
该 选 项。 如 果 您 清 除 该 选 项,Visual FoxPro 将 不 会 如 图1-2 所
示 一 样 创 建 字 段 标 题。
---- 复 制 字 段 备 注: 选 中 该 选 项 可 以 使 Visual FoxPro 在 创 建
类 时, 把 字 段 的 注 释( 如 果 有 的 话) 复 制 到 控 件 类 的
Comment 属 性 中。
---- 复 制 字 段 输 入 掩 码: 选 中 该 选 项 可 以 使 Visual FoxPro 在
创 建 类 时, 把 字 段 的 输 入 掩 码( 如 果 有 的 话) 复 制 到 控 件
类 的 InputMask 属 性 中。
---- 复 制 字 段 格 式: 选 中 该 选 项 可 以 使 Visual FoxPro 在 创 建
类 时, 把 字 段 的 格 式 设 置( 如 果 有 的 话) 复 制 到 控 件 类 的
Format 属 性 中。
---- 设 定 好 字 段 类 型 与 控 件 类 型 的 映 象 关 系 后, 一 定 要 记
住 点 按 选 项 对 话 框 下 部 的 设 置 为 默 认 值 按 钮, 将 你 的 设
定 保 存 为 默 认 值。
---- 如 此 设 置 后, 结 合 数 据 词 典 通 过 拖 曳 设 计 数 据 库 应 用
表 单 时, 即 可 改 变 字 段 与 控 件 的 映 象 关 系。
---- 3、 如 何 给 表 单 添 加 一 个 数 组 属 性
---- 要 给 表 单 添 加 属 性, 可 选 择“ 表 单/ 新 建 属 性” 菜 单 项
, 在 新 建 属 性 对 话 框 直 接 输 入 属 性 名 和 相 应 注 释, 再 点
按 添 加 按 钮 即 可。 然 而, 又 如 何 该 表 单 添 加 一 个 数 组 属 性
呢 ?
---- 给 表 单 添 加 数 组 属 性, 同 样 选 择“ 表 单/ 新 建 属 性” 菜
单 项, 在 新 建 属 性 对 话 框 直 接 输 入 数 组 属 性 名 和 相 应 注
释 即 可。 但 是, 数 组 属 性 名 中 必 须 用 圆 括 号() 或 方 括 号
[] 带 数 组 下 标。 如 图3-1 所 示, 可 给 当 前 表 单 添 加 一 个3 ×
2 的itemarray 数 组。
---- 添 加 的 数 组 属 性 可 以 在 该 表 单 的 任 何 方 法 程 序 中 改
变 它 的 维 数。 譬 如 对 上 述 数 组 属 性, 我 们 可 以 在 该 表 单 的
Click 事 件 中 添 加 如 下 代 码 进 行 该 数 组 属 性 大 小 的 测 试:
wait windows ' 原 数 组 属 性 维 数:
'+str(alen(thisform.itemarray,1))+;
' ×'+str(alen(thisform.itemarray,2))
dime thisform.itemarray[2,1]
wait windows ' 改 变 后 数 组 维 数:
'+str(alen(thisform.itemarray,1))+;
' ×'+str(alen(thisform.itemarray,2))
---- 运 行 该 表 单 后, 单 击 表 单, 首 先 显 示 原 属 性 itemarray 数
组 维 数 为3 ×2, 击 任 意 键 后 接 着 显 示 改 变 后 属 性
itemarray 数 组 的 维 数 为2 ×1。 由 此 可 见, 数 组 属 性 的 大 小 进
行 了 调 整。
---- 4、“::” 与 DODEFAULT() 函 数 的 使 用 及 区 别
---- 在 Visual FoxPro 3.0 中 提 供 了 一 个 作 用 域 操 作 符“::”, 它
用 于 在 一 个 子 对 象 类 事 件 或 方 法 程 序 中 执 行 父 对 象 类 的
事 件 或 方 法 程 序。 举 例 说, 我 们 首 先 定 义 了 一 个 父 对 象
类 PClass, 并 为 它 设 置 了Init 事 件 代 码, 以 完 成 某 些 初 始 化
操 作。 然 后, 我 们 又 基 于 该 父 类 派 生 出 一 个 子 对 象 类
CClass, 也 需 要 为 它 设 置 一 段 Init 事 件 代 码。 默 认 时, 当 父
类 设 置 了 某 一 个 事 件( 如Init 事 件) 的 事 件 处 理 代 码 而 子
类 在 同 一 个 事 件 中 没 有 设 置 处 理 代 码 时, 表 单 运 行 时 将
执 行 父 类 的 该 事 件 处 理 代 码。 但 是, 当 父 类 和 子 类 的 同
一 个 事 件( 如Init 事 件) 都 设 置 了 事 件 处 理 代 码 时, 表 单 运
行 后, 将 只 运 行 子 类 的 事 件 处 理 代 码, 而 父 类 的 事 件 处
理 代 码 将 被 屏 蔽 不 予 执 行。 然 而, 可 能 我 们 需 要 父 类 和 子
类 的 同 一 个 事 件 处 理 代 码 都 需 运 行, 此 时,Visual FoxPro 3.0
的 处 理 方 法 是 在 子 类 的 事 件 处 理 代 码 前 面, 首 先 用 作 用
域 操 作 符“::” 执 行 父 类 的 事 件 处 理 代 码, 然 后 再 执 行 子
类 附 加 的 其 它 事 件 处 理 代 码。 作 用 域 操 作 符 的 使 用 格 式
是: 父 类 名:: 事 件 名。
---- 譬 如, 在 子 类 CClass 的 Init 事 件 处 理 代 码 中, 添 加 如 下
语 句 行:
PClass::Init
---- 即 可 执 行 父 类 Pclass 的 Init 事 件 代 码。
---- 注 意: 作 用 域 操 作 符 的 使 用 格 式 中 的 父 类 名 是 指 父 类
的 对 象 类 名, 而 不 是 该 对 象 在 表 单 创 建 一 个 具 体 控 件 时
的 控 件 名。
---- 为 便 于 理 解, 特 举 例 加 以 说 明。 下 面 的 程 序 创 建 一 个
表 单, 在 表 单 上 具 有 两 个 按 钮, 其 中 的“ 退 出” 按 钮( 控
件 名 是:cmdQuit) 是 基 于 CommandButton 基 类 创 建 的
cmdQuitButton 对 象 类 的 一 个 具 体 实 例; 而“ 点 按 以 退 出” 按
钮( 控 件 名 是:cmdAnother) 是 基 于 cmdQuitButton 父 类 创 建 的
cmdAnotherButton 子 类 的 一 个 具 体 实 例。 在 子 类 的 Click 事 件 中
是 通 过 cmdQuitButton::Click 语 句 执 行 父 类 的 Click 事 件 处 理 代
码 的。
frmMyForm = CREATEOBJECT("Form")
frmMyForm.Width = 450
frmMyForm.Height = 100
frmMyForm.Caption = " 作 用 域 操 作 符 使 用 举 例"
frmMyForm.AutoCenter =.T.
---- *** 下 面 两 行 语 句 用 于 在 表 单 上 创 建 对 象 类 的 实 例(
具 体 对 象)
frmMyForm.AddObject("cmdQuit","cmdQuitButton")
frmMyForm.AddObject("cmdAnother","cmdAnotherButton")
frmMyForm.SHOW && 显 示 表 单
READ EVENTS && 开 始 事 件 处 理
---- *** 下 面 定 义 对 象 类
DEFINE CLASS cmdQuitButton AS CommandButton &&定义父类
Caption = "退出\< Q" &&命令按钮的标题
Left = 175 &&按钮左边界
Top = 60 &&按钮上边界
Height = 25 &&按钮高度
Visible = .T. &&在表单上显示按钮
FontItalic = .T. &&按钮上文本斜体显示
ForeColor = RGB(0,0,255) &&改变按钮上文本颜色
PROCEDURE Click
WAIT WINDOW "现在正在执行退出按钮(控件名:"+;
" cmdQuit)的 CLICK事件." TIMEOUT 2
CLEAR EVENTS &&停止事件处理程序,关闭表单
ENDDEFINE
DEFINE CLASS cmdAnotherButton AS cmdQuitButton &&定义子类
Caption = "点按以退出"
Left = 175
Top = 30
Height = 25
PROCEDURE Click
WAIT WINDOW "现在正在执行点按以退出按钮"+;
"(控件名:cmdAnotherButton)
的 Click事件." TIMEOUT 2
cmdQuitButton::Click
ENDDEFINE
---- 在Visual FoxPro 5.0 中 仍 支 持 作 用 域 操 作 符 的 用 法, 但 是
它 同 时 提 供 了 一 个 DODEFAULT() 函 数 的 用 法。DODEFAULT() 函 数
用 于 在 子 类 的 事 件 处 理 代 码 中 执 行 父 类 中 同 名 事 件 的 事
件 处 理 代 码。 譬 如, 在 子 类 的 Click 事 件 中 使 用 了
DODEFAULT() 函 数, 它 表 示 执 行 父 类 的 同 名 事 件 Click 的 事 件
处 理 代 码。 其 使 用 格 式 是:
---- DODEFAULT([ 参 数1 [, 参 数2] ...)
---- 其 中 的 参 数1、 参 数2 等 等, 用 于 向 父 类 的 事 件 或 方 法
传 递 参 数。 而 作 用 域 操 作 符“::” 与 DODEFAULT() 函 数 的 使 用
有 点 区 别, 就 是 使 用 作 用 域 操 作 符, 可 以 在 子 类 某 一 事 件
中 执 行 父 类 的 另 一 个 不 同 名 事 件 的 事 件 处 理 代 码, 而
DODEFAULT() 函 数 则 不 行 !
---- 5、 重 新 设 置 网 格 的 记 录 属 性 值 时 的 属 性 复 位 问 题
---- 在 表 单 中 使 用 网 格(Grid) 控 件 对 数 据 表 记 录 作 全 屏 幕
编 辑 操 作 时, 网 格 控 件 与 要 编 辑 的 数 据 表 或 视 图 记 录 的
联 系 是 通 过 设 置 网 格 的 记 录 源 属 性 RecordSource 为 打 开 的
数 据 表 或 视 图 所 在 工 作 区 别 名 来 建 立 的。
---- 在 实 际 操 作 中 发 现, 当 反 复 设 置 网 格 的 RecordSource 属
性 值 时, 网 格 的 其 它 属 性 总 是 复 位 到 它 的 默 认 设 置。 譬 如
, 在 某 一 个 按 输 入 某 一 字 段 值 过 滤 进 行 浏 览 的 表 单 中,
表 单 可 以 反 复 请 求 用 户 输 入 不 同 的 字 段 值, 然 后 通 过
SELECT -SQL 语 句 得 到 满 足 条 件 的 记 录 过 滤 到 一 个 临 时 游 标
中, 网 格 的 RecordSource 属 性 设 置 为 该 游 标 名。 因 为 每 执 行
一 次 SELECT -SQL 语 句, 该 游 标 实 质 上 是 重 新 产 生 一 次, 相
当 于 重 新 设 置 了 一 次 RecordSource 属 性 值。 这 样, 如 果 在 表
单 设 计 状 态 时 为 网 格 控 件 设 置 某 些 属 性, 譬 如 设 置 了
FontName、FontSize、GridLineColor、GridLineWidth、 记 录 的 动 态 显 示
属 性( 如 不 同 记 录 的 分 色 显 示) 如DynamicBackColor、
DynamicForeColor 等 等 属 性, 那 么, 在 第 一 次 查 询 时, 这 些 属
性 可 以 正 常 表 现 出 来, 但 是 在 第 二 次 以 后 的 查 询 中, 这 些
属 性 都 复 原 为 默 认 的 状 态, 好 象 没 有 进 行 设 置 一 样 !
---- 对 于 这 种 需 要 多 次 设 置 网 格 的 RecordSource 属 性 值 的 情
况, 为 避 免 网 格 控 件 的 其 它 属 性 的 复 位, 我 们 可 以 类 似
如 下 处 理:
ThisForm.Grid1.RecordSource=''
&&首先将记录源属性置空
DO dynaqry.qpr
&&执行查询得到新的记录集(Tmpcursor)
ThisForm.LockScreen=.T.
&&锁定屏幕
ThisForm.Grid1.RecordSource='tmpcursor'
&&重新设置记录源属性
ThisForm.LockScreen=.F.
&&解除屏幕锁定
---- 这 样, 通 过 在 更 新 网 格 记 录 源 数 据 之 前, 先 将 记 录 源
属 性 置 空, 再 执 行 查 询 重 新 得 到 记 录 集, 然 后 重 新 设 置
网 格 记 录 源 属 性 到 新 的 记 录 集, 即 可 解 决 网 格 属 性 复 位
的 问 题。
---- 6、SELECT-SQL 中 的 WHERE 和 HAVING 的 区 别
---- 使 用SELECT - SQL 结 构 化 查 询 语 句, 可 以 完 成 几 乎 所 有 的
数 据 表 记 录 查 询 任 务。SELECT - SQL 语 句 功 能 之 强 大, 其 完
成 复 杂 查 询 任 务 的 代 码 之 简 单, 令 许 多 传 统 FoxPro 编 程 者
相 见 恨 晚 !
---- 其 实,FoxPro 2.0 以 后 产 品 都 提 供 了 对 SELECT - SQL 语 句 的
支 持, 只 不 过 随 着 版 本 的 提 高,SELECT - SQL 语 句 的 功 能 也
有 了 很 大 的 增 强。 直 至 Visual FoxPro 5.0 ,SELECT - SQL 语 句 功
能 更 有 了 质 的 飞 跃。 这 在 后 面 的 技 巧 中 可 以 略 见 一 斑。
---- SELECT - SQL 语 句 中 提 供 了 一 个 WHERE 子 句 和 一 个 HAVING 子
句, 两 者 都 是 用 于 构 造 记 录 筛 选 条 件, 以 过 滤 出 满 意 的
查 询 结 果 来。 但 是 两 者 是 有 区 别 的。
---- 首 先, 如 果 是 通 过 查 询 设 计 器 设 计 一 个 查 询( 实 质 是
构 造 一 个SELECT - SQL 语 句), 则 产 生 的 SELECT - SQL 语 句 的
WHERE 子 句 是 通 过 设 计 器 中 的 筛 选(Filter) 页 来 构 造 的; 而
HAVING 子 句 则 必 须 通 过 点 按 分 组(Group By) 页 中 的 满 足 条
件(Having) 按 钮 激 活 满 足 条 件 对 话 框 来 构 造, 但 两 者 的 设
计 构 造 方 式 都 是 一 样 的。
---- 再 次, 两 者 筛 选 记 录 的 时 间 是 不 一 样 的: SELECT - SQL 语
句 首 先 用 通 过 筛 选(Filter) 页 所 设 置 的 筛 选 条 件(WHERE 子
句) 针 对 原 始 数 据 源(FROM 子 句 后 面 的 数 据 表 或 视 图) 进
行 相 应 的 记 录 筛 选 之 后, 再 执 行GROUP BY 子 句 中 之 HAVING 子
句 对 WHERE 子 句 筛 选 出 来 的 记 录 进 行 再 次 筛 选。
---- 第 三,WHERE 子 句 可 以 针 对 数 据 源 的 所 有 字 段 构 造 筛 选
条 件; 而 HAVING 子 句 则 只 能 对 SELECT - SQL 语 句 输 出 的 字 段(
包 括 实 际 的 字 段 和 计 算 字 段) 构 造 筛 选 条 件, 但 是 由 于
它 可 对 计 算 字 段 构 造 条 件, 而 计 算 字 段 可 由 任 何 合 法 的
表 达 式 构 成, 因 而 用 HAVING 构 造 筛 选 条 件 更 加 灵 活。 例 如
下 例:
SELECT zh,;
AVG(jffse) AS rjjffse,SUM(jffse) AS zjffse,;
AVG(dffse) AS rjdffse,SUM(dffse) AS zdffse;
From Bankdata!fhz ;
WHERE fhz.zh >=2010001000149 AND fhz.zh< 3010001000157;
GROUP BY zh ;
HAVING rjjffse >100000
---- 上 例 从 银 行 会 计 分 户 明 细 帐 上 统 计 帐 号 2010001000149 到
3010001000157 之 间 的 帐 号 中 日 均 借 方 发 生 额 在 十 万 元 以 上
的 帐 户 有 关 发 生 额 的 信 息。 其 中 的“ 日 均 借 方 发 生 额 在
十 万 元 以 上” 的 条 件 如 果 用 WHERE 子 句 来 构 造, 相 应 语 句 如
下:
SELECT zh,;
AVG(jffse) AS rjjffse,SUM(jffse) AS zjffse,;
AVG(dffse) AS rjdffse,SUM(dffse) AS zdffse;
From Bankdata!fhz ;
WHERE fhz.zh >=2010001000149 AND fhz.zh< 3010001000157;
AND AVG(jffse) >100000;
GROUP BY zh
---- 显 然, 通 过 WHERE 子 句 来 构 造 的 筛 选 条 件, 其 必 须 通 过
表 达 式 对 日 均 发 生 额 进 行 重 复 计 算, 对 查 询 效 率 有 很 大
的 影 响。
---- 第 四, 对 相 同 字 段 名 构 造 相 同 的 筛 选 条 件 时, 使 用
WHERE 子 句 较 之 使 用 HAVING 子 句 构 造 条 件 执 行 效 果 更 佳。 譬
如 如 下 语 句:
SELECT zh,;
AVG(jffse) AS借方日均发生额,
SUM(jffse) AS借方总发生额,;
AVG(dffse) AS贷方日均发生额,
SUM(dffse) AS贷方总发生额;
From Bankdata!fhz ;
WHERE fhz.zh=2010001000149 ;
GROUP BY zh
和语句:
SELECT zh,;
AVG(jffse) AS借方日均发生额,SUM(jffse) AS借方总发生额,;
AVG(dffse) AS贷方日均发生额,SUM(dffse) AS贷方总发生额;
From Bankdata!fhz ;
GROUP BY zh ;
HAVING zh=2010001000149
---- 两 者 的 筛 选 条 件 分 别 是 用 WHERE 子 句 和 HAVING 子 句 完 成
的, 都 是 用 于 从 银 行 会 计 分 户 明 细 帐 上 统 计 帐 号
2010001000149 有 关 发 生 额 的 信 息 的。 但 是 两 者 的 执 行 效 率,
前 者 效 果 更 佳 !
---- 因 此, 在 实 际 设 计 SELECT - SQL 语 句 时, 必 须 根 据 自 己 的
需 要, 有 针 对 性 的 使 用 WHERE 子 句 和 HAVING 子 句。
---- 7、 两 表 连 接 的 五 种 连 接 方 式 的 使 用
---- 在 Visual FoxPro 3.0 以 前 版 本,SELECT - SQL 语 句 只 提 供 了 无
连 接 和 连 接 两 种 方 式。 现 在 在 Visual FoxPro 5.0 开 始,SELECT -
SQL 为 两 表 以 上 的 连 接 提 供 了 五 种 连 接 方 式: 无 连 接、 内
连 接、 左 连 接、 右 连 接、 满 连 接。 它 们 到 底 有 些 什 么 区 别
呢 ?
---- 假 设 我 们 具 有 如 下 两 个 表:
表
表1:table1
表2:table2
字 段 名
字 段 名
记 录 号
fld1
fld2
fld3
fld4
1
a11
a12
a11
b12
2
a21
a22
a21
b22
3
a31
a32
b31
b32
---- 通 过SELECT-SQL 命 令 对 两 个 或 两 个 以 上 的 数 据 表 进 行 连
接 查 询 时, 如 果 没 有 设 置 数 据 表 之 间 的 连 接 条 件, 即 无
连 接 方 式, 则 会 造 成 查 询 结 果 中 记 录 条 数 为 数 据 表 记 录
数 相 乘。 譬 如, 如 下 语 句:
SELECT * FROM table1,table2
---- 将 得 到 如 下 一 个 记 录 集:
---- 无 连 接 时 产 生 的 结 果 记 录 集
字 段 名
记 录 号
fld1
fld2
fld3
fld4
1
a11
a12
a11
b12
2
a11
a12
a21
b22
3
a11
a12
b31
b32
4
a21
a22
a11
b12
5
a21
a22
a21
b22
6
a21
a22
b31
b32
7
a31
a32
a11
b12
8
a31
a32
a21
b22
9
a31
a32
b31
b32
---- 表1 三 条 记 录 与 表2 三 条 记 录 交 叉 连 接 产 生 了9 条 记 录
出 来。
---- 如 果 使 用SELECT - SQL 语 句 的 内 连 接(INNER JOIN), 两 个 连
接 的 数 据 表 中 必 须 同 时 存 在 连 接 条 件 中 设 置 的 字 段 或 字
段 表 达 式 中 的 字 段。 它 将 两 个 数 据 表 中 满 足 指 定 连 接 条
件 的 记 录 筛 选 出 来。 内 连 接 实 质 就 是 以 前 版 本 的 连 接 方
式, 它 是 默 认 的 连 接 方 式。 譬 如, 用 如 下 语 句 基 于 表1 的
fld1 字 段 和 表2 的 fld3 字 段 的 内 连 接:
SELECT * FROM table1 INNER JOIN table2 ;
ON table1.fld1=table2.fld3
---- 将 得 到 如 下 一 个 记 录 集:
---- 内 连 接 时 产 生 的 结 果 记 录 集
字 段 名
记 录 号
fld1
fld2
fld3
fld4
1
a11
a12
a11
b12
2
a21
a22
a21
b22
---- 内 连 接 方 式 将 连 接 的 两 个 表 中 都 满 足 指 定 条 件 的 记
录 过 滤 出 来。
---- 使 用 左 连 接(LEFT OUTER JOIN), 它 以 左 边 表 为 主, 用 于 对
连 接 条 件 左 边 字 段 所 在 的 表 进 行 全 部 记 录 查 询, 并 连 接
条 件 右 边 字 段 所 在 表 满 足 连 接 条 件 的 记 录 进 行 查 询。 当
左 边 数 据 表 中 有 记 录 而 右 边 数 据 表 中 无 相 应 连 接 条 件 的
记 录 时, 则 输 出 的 右 边 数 据 表 字 段 内 容 呈 现 空 值(NULL)。
譬 如 如 下 语 句:
SELECT * FROM table1 LEFT OUTER JOIN table2 ;
ON table1.fld1=table2.fld3
---- 将 得 到 如 下 一 个 记 录 集:
---- 左 连 接 时 产 生 的 结 果 记 录 集
字 段 名
记 录 号
fld1
fld2
fld3
fld4
1
a11
a12
a11
b12
2
a21
a22
a21
b22
3
a31
a32
---- 从 表 上 可 以 看 出, 左 连 接 产 生 的 结 果 记 录 集 中 以 连 接
关 系 的 左 边 数 据 表 为 基 准, 将 左 边 记 录 全 部 输 出, 同 时
对 满 足 左 连 接 条 件 的 右 边 数 据 表 中 相 关 记 录 的 内 容 也 输
出。 而 对 右 边 表 中 无 满 足 连 接 条 件 的 左 边 表 记 录, 其 输
出 结 果 中 有 关 右 边 记 录 信 息 全 置 空。
---- 使 用 右 连 接(RIGHT OUTER JOIN), 与 左 连 接 方 式 相 反, 它
以 右 边 表 为 主, 用 于 对 连 接 条 件 右 边 字 段 所 在 的 表 进 行
全 部 记 录 查 询, 并 连 接 条 件 左 边 字 段 所 在 表 满 足 连 接 条
件 的 记 录 进 行 查 询。 当 右 边 数 据 表 中 有 记 录 而 左 边 数 据
表 中 无 相 应 连 接 条 件 的 记 录 时, 则 输 出 的 左 边 数 据 表 字
段 内 容 呈 现 空 值(NULL)。 譬 如 如 下 语 句:
SELECT * FROM table1 RIGHT OUTER JOIN table2 ;
ON table1.fld1=table2.fld3
---- 将 得 到 如 下 一 个 记 录 集:
---- 右 连 接 时 产 生 的 结 果 记 录 集
字 段 名
记 录 号
fld1
fld2
fld3
fld4
1
a11
a12
a11
b12
2
a21
a22
a21
b22
3
b31
b32
---- 使 用 左 连 接 或 右 连 接 方 式, 可 以 方 便 地 查 找 到 两 个 关
联 表 中, 其 中 一 个 表 有 记 录 而 另 一 个 表 中 无 相 关 记 录 的
情 况。 一 般 用 于 父 表 和 子 表 中 记 录 相 关 的 合 法 性 检 索。
譬 如, 下 面 语 句:
SELECT * FROM table1 RIGHT OUTER JOIN table2 ;
ON table1.fld1=table2.fld3 ;
WHERE EMPTY(fld1)
---- 可 以 方 便 地 将 表2 有 记 录 而 表1 中 不 存 在 相 应 的 关 联 记
录 的 情 况 检 索 出 来, 结 果 只 有 一 条 记 录, 就 是 上 表 中 的
第3 条 记 录。 在 以 前 版 本 的SELECT - SQL 语 句 中, 要 完 成 这 种
查 询 任 务, 相 对 就 要 复 杂 得 多 了, 一 般 而 言 它 必 须 借 助 于
子 查 询 的 方 式 才 能 达 到 目 的。
---- 使 用 满 连 接(FULL OUTER JOIN), 它 实 质 上 是 左 连 接 和 右
连 接 方 式 的 组 合。 查 询 结 果 记 录 集 中 集 合 了 连 接 两 边 的
表 记 录, 包 括 符 合 条 件 和 不 符 合 条 件 的 记 录。 但 是, 与 无
连 接 方 式 不 同, 它 并 不 是 交 叉 连 接。 满 连 接 的 结 果 集 分
三 部 分: 一 部 分 记 录 是 两 边 都 满 足 连 接 条 件 的 记 录, 其 中
涉 及 的 左 边 表 内 容 和 右 边 表 记 录 内 容 都 输 出; 第 二 部 分
是 不 满 足 连 接 条 件 的 左 边 表 记 录, 此 时 其 涉 及 的 右 边 表
记 录 内 容 置 空; 第 三 部 分 是 不 满 足 连 接 条 件 的 右 边 表 记
录, 此 时 其 涉 及 的 左 边 表 记 录 内 容 置 空。 例 如, 如 下 满 连
接 语 句:
SELECT * FROM table1 FULL OUTER JOIN table2 ;
ON table1.fld1=table2.fld3
---- 将 得 到 如 下 一 个 记 录 集:
---- 满 连 接 时 产 生 的 结 果 记 录 集
字 段 名
记 录 号
fld1
fld2
fld3
fld4
1
a11
a12
a11
b12
2
a21
a22
a21
b22
3
a31
a32
4
b31
b32
---- 使 用 满 连 接 方 式, 可 以 方 便 地 查 找 到 两 个 关 联 表( 父
子 表) 中, 一 次 性 查 找 到 有 父 无 子 和 有 子 无 父 的 记 录 情
况。
---- 从 上 面 可 以 总 结 出, 对 不 同 的 连 接 方 式, 结 果 集 中 的
记 录 数 不 同: 对 无 连 接 方 式, 其 结 果 是 两 边 表 记 录 的 迪
卡 尔 积; 对 内 连 接 方 式, 其 结 果 是 两 边 表 记 录 的 交 集; 对
左 连 接 方 式, 其 结 果 是 左 边 表 记 录 数; 对 右 连 接 方 式, 其
结 果 是 右 边 表 记 录 数; 对 满 连 接 方 式, 其 结 果 是 两 边 表
记 录 的 并 集。
---- 8、 视 图 中 的 动 态 条 件 设 置
---- FoxPro 产 品 已 经 在 我 们 国 家 流 行 了 这 么 多 年, 但 似 乎
可 以 肯 定 的 一 点 是, 绝 大 部 分 FoxPro 用 户, 包 括 应 用 开 发
者, 对 有 关“ 视 图” 的 概 念 和 使 用 都 不 太 清 楚。
---- Visual FoxPro 提 供 的 视 图, 实 质 是 一 个 虚 拟 的 数 据 表,
并 不 对 应 于 一 个 具 体 的 磁 盘 文 件。 视 图, 通 过 一 定 的 连 接
关 系 和 记 录 筛 选 条 件, 将 来 自 于Visual FoxPro 数 据 表 或 后 端
数 据 库 的 数 据 集 合 到 一 起, 通 过 这 个 数 据 集, 可 以 方 便
地 进 行 查 询、 更 新 或 多 数 据 表 间 的 数 据 连 接 等 操 作, 它 同
时 能 将 基 于 视 图 更 新 的 数 据 对 应 到 相 应 的 数 据 表 中 的 相
应 记 录 中。 视 图 技 术, 可 以 大 大 简 化 数 据 表 应 用 的 设 计
工 作。
---- 视 图 存 在 于 数 据 库 中, 可 以 通 过 视 图 设 计 器 可 视 创 建
, 或 者 通 过 CREATE VIEW 命 令 程 序 创 建。 视 图 中 的 记 录 数 据
集 并 不 实 际 存 在, 而 是 在 每 次 打 开 该 视 图 时, 自 动 临 时 从
相 关 数 据 表 中 下 载 记 录 到 视 图 中。
---- 一 般 地, 在 一 个 应 用 模 块 中, 我 们 是 基 于 一 组 特 定 数
据 而 不 是 全 部 数 据 进 行 处 理。 因 此, 为 提 高 处 理 效 率, 一
般 视 图 都 设 置 一 定 的 筛 选 条 件, 以 保 证 只 将 满 足 条 件 的
记 录 下 载 到 视 图 中, 而 不 是 下 载 全 部 记 录。
---- 现 在 的 问 题 是, 如 果 在 一 个 应 用 表 单 中, 我 们 需 要 重
复 多 次 用 不 同 的 筛 选 条 件 重 新 形 成 视 图 以 得 到 不 同 的 记
录 集, 如 何 来 设 置 这 个 动 态 的 筛 选 条 件 呢 ?
---- 譬 如, 针 对 上 一 节 的 两 个 数 据 表:table1、table2, 我 们 通
过 视 图 设 计 器, 采 用 内 连 接 方 式, 连 接 条 件 是:table1.
fld1=table2.fld3。 第 一 次 用 fld1="a11" 的 筛 选 条 件 形 成 关 于
fld1 字 段 值 是“a11” 的 视 图; 完 成 一 定 的 处 理 后, 又 需 要 第
二 次 用 fld1="a21" 的 筛 选 条 件 形 成 关 于 fld1 字 段 值 是“a21”
的 视 图; 完 成 一 定 的 处 理 后, 第 三 次 又 用 fld1 等 于 其 它 字
段 值 的 筛 选 条 件 形 成 新 的 视 图, 等 等。 条 件 是 根 据 应 用
执 行 时 用 户 输 入 动 态 变 化 的, 在 视 图 中 如 何 来 设 置 这 种
动 态 条 件 呢 ?
---- 其 处 理 实 质 很 简 单: 使 用 参 数 的 方 式 设 置 筛 选 条 件,
向 视 图 传 递 参 数, 可 以 通 过 在 一 个 变 量 名 前 置 一 个 问 号
( ?) 即 可, 注 意 问 号 与 变 量 名 中 间 不 能 存 在 空 格 或 其 它
空 白 符 ! 选 择 视 图 设 计 器 的 筛 选(Filter) 页, 在 字 段 名(
FieldName) 框 选 中 fld1 字 段, 在 实 例(Sample) 框 输 入:
?fld1value。
---- 对 上 面 设 计 的 动 态 视 图, 每 次 打 开 数 据 库 时, 在 形 成
该 视 图 数 据 集 之 前 将 出 现 一 个 视 图 参 数 对 话 框, 如 图8 -
1 所 示, 请 求 输 入 一 个 字 段 值。
---- 然 后 在 程 序 中, 可 以 每 次 重 新 给 fld1value 变 量 赋 值, 再
紧 跟 着 执 行 一 条:=REQUERY() 语 句, 即 可 完 成 另 一 个 条 件 的
视 图 的 形 成。
---- 但 是, 这 种 一 打 开 数 据 库 就 出 现 一 个 对 话 框 请 求 输 入
变 量 值 的 方 式 很 不 友 好。 改 进 的 方 法 是, 设 计 视 图, 使 在
打 开 数 据 库 时 首 先 不 下 载 记 录, 这 样 就 不 会 立 即 出 现 极
不 友 好 的 视 图 参 数 对 话 框 了; 然 后 在 表 单 或 程 序 中, 通
过 程 序 获 得 fld1value 变 量 的 一 次 输 入 值, 再 执 行 =REQUERY()
语 句 即 可 获 得 需 要 的 视 图 数 据 集。
---- 使 视 图 在 打 开 数 据 库 时 不 立 即 下 载 记 录, 具 体 可 如 下
实 现:
---- * 如 果 是 将 视 图 放 置 到 一 个 表 单 的 数 据 环 境 中, 该 视
图 将 在 数 据 环 境 中 形 成 一 个 游 标 对 象( 如:Cursor1), 设 置
该 游 标 对 象 cursor1 的 NodataOnload 属 性 为 真 即 可。
---- * 如 果 是 在 程 序 中 打 开 数 据 库 和 视 图, 其 打 开 视 图 的
语 句 应 带 NODATA 子 句, 如:
OPEN DATABASE < 数 据 库 名 >
USE < 视 图 名 > NODATA
---- 这 样 视 图 打 开 后, 并 不 会 立 即 下 载 记 录 数 据, 只 有 到
执 行 =REQUERY() 语 句 时, 才 下 载 记 录。 从 而 可 以 达 到 我 们 定
制 动 态 视 图 的 目 的。
---- 如 果 是 在 表 单 的 数 据 环 境 中 使 用 视 图, 则 动 态 视 图 的
参 数 可 以 使 用 表 单 属 性。 比 如, 可 以 给 该 表 单 新 添 一 个
queryvalue 的 属 性, 则 在 视 图 设 计 器 的 筛 选 页 中 可 以 用 如 下
表 达 式 引 用 视 图 参 数:?thisform.queryvalue。
---- 9、 怎 样 设 计 一 个 可 更 新 数 据 源 表 的 本 地 视 图
---- 可 能 你 设 计 的 本 地 视 图, 希 望 在 表 单 应 用 中 能 更 新 相
应 数 据 来 源 的 记 录, 即 当 你 对 视 图 添 加、 修 改 或 删 除 了
记 录 时, 希 望 将 这 些 信 息 反 映 到 相 应 的 数 据 表 中 去, 这 种
可 以 更 新 数 据 源 的 本 地 视 图 的 设 计 相 对 而 言 需 要 考 虑 的
因 素 比 较 多。 必 须 仔 细 设 计 视 图 设 计 器 中 更 新 条 件 页 中
的 各 项 内 容。 具 体 说 来 需 要 考 虑 如 下 方 面:
---- 1、 设 置 关 键 字 段。 要 设 计 一 个 可 更 新 数 据 源 的 本 地
视 图, 必 须 给 本 地 视 图 指 定 一 个 关 键 字 段, 在 更 新 数 据 源
时, 该 关 键 字 段 将 作 为 比 较 本 地 视 图 记 录 与 数 据 源 中 记
录 的 依 据, 由 此 判 别 记 录 是 否 发 生 了 变 化。 可 以 指 定 多
个 字 段 组 合 为 关 键 字 段, 以 保 证 关 键 字 段 能 唯 一 确 定 记
录。 如 果 本 地 视 图 对 应 有 多 个 要 更 新 的 数 据 源 表, 则 必 须
针 对 每 一 个 数 据 源 设 置 至 少 一 个 关 键 字 段。
---- 一 般 地, 应 指 定 对 应 于 数 据 源 中 主 关 键 字 或 候 选 关 键
字 的 字 段 为 视 图 的 关 键 字 段。
---- 在 更 新 条 件 页 的 字 段 名 列 表 中 列 出 了 视 图 中 的 所 有
字 段 名, 点 按 列 表 中 要 指 定 为 关 键 字 段 的 字 段 左 边、 钥 匙
符 号 列 的 位 置, 该 位 置 出 现 一 个 按 钮, 点 按 该 按 钮 使 之
出 现 一 个 对 勾, 表 示 已 指 定 该 字 段 为 关 键 字 段。
---- 可 以 点 按 左 边 的 重 置 关 键 字 按 钮, 重 新 设 置 关 键 字 段
。
---- 2、 指 定 可 更 新 字 段。 只 有 被 指 定 为 可 更 新 字 段 后, 该
字 段 才 可 更 新 数 据 源 中 对 应 的 字 段。 点 按 字 段 名 列 表 中
要 指 定 为 可 更 新 字 段 的 字 段 左 边、 铅 笔 符 号 列 的 位 置,
该 位 置 也 将 出 现 一 个 按 钮, 点 按 该 按 钮 使 之 出 现 一 个 对
勾, 表 示 已 指 定 该 字 段 为 可 更 新 字 段。
---- 没 有 指 定 为 可 更 新 字 段 的 字 段, 是 只 读 字 段, 尽 管 你
改 变 了 视 图 中 只 读 字 段 的 值, 它 们 也 不 能 对 数 据 源 进 行
更 新。
---- 可 以 点 按 左 边 的 全 部 更 新 按 钮, 将 所 有 非 关 键 字 段 设
置 为 可 更 新 字 段。
---- 3、 选 中 更 新 条 件 页 中 的“ 发 送 SQL 更 新” 复 选 框 项。 选
中 它 后, 才 可 将 被 更 新 的 记 录 字 段 采 用 Update SQL 语 法 对
数 据 源 中 的 表 进 行 更 新。
---- 4、 选 择 检 测 更 新 冲 突 的 方 式。 在 更 新 条 件 页 具 有 一
个“SQL WHERE 子 句 包 括” 框, 其 中 的 选 项 用 以 控 制 将 哪 些 字
段 添 加 到 WHERE 子 句 中, 在 将 视 图 修 改 传 送 到 数 据 源 表 时
, 就 可 以 检 测 服 务 器 上 的 更 新 冲 突。 冲 突 是 由 视 图 中 的
旧 值( 而 不 是 指 修 改 后 的 值) 和 数 据 源 的 当 前 值 之 间 的 比
较 结 果 决 定 的(OLDVAL( ) 和 CURVAL( ) 之 间 比 较)。 如 果 两 个
值 相 等, 则 认 为 原 始 值 未 做 修 改, 不 存 在 冲 突; 如 果 它 们
不 相 等, 则 存 在 冲 突, 数 据 源 返 回 一 条 错 误 信 息。
---- 旧 值 和 当 前 值 之 间 的 冲 突 所 返 回 的 错 误 为“ 错 误 1585
: 记 录 已 被 其 他 人 修 改”, 或 者 是“ 错 误 1494: 更 新 冲 突。
请 使 用 TABLEUPDATE() 进 行 强 制 更 新 或 使 用 TABLEREVERT() 回 滚”
。
---- “SQL WHERE 子 句 包 括” 中 包 括 如 下 选 项:
---- 关 键 字 段: 如 果 在 数 据 源 表 中 有 一 个 关 键 字 字 段 被 改
变, 设 置 WHERE 子 句 来 检 测 冲 突。 而 对 于 由 另 一 用 户 对 数
据 源 表 中 原 始 记 录 的 其 他 字 段 所 做 修 改, 则 不 进 行 比 较。
它 是 最 保 守 的 更 新 方 式, 完 全 不 考 虑 在 本 地 视 图 中 输 出
的 字 段 中 哪 些 有 可 更 新 性, 而 将 本 地 视 图 中 的 所 有 记 录
用 关 键 字 段 进 行 比 较。
---- 关 键 字 和 可 更 新 字 段: 如 果 另 一 用 户 修 改 了 任 何 可 更
新 的 字 段, 设 置 WHERE 子 句 来 检 测 冲 突。
---- 关 键 字 和 已 修 改 字 段: 如 果 从 视 图 首 次 检 索( 默 认)
以 后, 关 键 字 字 段 或 数 据 源 表 记 录 的 已 修 改 字 段 中, 某 个
字 段 做 过 修 改, 设 置 WHERE 子 句 来 检 测 冲 突。
---- 关 键 字 段 和 时 间 戳: 它 用 于 远 程 视 图, 对 本 地 视 图 无
用。
---- 5、 选 择 更 新 数 据 源 的 方 式。 在 更 新 条 件 页 具 有 一 个“
使 用 更 新” 框, 它 提 供 了 两 种 更 新 数 据 源 的 方 式 供 选 择,
以 指 定 字 段 如 何 在 后 端 服 务 器 上 更 新:
---- SQL DELETE 然 后 INSERT 方 式: 先 删 除 数 据 源 表 中 原 来 的 记
录, 然 后 再 插 入 一 条 新 的 在 视 图 中 被 修 改 了 的 记 录, 更
新 = 删 除 + 插 入。
---- SQL UPDATE: 用 视 图 字 段 中 的 变 化 来 置 换 修 改 数 据 源 表
的 字 段 值。
---- 只 有 在 仔 细 设 置 好 上 述 各 项 内 容 之 后, 该 本 地 视 图 才
能 用 来 更 新 数 据 源 表 数 据。
------------------------------------------------------------------------
--------
中国计算机世界出版服务公司版权所有
Visual FoxPro 5.0 应 用 开 发 技 巧
湖 南 省 计 生 委 信 息 中 心
罗 辉
---- ( 所 有 图 均 略)Visual FoxPro 5.0 作 为 一 个 新 型 的 前 端 数 据
库 应 用 开 发 工 具, 其 功 能 之 强 大 足 以 让 FoxPro 用 户 和 其 它
数 据 库 应 用 开 发 人 员 莫 名 惊 喜 !
---- 本 文 特 将 作 者 在 Visual FoxPro 5.0 平 台 从 事 应 用 开 发 过
程 中 之 经 验 和 技 巧 总 结 出 来, 希 望 能 助 你 一 臂 之 力。 本 文
是 基 于 中 文 版 Visual FoxPro 5.0 平 台 展 开 讨 论 的。
---- 1、 充 分 利 用 数 据 词 典 功 能 简 化 表 单 设 计
---- Visual FoxPro 5.0 新 增 了 一 个 数 据 辞 典 的 特 性。 数 据 库 的
数 据 辞 典 特 性 便 于 用 来 设 计 与 字 段 层 次 相 关 联 的 对 象 所
属 的 对 象 类( 可 以 是 自 定 义 类), 并 且 可 以 让 用 户 通 过 快
速 拖 曳 的 方 式 来 直 接 设 计 所 需 的 用 户 表 单 中 的 编 辑 对 象
。 当 从 数 据 环 境 设 计 器、 数 据 库 设 计 器 或 者 项 目 管 理 器
中 把 表 或 字 段 拖 到 表 单 上 时, 将 直 接 创 建 默 认 的 控 件 类
型。 例 如, 当 把 一 个 字 符 型 字 段 拖 到 表 单 上 时,Visual FoxPro
将 创 建 一 个 文 本 框。
---- 在 表 设 计 器 中, 我 们 可 以 在 数 据 词 典 中 为 数 据 表 字 段
设 置 如 下 特 性:
---- * 指 定 输 入 和 显 示 字 段 的 格 式 属 性、 注 释 信 息, 它 们
将 在 表 单 设 计 器 中 使 用 拖 曳 技 术 来 设 计 编 辑 字 段 的 对 象
时, 控 制 该 对 象 的 显 示 属 性 如Format、InputMask、Caption、
Comment 等 属 性 的 值。
---- 格 式(Format): 指 定 表 达 式, 使 得 在“ 浏 览” 窗 口、 表 单
或 报 表 中, 确 定 字 段 显 示 时 的 大 小 写、 字 体 大 小 和 样 式。
---- 输 入 掩 码(InputMask): 指 定 字 段 中 输 入 数 值 的 格 式。 例
如, 电 话 号 码 的 格 式 为 (999) 999-9999。
---- 标 题(Caption): 指 定 在“ 浏 览” 窗 口、 表 单 或 报 表 中 代
表 字 段 的 标 签。 表 单 或 报 表 中 的 属 性 设 置 可 覆 盖 此 设 置
。
---- 字 段 注 释(Comment): 提 供 输 入 字 段 注 释 的 位 置。
---- * 指 定 字 段 类 型 匹 配 的 表 单 控 件 对 象 类, 当 在 将 字 段
拖 到 表 单 时, 自 动 用 指 定 的 控 件 类 为 字 段 创 建 相 应 的 控
件 对 象 类。
---- 显 示 库(Display Vcx): 指 定 类 库 的 路 径 和 文 件 名。 如 果
要 浏 览 文 件, 可 使 用 对 话 按 钮。
---- 显 示 类(Display Class): 指 定 字 段 的 默 认 控 件 类。
---- 例 如, 在 我 们 的 一 个 稿 件 系 统 中, 在 表 设 计 器 中 为 稿
件 表Contrib.dbf 中 的Contr_date( 投 稿 日 期) 字 段
---- 其 中, 我 们 设 置 了 输 入 掩 码 为“9999-99-99”, 标 题 为“ 投
稿 日 期”, 并 设 置 了 字 段 注 释“ 投 递 稿 件 的 邮 戳 时 间。”,
其 它 沿 用 默 认 值。
---- 在 表 单 设 计 器 窗 口 上, 将 稿 件 库 添 加 到 数 据 环 境 中,
然 后 拖 曳 数 据 环 境 中 稿 件 库 的Contr_date 字 段 到 表 单 中, 即
出 现 如 图1-2 所 示 的 状 态: 表 单 中 自 动 产 生 一 个 文 本 框 控
件 TxtContr_date, 其 对 应 的Format、Inputmask、Comment 属 性 对 应 为
表 设 计 器 中 Contr_date 字 段 的 格 式、 输 入 掩 码 和 注 释; 并 为
该 文 本 框 配 套 创 建 了 一 个 标 题 为“ 投 稿 日 期” 的 标 签。
---- 当 然, 你 可 以 在 数 据 环 境 中 一 次 选 择 多 个 字 段( 通 过
Shift 键 + 点 按 连 续 选 择, 或 通 过Ctrl 键 + 点 按 间 断 选 择),
然 后 拖 曳 到 表 单 上, 即 可 一 次 性 地 为 多 个 被 选 字 段 产 生
对 应 的 表 单 控 件。 而 且, 针 对 不 同 字 段 类 型, 将 自 动 映 象
套 用 产 生 不 同 的 控 件 类 型。 如 对 备 注 型 字 段, 自 动 套 用
编 辑 框 控 件; 对 逻 辑 型 字 段, 自 动 套 用 检 查 框 控 件; 对 通
用 型 字 段, 自 动 套 用 图 像 控 件, 等 等。
---- 利 用 数 据 词 典, 应 用 表 单 设 计 就 是 如 此 简 单 !
---- 2、 控 制 字 段 类 型 与 控 件 类 型 的 映 象 关 系
---- 上 面 已 经 提 到: 通 过 拖 曳 设 计 应 用 表 单 时, 针 对 不 同
字 段 类 型 可 以 创 建 不 同 的 控 件 类 型。 但 是, 有 时 我 们 可
能 需 要 改 变 字 段 类 型 与 控 件 类 型 的 这 种 默 认 的 映 象 关 系
, 以 达 到 定 制 的 目 的, 譬 如 说 对 字 符 型 字 段, 希 望 拖 曳 产
生 编 辑 框 控 件 而 不 是 默 认 的 文 本 框 控 件; 或 者 对 字 符 型
字 段, 希 望 拖 曳 产 生 我 们 特 制 的 文 本 框 控 件 而 不 是 默 认
的 文 本 框 控 件。 对 这 种 定 制 需 求, 分 两 种 情 况, 一 是 希 望
个 别 字 段 映 象 到 特 定 的 控 件 类 型; 二 是 希 望 某 一 种 字 段
类 型 都 映 象 产 生 特 定 的 控 件 类 型。
---- 如 果 只 是 希 望 个 别 字 段 需 要 映 象 产 生 特 定 的 控 件 类
型, 则 应 在 如 图1-1 的 表 设 计 器“ 匹 配 字 段 类 型 到 类” 框 中
选 择“ 显 示 类” 列 表 框 里 需 要 的 控 件 类 型, 而 不 是 沿 用“
默 认”。 如 果 要 设 置 的 控 件 类 型 不 是 系 统 提 供 的 基 类( 标
准 控 件), 则 你 首 先 需 要 在“ 显 示 库” 框 中 指 定 相 应 的 类
库 文 件, 然 后 再 选 择 其 中 的 类。
---- 如 果 你 希 望 在 所 有 的 表 单 设 计 中 某 一 种 字 段 类 型 都
映 象 为 特 定 的 控 件 类 型, 譬 如 希 望 所 有 的 字 符 型 字 段 都
映 象 产 生 编 辑 框 控 件 而 不 是 默 认 的 文 本 框 控 件, 此 时 则
应 该 改 变 该 字 段 类 型 映 象 到 控 件 类 型 的 默 认 值。 具 体 方
法 是:
---- 1、 选 择“ 工 具/ 选 项” 菜 单 项, 并 选 择 选 项 对 话 框 中 的
字 段 映 象 页, 其 中 的“ 将 字 段 类 型 映 象 到 类 中” 框 中, 显
示 了 系 统 支 持 的 所 有 字 段 类 型 与 控 件 类 之 间 当 前 的 映 象
关 系。 列 表 包 括:
---- 类 型: 数 据 库 支 持 的 所 有 数 据 类 型。 注 意: 其 中 还 额
外 提 供 了 两 个 数 据 库 不 支 持 的 类 型:“ 多 用 途 型” 和“ 标
签 型”。 它 们 的 作 用 是: 当 您 一 次 把 整 个 表 或 多 个 字 段 拖
到 表 单 上 时,“ 多 用 途 型” 用 来 指 定 将 要 创 建 的 类, 系 统
默 认 是 创 建 一 个 网 格 控 件; 而“ 标 签 型”, 则 用 来 指 定 为
字 段 标 题 创 建 的 类。
---- 类 库: 一 个 类 库, 该 类 库 包 含 映 象 到 一 个 字 段 类 型 的
类 定 义。 如 果 该 列 为 空, 表 示 该 字 段 类 型 将 映 象 到 一 个
Visual FoxPro 提 供 的 基 类 上。
---- 类 名: 一 个 字 段 类 型 将 要 映 象 的 类, 它 指 定 了 将 要 创
建 的 控 件 类 型。
---- 修 改: 选 择 该 按 钮 可 以 显 示 字 段 类 型 映 象 对 话 框, 从
中 可 为 选 中 的 字 段 类 型 指 定 一 个 不 同 的 映 象。
---- 2、 点 按 修 改 按 钮, 激 活 字 段 类 型 映 象 对 话 框。
---- 3、 在 字 段 类 型 映 象 对 话 框 内, 在 字 段 类 型 列 表 中 选
择 一 个 字 段 类 型。 若 要 设 置 在 拖 动 一 个 表 或 多 个 记 录 时
将 创 建 的 控 件 类, 则 选 择“ 多 用 途 型”。
---- 4、 在 类 信 息 框 中, 从 类 名 列 表 中 选 择 需 要 的 控 件 类
名 称。 如 果 不 是 基 类, 则 还 需 要 设 定 类 库 文 件 名(.VCX 文 件
), 该 类 库 包 含 您 希 望 与 选 中 字 段 类 型 联 系 在 一 起 的 控
件 类 型。
---- 5、 点 按 确 定 或 应 用 按 钮 来 接 受 这 种 映 象 关 系。
---- 在 这 里 有 必 要 强 调 的 是, 在 字 段 映 象 页 下 部 还 提 供 了
一 组 数 据 库 选 项, 这 些 选 项 也 将 影 响 我 们 结 合 数 据 词 典
通 过 拖 曳 设 计 表 单 的 效 果, 这 组 选 项 是:
---- 拖 放 字 段 标 题: 如 果 希 望 Visual FoxPro 使 用 字 段 的 标 题
为 即 将 创 建 的 控 件 额 外 创 建 一 个 标 签 型 标 题, 则 应 选 中
该 选 项。 如 果 您 清 除 该 选 项,Visual FoxPro 将 不 会 如 图1-2 所
示 一 样 创 建 字 段 标 题。
---- 复 制 字 段 备 注: 选 中 该 选 项 可 以 使 Visual FoxPro 在 创 建
类 时, 把 字 段 的 注 释( 如 果 有 的 话) 复 制 到 控 件 类 的
Comment 属 性 中。
---- 复 制 字 段 输 入 掩 码: 选 中 该 选 项 可 以 使 Visual FoxPro 在
创 建 类 时, 把 字 段 的 输 入 掩 码( 如 果 有 的 话) 复 制 到 控 件
类 的 InputMask 属 性 中。
---- 复 制 字 段 格 式: 选 中 该 选 项 可 以 使 Visual FoxPro 在 创 建
类 时, 把 字 段 的 格 式 设 置( 如 果 有 的 话) 复 制 到 控 件 类 的
Format 属 性 中。
---- 设 定 好 字 段 类 型 与 控 件 类 型 的 映 象 关 系 后, 一 定 要 记
住 点 按 选 项 对 话 框 下 部 的 设 置 为 默 认 值 按 钮, 将 你 的 设
定 保 存 为 默 认 值。
---- 如 此 设 置 后, 结 合 数 据 词 典 通 过 拖 曳 设 计 数 据 库 应 用
表 单 时, 即 可 改 变 字 段 与 控 件 的 映 象 关 系。
---- 3、 如 何 给 表 单 添 加 一 个 数 组 属 性
---- 要 给 表 单 添 加 属 性, 可 选 择“ 表 单/ 新 建 属 性” 菜 单 项
, 在 新 建 属 性 对 话 框 直 接 输 入 属 性 名 和 相 应 注 释, 再 点
按 添 加 按 钮 即 可。 然 而, 又 如 何 该 表 单 添 加 一 个 数 组 属 性
呢 ?
---- 给 表 单 添 加 数 组 属 性, 同 样 选 择“ 表 单/ 新 建 属 性” 菜
单 项, 在 新 建 属 性 对 话 框 直 接 输 入 数 组 属 性 名 和 相 应 注
释 即 可。 但 是, 数 组 属 性 名 中 必 须 用 圆 括 号() 或 方 括 号
[] 带 数 组 下 标。 如 图3-1 所 示, 可 给 当 前 表 单 添 加 一 个3 ×
2 的itemarray 数 组。
---- 添 加 的 数 组 属 性 可 以 在 该 表 单 的 任 何 方 法 程 序 中 改
变 它 的 维 数。 譬 如 对 上 述 数 组 属 性, 我 们 可 以 在 该 表 单 的
Click 事 件 中 添 加 如 下 代 码 进 行 该 数 组 属 性 大 小 的 测 试:
wait windows ' 原 数 组 属 性 维 数:
'+str(alen(thisform.itemarray,1))+;
' ×'+str(alen(thisform.itemarray,2))
dime thisform.itemarray[2,1]
wait windows ' 改 变 后 数 组 维 数:
'+str(alen(thisform.itemarray,1))+;
' ×'+str(alen(thisform.itemarray,2))
---- 运 行 该 表 单 后, 单 击 表 单, 首 先 显 示 原 属 性 itemarray 数
组 维 数 为3 ×2, 击 任 意 键 后 接 着 显 示 改 变 后 属 性
itemarray 数 组 的 维 数 为2 ×1。 由 此 可 见, 数 组 属 性 的 大 小 进
行 了 调 整。
---- 4、“::” 与 DODEFAULT() 函 数 的 使 用 及 区 别
---- 在 Visual FoxPro 3.0 中 提 供 了 一 个 作 用 域 操 作 符“::”, 它
用 于 在 一 个 子 对 象 类 事 件 或 方 法 程 序 中 执 行 父 对 象 类 的
事 件 或 方 法 程 序。 举 例 说, 我 们 首 先 定 义 了 一 个 父 对 象
类 PClass, 并 为 它 设 置 了Init 事 件 代 码, 以 完 成 某 些 初 始 化
操 作。 然 后, 我 们 又 基 于 该 父 类 派 生 出 一 个 子 对 象 类
CClass, 也 需 要 为 它 设 置 一 段 Init 事 件 代 码。 默 认 时, 当 父
类 设 置 了 某 一 个 事 件( 如Init 事 件) 的 事 件 处 理 代 码 而 子
类 在 同 一 个 事 件 中 没 有 设 置 处 理 代 码 时, 表 单 运 行 时 将
执 行 父 类 的 该 事 件 处 理 代 码。 但 是, 当 父 类 和 子 类 的 同
一 个 事 件( 如Init 事 件) 都 设 置 了 事 件 处 理 代 码 时, 表 单 运
行 后, 将 只 运 行 子 类 的 事 件 处 理 代 码, 而 父 类 的 事 件 处
理 代 码 将 被 屏 蔽 不 予 执 行。 然 而, 可 能 我 们 需 要 父 类 和 子
类 的 同 一 个 事 件 处 理 代 码 都 需 运 行, 此 时,Visual FoxPro 3.0
的 处 理 方 法 是 在 子 类 的 事 件 处 理 代 码 前 面, 首 先 用 作 用
域 操 作 符“::” 执 行 父 类 的 事 件 处 理 代 码, 然 后 再 执 行 子
类 附 加 的 其 它 事 件 处 理 代 码。 作 用 域 操 作 符 的 使 用 格 式
是: 父 类 名:: 事 件 名。
---- 譬 如, 在 子 类 CClass 的 Init 事 件 处 理 代 码 中, 添 加 如 下
语 句 行:
PClass::Init
---- 即 可 执 行 父 类 Pclass 的 Init 事 件 代 码。
---- 注 意: 作 用 域 操 作 符 的 使 用 格 式 中 的 父 类 名 是 指 父 类
的 对 象 类 名, 而 不 是 该 对 象 在 表 单 创 建 一 个 具 体 控 件 时
的 控 件 名。
---- 为 便 于 理 解, 特 举 例 加 以 说 明。 下 面 的 程 序 创 建 一 个
表 单, 在 表 单 上 具 有 两 个 按 钮, 其 中 的“ 退 出” 按 钮( 控
件 名 是:cmdQuit) 是 基 于 CommandButton 基 类 创 建 的
cmdQuitButton 对 象 类 的 一 个 具 体 实 例; 而“ 点 按 以 退 出” 按
钮( 控 件 名 是:cmdAnother) 是 基 于 cmdQuitButton 父 类 创 建 的
cmdAnotherButton 子 类 的 一 个 具 体 实 例。 在 子 类 的 Click 事 件 中
是 通 过 cmdQuitButton::Click 语 句 执 行 父 类 的 Click 事 件 处 理 代
码 的。
frmMyForm = CREATEOBJECT("Form")
frmMyForm.Width = 450
frmMyForm.Height = 100
frmMyForm.Caption = " 作 用 域 操 作 符 使 用 举 例"
frmMyForm.AutoCenter =.T.
---- *** 下 面 两 行 语 句 用 于 在 表 单 上 创 建 对 象 类 的 实 例(
具 体 对 象)
frmMyForm.AddObject("cmdQuit","cmdQuitButton")
frmMyForm.AddObject("cmdAnother","cmdAnotherButton")
frmMyForm.SHOW && 显 示 表 单
READ EVENTS && 开 始 事 件 处 理
---- *** 下 面 定 义 对 象 类
DEFINE CLASS cmdQuitButton AS CommandButton &&定义父类
Caption = "退出\< Q" &&命令按钮的标题
Left = 175 &&按钮左边界
Top = 60 &&按钮上边界
Height = 25 &&按钮高度
Visible = .T. &&在表单上显示按钮
FontItalic = .T. &&按钮上文本斜体显示
ForeColor = RGB(0,0,255) &&改变按钮上文本颜色
PROCEDURE Click
WAIT WINDOW "现在正在执行退出按钮(控件名:"+;
" cmdQuit)的 CLICK事件." TIMEOUT 2
CLEAR EVENTS &&停止事件处理程序,关闭表单
ENDDEFINE
DEFINE CLASS cmdAnotherButton AS cmdQuitButton &&定义子类
Caption = "点按以退出"
Left = 175
Top = 30
Height = 25
PROCEDURE Click
WAIT WINDOW "现在正在执行点按以退出按钮"+;
"(控件名:cmdAnotherButton)
的 Click事件." TIMEOUT 2
cmdQuitButton::Click
ENDDEFINE
---- 在Visual FoxPro 5.0 中 仍 支 持 作 用 域 操 作 符 的 用 法, 但 是
它 同 时 提 供 了 一 个 DODEFAULT() 函 数 的 用 法。DODEFAULT() 函 数
用 于 在 子 类 的 事 件 处 理 代 码 中 执 行 父 类 中 同 名 事 件 的 事
件 处 理 代 码。 譬 如, 在 子 类 的 Click 事 件 中 使 用 了
DODEFAULT() 函 数, 它 表 示 执 行 父 类 的 同 名 事 件 Click 的 事 件
处 理 代 码。 其 使 用 格 式 是:
---- DODEFAULT([ 参 数1 [, 参 数2] ...)
---- 其 中 的 参 数1、 参 数2 等 等, 用 于 向 父 类 的 事 件 或 方 法
传 递 参 数。 而 作 用 域 操 作 符“::” 与 DODEFAULT() 函 数 的 使 用
有 点 区 别, 就 是 使 用 作 用 域 操 作 符, 可 以 在 子 类 某 一 事 件
中 执 行 父 类 的 另 一 个 不 同 名 事 件 的 事 件 处 理 代 码, 而
DODEFAULT() 函 数 则 不 行 !
---- 5、 重 新 设 置 网 格 的 记 录 属 性 值 时 的 属 性 复 位 问 题
---- 在 表 单 中 使 用 网 格(Grid) 控 件 对 数 据 表 记 录 作 全 屏 幕
编 辑 操 作 时, 网 格 控 件 与 要 编 辑 的 数 据 表 或 视 图 记 录 的
联 系 是 通 过 设 置 网 格 的 记 录 源 属 性 RecordSource 为 打 开 的
数 据 表 或 视 图 所 在 工 作 区 别 名 来 建 立 的。
---- 在 实 际 操 作 中 发 现, 当 反 复 设 置 网 格 的 RecordSource 属
性 值 时, 网 格 的 其 它 属 性 总 是 复 位 到 它 的 默 认 设 置。 譬 如
, 在 某 一 个 按 输 入 某 一 字 段 值 过 滤 进 行 浏 览 的 表 单 中,
表 单 可 以 反 复 请 求 用 户 输 入 不 同 的 字 段 值, 然 后 通 过
SELECT -SQL 语 句 得 到 满 足 条 件 的 记 录 过 滤 到 一 个 临 时 游 标
中, 网 格 的 RecordSource 属 性 设 置 为 该 游 标 名。 因 为 每 执 行
一 次 SELECT -SQL 语 句, 该 游 标 实 质 上 是 重 新 产 生 一 次, 相
当 于 重 新 设 置 了 一 次 RecordSource 属 性 值。 这 样, 如 果 在 表
单 设 计 状 态 时 为 网 格 控 件 设 置 某 些 属 性, 譬 如 设 置 了
FontName、FontSize、GridLineColor、GridLineWidth、 记 录 的 动 态 显 示
属 性( 如 不 同 记 录 的 分 色 显 示) 如DynamicBackColor、
DynamicForeColor 等 等 属 性, 那 么, 在 第 一 次 查 询 时, 这 些 属
性 可 以 正 常 表 现 出 来, 但 是 在 第 二 次 以 后 的 查 询 中, 这 些
属 性 都 复 原 为 默 认 的 状 态, 好 象 没 有 进 行 设 置 一 样 !
---- 对 于 这 种 需 要 多 次 设 置 网 格 的 RecordSource 属 性 值 的 情
况, 为 避 免 网 格 控 件 的 其 它 属 性 的 复 位, 我 们 可 以 类 似
如 下 处 理:
ThisForm.Grid1.RecordSource=''
&&首先将记录源属性置空
DO dynaqry.qpr
&&执行查询得到新的记录集(Tmpcursor)
ThisForm.LockScreen=.T.
&&锁定屏幕
ThisForm.Grid1.RecordSource='tmpcursor'
&&重新设置记录源属性
ThisForm.LockScreen=.F.
&&解除屏幕锁定
---- 这 样, 通 过 在 更 新 网 格 记 录 源 数 据 之 前, 先 将 记 录 源
属 性 置 空, 再 执 行 查 询 重 新 得 到 记 录 集, 然 后 重 新 设 置
网 格 记 录 源 属 性 到 新 的 记 录 集, 即 可 解 决 网 格 属 性 复 位
的 问 题。
---- 6、SELECT-SQL 中 的 WHERE 和 HAVING 的 区 别
---- 使 用SELECT - SQL 结 构 化 查 询 语 句, 可 以 完 成 几 乎 所 有 的
数 据 表 记 录 查 询 任 务。SELECT - SQL 语 句 功 能 之 强 大, 其 完
成 复 杂 查 询 任 务 的 代 码 之 简 单, 令 许 多 传 统 FoxPro 编 程 者
相 见 恨 晚 !
---- 其 实,FoxPro 2.0 以 后 产 品 都 提 供 了 对 SELECT - SQL 语 句 的
支 持, 只 不 过 随 着 版 本 的 提 高,SELECT - SQL 语 句 的 功 能 也
有 了 很 大 的 增 强。 直 至 Visual FoxPro 5.0 ,SELECT - SQL 语 句 功
能 更 有 了 质 的 飞 跃。 这 在 后 面 的 技 巧 中 可 以 略 见 一 斑。
---- SELECT - SQL 语 句 中 提 供 了 一 个 WHERE 子 句 和 一 个 HAVING 子
句, 两 者 都 是 用 于 构 造 记 录 筛 选 条 件, 以 过 滤 出 满 意 的
查 询 结 果 来。 但 是 两 者 是 有 区 别 的。
---- 首 先, 如 果 是 通 过 查 询 设 计 器 设 计 一 个 查 询( 实 质 是
构 造 一 个SELECT - SQL 语 句), 则 产 生 的 SELECT - SQL 语 句 的
WHERE 子 句 是 通 过 设 计 器 中 的 筛 选(Filter) 页 来 构 造 的; 而
HAVING 子 句 则 必 须 通 过 点 按 分 组(Group By) 页 中 的 满 足 条
件(Having) 按 钮 激 活 满 足 条 件 对 话 框 来 构 造, 但 两 者 的 设
计 构 造 方 式 都 是 一 样 的。
---- 再 次, 两 者 筛 选 记 录 的 时 间 是 不 一 样 的: SELECT - SQL 语
句 首 先 用 通 过 筛 选(Filter) 页 所 设 置 的 筛 选 条 件(WHERE 子
句) 针 对 原 始 数 据 源(FROM 子 句 后 面 的 数 据 表 或 视 图) 进
行 相 应 的 记 录 筛 选 之 后, 再 执 行GROUP BY 子 句 中 之 HAVING 子
句 对 WHERE 子 句 筛 选 出 来 的 记 录 进 行 再 次 筛 选。
---- 第 三,WHERE 子 句 可 以 针 对 数 据 源 的 所 有 字 段 构 造 筛 选
条 件; 而 HAVING 子 句 则 只 能 对 SELECT - SQL 语 句 输 出 的 字 段(
包 括 实 际 的 字 段 和 计 算 字 段) 构 造 筛 选 条 件, 但 是 由 于
它 可 对 计 算 字 段 构 造 条 件, 而 计 算 字 段 可 由 任 何 合 法 的
表 达 式 构 成, 因 而 用 HAVING 构 造 筛 选 条 件 更 加 灵 活。 例 如
下 例:
SELECT zh,;
AVG(jffse) AS rjjffse,SUM(jffse) AS zjffse,;
AVG(dffse) AS rjdffse,SUM(dffse) AS zdffse;
From Bankdata!fhz ;
WHERE fhz.zh >=2010001000149 AND fhz.zh< 3010001000157;
GROUP BY zh ;
HAVING rjjffse >100000
---- 上 例 从 银 行 会 计 分 户 明 细 帐 上 统 计 帐 号 2010001000149 到
3010001000157 之 间 的 帐 号 中 日 均 借 方 发 生 额 在 十 万 元 以 上
的 帐 户 有 关 发 生 额 的 信 息。 其 中 的“ 日 均 借 方 发 生 额 在
十 万 元 以 上” 的 条 件 如 果 用 WHERE 子 句 来 构 造, 相 应 语 句 如
下:
SELECT zh,;
AVG(jffse) AS rjjffse,SUM(jffse) AS zjffse,;
AVG(dffse) AS rjdffse,SUM(dffse) AS zdffse;
From Bankdata!fhz ;
WHERE fhz.zh >=2010001000149 AND fhz.zh< 3010001000157;
AND AVG(jffse) >100000;
GROUP BY zh
---- 显 然, 通 过 WHERE 子 句 来 构 造 的 筛 选 条 件, 其 必 须 通 过
表 达 式 对 日 均 发 生 额 进 行 重 复 计 算, 对 查 询 效 率 有 很 大
的 影 响。
---- 第 四, 对 相 同 字 段 名 构 造 相 同 的 筛 选 条 件 时, 使 用
WHERE 子 句 较 之 使 用 HAVING 子 句 构 造 条 件 执 行 效 果 更 佳。 譬
如 如 下 语 句:
SELECT zh,;
AVG(jffse) AS借方日均发生额,
SUM(jffse) AS借方总发生额,;
AVG(dffse) AS贷方日均发生额,
SUM(dffse) AS贷方总发生额;
From Bankdata!fhz ;
WHERE fhz.zh=2010001000149 ;
GROUP BY zh
和语句:
SELECT zh,;
AVG(jffse) AS借方日均发生额,SUM(jffse) AS借方总发生额,;
AVG(dffse) AS贷方日均发生额,SUM(dffse) AS贷方总发生额;
From Bankdata!fhz ;
GROUP BY zh ;
HAVING zh=2010001000149
---- 两 者 的 筛 选 条 件 分 别 是 用 WHERE 子 句 和 HAVING 子 句 完 成
的, 都 是 用 于 从 银 行 会 计 分 户 明 细 帐 上 统 计 帐 号
2010001000149 有 关 发 生 额 的 信 息 的。 但 是 两 者 的 执 行 效 率,
前 者 效 果 更 佳 !
---- 因 此, 在 实 际 设 计 SELECT - SQL 语 句 时, 必 须 根 据 自 己 的
需 要, 有 针 对 性 的 使 用 WHERE 子 句 和 HAVING 子 句。
---- 7、 两 表 连 接 的 五 种 连 接 方 式 的 使 用
---- 在 Visual FoxPro 3.0 以 前 版 本,SELECT - SQL 语 句 只 提 供 了 无
连 接 和 连 接 两 种 方 式。 现 在 在 Visual FoxPro 5.0 开 始,SELECT -
SQL 为 两 表 以 上 的 连 接 提 供 了 五 种 连 接 方 式: 无 连 接、 内
连 接、 左 连 接、 右 连 接、 满 连 接。 它 们 到 底 有 些 什 么 区 别
呢 ?
---- 假 设 我 们 具 有 如 下 两 个 表:
表
表1:table1
表2:table2
字 段 名
字 段 名
记 录 号
fld1
fld2
fld3
fld4
1
a11
a12
a11
b12
2
a21
a22
a21
b22
3
a31
a32
b31
b32
---- 通 过SELECT-SQL 命 令 对 两 个 或 两 个 以 上 的 数 据 表 进 行 连
接 查 询 时, 如 果 没 有 设 置 数 据 表 之 间 的 连 接 条 件, 即 无
连 接 方 式, 则 会 造 成 查 询 结 果 中 记 录 条 数 为 数 据 表 记 录
数 相 乘。 譬 如, 如 下 语 句:
SELECT * FROM table1,table2
---- 将 得 到 如 下 一 个 记 录 集:
---- 无 连 接 时 产 生 的 结 果 记 录 集
字 段 名
记 录 号
fld1
fld2
fld3
fld4
1
a11
a12
a11
b12
2
a11
a12
a21
b22
3
a11
a12
b31
b32
4
a21
a22
a11
b12
5
a21
a22
a21
b22
6
a21
a22
b31
b32
7
a31
a32
a11
b12
8
a31
a32
a21
b22
9
a31
a32
b31
b32
---- 表1 三 条 记 录 与 表2 三 条 记 录 交 叉 连 接 产 生 了9 条 记 录
出 来。
---- 如 果 使 用SELECT - SQL 语 句 的 内 连 接(INNER JOIN), 两 个 连
接 的 数 据 表 中 必 须 同 时 存 在 连 接 条 件 中 设 置 的 字 段 或 字
段 表 达 式 中 的 字 段。 它 将 两 个 数 据 表 中 满 足 指 定 连 接 条
件 的 记 录 筛 选 出 来。 内 连 接 实 质 就 是 以 前 版 本 的 连 接 方
式, 它 是 默 认 的 连 接 方 式。 譬 如, 用 如 下 语 句 基 于 表1 的
fld1 字 段 和 表2 的 fld3 字 段 的 内 连 接:
SELECT * FROM table1 INNER JOIN table2 ;
ON table1.fld1=table2.fld3
---- 将 得 到 如 下 一 个 记 录 集:
---- 内 连 接 时 产 生 的 结 果 记 录 集
字 段 名
记 录 号
fld1
fld2
fld3
fld4
1
a11
a12
a11
b12
2
a21
a22
a21
b22
---- 内 连 接 方 式 将 连 接 的 两 个 表 中 都 满 足 指 定 条 件 的 记
录 过 滤 出 来。
---- 使 用 左 连 接(LEFT OUTER JOIN), 它 以 左 边 表 为 主, 用 于 对
连 接 条 件 左 边 字 段 所 在 的 表 进 行 全 部 记 录 查 询, 并 连 接
条 件 右 边 字 段 所 在 表 满 足 连 接 条 件 的 记 录 进 行 查 询。 当
左 边 数 据 表 中 有 记 录 而 右 边 数 据 表 中 无 相 应 连 接 条 件 的
记 录 时, 则 输 出 的 右 边 数 据 表 字 段 内 容 呈 现 空 值(NULL)。
譬 如 如 下 语 句:
SELECT * FROM table1 LEFT OUTER JOIN table2 ;
ON table1.fld1=table2.fld3
---- 将 得 到 如 下 一 个 记 录 集:
---- 左 连 接 时 产 生 的 结 果 记 录 集
字 段 名
记 录 号
fld1
fld2
fld3
fld4
1
a11
a12
a11
b12
2
a21
a22
a21
b22
3
a31
a32
---- 从 表 上 可 以 看 出, 左 连 接 产 生 的 结 果 记 录 集 中 以 连 接
关 系 的 左 边 数 据 表 为 基 准, 将 左 边 记 录 全 部 输 出, 同 时
对 满 足 左 连 接 条 件 的 右 边 数 据 表 中 相 关 记 录 的 内 容 也 输
出。 而 对 右 边 表 中 无 满 足 连 接 条 件 的 左 边 表 记 录, 其 输
出 结 果 中 有 关 右 边 记 录 信 息 全 置 空。
---- 使 用 右 连 接(RIGHT OUTER JOIN), 与 左 连 接 方 式 相 反, 它
以 右 边 表 为 主, 用 于 对 连 接 条 件 右 边 字 段 所 在 的 表 进 行
全 部 记 录 查 询, 并 连 接 条 件 左 边 字 段 所 在 表 满 足 连 接 条
件 的 记 录 进 行 查 询。 当 右 边 数 据 表 中 有 记 录 而 左 边 数 据
表 中 无 相 应 连 接 条 件 的 记 录 时, 则 输 出 的 左 边 数 据 表 字
段 内 容 呈 现 空 值(NULL)。 譬 如 如 下 语 句:
SELECT * FROM table1 RIGHT OUTER JOIN table2 ;
ON table1.fld1=table2.fld3
---- 将 得 到 如 下 一 个 记 录 集:
---- 右 连 接 时 产 生 的 结 果 记 录 集
字 段 名
记 录 号
fld1
fld2
fld3
fld4
1
a11
a12
a11
b12
2
a21
a22
a21
b22
3
b31
b32
---- 使 用 左 连 接 或 右 连 接 方 式, 可 以 方 便 地 查 找 到 两 个 关
联 表 中, 其 中 一 个 表 有 记 录 而 另 一 个 表 中 无 相 关 记 录 的
情 况。 一 般 用 于 父 表 和 子 表 中 记 录 相 关 的 合 法 性 检 索。
譬 如, 下 面 语 句:
SELECT * FROM table1 RIGHT OUTER JOIN table2 ;
ON table1.fld1=table2.fld3 ;
WHERE EMPTY(fld1)
---- 可 以 方 便 地 将 表2 有 记 录 而 表1 中 不 存 在 相 应 的 关 联 记
录 的 情 况 检 索 出 来, 结 果 只 有 一 条 记 录, 就 是 上 表 中 的
第3 条 记 录。 在 以 前 版 本 的SELECT - SQL 语 句 中, 要 完 成 这 种
查 询 任 务, 相 对 就 要 复 杂 得 多 了, 一 般 而 言 它 必 须 借 助 于
子 查 询 的 方 式 才 能 达 到 目 的。
---- 使 用 满 连 接(FULL OUTER JOIN), 它 实 质 上 是 左 连 接 和 右
连 接 方 式 的 组 合。 查 询 结 果 记 录 集 中 集 合 了 连 接 两 边 的
表 记 录, 包 括 符 合 条 件 和 不 符 合 条 件 的 记 录。 但 是, 与 无
连 接 方 式 不 同, 它 并 不 是 交 叉 连 接。 满 连 接 的 结 果 集 分
三 部 分: 一 部 分 记 录 是 两 边 都 满 足 连 接 条 件 的 记 录, 其 中
涉 及 的 左 边 表 内 容 和 右 边 表 记 录 内 容 都 输 出; 第 二 部 分
是 不 满 足 连 接 条 件 的 左 边 表 记 录, 此 时 其 涉 及 的 右 边 表
记 录 内 容 置 空; 第 三 部 分 是 不 满 足 连 接 条 件 的 右 边 表 记
录, 此 时 其 涉 及 的 左 边 表 记 录 内 容 置 空。 例 如, 如 下 满 连
接 语 句:
SELECT * FROM table1 FULL OUTER JOIN table2 ;
ON table1.fld1=table2.fld3
---- 将 得 到 如 下 一 个 记 录 集:
---- 满 连 接 时 产 生 的 结 果 记 录 集
字 段 名
记 录 号
fld1
fld2
fld3
fld4
1
a11
a12
a11
b12
2
a21
a22
a21
b22
3
a31
a32
4
b31
b32
---- 使 用 满 连 接 方 式, 可 以 方 便 地 查 找 到 两 个 关 联 表( 父
子 表) 中, 一 次 性 查 找 到 有 父 无 子 和 有 子 无 父 的 记 录 情
况。
---- 从 上 面 可 以 总 结 出, 对 不 同 的 连 接 方 式, 结 果 集 中 的
记 录 数 不 同: 对 无 连 接 方 式, 其 结 果 是 两 边 表 记 录 的 迪
卡 尔 积; 对 内 连 接 方 式, 其 结 果 是 两 边 表 记 录 的 交 集; 对
左 连 接 方 式, 其 结 果 是 左 边 表 记 录 数; 对 右 连 接 方 式, 其
结 果 是 右 边 表 记 录 数; 对 满 连 接 方 式, 其 结 果 是 两 边 表
记 录 的 并 集。
---- 8、 视 图 中 的 动 态 条 件 设 置
---- FoxPro 产 品 已 经 在 我 们 国 家 流 行 了 这 么 多 年, 但 似 乎
可 以 肯 定 的 一 点 是, 绝 大 部 分 FoxPro 用 户, 包 括 应 用 开 发
者, 对 有 关“ 视 图” 的 概 念 和 使 用 都 不 太 清 楚。
---- Visual FoxPro 提 供 的 视 图, 实 质 是 一 个 虚 拟 的 数 据 表,
并 不 对 应 于 一 个 具 体 的 磁 盘 文 件。 视 图, 通 过 一 定 的 连 接
关 系 和 记 录 筛 选 条 件, 将 来 自 于Visual FoxPro 数 据 表 或 后 端
数 据 库 的 数 据 集 合 到 一 起, 通 过 这 个 数 据 集, 可 以 方 便
地 进 行 查 询、 更 新 或 多 数 据 表 间 的 数 据 连 接 等 操 作, 它 同
时 能 将 基 于 视 图 更 新 的 数 据 对 应 到 相 应 的 数 据 表 中 的 相
应 记 录 中。 视 图 技 术, 可 以 大 大 简 化 数 据 表 应 用 的 设 计
工 作。
---- 视 图 存 在 于 数 据 库 中, 可 以 通 过 视 图 设 计 器 可 视 创 建
, 或 者 通 过 CREATE VIEW 命 令 程 序 创 建。 视 图 中 的 记 录 数 据
集 并 不 实 际 存 在, 而 是 在 每 次 打 开 该 视 图 时, 自 动 临 时 从
相 关 数 据 表 中 下 载 记 录 到 视 图 中。
---- 一 般 地, 在 一 个 应 用 模 块 中, 我 们 是 基 于 一 组 特 定 数
据 而 不 是 全 部 数 据 进 行 处 理。 因 此, 为 提 高 处 理 效 率, 一
般 视 图 都 设 置 一 定 的 筛 选 条 件, 以 保 证 只 将 满 足 条 件 的
记 录 下 载 到 视 图 中, 而 不 是 下 载 全 部 记 录。
---- 现 在 的 问 题 是, 如 果 在 一 个 应 用 表 单 中, 我 们 需 要 重
复 多 次 用 不 同 的 筛 选 条 件 重 新 形 成 视 图 以 得 到 不 同 的 记
录 集, 如 何 来 设 置 这 个 动 态 的 筛 选 条 件 呢 ?
---- 譬 如, 针 对 上 一 节 的 两 个 数 据 表:table1、table2, 我 们 通
过 视 图 设 计 器, 采 用 内 连 接 方 式, 连 接 条 件 是:table1.
fld1=table2.fld3。 第 一 次 用 fld1="a11" 的 筛 选 条 件 形 成 关 于
fld1 字 段 值 是“a11” 的 视 图; 完 成 一 定 的 处 理 后, 又 需 要 第
二 次 用 fld1="a21" 的 筛 选 条 件 形 成 关 于 fld1 字 段 值 是“a21”
的 视 图; 完 成 一 定 的 处 理 后, 第 三 次 又 用 fld1 等 于 其 它 字
段 值 的 筛 选 条 件 形 成 新 的 视 图, 等 等。 条 件 是 根 据 应 用
执 行 时 用 户 输 入 动 态 变 化 的, 在 视 图 中 如 何 来 设 置 这 种
动 态 条 件 呢 ?
---- 其 处 理 实 质 很 简 单: 使 用 参 数 的 方 式 设 置 筛 选 条 件,
向 视 图 传 递 参 数, 可 以 通 过 在 一 个 变 量 名 前 置 一 个 问 号
( ?) 即 可, 注 意 问 号 与 变 量 名 中 间 不 能 存 在 空 格 或 其 它
空 白 符 ! 选 择 视 图 设 计 器 的 筛 选(Filter) 页, 在 字 段 名(
FieldName) 框 选 中 fld1 字 段, 在 实 例(Sample) 框 输 入:
?fld1value。
---- 对 上 面 设 计 的 动 态 视 图, 每 次 打 开 数 据 库 时, 在 形 成
该 视 图 数 据 集 之 前 将 出 现 一 个 视 图 参 数 对 话 框, 如 图8 -
1 所 示, 请 求 输 入 一 个 字 段 值。
---- 然 后 在 程 序 中, 可 以 每 次 重 新 给 fld1value 变 量 赋 值, 再
紧 跟 着 执 行 一 条:=REQUERY() 语 句, 即 可 完 成 另 一 个 条 件 的
视 图 的 形 成。
---- 但 是, 这 种 一 打 开 数 据 库 就 出 现 一 个 对 话 框 请 求 输 入
变 量 值 的 方 式 很 不 友 好。 改 进 的 方 法 是, 设 计 视 图, 使 在
打 开 数 据 库 时 首 先 不 下 载 记 录, 这 样 就 不 会 立 即 出 现 极
不 友 好 的 视 图 参 数 对 话 框 了; 然 后 在 表 单 或 程 序 中, 通
过 程 序 获 得 fld1value 变 量 的 一 次 输 入 值, 再 执 行 =REQUERY()
语 句 即 可 获 得 需 要 的 视 图 数 据 集。
---- 使 视 图 在 打 开 数 据 库 时 不 立 即 下 载 记 录, 具 体 可 如 下
实 现:
---- * 如 果 是 将 视 图 放 置 到 一 个 表 单 的 数 据 环 境 中, 该 视
图 将 在 数 据 环 境 中 形 成 一 个 游 标 对 象( 如:Cursor1), 设 置
该 游 标 对 象 cursor1 的 NodataOnload 属 性 为 真 即 可。
---- * 如 果 是 在 程 序 中 打 开 数 据 库 和 视 图, 其 打 开 视 图 的
语 句 应 带 NODATA 子 句, 如:
OPEN DATABASE < 数 据 库 名 >
USE < 视 图 名 > NODATA
---- 这 样 视 图 打 开 后, 并 不 会 立 即 下 载 记 录 数 据, 只 有 到
执 行 =REQUERY() 语 句 时, 才 下 载 记 录。 从 而 可 以 达 到 我 们 定
制 动 态 视 图 的 目 的。
---- 如 果 是 在 表 单 的 数 据 环 境 中 使 用 视 图, 则 动 态 视 图 的
参 数 可 以 使 用 表 单 属 性。 比 如, 可 以 给 该 表 单 新 添 一 个
queryvalue 的 属 性, 则 在 视 图 设 计 器 的 筛 选 页 中 可 以 用 如 下
表 达 式 引 用 视 图 参 数:?thisform.queryvalue。
---- 9、 怎 样 设 计 一 个 可 更 新 数 据 源 表 的 本 地 视 图
---- 可 能 你 设 计 的 本 地 视 图, 希 望 在 表 单 应 用 中 能 更 新 相
应 数 据 来 源 的 记 录, 即 当 你 对 视 图 添 加、 修 改 或 删 除 了
记 录 时, 希 望 将 这 些 信 息 反 映 到 相 应 的 数 据 表 中 去, 这 种
可 以 更 新 数 据 源 的 本 地 视 图 的 设 计 相 对 而 言 需 要 考 虑 的
因 素 比 较 多。 必 须 仔 细 设 计 视 图 设 计 器 中 更 新 条 件 页 中
的 各 项 内 容。 具 体 说 来 需 要 考 虑 如 下 方 面:
---- 1、 设 置 关 键 字 段。 要 设 计 一 个 可 更 新 数 据 源 的 本 地
视 图, 必 须 给 本 地 视 图 指 定 一 个 关 键 字 段, 在 更 新 数 据 源
时, 该 关 键 字 段 将 作 为 比 较 本 地 视 图 记 录 与 数 据 源 中 记
录 的 依 据, 由 此 判 别 记 录 是 否 发 生 了 变 化。 可 以 指 定 多
个 字 段 组 合 为 关 键 字 段, 以 保 证 关 键 字 段 能 唯 一 确 定 记
录。 如 果 本 地 视 图 对 应 有 多 个 要 更 新 的 数 据 源 表, 则 必 须
针 对 每 一 个 数 据 源 设 置 至 少 一 个 关 键 字 段。
---- 一 般 地, 应 指 定 对 应 于 数 据 源 中 主 关 键 字 或 候 选 关 键
字 的 字 段 为 视 图 的 关 键 字 段。
---- 在 更 新 条 件 页 的 字 段 名 列 表 中 列 出 了 视 图 中 的 所 有
字 段 名, 点 按 列 表 中 要 指 定 为 关 键 字 段 的 字 段 左 边、 钥 匙
符 号 列 的 位 置, 该 位 置 出 现 一 个 按 钮, 点 按 该 按 钮 使 之
出 现 一 个 对 勾, 表 示 已 指 定 该 字 段 为 关 键 字 段。
---- 可 以 点 按 左 边 的 重 置 关 键 字 按 钮, 重 新 设 置 关 键 字 段
。
---- 2、 指 定 可 更 新 字 段。 只 有 被 指 定 为 可 更 新 字 段 后, 该
字 段 才 可 更 新 数 据 源 中 对 应 的 字 段。 点 按 字 段 名 列 表 中
要 指 定 为 可 更 新 字 段 的 字 段 左 边、 铅 笔 符 号 列 的 位 置,
该 位 置 也 将 出 现 一 个 按 钮, 点 按 该 按 钮 使 之 出 现 一 个 对
勾, 表 示 已 指 定 该 字 段 为 可 更 新 字 段。
---- 没 有 指 定 为 可 更 新 字 段 的 字 段, 是 只 读 字 段, 尽 管 你
改 变 了 视 图 中 只 读 字 段 的 值, 它 们 也 不 能 对 数 据 源 进 行
更 新。
---- 可 以 点 按 左 边 的 全 部 更 新 按 钮, 将 所 有 非 关 键 字 段 设
置 为 可 更 新 字 段。
---- 3、 选 中 更 新 条 件 页 中 的“ 发 送 SQL 更 新” 复 选 框 项。 选
中 它 后, 才 可 将 被 更 新 的 记 录 字 段 采 用 Update SQL 语 法 对
数 据 源 中 的 表 进 行 更 新。
---- 4、 选 择 检 测 更 新 冲 突 的 方 式。 在 更 新 条 件 页 具 有 一
个“SQL WHERE 子 句 包 括” 框, 其 中 的 选 项 用 以 控 制 将 哪 些 字
段 添 加 到 WHERE 子 句 中, 在 将 视 图 修 改 传 送 到 数 据 源 表 时
, 就 可 以 检 测 服 务 器 上 的 更 新 冲 突。 冲 突 是 由 视 图 中 的
旧 值( 而 不 是 指 修 改 后 的 值) 和 数 据 源 的 当 前 值 之 间 的 比
较 结 果 决 定 的(OLDVAL( ) 和 CURVAL( ) 之 间 比 较)。 如 果 两 个
值 相 等, 则 认 为 原 始 值 未 做 修 改, 不 存 在 冲 突; 如 果 它 们
不 相 等, 则 存 在 冲 突, 数 据 源 返 回 一 条 错 误 信 息。
---- 旧 值 和 当 前 值 之 间 的 冲 突 所 返 回 的 错 误 为“ 错 误 1585
: 记 录 已 被 其 他 人 修 改”, 或 者 是“ 错 误 1494: 更 新 冲 突。
请 使 用 TABLEUPDATE() 进 行 强 制 更 新 或 使 用 TABLEREVERT() 回 滚”
。
---- “SQL WHERE 子 句 包 括” 中 包 括 如 下 选 项:
---- 关 键 字 段: 如 果 在 数 据 源 表 中 有 一 个 关 键 字 字 段 被 改
变, 设 置 WHERE 子 句 来 检 测 冲 突。 而 对 于 由 另 一 用 户 对 数
据 源 表 中 原 始 记 录 的 其 他 字 段 所 做 修 改, 则 不 进 行 比 较。
它 是 最 保 守 的 更 新 方 式, 完 全 不 考 虑 在 本 地 视 图 中 输 出
的 字 段 中 哪 些 有 可 更 新 性, 而 将 本 地 视 图 中 的 所 有 记 录
用 关 键 字 段 进 行 比 较。
---- 关 键 字 和 可 更 新 字 段: 如 果 另 一 用 户 修 改 了 任 何 可 更
新 的 字 段, 设 置 WHERE 子 句 来 检 测 冲 突。
---- 关 键 字 和 已 修 改 字 段: 如 果 从 视 图 首 次 检 索( 默 认)
以 后, 关 键 字 字 段 或 数 据 源 表 记 录 的 已 修 改 字 段 中, 某 个
字 段 做 过 修 改, 设 置 WHERE 子 句 来 检 测 冲 突。
---- 关 键 字 段 和 时 间 戳: 它 用 于 远 程 视 图, 对 本 地 视 图 无
用。
---- 5、 选 择 更 新 数 据 源 的 方 式。 在 更 新 条 件 页 具 有 一 个“
使 用 更 新” 框, 它 提 供 了 两 种 更 新 数 据 源 的 方 式 供 选 择,
以 指 定 字 段 如 何 在 后 端 服 务 器 上 更 新:
---- SQL DELETE 然 后 INSERT 方 式: 先 删 除 数 据 源 表 中 原 来 的 记
录, 然 后 再 插 入 一 条 新 的 在 视 图 中 被 修 改 了 的 记 录, 更
新 = 删 除 + 插 入。
---- SQL UPDATE: 用 视 图 字 段 中 的 变 化 来 置 换 修 改 数 据 源 表
的 字 段 值。
---- 只 有 在 仔 细 设 置 好 上 述 各 项 内 容 之 后, 该 本 地 视 图 才
能 用 来 更 新 数 据 源 表 数 据。
------------------------------------------------------------------------
--------
中国计算机世界出版服务公司版权所有
--
大海无边天做岸
山登绝顶我为风
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.227.121]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:830.211毫秒