以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  关于即时同步的问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=120115)

--  作者:ye8573
--  发布时间:2018/6/7 12:49:00
--  关于即时同步的问题
关于利用OPENQQ即时同步数据的问题,以下范例中的代码只能做到点一行保存一行同步一行的效果,是否可以做到点一下就将所有有变更的行全部保存并同步的效果?
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

--  作者:有点甜
--  发布时间:2018/6/7 14:46:00
--  

给各个客户端发送【刷新某表】的信息,可以合成字符,如 "刷新|表A"

 

客户端接收到后,拆分数据,如果是【刷新】开头的,就执行代码 DataTables("表A").Load


--  作者:ye8573
--  发布时间:2018/6/8 7:50:00
--  
这个刷新|表A,表A能不能是我按保存按钮时的当前表?我现在试了下,固定表名称的话可以成功,所有表都用同一个按钮的话不行。
想要达到的效果是,在当前表按保存,生成信息“刷新|当前表名称”发送,其他客户端收到后自动刷新那张表。请版主大大赐教

--  作者:ye8573
--  发布时间:2018/6/8 8:44:00
--  
请版主帮帮忙,谢谢
--  作者:有点甜
--  发布时间:2018/6/8 9:07:00
--  
以下是引用ye8573在2018/6/8 7:50:00的发言:
这个刷新|表A,表A能不能是我按保存按钮时的当前表?我现在试了下,固定表名称的话可以成功,所有表都用同一个按钮的话不行。
想要达到的效果是,在当前表按保存,生成信息“刷新|当前表名称”发送,其他客户端收到后自动刷新那张表。请版主大大赐教

 

比如代码

 

Dim str As String = "刷新|" & currentTable.DataTable.name

 

然后发送str过去

 

接收后,拆分str,如

 

Dim ary() = e.message.split("|")

DataTables(ary(1)).Load


--  作者:ye8573
--  发布时间:2018/6/8 12:37:00
--  
版主,这样写代码的话发现会影响其他客户端的操作,比如其他客户端在当前表筛选了部分数据,我这点完保存,那边筛选的数据就没了,跳回了未筛选前的状态。以前即时同步的时候是每行单独同步。是否可以让表在刷新的同时又不影响其他客户端操作的?如果不行的话是否可以修改帮助文件中即时同步的代码,做成一个循环,点一下就把所有新增修改或删除过的行依次保存一遍?
--  作者:有点甜
--  发布时间:2018/6/8 12:40:00
--  

那你就循环每一行处理,如

 

For Each r As Row In Tables("表A").rows
    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
Next


--  作者:ye8573
--  发布时间:2018/6/8 18:37:00
--  
版主,保存的效果做好了,在做删除的时候出现了奇怪的情况,选中需要删除的行以后点击按钮,结果删掉的不是我选中的行,而且一下就删好几条,有时6条,有时3条,有时2条,请问是不是我代码里哪里写错了?
代码如下:
Dim n As String = CurrentTable.name
For Each r As Row In Tables(n).rows
Dim msg As String = "D#" & n & "#" & r("_Identify")
r.Delete()
Tables(n).Save()
For Each bd As QQBuddy In QQClient.Buddies
    If bd.Online Then
        QQClient.Send(bd.name, msg)
    End If
Next
Next
[此贴子已经被作者于2018/6/8 18:37:02编辑过]

--  作者:有点甜
--  发布时间:2018/6/8 19:51:00
--  

选中行,这样处理

 

http://www.foxtable.com/webhelp/scr/1597.htm

 

http://www.foxtable.com/webhelp/scr/1776.htm

 


--  作者:ye8573
--  发布时间:2018/6/12 8:12:00
--  
版主大大,请帮我看看我的代码哪里有问题,点击保存按钮后其他客户端会报错

按钮事件代码

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

QQ客户端receivedmessage事件代码

Dim msg As String = e.Message
If msg.StartsWith("U#") Then \'表示修改了某行
    Dim pts() As String = msg.Split("#")
    If pts.Length = 3 Then
        Dim dr2 As DataRow = Tables(pts(1)).DataTable.Find("[_Identify] = " & pts(2))
        If dr2 IsNot Nothing  Then
            dr2.Load() \'重新加载此行
        End If
    End If
ElseIf msg.StartsWith("A#") Then \'表示增加了行
    Dim pts() As String = msg.Split("#")
    If pts.Length = 3 Then
         Tables(pts(1)).DataTable.AppendLoad("[_Identify] = " &  pts(2)) \'追载新增加的行.
    End If
ElseIf msg.StartsWith("D#") Then \'表示删除了行
    Dim pts() As String = msg.Split("#")
    If pts.Length = 3 Then
         Tables(pts(1)).DataTable.RemoveFor("[_Identify] = "  & pts(2)) \'移除行
    End If
End If