首页 > 开发 > 综合 > 正文

使用视图 - 尝试一

2024-07-21 02:10:26
字体:
来源:转载
供稿:网友

第二节 使用视图 - 尝试一

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

视图

在图书馆数据库中(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 = ?nmemberidselect 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 libraryuse 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.showerrorendif

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

删除一个成员

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

select (thisform.cviewinuse)deleteif 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 拒绝该删除并发送加一个错误提示。

但是,如果一个成员没在相关少年和借书,你可以删除一个他/她。试着这样做你会看到一条如下图所示的错误信息。

图 3 删除成员时的错误信息

该错误,如果你理解 sql server 语言,它告诉你 adult 和 member 表间参照完整性冲突。这将会在试着在删除 adult 记录前删除 member 记录时发生。这明显的是发生在视图中。对于删除处理记录,必须首先删除 adult 然后删除 member。但是,visual foxpro 如何知道这些?

不可理解的错误信息

如果你想删除一个负责有少年的成员,你会被终止。如果你想删除一个借有图书的成员,你会被终止。但是,sql server 将发送回 visual foxpro 一个类似于图 3 的错误信息。这些信息对于用户来说是完全不能理解的。

考虑另一个示例。adult 表具有以下约束检查定义:

alter table adult  with nocheck  add constraint phone_no_rule check (phone_no like     '(206)[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]')

这些约束强制电话号码以 206 区号开始。如果插入或更新的记录的电话号码违反了这个规则,数据将被拒绝。但是,用户看到的怪异的提示信息如下图所示。

图 4 检查约束违反错误信息

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表