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


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

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

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


加好友 发短信
等级:童狐 帖子:298 积分:2192 威望:0 精华:0 注册:2023/1/11 7:15:00
定时任务总是出现问题  发帖心情 Post By:2023/8/16 10:27:00 [显示全部帖子]

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

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

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


加好友 发短信
等级:童狐 帖子:298 积分:2192 威望: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
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:298 积分:2192 威望:0 精华:0 注册:2023/1/11 7:15:00
  发帖心情 Post By:2023/8/16 11:55:00 [显示全部帖子]

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

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


加好友 发短信
等级:童狐 帖子:298 积分:2192 威望:0 精华:0 注册:2023/1/11 7:15:00
  发帖心情 Post By:2023/8/16 12:31:00 [显示全部帖子]

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

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


加好友 发短信
等级:童狐 帖子:298 积分:2192 威望: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 指令;
图片点击可在新窗口打开查看

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


加好友 发短信
等级:童狐 帖子:298 积分:2192 威望: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我是个小白,希望没有太多打扰到您!
谢谢!

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


加好友 发短信
等级:童狐 帖子:298 积分:2192 威望:0 精华:0 注册:2023/1/11 7:15:00
  发帖心情 Post By:2023/8/16 18:09:00 [显示全部帖子]

1 第1条待会儿我再测试一下,这个我只是抄作业,没有太明白
2 Wb.close,有一个问题是,因为我那个Excel必须要交换数据,因此导致关闭该文件时出现提示框“保存、不保存、取消”的对话框,有没有指令可以在后面 形成如VBA类的wookbooks(ff).close False 这样不存盘无提示退出?
3 看板数据总数2W行左右,我没有描述清楚,实际上没有这么多数据被写入,只有发生改变或新增时有才写入表单,但读取Excel数据时Excel文件中有2W行左右。

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


加好友 发短信
等级:童狐 帖子:298 积分:2192 威望:0 精华:0 注册:2023/1/11 7:15:00
  发帖心情 Post By:2023/8/16 18:30:00 [显示全部帖子]

有点蓝老师,
我又找范例看了一下,此前有个分支叫Finally, 我看着不知道什么意思,然后在帮助文档中又没有找到这个说明,所以我就把它删除了,想澄清一下是否是这个意思:
必须要执行的如关闭Wb.close, App.quit 可以直接放到 Finally 分支下,而无需再一项项的放到Try,Catch 下?
图片点击可在新窗口打开查看

 回到顶部