Visual Basic Code of the Week (COTW)
http://www.codeoftheweek.com
Issue #43
Online Version at http://www.codeoftheweek.com/membersonly/bi/0042.html (paid subscribers only)
All content and source code is Copyright (c) 1998 by C&D Programming Corp. No part of this issue can be reprinted or distributed in any manner without express written permission of C&D Programming Corp.

Notes about this ezine

If you are not a paid subscriber, you must have signed up for our free trial at http://www.codeoftheweek.com. Our ezine is not an unsolicited message (in other words a spam email). Keep in mind that if you signed up for our free trial you can still receive a total of four issues at no cost to you. After you receive the four issues you will be notified about continuing your subscription.

If you do not wish to continue to receive this ezine, please email us at cancel@codeoftheweek.com

Requirements for this Issue

The source code in this issue is designed for Visual Basic 5.0 32-bit and above. It will work in VB 4.0 with small changes to the error handlers and the parameters in the CopyQuery function. It is geared towards the intermediate to advanced programmer.

If you have any questions about this issue, please email us at questions@codeoftheweek.com

In this Issue

This issue introduces a routine to copy a Microsoft Access query from one database to another. It will also work with any databases that support the QueryDef object and the QueryDefs collections.

CopyQuery

Public Sub CopyQuery(sQueryName As String, sSourceDB As String, sDestinationDB As String, Optional bOverwrite As Boolean = False)

Parameters

Returns

Nothing unless an error occurs. If any error occurs it will be raised to the caller.

Sample Usage

This example shows how to use the CopyQuery subroutine. The first example will copy the query called rpt11 from the src.mdb to the dest.mdb. The second will copy rpt12 from src.mdb to dest.mdb. If the query rpt12 exists in dest.mdb it will automatically be overwritten.

    CopyQuery "rpt11", "e:\temp\src.mdb", "e:\temp\dest.mdb"
    CopyQuery "rpt12", "e:\temp\src.mdb", "e:\temp\dest.mdb", True

Source Code

Just paste this source code into a module called basQueries and include it in your project.

'----------------------------------------------------------------------
'
'   Class Name:     basQueries
'   Written By:     C&D Programming Corp.
'   Create Date:    5/98
'   Copyright:      Copyright 1998 by C&D Programming Corp.  Source
'                   code may not be reproduced except for use in a
'                   compiled executable.  All rights reserved.  If
'                   you would like to reprint any or all of this
'                   code please email us at info@codeoftheweek.com
'----------------------------------------------------------------------
Option Explicit
'
'   Deletes a query from the specified database
'
Public Sub DeleteQuery(sQueryName As String, db As Database)

    On Error GoTo Handler
    db.QueryDefs.Delete sQueryName          ' remove query
    Exit Sub

Handler:
    Err.Raise Err.Number, Err.Source, Err.Description
End Sub
'
'   Returns the QueryDef object of the specified query in the specified database
'   If it is not found in the database the routine returns Nothing
'
Public Function FindQuery(sQueryName As String, db As Database) As QueryDef
    Dim qry As QueryDef

    On Error GoTo Handler

    ' We could also access the named query by setting an error handler
    ' and calling the item property with the query name.  We opted for
    ' this "cleaner" method.
    For Each qry In db.QueryDefs            ' search querydef collection
        If qry.Name = sQueryName Then
            Set FindQuery = qry             ' return querydef
            Exit Function
        End If
    Next

    Set FindQuery = Nothing                 ' clean up
    Exit Function

Handler:
    Err.Raise Err.Number, Err.Source, Err.Description
End Function
'
'   Copies a query from one database to another with an optional
'   automatic overwrite.
'
Public Sub CopyQuery(sQueryName As String, sSourceDB As String, sDestinationDB As String, Optional bOverwrite As Boolean = False)
    Dim qry As QueryDef
    Dim qryNew As QueryDef
    Dim sMsg As String
    Dim dbSource As Database
    Dim dbDest As Database

    Set dbSource = DBEngine.OpenDatabase(sSourceDB) ' open database

    Set qry = FindQuery(sQueryName, dbSource)      ' get the source query object
    If qry Is Nothing Then
        ' could not find query in source table so let's just get out of here.
        ' should probably raise an error or something.  We'll leave this up
        ' to your particular implementation of this routine.
        dbSource.Close
        Exit Sub
    End If

    Set dbDest = DBEngine.OpenDatabase(sDestinationDB) ' open database

    Set qryNew = FindQuery(sQueryName, dbDest)  ' see if the dest query exists
    If Not qryNew Is Nothing Then       ' This means we found the query.
        If bOverwrite Then              ' if we should auto overwrite, just delete the query
            DeleteQuery sQueryName, dbDest
        Else                            ' otherwise notify the user and let them decide
            If qry.SQL = qryNew.SQL Then
                sMsg = "The contents of the queries are identical."
            Else
                sMsg = "The contents of the queries are different."
            End If
            If MsgBox("The query " & sQueryName & _
                        " already exists in the destination database." & _
                        vbCr & vbCr & _
                        "The source query was last updated on " & _
                        qry.LastUpdated & vbCr & _
                        "The destination query was last updated on " & _
                        qryNew.LastUpdated & vbCr & _
                        sMsg & vbCr & vbCr & _
                        "Do you want to replace the query in the destination database?", _
                        vbYesNo Or vbExclamation) = vbYes Then
                DeleteQuery sQueryName, dbDest
            Else
                Set qry = Nothing
                Set qryNew = Nothing
                dbDest.Close
                Exit Sub    ' we don't want to overwrite the query.
            End If
        End If
    End If

    Set qryNew = dbDest.CreateQueryDef(qry.Name, qry.SQL)   ' copy query

    Set qry = Nothing
    Set qryNew = Nothing

    dbDest.Close                                            ' close db
    dbSource.Close
    Exit Sub

Handler:
    Err.Raise Err.Number, Err.Source, Err.Description
End Sub

This document is available on the web

Paid subscribers can view this issue in HTML format. There is no additional source or information in the HTML formatted document. It just looks a little better since we have included some HTML formatting. Just point your browser to link at the top of this document.

Summary

That concludes this issue of COTW. We hope you find the source code useful in your development.

The below describes the ways you can supply us some feedback about COTW. We would like to see our members help mold COTW into the best Visual Basic source code resource available. But to do that we need your feedback about what you like and what you do not like about COTW.

Advertising

If you are interested in advertising in COTW please email us at sponsor@codeoftheweek.com Our rates are VERY reasonable, actually they are almost FREE. We reach over three thousand Visual Basic developers each week.

How to tell us what you think

If you have any suggestions for topics you would like to see covered or questions about this issue, please email them to info@codeoftheweek.com or use online feedback form at http://www.codeoftheweek.com/feedback.html.

If you have any source code you would like to submit for possible inclusion in COTW, please fill out our online submission form at http://www.codeoftheweek.com/submission.html.

Contact Information

C&D Programming Corp.
PO Box 20128
Floral Park, NY 11002-0128
Phone or Fax: (212) 504-7945
Email: info@codeoftheweek.com
Web: http://www.codeoftheweek.com

Subscription Update

Thank you for trying Code of the Week for Visual Basic.

Your free trial expires after you receive your fourth issue. If you want to continue to receive Code of the Week you can get 52 issues of COTW for only $19.95. This is a full year of Visual Basic source code and information to help with all your development. So don't wait, subscribe now! The quickest way to subscribe is to jump to our online order form at http://www.codeoftheweek.com/order.html