很抱歉,因个人原因停更了几天。再次说声抱歉。
现在,该是 MyCursor 出场的时间了。它可能是这套控制机制中最复杂的一个自定义类。我们将分两部分进行描述:一部分为控制更新的内容;一部分为游标设置的内容。为了保证内容的连续性,今天先来说说第一部分。
当我们更新游标的时候,除非在特殊的状况下直接操作游标,大部分情况下,我们可以使用 TableUpdate()函数进行远程数据更新。
首先,我们先在 MyCursor 类中增加几个自定义方法:BeforeAdd、Add、AfterAdd、SetControlRO。其中,SetControlRO 是一个钩子方法,用于设置表单控件的只读状态。
在 Add 中,我们仅仅需要类似如下的代码:
代码语言:javascript复制If This.lEnabledUpdate = .T.
This.BeforeAdd()
Select (This.Alias)
m.LcOldError = On([Error])
On Error
If This.BufferModeOverride = 3
m.Temp = Tableupdate(.F., This.lForce) && 开放式行缓冲
Else
m.Temp = Tableupdate(.T., This.lForce) && 开放式表缓冲
Endif
If m.Temp = .F. && ODBC 错误
* 这里是处理更新错误的代码
On Error &LcOldError
Return m.llResult
Else
This.SetControlRO()
This.AfterSave()
On Error &LcOldError
Return .T.
Endif
Endif
自定义属性 lEnabledUpdate 决定了所控制的游标是否为可更新游标;lForce 自定义属性决定了是否强制覆盖其他用户提交的更新。
然后,我们打开 MyDataEnvironment 类,定位到它的 Add 方法,它基本上应该是如下的样子:
代码语言:javascript复制Private All Like l*
Local loCursor As MyCursor Of MySPT.VCX, ;
loRelation As MyRelation Of MySPT.VCX, ;
llReturn As Logical
Begin Transaction && 开始 VFP 事务
= SQLSetprop(Thisform.nStatementHandle,[Transactions], 2) && 开始远程事务
For Each m.loRelation In This.Objects
If Upper(m.loRelation.BaseClass) == [RELATION]
m.llReturn = m.loRelation.Add()
If m.llReturn = .F.
Exit
Endif
Endif
Endfor
If m.llReturn = .T.
For Each m.loCursor In This.Objects
If Upper(m.loCursor.BaseClass) == [CURSOR]
m.llReturn = m.loCursor.Add()
If m.llReturn = .F.
Exit
Endif
Endif
Endfor
If m.llReturn = .T.
= SQLSetprop(Thisform.nStatementHandle, [Transactions], 1) && 结束远程事务
End Transaction && 结束 VFP 事务
Endif
EndIf
Thisform.Refresh
Return m.llReturn
至此,我们已经完成了这套控制系统的一个功能:增加记录。
编辑和删除记录,可以参照以上步骤自行完善。此外,针对记录指针的移动以及记录搜索,也可以参照以上步骤纳入到这套控制系统之中。
如果,你在实际应用过程中遇到了非常规的需求,那么,你可以派生出它的一个子类,来完成你的特殊需求。
下一次,我们来看看 MyCursor 的第二部分:游标设置。
你的反馈是我写作的动力,欢迎评论,未完待续。