以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  保存完数据后,整个表变成空白的,是咋回事  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=143316)

--  作者:andy-1024
--  发布时间:2019/11/20 21:34:00
--  保存完数据后,整个表变成空白的,是咋回事
 老师好,我的软件出了些问题。
窗口保存按钮用于保存数据行及一些数据处理功能,数据行写入表之后,需要先保存这个数据行,然后对这个数据行进行下一步处理。
但是问题是,数据行写入后,这个表变成空白表,后续代码需要查找这一数据行的时候找不到,所以报错。这个表不管怎么刷新,数据都不显示,只有卸载掉这个表,重新加载,才能看到数据,这个时候,可以发现刚才保存的数据行是已经保存完了的。
我在代码中插一个判断语句,来看是否存在刚才写入的行,提示也是未发现。不知道是什么原因。
 
代码片段如下,见注释:

\'写入R_GoodsInfo表
Dim nr_Goods As DataRow = dt_Goods.AddNew()

\'写入数据的代码

nr_Goods.Save()

\'写入R_StockFlow表
\'其它无关代码

\'-------------->出问题部分:
    dtSFlow.SQLDeleteFor("sys_Done Is Null")
    For Each drFlow As DataRow In dtSFlow.SQLSelect("sys_D")
        Dim drGoods As DataRow = DataTables("R_GoodsInfo").SQLFind("ID = \'" & drFlow("BarCode") & "\'")

If drGoods IsNot Nothing           \'——加判断语句验证,提示未找到drGoods数据行
    MessageBox.Show("yes")
Else
    MessageBox.Show("no")
End If
\'------此后代码无法进行下去了
        drGoods("Stock") = IIF(drGoods.IsNull("Stock"),0,drGoods("Stock")) + drFlow("Qty")
        drGoods.Save()
        Dim drSList As DataRow = dtSList.SQLFind("BarCode = \'" & drFlow("BarCode") & "\' and Shop = \'" & drFlow("Shop") & "\'")
        If drSList IsNot Nothing Then
            drSList.SQLSetValue("Qty",drSList("Qty") + drFlow("Qty"))
        Else
            Dim nrSList As DataRow = dtSList.SQLAddNew()
            nrSList("Shop") = drFlow("Shop")
            nrSList("BarCode") = drFlow("BarCode")
            nrSList("Qty") = drFlow("Qty")
            nrSList.Save()
        End If
        drFlow.SQLSetValue("sys_Done","D")
    Next
End If

见图
保存完数据行后,整个表变成空白的,而后用于验证的判断语句给出了不存在刚才保存的行的判断:
 

图片点击可在新窗口打开查看此主题相关图片如下:1.jpg
图片点击可在新窗口打开查看
 
点击No的确定按钮后,开始报错。
 


图片点击可在新窗口打开查看此主题相关图片如下:2.jpg
图片点击可在新窗口打开查看

 

而后不管怎么刷新页面和数据,都无法显示任何数据

 


图片点击可在新窗口打开查看此主题相关图片如下:3.jpg
图片点击可在新窗口打开查看

只有先卸载数据表,而后重新加载数据表,数据才能再次显示,可以发现,刚才写入的数据行确实已经保存完成。

(只能上传3个文件,这个看不到了)

 

然而,虽然表是空白表,但是数据似乎都隐身了,鼠标点击之处还是可以选中数据行,双击某处,还能弹出此处对应的数据的编辑窗口,好像数据表全都透明了一样。

不知道是怎么回事?

[此贴子已经被作者于2019/11/20 22:16:07编辑过]

--  作者:程兴刚
--  发布时间:2019/11/20 21:59:00
--  
……
If drGoods IsNot Nothing           \'——加判断语句验证,提示未找到drGoods数据行
    MessageBox.Show("yes")
Else
    MessageBox.Show("no")
    Return
End If
……
既然没有找到符合条件的行,drGoods为空 ,没必要再继续执行下去!

--  作者:andy-1024
--  发布时间:2019/11/20 22:04:00
--  
以下是引用程兴刚在2019/11/20 21:59:00的发言:
……
If drGoods IsNot Nothing           \'——加判断语句验证,提示未找到drGoods数据行
    MessageBox.Show("yes")
Else
    MessageBox.Show("no")
    Return
End If
……
既然没有找到符合条件的行,drGoods为空 ,没必要再继续执行下去!
 
你没明白我的意思,我保存完这个新的数据行后是一定要使用它的,但是保存完后整个表变成空白表了,这个数据行也看不见,所以后续代码执行不下去了。但是后续代码是一定要执行的,而不是数据行存在则执行,不存在则不执行。


--  作者:程兴刚
--  发布时间:2019/11/20 22:54:00
--  
1、您只给了半截代码,前面的代码什么也看不到,我当然不知道保存数据后为什么表成了空白,也么有可测试文件!
2、严谨一点的代码就应该加上我给的那一行,您知道为什么吗?当条件不符合,该drGoods为空,不存在这个datarow,怎么引用单元格的值?这样就会报错,加上后这是当条件不成立时,暂停执行后续代码,要的就是杜绝您现在遇到的报错现象。

--  作者:程兴刚
--  发布时间:2019/11/20 22:59:00
--  
您写入的是nr_Goods ,您判断的是 drGoods,这两个datarow都不在一个表,怎么可能达到符合条件而不报错?

您这样的一些变量、表、列命名把您自己都要搅和晕了算!

--  作者:andy-1024
--  发布时间:2019/11/21 4:31:00
--  

出现这个问题是今天才发现的,这套软件我开发完,已经使用了一年多了,这个功能从没出现过问题。前几天我发现了系统的一个bug,然后修正了(其实就是在更新库存的时候加入了一个判断语句),并不涉及这个功能模块。然后今天使用这个功能的时候就出现了这个问题。我也搞不清楚到底是什么原因。

下面是添加商品窗口中保存商品信息按钮的完整代码,并做了备注:

 

这个保存功能涉及三个表:R_GoodsInfo(商品信息表),R_StockFlow(商品库存流动表),R_StockList(分店库存列表)

功能简介:

1.初始判断是否符合保存条件

2.保存数据行

3.将初始库存写入R_StockFlow表,并更新刚刚保存完的数据行的库存列的数值

4.完成后的界面处理

 


图片点击可在新窗口打开查看此主题相关图片如下:11.jpg
图片点击可在新窗口打开查看

 


图片点击可在新窗口打开查看此主题相关图片如下:12.jpg
图片点击可在新窗口打开查看



图片点击可在新窗口打开查看此主题相关图片如下:13.jpg
图片点击可在新窗口打开查看


--  作者:有点蓝
--  发布时间:2019/11/21 9:07:00
--  
变成空白的原因很简单,因为调用了StopRedraw,却没有调用对应的ResumeRedraw:http://www.foxtable.com/webhelp/topics/0453.htm

注意return是不会执行后面的代码的,所以return后面的ResumeRedraw是没有用的,所以每一个return之前都应该调用ResumeRedraw。

另外如果中途代码出错也会导致出错后面的代码不会执行,想上面使用到的sqlfind,返回值没有做判断直接使用,如果返回值是空值肯定就会出错。

--  作者:程兴刚
--  发布时间:2019/11/21 9:36:00
--  
对,蓝版主说的对,每一个return前应该插入一行:
t.ResumeRedraw
另外,如果真的想快速得到帮助,建议您:请不要将代码截图,直接贴上来,没人愿意为您去码那么多字。

--  作者:andy-1024
--  发布时间:2019/11/21 14:26:00
--  
以下是引用程兴刚在2019/11/21 9:36:00的发言:
对,蓝版主说的对,每一个return前应该插入一行:
t.ResumeRedraw
另外,如果真的想快速得到帮助,建议您:请不要将代码截图,直接贴上来,没人愿意为您去码那么多字。

嗯,好的,谢谢,我昨天把代码复制进来,无法发表,所以无奈才截屏的。系统提示大概意思:请阅读论坛规则,查看是否具有权限之类的。

[此贴子已经被作者于2019/11/21 14:30:59编辑过]

--  作者:有点蓝
--  发布时间:2019/11/21 14:33:00
--  
可能内容太多,可以提到txt文件上传