• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 684
  • Last Modified:

Run Stored Update Query using VBA (from Word)

Hi All

Please can someone tell me how to run a stored update query in an Access database from Word/VBA?  I have got so far but I am clearly missing something.  By the way, the query works correctly if I run it manually from Access.

Thank you for your help as ever.




Public Sub UpdateDetails()
Dim dbMAIN As New ADODB.Connection
Dim qQuery As New ADODB.Command

With dbMAIN
    .ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;" & _
                        "Persist Security Info = False;" & _
                        "Data Source = "C:\Source\Numbering.mdb"
    .Open
End With

With qQuery
    .ActiveConnection = dbMAIN
    .CommandType = adCmdStoredProc
    .CommandText = "qUpdateNumber"
    .Parameters.Append .CreateParameter("NewNumber", adChar, adParamInput, Len("MyNewNumber"), "MyNewNumber")
    .Parameters.Append .CreateParameter("OldNumber", adChar, adParamInput, Len("MyOldNumber"), "MyOldNumber")
    .Parameters.Append .CreateParameter("RecordDate", adChar, adParamInput, Len("MyNewDate"), "MyNewDate")
End With

qQuery.Execute

Set qQuery = Nothing
Set dbMAIN = Nothing
End Sub

Open in new window

0
MonteDelMar
Asked:
MonteDelMar
  • 3
  • 2
1 Solution
 
Leigh PurvisDatabase DeveloperCommented:
Hi
What's the definition of qUpdateNumber?
Are you getting any specific error messages?
The one thing I notice right away is that it's astronomically likely that your parameters are operating upon fields of "Text" type in Access. Which is actually a Unicode VarChar.
So
    .Parameters.Append .CreateParameter("NewNumber", adChar, adParamInput, Len("MyNewNumber"), "MyNewNumber")
would be
    .Parameters.Append .CreateParameter("NewNumber", adWVarChar, adParamInput, Len("MyNewNumber"), "MyNewNumber")
and so forth...
Cheers.
0
 
MonteDelMarAuthor Commented:
Thank you for your response.

I have re-attached the code here to save confusion.  I had renamed some of the fields in the example I sent you as I (mistakenly) thought it would be easier.  

Do you mean the SQL for the Query?  That is

UPDATE ClientNumbers SET ClientNumbers.ArtClientNumber = [NewNumber], ClientNumbers.RenumberDate = [NewDate]
WHERE (((ClientNumbers.ArtClientNumber)=[OldNumber]));

I do not get an error message.  It appears to run but does not update the record.

I just tried changing the Type to adVarWChar but that has not made a difference.
Public Sub UpdateRecord()
Dim dbMAIN As New ADODB.Connection
Dim qQuery As New ADODB.Command

With dbMAIN
    .ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;" & _
                        "Persist Security Info = False;" & _
                        "Data Source =" & strDrive & strLocation & "Numbering.mdb"
    .Open
End With

With qQuery
    .ActiveConnection = dbMAIN
    .CommandType = adCmdStoredProc
    .CommandText = "UpdateClientDetails"
    .Parameters.Append .CreateParameter("NewNumber", adWChar, adParamInput, Len("MyNewClientNumber"), "MyNewClientNumber")
    .Parameters.Append .CreateParameter("OldNumber", adVarWChar, adParamInput, Len("BWC00002"), "BWC00002")
    .Parameters.Append .CreateParameter("RenumberDate", adVarWChar, adParamInput, Len("MyNewDate"), "MyNewDate")
End With

qQuery.Execute

Set qQuery = Nothing
Set dbMAIN = Nothing
End Sub

Open in new window

0
 
Leigh PurvisDatabase DeveloperCommented:
Your parameters are in the wrong order.
Unless you've explicitly gone with named parameters in your code - then you need to be consistent with the order.
With qQuery
    .ActiveConnection = dbMAIN
    .CommandType = adCmdStoredProc
    .CommandText = "UpdateClientDetails"
    .Parameters.Append .CreateParameter("NewNumber", adVarWChar, adParamInput, Len("MyNewClientNumber"), "MyNewClientNumber")
    .Parameters.Append .CreateParameter("RenumberDate", adDate, adParamInput,  8, "MyNewDate")
    .Parameters.Append .CreateParameter("OldNumber", adVarWChar, adParamInput, Len("BWC00002"), "BWC00002")
    .Execute
End With

If you wanted to be more predictable then define your parameters in the query:

PARAMETERS  [NewNumber] Text(50), [NewDate] DateTime, [OldNumber] Text;
UPDATE ClientNumbers SET ClientNumbers.ArtClientNumber = [NewNumber], ClientNumbers.RenumberDate = [NewDate]
WHERE (((ClientNumbers.ArtClientNumber)=[OldNumber]));
That way you are being very clear about the order of parameters.
The alternative is to specify named parameters in your code.

With qQuery
    .ActiveConnection = dbMAIN
    .CommandType = adCmdStoredProc
    .CommandText = "UpdateClientDetails"
    .NamedParameters = True
    .Parameters.Append .CreateParameter("NewNumber", adVarWChar, adParamInput, 50, "MyNewClientNumber")
    .Parameters.Append .CreateParameter("NewDate", adDate, adParamInput,  8, "MyNewDate")
    .Parameters.Append .CreateParameter("OldNumber", adVarWChar, adParamInput, Len("BWC00002"), "BWC00002")
    .Execute
End With


When you can create them in any order you like.
Note that you need ADO 2.6 or newer referenced to support that.
Note that you parameter named now have to match exactly. (They didn't all do so before, but that didn't matter).
Cheers.
0
 
MonteDelMarAuthor Commented:
Brilliant.  Thank you so much.
0
 
Leigh PurvisDatabase DeveloperCommented:
No problemo
0

Featured Post

The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now