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)
页面执行时间:852.300毫秒