以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]增加随机浮动系数后数据异常(已解决)  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=85843)

--  作者:yyzlxc
--  发布时间:2016/6/3 16:15:00
--  [求助]增加随机浮动系数后数据异常(已解决)
一段数据模拟演示代码,可以自动生成节拍时间数据。为了提高模拟效果,对生成的数据进行6%以内的随机浮动,正常的插插间隔时间应该在3600秒±6%,但是却出现近90000的异常数据,并且没有规律性(连续按加浮动按钮,异常数据的数量和位置会变动),问题出在哪里?请各位老师指教,谢谢!!


 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目21.foxdb


[此贴子已经被作者于2016/6/3 19:06:14编辑过]

--  作者:大红袍
--  发布时间:2016/6/3 17:00:00
--  

为什么要考虑日期增量?

 

For Each dr As DataRow In DataTables("表A").DataRows
    dr("插卡时间") = Nothing
    dr("拔卡时间") = Nothing
    dr("插拔间隔") = Nothing
    dr("插插间隔") = Nothing
    dr("拔插间隔") = Nothing
    dr("工效") = Nothing
    dr("午休标记") = Nothing
Next

Dim fdxs As Integer = 6 \'工位工时浮动系数
Dim cgsj As Date = #08:00:00# \'上午出工时间
Dim swsgsj As Date = #11:00:00# \'上午收工时间
Dim wxjg As Integer = 5400 \'午休间隔
\'Dim rqzl As Integer = 86400 \'日期增量

\'填充当天工位首次插拔卡时间
For Each dr As DataRow In DataTables("表A").DataRows
    Dim pr As DataRow = DataTables("表A").Find("日期 = \'" & dr("日期") & "\' and 工位ID = \'" & dr("工位ID") & "\'","采集序号")
    If pr.IsNull("插卡时间") Then
        pr("插卡时间") = pr("日期") &" "& cgsj
        \'pr("拔卡时间") = CDate(pr("插卡时间")).AddSeconds(pr("工位工时"))
        pr("拔卡时间") = CDate(pr("插卡时间")).AddSeconds(pr("工位工时") * Rand.Next(100 - fdxs,100 + fdxs) / 100)
    End If
Next

For Each dr As DataRow In DataTables("表A").DataRows
    Dim pr As DataRow = DataTables("表A").Find("工位ID = \'" & dr("工位ID") & "\' and 采集序号 <  \'" & dr("采集序号") & "\'","采集序号 Desc") \'同批次工位的上一行
    Dim pr2 As DataRow = DataTables("表A").Find("工位ID = \'" & dr("工位ID") & "\' And 午休标记 = 1")
    If dr.IsNull("插卡时间") Then
        If pr("拔卡时间").AddSeconds(dr("工位工时")) > pr("日期") &" "& swsgsj And pr2 Is Nothing \'判断本节拍结束时间大于中午收工时间以及当天本工位无午休标记
            If dr("日期") = pr("日期") Then
                dr("插卡时间") = pr("拔卡时间")
                dr("插插间隔") = (dr("插卡时间") - pr("插卡时间")).TotalSeconds()
                dr("拔插间隔") = (dr("插卡时间") - pr("拔卡时间")).TotalSeconds()
            Else
                dr("插卡时间") = pr("拔卡时间")\'.AddSeconds(rqzl)
                dr("插插间隔") = (dr("插卡时间") - pr("插卡时间")).TotalSeconds()\' - rqzl
                dr("拔插间隔") = (dr("插卡时间") - pr("拔卡时间")).TotalSeconds() \'- rqzl
            End If
            \'dr("拔卡时间") = CDate(dr("插卡时间")).AddSeconds(dr("工位工时") + wxjg)
            dr("拔卡时间") = CDate(dr("插卡时间")).AddSeconds(dr("工位工时") * Rand.Next(100 - fdxs,100 + fdxs) / 100 + wxjg)
            dr("午休标记") = 1 \'添加午休标记
        Else
            If dr("日期") = pr("日期") Then
                dr("插卡时间") = pr("拔卡时间")
                dr("插插间隔") = (dr("插卡时间") - pr("插卡时间")).TotalSeconds()
                dr("拔插间隔") = (dr("插卡时间") - pr("拔卡时间")).TotalSeconds()
            Else
                dr("插卡时间") = pr("拔卡时间")\'.AddSeconds(rqzl)
                dr("插插间隔") = (dr("插卡时间") - pr("插卡时间")).TotalSeconds() \'- rqzl
                dr("拔插间隔") = (dr("插卡时间") - pr("拔卡时间")).TotalSeconds() \'- rqzl
            End If
            If pr("午休标记") = 1 Then
                dr("插插间隔") = (dr("插卡时间") - pr("插卡时间")).TotalSeconds() - wxjg
            End If
            \'dr("拔卡时间") = CDate(dr("插卡时间")).AddSeconds(dr("工位工时")
            dr("拔卡时间") = CDate(dr("插卡时间")).AddSeconds(dr("工位工时") * Rand.Next(100 - fdxs,100 + fdxs) / 100)
        End If
    End If
Next
For Each dr As DataRow In DataTables("表A").DataRows
    If dr.IsNull("插拔间隔") Then
        If dr("午休标记") = 1 Then
            dr("插拔间隔") = (dr("拔卡时间") - dr("插卡时间")).TotalSeconds() - wxjg
        Else
            dr("插拔间隔") = (dr("拔卡时间") - dr("插卡时间")).TotalSeconds()
        End If
    End If
    If dr.IsNull("插插间隔") Then
        dr("插插间隔") = dr("插拔间隔")
    End If
    dr("工效") = dr("工位工时") / dr("插插间隔")
Next
Tables("表A").AutoSizeCols()
DataTables("表A").Save()


--  作者:yyzlxc
--  发布时间:2016/6/3 17:15:00
--  
谢谢大红袍老师回复,关于日期增量,是因为插卡时间等于上一行的拔卡时间,当两者不为同一天时,本行的插卡时间等于上一行拔卡时间加一天的秒时(86400),否则插卡时间的日期会不符要求,不加浮动的代码就可以正常显示,但是加了浮动后就出错,问题出在哪里,请大红袍老师指教,谢谢!!
--  作者:yyzlxc
--  发布时间:2016/6/3 17:22:00
--  
谢谢大红袍老师,没有看清楚,老师已经修改了代码,运行正常,再次感谢!!
--  作者:大红袍
--  发布时间:2016/6/3 17:22:00
--  
 不需要加上这个啊,相减就加上日期了的啊。
--  作者:yyzlxc
--  发布时间:2016/6/3 17:32:00
--  
修改后的代码插卡时间的日期回到6月1日,如何解决,请大红袍老师指教,谢谢!!
--  作者:大红袍
--  发布时间:2016/6/3 17:40:00
--  

为什么要赋值?不赋值不行?你逻辑是什么?

 

dr("插卡时间") = pr("拔卡时间")


--  作者:yyzlxc
--  发布时间:2016/6/3 17:44:00
--  
是的,本行的插卡时间是上一行的拔卡时间。
--  作者:yyzlxc
--  发布时间:2016/6/3 17:46:00
--  
如果不加日期增量,当前行的日期大于上一行的日期,插卡时间的日期会等于上一行的日期。
--  作者:大红袍
--  发布时间:2016/6/3 17:47:00
--  
 那没问题啊,赋值没问题啊。