Solved

Run Stored Update Query using VBA (from Word)

Posted on 2010-08-16
5
623 Views
Last Modified: 2012-05-10
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
Comment
Question by:MonteDelMar
  • 3
  • 2
5 Comments
 
LVL 44

Expert Comment

by:Leigh Purvis
Comment Utility
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
 

Author Comment

by:MonteDelMar
Comment Utility
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
 
LVL 44

Accepted Solution

by:
Leigh Purvis earned 500 total points
Comment Utility
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
 

Author Closing Comment

by:MonteDelMar
Comment Utility
Brilliant.  Thank you so much.
0
 
LVL 44

Expert Comment

by:Leigh Purvis
Comment Utility
No problemo
0

Featured Post

Enabling OSINT in Activity Based Intelligence

Activity based intelligence (ABI) requires access to all available sources of data. Recorded Future allows analysts to observe structured data on the open, deep, and dark web.

Join & Write a Comment

Introduction The Visual Basic for Applications (VBA) language is at the heart of every application that you write. It is your key to taking Access beyond the world of wizards into a world where anything is possible. This article introduces you to…
Shortcuts in Word Just the other day I had a training for Microsoft and they wanted me to show how well the new Windows and Office behaved on a touch device, which by the way is great, but it was only then that I realized that using keyboard shortc…
In Microsoft Access, learn different ways of passing a string value within a string argument. Also learn what a “Type Mis-match” error is about.
In Microsoft Access, learn how to use Dlookup and other domain aggregate functions and one method of specifying a string value within a string. Specify the first argument, which is the expression to be returned: Specify the second argument, which …

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now