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