以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 遍历顺序是否可自定义 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=154020) |
-- 作者:weibu -- 发布时间:2020/9/1 11:29:00 -- 遍历顺序是否可自定义 老师我这边使用for next变量进行批量复制数据。 但复制出来的数据在不排序的情况下跟原数据排列顺序不同。可能是因为我添加原数据是有删除和移动数据位置。 现在我想复制处理的数据复制出来的数据与原数据的顺序相同,该如何操作? 我的想法是遍历原数据是否可用指定遍历的字段,例如我有order列类型为short 如何按照order列的值进行遍历生成新数据?这句代码怎么写?或者是有变通的实现方式
|
-- 作者:有点蓝 -- 发布时间:2020/9/1 11:53:00 -- 方法1、 Tables("订单").sort = "order" For i as integer = 0 to Tables("订单").Rows.count - 1 For Each dr As DataRow In DataTables("订单").Select("","order") |
-- 作者:weibu -- 发布时间:2020/9/1 12:43:00 -- 谢谢老师这个搞定了。我复制5000行,需要130秒。太慢。看了文档进行优化,但还是不行。 原有代码(生成5000条需130秒) Dim d As String = e.Form.Controls("ComboBox1").Value Dim t As String = e.Form.Controls("label1").text If t <> "Label1" Then If d IsNot Nothing Then If DataTables("mframe").find("[mid] = \'" & t & "\' and [period] = \'" & d & "\'") Is Nothing Then Dim Cols1() As String = {"mid","mname","fruit","work","property","inteformula","checkcycle","mnumber","isuse","iskey","unit","gobest","isupdate","order"} Dim Cols2() As String = {"mid","mname","fruit","work","property","inteformula","checkcycle","mnumber","isuse","iskey","unit","gobest","isupdate","order"} For Each dr1 As DataRow In DataTables("mframe").Select("[mid] = \'" & t & "\'and [lage] = 1 ") Dim dr2 As DataRow = DataTables("mframe").AddNew() For i As Integer = 0 To Cols1.Length -1 dr2(Cols2(i)) = dr1(Cols1(i)) Next dr2("period") = d Next MessageBox.Show("\'" & d & "\'克隆成功!") Else MessageBox.Show("此时期已存在,无法重复生产!如克隆力龄,请单击下方按钮!") End If Else MessageBox.Show("请选择所属时期!") End If Else MessageBox.Show("请选择所属岗位!") End If 优化代码,生成数据错误,但找不出错误地方。请老师帮忙看下 Dim d As String = e.Form.Controls("ComboBox1").Value Dim t As String = e.Form.Controls("label1").text If t <> "Label1" Then If d IsNot Nothing Then If DataTables("mframe").find("[mid] = \'" & t & "\' and [period] = \'" & d & "\'") Is Nothing Then Dim Cols1() As String = {"mid","mname","fruit","work","property","inteformula","checkcycle","mnumber","isuse","iskey","unit","gobest","isupdate","order"} Dim Cols2() As String = {"mid","mname","fruit","work","property","inteformula","checkcycle","mnumber","isuse","iskey","unit","gobest","isupdate","order"} Dim lst1 As New List(of DataRow) Dim lst2 As New List(of DataRow) Tables("mframe").sort = "order" For Each dr As DataRow In DataTables("mframe").DataRows If DataTables("mframe").Find("[mid] = \'" & t & "\'and [lage] = 1 ") IsNot Nothing Then lst1.Add(dr) Dim dr2 As DataRow = DataTables("mframe").AddNew() lst2.Add(dr2) End If Next For Each dr As DataRow In lst2 For i As Integer = 0 To Cols1.Length -1 lst2(Cols2(i)) = lst1(Cols1(i)) Next dr("period") = d Next MessageBox.Show("\'" & d & "\'克隆成功!") Else MessageBox.Show("此时期已存在,无法重复生产!如克隆力龄,请单击下方按钮!") End If Else MessageBox.Show("请选择所属时期!") End If Else MessageBox.Show("请选择所属岗位!") End If |
-- 作者:有点蓝 -- 发布时间:2020/9/1 13:57:00 -- 这个慢和优化基本没有什么关系的,不需要优化了。慢应该是表事件和表达式列计算引起的,试试 systemready = false 原有代码 systemready = true
|
-- 作者:weibu -- 发布时间:2020/9/1 14:17:00 -- 老师我需要这个列自动编码。不能停掉表事件。 If e.DataTable.Compute("Max(mid)") Is Nothing Then e.DataRow("mitemid") = 100000000001 Else e.DataRow("mitemid") = e.DataTable.Compute("Max(mitemid)") + 1 End If 测试了下,停掉这个速度为55秒,大幅提高了速度。 但是老师,我再帮助里面看,上面写遍历的查询和赋值分开弄,原来200多秒1万行,现在只要0.8秒。我这个的逻辑是不是跟帮助不同,所以无法用啊? 狐表帮助文档如下: 出人意料的是,两段代码运行得都非常快,都在瞬间完成了。 Dim lst1 As New
List(of
DataRow) |
-- 作者:有点蓝 -- 发布时间:2020/9/1 14:24:00 -- 停掉表事件,在3楼代码里直接生成新编号赋值即可 您的是直接给新增行赋值,不是在查询结果行里赋值,自己试试就知道了
|
-- 作者:weibu -- 发布时间:2020/9/1 14:30:00 -- 嗯,明白了。谢谢老师。老师这个时间长,我想做个进度显示的。否则还以为死机了。咱们狐表能做吗? 或者做一个转圈的状态也行,说明系统没有死机,软件还在运行 。只要让使用者知道软件在运行中也行。
[此贴子已经被作者于2020/9/1 15:15:47编辑过]
|
-- 作者:weibu -- 发布时间:2020/9/4 19:40:00 -- 老师下面代码是不是把查询和赋值分开就能快300倍? For Each lr1 As DataRow In DataTables("mframe").Select("[mid] = \'" & t & "\'and [periodid] <> \'" & d & "\' and [lage] >= \'" & dr("lageend") + 1 & "\'") lr1("lage") = lr1("lage") + 1 Next |
-- 作者:有点蓝 -- 发布时间:2020/9/5 8:26:00 -- 进度提示可以看看这个:http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=152101&replyID=&skin=1 是否快300倍自己测试一下不就知道了。 DataTables("mframe").sqlreplacefor("lage","[lage]+1","[mid] = \'" & t & "\'and [periodid] <> \'" & d & "\' and [lage] >= \'" & dr("lageend") + 1 & "\'",true)
|
-- 作者:weibu -- 发布时间:2020/9/5 10:25:00 -- 标准表达式中数据类型不匹配。老师修改为sqlreplacefor后提示这个。lage是short类型,mid是string,lageend是short; |