Foxtable(狐表)用户栏目专家坐堂 → 遍历顺序是否可自定义


  共有3151人关注过本帖树形打印复制链接

主题:遍历顺序是否可自定义

帅哥哟,离线,有人找我吗?
weibu
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:659 积分:5357 威望:0 精华:0 注册:2018/5/19 22:27:00
遍历顺序是否可自定义  发帖心情 Post By:2020/9/1 11:29:00 [只看该作者]

老师我这边使用for next变量进行批量复制数据。
但复制出来的数据在不排序的情况下跟原数据排列顺序不同。可能是因为我添加原数据是有删除和移动数据位置。
现在我想复制处理的数据复制出来的数据与原数据的顺序相同,该如何操作?
我的想法是遍历原数据是否可用指定遍历的字段,例如我有order列类型为short
如何按照order列的值进行遍历生成新数据?这句代码怎么写?或者是有变通的实现方式

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110592 积分:562856 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:659 积分:5357 威望:0 精华:0 注册:2018/5/19 22:27:00
  发帖心情 Post By: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

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110592 积分:562856 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/9/1 13:57:00 [只看该作者]

这个慢和优化基本没有什么关系的,不需要优化了。慢应该是表事件和表达式列计算引起的,试试

systemready = false
原有代码
systemready = true

 回到顶部
帅哥哟,离线,有人找我吗?
weibu
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:659 积分:5357 威望:0 精华:0 注册:2018/5/19 22:27:00
  发帖心情 Post By: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秒。我这个的逻辑是不是跟帮助不同,所以无法用啊?
狐表帮助文档如下:

出人意料的是,两段代码运行得都非常快,都在瞬间完成了。
那为什么第一段代码需要花费234秒?难道查询和赋值不能出现在同一个遍历语句中吗?
为此我改写了第一段代码,让查询和赋值分开进行,新的代码为:

Dim lst1 As New List(of DataRow)
Dim
lst2 AS New List(of DataRow)
For Each
dr As DataRow In DataTables("表A").DataRows
    If DataTables(
"表A").Find("第二列 = " & dr("第一列")) Is Nothing Then
        lst1
.Add(dr)
    Else

        lst2
.Add(dr)
    End If
Next
For Each
dr As DataRow In lst1
    dr
("第三列") = True
Next
For Each
dr As DataRow In lst2
    dr
("第三列") = False
Next



 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110592 积分:562856 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/9/1 14:24:00 [只看该作者]

停掉表事件,在3楼代码里直接生成新编号赋值即可

您的是直接给新增行赋值,不是在查询结果行里赋值,自己试试就知道了

 回到顶部
帅哥哟,离线,有人找我吗?
weibu
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:659 积分:5357 威望:0 精华:0 注册:2018/5/19 22:27:00
  发帖心情 Post By:2020/9/1 14:30:00 [只看该作者]

嗯,明白了。谢谢老师。老师这个时间长,我想做个进度显示的。否则还以为死机了。咱们狐表能做吗?

或者做一个转圈的状态也行,说明系统没有死机,软件还在运行 。只要让使用者知道软件在运行中也行。
[此贴子已经被作者于2020/9/1 15:15:47编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
weibu
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:659 积分:5357 威望:0 精华:0 注册:2018/5/19 22:27:00
  发帖心情 Post By: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


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110592 积分:562856 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:659 积分:5357 威望:0 精华:0 注册:2018/5/19 22:27:00
  发帖心情 Post By:2020/9/5 10:25:00 [只看该作者]

标准表达式中数据类型不匹配。老师修改为sqlreplacefor后提示这个。lage是short类型,mid是string,lageend是short;

 回到顶部
总数 11 1 2 下一页