If Len(lcSQL) > 0
* 添加 Update,去掉最后一个逗号,
* 添加一个 Where 子句
lcSQL = "Update member Set " + ;
Left(lcSQL, Len(lcSQL) - 2) + ;
"Where member_no = " + ;
AllTrim(ThisForm.txtMemberID.Value)
If SQLExec(ThisForm.nHandle, lcSQL) < 0
<略去的代码>
然后对 Adult 进行与上面相同的处理。接着要做的是我们非常熟悉的事。如果一切正常提交事务处理否则回滚。
删除一个成员
使用 SQL pass-through 相对于远程视图的一个优点是,你增加了对发生什么和何时发生的控制。当用户单击 Delete 按钮时运行的代码就是一个好的例子。
有很多理由可能使你不能删除一个成员。如果成员有相关的 juveniles 或成员有未结清的借书时任何 Delete 都会失败。可以很容易地通过发送一个 Select 到服务器来检查这一点。这里的代码使用 SQLExec() 来检查这两个条件。如果两者都为真,会显示一个友好的信息且不会进一步发生什么情况。
* 首先检查是否有一个活动的 juveniles
lcSQL = "Select member_no From juvenile " + ;
"Where adult_member_no = " + ;
ThisForm.txtMemberID.Value
If SQLExec(ThisForm.nHandle, lcSQL) < 0
ThisForm.ShowError
Return
Else
If RecCount("sqlresult") <> 0
lcMessage = "该成员不能删除. " + ;
"他是一个活动的少年的成年。"
= MessageBox(lcMessage, MB_ICONINFORMATION)
Return
Endif
Endif
* 现在检查成员还有活动的借书
lcSQL = "Select member_no From loan " + ;
"Where member_no = " + ;
ThisForm.txtMemberID.Value
If SQLExec(ThisForm.nHandle, lcSQL) < 0
ThisForm.ShowError
Return
Else
If RecCount("sqlresult") <> 0
lcMessage = "该成员不能删除。" + ;
"他还有活动的借书。"
= MessageBox(lcMessage, MB_ICONINFORMATION)
Return
Endif
Endif
如果还需要执行额外的检查,代码可以放在以上代码的后面。你可以完全控制要检查的内容和顺序。如果所有的检查都成功且成员可以删除,则开始一个事务处理。
在 Member 表和 Loanhist 及 Reservation 表单定义了关系。每一次借书和还书都在 Loanhist 表中有一条记录。成员预约的每一本书在 Reservation 表中有一条记录。如果成员被删除,需要删除这两个表中的相关信息。需要首先删除它们,否则会违犯参照完整性。
* 删除该成员的借书情况(loan history)记录
lcSQL = "Delete loanhist Where member_no = " + ;
AllTrim(ThisForm.txtMemberID.Value)
If SQLExec(ThisForm.nHandle, lcSQL) < 0
<略去的代码>
* 删除该成员的借书预约(loan reservation)记录
lcSQL = "Delete reservation Where member_no = " + ;
AllTrim(ThisForm.txtMemberID.Value)
If SQLExec(ThisForm.nHandle, lcSQL) < 0