Autor Tema: Consultas SQL en Módulos  (Leído 7204 veces)

0 Usuarios y 1 Visitante están viendo este tema.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Consultas SQL en Módulos
« en: Febrero 19, 2011, 12:24:32 am »
Bueno, en el sistema que tengo desarrollado, hasta hace 6 meses tenia alrededor de 300 consultas SQL. Para escribir este post he checado que tengo mas e 450 consultas SQL entre Selects, Inserts Updates, Deletes.
Para mi seria un despelote y un dolor de cabeza recorrerme todo el código SQL mezclado con el codigo VB6, esto ya lo previ hace años y por eso opte a reunir todas las consultas SQL en módulos, de tal manera que :
1.- Cuando quiera ubicar una consulta especifica solo me concentro en un sector de busqueda.
2.- Me resulta mas legible leer el codigo VB sin "marearme" con el SQL siendo que algunas consultas SQL son enormes.
3.- Reutilizo parametrizando las consultas SQL
4.- La depuración o mantenimiento me resulta mas sencilla y rapida.
4.- Para armar reportes me es totalmente flexible hacer cambios en "caliente".
5.- A la larga gano muchismo tiempo y por lo tanto me vuelvo mas productivo.

Desventajas
Ayúdame a encontrar una. No me digas que el aplicativo crece, crece si, pero una nada y con el costo de las RAMs por los suelos ni vale la pena considerarlo.

Ahora, quiza hacer todo esto cobre sentido cuando uno tendra en su software una enorme cantidad de consultas, si uno va a tener alrededor de 50 consultas quiza no resulte beneficioso armar todo esto.

Empiezo asi:

Uso 4 modulos, ¿porque no usar solo uno? porque muchas veces hay cosas que solo requiere hacer copy paste y modificar algunas cosillas, entonces me resulta mas facil tomar la consulta siguiente o anterior del mismo modulo. Tambien lo hago porque cuando tengo que armar una consulta desde cero me es mas rapido ubicar una del mismo tipo, me resulta mas rapido.
Entrando un poco mas, por ejemplo entro al modulo donde solo tengo puros SELECTS de esta forma:


¿Porque llamo los campos de la forma que se ven? es tema de otro post y tambien tiene su sustento, la nemotecnia es parte de mi forma de programar.
Como pueden ver, las consultas las tengo parametrizadas, casi siempre, los parametros pueden ser valor o condiciones para tomar una parte de la consulta SQL. De tal manera que puedo excluir de la consulta algunos Where o aumentar otros.

Ahora si, lo unico que tengo que hacer es invocar de esta forma

Al rs le paso los parámetros y listo, la verdad esto lo veo mas limpio.

Otro ejemplo: Aqui armo un reporte... y no tengo una sola linea de código sql a la vista que me maree cuando lo que quiero ver es el puro codigo VB6

y si desde alli quisiera ver la consulta SQL solo tengo que darle a  la funcion "Definir" asi:

Y de esa forma chequeo la consulta SQL

Otro ejemplo, lo mas lindo es cuando tengo que insertar a varias tablas con diversas validaciones todo en un solo proceso. Aqui un extracto:

y los inserts siguen mas abajo, no se ustedes pero para mi ver alli mismo todo el código SQL me marearia.

Bien, si aun no queda claro lo que quiero explicar que vengan las preguntas. Ojo, Insisto, Recalco y Subrayo que no quiero decir con esto que estoy explicando sea LA FORMA de hacer las cosas, es solo un método que a mi me sirvio y me va muy bien, y asi pasen años mantener el código no me presenta complicación en su estructura y solo me concentro en el fondo del problema a resolver, los beneficios son claros.
Se que hay de los que se tiran unas enormes sabanas donde mezclan el código VB6 y SQL y ya los veo haciendo PGDN y PGUP y agudizar la vista para ubicar lo que quieren ubicar, si ellos se sienten mejor asi, si se sienten mas productivos, mas ordenados, pues bien por ellos, ¿quien soy yo para cambiarles sus formas? jeje, pero si a alguien se le adecua esta forma pues me avisa y le suelto unos tips mas (siempre por este medio).

Próximamente: Vídeo FirebirdSQL (No lo veannnn jajaj, tu entiendes el chiste Fx700)
Me encuentras en YAcosta.com

fx700

  • Kilobyte
  • **
  • Mensajes: 95
  • Reputación: +4/-2
    • Ver Perfil
Re:Consultas SQL en Módulos
« Respuesta #1 en: Febrero 19, 2011, 09:51:54 pm »
Tu metodo de programacion es una buena forma de ahorrar tiempo no es que haya desarrollado grandes sistemas ya que recien estoy dando mis 1eros pasos y no me a tocado vivir este tipo de problema cuando un sistema tiene tantas consultas.

Por si biene al caso no es que alave a vb.net y tampoco soy programador .net  pero ahora algunos piden programadores que sepan programar en 3 capas(capa de presentacion, negocio y datos) y en cuanto a programacion web(php, asp y otros) gente que sepa programar en MVC(modelo vista controlador) que biene hacer casi lo mismo que las 3 capas.

Por ejemplo supongo que habra programadores que utilizan clases para utilizar las Sentencias SQL algo similar a lo de YvanB y en cuanto a PHP algunos utilizan los framework's php que vendrian hacer simplemte un conjunto de clases prediseñadas para facilitar la programacion.

En resumen, cada uno tiene su estilo para programar incluso en la denominada architectura de software se han creado el MVC y 3Capas entre otros precisamente para facilitar la programacion y evitar las situaciones que menciona YvanB, tampo es que se necesite p.e aplicar 3 capas en un sistema pequeño seria perder el tiempo ya que haciendo todo directamente seria mejor caso contrario seria no aplicar las 3 capas para desarrollar un ERP aunque cada uno tendra sus estilos para hacerlo y entenderlo perfectamente.

Como vb6 se quedo y no permite utilizar las 3 capas o si?, los estilos de programacion como los de YvanB son una buena opcion a seguir aunque no la unica.








« última modificación: Febrero 19, 2011, 09:54:44 pm por fx700 »

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Consultas SQL en Módulos
« Respuesta #2 en: Febrero 19, 2011, 10:07:45 pm »
Cierto, debi aclarar que todo lo que indique esta referido a la experiencia con VB6. No conozco otras herramientas de desarrollo y probablemente no las llegue a conocer porque si me va bien en pocos años ya debo dejar de programar para dedicarme a otros negocios (siempre en el mundo soft)

Saludos
Me encuentras en YAcosta.com

ssccaann43

  • Moderador
  • Terabyte
  • *****
  • Mensajes: 970
  • Reputación: +97/-58
    • Ver Perfil
    • Sistemas Nuñez, Consultores y Soporte, C.A.
Re:Consultas SQL en Módulos
« Respuesta #3 en: Febrero 21, 2011, 11:04:23 am »
YvanB, pues en cuanto a tu manera de programar considero que eres ordenado y metodico..! Esto te favorece en todo caso para revisar las consultas y poder repararlas en caso de error..! Creo que estan muy buenos tus modulos y ciertamente sin importar el tamaño del proyecto, mientras tenga BD sería espectacular tener unos modulos con sus funciones de SQL bien estructurados..! Saludos...
Miguel Núñez.

wolf_kof

  • Visitante
Re:Consultas SQL en Módulos
« Respuesta #4 en: Febrero 21, 2011, 01:29:44 pm »
YvanB tienes razon de utilizar tus modulos en tus proyectos, y retiro lo dicho en otros post!!!!  ;D yo por mi parte no utilizo las sentencias insert etc.... si no que utilizo el motor de adodb osea el .addnew, .update, .filter etc. por lo tanto me queda un poco mas pequeño por ejemplo yo para poder guardar una factura utilizo este codigo...

Código: (vb) [Seleccionar]
Private Sub Command2_Click()
On Error Resume Next
If estado = "Nuevo" Then

    If Check1.Value = 0 Then
        CREDIT = "CONTADO"
    End If
    correlativo.Requery -1
    If estado = "Nuevo" Then
       
        ' agrega una nueva factura
       
        ventas.Requery -1
        detalleventas.Requery -1
        inventario.Requery -1
       
        ventas.AddNew
       
        'Se obtiene el numero de facura
        ventas!factura = correlativo!Id + 1
        correlativo!Id = ventas!factura
        correlativo.Update
         ff = ventas!factura
               
        ventas!fecha = t2.Value
        ventas!nitc = t1.Text
        ventas!cliente = t4.Text
        ventas!direccion = t5.Caption
        ventas!cantidad = Text2.Text
        ventas!recibido = Text3.Text
        ventas!cambio = Text4.Text
        ventas!no_tarjeta = Text5.Text
        ventas!estado = CREDIT
        ventas!credito = Check1.Value
        ventas!vendedor = inicio.usus
        ventas!letras = letras.Text
        ventas!ruta = t6.Caption
       
        If Check4.Value = 1 Then
            ventas!envio = "EMITIDO"
        Else
            ventas!envio = "NO EMITIDO"
        End If
       
        If Check3.Value = 1 Then
            ventas!fac = "EMITIDO"
        Else
            ventas!fac = "NO EMITIDO"
        End If
       
       
        temporalv.Filter = "factura = '" & maquina & "'"
           
       
        Do Until temporalv.EOF
            detalleventas.AddNew
            detalleventas!factura = ventas!factura
            detalleventas!cant = temporalv!cant
            detalleventas!codigo = temporalv!codigo
            'detalleventas!maquina = temporalv!factura
           
            inventario.Filter = "codigo = '" & temporalv!codigo & "'"
            inventario!stock = inventario!stock - temporalv!cant
            inventario.Update
           
            detalleventas!descripcion = temporalv!descripcion
            detalleventas!puni = temporalv!puni
            detalleventas!subtotal = temporalv!subtotal
            detalleventas!prpuni = temporalv!prpuni
            detalleventas!prptotal = temporalv!prptotal
            detalleventas.Update
            temporalv.MoveNext
        Loop
        confignume = ff
        'limpia la tabla temporal
       
        temporalv.MoveFirst
        temporalv.Filter = "factura = '" & maquina & "'"
        Do Until temporalv.EOF
            temporalv.Delete
            temporalv.MoveNext
        Loop
       
        If CREDIT = "CONTADO" Then
            kardex.Requery -1
            kardex.AddNew
            kardex!fecha = Date
            kardex!hora = Time
            kardex!maquina = inicio.maquina
            kardex!vendedor = inicio.usus
            kardex!descripcion = "Facturado a: " & ventas!cliente & " con no. doc: " & ventas!factura
            kardex!monto = ventas!cantidad
            kardex.Update
            kardex.Requery -1
        End If

        'SE INGRESA LOS CREDITOS SI EXISTE
        'SE INGRESA CREDITOS POR ABONOS
        If CREDIT = "ABONO" Then
            abonos.Requery -1
            abonos.AddNew
            abonos!No = "1"
            abonos!tarjeta = Text5.Text
            abonos!factura = ventas!factura
            abonos!fecha_pago = t2.Value
            If Val(Text4.Text) = "0.00" Then
            abonos!Saldo = Text2.Text
            Else
            abonos!Saldo = Text4.Text
            End If
           
            If Text3.Text = "" Then
            abonos!pago = "0.00"
            Else
            abonos!pago = Text3.Text
            End If
            abonos.Update
        End If
       
        'SE INGRESA CREDITOS POR AMORTIZACION
        If CREDIT = "AMORTIZACION" Then
            Dim inte, realpre
           
            If Val(cuotas.Text) <= 12 Then
            realpre = Val(Text2.Text) / Val(1.15)
            inte = ((Val(realpre) * 15) / 100)
            Else
            realpre = Val(Text2.Text) / Val(1.15)
            inte = ((Val(realpre) * 15) / 100)
            End If
            amortizaciones.Requery -1

            Dim numero
            Dim costo
            Dim fecha
           
           
            If Val(Text3.Text) = 0 Then
            costo = Val(realpre) / Val(cuotas.Text)
            End If
           
            If Val(Text3.Text) <> 0 Then
            costo = Val(realpre) - Val(Text3.Text)
                If Text3.Text <> "" Then
                    cuotas.Text = Val(cuotas.Text) - 1
                End If
            costo = costo / Val(cuotas.Text)
            costo = Format(costo, "0.00")
            End If
           
            fecha = t2.Value
            inte = inte / Val(cuotas.Text)
            inte = Format(inte, "0.00")
            For numero = 1 To Val(cuotas.Text)
                fecha = DateAdd("m", 1, fecha)
                amortizaciones.AddNew
                amortizaciones!factura = ventas!factura
                amortizaciones!cant = numero
                amortizaciones!mora = "0.00"
                amortizaciones!fecha = fecha
                amortizaciones!cuota = costo
                amortizaciones!interes = inte
                amortizaciones!pago = "0.00"
                amortizaciones!ssaldo = Val(costo) + Val(inte)
                amortizaciones!estado = "PENDIENTE DE PAGO"
                amortizaciones.Update
            Next
        'amortizaciones.Requery -1
        'Call datoscredito1.rrellenarcuotas
        End If
       
        ventas.Update
    End If
   
    'realizamos la inscripcion de datos
    If Check4.Value = 1 Then
        If Reportes.rsenvio.State = adStateOpen Then
            Reportes.rsenvio.Close
            Reportes.envio ff
            envio.Show
        Else
            Reportes.envio ff
            envio.Show
        End If
    End If

    Reportes.rsVentasEfectivo.Requery -1

    If Check3.Value = 1 Then
        If CREDIT <> "CONTADO" Then
            datoscredito1.Text5.Text = t1.Text
            datoscredito1.Text1.Text = ff
            Me.Hide
            datoscredito1.Show
        Else
        Me.Hide
        facturacion.cff = ff
        facturacion.Show
        End If
    End If
   
    'Limpiamos
    Call rellenarlist
    Call limpiar
    Text5.Enabled = False
   
End If
t1.Locked = True
End Sub

Lo que tu haces con una consulta externa en un módulo, como es cuestion de gustos a mi se me hace mas entendible asi que con las consultas sql, por lo que tengo entendido con las consultas sql es mas rapido (segun investigue)

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Consultas SQL en Módulos
« Respuesta #5 en: Febrero 21, 2011, 02:52:23 pm »
Son cosas diferentes. Y cierto un Execute es mas rapido y con el BeginTrans y CommitTrans me aseguro de que la transaccion se efectue correctamente.

Un detalle, veo al inicio de tu código: "On Error Resume Next", ¿Estas seguro de hacer eso? porque si sucediera un error no te enteras y lo estas poniendo en inserciones a la BD, me parece un poco peligroso, yo pongo On error resume next en código que se refiere a la funcionalidad de la aplicación y no sobre manipulación contra la BD (o maximo sobre los Selects).  Seria mejor capturar el error con  "On Error GoTo ControlError " y tratarlo, es solo una sugerencia.

Saludos
Me encuentras en YAcosta.com

wolf_kof

  • Visitante
Re:Consultas SQL en Módulos
« Respuesta #6 en: Febrero 21, 2011, 02:55:26 pm »
Gracias IvanB por tu sugerencia, lo que sucede es que con recordset.addnew no se pueden dejar campos nulos y para resolver esto esta el on error resume next (Grax SSCCAANN) lo que yo hago es probar primero sin el on error resume next para ver si tengo algún error en lo que a inserción se refiere y despues lo coloco por los campos vacios.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Consultas SQL en Módulos
« Respuesta #7 en: Febrero 21, 2011, 02:58:13 pm »
¿Pero porque no utilizas IsNull?

Digo, durante el funcionamiento de la aplicación quizá resolviste todos los errores, pero quizá no las excepciones, y los usuarios son expertos en hallar eso.
Me encuentras en YAcosta.com

wolf_kof

  • Visitante
Re:Consultas SQL en Módulos
« Respuesta #8 en: Febrero 21, 2011, 04:41:25 pm »
Podria ser!!! pero la verdad no se como trabaja isnull  :o

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Consultas SQL en Módulos
« Respuesta #9 en: Febrero 21, 2011, 04:44:09 pm »
If IsNull(rs!campo) Then lo que quieras
Me encuentras en YAcosta.com

fernandos85al@hotmail.com

  • Kilobyte
  • **
  • Mensajes: 71
  • Reputación: +3/-3
    • Ver Perfil
Re:Consultas SQL en Módulos
« Respuesta #10 en: Febrero 21, 2011, 06:38:37 pm »
Hola YvanB, Es verdad, trabajar  con modulos es mucho mejor, yo personalmente, trabajo de la misma manera, sino a los 5 minutos me mareo jeje


espero que sigan bien todos, saludos cordiales