Hi everyone!
I have some questions, maybe someone can help me...
I write script for table comparing, but it works wery slovly. There is the script, can anyone give some tip how can I make this process faster and if it is possible in VB.
The idea is to compare two tables and if there is some distinction, then is written in third table. Some tables contains more than 200 000 rows and each row contain approximatelly 30 parameeters (columns).
*************** *************** *************** *************** *************** *************** ***
Option Compare Database
Sub Parametru_Izmai nas()
Dim bssSiemens As Database
Dim rstTableNew As Recordset, rstTableOld As Recordset, rstParamChange As Recordset
Dim rstKonf As Recordset
Dim n As Long, tx As Integer, a As Integer
Dim fname1 As String, fname2 As String, fname3 As String, fname4 As String
Dim TableNew As Variant, TableOld As String, TableList As Variant
Dim strCriteria As String, strCriteriaSect As String
Dim NewParam As Variant, OldParam As Variant
Set bssSiemens = CurrentDb
Set rstParamChange = bssSiemens.Open Recordset("Izma inas", dbOpenDynaset)
Set rstKonf = bssSiemens.Open Recordset("Konf iguracija", dbOpenDynaset)
For a = 2 To 5
'If a = 1 Then
' TableList = Array("Bsc")
ElseIf a = 2 Then
TableList = Array("Btsm")
ElseIf a = 3 Then
TableList = Array("Bts")
ElseIf a = 4 Then
TableList = Array("AdjC")
ElseIf a = 5 Then
TableList = Array("Chan")
End If
For Each TableNew In TableList
TableOld = TableNew & "Old"
Set rstTableNew = bssSiemens.Open Recordset(Table New)
Set rstTableOld = bssSiemens.Open Recordset(Table Old, dbOpenDynaset)
If rstTableNew.Rec ordCount = 0 Then GoTo 300
rstTableNew.Mov eFirst
fname1 = rstTableNew.Fie lds(0).Name
fname2 = rstTableNew.Fie lds(1).Name
fname3 = rstTableNew.Fie lds(2).Name
fname4 = rstTableNew.Fie lds(3).Name
fname5 = rstTableNew.Fie lds(4).Name
Do While rstTableNew.EOF = False
NewParam = rstTableNew.Get Rows(1)
id1 = NewParam(0, 0)
id2 = NewParam(1, 0)
id3 = NewParam(2, 0)
id4 = NewParam(3, 0)
id5 = NewParam(4, 0)
If a = 2 Then
strCriteria = "[" & fname1 & "]=" & id1 & " AND [" & fname2 & "]=" & id2
ElseIf a = 2 Then
strCriteria = "[" & fname1 & "]=" & id1 & " AND [" & fname2 & "]=" & id2 & " AND [" & fname3 & "]=" & id3
ElseIf a = 4 Then
strCriteria = "[" & fname1 & "]=" & id1 & " AND [" & fname2 & "]=" & id2 & " AND [" & fname3 & "]=" & id3 & " AND [" & fname4 & "]=" & id4
ElseIf a = 4 Then
strCriteria = "[" & fname1 & "]=" & id1 & " AND [" & fname2 & "]=" & id2 & " AND [" & fname3 & "]=" & id3 & " AND [" & fname4 & "]=" & id4 & " AND [" & fname5 & "]=" & id5
Else
strCriteria = "[" & fname1 & "]=" & id1
End If
strCriteriaSect = "[bsc]=" & id1 & " AND [btsm]=" & id2 & " AND [bts]=" & id3
rstKonf.FindFir st strCriteriaSect
rstTableOld.Fin dFirst strCriteria
If rstTableOld.NoM atch Then
rstParamChange. AddNew
rstParamChange! Date = Date - 1
rstParamChange! id1 = id1
rstParamChange! id2 = id2
If a = 3 Then rstParamChange! id3 = id3
If a = 4 Then rstParamChange! id3 = id3
If a = 4 Then rstParamChange! id4 = id4
If a = 5 Then rstParamChange! id3 = id3
If a = 5 Then rstParamChange! id4 = id4
If a = 5 Then rstParamChange! id5 = id5
rstParamChange! Table = TableNew
rstParamChange. Update
rstParamChange. Requery
GoTo 100
Else
OldParam = rstTableOld.Get Rows(1)
For n = 0 To rstTableNew.Fie lds.Count - 1
If NewParam(n, 0) = OldParam(n, 0) Then
tx = 1
Else
If IsNull(NewParam (n, 0)) And IsNull(OldParam (n, 0)) Then GoTo 200
rstParamChange. AddNew
rstParamChange! SectorName = rstKonf.Fields( "SectorName ")
rstParamChange! Date = Date - 1
rstParamChange! id1 = NewParam(0, 0)
rstParamChange! id2 = NewParam(1, 0)
rstParamChange! id3 = NewParam(2, 0)
rstParamChange! id4 = NewParam(3, 0)
rstParamChange! id5 = NewParam(4, 0)
rstParamChange! Table = TableNew
rstParamChange! Parameter = rstTableNew.Fie lds(n).Name
rstParamChange! new = NewParam(n, 0)
rstParamChange! old = OldParam(n, 0)
rstParamChange. Update
rstParamChange. Requery
End If
200
Next n
End If
100
Loop
300
Next
Next a
End Sub
I have some questions, maybe someone can help me...
I write script for table comparing, but it works wery slovly. There is the script, can anyone give some tip how can I make this process faster and if it is possible in VB.
The idea is to compare two tables and if there is some distinction, then is written in third table. Some tables contains more than 200 000 rows and each row contain approximatelly 30 parameeters (columns).
*************** *************** *************** *************** *************** *************** ***
Option Compare Database
Sub Parametru_Izmai nas()
Dim bssSiemens As Database
Dim rstTableNew As Recordset, rstTableOld As Recordset, rstParamChange As Recordset
Dim rstKonf As Recordset
Dim n As Long, tx As Integer, a As Integer
Dim fname1 As String, fname2 As String, fname3 As String, fname4 As String
Dim TableNew As Variant, TableOld As String, TableList As Variant
Dim strCriteria As String, strCriteriaSect As String
Dim NewParam As Variant, OldParam As Variant
Set bssSiemens = CurrentDb
Set rstParamChange = bssSiemens.Open Recordset("Izma inas", dbOpenDynaset)
Set rstKonf = bssSiemens.Open Recordset("Konf iguracija", dbOpenDynaset)
For a = 2 To 5
'If a = 1 Then
' TableList = Array("Bsc")
ElseIf a = 2 Then
TableList = Array("Btsm")
ElseIf a = 3 Then
TableList = Array("Bts")
ElseIf a = 4 Then
TableList = Array("AdjC")
ElseIf a = 5 Then
TableList = Array("Chan")
End If
For Each TableNew In TableList
TableOld = TableNew & "Old"
Set rstTableNew = bssSiemens.Open Recordset(Table New)
Set rstTableOld = bssSiemens.Open Recordset(Table Old, dbOpenDynaset)
If rstTableNew.Rec ordCount = 0 Then GoTo 300
rstTableNew.Mov eFirst
fname1 = rstTableNew.Fie lds(0).Name
fname2 = rstTableNew.Fie lds(1).Name
fname3 = rstTableNew.Fie lds(2).Name
fname4 = rstTableNew.Fie lds(3).Name
fname5 = rstTableNew.Fie lds(4).Name
Do While rstTableNew.EOF = False
NewParam = rstTableNew.Get Rows(1)
id1 = NewParam(0, 0)
id2 = NewParam(1, 0)
id3 = NewParam(2, 0)
id4 = NewParam(3, 0)
id5 = NewParam(4, 0)
If a = 2 Then
strCriteria = "[" & fname1 & "]=" & id1 & " AND [" & fname2 & "]=" & id2
ElseIf a = 2 Then
strCriteria = "[" & fname1 & "]=" & id1 & " AND [" & fname2 & "]=" & id2 & " AND [" & fname3 & "]=" & id3
ElseIf a = 4 Then
strCriteria = "[" & fname1 & "]=" & id1 & " AND [" & fname2 & "]=" & id2 & " AND [" & fname3 & "]=" & id3 & " AND [" & fname4 & "]=" & id4
ElseIf a = 4 Then
strCriteria = "[" & fname1 & "]=" & id1 & " AND [" & fname2 & "]=" & id2 & " AND [" & fname3 & "]=" & id3 & " AND [" & fname4 & "]=" & id4 & " AND [" & fname5 & "]=" & id5
Else
strCriteria = "[" & fname1 & "]=" & id1
End If
strCriteriaSect = "[bsc]=" & id1 & " AND [btsm]=" & id2 & " AND [bts]=" & id3
rstKonf.FindFir st strCriteriaSect
rstTableOld.Fin dFirst strCriteria
If rstTableOld.NoM atch Then
rstParamChange. AddNew
rstParamChange! Date = Date - 1
rstParamChange! id1 = id1
rstParamChange! id2 = id2
If a = 3 Then rstParamChange! id3 = id3
If a = 4 Then rstParamChange! id3 = id3
If a = 4 Then rstParamChange! id4 = id4
If a = 5 Then rstParamChange! id3 = id3
If a = 5 Then rstParamChange! id4 = id4
If a = 5 Then rstParamChange! id5 = id5
rstParamChange! Table = TableNew
rstParamChange. Update
rstParamChange. Requery
GoTo 100
Else
OldParam = rstTableOld.Get Rows(1)
For n = 0 To rstTableNew.Fie lds.Count - 1
If NewParam(n, 0) = OldParam(n, 0) Then
tx = 1
Else
If IsNull(NewParam (n, 0)) And IsNull(OldParam (n, 0)) Then GoTo 200
rstParamChange. AddNew
rstParamChange! SectorName = rstKonf.Fields( "SectorName ")
rstParamChange! Date = Date - 1
rstParamChange! id1 = NewParam(0, 0)
rstParamChange! id2 = NewParam(1, 0)
rstParamChange! id3 = NewParam(2, 0)
rstParamChange! id4 = NewParam(3, 0)
rstParamChange! id5 = NewParam(4, 0)
rstParamChange! Table = TableNew
rstParamChange! Parameter = rstTableNew.Fie lds(n).Name
rstParamChange! new = NewParam(n, 0)
rstParamChange! old = OldParam(n, 0)
rstParamChange. Update
rstParamChange. Requery
End If
200
Next n
End If
100
Loop
300
Next
Next a
End Sub
Comment