Foxtable(狐表)用户栏目专家坐堂 → 跨表引用统计


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

主题:跨表引用统计

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


加好友 发短信
等级:四尾狐 帖子:808 积分:6213 威望:0 精华:0 注册:2014/3/23 23:02:00
跨表引用统计  发帖心情 Post By:2014/12/7 10:12:00 [只看该作者]

各位上午好,有如下需求请求帮忙:

目前我公司每次完成任务后,都会根据任务书格式录入(按任务),结果如下:

图片点击可在新窗口打开查看此主题相关图片如下:任务书.jpg
图片点击可在新窗口打开查看
然后根据录入任务书信息进行(按人员)进行统计,比如第一个任务统计后得出下表:

图片点击可在新窗口打开查看此主题相关图片如下:人员任务统计.jpg
图片点击可在新窗口打开查看
说明:
1. 任务书中左座和右座,总时间和经历时间都计入;
2. 如是观察员,只计入总时间,不计入经历时间;
3. 只有是操纵者,才计入起落次数;

例如在第一个任务中:
1. 黄山是左座,且是操纵者,所以人员任务书中左座和操纵者栏打钩,且是操作者,起落次数计入1,总时间和经历时间都计入;
2. 张力是右座,人员任务统计中右座打钩,总时间和经历时间都计入;
3. 苏峰是观察员,人员任务统计中观察员栏打钩,只计入总时间,不计入经历时间;

请教专家,如果通过编码来实现根据“任务书”录入信息自动生成“人员任务统计表”内容,谢谢!
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:跨表引用.foxdb



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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/12/7 11:20:00 [只看该作者]

Dim dt As DataTable = DataTables("人员任务统计")
dt.DataRows.Clear
Dim cs() As String = {"左座", "右座", "操纵者", "观察员1"}
For Each dr As DataRow In DataTables("任务书").Select("", "飞行日期")
    Dim ndr As DataRow
    For Each c As String In cs
        If dr.IsNull(c) = False Then
            If c = "操纵者" Then
                ndr = dt.Find("姓名 = '" & dr(c) & "'", "_Identify desc")
            Else
                ndr = dt.AddNew
            End If
            ndr("日期") = dr("飞行日期")
            ndr("机型") = dr("机型")
            ndr("姓名") = dr(c)
            ndr(c) = True
            If c = "操纵者" Then
                ndr("起落架次") = dt.Compute("sum(起落架次)", "姓名 = '" & dr(c) & "'") + dr("起落架次")
            Else
                ndr("总时间") = dt.Compute("sum(总时间)", "姓名 = '" & dr(c) & "'") + dr("总时间")
                ndr("经历时间") = dt.Compute("sum(经历时间)", "姓名 = '" & dr(c) & "'") + dr("经历时间")
               
            End If
        End If
    Next
Next

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


加好友 发短信
等级:四尾狐 帖子:808 积分:6213 威望:0 精华:0 注册:2014/3/23 23:02:00
  发帖心情 Post By:2014/12/7 13:18:00 [只看该作者]

谢谢甜老师,真给力,一定好好学习。
能否稍微调整一下代码:
1. “如果观察员1,只计入总时间,不计入经历时间;”
2. 另外,我看到代码有“dt.DataRows.Clear“,这是每次执行时,先要清空所有内容吗?如果任务较多,会不会很耗费资源?能否只统计新录入的任务。谢谢指点。

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/12/7 14:10:00 [只看该作者]

Dim dt As DataTable = DataTables("人员任务统计")
dt.DataRows.Clear
Dim cs() As String = {"左座", "右座", "操纵者", "观察员1"}
For Each dr As DataRow In DataTables("任务书").Select("", "飞行日期")
    Dim ndr As DataRow
    For Each c As String In cs
        If dr.IsNull(c) = False Then
            If c = "操纵者" Then
                ndr = dt.Find("姓名 = '" & dr(c) & "'", "_Identify desc")
            Else
                ndr = dt.AddNew
            End If
            ndr("日期") = dr("飞行日期")
            ndr("机型") = dr("机型")
            ndr("姓名") = dr(c)
            ndr(c) = True
            If c = "操纵者" Then
                ndr("起落架次") = dt.Compute("sum(起落架次)", "姓名 = '" & dr(c) & "'") + dr("起落架次")
            Else If c = "观察员1" Then
                ndr("总时间") = dt.Compute("sum(总时间)", "姓名 = '" & dr(c) & "'") + dr("总时间")
            Else
                ndr("总时间") = dt.Compute("sum(总时间)", "姓名 = '" & dr(c) & "'") + dr("总时间")
                ndr("经历时间") = dt.Compute("sum(经历时间)", "姓名 = '" & dr(c) & "'") + dr("经历时间")
            End If
        End If
    Next
Next 

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/12/7 14:13:00 [只看该作者]

 一次性统计比较好,不然你这种很可能造成重复统计。

 

 或者你可以加入一列,计算列,勾选的话,就计算当前行。


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


加好友 发短信
等级:四尾狐 帖子:808 积分:6213 威望:0 精华:0 注册:2014/3/23 23:02:00
  发帖心情 Post By:2014/12/7 22:31:00 [只看该作者]

谢谢建议,我会认真采纳。

在大量导入处理时,出现一些问题,列举一些,麻烦看看:
1. 在第2个任务的两人的总时间和经历时间都是04:45,而统计出来黄山、张力的时间都是09:45,多了5小时;
2. 在第3个任务中两人的总时间和经历时间都应该是04:40,而统计出来苏锋的总时间是09:45;
3. 示例中虽未出现,但我测试大量统计中还出现起落架次多次累加。

水平有限,代码不太明白,看到使用了“Compute("sum”,个人感觉“人员任务统计”表中只是引用“任务书”中的时间,不需要进行累加,可能我表述需求不太明白。
谢谢专家!
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:跨表引用1.foxdb



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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/12/7 22:33:00 [只看该作者]

Dim dt As DataTable = DataTables("人员任务统计")
dt.DataRows.Clear
Dim cs() As String = {"左座", "右座", "操纵者", "观察员1"}
For Each dr As DataRow In DataTables("任务书").Select("", "飞行日期")
    Dim ndr As DataRow
    For Each c As String In cs
        If dr.IsNull(c) = False Then
            If c = "操纵者" Then
                ndr = dt.Find("姓名 = '" & dr(c) & "'", "_Identify desc")
            Else
                ndr = dt.AddNew
            End If
            ndr("日期") = dr("飞行日期")
            ndr("机型") = dr("机型")
            ndr("姓名") = dr(c)
            ndr(c) = True

            ndr("总时间") = dr("总时间")
            If c = "操纵者" Then
                ndr("起落架次") = dt.Compute("sum(起落架次)", "姓名 = '" & dr(c) & "'") + dr("起落架次")
            Else If c = "观察员1" Then
                
            Else
                ndr("经历时间") = dt.Compute("sum(经历时间)", "姓名 = '" & dr(c) & "'") + dr("经历时间")
            End If
        End If
    Next
Next 


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


加好友 发短信
等级:四尾狐 帖子:808 积分:6213 威望:0 精华:0 注册:2014/3/23 23:02:00
  发帖心情 Post By:2014/12/7 23:05:00 [只看该作者]

谢谢回复。
还有点问题,列举一些,麻烦看看:
1. 在第2个任务的两人的总时间和经历时间都是04:45,而统计出来黄山、张力的总时间准确,但经历时间还是09:45,多了5小时;
2. 测试大量统计中还出现多次累加。

麻烦老师了。

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2014/12/7 23:21:00 [只看该作者]

 哦,不用累加

 

Dim dt As DataTable = DataTables("人员任务统计")
dt.DataRows.Clear
Dim cs() As String = {"左座", "右座", "操纵者", "观察员1"}
For Each dr As DataRow In DataTables("任务书").Select("", "飞行日期")
    Dim ndr As DataRow
    For Each c As String In cs
        If dr.IsNull(c) = False Then
            If c = "操纵者" Then
                ndr = dt.Find("姓名 = '" & dr(c) & "'", "_Identify desc")
            Else
                ndr = dt.AddNew
            End If
            ndr("日期") = dr("飞行日期")
            ndr("机型") = dr("机型")
            ndr("姓名") = dr(c)
            ndr(c) = True

            ndr("总时间") = dr("总时间")

            ndr("经历时间") = dr("经历时间")
            If c = "操纵者" Then
                ndr("起落架次") = dt.Compute("sum(起落架次)", "姓名 = '" & dr(c) & "'") + dr("起落架次")
            End If
        End If
    Next
Next 

[此贴子已经被作者于2014-12-7 23:21:30编辑过]

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


加好友 发短信
等级:四尾狐 帖子:808 积分:6213 威望:0 精华:0 注册:2014/3/23 23:02:00
  发帖心情 Post By:2015/1/11 15:41:00 [只看该作者]

谢谢专家代码,学习过程中对以下代码理解有困难,麻烦解释其意思、作用和目的,谢谢
If c = "操纵者" Then
                ndr = dt.Find("姓名 = '" & dr(c) & "'", "_Identify desc")



 回到顶部
总数 26 1 2 3 下一页