以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  一个非常奇怪的问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=40611)

--  作者:东坡一剑
--  发布时间:2013/9/24 18:31:00
--  一个非常奇怪的问题

我在出入库明细表的datacolchanged设置了下面的代码意图从货品信息表中获取已存档的货品信息,原来一直运行得很好,后来到货的条码有些不太规范,夹杂了*-以及空格等字符,我就编写了红色部分的代码来清除它们,小规模试了还是能运行。可是今天我发现有相当一部分条码,明明已经有存档的货品信息,还是要让新增,刚开始以为是存档的货号列字符的输入法与现在不同,于是复制新读取的条码上包含的货号字符替换掉原来存档的货号字符,不解决问题。又以为是红色部分的代码造成的,于是注释掉它们,还是不行。插入蓝色字体的测试代码,显示hh为空。

太郁闷了!

 

If pause = True Then
    Return
End If

Dim sp As New DotNetSpeech.SpVoice()
Dim cmd,cmd1,cmd2 As new SQLCommand
Dim tm,s1,s2,hh ,cm,pp As String
Dim dt As DataTable
Dim dr As DataRow
Select Case e.DataCol.Name
    Case "产品条码"
        tm = e.NewValue
        If Char.IsDigit(tm.Substring(0,1)) Then          
            sp.Speak("条码输入有误!请重新输入!", DotNetSpeech.SpeechVoiceSpeakFlags.SVSFDefault)
            Return
        End If
        If tm = Nothing Then
            Return
        End If
\'Dim lst As new List(Of String)  \'清除条码的无效字符
\'For i As Integer = 0 To tm.length - 1
    \'lst.Add(tm.SubString(i,1))
\'Next
\'If lst.count > 0 Then
    \'tm = Nothing
    \'For i As Integer = 0 To lst.count - 1
        \'If Char.IsLetterOrDigit(lst(i)) Then
            \'tm = tm & lst(i)
        \'End If
    \'Next
    \'tm = tm.Trim()
    \'e.DataRow("产品条码") = tm
\'End If

        cmd.C
        cmd.CommandText = "select * From {货品信息}"
        dt = cmd.ExecuteReader()
        For Each dr In dt.DataRows
            If tm.StartsWith(dr("货号"))  Then
                hh = dr("货号")
                Exit For
            End If
        Next

messagebox.show(hh)
        If hh = "" Then
            sp.Speak("有新增货品,请添加!", DotNetSpeech.SpeechVoiceSpeakFlags.SVSFDefault)
            _str = tm.Substring(0,8) & "**"
            Forms("新增货品信息").open()
            Return
        End If
        dr = dt.Find("货号 =\'" & hh & "\'")
        If dr IsNot Nothing Then
            Dim sts As String() ={"货号","产品名称","品牌"}
            Dim st As String
            For Each st In sts
                e.DataRow(st) = dr(st)
            Next
            Dim sts1 As String() = {"产品名称","年份","季别","品牌","品类","细类","系列","性别","吊牌价格","产地","材质1","材质2","材质3","材质4","材质5","材质6"}
            For Each st In sts
            Forms("货品出库").Controls(st).text = dr(st)
            Next
         End If
        s1 = tm.Substring(hh.length,2)
        s2 = tm.Substring(hh.length + 2,2)
        cm = tm.Substring(hh.length + 4)
        cmd.C
        cmd.CommandText = "select * from {颜色编码}"
        dt = cmd.ExecuteReader()
        dr = dt.Find("色码 =\'" & s1 & "\'")   \'    And 品牌 =\'" & e.DataRow("品牌") & "\'")
        If dr Is Nothing Then
            sp.Speak("有新增颜色,请添加!", DotNetSpeech.SpeechVoiceSpeakFlags.SVSFDefault)
            _str = s1 & "|" & Tables("出库明细").Current("品牌")
            Forms("颜色编码信息").open()
            Return
        Else
            s1 = dr("颜色")
        End If
        dr = dt.Find("色码 =\'" & s2 & "\'" )  \' And 品牌 =\'" & e.DataRow("品牌") & "\'")
        If dr Is Nothing Then
            sp.Speak("有新增颜色,请添加!", DotNetSpeech.SpeechVoiceSpeakFlags.SVSFDefault)
            _str = s2 & "|" & Tables("出库明细").Current("品牌")
            Forms("颜色编码信息").open()
            Return
        Else
            s2 = dr("颜色")
        End If
        If s2 = "空白" Then
            s1 = s1
        Else
            s1 = s1 & "/" & s2   
        End If
        e.DataRow("颜色") = s1
        e.DataRow("尺码号") = cm
        \'Forms("货品出库").Controls("颜色").value = s1
        \'Forms("货品出库").Controls("尺码号").Value = cm
        Forms("货品出库").Controls("产品条码").Value= Nothing
        Forms("货品出库").Controls("产品条码").Select
End Select


--  作者:东坡一剑
--  发布时间:2013/9/24 19:15:00
--  
现在甚至直接复制货品信息中的货号加上正常的后缀字符都不行了!
--  作者:有点甜
--  发布时间:2013/9/24 19:18:00
--  
 datacolchanged事件,是值已经写进去才触发的,也就是不规则的数据已经被写入了。

 你可以把红色代码放到datacolchanging事件里去,输入不规范的时候,修改e.newvalue的值。


--  作者:东坡一剑
--  发布时间:2013/9/24 20:02:00
--  
谢谢提醒,是应该这样,我先试试,不行再请教。
--  作者:东坡一剑
--  发布时间:2013/9/24 20:14:00
--  
现在直接崩溃退出了!
--  作者:有点甜
--  发布时间:2013/9/24 20:18:00
--  
 不可能吧,你执行什么操作崩溃退出的?

 你删除datacolchanged相关的代码,把下面的代码复制到到datacolchanging里去,然后修改表的值,看看效果

If e.DataCol.Name = "产品条码" Then
    Dim lst As new List(Of String)  \'清除条码的无效字符
    For i As Integer = 0 To tm.length - 1
        lst.Add(tm.SubString(i,1))
    Next
    If lst.count > 0 Then
        tm = Nothing
        For i As Integer = 0 To lst.count - 1
            If Char.IsLetterOrDigit(lst(i)) Then
                tm = tm & lst(i)
            End If
        Next
        tm = tm.Trim()
        e.newValue = tm
    End If
End If

--  作者:东坡一剑
--  发布时间:2013/9/24 20:37:00
--  

系统重启后没有崩溃,但问题依然存在


--  作者:有点甜
--  发布时间:2013/9/24 20:40:00
--  
 上个例子看看,没理由的。可能不是那段代码的问题。
--  作者:东坡一剑
--  发布时间:2013/9/24 20:57:00
--  

我也估计不是代码的问题,因为换一个值就一切正常。


--  作者:东坡一剑
--  发布时间:2013/9/25 4:03:00
--  

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:求助.zip

 

关于求助的说明:

1、请最好将文件放到F盘,因为外部数据源的链接设置在F盘

2、项目打开后的录入窗口中双击某个目录树节点,然后单击确定,填入到货箱号库区、库位信息(随便填),单击开始入库,产品条码进入可编辑状态。

3、窗口的表中已经有两个条码,轮流复制到产品条码控件,回车,即可发现我所描述的问题。

4、如果弹出新增货品信息窗口,在货号中删除后面的*号和多余的字符,保留8位数,回车,将会发现出问题的货号其实已经存档了完整的信息。

5、打开数据源的货品信息表,也可以发现出问题的货号其实真的存档了。

6、提示:几天前,这项功能其实没有任何问题,所有已经存档的东西都可以提取出来。

7、总之劳驾诸位帮帮忙,这里先谢了!

[此贴子已经被作者于2013-9-25 8:27:34编辑过]