以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  请教实现方案  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=50267)

--  作者:supwork
--  发布时间:2014/5/3 17:23:00
--  请教实现方案

需求描述:

   上传示例说明:建立有两数据源M197,M198数据库文件在项目文件夹中. 建立有内部数据表三个,"试验临时数据" 为临时表,记录每次自动 执行时的取入数据结果. 内部表"试验数据"记录原始试验数据,"试验结果"记录每次检验结果,数据条数为"试验数据"的1/3.

 

本需求为自0点起每两小时集中收集车间各试验台当日试验数据.

数据源情况为:

  每台电脑均采用ACCESS2003数据库格式,总共大概有30台主机

  每试验主机每日试验时自动产生数据表,数据表命名规则为"t140424"共七位,即t 加年月日各两位. 即目标表每天是自动变化的. 每数据源下表名称命名规则,表结构均一样.

    这类型外部数据源均定义为M197,M198.......即名称以M开头 总共大概有30来个

     

表结构为:   编号,型号,转速,压力,流量,扭距,时间,温度,结果

                 编号,型号,结果为字符数据,其余均为小数.

                 该表没有主键.

                 编号为201404250001形式,即自0001开始流水编码.

                 编号+型号为测试数据,正常情况下,一次测试产生三条记录,如果三个结果均合格,则试验结果为合格.开始产生下一编码.如果三条其中有一个不合格,则该编号再进行一次测试又产生三条数据,如果合格,则进行下一编码测试,如果不合格则继续进行本编码测试.(结果为:如果某编号一次性试验三条合格,则数据表中仅记录3条记录,如果某编号有不合格则产生不合格数*3条不合格数据,其中每三条中的某一条有不合格出现. 该编号最后三条记录必全为合格数据(除非是最后三条记录)

 

现要求设计完成:

      1,自0点起每2 小时,所有以M开头的数据源下的t******当日表中读取数据到示例程序中的"试验临时数据"表中, 在日期列写入当前日期,在来源列写入当前数据源名称

    并对"试验临时数据"中的数据进行分析,在标记1中按编号+型号进行1,2,3,1,2,3......标记

                                                         在标记2中进行合格与不合格标记,(编号+型号每1,2,3条数据进行合格与否标记,三条全部合格标记为合格,有一条不合格标记为不合格.

                                                          在标记3中对编号+型号+标记2,连续三条的第一条中标记为1.该标记数据为不重复数据.

 

    2,按编号+型号进行判断 将新数据写入到"试验数据表"中. "试验数据"表为所有检验记录数据库,临时表每次读入的数据是当日全部的,所经写入到"试验数据"表中的数据为新增加数据,在录入时间里记录当前系统时间(格式为2014-05-03 12:30).

 

 

   3,将"试验临时数据"中 标记3中标记为1的数据写入"试验结果"数据表中,写入时只写入新增加数据,并在表 记录时间写入当前系统时间(格式为2014-05-03 12:30)

 

 

 需注意事项:

    1\\所有操作均设置为程序自动运行.自0点起每2小时执行一次.

    2\\自动执行时,可能有的主机(数据源)未开机不能连接.

    3\\自动执行时,可能有的主机就算开了,但并未开始检验,即当前数据表t140503表可能不存在.

    4\\M197,M198示例数据源中有两天数据,2014-4-24日和2014-04-25日两天的测试数据数据表为 t20140424,t140425.但实际运行时,数据表为t+当日年月日格式.

 

这应该是一个很有代表性的实例,希望高人给解答一下.

 

 

 

 

            

 

 

[此贴子已经被作者于2014-5-3 17:31:54编辑过]

--  作者:supwork
--  发布时间:2014/5/3 17:23:00
--  

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:试验数据管理系统.rar

[此贴子已经被作者于2014-5-4 9:29:13编辑过]

--  作者:新福星
--  发布时间:2014/5/3 17:46:00
--  
每试验主机每日试验时自动产生数据表,... 数据是如何录进去的?有传感器么? 你们的网络是什么情况?
--  作者:Supwork
--  发布时间:2014/5/3 20:19:00
--  
试验数据有试验软件产生并自动记录,记录在access数据库中,局域网连接,直接读数据库记录就行,
--  作者:supwork
--  发布时间:2014/5/3 23:32:00
--  
试验原始数据就是例孑程序中的外部数据源中的数据,这个数据分布在多台电脑上,不用管他怎么来的有就读取没有就跳过,
--  作者:新福星
--  发布时间:2014/5/4 6:37:00
--  
大体思路可以有两个.一个是将每台数据定时采集后汇总到一个数据库中;另一个方法是在一台机器上主动去采集数据汇总到一个数据库中。
第一种方法具体就是建立一个共享Access数据库D。然后利用foxtables编制数据采集程序A,安装到每一台设备上。程序需要联接共享数据库D和和本地数据库联接M。定时判断数据M是否齐备后采集,写入到共享数据库D中;
第二种也许就是你现在的方法。这个同样需要建立一个共享数据库D,用FoxTable编的程序P可以不分布到每台机器上。但是P程序需要和每台设备的数据库M联接,按您描述需要建立30多个联接,然后定时逐一分析哪些数据可以读下来!
上两种方案只解决了数据采集汇集问题。还需要再编制数据处理程序C,集中处理数据D的数据。若有问题可以Q我 31358568


--  作者:supwork
--  发布时间:2014/5/4 9:15:00
--  

具体方案就在一楼,在服务器上集中采集,也许问得太笼统了,好吧现在一个一个问题的问.

 

\'删除临时数据表所有行
For i As Integer = Tables("试验临时数据").Rows.count-1 To 0 Step -1
        Tables("试验临时数据").Rows(i).Delete
Next

 

\'生成表名
Dim d As Date = Date.Today
Dim dd As String
dd = Format(d, "yyMMdd")
dd = CStr(dd)
dd = "t" & dd

 

\'合并外部数据源中的数据到临时数据表中
Dim mg As New Merger

mg.C ="M197"    \'指定数据源名称   (数据源名称指定语句发不上来,改了N次还这个样了  ) 

问题1,是示例只直接引用数据源名称,如何遍历数据源,总不能30个数据源,本段代码重复30次的吧 问题2,如何判断数据源开机,有效存在才进行读数,否则跳过.
mg.SourceTableName = "t140425" \'指定要合并的表  

    问题3问题是示例直接引用表名,如何引用变量 dd  问题4如何判断表名存在,存在就读数,否则跳过
mg.DataTableName = "试验临时数据" \'指定接收数据的表
mg.Merge() \'开始合并   

 

   \'问题5 如何将当前数据源的名称写入到临时表的来源列中.

[此贴子已经被作者于2014-5-4 9:27:29编辑过]

--  作者:supwork
--  发布时间:2014/5/4 9:24:00
--  

mg.C  \'指定数据源名称 这一句发不上来,改了N多次 还显示 mg.c

[此贴子已经被作者于2014-5-4 9:25:13编辑过]

--  作者:有点甜
--  发布时间:2014/5/4 9:41:00
--  

问题1:定义一个数组,然后循环引用,参考 http://www.foxtable.com/help/topics/0216.htm

 

问题2:可以先ping一下机子是否开启,再连接一下数据源测试

 

http://www.foxtable.com/help/topics/1401.htm

http://www.foxtable.com/help/topics/1944.htm

 

问题3:你不是已经写正确了么?直接写dd便可

 

问题4:判断表名,可以这样,用getTableNames, 参考 http://www.foxtable.com/help/topics/1943.htm

 

问题5:这个,就有点麻烦了。这样你就不能直接合并数据了。你需要多加一个临时表,把一个表的内容合并进临时表以后,修改来源列的内容,然后再合并到试验临时数据表

 

-----------------最后加一句,这些都是很简单的问题,楼主的基础没有打牢,先看看帮助,扩展下思路。


--  作者:supwork
--  发布时间:2014/5/4 10:54:00
--  

关于数量定义的问题

按官方的示例可简单完成

Dim Names(3) As String
Names
(0) = "M197"
Names
(1) = "M196"
Names
(2) = "M195"
Names
(3) = "M194"

 

 

但这样写显然比较机械.

 

但再智能点不

 

因为这类数据源全部以M开头

 

能用一个简单通知点代码 直接生成 数据源的数组不.

 

那样当有数据源增加时.这类数据源直接用M打头增加即可.程序运行时即可自动加入数组中.

 

可以这样写的吧

 

For Each cn As Connection In Connections
     if left(cn.Name,1) = "M" then
      代码........

    end

Next

 


[此贴子已经被作者于2014-5-4 11:09:44编辑过]