现在的位置: 首页 >> 数据库 >> FoxPro >> 使用视图 - 尝试一
添加时间:2005-8-17 来源:网教中国 作者:
使用视图 - 尝试一

第二节 使用视图 - 尝试一

第一种创建图书馆应用程序的方法是使用远程视图。视图易于设置,可以参数化,因此可以一次只返回一个或少量的记录,支持行缓存和表缓存以及事务处理。拥有这些内置的能力,只有在疏忽的的情况下你才不会考虑使用视图来创建客户服务器应用程序。

视图

在图书馆数据库中(Visual FoxPro 版) 你可以找到远程视图 vAdultMember 和 vJuvenileMember。下面的 SQL 语句用于定义这两个视图:

SELECT Member.member_no, Member.lastname, Member.firstname, ;
       Member.middleinitial, Adult.street, Adult.city, ;
       Adult.state, Adult.zip, Adult.phone_no, Adult.expr_date ;
FROM dbo.adult Adult, dbo.member Member ;
WHERE Adult.member_no = Member.member_no ;
  AND Member.member_no = ?nMemberID

SELECT Member.member_no, Member.lastname, Member.firstname, ;
       Member.middleinitial, Juvenile.adult_member_no, ;
       Juvenile.birth_date, Adult.street, Adult.city, Adult.state, ;
       Adult.zip, Adult.phone_no, Adult.expr_date ;
FROM dbo.adult Adult, dbo.juvenile Juvenile, ;
     dbo.member Member ;
WHERE Adult.member_no = Juvenile.adult_member_no ;
  AND Juvenile.member_no = Member.member_no ;
  AND Member.member_no = ?nMemberID

两个视图是非常直截了当的。成员的名字在 Member 表中地址在 Adult 表中。少年的出生日期和担保人可以在 Juvenile 表中找到。两个视图基于相同的连接,并确定各表的主关键字、标记其它字段是可更新的以使它们是可修改的。这些出现在视图设计器中的更新条件标签中。

载入表单

表单 MEMBVIEW.SCX 使用了这两个视图。以下是表单的 Load 方法代码。因为两个视图是用 NoData 选项打开,所以表单最初没有载入数据。然后设置视图游标为开放式行缓存。

Open Database library
Use vAdultMember In 0 NoData
= CursorSetProp("Buffering", DB_BUFOPTRECORD, ;
                "vAdultMember")
Use vJuvenileMember In 0 NoData
= CursorSetProp("Buffering", DB_BUFOPTRECORD, ;
                "vJuvenileMember"

定位一个成员

用户可以输入一个成员的 ID 并按下定位按钮。这样做就向视图所需的参数 nMemberID 提供一个值。以下是定位按钮的 Click 事件代码:

nMemberID = Val(ThisForm.txtMemberID.Value)

Select vAdultMember
= ReQuery()
If RecCount("vAdultMember") = 0
  Select vJuvenileMember
  = ReQuery()
  If RecCount("vJuvenileMember") = 0
    lcMessage = "设有该 ID 成员。"
    = MessageBox(lcMessage , MB_ICONINFORMATION)
<略去的代码>

代码首先检查用户是否修改了数据。然后保存输入的 ID 到变量 nMemberID 中。Adult 视图首先被请求。如果没有找到该 ID 则请求 Juvenile 视图。如果没有找到该 ID 的记录则该 ID 是无效的。如果找到了则该成员的信息显示在表单中。

添加一个成员

当用户单击 Add 按钮时他们会得到一外空的表单。在用户按下 Save 按钮前记录并未被保存。Add 按钮的 Click 事件中的代码首先检查用户是否修改了当前成员的信息。如果没有记录改变则发布一个 TableRevert()。然后添加一个空记录到视图中并刷新表单。用户可以在空的记录上输入成员信息。当用户按政 Save 时,Visual FoxPro 将发送新的记录到 SQL Server。

保存修改

视图的一个好的功能是后端为你处理这些。TableUpdate() 函数用于保存对视图的修改到源表中。Visual FoxPro 自动处理这一点。以下是 Save 按钮的 Click 代码:

If TableUpdate()
  = MessageBox(lcMessage, MB_ICONINFORMATION)
Else
  ThisForm.ShowError
Endif

取决于当前成员是成年人或少年 ,vAdultMember 或 vJuvenileMember 视图被选定。然后发布一个 TableUpdate()。如果成功,数据被保存。否则向用户显示发生了什么问题。 注意因为使用了 TableUpdate(),它可以处理新添加的成员或对成员信息的修改。

删除一个成员

要删除后端上的一条记录只需在视图中删除它。以下是 Delete 按钮的 Click 事件代码:

Select (ThisForm.cViewInUse)
Delete
If TableUpdate()
  = MessageBox("This member has been deleted.", ;
               MB_ICONINFORMATION)
  Append Blank
……
Else
  ThisForm.ShowError
  =TableRevert()
Endif

在询问用户确认删除选定视图的记录后,记录从视图中删除并发布 TableUpdate() 。如果成功,记录从后端删除。否则,向用户显示错误原因。

问题

Visual FoxPro 不是奇妙的吗? 客户服务器是多么的容易,你可能会想? 该表单是非常简单和易于使用。但这里有三个问题。

不能添加新成员

要测试这些问题,单击 Add 按钮,添加一个新成员并单击 Save。很快你会看到如图2所示的信息。

图 2 添加成员时的错误信息

在按下 Add 按钮时,一个空记录添加到 vAdultMember 视图游标中。该视图由两个表组成,Adult 和 Member。在按下 Save 按钮时,Visual FoxPro 发送 name 信息到 Member 表。SQL Server 自动提供 member ID。因此很好。Visual FoxPro 也发送地址信息到 Adult 表。但关于成员的 ID,它没有发送任何东西。该字段保持为空,这是非法的并造成 TableUpdate() 失败。

要处理这一问题,新记录需要首先添加到 Member 表,并且结果 ID 需要根据地址信息放到 Adult 表。没有理由认为 Visual FoxPro 的视图知道这些。为什么会这样? Visual FoxPro 不知道是什么 ID ,且不知道在 Adult 表中发送它。

不能删除成员

在图书馆数据库中(SQL Server 版) 在 Adult 和 Juvenile 表及 Member 和 Loan 间有着参照完整性。如果一个成员负责有少年成员或她/他还有未还清的借书,你就不能删除他/她。你可以期望 SQL Server 拒绝该删除并发送加一个错误提示。



[1] [2]  下一页


上一篇:使用视图 - 尝试二 下一篇:SQL Server 6.5 基本图书馆应用程序示例数据
大部分文章摘自网上,如有侵犯您的权益请与我们联系,我们会第一时间进行处理,谢谢! [ 打印文章 ] [ 关闭窗口 ]
推荐文章
·使用FOXPRO编一个完整的软件
·Foxpro 程序的调试
·Foxpro 程序的测试与调试
·Foxpro 默认的工作环境
·Foxpro 创建你自己的向导
·附表:"选项"对话框的说明(2)
·附表:"选项"对话框的说明(3)
·foxpro 更新源表
·foxpro 多个本地数据
相关文章
·使用视图 - 尝试二
最新文章
·什么是项目管理器,数据库和表的
·见识一下面向对象的编程
·FOXPRO 对象、属性、事件、方法
·FOXPRO 常用的对象、属性、事件(
·FOXPRO常用编程命令及常用函数
·使用FOXPRO编一个完整的软件
·Foxpro 编程中的一些小技巧
·Foxpro 程序的调试
·Foxpro 软件的编译及制作安装盘
·Foxpro 更多对象
Google