Tengo creado fisicamente un objeto llamado dteEntornoDatos como lo quito y seguir utilizando mi reporte para ya no depender de él y hacer todo desde codigo?
Dejo el ejemplo del datareport agrupado http://www.megaupload.com/?d=8ZSKELLE (http://www.megaupload.com/?d=8ZSKELLE)
Option Explicit
Public cn As New Connection
Private Sub Form_Load()
cn.CursorLocation = adUseClient
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\bd_01.mdb;Password=;Persist Security Info=false"
End Sub
Private Sub Command1_Click()
Dim Listado As ADODB.Command
Dim Entorno As dteEntornoDatos
Set Entorno = New dteEntornoDatos
Entorno.Listados.ConnectionString = cn.ConnectionString
Set Listado = Entorno.Commands("command1_grouping")
Listado.CommandType = adCmdText
Listado.CommandText = "SHAPE{SELECT P.idprod,P.nomprod,P.idcat,C.nomcat FROM Producto P, Categoria C" & _
" WHERE C.idcat=P.idcat}AS command1 COMPUTE command1 BY 'idcat',nomcat"
DataReport1.Show
End Sub
Para no depender de un DateEnvironment yo lo hago así.
1º- Creo mi Datareport como yo quiero y no asigno enlace a ningún campo.
Seguidamente desde mi formulario principal, el que trabaja con la base de datos (desde ADO) hago lo siguiente (esto es un copia-pega de un programa mio):
Private Sub generarvistaprevia_Click()
On Error GoTo hay_error
Dim rs As ADODB.Recordset
Dim Nombre_seccion As String
' llamar la función Create_Recordset
Set rs = Create_Recordset(presentacion) 'Esta función igual no la entiendes, es una función de Luciano
'para generar un recordset desde un listview... pásala por alto.
If Not rs Is Nothing Then
'Indicar en esta variable el nombre de la sección en la que se encuentran los rptTextBox para cada campo
Nombre_seccion = "detalle"
'Asignarle a los textbox del datareport, los DataField que corresponden a los nombres de encabezados
' With DataReport1
With vpreporte_reportedeejemplo
.Sections(Nombre_seccion).Controls.Item("Texto1").DataField = "CODIGO"
.Sections(Nombre_seccion).Controls.Item("Texto2").DataField = "INGREDIENTES"
.Sections(Nombre_seccion).Controls.Item("Texto3").DataField = "CANTIDAD"
.Sections(Nombre_seccion).Controls.Item("Texto4").DataField = "PRECIO"
.Sections(Nombre_seccion).Controls.Item("Texto5").DataField = "PESO"
' cambiar el caption del label Titulo
' .Sections("Sección4").Controls.item("lbltitulo").Caption = "Informe de formulario: " & Me.Caption
' Asignarle al datasource el origen de datos, es decir el recordset que devolvió la función Create_Recordset
Set .DataSource = rs
'Cargar y muestrar el informe
.Show vbModal
' Liberar los recursos
If rs.State = adStateOpen Then rs.Close
Set rs = Nothing
End With
End If
Espero que te sirva...
Pruébalo.
karmany
Esta bueno el codigo pero yo necesito un reporte agrupado cabecera y detalle por eso utilizo la sentencia SHAPE COMPUTE para agrupar el recordset.
(http://img827.imageshack.us/img827/1599/11803105.png)
Yo lo hacía (CREO) con un control MSHflexGrid u otro similar, no lo recuerdo bien.
Este control te permite acceder a un control de datos ADO y con SHAPE también(te aparecen unos signos + en cada grupo). Después existen muchísimos ejemplos de generar reporte.
De todos modos podrías probar:
http://www.bigresource.com/VB-Shape-Command-Data-Report-sqgDWkMkYL.html#gANrEOmUPL (http://www.bigresource.com/VB-Shape-Command-Data-Report-sqgDWkMkYL.html#gANrEOmUPL)
Este ejemplo con código creo que usa un dataenvironment, pero te puede ayudar.
http://www.squadrosolutions.com/blog/group-reports-in-vb6-using-data-report/ (http://www.squadrosolutions.com/blog/group-reports-in-vb6-using-data-report/)
Yo siempre he evitado el uso de la sentencia SHAPE porque me daba muchos problemas a la hora de programar.
Ojalá tengas suerte y nos cuentas cómo lo resolviste, me parece un tema interesante y si lo solucionas seguro que le ponen chincheta.
Un saludo