以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  加载数据后重新定位行出错  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=131880)

--  作者:happyft
--  发布时间:2019/3/8 8:01:00
--  加载数据后重新定位行出错
窗口sqltable加载数据后重新定位行,用了下面的代码
  DataTables(tbl.name).Load(False)  \'重新加载数据
        
        \'定位到原来的主表行
        Dim p As Integer = Tables(e.Form.name & "_主表").FindRow("单据编号 = \'" & strID & "\'")
        If p >= 0 Then \'如果找到的话
            Tables(e.Form.name & "_主表").Position = p \'定位到找到的行.
        End If

执行时会出错
"此行已从表中移除并且没有任何数据。BeginEdit() 将允许在此行中创建新数据"
是什么原因,应该如何避免?

谢谢!

--  作者:有点蓝
--  发布时间:2019/3/8 9:08:00
--  
这段代码没有问题

把这个事件完整代码贴出来
--  作者:HappyFt
--  发布时间:2019/3/8 10:10:00
--  
前面就执行了一个储存过程重新更新后台数据后重新加载而已,因为主表有多行,加载后原来那行位置会变动了,所以重新定位
 If flag = True Then
        \'---根据仓库及盘点日期汇总本月的出入库数据
        Dim ds,de As Date
        Dim ck,strID As String
        ds = pr("上月盘点日期")
        de = pr("盘点日期")
        ck = pr("仓库")
        strID = pr("单据编号")
        
        cmd.CommandText = "Exec usp_kc_report \'" & ck & "\', \'" & ds & "\', \'" & de & "\', \'" & strID & "\'"
        cmd.ExecuteNonQuery

        DataTables(tbl.name).Load(False)  \'重新加载数据
        
        \'定位到原来的主表行
        Dim p As Integer = Tables(e.Form.name & "_主表").FindRow("单据编号 = \'" & strID & "\'")
        If p >= 0 Then \'如果找到的话
            Tables(e.Form.name & "_主表").Position = p \'定位到找到的行.
        End If
    End If


--  作者:有点蓝
--  发布时间:2019/3/8 10:20:00
--  
请把完整代码发上来
--  作者:HappyFt
--  发布时间:2019/3/8 11:44:00
--  
把BIN文件删除了,重新打开就可以了,完全相同的代码,另外一个问题
Dim tbl As Table = Tables(e.Form.name & "_主表")
Dim tbl2 As Table  = Tables(e.Form.name & "_明细")
Dim pr As Row = tbl.Current
If pr IsNot Nothing Then  \'以免为空时出错
    \'---根据仓库及盘点日期汇总本月的出入库数据
    Dim cklb,strID As String
    cklb = pr("仓库类别")
    strID = pr("单据编号")
    
    Dim cmd As New SQLCommand
    cmd.ConnectionName = Mydata
    cmd.CommandText = "Exec usp_kc_report_price \'" & strID & "\', \'" & cklb & "\'"
    \' msgbox(cmd.CommandText)
    cmd.ExecuteNonQuery
    
    DataTables(tbl.name).Load(False)  \'重新加载数据
    
    \'定位到原来的主表行
    Dim p As Integer = tbl.FindRow("单据编号 = \'" & strID & "\'")
    If p >= 0 Then \'如果找到的话
        tbl.Position = p \'定位到找到的行.
    End If
    
    \'---计算合计金额
    pr = tbl.Current
    If pr IsNot Nothing Then
        pr("合计金额") = tbl2.Compute("Sum(期末库存金额)", "单据编号 = \'" & pr("单据编号") & "\'")
        pr.Save()
    End If
End If

重新加载数据后最后一段代码是根据加载后的明细表的数据计算合计金额显示在主表上,结果要按两次按钮才会计算,第一次为什么不计算呢?


--  作者:有点蓝
--  发布时间:2019/3/8 11:57:00
--  
\'---计算合计金额
    pr = tbl.Current
msgbox(1) ‘第一次按能不能弹出
    If pr IsNot Nothing Then
msgbox(2) ‘第一次按能不能弹出
        pr("合计金额") = tbl2.Compute("Sum(期末库存金额)", "单据编号 = \'" & pr("单据编号") & "\'")
msgbox(pr("合计金额")) ‘第一次按能不能弹出
        pr.Save()
    End If

--  作者:HappyFt
--  发布时间:2019/3/8 12:02:00
--  
每次每个都会弹出,只是msgbox(pr("合计金额"))第一次点时会显示0,第二次就正确了,为什么会这样?
--  作者:有点蓝
--  发布时间:2019/3/8 12:06:00
--  
pr = tbl.Current
    If pr IsNot Nothing Then
msgbox(tbl2.rows.count
msgbox("单据编号 = \'" & pr("单据编号") & "\'")
        pr("合计金额") = tbl2.Compute("Sum(期末库存金额)", "单据编号 = \'" & pr("单据编号") & "\'")

        pr.Save()
    End If

--  作者:HappyFt
--  发布时间:2019/3/8 12:32:00
--  
分别是行数1365 ,单据编号 = \'kc1903-007\'  ,都对,就是第一次计算金额还是0,
我发现一个原因,就是第一次点击按钮后,前面用了
DataTables(tbl.name).Load()  \'重新加载数据

然后再计算金额,但显示的情况是计算金额都显示完成后,数量那些数据才显示出来,程序没按顺序执行,所以就这样了,
如何才能保证加载完成后再执行后面计算的代码?

--  作者:有点蓝
--  发布时间:2019/3/8 14:12:00
--  
肯定是按顺序的,Load不执行完毕,不会执行后面的代码。具体上传实例说明
[此贴子已经被作者于2019/3/8 14:12:21编辑过]