Calling XML Web Services over the Web Using the Web Service References Tool and Microsoft Access

This content is no longer actively maintained. It is provided as is, for anyone who may still be using these technologies, with no warranties or claims of accuracy with regard to the most recent product version or service release.

 

Frank C. Rice
Microsoft Corporation

January 2002

Applies to:
     Microsoft Access 2002

Summary: How XML Web services can add capabilities to Microsoft Office applications. To illustrate, a Microsoft Access 2002 customer tracking and feedback application utilizing XML Web services is explored. (19 printed pages)

Contents

Introduction
The Web Service Demo Database
Conclusion

Introduction

XML Web services are new and innovative standalone applications. At their core, they provide a way for applications to exchange data and processing capability. For example, your application might pass a string representing a book International Standard Book Number (ISBN) to an XML Web service and receive price quotes from three top book retailers back from the service. In this article, we'll explore integrating XML Web services into Microsoft® Office applications. We'll do this by adding three XML Web services to a customer tracking and feedback application in a Microsoft Access 2002 database.

To run this application, set a reference to the Microsoft SOAP Type Library (MSSOAP1.DLL) from the References dialog box (Tools menu), which is available from the Office Visual Basic® Editor. This type library comes with Microsoft Windows® XP or it can be obtained by installing the SOAP Toolkit 2.0 Redistributable Files. For more information about obtaining the SOAP Toolkit 2.0 Redistributable Files, see the MSDN Web Services Developer Center.

You will also need to install the Web Service References Tool. This Tool provides a user interface for finding and selecting XML Web services. It is included in the Office XP Web Services Toolkit.

The XML Web Service Demo Database

The XML Web service demo database (odc_WSDemo.mdb) is a Microsoft Access 2002 database containing a custom application that uses three of the many XML Web services that are available on the Internet (see the \samples\OrderDesk folder in the Office XP Web Services Toolkit). We will use the application to illustrate how XML Web services can be integrated into your Office applications. The database contains the following:

  • TblCustomers—The Customers table from the Northwind.mdb file that ships with Access.
  • qryUS_Customers—A query based on the tblCustomers table, filtered to display only customers that reside in the United States.
  • frmUS_Customers—A customer contact form that can be used to add new customers or collect additional information about existing customers. The form is based on the qryUS_Customers query. This form includes command buttons and code behind the form that link to the eraServer.net ZipCodeResolver XML Web service and MXChecker (e-mail validation) XML Web service. It also includes a command button that opens the customer feedback form (frmFeedback) to the current record.
  • frmFeedback—A form that can be used to collect and store feedback received from a particular customer as well as create a reply. The form uses the Alta Vista BabelFish XML Web service, which translates text from one language to another language.
  • mod_TranslateComments—A module that contains code which processes feedback and reply text from the frmFeedback form and calls the BabelFish XML Web service.
  • clsws_BabelFish—The Alta Vista BabelFish XML Web service class module. This XML Web service translates text between French, German, Italian, Portuguese, or Spanish, and English. This code is automatically generated when the XML Web service is selected from the Web Service References Tool. For more information about the BabelFish Web service, see the Alta Vista Help page.
  • clsws_MXChecker—The eraServer.net MXChecker XML Web service class module. This XML Web service will validate any e-mail address by checking DNS services to see if the assigned e-mail server recognizes the e-mail address as a valid entry.
  • clsws_ZipCodeResolver—The eraServer.net ZipCodeResolver XML Web service class module. This XML Web service allows you to validate partial United States mailing addresses against the U.S. Postal Service database. You can enter street, city, and state information and get a ZIP+4 code (NNNNN-NNNN) return value. Although not described here, the XML Web service will also return the standard five-digit standard ZIP code (NNNNN) and corrected address (complete street, city, state, and ZIP+4). For more information about this and the other XML Web services offered by eraServer.net, see their Web page.

The frmUS_Customers form

The frmUS_Customers form is the default form that is displayed when the database is opened.

Aa140266.odc_wsaccess01(en-us,office.10).gif

Figure 1. The frmUS_Customers form

This form can be used to review information on existing customers or add new customers. The form uses command buttons to invoke two XML Web services: The Validate Zip Code command button calls the eraServer.net ZipCodeResolver XML Web service, and the Validate E-Mail command button calls the eraServer.net MXChecker XML Web service. The Customer Feedback command button opens the frmFeedback form to the current record. Finally, the Save and Close buttons save the current record and close the form, respectively.

Let's examine the code behind the Validate Zip Code command button (cmdValidate_Click). This code is invoked from the cmdValidate command button's OnClick event. The first section provides comments about the purpose of the code and other administrative information.

Private Sub cmdValidate_Click()

    ' Purpose: Calls eraServer.net's ZIPCodeResolver Web service which
    ' validates partial United States zip codes against the U.S. Postal
    ' Service database.

    ' Returns:
    '   The zip code in ZIP+4 code (NNNNN-NNNN) format.

    ' Author: Frank Rice

    ' The class module file clsws_ZipCodeResolver must be
    ' included in this project.

A class variable is then dimensioned representing the clsws_ZipCodeResolver object.

Dim ExampVar As New clsws_ZipCodeResolver

This object is defined in the clsws_ZipCodeResolver class module and is used to invoke the wsm_FullZipCode method of that class and pass the address and return ZIP Code value.

Dim strZip As String

The strZip variable represents the ZIP Code+4 value returned from the XML Web service.

Next, error handling code is initialized.

On Error GoTo Err_cmdValidate_Click

The code then checks for and handles any empty address fields.

' Catch any empty input fields.
    If IsNull(Me!Address) Or IsNull(Me!City) Or IsNull(Me!Region) Then
        MsgBox "You must include a value in the Address, City, and " _
        & "State fields. Please enter as much information as you " _
        & "can in each field and retry.", vbOKOnly
        Exit Sub
    End If

Using an XML Web service is dependent on establishing a connection with the Internet or intranet site where the XML Web service resides and is subject to all of the pitfalls of establishing any Web-based connection. For example, the Web server may be unavailable or the user may be using a slow network connection to access the service. To indicate that some activity is taking place, we display an hourglass.

' Display an hourglass.
    DoCmd.Hourglass True

Next we invoke the XML Web service by using the wsm_FullZipCode method. The wsm_FullZipCode method is just one of the methods available for use with the clsws_ZipCodeResolver object.

' Call the wsm_FullZipCode method of the ZipCodeResolver Web _
' Service.
    strZip = ExampVar.wsm_FullZipCode(str_accessCode:="9999", _
    str_address:=Trim(Me!Address), str_city:=Trim(Me!City), _
    str_state:=Trim(Me!Region))

We call the Web method with named arguments representing an access code that is used to test the XML Web service and the contents of the address text boxes located on our form.

If the XML Web service is unable to find a valid ZIP Code+4 for the customer address, it returns the value "00000-0000" so we include code to handle this return. The same code may be returned if any of the address fields contain incomplete or misspelled information.

' Capture an invalid return.
    If strZip = "00000-0000" Then
       MsgBox "The XML Web Service returned an invalid zip code." _
       & "This can be caused by an invalid or misspelled address," _
       & "city, or state. Please check these entries and retry.", 
         vbOKOnly, _
       "Zip Code Validation error"
    Else
        ' Zip code was valid.
        Me!PostalCode = strZip
        Beep
    End If

Finally, we include the code to exit the subroutine before encountering error handling and the error handling code.

Exit_cmdValidate_Click:
    ' Restore the mouse.
    DoCmd.Hourglass False
    Exit Sub

Err_cmdValidate_Click:
    ' Handles time-out error if the XML Web Service or Internet isn't _
    ' available.
    If Err.Number = -2147024809 Then
       MsgBox "The XML Web Service is currently unavailable. Please " _
       & "try again later.", vbOKOnly
       Resume Exit_cmdValidate_Click
    Else
       MsgBox Err.Description
       Resume Exit_cmdValidate_Click
    End If
End Sub

Now we'll look at the class module code generated by the Web Service References Tool.

Option Compare Database

'*****************************************************************
' This class was created by the Web Service References tool.
'
' Created: 10/31/2001 11:28:23 AM
'
' Description:
' This class is a Visual Basic for Applications class representation
' of the Web service ZipCodeResolver as defined by 
' http://webservices.eraserver.net/zipcoderesolver/
' zipcoderesolver.asmx?wsdl,
'
' This class only contains methods that use simple data types,
' as defined in the WSDL.
'
' To Use:
' Dimension a variable as new clsws_ZipCodeResolver, and then write 
' code to use the methods provided by the class.
'
' Example:
'   Dim ExampVar as New clsws_ZipCodeResolver
'   Debug.Print ExampVar.wsm_FullZipCode("Sample Input")
'
' Changes to the code in this class may result in incorrect behavior.
'
'*****************************************************************

The first section provides comments about how the code was created, followed by instructions on how to declare and instantiate this class in code. Class modules generated by the tool always start with the prefix clsws_ followed by the XML Web service name.

Next, two internal class variables are dimensioned, representing the SoapClient proxy object and the URL to the XML Web service's WSDL file, respectively.

' Dimensioning private class variables.
Private sc_ZipCodeResolver As SoapClient
Private Const c_WSDL_URL As String = _
  "http://webservices.eraserver.net/zipcoderesolver/
  zipcoderesolver.asmx?wsdl"

The Class_Initialize method is used to instantiate the SoapClient proxy object. This proxy object is used to pass XML Web service calls between the client code and the Web server.

Private Sub Class_Initialize()
'*************************************************************
' Subroutine will be called each time the class is instantiated.
' Creates sc_ZipCodeResolver as new SoapClient, and then
' initializes sc_ZipCodeResolver.mssoapinit with WSDL file found in
' http://webservices.eraserver.net/zipcoderesolver/zipcoderesolver.
' asmx?wsdl.
'*************************************************************

    Set sc_ZipCodeResolver = New SoapClient
    sc_ZipCodeResolver.mssoapinit c_WSDL_URL
 
End Sub

The Class_Terminate method is used to clean up resources that are no longer needed, namely, the SoapClient proxy object.

Private Sub Class_Terminate()
'*************************************************************
' Subroutine will be called each time the class is destructed.
' Sets sc_ZipCodeResolver to Nothing.
'*************************************************************

    'Error Trap
    On Error GoTo Class_TerminateTrap

    Set sc_ZipCodeResolver = Nothing

Exit Sub

Class_TerminateTrap:
    ZipCodeResolverErrorHandler "Class_Terminate"
End Sub

The ZipCodeResolverErrorHandler subroutine is used to handle any errors raised by the Web server hosting the XML Web service. This subroutine's name is always prefixed by the XML Web service name followed by the text ErrorHandler.

Private Sub ZipCodeResolverErrorHandler(str_Function As String)
'*****************************************************************
' This subroutine is the class error handler. It can be called from any
' class subroutine or function
' when that subroutine or function encounters an error. Then, it will
' raise the error along with the
' name of the calling subroutine or function
'
'*****************************************************************
 
    ' SOAP Error
    If sc_ZipCodeResolver.faultcode <> "" Then
        Err.Raise vbObjectError, str_Function, _
           sc_ZipCodeResolver.faultstring
    ' Non SOAP Error
    Else
        Err.Raise Err.Number, str_Function, Err.Description
    End If
 
End Sub

Finally, the XML Web service's methods are declared. In this case there are five Web methods. Although we only use one method in our sample, I've left the other methods in for you to experiment with on your own. The five methods are:

  • wsm_FullZipCode—returns the ZIP+4 Code (NNNNN-NNNN).
  • wsm_ShortZipCode—returns the standard ZIP Code (NNNNN).
  • wsm_CorrectedAddressHtml—returns a corrected address (complete street, city, state, and ZIP+4) in HTML for display on a Web page.
  • wsm_CorrectedAddressXml—returns an XML structure that includes Street, City, State, ShortZip, and FullZip elements.
  • wsm_VersionInfo—returns the XML Web service name, current version, date, and copyright information.
Public Function wsm_FullZipCode(ByVal str_accessCode As String, ByVal
str_address As String, ByVal str_city As String, ByVal str_state As
String) As String
'*************************************************************
' Proxy function created from http://webservices.eraserver.net
    /zipcoderesolver/zipcoderesolver.asmx?wsdl
'*************************************************************

    'Set error trap
    On Error GoTo wsm_FullZipCodeTrap

    wsm_FullZipCode = sc_ZipCodeResolver.FullZipCode(str_accessCode,
      str_address, str_city, str_state)

Exit Function
wsm_FullZipCodeTrap:
    ZipCodeResolverErrorHandler "wsm_FullZipCode"
End Function

Public Function wsm_ShortZipCode(ByVal str_accessCode As String, ByVal
  str_address As String, ByVal str_city As String, ByVal str_state As
  String) As String
'*************************************************************
' Proxy function created from http://webservices.eraserver.net
    /zipcoderesolver/zipcoderesolver.asmx?wsdl
'*************************************************************
 
    'Set error trap
    On Error GoTo wsm_ShortZipCodeTrap

    wsm_ShortZipCode = sc_ZipCodeResolver.ShortZipCode(str_accessCode,
      str_address, str_city, str_state)

Exit Function
wsm_ShortZipCodeTrap:
    ZipCodeResolverErrorHandler "wsm_ShortZipCode"
End Function

Public Function wsm_CorrectedAddressHtml(ByVal str_accessCode As
String, ByVal str_address As String, ByVal str_city As String, ByVal
str_state As String) As String
'*************************************************************
' Proxy function created from http://webservices.eraserver.net
    /zipcoderesolver/zipcoderesolver.asmx?wsdl
'*************************************************************

    'Set error trap
    On Error GoTo wsm_CorrectedAddressHtmlTrap

    wsm_CorrectedAddressHtml = sc_ZipCodeResolver
      .CorrectedAddressHtml(str_accessCode, str_address, str_city,
      str_state)

Exit Function
wsm_CorrectedAddressHtmlTrap:
    ZipCodeResolverErrorHandler "wsm_CorrectedAddressHtml"
End Function

Public Function wsm_CorrectedAddressXml(ByVal str_accessCode As String,
  ByVal str_address As String, ByVal str_city As String, ByVal 
  str_state As String) As Object
'*************************************************************
' Proxy function created from http://webservices.eraserver.net/
    zipcoderesolver/zipcoderesolver.asmx?wsdl
'*************************************************************

    'Set error trap
    On Error GoTo wsm_CorrectedAddressXmlTrap

    wsm_CorrectedAddressXml = sc_ZipCodeResolver
      .CorrectedAddressXml(str_accessCode, str_address, str_city, 
      str_state)

Exit Function
wsm_CorrectedAddressXmlTrap:
    ZipCodeResolverErrorHandler "wsm_CorrectedAddressXml"
End Function

Public Function wsm_VersionInfo() As String
'*************************************************************
' Proxy function created from http://webservices.eraserver.net
    /zipcoderesolver/zipcoderesolver.asmx?wsdl
'*************************************************************

    'Set error trap
    On Error GoTo wsm_VersionInfoTrap

    wsm_VersionInfo = sc_ZipCodeResolver.VersionInfo()

Exit Function
wsm_VersionInfoTrap:
    ZipCodeResolverErrorHandler "wsm_VersionInfo"
End Function

Web method signatures created by this tool:

  • Are always declared as Public Function.
  • Are always prefixed by the text wsm_ followed by the XML Web service method name.
  • List input parameters with a data type prefix followed by the Web method parameter

The Validate E-Mail command button uses similar code and logic to invoke the eraServer.net MXChecker XML Web service and will not be detailed here.

The Customer Feedback command button on the frmUS_Customers form opens the frmFeedback form to display the current record. This form highlights another useful XML Web service that can be used to translate between languages. Let's look at that form and code in more detail.

The frmFeedback form

The frmFeedback form enables the user to enter customer feedback associated with a particular customer and translate it from one language to English by using code in the Translate to English command button's OnClick event. It also provides the means to enter replies in English and translate those into French, German, Italian, Portuguese, or Spanish.

Aa140266.odc_wsaccess02(en-us,office.10).gif

Figure 2. The frmFeedback form

The form also includes option buttons to enter the source and type of feedback received. The controls can be used to track additional information about customer feedback and are not detailed here.

Let's examine the code behind the Translate to English command button. The first section provides comments about the purpose of the code and other administrative information. Two String variables are then dimensioned representing the text to be translated and the return value from the XML Web service.

    ' Purpose: Calls Alta Vista's BabelFish XML Web Service which
    ' translates from one language to another.

    ' Returns:
    '   The translated text.

    ' Authors:
    '   Paul Cornell
    '   Frank Rice

    ' The Alta Vista class module file clsws_BabelFish must be
    ' included in this project.

    Dim strTextToTranslate As String
    Dim strOriginalLanguage As String

Next, error handling code is initialized.

On Error GoTo Err_cmdTransFB_Click

If the customer text is already in English, as indicated by English being selected in the cboFB_Language combo box control, then we don't need to translate it so we just copy the text from the txtFeedback text box to the txtTranslatedFB text box.

' If already English, don't convert.
    If Me.cboFB_Language = "English" Then
        Me.txtFeedback.SetFocus
        strTextToTranslate = Me.txtFeedback.Text
        Me.txtTranslatedFB.SetFocus
        Me.txtTranslatedFB.Text = strTextToTranslate
    Else

Otherwise, we display the hourglass to indicate progress to the user. We then set focus to the txtFeedback text box and set its value on the strTextToTranslate variable.

We also need to get the language setting from the cboFB_Language combo box so we set the focus to that control and initialize the variable strOriginalLanguage. We unlock the txtTranslatedFB text box so that we can copy the translated text from the Web service. Finally, we call the TranslateToEnglish function in the module mod_TranslateComments. We'll discuss this function more, later.

' Otherwise, translate.

        'Display an hourglass.
        DoCmd.Hourglass True

        ' Set focus to Comment box.
        Me.txtFeedback.SetFocus
        ' Get text in box.
        strTextToTranslate = Me.txtFeedback.Text
        ' Set focus to Comment_Language box.
        Me.cboFB_Language.SetFocus
        ' Get text in box.
        strOriginalLanguage = Me.cboFB_Language
        ' Set focus to Comment_English box.
        Me.txtTranslatedFB.SetFocus
        ' Enable changes.
        Me.txtTranslatedFB.Locked = False
        ' Set text in box.
        Me.txtTranslatedFB.Text = _
            mod_TranslateComments.TranslateToEnglish _
                (OriginalText:=strTextToTranslate, _
                OriginalLanguage:=strOriginalLanguage)
        ' Lock control again.
        Me.txtTranslatedFB.Locked = True

        ' Restore mouse.
        DoCmd.Hourglass False
    End If

If all goes well, the TranslateToEnglish function returns the translated text from the BabelFish XML Web service, which is then copied into the txtTranslatedFB text box. The control is again locked to prevent the contents from being edited. We then reset the mouse pointer.

And finally, we include the code to exit the subroutine before encountering error handling and the error handling code.

Exit_cmdTransFB_Click:
    ' Restore mouse, if necessary.
    DoCmd.Hourglass False
    Exit Sub

Err_cmdTransFB_Click:
    MsgBox Err.Description
    Resume Exit_cmdTransFB_Click

Next, we'll look in detail at the TranslateToEnglish and GetLanguageSymbol functions in the mod_TranslateComments module.

The mod_TranslateComments module

The mod_TranslateComments module contains three functions:

  • TranslateToEnglish function—Receives the parameters from the Translate To English command button (cmdTransFB_Click) and then calls the wsm_BabelFish method of the objclsws_BabelFish class. Returns the translated text.
  • TranslateToNative function—Similar functionality to the TranslateToEnglish function except it is called from the Translate Reply command button (cmdTransReply_Click).
  • GetLanguageSymbol function—Converts a human-readable language string into a string that Alta Vista's BabelFish XML Web service can use.

As with the previous code, the first section provides comments about the purpose of the code and other administrative information.

Option Explicit

Public Function TranslateToEnglish(ByVal OriginalText As String, _
        ByVal OriginalLanguage As String) As String

    ' Purpose: Translates text from French, German, Italian,
    ' Portuguese, or Spanish into English using the Alta Vista
    ' BabelFish Web service.

    ' Accepts:
    '   OriginalText: The original text in the user's native
    '   language.
    '   OriginalLanguage: The user's native language
    '   (possible values include the strings "French",
    '   "German", "Italian", "Portuguese", or "Spanish").

    ' Returns:
    '   The translated text in English.

    ' Author: Paul Cornell

    ' The class module file clsws_BabelFish.cls must be included
    ' in this project.

A class variable is then declared as an object reference for the clsws_BabelFish class. We also dimension a string variable strLangSymbol that contains the return value from the GetLanguageSymbol function.

Dim objclsws_BabelFish As clsws_BabelFish
Dim strLangSymbol As String

Next we instantiate the reference to the clsws_BabelFish class by setting it equal to the New keyword followed by the objclsws_BabelFish, the name of the class to which the object refers.

Set objclsws_BabelFish = New clsws_BabelFish

We then call the GetLanguageSymbol function to convert the friendly name of the language to translate to, which we got from the combo box (cboFB_Language), to a string that objclsws_BabelFish can recognize.

strLangSymbol = GetLanguageSymbol(OriginalLanguage:=OriginalLanguage)

Finally we call the wsm_BabelFish method of the objclsws_BabelFish object and pass it named arguments indicating the language to translate to ("_en" for English, in this case) and the original text.

TranslateToEnglish = objclsws_BabelFish.wsm_BabelFish _
        (str_translationmode:=strLangSymbol & "_en", _
        str_sourcedata:=OriginalText)

The text is translated by Alta Vista's BabelFish XML Web service and then returned by the TranslateToEnglish function to the calling procedure. It is then assigned to the txtTranslatedFB text box on the frmFeedback form.

The GetLanguageSymbol function converts the language selection (the OriginalLanguage parameter) from the cboFB_Language combo box located on the frmFeedback form into a string that Alta Vista's BabelFish XML Web service can use.

The first section provides comments about the purpose of the code and other information.

Public Function GetLanguageSymbol(OriginalLanguage As String) _
        As String

    ' Purpose: Converts a human-readable language string into
    ' a string that Alta Vista's BabelFish Web service can use.

    ' Accepts: A human-readable language string (possible values
    ' include the strings "French", "German",
    ' "Italian", "Portuguese", or "Spanish").

    ' Returns: The Alta Vista BabelFish Web service-compatible
    ' string.

    ' Author: Paul Cornell

The OriginalLanguage parameter is processed through a Select Case statement, which returns the correct language code, in this case en.

Select Case OriginalLanguage
        Case "English"
            GetLanguageSymbol = "en"
        Case "French"
            GetLanguageSymbol = "fr"
        Case "German"
            GetLanguageSymbol = "de"
        Case "Italian"
            GetLanguageSymbol = "it"
        Case "Portuguese"
            GetLanguageSymbol = "pt"
        Case "Spanish"
            GetLanguageSymbol = "es"
    End Select    
End Function

The mod_TranslateComments module also contains the TranslateToNative function, which provides similar translation functionality for use in translating replies entered in the frmFeedback form from English to another language. A detailed description of that process and code will not be covered here.

Using the XML Web Services

Now that we've discussed the code included in the database, let's quickly demonstrate using the service.

After opening the database, the frmUS_Customers form is displayed with the Great Lakes Food Market as the current record (see Figure 2). Notice that the value in the Postal Code text box is 97403, which is the short form of the ZIP Code. Assuming that you are connected to the Internet and the eraServer.net Web server is available, go ahead and click the Validate Zip Code button. The mouse pointer turns into an hourglass while the code is running. After a short period of time, the Postal Code text box is updated with the ZIP Code+4 value, the mouse pointer returns, and the application beeps to let you know that the process is completed.

Aa140266.odc_wsaccess03(en-us,office.10).gif

Figure 3. The frmUS_Customers form with updated ZIP Code

If the XML Web service was unable to find a valid ZIP Code, you would have seen the following message box.

Aa140266.odc_wsaccess04(en-us,office.10).gif

Figure 4. The Zip Code Validation error message box

The Validate E-Mail XML Web service works similarly to the Validate Zip Code XML Web service. I will leave it up to you to explore that service. Now, we'll look at the translation service available from the frmFeedback form.

Opening the form, you'll notice that we've included some sample text in the feedback and reply text boxes (see Figure 2). Let's change the text slightly and run the BabelFish XML Web service. Change the text in the Enter reply here text box from We like to pass our savings on to the customer to We think our products are a good value. Then select Italian in the Translate To combo box. Now click the Translate Reply button. The mouse pointer again changes to an hourglass and after a short time, the translated text is displayed. Now the text in the Translated Reply text box reads Pensiamo che i nostri prodotti siano un buono valore.

Just for fun, let's highlight and copy the translated text in the Translated Reply text box and paste it into the Enter comments here text box. Select Italian in the Comment Language combo box and click the Translate To English button. Notice that the text was translated back to our original entry.

Aa140266.odc_wsaccess05(en-us,office.10).gif

Figure 5. The frmFeedback form with the updated text fields

Conclusion

In this article, we briefly explored XML Web services and their use in enhancing your Office applications. We used the Web Service References Tool to quickly and easily add XML Web service class modules to an Access database. And with the addition of two forms and a little VBA code, we created and demonstrated an effective customer tracking and feedback application. However, we have just touched the surface of possibilities for Web services. There are literally dozens of XML Web services currently available on the Internet with many more becoming available daily. It would be well worth your time to explore this vast resource and continue to experiment with creating your own applications with XML Web services.