Ir al contenido


Foto

Listar los informes de una base de datos Access desde Delphi


  • Por favor identifícate para responder
13 respuestas en este tema

#1 Rox77

Rox77

    Member

  • Miembros
  • PipPip
  • 30 mensajes

Escrito 19 abril 2012 - 09:57

Hola, voy a intentar explicar lo que quiero conseguir:

- Tengo una app Delphi y una BD Access. Y tengo un procedimiento que me imprime los informes de Access directamente desde Delphi a traves de un objeto Access con un codigo parecido a esto:



delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3. Access: Variant;
  4. begin
  5. Try
  6.   Access := GetActiveOleObject('Access.Application');
  7. except
  8.   Access := CreateOleObject('Access.Application');
  9. end;
  10.  
  11. Access.Visible := True;
  12. Access.OpenCurrentDatabase('C:\mibd.mdb', False);
  13. Access.DoCmd.OpenReport('Informe en BD', acViewPreview, EmptyParam, EmptyParam);
  14. Access.CloseCurrentDatabase;
  15. Access.Quit(acQuitSaveAll);
  16. end;



Pero claro el parametro del nombre del informe lo tengo que poner "a mano" esto es, tengo que saber el nombre del informe que quiero imprimir (parece lógico :) pero yo quiero mejorarlo ). He estado investigando en la web de MS sobre los objetos Access pero no he conseguido hacer que nada funcione para recuperar (si es que se puede) un listado con todos los informes de una BD Access y así automatizar el proceso y cargarlos en un TMenu dinamicamente y no tener que tocar codigo ni saber el nombre de los informes de antemano para crear este menu.

¿Alguien sabe algo del tema?

Por cierto, no se porqué pero no he sido capaz de conectarme a la BD desde el objeto Access "OpenCurrentDatabase" con rutas relativas del tipo "..\data\mibd.mdb", me da error siempre. ¿Alguien sabe si se puede o de que forma?

Gracias.

;)


  • 0

#2 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 19 abril 2012 - 10:15

Buenas Roberto, qué tal los enanos?

Referente a tu duda, mira a ver si este enlace puede ayudarte http://www.techrepub...ss-database/808

Y referente a las rutas relativas, parece lógico que no funcione, ¿no?

Nos leemos (y a ver si nos vemos)

  • 0

#3 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 19 abril 2012 - 10:20

Sobre listar los informes no te puedo ayudar mucho: yo miraría la ayuda dentro de access relativa al editor de macros (pides ayuda cuando andas editando una macro, no desde access) y buscaría por "informe" o "nombre del informe" a ver si suena la flauta, normalmente esta es mi fuente de información para excel y word.

Respecto de llamar a una base de datos con rutas relativas, es sencillo:



delphi
  1. Ruta:= ParamStr(0)+'\data\mydb.mdb';


  • 0

#4 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 19 abril 2012 - 10:29

Una nota sobre lo de la ruta relativa:

Si tu servidor de ficheros es tipo linux con samba, como ocurre en mi trabajo, las \ de tu ruta escrita a mano podrían ser realmente / y en ese caso no te funcionaría.

La idea para hacerlo funcionar en linux podría ser: Si en ParamStr(0) detectas un \ usas \ en tu ruta relativa, y si detectas un / usas / en la ruta relativa.

Por ejemplo así:



delphi
  1. Ruta:= ParamStr(0);
  2. IF Pos('/', Ruta) > 0 then S:= '/' else S:= '\';
  3. Ruta:= Ruta+S+'data'+S+'mydb.mdb';


O puedes sustituir el caracter \ por S dentro de '\data\mydb.mdb', como mejor te resulte.
  • 0

#5 Rox77

Rox77

    Member

  • Miembros
  • PipPip
  • 30 mensajes

Escrito 20 abril 2012 - 01:18

Hola Xavi, los enanos bien gracias, ¿y la parejita? espero que bien también. Dales un besote de mi parte.

Referente a lo que nos ocupa, la función "funciona" :) pero de momento solo lo he conseguido a través de una consulta en el propio Access, probare con TQuery a ver si lo consigo pero la idea era exactamente esa, gracias  :D

Referente a lo de la ruta relativa ¿porqué dices que es lógico que no funcione? Yo conecto a la BD desde un objeto TADOConnection pasandole como BD '.\data\mibd.mdb' y funciona a las mil maravillas. Pero el objeto Access.OpenCurrentDataBase es el que no me deja, dice que no encuentra la BD, sólo funciona con la ruta completa.

Hola Sergio, gracias por la respuesta, como te comento lo hago de esta manera no se si usando ParamStr(0) tendra otro efecto, lo probaré.

Ya os cuento cuando haga las pruebas. Gracias a los dos. ;)

Saludos.
  • 0

#6 Rox77

Rox77

    Member

  • Miembros
  • PipPip
  • 30 mensajes

Escrito 22 abril 2012 - 03:00

Pues nada, no soy capaz de usar la consulta que comenta Cadetill, porque desde Delphi me da un error de READ en la BD, desde el propio Access si que me deja hacerlo.

Lo que si he encontrado es lo que yo quiero pero en VB y no se pasarlo a codigo Delphi, si alguien sabe y es tan amable de convertir esta función a código Delphi se lo agradecería: (pongo la etiqueta de C# porque de VB no hay ;))

[csharp]Private Sub Form_Load()
Dim db As Object
Dim con As Object
Dim doc As Object

    ' abrimos la aplicación de Access con la bd
    ' nwind.mdb, donde se encuentran los informes
    Set oApp = GetObject(App.Path & "\nwind.mdb")
    ' apuntamos al objeto Database de la aplicación
    Set db = oApp.CurrentDb
    ' buscamos los nombres de todos los informes de la bd
    ' Aquí utilizamos la colección Containers("Reports") para ello,
    ' ya que funcionará para todas las versiones de Access.
    ' (en Access 2000 o superior, se puede utilizar la colección
    ' AllReports del objeto Application.CurrentProject)
    For Each doc In db.Containers("Reports").Documents
        ' sólo nos interesan los informes, no los subinformes
        If Not doc.Name Like "Subinforme*" Then
            Me.List1.AddItem doc.Name
        End If
    Next
    ' desconectamos el objeto Database
    Set db = Nothing
   
End Sub
[/csharp]


Gracias.

  • 0

#7 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 23 abril 2012 - 06:07

Referente a lo de la ruta relativa ¿porqué dices que es lógico que no funcione? Yo conecto a la BD desde un objeto TADOConnection pasandole como BD '.\data\mibd.mdb' y funciona a las mil maravillas. Pero el objeto Access.OpenCurrentDataBase es el que no me deja, dice que no encuentra la BD, sólo funciona con la ruta completa.


Es lógico porque el punto en la ruta relativa significa "desde la carpeta activa actual" y eso solo tiene sentido dentro de cada aplicación, ya que la aplicación al arrancar fija su "ruta activa" a la del ejecutable: Dos ejecutables (en carpetas distintas) = diferentes significados para la ruta '.'
  • 0

#8 Rox77

Rox77

    Member

  • Miembros
  • PipPip
  • 30 mensajes

Escrito 24 abril 2012 - 07:21

Gracias Sergio, ahora si lo entiendo, OpenCurrentDataBase pertenece a la "Aplicacion" Access (ejecutable) y parte de la ruta donde este instalado Access para añadirle el .\data\mibd.mdb que yo pongo. Ahora si entiendo que no funcione.

El que no sabe es como el que no ve ;)

Ahora la duda es como podría hacer para poder seguir usando rutas relativas y averiguar si lo son o no para modificarla al pasarla al OpenCurrentDataBase. Porque yo tengo la aplicación en distintos PCs y en unas son rutas relativas pero en otras son rutas de red o incluso en el de pruebas de casa es ruta completa porque está en otra partición del disco.

Es decir puedo tener cosas como:

.\data\mibd.mdb
E:\data\bd\mibd.mdb
\\pcroberto\datos\pruebas\mibd.mdb

(guardadas en ficheros .ini en cada instalacion)

Para conectarme con el TADOConnecction no tengo pegas sea cual sea, todas me funcionan bien, pero para pasarle la ruta del .ini al OpenCurrentDataBase no me valen las relativas.

Habrá que ingeniarse alguna función o algo que compruebe el tema.

Gracias por la explicación Sergio.
  • 0

#9 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 24 abril 2012 - 08:24

Ruta:= ExpandFileName(ruta);

Ahora seguro que es una ruta completa, no relativa, y puedes pasarsela a access.

  • 0

#10 Rox77

Rox77

    Member

  • Miembros
  • PipPip
  • 30 mensajes

Escrito 26 abril 2012 - 08:34

:D Funciona perfectamente!!! Gracias Sergio, era justo la función que necesitaba.

Ahora solo falta resolver lo de los informes. ¿Nadie domina VB y Delphi?  :| :
  • 0

#11 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 26 abril 2012 - 08:41

:D Funciona perfectamente!!! Gracias Sergio, era justo la función que necesitaba.

Ahora solo falta resolver lo de los informes. ¿Nadie domina VB y Delphi?  :| :


Jajajaja, es como querer quedar bien con Dios y con el Diablo  *-)  :D  :p

Saludox ! :)

P.D. Supongo que si habrá quien maneje ambas herramientas  ;)
  • 0

#12 Rox77

Rox77

    Member

  • Miembros
  • PipPip
  • 30 mensajes

Escrito 27 abril 2012 - 10:30

Bueno pues Dios y el Diablo tienen nueva alma por la que luchar: ¡La mía! ... querida Fenareth he conseguido convertir la función VB a Delphi yo mismo.

Siguiendo los consejos de Sergio (leyendo la ayuda de VB del Access) y desoyendo los de Cadetill (que desde que le conozco me dice que deje Access y me pase a FB :p) he conseguido listar los 'Reports' de una BD Access para poder imprimirlos seleccionandolos directamente sin conocerlos de antemano.



delphi
  1. procedure TForm1.AllReports;
  2. var
  3. I: Integer;
  4. DB, Report: String;
  5. begin
  6.  
  7.   //Con esta funcion cambio rutas relativas por rutas completas !!!!
  8.   DB := ExpandFileName('.\datos\datos.MDB');
  9.  
  10. try
  11.   Access := GetActiveOleObject('Access.Application');
  12. except
  13.   Access := CreateOleObject('Access.Application');
  14. end;
  15.  
  16.   Access.OpenCurrentDatabase(DB);
  17.  
  18.  
  19. for I := 0 to Access.CurrentProject.AllReports.Count - 1 do
  20.   Form1.lista.Items.Add(Access.CurrentProject.AllReports[i].Name);
  21.  
  22. end;



En otra parte del programa cierro objetos y tal. Al final era de lo más sencillo.

Ale, ahí queda eso.

Gracias a todos ;)
  • 0

#13 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 02 mayo 2012 - 03:42

Me alegra que lo hayas solucionado y, a ver si algún día decides a cambiar a FB!!! ;-)

Por cierto, Access de qué tipo es? OleVariant? Variant? (más que nada para completar la respuesta :) )

Nos leemos
  • 0

#14 Rox77

Rox77

    Member

  • Miembros
  • PipPip
  • 30 mensajes

Escrito 02 mayo 2012 - 07:02

Gracias Xavi, es de tipo Variant (en el primer codigo que puse al iniciar el tema se ve). Y lo de cambiar a FB ya sabes que es porque no tengo necesidad y que lo poco que gestiono esta todo en Access. De todas maneras así teneis un "experto" en Access para preguntar dudas y aportar cosillas como esta de los listados ¿no?.  ;) (h)
  • 0




IP.Board spam blocked by CleanTalk.