Visual Basic Foro

Programación => Bases de Datos => Mensaje iniciado por: E N T E R en Diciembre 26, 2013, 03:22:31 pm

Título: Consulta con detalles
Publicado por: E N T E R en Diciembre 26, 2013, 03:22:31 pm
Hola quiero hacer un tipo reporte pero guardarlo en un txt

Esta forma. (Screen)
(http://snag.gy/sRwUT.jpg)

Tengo una tabla ventas todos los datos esta guardado en la mima tabla.

Código: (SQL) [Seleccionar]
CEDULA | CLIENTE | NFACTURA |
Lo que quiero es recorrer por cada cedula de cliente poner como encabezado y abajo mostrar todas las facturas que compro ese cliente. al terminar eso crea otro encabezado y vuelv a listar toda la factura de ese cliente y asi sucesivamente hasta listar todo.

EJEMPLO EN EL TXT (SCREEN)

(http://snag.gy/HlQOw.jpg)
Título: Re:Consulta con detalles
Publicado por: YAcosta en Diciembre 26, 2013, 05:51:12 pm
Amigo, yo no entendi cual es exactamente tu inquietud. ¿Leer el archivo txt?¿mostrarlo en un reporteador a partir del txt?
Título: Re:Consulta con detalles
Publicado por: E N T E R en Diciembre 27, 2013, 01:20:34 pm
Tengo este codigo pero solo me estira la cedula y el nombre, lo que no se es como estirar una cedula y despues las facturas que tiene el cliente. al estirar toda las facturas estirar la otra cedula del cliente y volver a estirar todas las facturas de ese cliente.

Private Sub Command1_Click()

    Open "C:\FACTURA.TXT" For Output As #1
   
    '+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
    '// Conectar la Base Datos con ADO
        Call ConectarADO
    '+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
       
        StrSQL = "SELECT * FROM VENTAS WHERE cedula='3230148'"
        rsADO.Open StrSQL, cnADO, adOpenStatic, adLockOptimistic, adCmdText
       
        Do Until rsADO.EOF
            With rsADO
                Print #1, Tab(1); .Fields("cedula"); Tab(20); .Fields("NOMBRE")
                rsADO.MoveNext
            End With
        Loop
   
    '+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
    '// Cerrar la base de datos y liberar la memoria
        Call CerrarADO
    '+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+

End Sub
Título: Re:Consulta con detalles
Publicado por: YAcosta en Diciembre 27, 2013, 03:11:12 pm
¿estirar? esa es nueva.

Te habia escrito una respuesta pero luego te volvi a leer y recien creo que te estoy entendiendo. Creo que lo que tu buscas es tener un archivo txt de presentacion para enviar por correo o lo que fuere, de tal manera que alguien abra y vea esa info sin mayor formateo.

En tu query tu buscas a un cliente y solo extraes la cédula (¿ya para que si la tienes?) y el nombre supongo del cliente. ¿como obtienes las facturas si no la pides?. Luego en el primer ejemplo pusiste una captura que supone es una lista de clientes con sus facturas.... Asumiré que es un ejemplo.

Dos formas:
1.- Tendrías que hacer una consulta jerárquica, donde en el detalle tengas las facturas quebradas por el campo relacion que imagino es la cédula. Solo tienes que recorrer la consulta jerarquica y a su detalle, si esto es lo que quieres me avisas para pasarte código, lo que pasa es que no me quiero a echar a buscar codigo porque aun estoy deduciendo lo que quieres.

2.- Haces dos consultas y las recorres individualmente armando tu txt.

¿Cual quieres?.... o ninguna de ellas.

Título: Re:Consulta con detalles
Publicado por: E N T E R en Diciembre 27, 2013, 03:40:27 pm
1.- Tendrías que hacer una consulta jerárquica, donde en el detalle tengas las facturas quebradas por el campo relacion que imagino es la cédula. Solo tienes que recorrer la consulta jerarquica y a su detalle, si esto es lo que quieres me avisas para pasarte código, lo que pasa es que no me quiero a echar a buscar codigo porque aun estoy deduciendo lo que quieres.

Esto es lo que quiero amigo. Puse solo una consulta solo de la cedula no se me ocurre otra manera donde meter la consulta de las facturas.
Título: Re:Consulta con detalles
Publicado por: YAcosta en Diciembre 27, 2013, 05:10:36 pm
Hola doc, me agarras de salida, vuelvo a la noche y te puedo armar todo el ejemplo, pero básicamente lo solucionaría con esto:

http://leandroascierto.com/foro/index.php?topic=1197.0

Y luego recorres el detalle con esto:

Dim rsDet As Variant
   rsDet = rsCD("Detalle")
   While Not rsDet.EOF
       Debug.Print rsDet(0), rsDet(1), rsDet(2) etc etc
       rsDet.MoveNext
   Wend

Si te queda time pa la noche te armo todo el rollo.

Saludos
Título: Re:Consulta con detalles
Publicado por: E N T E R en Diciembre 27, 2013, 05:43:30 pm
Gracias amigo lo resolvi asi:

Código: (VB) [Seleccionar]
Private Sub Command1_Click()
   
    Dim lngGroupID  As Long
    Dim lngID       As String

    Open "C:\FACTURA.TXT" For Output As #1
   
    '+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
    '// Conectar la Base Datos con ADO
        Call ConectarADO
    '+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
       
        MySQL = "SELECT * FROM ventas GROUP BY cedula"
        rsADO.Open MySQL, cnADO, adOpenStatic, adLockOptimistic, adCmdText
       
        If ADORecordCount(rsADO) Then
                   
            Do
               
                lngID = rsADO.Fields("cedula")
                lngGroupID = lngGroupID + 1
               
                    Print #1, Tab(1); "CEDULA: " & rsADO.Fields("cedula"); Tab(20); "NOMBRE: " & rsADO.Fields("nombre")
               
                    MySQLaux = "SELECT * FROM ventas WHERE cedula='" & lngID & "' GROUP BY nfactura"
                    rsAux.Open MySQLaux, cnADO, adOpenStatic, adLockOptimistic, adCmdText
                                       
                    If ADORecordCount(rsAux) Then
                                                 
                       Do
                          Print #1, Tab(1); rsADO.Fields("nfactura"); Tab(20); rsADO.Fields("fecha")
                          rsAux.MoveNext
                       Loop Until rsAux.EOF
                       
                    End If
                   
                    rsAux.Close
   
                rsADO.MoveNext
                                   
            Loop Until rsADO.EOF
           
           
        End If
    '+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
    '// Cerrar la Base Datos y liberar la memoria
        Call CerrarADO
    '+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
   
End Sub

Funciono de maravillas.....
Título: Re:Consulta con detalles
Publicado por: YAcosta en Diciembre 27, 2013, 09:14:03 pm
Si, esa es la segunda forma, lo unico malo de esto es que haces un select por cada loop, si tus datos son pocos no habra retrasos importantes.
Título: Re:Consulta con detalles
Publicado por: Jeronimo en Diciembre 28, 2013, 05:29:05 pm
Estimado Yván: en el ejemplo que está en el enlace al que hacés referencia en el post anterior utilizás DataReport. ¿Cómo se haría para recorrer el recordset con el objeto de llenar un ListView en lugar de emplear el DR?
Muchas gracias.

Jerónimo
Título: Re:Consulta con detalles
Publicado por: YAcosta en Diciembre 28, 2013, 06:25:18 pm
Uuu estimado, en mi vida visualero hay algunas cosas que nunca o casi nunca hice, una de ellas es por ejemplo utilizar el control ListView, jamas en ninguno de mis proyectos lo he usado puesto que no lo he necesitado, entonces no sabría decirte como usarlo.

Supongo que si el Lisview permite ser poblado por una consulta jerarquizada podrías usar el recordset, por alli alguien pueda decirnos como usar un recordset jerárquico en un Listview. Con el que si se puede es con el control MSHFlexGird porque ese control si es jerárquico.
Título: Re:Consulta con detalles
Publicado por: E N T E R en Diciembre 28, 2013, 06:59:00 pm
No no, amigo yo no quiero mostrarlo en el ListView. solo quiero guardar en un txt y nada. Queria bajar el ejemplo que subiste pero ya no funciona el link.
Título: Re:Consulta con detalles
Publicado por: YAcosta en Diciembre 28, 2013, 07:03:51 pm
No no, amigo yo no quiero mostrarlo en el ListView. solo quiero guardar en un txt y nada. Queria bajar el ejemplo que subiste pero ya no funciona el link.

No Enter, Jeronimo se refiere al otro post, claro hubiera quedado mejor hacer la pregunta del ListView en el otro post  :-)

Enter, el otro post ya esta actualizado el enlace, es un archivito pequeño, pero OJO ese ejemplo no tiene el tema de acceder al detalle, ya no lo hice porque tu publicaste que ya lo resolviste este problema y te funcionó de maravillas jeje. En todo caso me dices y lo hago.

Saludos
Título: Re:Consulta con detalles
Publicado por: Jeronimo en Diciembre 28, 2013, 07:14:09 pm
Puede ser lo que decís, Yván, en cuanto a que habría estado mejor que hiciera la pregunta en el otro post. Pero como ese post es de hace mucho tiempo no quise revivirlo por una consulta breve que venía a cuento porque lo incluiste en un post en este hilo. Por eso escribí
...en el ejemplo que está en el enlace al que hacés referencia en el post anterior...
En cuanto al ListView, me pasa lo contrario a vos: siempre lo utilizo porque nunca le presté atención al DataReport. Supongo que es hora de que empiece a investigarlo.
Saludos.

Jerónimo

Título: Re:Consulta con detalles
Publicado por: YAcosta en Diciembre 28, 2013, 07:27:02 pm
El que se confundio es mi pata Enter...

En realidad y si checas bien, el tema no tiene que ver con el datareport de forma especifica, el tema tiene que ver con el recordsert realmente ya que hablamos de un recordset jerárquico (e incluso simple porque se pueden crear mas niveles) y no un recordset plano, una vez que el recordset esta cargado ya es otro tema donde lo poblamos, si es en un control o en un reporteador.
Título: Re:Consulta con detalles
Publicado por: Jeronimo en Diciembre 28, 2013, 07:33:49 pm
Sí, sí, había entendido eso a partir de tu explicación anterior. Solo comenté, como dato de color, que nunca había usado el DataReport.
Nunca vi que se pudiera poblar un ListView con un recordset, pero debo investigar bien, porque no lo conozco en cada detalle. Veré si hay manera de manipular el recordset jerárquico para emplearlo con el LV. Si no, será una indicación más de que debo comenzar a explorar el DataReport.
Muchas gracias.

Jerónimo

Título: Re:Consulta con detalles
Publicado por: YAcosta en Diciembre 28, 2013, 08:37:04 pm
Doc, no quiero ser quisquilloso pero creo que el par Listview-DataReport no son comparables. Me refiero a que el DataReport es un reporteador que se compara con otro reporteador como el CrystalReport, El ListView es un control de presentación que se pudiera comparar con alguna grilla en todo caso.

Ahora, manipular el recordset jerárquico si es posible en cuanto a recorrerlo, no he probado con actualizarlo pero creo que si se puede cambiando la forma de abrirlo.

Ahora, mientras te escribo he abierto el VB6 y cargado el Listview y me doy con la sorpresa de que este control no permite conexión a datos, asi que los datos se tienen que meter "a mano", o sea, recorrer la fuente para poblarlo.

Saludos
Título: Re:Consulta con detalles
Publicado por: Jeronimo en Diciembre 28, 2013, 08:51:59 pm
Toda la razón, estimado Yván. Me hice lío. Estaba hablando de dos cosas como si fueran lo mismo y no es así. El CrystalReport, según he leído (post de ustedes, incluso), es bueno y tampoco lo he usado. Siempre presento los informes en ListView y los totales (por poner un caso nomás), en labels. Seguramente para eso sería una mejor presentación si usara el CrystalReport o el DataReport.
¿Qué opinás?
Título: Re:Consulta con detalles
Publicado por: YAcosta en Diciembre 28, 2013, 10:36:15 pm
Basicamente el datareport y cristalreport ademas de servirnos como herramientas de informes su finalidad es ser un reporte, y los reportes están destinados a imprimirse, ese código ya esta en el objeto, en un control cualquiera que sea no existe esa funcionalidad de forma nativa (la de imprimir) y tendrías que crear código y valerte del objeto Print para imprimir, o sea, una chamba adicional, terminamos siendo menos productivos.

(aqui yo sigo con mis largas explicaciones que es mi característica le duela a quien le duela jaja).
Es en el momento que un cliente te diga que la información que saco no la quiere solo en pantalla sino que la quiere impresa por N razones entonces lo mejor es usar un DataReport o CristalReport, ver cual de ellas conviene ya es otra discusión, en lo personal para la gran mayoria de situaciones el DataReport es mas que suficiente, el datareport si tiene algunas limitaciones (http://leandroascierto.com/foro/index.php?topic=923.msg4710#msg4710) pero si esas no te afectan te va bien.

Supón que un cliente te pide el stock de todos sus productos para ir a almacén a cotejar y en el necesita hacer algunas anotaciones con lapicero, el cliente tiene 3000 items. Solo tendrías que hacer un simple SQL a tus tablas de inventario, ese resultado estará en un recordset que luego enlazas al reporteador. Al reporte ya lo habrás diseñado con lineas y cuadrados para una fácil manipulación por el cliente. Ese es uno de tantos ejemplos que ilustran la versatilidad de un reporteador versus un control de informe como alguna grilla o lista, ya se da por descontado la exigencia del area contable de tener algunos informes impresos.

Si quieres usar el Reporteador solo como un informe también es posible y sencillo, solo tendrías que "incrustar" el reporte en tu formulario, eso lo puedes hacer con el DR o el CR.

Saludos