Visual Basic Foro
Programación => Bases de Datos => Mensaje iniciado por: YAcosta 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:
(http://img593.imageshack.us/img593/1772/sql1.jpg)
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:
(http://img17.imageshack.us/img17/2849/sql3r.jpg)
¿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
(http://img513.imageshack.us/img513/747/sql4.jpg)
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
(http://img39.imageshack.us/img39/5870/sql5p.jpg)
y si desde alli quisiera ver la consulta SQL solo tengo que darle a la funcion "Definir" asi:
(http://img97.imageshack.us/img97/2217/sql6.jpg)
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:
(http://img21.imageshack.us/img21/9423/sql7w.jpg)
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)
-
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.
-
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
-
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...
-
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...
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)
-
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
-
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.
-
¿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.
-
Podria ser!!! pero la verdad no se como trabaja isnull :o
-
If IsNull(rs!campo) Then lo que quieras
-
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