Foxtable(狐表)用户栏目专家坐堂 → 利用openqq同步数据,如果是两个表怎么办?


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

主题:利用openqq同步数据,如果是两个表怎么办?

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


加好友 发短信
等级:小狐 帖子:385 积分:3893 威望:0 精华:0 注册:2012/2/9 20:09:00
利用openqq同步数据,如果是两个表怎么办?  发帖心情 Post By:2015/12/6 13:30:00 [只看该作者]

利用openqq同步数据,如果是两个表需要同步,并且主键ID不同,  怎么办?


客户表 (ID)    ,   行程表  (日程ID) 


帮助中的设计步骤:

1、在编辑窗口加一个保存按钮,按钮代码设置为:

Dim r As Row = Tables("A").Current
Dim
p As String = IIF(r.DataRow.RowState = DataRowState.Added, "A#", "U#")
r
.Save()
'
一定要在保存后合成信息,因为新增行的主键在保存后才生成
Dim
msg As String = p & "A" & "#" & r("_Identify")
For
Each bd As QQBuddy In QQClient.Buddies
    If bd.Online Then
        QQClient.Send(bd.name, msg)
   
End If
Next

这段代码用于合成通知信息发送给好友,例如"U#表A#8"表A主键为8的行发生了修改,"A#表A#10"表示表A新增了1行,新增行的主键为10。
你可以任意定义这种格式的通知。

2、再增加一个删除按钮,按钮代码设置为:

Dim r As Row = Tables("A").Current
Dim
msg As String = "D#" & "A" & "#" & r("_Identify")
r
.Delete()
Tables
("A").Save()
For
Each bd As QQBuddy In QQClient.Buddies
    If bd.Online Then
        QQClient.Send(bd.name, msg)
   
End If
Next

这段代码用于删除行后合成通知信息发送给好友,例如"D#表A#8"表A主键为8的行被删除了。

3、在QQClient的ReceivedMessage事件中修改代码:

Dim msg As String = e.Message
If
msg.StartsWith("U#") Then '表示修改了某行
    Dim pts() As String = msg.Split("#")
    If pts.Length = 3 Then
        Dim dr As DataRow = DataTables(pts(1)).Find("[_Identify] = " & pts(2))
        If dr IsNot Nothing  Then
            dr.Load() '重新加载此行
        End If
    End
If

ElseIf
msg.StartsWith("A#") Then '表示增加了行
    Dim pts() As String = msg.Split("#")
    If pts.Length = 3 Then
         DataTables(pts(1)).AppendLoad("[_Identify] = " &  pts(2)) '追载新增加的行.
    End
If

ElseIf
msg.StartsWith("D#") Then '表示删除了行
    Dim pts() As String = msg.Split("#")
    If pts.Length = 3 Then
         DataTables(pts(1)).RemoveFor("[_Identify] = "  & pts(2)) '移除行
    End
If

End
If

这样,多用户环境下,任何一个客户端做的修改、增加,删除,保存后都会立即体现在其他客户端上。

[此贴子已经被作者于2015/12/6 13:31:53编辑过]

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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2015/12/6 14:25:00 [只看该作者]

两个表需要同步,合成的信息不同,就是同步不同的表啊

 

Dim msg As String = p & "表A" & "#" & r("_Identify")

 


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


加好友 发短信
等级:小狐 帖子:385 积分:3893 威望:0 精华:0 注册:2012/2/9 20:09:00
  发帖心情 Post By:2015/12/6 14:30:00 [只看该作者]

我尝试用下面的代码,就是两套代码, 貌似不行.不知道哪不对



    '利用OPENQQ 同步保存数据
'客户表

        Dim r As Row = Tables("userb").Current
        Dim p As String = IIF(r.DataRow.RowState = DataRowState.Added, "A#", "U#")
        r.Save()
        '一定要在保存后合成信息,因为新增行的主键在保存后才生成
        Dim msg As String = p & "userb" & "#" & r("Id")
        For Each bd As QQBuddy In QQClient.Buddies
            If bd.Online Then
                QQClient.Send(bd.name, msg)
            End If
        Next
        
'行程表 
        Dim r2 As Row = Tables("zclxingcheng").Current
        Dim p2 As String = IIF(r2.DataRow.RowState = DataRowState.Added, "A2#", "U2#")
        r2.Save()
        '一定要在保存后合成信息,因为新增行的主键在保存后才生成
        Dim msg2 As String = p2 & "zclxingcheng" & "#" & r2("日程Id")
        For Each bd2 As QQBuddy In QQClient.Buddies
            If bd2.Online Then
                QQClient.Send(bd2.name, msg2)
            End If
        Next



客户端的

receivedmessage



'利用openqq同步数据userb 
Dim msg As String = e.Message
If msg.StartsWith("U#") Then '表示修改了某行
    Dim pts() As String = msg.Split("#")
    If pts.Length = 3 Then
        Dim dr As DataRow = DataTables(pts(1)).Find("[Id] = " & pts(2))
        If dr IsNot Nothing  Then
            dr.Load() '重新加载此行
        End If
    End If
ElseIf msg.StartsWith("A#") Then '表示增加了行
    Dim pts() As String = msg.Split("#")
    If pts.Length = 3 Then
         DataTables(pts(1)).AppendLoad("[Id] = " &  pts(2)) '追载新增加的行.
    End If
ElseIf msg.StartsWith("D#") Then '表示删除了行
    Dim pts() As String = msg.Split("#")
    If pts.Length = 3 Then
         DataTables(pts(1)).RemoveFor("[Id] = "  & pts(2)) '移除行
    End If
End If

'利用openqq同步数据zclxingcheneg
Dim msg2 As String = e.Message
If msg2.StartsWith("U2#") Then '表示修改了某行
    Dim pts2() As String = msg2.Split("#")
    If pts2.Length = 3 Then
        Dim dr2 As DataRow = DataTables(pts2(1)).Find("[日程Id] = " & pts2(2))
        If dr2 IsNot Nothing  Then
            dr2.Load() '重新加载此行
        End If
    End If
ElseIf msg2.StartsWith("A2#") Then '表示增加了行
    Dim pts2() As String = msg2.Split("#")
    If pts2.Length = 3 Then
         DataTables(pts2(1)).AppendLoad("[日程Id] = " &  pts2(2)) '追载新增加的行.
    End If
ElseIf msg2.StartsWith("D2#") Then '表示删除了行
    Dim pts2() As String = msg2.Split("#")
    If pts2.Length = 3 Then
         DataTables(pts2(1)).RemoveFor("[日程Id] = "  & pts2(2)) '移除行
    End If
End If
[此贴子已经被作者于2015/12/6 14:31:45编辑过]

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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2015/12/6 16:45:00 [只看该作者]

汗。

 

ReceivedMessage的代码不用改。

 

你要同步哪里,就合成什么表的信息,执行代码啊

 

QQClient.Send(bd.name, msg)


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


加好友 发短信
等级:小狐 帖子:385 积分:3893 威望:0 精华:0 注册:2012/2/9 20:09:00
  发帖心情 Post By:2015/12/7 7:15:00 [只看该作者]

客户信息表  主键: ID

行程表   主键:  日程id  ,     客户ID   

两表关联  ID和客户ID

一对多的关系.


当在客户信息表中选中某行数据,  另一个窗口TABLE里行程表(副表) 筛选出该客户的行程. 还有一个窗口里TABLE里是关联表( 客户信息表.行程表)的方式筛选出该客户的行程.


我的思路是想用3楼的代码解决,但客户信息表的能同步, 行程表的不能.    后来发现应该是行程表的客户ID没有被准确表示出来, 可能是和筛选有关.

不知道我的思路对不对.


如果,我在 表属性里的 afteredit    DataRowAdded  里分别写编辑和增加的代码, 立即保存当前行. 这样在窗口里操作数据,应该也是可以的吧.?

[此贴子已经被作者于2015/12/7 7:29:01编辑过]

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


加好友 发短信
等级:狐神 帖子:5015 积分:25363 威望:0 精华:0 注册:2015/8/18 9:21:00
  发帖心情 Post By:2015/12/7 8:39:00 [只看该作者]

方法1:更新几个表就发几条信息,按照父表、子表的顺序发送

方法2:按照父表、子表的顺序用一个符号分隔拼接更新几个表的信息

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


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2015/12/7 9:14:00 [只看该作者]

如果你的主键是_Identify,你就要在新增的时候保存它,这样才能得到固定的主键。

 

或者是,你在同步之前保存也是可以的啊。其余的东西都不变。


 回到顶部