以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  有个奇怪的错误,请帮忙分析分析  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=140612)

--  作者:vimin
--  发布时间:2019/9/9 23:37:00
--  有个奇怪的错误,请帮忙分析分析
我碰到个莫名其妙的错误,实在是测不出来哪里出的问题。因为比较复杂,很难发例子上来,看看我是否能描述清楚:
一个窗体,两个table控件,两个外部数据源的表。入库表,入库明细表,按需加载。
窗体beforeclose有代码,判断入库表或者明细表有haschange=true,则messagebox,提醒。
奇怪的是,我的确认保存按钮(add)一按,后台数据库一切正常运行,但关闭窗口便弹出以上的messagebox。
经测试是明细表的原因。但是不管是用历遍所有列的值,弹出一个个检查,还是后台sqlserver查看,都显示数据是没有任何更改的。
我的add按钮点击之后,会把add按钮本身enable设为false。只要把这句代码e.Form.Controls("add").Enabled = False,注释掉,beforeclose的弹窗居然就不弹了。
请老师帮忙分析一下,可能是什么原因呢。我实在是用来好多办法,都解决不了

--  作者:有点蓝
--  发布时间:2019/9/10 8:45:00
--  
beforeclose和保存按钮全部代码发上来看看。
--  作者:vimin
--  发布时间:2019/9/10 21:46:00
--  
table1是明细表,table2是入库表

beforeclose代码:
If DataTables("StockInN_Table2").HasChanges Or DataTables("StockInN_Table1").HasChanges Then
    Dim rst As Dialogresult
    rst = MessageBox.show("入库单未入库,是否直接退出? 如果要保存请按【确认入库】按钮","提示",MessageBoxButtons.YesNo,MessageBoxIcon.Question)
    Se/ect Case rst
        Case DialogResult.no
            e.cancel = True
    End Se/ect
End If

确认入库按钮(add1),click事件:
Dim tb1 As Table = Tables("StockInN_Table1")
Dim tb2 As Table = Tables("StockInN_Table2")
DataTables("StockInN_Table2").save()
If DataTables("StockInN_Table2").HasChanges = True Then
    Return
Else
    DataTables("StockInN_Table1").save()
    If DataTables("StockInN_Table1").HasChanges = True Then
        Return
    End If
End If    \'先保存,如果不能保存就不继续

Dim sql As new SQLCommand
Dim lsb As DataTable
sql.C
sql.CommandText = "se/ect * fr om {产品库存信息} where 1 = 0"
lsb = sql.ExecuteReader(True)    \'生成临时表,设成True,库存信息可以保存
Dim ck As String = tb2.Rows(0)("仓库编号")
Dim gys As String = tb2.Rows(0)("供应商编号")
Dim bh As String = tb2.Rows(0)("对应编号")
Dim hs As Integer = tb1.Rows.Count
For i As Integer = 0 To hs -1
    Dim hh As String = tb1.Rows(i)("基础货号")
    Dim gj As String = tb1.Rows(i)("产地国家码")
    Dim kcm As String = hh & gj & gys & ck    \'生成产品库存码,基础货号+国家码+供应商码+仓库码
    Dim h As DataRow
    h = lsb.SQLFind("产品库存码 = \'" & kcm & "\'")
    If h IsNot Nothing Then
        h("当前库存数量") = h("当前库存数量") + tb1.Rows(i)("数量")
        h.save()
    Else
        Dim xh As DataRow
        xh = lsb.AddNew()
        xh("产品库存码") = kcm
        xh("基础货号") = hh
        xh("产品基本名称") = tb1.Rows(i)("产品基本名称")
        xh("原产地国") = tb1.Rows(i)("原产地国")
        xh("产地国家码") = gj
        xh("供应商名称") = tb2.Rows(0)("供应商名称")
        xh("供应商编号") = gys
        xh("仓库名称") = tb2.Rows(0)("入库仓库")
        xh("仓库编号") = ck
        xh("当前库存数量") = tb1.Rows(i)("数量")
    End If
Next
lsb.save()
If ancs = "cgrk" Then    ‘这是全局变量,判断入库类型,会有不同的设置,也很奇怪,只有这个类型会出现我说的错误,其他类型就不出现。但是注释掉这整段还是一样会出现弹窗。
    Dim sql3 As new SQLCommand
    sql3.C
    sql3.CommandText = "up d ate {采购下单表} se t 采购单状态 = \'已入库\' w here 采购编号 = \'" & bh & "\'"
    sql3.ExecuteNonQuery    \'添加之后便到采购下单表标注一下单子已成功
End If
e.Form.Controls("ad").Enabled = False
e.Form.Controls("del").Enabled = False
e.Form.Controls("beiz").Enabled = False
e.Form.Controls("dybh").Enabled = False
e.Form.Controls("rkck").Enabled = False
e.Form.Controls("gys").Enabled = False
e.Form.Controls("add1").Enabled = False        ‘只要把这条注释掉就没弹窗了
e.Form.Controls("add").Enabled = True
e.Form.Controls("bq").Enabled = True
For Each l As Col In tb1.Cols
    MessageBox.show(tb1.Current(l.Name))
Next

--  作者:有点蓝
--  发布时间:2019/9/10 21:56:00
--  
备份项目。把"add1"这个按钮删除,然后重新添加,按钮名不再使用"add1",换个名称。然后退出项目,删除bin目录,重启项目,再试试。

按钮还有没有其它事件代码?窗口全局事件有没有什么代码?

--  作者:vimin
--  发布时间:2019/9/10 22:11:00
--  
按钮就这一个事件,全局代码就定义了几个变量,无其他。我用你的方法试试看
--  作者:vimin
--  发布时间:2019/9/11 8:05:00
--  
完全按你的步骤操作,成功了。非常感谢!