以文本方式查看主题 - 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 -- 导入的数据有多少行? 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,内存都爆了。可以加条件把已经过期不需要看的数据清掉
|