以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- 关于独占式编辑问题 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=148531) |
-- 作者:lgz518 -- 发布时间:2020/4/9 15:51:00 -- 关于独占式编辑问题 问题1:我是用纯窗口开发,所以用下代码,就是可以实现独占式编辑,实现并发? 用OpenQQ实现独占式编辑 本节讲述如何避免多人同时编辑同一行,既如何实现独占式编辑。 要实现此功能,服务器端和客户端都要进行相应的设计,我们学习的时候,也要结合客户端和服务端的代码来理解。 一。服务器端的设计 1、在服务器端项目的全局代码中,加入如下代码: Public tbrk As new Dictionary(of String,String) 2、在服务端项目的OpenQQ服务端的ReceivedMessage事件加上代码: Dim msg As String = e.Message 上述代码的注释详尽明了,就不做解释了。 3、在服务端项目的OpenQQ服务端的UserLogout事件加上代码: Dim Keys As New List(of String) 这样当有用户退出登录时,不管他是正常退出还是异常退出,都可以将字典中该用户的编辑登记移除,避免死锁。 二。如果是窗口编辑 上述方案针对的是直接在表中编辑数据,如果不是在表中编辑,而是在窗口编辑,编码方式也是基本相同的。 Dim r As Row = Tables("表B").Current 问题2:1、在服务器端项目的全局代码中,加入如下代码: Public tbrk As new Dictionary(of String,String) 服务器端项目的全局,在哪里?“网络监测器”里没看到,项目事件倒是有全局? |
-- 作者:有点蓝 -- 发布时间:2020/4/9 15:54:00 -- 1、可以实现独占式编辑 2、全局代码:http://www.foxtable.com/webhelp/topics/1842.htm
|
-- 作者:lgz518 -- 发布时间:2020/4/9 16:20:00 -- \'2.独占式编辑----在服务端项目的OpenQQ服务端的ReceivedMessage事件加上代码: Dim msg As String = e.Message If msg.StartsWith("?#") AndAlso msg.EndsWith("#?") Then \'收到请求编辑信号 Dim Key As String = msg.SubString(2,msg.Length - 4) If tbrk.Containskey(Key) = False Then \'如果无人编辑此行 tbrk.Add(Key,e.UserName) \'登记申请者为此行的编辑者 e.ReturnValue = "OK" \'通知申请者可以编辑 ElseIf tbrk(Key) = e.UserName Then \'如果申请者就是之前登记的编辑者 e.ReturnValue = "OK" \'通知申请者可以编辑 Else \'如果之前登记的编辑者为其他人 e.ReturnValue = tbrk(Key) & "正在编辑此行!" \'告知申请者是谁在编辑此行 End If ElseIf msg.StartsWith("!#") AndAlso msg.EndsWith("#!") Then \'收到结束编辑信号 Dim Key As String = msg.SubString(2,msg.Length - 4) If tbrk.Containskey(Key) Then tbrk.Remove(Key) \'从集合中移除此行的编辑登记 End If End If 放上面代码,报错
|
-- 作者:lgz518 -- 发布时间:2020/4/9 16:28:00 -- 放在另一个,也是报错 此主题相关图片如下:服务器2.jpg |
-- 作者:lgz518 -- 发布时间:2020/4/9 16:32:00 -- 1.还是我表设为“制表人”或经办人字段,没设“编辑者”字段,因为想“制表人”或经办人字段代替“编辑者”字段,可行?还是一定“编辑者”字段? 2.关联表(主表和明细表)都要分别设“制表人”或经办人或编辑者字段?
|
-- 作者:有点蓝 -- 发布时间:2020/4/9 16:48:00 -- 放到2.openQQ服务端的ReceivedMessage事件,不是3.openQQ客户端的事件 |
-- 作者:lgz518 -- 发布时间:2020/5/11 9:57:00 -- 二。如果是窗口编辑 上述方案针对的是直接在表中编辑数据,如果不是在表中编辑,而是在窗口编辑,编码方式也是基本相同的。 Dim r As Row = Tables("表B").Current |
-- 作者:lgz518 -- 发布时间:2020/5/11 10:01:00 -- 上面代码,有以下问题: 1.上述方案针对的是直接在表中编辑数据,如果不是在表中编辑,而是在窗口编辑,编码方式也是基本相同的。 通常只需将打开编辑窗口的代码-: 这里的“打开编辑窗口”“窗口AfterLoad事件”?关联? 2.Dim r As Row = Tables("表B").Current,这个单表,如果关联要怎么写? Dim r As Row = Tables("主表").Current, Dim A As Row = Tables("明细").Current, 3.Forms("编辑窗口").Open(),如果打开编辑窗口”“窗口AfterLoad事件”,这里怎么还要写Forms("编辑窗口").Open()?看不是很明白,请老师,指导一下,谢谢 |
-- 作者:有点蓝 -- 发布时间:2020/5/11 10:24:00 -- 1、如果是在表格里双击打开编辑窗口的就是表格的DoubleClick事件,如果是在其它窗口的按钮里的打开编辑窗口的就是指按钮事件 2、比如 tables("表A.表B").current [此贴子已经被作者于2020/5/11 10:23:50编辑过]
|
-- 作者:lgz518 -- 发布时间:2020/5/11 10:43:00 -- 老师,我做一个主窗体界面,其中有一个按键,是引向”采购窗口“进行录入,在这个”按键事件“,写下面代码,红色带线,这样对?请老师,批阅纠正,谢谢 Dim A As Row = Tables("表A.表B").Current If QQClient.Ready = False Then \'如果QQClient没有启动,则禁止编辑 PopMessage("必须启动QQClient,才能编辑此表数据!","提示",PopIconEnum.Infomation,5) Return End If If r.DataRow.RowState <> DataRowState.Added Then \'如果不是新增行 Dim key As String = "表A" & ":" & r("_Identify") Dim key As String = "表A.表B" & ":" & r("_Identify")
If tbrk.Contains(key) = False Then Dim msg = QQClient.SendWait("?#" & Key & "#?",5) \'向服务器发送请求编辑信息 If msg = "OK" Then \'如果服务器返回OK tbrk.Add(key) \'在本地登记正在编辑此行 ElseIf msg > "" Then \'否则显示服务器返回的信息,并取消编辑 PopMessage("无法编辑此行,因为:" & vbcrlf & msg ,"提示",PopIconEnum.Infomation,5) Return Else \'如果服务器没有返回信息,则取消编辑 PopMessage("因服务器无响应,无法编辑此行!" ,"提示",PopIconEnum.Infomation,5) Return End If End If End If Forms("采购窗口").Open() |