Foxtable(狐表)用户栏目专家坐堂 → 跨表计算问题


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

主题:跨表计算问题

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


加好友 发短信
等级:六尾狐 帖子:1307 积分:8905 威望:0 精华:0 注册:2019/6/13 9:57:00
跨表计算问题  发帖心情 Post By:2020/4/30 13:40:00 [显示全部帖子]

表A
类别           时间一     时间二     时间三    时间四          超时分钟
类别1         08:30    10:05   11:00   12:20        =(dr("时间一") - dr(表B.类别(“类别1”).("时间一"))+(dr("时间二") - dr(表B.类别(“类别1”).("时间二"))+(dr("时间三") - dr(表B.类别(“类别1”).("时间三"))+(dr("时间四") - dr(表B.类别(“类别1”).("时间四"))
类别2        12:00    13:00    14:10   15:00
类别3        16:05    17:00    18:00   19:00


表B

类别            时间一     时间二     时间三    时间四

类别1         09:00    10:00   11:00   12:00
类别2        12:00    13:00    14:00   15:00
类别3        16:00    17:00    18:00   19:00




'计算超时:
Select Case e.DataCol.name
    Case "时间一","时间二","时间三","时间四"
        Dim dr As DataRow = e.DataRow  
   If dr.IsNull("时间一")   Then   

dr("超时分钟") = Nothing
        Else
            Dim tp As TimeSpan
            tp =(dr("时间一") - dr(表B.类别(“类别1”).("时间一"))+(dr("时间二") - dr(表B.类别(“类别1”).("时间二"))+(dr("时间三") - dr(表B.类别(“类别1”).("时间三"))+(dr("时间四") - dr(表B.类别(“类别1”).("时间四"))
            dr("超时分钟") = tp.TotalSeconds() '真正的时段型数据要转换为秒数,才能存入时段列
        End If
End Select



需求如下:

超时分钟=(dr("时间一") - dr(表B.类别(“类别1”).("时间一"))+(dr("时间二") - dr(表B.类别(“类别1”).("时间二"))+(dr("时间三") - dr(表B.类别(“类别1”).("时间三"))+(dr("时间四") - dr(表B.类别(“类别1”).("时间四"))

1.计算超时
1.1计算表A的超时,表A"类别,时间一“与表B"类别,时间一“进行计算,后面三个时也类似,计算结算给相加的总和
  如果 表A"类别,时间一“与表B"类别,时间一“进行计算结果,小于等于0,就不显示,不与后面个时间进行的值相加;
  如果  表A"类别,时间一“与表B"类别,时间一“进行计算结果,大于等于1,就显示,与后面个时间进行的值相加;


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


加好友 发短信
等级:六尾狐 帖子:1307 积分:8905 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2020/4/30 15:30:00 [显示全部帖子]

老师,还有一个问题,这个计算公式中:
Dim tp As double = (dr("时间一") -  dr2("时间一")).TotalSeconds() +(dr("时间二") -  dr2("时间二")).TotalSeconds() +(dr("时间三") -  dr2("时间三")).TotalSeconds() +(dr("时间四") -  dr2("时间四")).TotalSeconds() 
上面公式的组成部条件:

(dr("时间一") -  dr2("时间一")).TotalSeconds(),计算出来值,小于等0,显示为“0”或不显示,当大于等于5,显示其真实的值。

(dr("时间二") -  dr2("时间二")).TotalSeconds(),计算出来值,小于等0,显示为“0”或不显示,当大于等于5,显示其真实的值。

(dr("时间三") -  dr2("时间三")).TotalSeconds() ,计算出来值,小于等0,显示为“0”或不显示,当大于等于5,显示其真实的值。

(dr("时间四") -  dr2("时间四")).TotalSeconds() ,计算出来值,小于等0,显示为“0”或不显示,当大于等于5,显示其真实的值。

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


加好友 发短信
等级:六尾狐 帖子:1307 积分:8905 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2020/5/8 14:16:00 [显示全部帖子]

老师,计算出值不对,如图
 If dr2 IsNot Nothing
                Dim a As Double
                If (dr("时间一") -  dr2("时间一")).TotalSeconds() >10 Then
                    a = a + (dr("时间一") -  dr2("时间一")).TotalSeconds()
                End If
                
                If (dr("时间二") -  dr2("时间二")).TotalSeconds() >10 Then
                    a = a + (dr("时间二") -  dr2("时间二")).TotalSeconds()
                End If
                
                If (dr("时间三") -  dr2("时间三")).TotalSeconds() >10 Then
                    a = a + (dr("时间三") -  dr2("时间三")).TotalSeconds()
                End If
                If (dr("时间四") -  dr2("时间四")).TotalSeconds() >10 Then
                    a = a + (dr("时间四") -  dr2("时间四")).TotalSeconds()
                End If
                
                                              
                Dim tp As Double = (dr("时间一") -  dr2("时间一")).TotalSeconds() +(dr("时间二") -  dr2("时间二")).TotalSeconds() +(dr("时间三") -  dr2("时间三")).TotalSeconds() +(dr("时间四") -  dr2("时间四")).TotalSeconds()
                dr("超时分钟") = tp'真正的时段型数据要转换为秒数,才能存入时段列
            End If




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


加好友 发短信
等级:六尾狐 帖子:1307 积分:8905 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2020/5/8 14:20:00 [显示全部帖子]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:计算问题.zip





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


加好友 发短信
等级:六尾狐 帖子:1307 积分:8905 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2020/5/8 15:04:00 [显示全部帖子]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:计算时间.foxdb


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


加好友 发短信
等级:六尾狐 帖子:1307 积分:8905 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2020/5/8 16:26:00 [显示全部帖子]

而我测试,和上传实例的数据,如6楼的问题,数据是错

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


加好友 发短信
等级:六尾狐 帖子:1307 积分:8905 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2020/5/8 16:51:00 [显示全部帖子]

Dim tp As double = (dr("时间一") -  dr2("时间一")).TotalSeconds() +(dr("时间二") -  dr2("时间二")).TotalSeconds() +(dr("时间三") -  dr2("时间三")).TotalSeconds() +(dr("时间四") -  dr2("时间四")).TotalSeconds() 
上面公式的组成部条件:

(dr("时间一") -  dr2("时间一")).TotalSeconds(),计算出来值,小于等0,显示为“0”或不显示,当大于10,显示其真实的值。

(dr("时间二") -  dr2("时间二")).TotalSeconds(),计算出来值,小于等0,显示为“0”或不显示,当大于10,显示其真实的值。

(dr("时间三") -  dr2("时间三")).TotalSeconds() ,计算出来值,小于等0,显示为“0”或不显示,当大于10,显示其真实的值。

(dr("时间四") -  dr2("时间四")).TotalSeconds() ,计算出来值,小于等0,显示为“0”或不显示,当大于10,显示其真实的值。


类于上面需求,就是二个或一组数据的相减,其计算后的值,小于等0,显示为“0”或不显示,只当大于10才显示,参与后面计算
实际测试中,如6楼图示
1.表A,类别1,超时分钟:0.05是错,正确是0,因“时间二”超时0.10,时间四超时0.10,时间三超时0.05,其中超时分钟的值 ,它取时间三的超时,0,05,代码的问题,是把小于等0,是参与后面计算,这与需求冲突,需求它不要等于0,如计算的-0.20或-0.50或0都是为0
公式=0+0+0
2.表A,类别2,超时分钟:-0.10是错,出是小于等0,是参与后面计算,这与需求冲突,需求它不要等于0

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


加好友 发短信
等级:六尾狐 帖子:1307 积分:8905 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2020/5/8 17:04:00 [显示全部帖子]

二个或一组数据的相减,其计算后的值,小于等0,显示为“0”或不显示,只当大于10才显示,参与后面计算
12:00    13:00    14:10   15:00
原意:
 假如1:  D1=(dr("时间一") -  dr2("时间一")).TotalSeconds() >=10
          D1=(dr("12:15 ") -  dr2("12:00 ")).TotalSeconds() 
          D1=00:15 
假如2:  D1=(dr("时间一") -  dr2("时间一")).TotalSeconds() >=10
          D1=(dr("11:15 ") -  dr2("12:00 ")).TotalSeconds() 
          D1=-00:45 这个实际算出的值,项目需求是
           D1=0

假如3:  D1=(dr("时间一") -  dr2("时间一")).TotalSeconds() >=10
          D1=(dr("12:00 ") -  dr2("12:00 ")).TotalSeconds() 
          D1=-0
           D1=-0

而实例是假如2:的值是为0,而与实际的值-00:45参与计算,所以算出值有错

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


加好友 发短信
等级:六尾狐 帖子:1307 积分:8905 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2020/5/8 17:36:00 [显示全部帖子]

老师,可以我没表达清楚
本需求的意思,有类似,帮助一个实例,“折扣”不能大于0.15,超过0.15的值一律按0。15算。
二个数或一组数据相减的值是“负数或是0”都为“0”。只有大等于10,才取实际值,如11,就是11,12就是12

D1=(dr("11:15 ") -  dr2("12:00 ")).TotalSeconds() 这个测试处理是负值 -45分,也就是-2700秒,麻烦认真测试好吗?!!不要为-45分而是显示“0”

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


加好友 发短信
等级:六尾狐 帖子:1307 积分:8905 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2020/5/8 17:55:00 [显示全部帖子]

以6楼图看,表A第二行,正确超时分钟=0.30,不是-0.10,
原因如下:
1.表A时间一:提前40分钟(表A时间一-表B时间00:40)
2,表A时间二:超时20分钟(表A时间-表B时间00:20)
3.表A时间三:为0,没提前也没超时,正好。(表A时间-表B时间=0)
4,表A时间四:超时20分钟(表A时间-表B时间=  00:10)
5.正确,表A超时分钟=表A时间一+表A时间二+表A时间三+表A时间四
                           =          0  +  00:20  +        0  00:10
                           =   00:30

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