Infomre condicionado.

Colapsar
X
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar todos
nuevos mensajes

  • #16
    Re: Infomre condicionado.

    El DataEnvironment no tiene nada que ver en esto.
    El Datamember lo uso para consultas jerarquicas, en este caso no es necesario.

    Checa este enlace a ver si te da algunas luces
    VB6Firebird – Creando Reporte Cabecera-Detalle (usando Shape)

    O esto
    https://www.youtube.com/watch?v=vRUVpPP4u7s
    Última edición por YAcosta; 13-03-2015, 04:50 PM.
    --------------------------------
    Si eres agradecido, obtendrás más...

    YAcosta

    Comentario


    • #17
      Re: Infomre condicionado.

      Gracias Compañero por la ayuda ya pude hacer el informe, mucha ayuda y buena mecanica de aprendizaje, ya que pense que la estructura recomendada para los informes en datareprot deberian ser obligatorios con el DataEnvironment, una pegueñita consulta en el campo del recorset el ESTATUS me carga de 1,2,3,4 pero debo hacer la convercion a ABIERTO,CERRADO, ANULADO, PERDIDO; yo habia echo una función pero no me funciona de esa manera me manda error que el obejto no admite esta propiedad o metodo.

      Código:
      Set EstatusRs = New ADODB.Recordset
      
      With EstatusRs
      
      sql = "SELECT Diag_status AS ESTATUS, COUNT(Pk_id_diagnostico) AS CANTIDAD From Tbl_Registro_Atencion where Diag_fecha_datos BETWEEN '" & Me.dtpdesde.Value & "' AND '" & Me.dtphasta.Value & "' GROUP BY Diag_status ORDER BY Diag_status"
      
      EstatusRs.Open sql, CONEXION_ADO, adOpenStatic, adLockOptimistic
      
      EST_REG = TRANSFORMAR_ESTATUS(.Fields("ESTATUS"))
      
      Set dtrImpresion_Ciclo.DataSource = EstatusRs
      
      dtrImpresion_Ciclo.Sections("Sección2").Controls("lbldesde").Caption = Me.dtpdesde.Value
      
      dtrImpresion_Ciclo.Sections("Sección2").Controls("lblhasta").Caption = Me.dtphasta.Value
      
      dtrImpresion_Ciclo.Sections("Sección1").Controls("txtESTATUS") = EST_REG
      
      dtrImpresion_Ciclo.Show
      
      End With
      Set EstatusRs = Nothing
      
      End Sub

      Comentario


      • #18
        Re: Infomre condicionado.

        Ok,sinceramente creo que los literales correspondientes a cada estado debieron ir en una tabla con la cual lo relaciones, creo que aun estas a tiempo de agregar esa tabla y hacer una consulta mas eficiente, si lo "hardcodeas" poniendo a mano 1 = ABIERTO etc... te puede traer complicaciones, porque ¿que pasara cuando tengas un estado 5?? el estado PERDIDO ya no lo quieren sino: NO ENCONTRADO, o lo que fuere y vas a tener que meterle mano al codigo en todas las consultas donde intervenga esa tabla.

        Bueno, tal como esta puedes hacerlo de 2 formas.

        Forma 1:
        Despues de que traes lo registros, o sea, que ya lo tengas en el recordset y antes de setearlo al DataReport, puedes recorrrer todos sus registros (del rs) para convertir 1 por ABIERTO, 2 por CERRADO, etc etc. Esto lo haces con un for next, luego de eso ya recien lo conectas al datareport y listo.

        Forma 2:
        En vez de recorrer "a mano" el recordset puedes aplicar ese en el Select algo similar al IIF, no recuerdo con que motor trabajas, igual con Access no me la sé si fuera el caso, pero para darte una idea con FirebirdSQL iria asi:

        Donde dice:
        Código:
        "SELECT Diag_status AS ESTATUS, ... etc
        Diria:
        Código:
        Select case Diag_status 
                 when 1 then 'ABIERTO'
                 when 2 then 'CERRADO'
                 when 3 then 'ANULADO'
                 when 4 then 'PERDIDO'
                 else 'ERROR'
               end as ESTATUS, Count(Pk... etc etc
        Saludos
        --------------------------------
        Si eres agradecido, obtendrás más...

        YAcosta

        Comentario


        • #19
          Re: Infomre condicionado.

          Ah ok, acabo de ver que el estimado Movilla mas arriba en este mismo hilo te dio la solución exacta para el tema de cambiar los números por las palabras con IIF. Checalo.
          --------------------------------
          Si eres agradecido, obtendrás más...

          YAcosta

          Comentario


          • #20
            Re: Infomre condicionado.

            Buenas segun entiendo quedaria asi pero me mando error de compilacion el argumento no es opcional, recuerden que el motor es vb6 y sql server 2000:

            Código:
            Set EstatusRs = New ADODB.Recordset
            
            With EstatusRs
            
            sql = "SELECT Diag_status AS ESTATUS, COUNT(Pk_id_diagnostico) AS CANTIDAD From Tbl_Registro_Atencion where Diag_fecha_datos BETWEEN '" & Me.dtpdesde.Value & "' AND '" & Me.dtphasta.Value & "' GROUP BY Diag_status ORDER BY Diag_status"
            
            EstatusRs.Open sql, CONEXION_ADO, adOpenStatic, adLockOptimistic
            
            .Fields("ESTATUS") = IIf(.Fields("ESTATUS") = 1, "ABIERTO", IIf(.Fields("ESTATUS") = 2, "CERRADO", IIf(.Fields("ESTATUS") = 3, "ANULADO", IIf(.Fields("ESTATUS") = 4, "PERDIDO"))))
            
            Set dtrImpresion_Ciclo.DataSource = EstatusRs
            
            dtrImpresion_Ciclo.Sections("Sección2").Controls("lbldesde").Caption = Me.dtpdesde.Value
            
            dtrImpresion_Ciclo.Sections("Sección2").Controls("lblhasta").Caption = Me.dtphasta.Value
            
            ''-----'dtrImpresion_Ciclo.Sections("Sección1").Controls("txtESTATUS") = EST_REG '---comentario
            
            dtrImpresion_Ciclo.Refresh
            dtrImpresion_Ciclo.Show
            
            End With
            Set EstatusRs = Nothing

            Comentario


            • #21
              Re: Infomre condicionado.

              Lo único que veo muy mal es que estas poniendo el asunto de los iff encadenados donde no debe ir, eso debe ir en la consulta sql no afuera.

              RECUERDA que no puedes manipular el detalle de un reporte en el mismo reporte, esto lo haces en el sql o en un ciclo For Next o Do Whilte ANTES de vincularlo al reporte.
              --------------------------------
              Si eres agradecido, obtendrás más...

              YAcosta

              Comentario


              • #22
                Re: Infomre condicionado.

                Me continua mandando error, si me podrian explicar con un ejemplo mas claro, gracias.

                Comentario


                • #23
                  Re: Infomre condicionado.

                  No estas haciendo los pasos que te indique anteriormente. Debes tener en el sql los datos tal como los quieres ver, no debes pasar de ello si no lo logras.

                  También debes ser especifico en el error, supondré (que feo) que te refieres al mismo error.

                  Finalmente yo me refiero a que hagas la modificación del sql para que apliques el IIF y esto lo debes probar en tu manejador de base de datos hasta que lo consigas, No se si en tu motor se admite el IIF allí ya no te puedo ayudar y tendrias que esperar a que algun colega de te una mano o le echas a investigar.

                  La otra opción para ser mas detalloso obedece al siguiente esquema:
                  1.- Creas cadena sql
                  2.- Ejecutas recordset con dicha cadena
                  3.- Obtienes resultados en el recordset
                  4.- Manipulas esos resultados alterando el recordset como por ejemplo agregando un campo nuevo en el rs (depende como lo hallas abierto).
                  5.- Conectas al reporte.

                  Tu bronca estará en el paso 4, recuerdo que debes abrir la conexión asi:
                  rs.Open sql, tuconector, adOpenStatic, adLockBatchOptimistic

                  En tu consulta debes agregar un campo vacio y lo manipulas a el o finalmente manipulas la columna Status. La verdad lo mas sencillo es trabajarlo en el sql mismo.

                  Saludos
                  --------------------------------
                  Si eres agradecido, obtendrás más...

                  YAcosta

                  Comentario


                  • #24
                    Re: Infomre condicionado.

                    Disculpen compañeros ya me habian dicho la respuesta pero no lo conprendi en el momento ya en sql server 2000 no se puede usar if ni tampoco IIf eso fue canbiado por Case.

                    Código:
                    SELECT CASE  Diag_status 
                    WHEN  '1' THEN 'ABIERTO' 
                    WHEN  '2' THEN 'CERRADO' 
                    WHEN  '3' THEN 'ANULADO' 
                    WHEN  '4' THEN 'PERDIDO' END AS ESTATUS, COUNT(Pk_id_diagnostico) AS CANTIDAD 
                    From Tbl_Registro_Atencion 
                    where Diag_fecha_datos BETWEEN '06/01/2015' AND '27/01/2015' 
                    GROUP BY Diag_status 
                    ORDER BY Diag_status
                    Ya termine el informe. gracias panas
                    Última edición por puchungon; 17-03-2015, 07:10 PM.

                    Comentario


                    • #25
                      Re: Infomre condicionado.

                      Pues ¿qué quieres que te diga? Me da la impresión de que tú querías que en lugar de 1, 2, 3, 4 te imprimiera "ABIERTO", "CERRADO", "ANULADO", "PERDIDO"... Y en el adjunto no parece que lo hayas conseguido... Me supongo que el CASE deberás usarlo en la presentación de la grilla, no en la SQL.
                      José María Movilla Cuadrado
                      ______________________
                      Normas del foro
                      www.foro.vb-mundo.com
                      www.vb-mundo.com

                      Comentario


                      • #26
                        Re: Infomre condicionado.

                        Hola estimado Movilla como siempre un gusto saludarlo. Solo un comentario.

                        Si bueno el amigo Puchungon comentó finalmente que ya resolvió el tema y lo hizo usando el método que le comenté, el de usar Case para el SQL porque considero que seria mas rápido hacer esto así ya que se gestiona en el motor y no en el aplicativo, si fuera en el aplicativo deberia recorrer nuevamente todos los registros para hacer el cambio de numero a texto, y ese método se lo recomendé porque es el que yo uso para FirebirdSQL, lo que no sabia era cual era su simil para el SQLServer 2000 y ya me di con la sorpresa (según comenta Puchungon) de que es exactamente igual al de Firebird.

                        Pequeño detalle que me comentaron en privado es que "Select case Campo1.... " del SQL parece similar al "Select Case Condicion" del VB6, siendo que el del motor se ejecuta por cada linea o registro obtenido y que al final no difiere mucho de los iif anidados pero que sql2000 no acepta.

                        Finalmente efectivamente me deja confundido de que el codigo que el demuestra no corresponde a lo que supuestamente se debe ver en la imagen adjunta, posiblemente fue un lapsus de copypaste, considerar tambien que quiza en su motor no es necesario hacer:
                        WHEN '1' THEN 'ABIERTO'
                        sino
                        WHEN 1 THEN 'ABIERTO'

                        Ya nos lo aclarara.
                        --------------------------------
                        Si eres agradecido, obtendrás más...

                        YAcosta

                        Comentario


                        • #27
                          Re: Infomre condicionado.

                          Fenomenal tu explicación, amigo Yván. Y eso que yo sólo hablaba de que se presentaban los números en lugar de los literales... A mí también me parece probable que se deba a que sobran las comillas... Un abrazo.
                          José María Movilla Cuadrado
                          ______________________
                          Normas del foro
                          www.foro.vb-mundo.com
                          www.vb-mundo.com

                          Comentario


                          • #28
                            Re: Infomre condicionado.

                            Disculpen conpañeros se me fue la imagen pero si las comillas de el valor numerio esta de mas jejejeje solo lleva comillas 'ABIERTO'.

                            Aqui esta como quedo el informe gracias a todos cada dia se aprende algo en este mundo del desarrollador, muy claro en sql server 2000 no se usa IIF ni tanpoco IF eso fue canbiado por CASE.

                            Comentario

                            Trabajando...
                            X