Link to home
Start Free TrialLog in
Avatar of taz8020
taz8020Flag for United Kingdom of Great Britain and Northern Ireland

asked on

How to speed up VBA Code ADODB Recordset updates

Please help I am new to VBA as you will see from my code. Probelm is i am trying to up date someone elses table that I can not alter. I Need to check if a row exists and if not add it. The code I have written works  but very slow. They do not have a autonumber so i look up the max number first. I have a list of variables in my table the other table should have. So I read through them and then check if they exist if not add them.
Public Function AddVaribales(ProductRef As String)
Dim MaxRecord_New As Long
Dim rst As ADODB.Recordset
Dim strSQL As String
 
Dim VariableID As Long
Dim ContentLevel As Integer
Dim Status As String
Dim nUseParentSetting As Integer
Dim sValue As String
 
nUseParentSetting = 0
sValue = "0"
 
MaxRecord_New = DMax("[nID]", "[UserDefinedProperties]") + 1
 
Set rst = New ADODB.Recordset
'Read what variables should in actinic
strSQL = "SELECT VariablesProductShouldHave.[nVariableID], VariablesProductShouldHave.[sName], VariablesProductShouldHave.[nContentLevel], VariablesProductShouldHave.[sStatus] FROM VariablesProductShouldHave;"
rst.Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdText
Do While Not rst.EOF
VariableID = rst("nVariableID")
ContentLevel = rst("nContentLevel")
Status = rst("sStatus")
 
AddRecords (ProductRef), (VariableID), (ContentLevel), (sStatus), (nUseParentSetting), (sValue)
rst.MoveNext
Loop
MsgBox "Update Complete...."
 
End Function
 
Public Function AddRecords(ProductRef As String, VariableID As Long, ContentLevel As Integer, Status As String, nUseParentSetting As Integer, sValue As String)
 
'Add records to table
Dim rst2 As ADODB.Recordset
Dim strSQL As String
'strSQL = "SELECT * From UserDefinedProperties WHERE nID=0"
' Check If It Exists first
strSQL = "SELECT UserDefinedProperties.*, UserDefinedProperties.[nVariableID], UserDefinedProperties.[sContentID] From UserDefinedProperties WHERE (((UserDefinedProperties.[nVariableID])=" & VariableID & ") AND ((UserDefinedProperties.[sContentID])='" & ProductRef & "'));"
Set rst2 = New ADODB.Recordset
rst2.Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdText
If rst2.EOF = True Then
rst2.Close
Set rst2 = Nothing
strSQL = "SELECT * From UserDefinedProperties WHERE nID=0"
Set rst2 = New ADODB.Recordset
rst2.Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdText
rst2.AddNew
rst2("nID") = MaxRecord_New
rst2("nUseParentSetting") = nUseParentSetting
rst2("sValue") = sValue
rst2("sContentID") = ProductRef
rst2("nContentLevel") = ContentLevel
rst2("sStatus") = Status
rst2("nVariableID") = VariableID
rst2.Update
MaxRecord_New = MaxRecord_New + 1
End If
 
rst2.Close
Set rst2 = Nothing
End Function

Open in new window

Avatar of Jim P.
Jim P.
Flag of United States of America image

You have two functions here: AddVariables & AddRecords

This should be able to be done in one. Can you give some sample data and how you call these functions?
Avatar of taz8020

ASKER

Table 1 ' where i list the variables the other table should have
________________
ID     VariableID   VariableName
1       86968         Un-Printed
2       09709         Printed

Table 2 , Where the variables should be
nID     nVariableID    nUseParentSetting   sValue    sContentID   nContentLevel   sStatus
356    86968            0                               £1.00      CA01            2                       N
357    09709            0                               £1.00      CA01            2                       N

Table 3 list of Products
ProductRef   Dec                      Price
CA01            Un-Printed            £1.05
CA01            Printed 1 Colour   £1.05

When I add a new product I Call AddVaribales(ProductRef)

Hope this makes sense
Avatar of Gustav Brock
Open rst2 first with the full table.
Find the highest ID.

Run the loop.
For every record in rst, use Find to locate the ID.
If not found, add the record using next ID.

When the loop is finished, close both recordsets.

/gustav
ASKER CERTIFIED SOLUTION
Avatar of Leigh Purvis
Leigh Purvis
Flag of United Kingdom of Great Britain and Northern Ireland image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of taz8020

ASKER

Hi Thanks I have done this through sql now, but thank you at least I know how to do it in future.