以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]OPENQQ编号出现重复。  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=87894)

--  作者:苦为用功
--  发布时间:2016/7/22 9:41:00
--  [求助]OPENQQ编号出现重复。
   根据帮助中的《用OpenQQ实现网络环境下的编号》做的编号,不关闭项目添加正常,但是每次重新打开项目输入"类别",编号就归零。请问是什么原因?全程QQClient斗正常连接。

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 StringQQClient.SendWait(":f" & bh & "f:")
           
Dim id As Integer
            If rt > "" Then
                If  Integer.TryParse(rt,idThen
                    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


--  作者:大红袍
--  发布时间:2016/7/22 9:45:00
--  

 

[此贴子已经被作者于2016/7/22 9:46:52编辑过]

--  作者:苦为用功
--  发布时间:2016/7/22 9:52:00
--  
补充一下,也尝试在生成编号收加入save但是也不行。之前用的还好好的,不知道怎么就变成这样了。图片点击可在新窗口打开查看
--  作者:大红袍
--  发布时间:2016/7/22 9:57:00
--  

帮助文档的代码,是要求你服务器程序,不能关闭的。

 

如果要不归零,你必须修改服务器端的代码,也就是关闭项目之前,把编号的信息保存回表里去

 

如,BeforeCloseProject事件,写代码


For Each key As String In pdbhs.Keys
    DataTables("产品").ReplaceFor("编号", key & Format(pdbhs(key),"000"), "类别 = \'" & key & "\'")
Next
DataTables("产品").Save

 

[此贴子已经被作者于2016/7/22 9:58:26编辑过]

--  作者:苦为用功
--  发布时间:2016/7/22 10:10:00
--  
谢谢大红袍老师。我试了下添加后保存,服务端开启同一个表格,加载后服务端出现该新建,数据库也有该行,然后关闭客户端再连接编号仍然重头开始。

下面的这段代码不是对比现有编号的吗?而且开了编号列禁止重复,不管用也。

字典储存在内存中重新打开后就会清零吗?


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


--  作者:苦为用功
--  发布时间:2016/7/22 11:31:00
--  
大红袍老师,菜单上的保存按键是这个Syscmd.Project.Save()吧?和您提供的有什么不同?保存按键不是直接全表保存了吗?
For Each key As String In pdbhs.Keys
    DataTables("产品").ReplaceFor("编号", key & Format(pdbhs(key),"000"), "类别 = \'" & key & "\'")
Next
DataTables("产品").Save

--  作者:狐狸爸爸
--  发布时间:2016/7/22 11:50:00
--  

换个思路,每次打开QQserver,就从表中提取最大的编号不就行了吗?

用SQLCompute:

 

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

 

= DataTables("订单").SQLCompute("Max(编号)")


--  作者:苦为用功
--  发布时间:2016/8/4 8:47:00
--  
以下是引用狐狸爸爸在2016/7/22 11:50:00的发言:

换个思路,每次打开QQserver,就从表中提取最大的编号不就行了吗?

用SQLCompute:

 

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

 

= DataTables("订单").SQLCompute("Max(编号)")


狐狸爸爸,能具体讲解下吗?这句代码要加在哪里?

另外,我现在编号使用的是笨方法,每个表的编号都是一个单独全局代码对应,能精简下吗?


--  作者:Hyphen
--  发布时间:2016/8/4 9:18:00
--  
比如在服务端的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 pdbhs.ContainsKey(msg) Then \'如果存在这个类别的编号
        pdbhs(msg) = pdbhs(msg) + 1 \'将该类别最大编号加1
    Else
        Dim bh As String = DataTables("订单").SQLCompute("Max(编号)","编号 like \'" & msg & "%\'")
        Dim bhz = 1
        If bh > "" Then CInt(bh.SubString(2))+1
        pdbhs.Add(msg,bhz)
    End If
    e.ReturnValue = pdbhs(msg) \'将编号返回给客户端
End If

或者还有一种方法,不要用字典存储编号,直接加载整个编号表,然后通过查询编号表来取值和保存


--  作者:大红袍
--  发布时间:2016/8/4 9:23:00
--  

做一个编号表。记录各个编号的最大值。如

 

表A   BH    5

表B   XL    10

 

这样,可以直接启用变量,直接在这个表里面查询存取数据,即可。