以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  定时任务总是出现问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=187838)

--  作者:creastzh
--  发布时间:2023/8/16 10:27:00
--  定时任务总是出现问题
时任务一旦执行总是出现问题:
1 ,系统资源超出, 如果将该代码拷贝到独立命令窗口运行则又运行正常
图片点击可在新窗口打开查看
2 系统资源不足

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

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

--  作者:creastzh
--  发布时间: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
--  发布时间:2023/8/16 11:55:00
--  
这是运行过程中又一个莫名其妙的错误
图片点击可在新窗口打开查看
[此贴子已经被作者于2023/8/16 12:30:30编辑过]

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

--  作者:有点蓝
--  发布时间:2023/8/16 13:37:00
--  
导入的数据有多少行?

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

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

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

--  作者:有点蓝
--  发布时间: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
--  发布时间: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我是个小白,希望没有太多打扰到您!
谢谢!

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