Foxtable(狐表)用户栏目专家坐堂 → 自定义函数运行错误


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

主题:自定义函数运行错误

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


加好友 发短信
等级:童狐 帖子:297 积分:2187 威望:0 精华:0 注册:2023/1/11 7:15:00
自定义函数运行错误  发帖心情 Post By:2023/9/19 5:19:00 [只看该作者]

.NET Framework 版本:4.0.30319.42000
Foxtable 版本:2022.8.18.1
错误所在事件:自定义函数,Import_WorkOrderStatus
详细错误信息:
Exception has been thrown by the target of an invocation.
Insufficient memory to continue the execution of the program.

通过定时任务调用内部函数运行或者在命令窗口通过执行函数时均出现上述错误提示
图片点击可在新窗口打开查看
但将指令直接拷贝到命令窗口运行时又是正常的,但有时又出现如下信息:

---------------------------
版本:2022.8.18.1
---------------------------
代码执行出错,错误信息:



System.OutOfMemoryException: Insufficient memory to continue the execution of the program.

   at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)

   at Microsoft.Office.Interop.Excel.Range.get_Value(Object RangeValueDataType)

   at UserCode.Test()
---------------------------
OK   
---------------------------

我的程序指令如下,通过设置断点确认,出现问题的指令行是:Dim ary = Rg.value,

'Import_WorkOrderStatus 20230911
'文件路径P: \ General documents \ Worktime Data \ Fox Data \ Query \ Work Order Status.xlsx,真正的源数据为 Work Order Status.xlsm

Dim idate1 As Date = Date.Now
Dim t As Integer
Dim gx As Boolean = False

Dim App As New MSExcel.Application
App.DisplayAlerts = False
App.visible = True

Dim TableN As String = "WorkOrderStatus" 
If DataTables.Contains(TableN) = False Then
    DataTables.Load(TableN)
End If
If DataTables.Contains("Data") = False Then
    DataTables.Load("Data")
End If
Tables(TableN).StopRedraw
'DataTables(TableN).DeleteFor("") '删除表内所有数据

Dim fp As String = "P:\General documents\Worktime Data\Fox Data\Query\"
Dim ff = "Work Order Status.xlsx" 
Dim fpf As String = fp & ff
If Not filesys.FileExists(fpf) Then Return Nothing
Dim inf As New FileInfo(fpf)
'Dim idate1 As Date = inf.LastWriteTime

Dim cn As String '列名称
Dim i As Integer

Dim Wb As MSExcel.WorkBook = App.WorkBooks.Open(fpf)
Wb.RefreshAll
MessageBox.Show(1)
Dim Ws As MSExcel.WorkSheet = Wb.WorkSheets(1)
MessageBox.Show(1.1)
Dim Rg As MSExcel.Range = Ws.UsedRange
MessageBox.Show(1.2)
Dim ary = Rg.value
MessageBox.Show(1.3)
Dim cs As Integer = Rg.Columns.Count
output.Show(rg.Rows.Count & "R|C:" & cs)
cs = 26
MessageBox.Show(2)
Dim dic1 As New Dictionary(Of String, DataRow) '存储原始时间(WOStatus),wop==>Row
Dim dic2 As New Dictionary(Of DataRow, Integer) 'Row==>iRw#
Dim wop As String
For Each dr As DataRow In DataTables("WorkOrderStatus").DataRows
    wop = dr("WO") & "|" & dr("op")
    If Not dic1.ContainsKey(wop) Then
        dic1.Add(wop, dr)
    End If 
Next
MessageBox.Show(3)
For i = 2 To rg.Rows.Count
    If ary(i, 2) > "" AndAlso ary(i, 19) > 0 Then 
        wop = ary(i, 2) & "|" & ary(I, 19)
        If dic1.ContainsKey(wop) Then
            Dim dr1a As DataRow
            dr1a = dic1(wop)
            If ary(i, 13) <> dr1a("GoodQty") OrElse ary(i, 15) <> dr1a("BadQty") Then
                dic2.Add(dr1a, i) '现有表中存在发生扫描出数量改变时,需要重新写入数据行信息
            End If
        Else '现有表中不存在数据行,须新增数据行
            Dim dr1n As DataRow = DataTables("WorkOrderStatus").AddNew
            dic2.add(dr1n, i)
        End If 
    End If 
Next
MessageBox.Show(4)
t = dic2.Count
If t = 0 Then 
    ' Return Nothing 
    gx = True '
    Output.Show("无新增/修订数据行")
Else
    Dim i1 As Integer = 0
    Output.Show(t & "行数据更新")
    gx = True 
    For Each dr2 As DataRow In dic2.Keys
        'i1 = i1 + 1
        i = dic2(dr2)
        For c As Integer = 1 To cs 
            cn = ary(1, c) '列名
            'Output.Show(i1 & ":" & i & "," & cn & ": " & ary(i, c))
            dr2(cn) = ary(i, c)
        Next
    Next 
    DataTables(TableN).Save 
    Tables(TableN).Sort = "WO,OP"
    gx = True 
End if 

App.quit
App.displayalerts = True


Dim dr1 As DataRow = DataTables("Data").Find("文件更新_文件名 = '" & ff & "'")
dr1("文件更新_时间") = Date.Now
If gx = True Then 
    dr1("UpdatinTip") = "成功"
Else
    dr1("UpdatinTip") = "更新失败"
End If
dr1.Save
Tables("Data").Sort = "文件更新_时间 Desc"

Tables(TableN).ResumeRedraw
Dim s2 As Date = Date.Now
Dim s3 As TimeSpan = s2 - idate1
Output.Show(idate1 & "-----" & s2 & ",程序Import_WorkOrderStatus经历时间" & s3.TotalSeconds)

恳请帮助解决,谢谢!


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


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

错误提示是内存溢出,应该是文档数据太多。

1、分割文档后在导入,比如几万行数据一个文档
2、如果不想分割,考虑使用第三方组件处理,比如:http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=100317&replyID=&skin=1

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


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

老师,我正在尝试使用您提供的这个OpenXml方式进行数据导入, 不知道怎么情况,导入完成后出现如下空白页面, 但数据是实际存在的,我需要关闭项目后重新打开才能看到完整的数据.请问如何处理? 谢谢!

图片点击可在新窗口打开查看

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


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

正常,这个例子是直接把数据导入后台数据库的。前台不会显示数据,要显示,自己添加代码加载数据即可

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


加好友 发短信
等级:童狐 帖子:297 积分:2187 威望:0 精华:0 注册:2023/1/11 7:15:00
  发帖心情 Post By:2023/9/23 10:00:00 [只看该作者]

重新加载表后能看到了,但有一个问题,这个数据实际上没有增加, 我将源数据删除了绝大部分仅保留20行, 通过执行指令, 没有出现行新增,源数据有25000左右,是不是我的操作有什么问题?
图片点击可在新窗口打开查看
运行时间倒就3秒钟左右.
[此贴子已经被作者于2023/9/23 10:01:01编辑过]

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


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

先仔细过一遍这个组件的用法。

其次检查列名是否符合格式:http://www.foxtable.com/webhelp/topics/2280.htm,标题行只能有一行

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


加好友 发短信
等级:童狐 帖子:297 积分:2187 威望:0 精华:0 注册:2023/1/11 7:15:00
  发帖心情 Post By:2023/9/23 10:20:00 [只看该作者]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:生产辅助.part3.rar

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:生产辅助.part2.rar

我的Excel格式没有错误, 您能否帮看一下,谢谢!
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:生产辅助.part1.rar


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


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

2个原因:

1、需要指定导入的sheet名称,比如

_execl.ReadToDataTable(DataTables("WorkOrderStatus").Basetable, "List" , , 0 , 2000)

2、日期列的问题,这个组件是严格按照单元格的类型提取数据的。把execl里所有日期列的格式设置为日期格式

图片点击可在新窗口打开查看此主题相关图片如下:1.png
图片点击可在新窗口打开查看


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


加好友 发短信
等级:童狐 帖子:297 积分:2187 威望:0 精华:0 注册:2023/1/11 7:15:00
  发帖心情 Post By:2023/9/23 15:54:00 [只看该作者]

我按照要求全部重新确认了格式, 写入内部函数:
Dim _execl As New ExOpenXml.ExOXExecl()
_execl.Open("P:\General documents\Worktime Data\Fox Data\Query\Work Order Status.xlsx", True)
_execl.ReadToDataTable(DataTables("List").BaseTable, "List" , , 0 , 30000)
_execl.Dispose()


还是没有通过测试,系统报错:
.NET Framework 版本:4.0.30319.42000
Foxtable 版本:2022.8.18.1
错误所在事件:自定义函数,ImportLargeDataFromExecl
详细错误信息:
Exception has been thrown by the target of an invocation.
Conversion from type 'Decimal' to type 'Date' is not valid.

问题是Decimal格式数据没有被制定为日期格式的列, 实在是查不出问题所在.
[此贴子已经被作者于2023/9/23 16:05:40编辑过]

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


加好友 发短信
等级:童狐 帖子:297 积分:2187 威望:0 精华:0 注册:2023/1/11 7:15:00
  发帖心情 Post By:2023/9/23 16:07:00 [只看该作者]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:生产辅助.rar


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