Foxtable(狐表)用户栏目专家坐堂 → [求助]OpenQQ网络环境下的编号不连续问题


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

主题:[求助]OpenQQ网络环境下的编号不连续问题

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


加好友 发短信
等级:一尾狐 帖子:426 积分:3505 威望:0 精华:0 注册:2015/4/17 9:13:00
[求助]OpenQQ网络环境下的编号不连续问题  发帖心情 Post By:2017/12/14 15:12:00 [只看该作者]

当服务端关掉再重启后,客户端生成的编号不连续了,同一个ACCESS的数据库操作,代码完全按照帮助--用OpenQQ实现网络环境下的编号的代码操作的,如图:

图片点击可在新窗口打开查看此主题相关图片如下:用openqq实现网络环境下的编号.png
图片点击可在新窗口打开查看



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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2017/12/14 15:22:00 [只看该作者]

下面这个你做了没有?得到的编号,是最大的了没有?msgbox弹出看看。

 

2、在服务端的AfterOpenProjet事件中编写代码:

Dim dt As DataTable
Dim cmd As New SQLCommand
cmd.ConnectionName = "数据源名称"
cmd.CommandText = "Select 类别, Max(编号) As 编号 From {产品} Group By 类别"
dt = cmd.ExecuteReader
flbhs.Clear()
For Each dr As DataRow In dt.DataRows
    Dim qz As String = dr("类别") '编号前缀
    Dim bh As String =  dr("编号")

    msgbox(bh)
    Dim id As Integer
    If bh.Length = 5 Then
        bh = bh.SubString(2)
        If Integer.TryParse(bh,id) Then
            flbhs.Add(qz, id)
        End If
    End If
Next


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


加好友 发短信
等级:一尾狐 帖子:426 积分:3505 威望:0 精华:0 注册:2015/4/17 9:13:00
  发帖心情 Post By:2017/12/14 15:45:00 [只看该作者]

是显示最大值,我知道问题在那了,谢谢!

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


加好友 发短信
等级:一尾狐 帖子:426 积分:3505 威望:0 精华:0 注册:2015/4/17 9:13:00
  发帖心情 Post By:2017/12/14 18:38:00 [只看该作者]

用OpenQQ实现网络环境下的编号
一、按类别编号

我将类别设为一个字符,如编号为A001

其中改了(红色段)如下:

2、在服务端的AfterOpenProjet事件中编写代码:

Dim dt As DataTable
Dim
cmd As New SQLCommand
cmd
.C = "数据源名称"
cmd
.CommandText = "S/elect 类别, Max(编号) As 编号 From {产品} Group By 类别"
dt
= cmd.ExecuteReader
flbhs.Clear()
For
Each dr As DataRow In dt.DataRows
    Dim qz As String = dr("
类别") '编号前缀
    Dim bh As Stringdr("
编号")
    Dim id As Integer
    If bh.Length = 4 Then
        bh = bh.SubString(1)

        If Integer.TryParse(bh,id) Then
           
flbhs.Add(qz, id)
        End If
   
End If
Next

上述代码在启动项目后,用SQL语句提取每个类别的最大编号,将其整数部分存储在字典flbhs中。

3、在服务端的OpenQQ服务端事件ReceivedMessage中编写代码:

Dim msg As String = e.Message
If
msg.StartsWith(":f") AndAlso msg.EndsWith("f:") Then
    msg = msg.SubString(2, msg.Length - 4)
    If
flbhs.ContainsKey(msg) Then '如果存在这个类别的编号
       
flbhs(msg) = flbhs(msg) + 1 '将该类别最大编号加1
   
Else
       
flbhs.Add(msg,1) '如果是这个列表的首次编号,则编号等于1
   
End If
    e.ReturnValue = flbhs(msg)
'将编号返回给客户端
End If

客户端的设计

选择客户端项目对应的表,在其DataColChanged事件中加上代码:

If e.DataCol.Name = "类别" Then
    If e.DataRow.IsNull("类别") Then
        e.DataRow("编号") = Nothing
    Else
        If QQClient.Ready = False Then
            PopMessage("QQClient未启动,无法生成编号!","提示",PopIconEnum.Infomation,5)
        Else
            Dim bh As String = e.DataRow("类别")
            Dim rt As String =  QQClient.SendWait(":f" & bh & "f:")
           
Dim id As Integer

            msgbox(rt) '加了这个显示问题
           当服务器和客户端都重新打开后,客户端第一次增加行时,收到服务器返回的 rt 是空值,直就到第二个流程,继续再增行,那就开始正常有数据了


            If rt > "" Then
                If  Integer.TryParse(rt,id)  Then
                    e.DataRow("
编号") = bh & Format(id,"000")
                Else
                    PopMessage("
服务器返回错误信息:" & rt,"提示",PopIconEnum.Infomation,5)
                End If

            Else
第二个流程:      PopMessage("
服务器无响应,无法生成编号!","提示",PopIconEnum.Infomation,5)
            End If
        End If
    End If

End
If


想问一下,这个问题能避免吗?


而且服务器的数据提取也不是最大值,请问是那里改得不对吗

[此贴子已经被作者于2017/12/14 18:55:35编辑过]

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


加好友 发短信
等级:一尾狐 帖子:426 积分:3505 威望:0 精华:0 注册:2015/4/17 9:13:00
  发帖心情 Post By:2017/12/14 18:43:00 [只看该作者]

另外红色字的那个有什么特定的指定的吗,我看案例好几个都不一样 有用p和g

3、在服务端的OpenQQ服务端事件ReceivedMessage中编写代码:

Dim msg As String = e.Message
If
 msg.StartsWith(":f") AndAlso msg.EndsWith("f:"Then


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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2017/12/15 0:01:00 [只看该作者]

如果获取编号不正常,你再获取一次看看

 

Dim rt As String =  QQClient.SendWait(":f" & bh & "f:")

If rt = "" Then

    rt =  QQClient.SendWait(":f" & bh & "f:")

End If

msgbox(rt)


 回到顶部