Juan:
Me estoy haciendo un poco de lío.
Se nota que estoy oxidado con Access despues de varios meses de haber
dejado de forma efectiva la programación.
Se notó antes de ayer con la funcion que me comentaste tú y Marjan.

Me planteo el siguiente caso:
Desde MDB1 deseo comprobar que en MDB2 existe un Reporte XXX
¿Como recorro los nombres de los objeto Reports de dicha MDB2?
Desde la actual, lo tengo claro con:
dbs As Object
    
Set dbs = Application.CurrentProject
'Aplicacion de esta, por ejemplo:

' Busca objetos AccessObject abiertos en la colección AllReports..
  For Each obj In dbs.AllReports
   msgbox obj.Name
  Next obj


Al hilo de todo esto, tengo en mi cabeza las siguientes referencias
sobre apertura y referencias a una MDB

Dim wrk As Workspace
Dim dbs1 As Database
Set wrk = DBEngine.CreateWorkspace("", "Admin", "")
Set dbs1 = wrk.OpenDatabase("RutaDestinoBase)

Esta es la primera forma. Bien...¿Cuando se emplea?
¿Cuando es conveniente abrirla así?

   
OTRA
Dim BaseDestino As New Access.Application
Set BaseDestino = New Access.Application
BaseDestino.OpenCurrentDatabase "Destino"
BaseDestino.CloseCurrentDatabase
Set BaseDestino = Nothing

¿Esta forma anterior cuando y por qué?
¿Diferencias y analogías con la anterior?
    
OTRA
Dim obj As AccessObject, dbs As Object
    
Set dbs = Application.CurrentProject
'Aplicacion de esta, por ejemplo:

' Busca objetos AccessObject abiertos en la colección AllReports..
  For Each obj In dbs.AllReports
   msgbox obj.Name
  Next obj
 

Tengo un poco de lío al respecto.

¿Me puedes aclarar un poco el tema?

RESPUESTA DE JUAN
=================
Hola Francisco,

Tú dices:

"Me planteo el siguiente caso:
Desde MDB1 deseo comprobar que en MDB2 existe un Reporte XXX
¿Como recorro los nombres de los objeto Reports de dicha MDB2?..."

respuesta:

Function VerReportes(BDatos As String)
Dim objAcc As New Access.Application
Dim rpt As AccessObject

  objAcc.OpenCurrentDatabase BDatos

  With objAcc
  For Each rpt In .CurrentProject.AllReports
    Debug.Print rpt.Name
  Next
  End With

  objAcc.CloseCurrentDatabase

  Set objAcc = Nothing

End Function

Tú preguntas:

"Dim wrk As Workspace
Dim dbs1 As Database
Set wrk = DBEngine.CreateWorkspace("", "Admin", "")
Set dbs1 = wrk.OpenDatabase("RutaDestinoBase)

Esta es la primera forma. Bien...¿Cuando se emplea?
¿Cuando es conveniente abrirla así?... "

Respuesta:

De esta manera estás abriendo la base de datos a través de la librería DAO y
accederás a toda la jerarquía DAO (empezando con DBEngine, Workspace,
Database, etc.) y todas sus propiedades, métodos y colecciones).

Tú preguntas:

"Dim BaseDestino As New Access.Application
Set BaseDestino = New Access.Application
BaseDestino.OpenCurrentDatabase "Destino"
BaseDestino.CloseCurrentDatabase
Set BaseDestino = Nothing

¿Esta forma anterior cuando y por qué?
¿Diferencias y analogías con la anterior?..."

Respuesta:

De esta otra forma abres una base de datos desde el objeto application, es
decir, desde el mismo programa de Access, es como si tuvieras una ventana
con la base de datos abierta (puedes tenerla o no, según quieras). De esta
manera accederás a todos las colecciones, métodos, propiedades y objetos que
posee el objeto application (que no son los mismos que con DAO). Tú decides
en cada momento, cuál de las dos formas de abrir la base de datos te
proporcionará la funcionalidad que necesitas. En el caso concreto que
preguntabas es méjor acceder a la colección AllForms de CurrentProject del
objeto Application, ya que contiene TODOS los informes (estén abiertos o
no).

Tú preguntas:

"OTRA
Dim obj As AccessObject, dbs As Object

Set dbs = Application.CurrentProject
'Aplicacion de esta, por ejemplo:

' Busca objetos AccessObject abiertos en la colección AllReports..
  For Each obj In dbs.AllReports
   msgbox obj.Name
  Next obj..."

Respuesta:

Aquí lo único que se diferencia de la primera es que no declaras dbs como
AccessObject (que sería lo correcto), y lo declaras como Object (es decir,
cualquier tipo de Objeto).

Aprovechando que tiene que ver con esto último, te comento algo que ya le
comenté a McPegasus el otro día. Es un detalle tonto, pero creo que muy
útil.

Imagínate que quieres hacer una rutina para rellenar un documento de Word o
de Excel, desde Access. Lo normal es que empezaras declarando una variable
tipo Word.Application o Excel.Application. Bien. De esta manera, podrás usar
a través de esta variable la librería de objetos de Word o Excel (previa
señalización en el cuadro referencias, claro). La cosa vendría a ser algo
así:

Dim appWord as New Word.Application

    appWord.open Documents = "C:\doc1.doc" (o algo así, que no me acuerdo)
... ...

Pequeño truco:

Para escribir el código, hazlo como indico arriba. Será fácil y documentado
por el examinador de objetos con el operador "." (punto). Una vez probado
que todo funcione correctamente, rehaz la declaración de variables y añade
una nueva línea al código:

Dim appWord as Object

    Set appWord = CreateObject("Word.Application")

haciendo esto, puedes quitar la referencia a la librería de objetos de Word,
ahorrando una referencia al programa (se abrirá una referencia implícita
sólo cuando uses esa rutina), y sin embargo todo funcionará correctamente.

Creo que esta es una de las utilidades de usar variables Object (génericas).
En el resto de los casos, lo mejor es declarar las variables con su tipo
correcto. Puede que hayan casos en que de lo mismo, pero es más que nada
como buena costumbre de programación



Saludos desde BCN
happy

    Source: geocities.com/es/ensolva/Descargas/Documentos

               ( geocities.com/es/ensolva/Descargas)                   ( geocities.com/es/ensolva)                   ( geocities.com/es)