Discussion:
se puede crear un informe desde VBA???
(demasiado antiguo para responder)
Leonardo Onieva González
2006-01-24 09:34:25 UTC
Permalink
Hola amigos

Se puede crear un informe desde VBA sin utilizar ningun asistente ni usar la
interface de Access??
y abrir el asistente para informes desde VBA??

Gracias a todos

Saludos
Eduardo Olaz
2006-01-24 21:29:59 UTC
Permalink
Sí se puede; y aunque puede resultar muy laborioso, puedes llegar a tener
una libertad y resultar altamente satisfactorio.

para el ejemplo, he creado la tabla Datos con los campos
idDato
Dato
Fecha

En un formulario he puesto un botón que llama al procedimiento CreaInforme

Private Sub cmdCreaInforme_Click()
CreaInforme
End Sub

Este procedimiento está definido en un módulo y es el siguiente

______________________________________________________

Option Compare Database
Option Explicit

Public Enum Alineaciones
eoGeneral
eoIzquierda
eoDerecha
eoDistribuir
End Enum

Public Enum GrosorDeFuentes
eoDelgado = 100
eoExtraFino = 200
eoFino = 200
eoNormal = 400
eoMediano = 500
eoSemiNegrita = 600
eoNegrita = 700
eoExtraNegrita = 800
eoGrueso = 900
End Enum

Public Sub CreaInforme()
Dim rptInforme As Report
Dim aControles(0 To 9) As Control
Dim strInforme As String
Dim ctl As Control
Dim lngColor As Long
Dim i As Long


Set rptInforme = CreateReport

DoCmd.Restore

With rptInforme
strInforme = .Name
.RecordSource = "SELECT * FROM Datos;"
' Dimensiono los elementos del informe _
Encabezado, y pie de página

.Width = 8000
.Section(acPageHeader).Height = 1000
.Section(acPageFooter).Height = 1000
End With

Set aControles(0) = CreateReportControl( _
strInforme, _
acLabel, _
acDetail, "", "", _
100, 100, _
800, 300)
With aControles(0)
.Caption = "idDato"
.Name = "lblIdDato"
End With
Set aControles(1) = CreateReportControl( _
strInforme, _
acTextBox, _
acDetail, "", "", _
1000, 100, _
1000, 300)
With aControles(1)
.ControlSource = "idDato"
.Name = "txtIdDato"
End With

Set aControles(2) = CreateReportControl( _
strInforme, _
acLabel, _
acDetail, "", "", _
100, 500, _
800, 300)
With aControles(2)
.Caption = "Dato"
.Name = "lblDato"
End With
Set aControles(3) = CreateReportControl( _
strInforme, _
acTextBox, _
acDetail, "", "", _
1000, 500, _
2000, 300)
With aControles(3)
.ControlSource = "Dato"
.Name = "txtDato"
End With

Set aControles(4) = CreateReportControl( _
strInforme, _
acLabel, _
acDetail, "", "", _
100, 900, _
800, 300)
With aControles(4)
.Caption = "Fecha"
.Name = "lblFecha"
End With
Set aControles(5) = CreateReportControl( _
strInforme, _
acTextBox, _
acDetail, "", "", _
1000, 900, _
2000, 300)
With aControles(5)
.ControlSource = "Fecha"
.Name = "txtFecha"
End With
lngColor = RGB(128, 0, 0)
For Each ctl In rptInforme.Controls
With ctl
.FontName = "Verdana"
If .ControlType = acTextBox Then
.FontWeight = eoNegrita
.ForeColor = lngColor
.FontSize = 12
.TextAlign = eoDerecha
Else
.FontWeight = eoNormal
.ForeColor = vbBlack
.FontSize = 10
.TextAlign = eoIzquierda
End If
End With
Next ctl

'Creamos ahora el título del encabezado, con sombra

Set aControles(6) = CreateReportControl( _
strInforme, _
acLabel, _
acPageHeader, _
"", "", _
100, 100, _
6000, 800)
With aControles(6)
.Caption = "Informe por código"
.Name = "lblTituloSombra"
.ForeColor = RGB(128, 128, 128)
End With
Set aControles(7) = CreateReportControl( _
strInforme, _
acLabel, _
acPageHeader, _
"", "", _
70, 70, _
6000, 800)
With aControles(7)
.Caption = "Informe por código"
.Name = "lblTitulo"
.ForeColor = RGB(0, 0, 128)
End With
For i = 6 To 7
With aControles(i)
.FontName = "Times New Roman"
.FontSize = 24
.FontWeight = eoGrueso
End With
Next i

Set aControles(8) = CreateReportControl( _
strInforme, _
acLine, _
acPageHeader, _
"", "", _
0, 950, _
8000, 0)
With aControles(8)
.Name = "linEncabezado"
End With
' Muestra el informe
DoCmd.OpenReport strInforme, acViewPreview

End Sub
_____________________________________________________


Aunque se haría muy larga la explicación, se puede incluso, por código,
añadir procedimientos al módulo de clase del informe, eventos, etc...

Es un tema muy bonito para trabajar, aunque bastante laborioso.


Saludos desde la calle Estafeta de Pamplona:

Eduardo Olaz
Microsoft [MVP] Access

eduardoALGARROBAolaz.net
Post by Leonardo Onieva González
Hola amigos
Se puede crear un informe desde VBA sin utilizar ningun asistente ni usar
la interface de Access??
y abrir el asistente para informes desde VBA??
Gracias a todos
Saludos
Leonardo Onieva González
2006-01-27 09:10:52 UTC
Permalink
La verdad que tu código es una maravilla, y te felicito, me viene al pelo
para un programilla que estoy haciendo, pero tengo otro problema: cuando
intento agregar controles en la seccion "encabezado o pie de pagina del
informe" (acFooter y acHeader) me da error, y no encuentro ninguna forma de
hacerla visible por código salvo pinchar en alguna seccion con el boton
derecho del mouse y hacerlo visible con el raton
Report.Section(acFooter).Visible no funciona, alguna idea??

y la ultima duda existencial, ¿como hago para maximizar un formulario o un
informe desde codigo? no lo encuentro por ningun sitio :(. Al final tuve que
usar la API ShowWindow

En cuanto a lo de insertar codigo dentro del informe, he hecho una rutinilla
y va muy bien
Ahi va un ejemplo para el grupo

Dim rpt As Report
Set rpt = CreateReport()

rpt.HasModule = True
'agrega codigo al modulo
rpt.Module.AddFromString "Dim n as Integer 'coment"
rpt.Module.AddFromString "dim n2 as string"

Dim pt As Long
pt = rpt.Module.CreateEventProc("Format", "Detalle")
rpt.Module.InsertLines pt + 1, vbTab & "MsgBox ""Esto es la hostia!"""

pt = rpt.Module.CreateEventProc("Open", "Report")
rpt.Module.InsertLines pt + 1, vbTab & "MsgBox ""Esto es la hostia2!"""

DoCmd.Close acReport, rpt.Name, acSaveYes


Gracias de antemano

Saludos
Post by Eduardo Olaz
Sí se puede; y aunque puede resultar muy laborioso, puedes llegar a tener
una libertad y resultar altamente satisfactorio.
para el ejemplo, he creado la tabla Datos con los campos
idDato
Dato
Fecha
En un formulario he puesto un botón que llama al procedimiento CreaInforme
Private Sub cmdCreaInforme_Click()
CreaInforme
End Sub
Este procedimiento está definido en un módulo y es el siguiente
______________________________________________________
Option Compare Database
Option Explicit
Public Enum Alineaciones
eoGeneral
eoIzquierda
eoDerecha
eoDistribuir
End Enum
Public Enum GrosorDeFuentes
eoDelgado = 100
eoExtraFino = 200
eoFino = 200
eoNormal = 400
eoMediano = 500
eoSemiNegrita = 600
eoNegrita = 700
eoExtraNegrita = 800
eoGrueso = 900
End Enum
Public Sub CreaInforme()
Dim rptInforme As Report
Dim aControles(0 To 9) As Control
Dim strInforme As String
Dim ctl As Control
Dim lngColor As Long
Dim i As Long
Set rptInforme = CreateReport
DoCmd.Restore
With rptInforme
strInforme = .Name
.RecordSource = "SELECT * FROM Datos;"
' Dimensiono los elementos del informe _
Encabezado, y pie de página
.Width = 8000
.Section(acPageHeader).Height = 1000
.Section(acPageFooter).Height = 1000
End With
Set aControles(0) = CreateReportControl( _
strInforme, _
acLabel, _
acDetail, "", "", _
100, 100, _
800, 300)
With aControles(0)
.Caption = "idDato"
.Name = "lblIdDato"
End With
Set aControles(1) = CreateReportControl( _
strInforme, _
acTextBox, _
acDetail, "", "", _
1000, 100, _
1000, 300)
With aControles(1)
.ControlSource = "idDato"
.Name = "txtIdDato"
End With
Set aControles(2) = CreateReportControl( _
strInforme, _
acLabel, _
acDetail, "", "", _
100, 500, _
800, 300)
With aControles(2)
.Caption = "Dato"
.Name = "lblDato"
End With
Set aControles(3) = CreateReportControl( _
strInforme, _
acTextBox, _
acDetail, "", "", _
1000, 500, _
2000, 300)
With aControles(3)
.ControlSource = "Dato"
.Name = "txtDato"
End With
Set aControles(4) = CreateReportControl( _
strInforme, _
acLabel, _
acDetail, "", "", _
100, 900, _
800, 300)
With aControles(4)
.Caption = "Fecha"
.Name = "lblFecha"
End With
Set aControles(5) = CreateReportControl( _
strInforme, _
acTextBox, _
acDetail, "", "", _
1000, 900, _
2000, 300)
With aControles(5)
.ControlSource = "Fecha"
.Name = "txtFecha"
End With
lngColor = RGB(128, 0, 0)
For Each ctl In rptInforme.Controls
With ctl
.FontName = "Verdana"
If .ControlType = acTextBox Then
.FontWeight = eoNegrita
.ForeColor = lngColor
.FontSize = 12
.TextAlign = eoDerecha
Else
.FontWeight = eoNormal
.ForeColor = vbBlack
.FontSize = 10
.TextAlign = eoIzquierda
End If
End With
Next ctl
'Creamos ahora el título del encabezado, con sombra
Set aControles(6) = CreateReportControl( _
strInforme, _
acLabel, _
acPageHeader, _
"", "", _
100, 100, _
6000, 800)
With aControles(6)
.Caption = "Informe por código"
.Name = "lblTituloSombra"
.ForeColor = RGB(128, 128, 128)
End With
Set aControles(7) = CreateReportControl( _
strInforme, _
acLabel, _
acPageHeader, _
"", "", _
70, 70, _
6000, 800)
With aControles(7)
.Caption = "Informe por código"
.Name = "lblTitulo"
.ForeColor = RGB(0, 0, 128)
End With
For i = 6 To 7
With aControles(i)
.FontName = "Times New Roman"
.FontSize = 24
.FontWeight = eoGrueso
End With
Next i
Set aControles(8) = CreateReportControl( _
strInforme, _
acLine, _
acPageHeader, _
"", "", _
0, 950, _
8000, 0)
With aControles(8)
.Name = "linEncabezado"
End With
' Muestra el informe
DoCmd.OpenReport strInforme, acViewPreview
End Sub
_____________________________________________________
Aunque se haría muy larga la explicación, se puede incluso, por código,
añadir procedimientos al módulo de clase del informe, eventos, etc...
Es un tema muy bonito para trabajar, aunque bastante laborioso.
Eduardo Olaz
Microsoft [MVP] Access
eduardoALGARROBAolaz.net
Post by Leonardo Onieva González
Hola amigos
Se puede crear un informe desde VBA sin utilizar ningun asistente ni usar
la interface de Access??
y abrir el asistente para informes desde VBA??
Gracias a todos
Saludos
Loading...