以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]使用merge功能的问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=129700)

--  作者:81538475
--  发布时间:2019/1/4 9:35:00
--  [求助]使用merge功能的问题
merge  excel表格的时候,数据量很大,想用下面链接方式做一个等待提示框。测试了半天也实现不了。
http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=73365&skin=0

内部函数是现在是这样的。

    Dim mg As New Merger
    Dim p As String 
    Dim dlg As New OpenFileDialog
    dlg.Filter = "Excel文件|*.xls;*.xlsx"
    If dlg.ShowDialog =DialogResult.OK Then
        DataTables("考勤表").DeleteFor("")
        p = dlg.FileName

        Dim Book As New XLS.Book(p)
        mg.SourcePath = p
        mg.Format = "excel" \'指定格式
        mg.SourceTableName = book.sheets(0).name  & "$" \'指定要合并的表
        mg.DataTableName = "考勤表" \'指定接收数据的表
        mg.Merge() \'开始
        vars("考勤表")= True
        
        
    Else Return Nothing
   End If
    
我是把代码切分程2段,分别放在内部函数和窗口按钮中。但是回报错。

[此贴子已经被作者于2019/1/4 9:41:45编辑过]

--  作者:有点甜
--  发布时间:2019/1/4 9:39:00
--  

下面这段,写一个异步函数处理

 

        DataTables("考勤表").DeleteFor("")

        p = dlg.FileName
        Dim Book As New XLS.Book(p)
        mg.SourcePath = p
        mg.Format = "excel" \'指定格式
        mg.SourceTableName = book.sheets(0).name  & "$" \'指定要合并的表
        mg.DataTableName = "考勤表" \'指定接收数据的表
        mg.Merge() \'开始
        vars("考勤表")= True
 
 

--  作者:81538475
--  发布时间:2019/1/4 11:13:00
--  
测试单个导入表没有问题了。现在还要执行后面的代码就出问题了。
.NET Framework 版本:2.0.50727.8936
Foxtable 版本:2018.10.9.1
错误所在事件:自定义函数加载考勤
详细错误信息:
调用的目标发生了异常。
在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级。

按钮代码是
Dim dtb As New DataTableBuilder("考勤表")
dtb.AddDef("考勤号码", Gettype(String), 20)
dtb.AddDef("姓名", Gettype(String), 20)
dtb.AddDef("日期", Gettype(String), 20)
dtb.AddDef("签到时间", Gettype(String), 20)
dtb.AddDef("签退时间", Gettype(String), 20)
dtb.AddDef("迟到时间", Gettype(String), 20)
dtb.AddDef("实到", Gettype(String), 20)
dtb.AddDef("是否旷工", Gettype(String), 20)
dtb.AddDef("例外情况", Gettype(String), 20)
dtb.AddDef("补助", Gettype(String), 20)
dtb.AddDef("加班", Gettype(String), 20)

dtb.Build()
dlg.Filter = "Excel文件|*.xls;*.xlsx"
If dlg.ShowDialog =DialogResult.OK Then
    
    SetWaitFrm.ShowWaitFrm("加载中,请稍后","加载考勤")
End If

内部函数为:
Dim mg As New Merger
DataTables("考勤表").DeleteFor("")
pth = dlg.FileName
Dim Book As New XLS.Book(pth)
mg.SourcePath = pth
mg.Format = "excel" \'指定格式
mg.SourceTableName = book.sheets(0).name  & "$" \'指定要合并的表
mg.DataTableName = "考勤表" \'指定接收数据的表
mg.Merge() \'开始
vars("考勤表")= True

Tables("test_Table2").DataSource = DataTables("考勤表")
For Each r As Row In Tables("考勤表").rows
    Dim i = R.index
    If (r("签退时间") >= "22:00" Or (r("签退时间") >= "00:00" And r("签退时间") <= "04:00")) And Tables("考勤表").rows(i+1)("迟到时间") <  "00:30"   Then
        Tables("考勤表").rows(i+1)("迟到时间") = Nothing
    End If
    If r("实到") = "1" Then
        r("实到") = Nothing
    Else If  r("实到") = "0" Then
        
        r("实到") = "1"
    End If
Next

With DataTables("考勤表")
    .DataCols.Add("迟到扣款",Gettype(Integer), "IIF(迟到时间> \'00:15\'and 迟到时间<= \'00:30\', 20 ,IIF(迟到时间> \'00:30\'and 迟到时间<= \'00:60\', 50 ,0))" )
    
End With

DataTables("考勤表").datacols.Add("旷工扣款", Gettype(Double))

For Each r2 As DataRow In DataTables("考勤表").DataRows
    If r2("是否旷工")= "True" Then
        Dim fr2 As DataRow = DataTables("人员信息表").sqlFind("姓名 = \'" & r2("姓名") & "\' ")
        If fr2 IsNot Nothing Then
            r2("旷工扣款") = fr2("实发工资")/22/2
        End If
    End If
Next


Dim g As New GroupTableBuilder("统计表1", DataTables("考勤表"))
g.Groups.AddDef("姓名")
g.Totals.AddDef("迟到扣款")
g.Totals.AddDef("旷工扣款")
g.Totals.AddDef("迟到时间", AggregateEnum.Count,"迟到次数")
g.Totals.AddDef("实到","请假天数")
g.Totals.AddDef("是否旷工", AggregateEnum.Count,"旷工次数")
g.Totals.AddDef("补助", AggregateEnum.Count,"补助次数")
g.Totals.AddDef("加班", AggregateEnum.Count,"加班次数")
g.Build()
With DataTables("统计表1")
    .DataCols.Add("加班费",Gettype(Double))
    .DataCols.Add("全勤奖",Gettype(Double),"IIF(迟到次数 = \'0\' and 请假天数= \'0\' and 旷工次数 = \'0\',300 ,0 )" )
    .DataCols.Add("总扣款",Gettype(Double), "迟到扣款 + 旷工扣款" )
    
End With
Dim nl As new List(of DataRow)
For Each tr As DataRow In DataTables("统计表1").DataRows
    
    \'---------------------加班计算
    Dim fdj As DataRow = DataTables("人员信息表").SQLFind("姓名 = \'"& tr("姓名") & "\'")
    If fdj IsNot Nothing Then
        If fdj("状态") = "实习" OrElse fdj("状态") = "培训" Then
            tr("加班费") = tr("加班次数") * 150 + tr("补助次数") * 50
        Else If fdj("状态") = "正式" OrElse fdj("状态") = "试用" Then
            
            tr("加班费") = tr("加班次数") * 200 + tr("补助次数") * 50
            
        End If
        
    End If
    \'------------------迟到计算
    If tr("迟到次数") < 3 Then
        
        Dim drs As List(Of DataRow)
        drs = DataTables("考勤表").Select("迟到时间 <>\'\'and 姓名 = \'"& tr("姓名") & "\'")
        
        
        If drs IsNot Nothing Then
            For Each kqr As DataRow In drs
                
                If kqr("迟到时间") >"00:60" Then
                    
                    nl.Add(kqr)
                End If
            Next
            If nl.Count = 0 Then
                tr("迟到扣款") = 0
            End If
        End If
    End If
Next
Tables("test_Table1").DataSource = DataTables("统计表1")

--  作者:有点甜
--  发布时间:2019/1/4 11:18:00
--  

用异步函数、同步函数

 

http://www.foxtable.com/mobilehelp/scr/3273.htm

 

http://www.foxtable.com/mobilehelp/scr/3270.htm

 

不会做上传具体实例测试


--  作者:81538475
--  发布时间:2019/1/4 11:57:00
--  
麻烦帮忙看看
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目1.zip


[此贴子已经被作者于2019/1/4 11:57:28编辑过]

--  作者:有点甜
--  发布时间:2019/1/4 12:12:00
--  

改成

 

Public Sub SetWaitFrmFun(ByVal obj As Object)
        If obj Is Nothing AndAlso obj.Tostring = ""then
            SetWaitFrm.Close()
        End If
        Functions.BeginSyncExecute(obj.Tostring)
        SetWaitFrm.Close()
End Sub


--  作者:81538475
--  发布时间:2019/1/4 14:39:00
--  
好了多谢了。如何让图片下面的字能够跟图片同时出现呢,现在是加载图片出现之后,过了一会字才会显示。
[此贴子已经被作者于2019/1/4 14:44:45编辑过]

--  作者:有点甜
--  发布时间:2019/1/4 15:13:00
--  
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目1.rar