Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Public Function GetRelated(ByVal id As Integer) As Scripting.Dictionary
  2.     Dim rv As New Scripting.Dictionary
  3.    
  4.     Dim irs As DAO.Recordset
  5.     Set irs = CurrentDb.OpenRecordset("SELECT * FROM [Copy Of Transactions] where Related = " & id & " or ID=" & id)
  6.      If Not (irs.EOF And irs.BOF) Then
  7.          irs.MoveFirst
  8.          Do Until irs.EOF = True
  9.                 Dim rsid As Integer
  10.                 rsid = irs("ID")
  11.                 If Not rv.Exists(rsid) Then rv.Add rsid, rsid
  12.                 If Not IsNull(irs("Related")) Then rsid = irs("Related")
  13.                 If Not rv.Exists(rsid) Then rv.Add rsid, rsid
  14.              irs.MoveNext
  15.          Loop
  16.      End If
  17.      Set GetRelated = rv
  18. End Function
  19.  
  20. Function CloneDictionary(Dict)
  21.   Dim newDict
  22.   Set newDict = CreateObject("Scripting.Dictionary")
  23.  
  24.   For Each Key In Dict.Keys
  25.     newDict.Add Key, Dict(Key)
  26.   Next
  27.   newDict.CompareMode = Dict.CompareMode
  28.  
  29.   Set CloneDictionary = newDict
  30. End Function
  31.  
  32. Public Function Lookup_chains(in_id As Integer) As Scripting.Dictionary
  33.  
  34. Dim rs As DAO.Recordset
  35. Dim ids As New Scripting.Dictionary
  36. Dim oldCount As Integer
  37. ids.Add in_id, in_id
  38. While newCount <> ids.Count
  39.     Dim td As Scripting.Dictionary
  40.     Set td = CloneDictionary(ids)
  41.    
  42.     For Each tdKey In td.Keys
  43.         newCount = ids.Count
  44.         Dim id As Integer
  45.         Dim newIds As Scripting.Dictionary
  46.         Set newIds = GetRelated(tdKey)
  47.         For Each Item In newIds
  48.             Dim x As Integer
  49.             On Error Resume Next
  50.             ids.Add Item, Item
  51.         Next
  52.     Next
  53. Wend
  54.     Set Lookup_chains = ids
  55. End Function
  56. Public Sub process_related()
  57.     Dim irs As DAO.Recordset
  58.     Set irs = CurrentDb.OpenRecordset("SELECT * FROM [Copy Of Transactions]")
  59.      If Not (irs.EOF And irs.BOF) Then
  60.          irs.MoveFirst
  61.          Do Until irs.EOF = True
  62.                 Dim rsid As Integer
  63.                 rsid = irs("ID")
  64.                     Dim ids As New Scripting.Dictionary
  65.                     Set ids = Lookup_chains(rsid)
  66.                     Dim i As Integer
  67.                     i = 0
  68.                     Dim cond As String
  69.                     cond = ""
  70.                     For Each Key In ids.Keys
  71.                         If i = 0 Then i = Key
  72.                         If Len(cond) > 0 Then
  73.                             cond = cond & "," & CStr(Key)
  74.                         Else: cond = CStr(Key)
  75.                         End If
  76.                         If i > Key Then i = Key
  77.                     Next
  78.                     Dim q As String
  79.                     q = "Update [Copy of Transactions] set MetaID = " & i & ", Related = " & i & " where ID in (" & cond & ")"
  80.                     CurrentDb.Execute q
  81.                  irs.MoveNext
  82.          Loop
  83.      End If
  84.  
  85. End Sub
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement