注册 登录
编程论坛 VB6论坛

在VB里面如何对数据进行比较,并给出比较结果

beijiquan 发布于 2014-12-26 14:28, 1244 次点击
需要对数据库里面的数据进行比较并给出比较结果,数据库里面的数据是这样的:
文件号 排号 架号 层号 道号
1          P     017    B     09
1          P     017    B     10
1          P     018    B     02
1          P     018   B     03
需要对同一文件号所对应的数据进行比较,排号架号层号道号之间的规律是这样的:一排有40个架,一架有ABC三层,一层有10个道。如果连续就用-连接,如果不连续就用/连接。研究了好长时间,没个好的办法,请教高手指点。
排号架号层号相同道号相邻表示连续,比如P017B09和P017B10,比较结果为P017B09_10;
排号架号相同层号不同,比如P017B10和P017C01也表示连续,比较结果为P017B10_C01;
除此之外表示不连续,不连续的表示方法是:
比如P017B07和P017B10,比较结果应为:P017B07/10
比如P017B07和P017C01,比较结果应为:P017B07/C01
比如P017B07和P018B10,比较结果应为:P017B07/P018B10
23 回复
#2
beijiquan2014-12-26 14:48
急!!!!!!!!!
#3
xzlxzlxzl2014-12-26 18:36
能不能提供数据库?我有一个算法,但需要数据调试。主要方法是对数据库记录集排序,然后用一计数器遍历所有记录并比较即可。
#4
beijiquan2014-12-30 11:14
只有本站会员才能查看附件,请 登录

这是excel数据库,里面有比较方法,你看一下,如果可以的话请联系我45262121,在此深表感谢
#5
lianyicq2014-12-30 12:12
回复 4楼 beijiquan
自义一个数据类型
Type element
     fileInd as string'文件号
     row as string'排号
     frame as string'架号
     layer as string'层号
     slot as string'道号
End Type
然后把表格内容读入到element类型的数组中.
定义一个两两比较的函数,用逻辑判断语句得到输出结果.
根据用户指定的两个element或遍历同文件号的element 的两两组合调用比较函数.
这样不行吗?
#6
beijiquan2014-12-30 15:20
回复 5楼 lianyicq
你能否说的详细些,最好有代码。我也写了程序进行两两比较,但是结果还是不全对,要不我把代码贴上来你给我看看??
#7
beijiquan2014-12-30 15:29
rs.Open "select * from Wirerack where 文件号='" & Trim(Text1(0).text) & "' order by 排号,架号,层号,道号", cnn, adOpenKeyset, adLockOptimistic
   If rs.RecordCount > 0 Then
      If rs.RecordCount = 1 Then '一条记录直接读
         rs.MoveFirst
         a = rs.Fields("排号")
         b = rs.Fields("架号")
         c = rs.Fields("层号")
         d = rs.Fields("道号")
         Text1(5).text = a & b & c & d
      End If
      If rs.RecordCount = 2 Then '两条记录直接比
         rs.MoveFirst
         a = rs.Fields("排号")
         b = rs.Fields("架号")
         c = rs.Fields("层号")
         d = rs.Fields("道号")
         Text1(5).text = a & b & c & d
         rs.MoveNext
         a1 = rs.Fields("排号")
         b1 = rs.Fields("架号")
         c1 = rs.Fields("层号")
         d1 = rs.Fields("道号")
         If (a = a1) And (b = b1) And (c = c1) And (d <> d1) Then '仅道号不一样
            If Val(d1 - d) = 1 Then
               Text1(5) = Text1(5) & "_" & d1
            Else
               Text1(5).text = Text1(5) & "/" & c1 & d1
            End If
         ElseIf (a = a1) And (b = b1) And (c <> c1) Then '层号不一样
            If Asc(c1) - Asc(c) = 1 And Val(d - d1) = 9 Then
               Text1(5).text = Text1(5) & "_" & c1 & d1
            Else
               Text1(5).text = Text1(5) & "/" & c1 & d1
            End If
         ElseIf (b <> b1) Then '架号不一样
            Text1(5).text = Text1(5) & "/" & a1 & b1 & c1 & d1
         End If
      End If
      If rs.RecordCount > 2 Then '三条以上记录,第一条与第二条比较的结果在于第二条与第三条记录比较的结果比较
         For i = 0 To rs.RecordCount - 2
            a = rs.Fields("排号")
            b = rs.Fields("架号")
            c = rs.Fields("层号")
            d = rs.Fields("道号")
            rs.MoveNext
            a1 = rs.Fields("排号")
            b1 = rs.Fields("架号")
            c1 = rs.Fields("层号")
            d1 = rs.Fields("道号")
            If (a = a1) And (b = b1) And (c = c1) And (d <> d1) Then '仅道号不一样
                If Val(d1 - d) = 1 Then
                   If i = 0 Then
                      Text1(5) = a & b & c & d & "_" & d1
                   Else
                      Text1(5) = left(Text1(5), Len(Text1(5)) - 3) & "_" & d1
                   End If
                Else
                   If i = 0 Then
                      Text1(5).text = a & b & c & d & "/" & c1 & d1
                   Else
                      Text1(5).text = Text1(5).text & "/" & c1 & d1
                   End If
                End If
            ElseIf (a = a1) And (b = b1) And (c <> c1) Then '层号不一样
               If Asc(c1) - Asc(c) = 1 And Val(d - d1) = 9 Then
                   If i = 0 Then
                      Text1(5).text = a & b & c & d & "_" & c1 & d1
                   Else
                      Text1(5).text = Text1(5) & "_" & c1 & d1
                   End If
               Else
                  If i = 0 Then
                     Text1(5).text = a & b & c & d & "/" & c1 & d1
                  Else
                     Text1(5).text = Text1(5).text & "/" & c1 & d1
                  End If
               End If
            ElseIf (b <> b1) Then '架号不一样
               If i = 0 Then
                  Text1(5).text = a & b & c & d & "/" & a1 & b1 & c1 & d1
               Else
                  Text1(5).text = Text1(5).text & "/" & a1 & b1 & c1 & d1
               End If
            End If
         Next i
       End If
    Else
       Text1(5).text = ""
       MsgBox "在导线缓冲架中没发现此文件相关数据,请核查数据!", , "提示"
    End If
    rs.Close
#8
lianyicq2014-12-30 16:06
回复 7楼 beijiquan
好多"衣服"和"额尔斯"和"额尔斯衣服".我这老眼昏花,只觉眼花缭乱.不知道能不能看完。建议自定义比较函数.
假设a、b、c、d之类都是字符串型。
比较道号应该是:if abs(val(a)-val(a1))=1 then...
#9
beijiquan2014-12-30 16:14
多于两个的就不好比较了,道号的数据是数值,可以直接Val(d1 - d) = 1这样比较,层号的数据是字符,只能这样比Asc(c1) - Asc(c) = 1。
你能否给一个自定义的比较函数?
#10
lianyicq2014-12-30 16:30
回复 9楼 beijiquan
程序代码:
思路是这样的,不过我没测试。需要勘误
Type element_type
     fileInd As String '文件号
     row As String '排号
     frame As String '架号
     layer As String '层号
     slot As String '道号
End Type

Dim element() As element_type
Function compare(a As element_type, b As element_type) As String
  If a.row = b.row And a.frame = b.frame And a.layer = b.layer And Abs(Val(a.String) - Val(b.String)) = 1 Then compare = a.row & a.frame & a.layer & a.slot & "_" & b.slot: Exit Function
  '下句有重复消耗系统时间的嫌疑
  If a.row = b.row And a.frame = b.frame And a.layer = b.layer And Abs(Val(a.String) - Val(b.String)) <> 1 Then compare = a.row & a.frame & a.layer & a.slot & "/" & b.slot: Exit Function
  If a.row = b.row And a.frame = b.frame And a.layer <> b.layer Then compare = a.row & a.frame & a.layer & a.slot & "_" & b.layer & b.slot: Exit Function

 
  If a.row <> b.row Then compare = a.row & a.frame & a.layer & a.slot & "/" & b.row & b.frame & b.layer & b.slot: Exit Function
  If a.frame <> b.frame Then compare = a.row & a.frame & a.layer & a.slot & "/" & b.frame & b.layer & b.slot: Exit Function


 
End Function
勘误:
程序代码:
Type element_type
  fileInd As String
  row As String
  frame As String
  layer As String
  slot As String
End Type

 
Public element(1000) As element_type

Function compare(a As element_type, b As element_type) As String
  If a.row = b.row And a.frame = b.frame And a.layer = b.layer And Abs(Val(a.slot) - Val(b.slot)) = 1 Then compare = a.row & a.frame & a.layer & a.slot & "_" & b.slot: Exit Function
  If a.row = b.row And a.frame = b.frame And a.layer = b.layer And Abs(Val(a.slot) - Val(b.slot)) <> 1 Then compare = a.row & a.frame & a.layer & a.slot & "/" & b.slot: Exit Function
  If a.row = b.row And a.frame = b.frame And a.layer <> b.layer Then compare = a.row & a.frame & a.layer & a.slot & "_" & b.layer & b.slot: Exit Function
  If a.row <> b.row Then compare = a.row & a.frame & a.layer & a.slot & "/" & b.row & b.frame & b.layer & b.slot: Exit Function
  If a.frame <> b.frame Then compare = a.row & a.frame & a.layer & a.slot & "/" & b.frame & b.layer & b.slot: Exit Function
End Function
只有本站会员才能查看附件,请 登录
作为参考吧

[ 本帖最后由 lianyicq 于 2014-12-30 16:57 编辑 ]
#11
beijiquan2014-12-30 16:55
call compare()调用该函数时,括号里面该怎么写?
#12
lianyicq2014-12-30 17:00
回复 11楼 beijiquan
看刚发的示例工程, 因为做数据录入部分,我手工录入了你举的几个例子数据,个别小问题,你自己看了就能把我的改了

[ 本帖最后由 lianyicq 于 2014-12-30 17:02 编辑 ]
#13
beijiquan2014-12-30 17:09
你是对一个文件的6条记录进行了几比较,得出5个结果,这5个结果还要进行比较啊,最后只能得出一个结果,对结果的比较是关键
#14
xzlxzlxzl2014-12-30 23:35
从你的描述可知:文件号对应的排号固定,因此对一个文件号,排号可不需要参与比较,再就是不习惯ado操作excel,先把你的excel转换成了access操作。没有对比较后的字符范围进行比较,这个你自己可完成,不难。程序运行效果如下,同时工程文件附后。
只有本站会员才能查看附件,请 登录


删除

[ 本帖最后由 xzlxzlxzl 于 2014-12-31 14:14 编辑 ]
#15
beijiquan2014-12-31 09:45
关键是对每次比较结果的比较,这是我的难点
#16
beijiquan2014-12-31 09:59
文件号           排号    架号  层号    道号      比较结果
C-02-03500    P    017    B    09   
C-02-03500    P    017    B    10   
C-02-03500    P    018    B    02    P017B09-10/P018B02-04
C-02-03500    P    018    B    03   
C-02-03500    P    018    B    04   
                    
C-03-05300    A    042    C    08   
C-03-05300    A    042    C    09   
C-03-05300    A    042    C    10    A042C08-10/A043A01
C-03-05300    A    043    A    01   
                    
C-05-00200    P    016    B    10    P016B10/P017A01
C-05-00200    P    017    A    01   
                    
C-07-00300    A    014    C    04    A014C04-05/A016A01-02
C-07-00300    A    014    C    05   
C-07-00300    A    016    A    01   
C-07-00300    A    016    A    02   
                    
C-07-02600A    A    018    A    10    A018A10/A019B07
C-07-02600A    A    019    B    07   
这是客户要求达到的比较结果,你看一下
#17
lianyicq2014-12-31 10:21
现在问题描述得稍微清楚了一些.相当于一个分类问题.我建议一个思路:
1、按文件号分类,得到文件号1/文件号2/.../文件号n;
2、在同一个文件号类下,按排号分类,得到排号1/排号2/.../排号m;
3、在每一个排号类下,按架号分类,得到架号1/架号2/.../架号p;
4、在同一架号下再考虑“-”和“/”的情况。
#18
beijiquan2014-12-31 10:32
这些我考虑过了,现在就同一文件号的几条记录进行比较,我的思路是第一条和第二条比较得出结果一,第二条和第三条比较得出结果二,结果一根据第二条和第三条比较类型(连续不连续)再与结果二进行组合,然后在往下比较,如此往复,直到最后得出结果。最后的结果只有一个
#19
beijiquan2014-12-31 10:34
怎么没办法截图啊
只有本站会员才能查看附件,请 登录

图中的缓冲地址就是最终结果
#20
beijiquan2014-12-31 11:16
只有本站会员才能查看附件,请 登录

按照字符串的长度现在能得到正确结果了,总觉得方法不恰当。
#21
lianyicq2014-12-31 11:37
C-03-05300    A    042    C    08   
C-03-05300    A    042    C    09   
C-03-05300    A    042    C    10    A042C08-10/A043A01/P043A01/B01
C-03-05300    A    043    A    01
C-03-05300    P    043    A    01
C-03-05300    P    043    B    01
在你的例子同文件号下增加了两个P排的数据来说明。相应整理了输出结果。(同排,同架,不同道到底是连续和不连续自己落实,例子有矛盾)
根据我建议的思路进行分类。
在同一文件号的前提下对排号分类,此时有两类,输出为A/P(A类与P类之间用/连接)。
第三步要完成两种情况,分别对架分类,第一种A排时,两类分别为042和043,再插入到前步的A类中。第二种P排时,一类043,插入到前步P类中。输出为A042/A043/P043。
第四步要完成三种情况,分别对道分类,第一种A042时,只有C道。第二种A043时,只有A道。第三种P043时,只有AB两道。分别插入到前次输出为A042C/A043A/P043A/B。
最后要完成四种情况,此时要考虑道号的邻接情况,算法自己考虑。此时分别对四种情况分析后插入到前次输出为A042C09-10/A043A01/P043A01/B01

#22
beijiquan2014-12-31 13:24
1、同一文件号不存在排号不同,也就是同一文件号排号只有一个
2、同一文件号,只要架号不同则认为不连续
3、同一文件号,架号相同,层号不同的(层号从A到C,A层满10则进入B层,也就是A10与B01是连续的,B层满10则进入C层,也就是B10与C01是连续的,C层排到10后则架号加一)
#23
xzlxzlxzl2014-12-31 13:58
按你所需的要求修改了下,应该能满足你的要求。
另:注意C-03-05300,你在16楼排的结果为A042C08-10/A043A01,我程序的结果为A042C08-A043A01,我认为我的程序正确,当然,如果认为架号不同即为不连续,对算法稍作修改即可,你自己去琢磨下,很简单处理的。再就是你在一楼说一排是40个架,我原程序一直把40作为架号上限,但你C-03-05300却出现了架号为43,搞的我调半天。
只有本站会员才能查看附件,请 登录


既然已下载,就删了

[ 本帖最后由 xzlxzlxzl 于 2014-12-31 14:14 编辑 ]
#24
beijiquan2014-12-31 14:11
谢谢各楼的帮助,真是学习了
1