以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  用openqq实现一个窗口中多表独占编辑  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=149099)

--  作者:luckbetter333
--  发布时间:2020/4/23 11:07:00
--  用openqq实现一个窗口中多表独占编辑
如题,在一个窗口中有两个表,都需要实现独占式编辑。应该怎么做?
以下是打开窗口的click中的代码
Dim r As Row = Tables("订单_Table1").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 = "订单_Table1"  & ":" & 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
Dim r1 As Row = Tables("订单_Table2").Current
If QQClient.Ready = False Then \'如果QQClient没有启动,则禁止编辑
    PopMessage("必须启动QQClient,才能编辑此表数据!","提示",PopIconEnum.Infomation,5)
    Return
End If
If r1.DataRow.RowState <>  DataRowState.Added Then \'如果不是新增行
    Dim key1 As String = "订单_Table2"  & ":" & r("_Identify")
    If tbrk.Contains(key1) = False Then
        Dim msg1 = QQClient.SendWait("?#" & Key1 & "#?",5) \'向服务器发送请求编辑信息
        If msg1 = "OK" Then \'如果服务器返回OK
            tbrk.Add(key1) \'在本地登记正在编辑此行
        ElseIf msg1 > "" Then \'否则显示服务器返回的信息,并取消编辑
            PopMessage("无法编辑此行,因为:" & vbcrlf & msg1 ,"提示",PopIconEnum.Infomation,5)
            Return
        Else \'如果服务器没有返回信息,则取消编辑
            PopMessage("因服务器无响应,无法编辑此行!" ,"提示",PopIconEnum.Infomation,5)
            Return
        End If
    End If
End If
Forms("订单").open()
MainTable=Tables("订单表")

Forms("销售界面").Close()

这是服务端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

Dim msg17 As String = e.Message
If msg17.StartsWith("?#") AndAlso msg17.EndsWith("#?") Then \'收到请求编辑信号
    Dim Key1 As String = msg17.SubString(2,msg17.Length - 4)
    If tbrk.Containskey(Key1) = False Then \'如果无人编辑此行
        tbrk.Add(Key1,e.UserName) \'登记申请者为此行的编辑者
        e.ReturnValue = "OK" \'通知申请者可以编辑
    ElseIf tbrk(Key1) = e.UserName Then \'如果申请者就是之前登记的编辑者
        e.ReturnValue = "OK" \'通知申请者可以编辑
    Else \'如果之前登记的编辑者为其他人
        e.ReturnValue = tbrk(Key1) & "正在编辑此行!" \'告知申请者是谁在编辑此行
    End If
ElseIf msg17.StartsWith("!#") AndAlso msg17.EndsWith("#!") Then \'收到结束编辑信号
    Dim Key1 As String = msg17.SubString(2,msg17.Length - 4)
    If tbrk.Containskey(Key1)  Then
        tbrk.Remove(Key1) \'从集合中移除此行的编辑登记
    End If
End If

在服务端项目的OpenQQ服务端的UserLogout事件的代码:
Dim Keys As New List(of String)
For Each Key As String In tbrk.Keys
   If tbrk(Key) = e.UserName Then
      Keys.Add(Key)
    End If
Next
For Each Key As String In Keys
    tbrk.Remove(Key)
Next

服务端和客户端的全局代码都已经按帮助文件写好。

请问版主哪里需要修改?




--  作者:有点蓝
--  发布时间:2020/4/23 11:23:00
--  
使用上有什么问题?

ReceivedMessage代码不需要重复2次

--  作者:luckbetter333
--  发布时间:2020/4/23 15:50:00
--  
click中写的对么?click中用了key1没问题?ReceivedMessage代码写key的就行对么?不是很自信。
--  作者:luckbetter333
--  发布时间:2020/4/23 15:51:00
--  
另外要是复制粘贴多行,是不是也没问题?
--  作者:有点蓝
--  发布时间:2020/4/23 16:02:00
--  
key是一个变量,传输的不是变量的名称,而是变量里存储的内容。变量名称可以随便定义,不需要和客户端完全一致。

有没有问题自己测试过,有具体的问题再提出来。

--  作者:luckbetter333
--  发布时间:2020/4/24 16:06:00
--  
你好版主
Dim r As Row = Tables("产品树_Table1").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 = "产品树_Table1"  & ":" & 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()
MainTable=Tables("产品树")
Forms("销售界面").Close()

图片点击可在新窗口打开查看此主题相关图片如下:微信图片_20200424160227_副本.jpg
图片点击可在新窗口打开查看

其他的代码按照之前发的写的
报错

--  作者:有点蓝
--  发布时间:2020/4/24 16:11:00
--  
凡是用到Current的地方都需要判断是否空值,比如表格没有数据

Dim r As Row = Tables("产品树_Table1").Current
if ris nothing then return
其它代码

--  作者:luckbetter333
--  发布时间:2020/4/24 16:30:00
--  

图片点击可在新窗口打开查看此主题相关图片如下:1587716753(1).png
图片点击可在新窗口打开查看
加上了if r is nothing then return
也肯定有产品树_Table1这个表,还是报错说没有


--  作者:luckbetter333
--  发布时间:2020/4/24 16:30:00
--  

图片点击可在新窗口打开查看此主题相关图片如下:1587716816(1).png
图片点击可在新窗口打开查看

--  作者:有点蓝
--  发布时间:2020/4/24 17:18:00
--  
那就不是这段代码的问题。比如A客户端发给B客户端,可能B用户没有打开窗口,当然就不会有窗口表了。B客户端接收事件里判断一下窗口有没有打开