Foxtable(狐表)用户栏目专家坐堂 → 用openqq实现一个窗口中多表独占编辑


  共有2213人关注过本帖树形打印复制链接

主题:用openqq实现一个窗口中多表独占编辑

帅哥哟,离线,有人找我吗?
luckbetter333
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:298 积分:2426 威望:0 精华:0 注册:2016/11/2 9:30:00
用openqq实现一个窗口中多表独占编辑  发帖心情 Post By:2020/4/23 11:07:00 [只看该作者]

如题,在一个窗口中有两个表,都需要实现独占式编辑。应该怎么做?
以下是打开窗口的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

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

请问版主哪里需要修改?




 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106209 积分:540168 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/23 11:23:00 [只看该作者]

使用上有什么问题?

ReceivedMessage代码不需要重复2次

 回到顶部
帅哥哟,离线,有人找我吗?
luckbetter333
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:298 积分:2426 威望:0 精华:0 注册:2016/11/2 9:30:00
  发帖心情 Post By:2020/4/23 15:50:00 [只看该作者]

click中写的对么?click中用了key1没问题?ReceivedMessage代码写key的就行对么?不是很自信。

 回到顶部
帅哥哟,离线,有人找我吗?
luckbetter333
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:298 积分:2426 威望:0 精华:0 注册:2016/11/2 9:30:00
  发帖心情 Post By:2020/4/23 15:51:00 [只看该作者]

另外要是复制粘贴多行,是不是也没问题?

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106209 积分:540168 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/23 16:02:00 [只看该作者]

key是一个变量,传输的不是变量的名称,而是变量里存储的内容。变量名称可以随便定义,不需要和客户端完全一致。

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

 回到顶部
帅哥哟,离线,有人找我吗?
luckbetter333
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:298 积分:2426 威望:0 精华:0 注册:2016/11/2 9:30:00
  发帖心情 Post By: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
图片点击可在新窗口打开查看

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

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106209 积分:540168 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/24 16:11:00 [只看该作者]

凡是用到Current的地方都需要判断是否空值,比如表格没有数据

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

 回到顶部
帅哥哟,离线,有人找我吗?
luckbetter333
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:298 积分:2426 威望:0 精华:0 注册:2016/11/2 9:30:00
  发帖心情 Post By:2020/4/24 16:30:00 [只看该作者]


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


 回到顶部
帅哥哟,离线,有人找我吗?
luckbetter333
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:298 积分:2426 威望:0 精华:0 注册:2016/11/2 9:30:00
  发帖心情 Post By:2020/4/24 16:30:00 [只看该作者]


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

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106209 积分:540168 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/24 17:18:00 [只看该作者]

那就不是这段代码的问题。比如A客户端发给B客户端,可能B用户没有打开窗口,当然就不会有窗口表了。B客户端接收事件里判断一下窗口有没有打开

 回到顶部
总数 15 1 2 下一页