Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

Value值的计算

yuzhiai  发表于:2016-05-03 10:53:40  
复制

�������ش˸���

如附件中所示,我用开关量采集设备对现场生产的机器进行数据采集;

按照时间的不断推移,Value 值不断累加

现要对Value值进行统计,这台设备共进行了多少次的生产活动


采集设备的数据在每天生产前会清(使用定时器断电后重启清空,附件中有空值

如果不出意外断电的情况,我只要收集每天最后一条记录就可以

但如果出现意外断电的话,就会出现附件内重新累计


请各位帮忙看看这个怎么做查询,能够统计出正确的数量

结果应该为:1020

 

Top
zhaoyoulong 发表于:2016-05-03 16:34:10
Public Function GetMyVal(StrSql As String, FieldName As String) As Long
    Dim MyVal As Long
    Dim i As Long
    Dim rs As ADODB.Recordset
    Dim AddValueBool As Boolean


    AddValueBool = False
    StrSql = "select * from Sheet1 order by date desc"
    Set rs = New ADODB.Recordset
    rs.Open StrSql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    For i = 0 To rs.RecordCount - 1
        If i = 0 Then MyVal = rs(FieldName) + MyVal
        If rs("value") <> 0 And AddValueBool = True Then
            MyVal = rs(FieldName) + MyVal
            AddValueBool = False
        End If


        If rs("value") = 0 Then AddValueBool = True
        rs.MoveNext
    Next
    rs.Close
    Set rs = Nothing


    GetMyVal = MyVal
End Function
调用: MsgBox GetMyVal("select * from sheet1 order by date desc", "value")


zhaoyoulong 发表于:2016-05-03 16:45:32
自己再改一下,把函数写细一些就行

yuzhiai 发表于:2016-05-04 09:49:04

点击下载此附件

zhaoyoulong,你好,感谢你的帮忙

我按照你的代码写进去了,查询1是得到的结果(我不知道是不是这样用)

和我的需求有点出入,丢了第"728"行的"908"那个数据

我要的查询结果是:

设备号:271

端口号:102

Value:1020  (908+112)”

Date:2016-05-03

之前讲的比较笼统,实在抱歉

PS:附件里面我只是截了一台设备的部分数据,最终有5~8台采集设备,每台端口号16个,数据量还是比较大的

     要求输出的结果简洁明了,后续还用用这个数据进行员工计件工资计算,不能出错,可靠性好



yuzhiai 发表于:2016-05-04 09:53:51
我试了下,不同的设备号和端口号也不能区分

zhaoyoulong 发表于:2016-05-04 10:34:02
这个就是要分组计算了

zhaoyoulong 发表于:2016-05-04 10:42:09
还有,你重启后的Value到底是从几开始?1 OR 0 OR 空值?这个是取值的关键!你要说清楚的

yuzhiai 发表于:2016-05-04 10:45:07

能不能帮帮忙,等着急用



yuzhiai 发表于:2016-05-04 10:45:48

空值开始的



朱先生 发表于:2016-05-04 10:50:49

结果应该是1021 ,1020丢掉了VALUE=0的一次活动数据



yuzhiai 发表于:2016-05-04 12:15:57

To:朱先生

Value值没有 0 值的

因每天24:00断电清空数据采集设备,设定第二天早上6:00通电

刚通电时设备采集到的数据为 空 值

然后生产设备开动时,采集到的数据有变化,就开始有计数传到数据库



zhaoyoulong 发表于:2016-05-05 13:41:59
Public Function GetMyVal(tableName As String, _
                         UnGroupFiels As String, _
                         UnGroupValue As String, _
                         DsumValueFieldName As String, _
                         Optional WhereValue = 0, _
                         Optional OrderByStr As String = "") As Long
    Dim MyVal As Long
    Dim i As Long
    Dim Rs As ADODB.Recordset
    Dim AddValueBool As Boolean
    Dim StrSql As String
    
    AddValueBool = False
    StrSql = "select " & UnGroupFiels & " AS 组号," _
           & DsumValueFieldName & " from " _
           & tableName _
           & " where " & UnGroupFiels & "='" & UnGroupValue _
           & "' " & OrderByStr
    Set Rs = New ADODB.Recordset
    Rs.Open StrSql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    For i = 0 To Rs.RecordCount - 1
        If i = 0 Then MyVal = Rs(DsumValueFieldName) + MyVal
        If Nz(Rs(DsumValueFieldName), 0) = WhereValue Then AddValueBool = True
        If Nz(Rs(DsumValueFieldName), 0) <> WhereValue And AddValueBool = True Then
            MyVal = Rs(DsumValueFieldName) + MyVal
            AddValueBool = False
        End If
        Rs.MoveNext
    Next
    Rs.Close
    Set Rs = Nothing
    GetMyVal = MyVal
End Function

先建一个查询为:过渡查询1:SELECT DISTINCT 设备号, 端口号, Format([date],"yyyy\/mm\/dd") AS 日期

FROM Sheet1;

再建一查询:统计

SELECT 过渡查询1.设备号, 过渡查询1.端口号, 过渡查询1.日期, GetMyVal("sheet1","[设备号] & [端口号] & Format$(date,'yyyy-mm-dd')",[设备号] & [端口号] & Format$([日期],"yyyy/mm/dd"),"value",0,"order by date desc") AS MyVal
FROM 过渡查询1;





zhaoyoulong 发表于:2016-05-05 13:42:51
不知道为什么附件传不上来

yuzhiai 发表于:2016-05-05 17:22:10

今天太忙了,现在才有时间上来看

非常感谢高手 zhaoyoulong 的帮忙

完美的解决了我的问题

明天我会扔半个多月采集的数据上去进行测试

看看运行时间会不会有问题




yuzhiai 发表于:2016-05-06 08:48:12

248000条记录

算了半小时没出来

郁闷



zhaoyoulong 发表于:2016-05-06 14:16:52

用DAO好像快点


Public Function GetMyVal(tableName As String, _

                         UnGroupFiels As String, _
                         UnGroupValue As String, _
                         DsumValueFieldName As String, _
                         Optional WhereValue = 0, _
                         Optional OrderByStr As String = "") As Long
    Dim MyVal As Long
    Dim i As Long
    Dim Rs As dao.Recordset
    Dim AddValueBool As Boolean
    Dim StrSql As String


    AddValueBool = False
    StrSql = "select " & UnGroupFiels & "   AS 组号," _
           & DsumValueFieldName & " from " _
           & tableName _
           & " where " & UnGroupFiels & "='" & UnGroupValue _
           & "' " & OrderByStr
    Set Rs = CurrentDb.OpenRecordset(StrSql)
    Rs.MoveLast
    Rs.MoveFirst
    For i = 0 To Rs.RecordCount - 1
        If i = 0 Then MyVal = Rs(DsumValueFieldName) + MyVal
        If Nz(Rs(DsumValueFieldName), 0) = WhereValue Then AddValueBool = True
        If Nz(Rs(DsumValueFieldName), 0) <> WhereValue And AddValueBool = True Then
            MyVal = Rs(DsumValueFieldName) + MyVal
            AddValueBool = False
        End If
        Rs.MoveNext
    Next
    Rs.Close
    Set Rs = Nothing
    GetMyVal = MyVal
End Function

yuzhiai 发表于:2016-05-10 12:36:29

现在测试20000多条记录

感觉计算结果跳出来很快

但是界面非常卡

鼠标随便点了哪一条记录都反映慢

感觉一直在计算的样子



总记录:16篇  页次:1/1 9 1 :