以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  foxtable中r.save的机理  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=101951)

--  作者:HappyFt
--  发布时间:2017/6/10 15:13:00
--  foxtable中r.save的机理
Dim r As Row = Tables("A").Current
r.Save()
msgbox(r("_Identify"))

在foxtable中如果用上面的代码,新增行保存过后,显示的_identify就是后台数据库中实际的值,而如果我是用
sql拼接语句保存即直接insert into到数据库中,实际数据库中的_identify已经是实际值了,但如果新增行没有重新加载
用msgbox(r("_Identify")) 显示时还是临时值,此时现用r.Load也不起作用,只能将此行移除再追载进来
或者整个表tables("表A").Load后_identify才会改变,为什么tables("表A").Load后可以,但r.load就不可以,
故想了解一下foxtable的r.save保存方式是不是保存了也重新加载了一下,是怎么加载的?

谢谢!


--  作者:有点蓝
--  发布时间:2017/6/10 15:30:00
--  
r.load是根据主键加载的,因为还是临时值,所以是无法加载的
--  作者:HappyFt
--  发布时间:2017/6/13 19:53:00
--  
For Each dr As DataRow In DataTables(winname & "_主表").DataRows
    If dr.RowState = DataRowState.Added Then  \'新增行
        \'msgbox(dr("_Identify"))
        Dim flt2 = fRcol & " = \'" & dr(fRcol) & "\'"
        dr.Load(false)
    End If
Next

上面重新加载行我想用实际的关联列来加载,条件为flt2,此时如果按此条件重新加载此行,dr.Load这里也怎么写才可以?

--  作者:有点蓝
--  发布时间:2017/6/13 20:42:00
--  
dr本来就是一行数据而已,还能加什么条件!

另外新增的行还没有保存,是不存在于数据库的,怎么能加载呢!

实在不明白想要做什么?

--  作者:HappyFt
--  发布时间:2017/6/13 20:59:00
--  
我是用的sql直接保存数据的,这段代码是已经通过事务将新增行insert into插入到sql数据库中了,而当前前台操作表中新增行的_Identify还是新增时那个临时的,想通过dr.Load的方式加载一下此行,目的就是把当前表中的_identify更新为后台数据库中实际那个,否则用户在没有关闭当前窗口的情况下再修改数据保存时就对不上(因为sql保存时的数据全部是用_identify来做where条件对应的,这样简单方便)
--  作者:有点蓝
--  发布时间:2017/6/13 21:23:00
--  
1、保存之前到数据库查询最大的主键值,如:dim key as integer = DataTables("表A").SQLCompute("Max(主键)")
2、insert into插入到sql数据库中
3、撤销编辑DataTables("表A").RejectChanges,或者通过代码删除掉未保存的新行
4、加载大于之前查询出来的主键的数据:DataTables("表A").AppendLoad("主键 > " & key)

其实这种自己使用sql保存数据的最适合使用sqltable编辑数据,直接关闭窗口就可以省略第3步了


--  作者:HappyFt
--  发布时间:2017/6/14 10:58:00
--  
误会我的意思了,我只是想把当前新增行重新加载而已,提取后台最大号等都不用. 因为foxtable的dr.save后前台的当前行的_identify就会变动实际的,我就想要这种结果
我现在是按下面的方式实现:
For Each dr As DataRow In DataTables(winname & "_主表").DataRows
    If dr.RowState = DataRowState.Added Then  \'新境行
        \'msgbox(dr("_Identify") & "-主表-" & dr.RowState)
        Dim flt2 = fRcol & " = \'" & dr(fRcol) & "\'"
        Tables(winname & "_主表").StopRedraw
        DataTables(winname & "_主表").RemoveFor(flt2)
        DataTables(winname & "_主表").Appendload(flt2)
        Tables(winname & "_主表").ResumeRedraw
    End If
Next
这种方式是先移除再追载还是有个缺点用户在当前操作的位置重新追载后当前表的数据刷新了可能变成不是原来的行,又要重新去找原来那行来操作
新增后虽然_identify还是临时的,但关联列与后台是一致的,想用关联列做为条件来重新加载当前行

--  作者:HappyFt
--  发布时间:2017/6/14 18:02:00
--  
有点色老师,帮忙看下,这个还有什么办法再改进,原来是整个表重新加载,现在7楼的代码已经比整个表重新加载好很多,但还是有我7楼说的问题,加载后用户要重新去找刚才操作过的那行,有点不好,
谢谢!

--  作者:有点色
--  发布时间:2017/6/14 18:16:00
--  
 加载之前,记录那一行的位置,或者主键列,或者整列信息。加载后,重新定位。