Foxtable(狐表)用户栏目专家坐堂 → 定时任务总是出现问题


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

主题:定时任务总是出现问题

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


加好友 发短信
等级:小狐 帖子:312 积分:2299 威望:0 精华:0 注册:2023/1/11 7:15:00
定时任务总是出现问题  发帖心情 Post By:2023/8/16 10:27:00 [只看该作者]

时任务一旦执行总是出现问题:
1 ,系统资源超出, 如果将该代码拷贝到独立命令窗口运行则又运行正常
图片点击可在新窗口打开查看
2 系统资源不足

 此问题困扰我太久了,我在论坛也没有找到相关的有效处理方案,请大师给与帮助!谢谢!
[此贴子已经被作者于2023/8/16 10:28:18编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111401 积分:567075 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/8/16 10:33:00 [只看该作者]

定时任务代码都发上来看看
[此贴子已经被作者于2023/8/16 10:32:59编辑过]

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


加好友 发短信
等级:小狐 帖子:312 积分:2299 威望:0 精华:0 注册:2023/1/11 7:15:00
  发帖心情 Post By:2023/8/16 11:55:00 [只看该作者]

其中有一任务为Import_Schedule表通过与Excel的Schedule进行定时(10分钟)读入后写入工序看板中
'V20230806 导入Schedule- 看板数据
If User.Type = UserTypeEnum.Developer Then
    Dim App As New MSExcel.Application
    App.DisplayAlerts = False
    App.visible = True
    
    Dim TableN As String = "Schedule"
    If DataTables.Contains(TableN) = False Then
        DataTables.Load(TableN)
    End If 
    'DataTables(TableN).DeleteFor("") '删除表内所有数据
    
    Dim fp As String = "P:\General documents\Worktime Data\Fox Data\Query\"
    Dim ff = "INI Schedule Data.xlsx"
    Dim fpf As String = fp & ff
    DataTables(TableN).StopRedraw '停止屏幕刷新
    If filesys.FileExists(fpf) Then 
        Dim inf As New FileInfo(fpf)
        Dim idate1 As Date = inf.LastWriteTime
        idate1 = Date.Now
        If DataTables.Contains("Data") = False Then
            DataTables.Load("Data")
        End If 
        Dim dt1 As DataTable = DataTables("Data") 
        Dim dr1 As DataRow = DataTables("Data").Find("文件更新_文件名 = '" & ff & "'")
        If dr1 Is Nothing Then
            Dim dr1a As DataRow = DataTables("Data").AddNew
            dr1a("文件更新_文件名") = ff
            dr1a("文件更新_时间") = idate1
        Else
            dr1("文件更新_时间") = idate1
        End If 
                
        Dim cn As String '列名称
        Dim i As Integer
        
        'SystemReady = False '停止所有其它程序
        Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open(fpf)
        Wb.RefreshAll
        Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(1)
        Dim Rg As MSExcel.Range = Ws.UsedRange 
        Dim ary = Rg.value
        Dim cs As Integer = Rg.Columns.Count
        cs = 30 
        Try 
            Dim Filter As String
            For i = 2 To Rg.Rows.Count
                If ary(i, 1) > "" Then '来源存在
                    If ary(i, 1) > "" AndAlso ary(i, 13) IsNot Nothing Then 'WO,Op均存在的情形下
                        Filter = "[WO] = '" & ary(i, 1) & "' and [C_Op]= " & ary(i, 13) '根据需要修改'                 
                        
                        Dim dr As DataRow = DataTables(TableN).Find(Filter)
                        If dr Is Nothing Then '新增数据行                        
                            Dim ro As Row = Tables(TableN).AddNew
                            For c As Integer = 1 To cs 'Tables(TableN).Cols.Count - 1
                                cn = ary(1, c) '列名                            
                                ro(cn) = ary(i, c)
                            Next 
                        Else '已经存在的数据行,须判断是否有修改,简化操作改为直接重写' '                        
                            If dr("Pre_Cmpt") <> ary(i, 9) OrElse dr("Plan_StartTime") <> ary(i, 24) OrElse dr("Plan_Endtime") <> ary(i, 25) Then
                                For c As Integer = 1 To cs 'Tables(TableN).Cols.Count - 1
                                    cn = ary(1, c) '列名
                                    dr(cn) = ary(i, c) 
                                Next
                            End If
                        End If
                    End If
                    
                End If
            Next
            DataTables(TableN).Save
            Forms("CellKanban").Controls("Label_Time").Text = "最后更新:" & Format(Date.Now, "G")
            'MessageBox.Show("导入成功!", "恭喜!")
        Catch ex As exception
            msgbox(ex.message)
            MessageBox.Show("出现问题的行:" & i & ",对应的列名为:" & cn)
            MessageBox.Show("导入失败!", "恭喜!") 
        End Try
        app.quit
    End If
    1:
    DataTables(TableN).ResumeRedraw '恢复屏幕刷新
    'MainTable = Tables(TableN)
    Tables(TableN).Sort = "WO,C_Op"
    
    SystemReady = True
End If


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


加好友 发短信
等级:小狐 帖子:312 积分:2299 威望:0 精华:0 注册:2023/1/11 7:15:00
  发帖心情 Post By:2023/8/16 11:55:00 [只看该作者]

这是运行过程中又一个莫名其妙的错误
图片点击可在新窗口打开查看
[此贴子已经被作者于2023/8/16 12:30:30编辑过]

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


加好友 发短信
等级:小狐 帖子:312 积分:2299 威望:0 精华:0 注册:2023/1/11 7:15:00
  发帖心情 Post By:2023/8/16 12:31:00 [只看该作者]

这个是我的应用中的定时任务列表:
图片点击可在新窗口打开查看
[此贴子已经被作者于2023/8/16 12:31:56编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111401 积分:567075 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/8/16 13:37:00 [只看该作者]

导入的数据有多少行?

感觉没有什么特别需要使用vba进行处理的数据,建议使用XLS.Book,内存、资源占用比使用vba少。

4楼提示的错误是索引超界,比如【ary(i, 13)、cs = 30】如果execl文档没有超过13个列,30个列就会出错

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


加好友 发短信
等级:小狐 帖子:312 积分:2299 威望:0 精华:0 注册:2023/1/11 7:15:00
  发帖心情 Post By:2023/8/16 14:09:00 [只看该作者]

1 导入的数据行从15000~25000行左右;
2 目前引用的这个Excel文件使用了Xlsx格式,这是考虑方便通过PowerQuery进行数据清洗转化而来的数据,目前确实有30列数据,而且我还需要进行一次 Query 数据刷新(与另外的1个xlsm格式的文件进行同步),所以我加了1句Wb.RefreshAll 指令;
图片点击可在新窗口打开查看

 回到顶部
帅哥,在线噢!
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


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

试试
1、如果同步数据不需要显示文档,去掉App.visible = True
2、关闭并正确退出文档
……
            DataTables(TableN).Save
            Forms("CellKanban").Controls("Label_Time").Text = "最后更新:" & Format(Date.Now, "G")
            'MessageBox.Show("导入成功!", "恭喜!")
Wb.close
        app.quit
        Catch ex As exception
        app.quit
            msgbox(ex.message)
            MessageBox.Show("出现问题的行:" & i & ",对应的列名为:" & cn)
            MessageBox.Show("导入失败!", "恭喜!") 
        End Try
    End If
3、保存后把表格数据清空
DataTables(TableN).save
DataTables(TableN).loadfilter = "1=2"
DataTables(TableN).load

-----------------
如果还不行,考虑Wb.RefreshAll之后把文档另存为没有格式的文档,然后使用XLS.Book读取

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


加好友 发短信
等级:小狐 帖子:312 积分:2299 威望:0 精华:0 注册:2023/1/11 7:15:00
  发帖心情 Post By:2023/8/16 16:28:00 [只看该作者]

老师,

您的意见:
1、如果同步数据不需要显示文档,去掉App.visible = True  这个是因为Excel出现异常无法关闭,在下次运行时又以只读方式打开,所以我打开,以便需要时上工关闭;
2、关闭并正确退出文档
……
            DataTables(TableN).Save
            Forms("CellKanban").Controls("Label_Time").Text = "最后更新:" & Format(Date.Now, "G")
            'MessageBox.Show("导入成功!", "恭喜!")
Wb.close
        app.quit 由于我导入的Excel数据需要通过Refreshall (Query)刷新来自另一文件的数据,因此我在上方还增加了一段指令 app.displayalerts=fasle, 这样我就可以直接退出而无需存盘,但读入的数据是经刷新后的最新数据。
        Catch ex As exception
        app.quit
            msgbox(ex.message)
            MessageBox.Show("出现问题的行:" & i & ",对应的列名为:" & cn)
            MessageBox.Show("导入失败!", "恭喜!") 
        End Try
    End If
3、保存后把表格数据清空
DataTables(TableN).save
DataTables(TableN).loadfilter = "1=2" 这段指令的意义我没有明白,因为 Loadfilter 条件为false时,即不加载如何数据,但我的看板又需要加载这些数据,所以关闭后我又需要再次加载。
DataTables(TableN).load

-----------------
如果还不行,考虑Wb.RefreshAll之后把文档另存为没有格式的文档,然后使用XLS.Book读取
这里另存为没有格式的文档是指Excel默认格式吗,如果这样的话日期格式可能有误,此外零件号如果是纯数字的话也有问题。

或则是否有如释放内存操作的指令吗?

Foxtable我是个小白,希望没有太多打扰到您!
谢谢!

 回到顶部
帅哥,在线噢!
有点蓝
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:111401 积分:567075 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2023/8/16 16:43:00 [只看该作者]

1、在第2点的catch里调用app.quit,就算是异常肯定可以指定关闭的,之前关闭不了是因为没有把app.quit放到catch里。
2、要想正常退出,必须像我这样用。Wb.close就是用来释放内存的
3、看板需要的数据也是有限的吧,不然每10分钟就导入2W行数据,1H就是18W,一天就是18*24W,内存都爆了。可以加条件把已经过期不需要看的数据清掉

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