Autor Tema: Tecnicas de programacion  (Leído 22613 veces)

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

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Tecnicas de programacion
« en: Junio 10, 2011, 08:09:30 pm »
Holas, sigo con mi incursion en el tema de las bases de datos y tengo una pregunta, haciendo cosas relativamente simples los metodos normales de sacar, cargar, editar datos funcionan bien, ahora estoy teniendo problemas cuando quiero hacer cosas mas complicadas y me imagino que es simplemente mi ignorancia en el tema y que debe haver maneras mas eficientes y profesionales de hacer las cosas. Por ejemplo, una cosa muy tediosa es hacer los queries al tener que muchas columnas, el string se transforma en un poema (por lo largo) y hay que conacatenar, escapear y poner quotes a lo perro, me imagino que hay maneras mas simples de hacer esto, se de la existencia de los stored procedures pero no estan diponibles en todos los motores.. bueno dejo eso como mi primer consulta porque tengo mucho mas.
« última modificación: Junio 11, 2011, 12:56:44 am por YvanB »

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:Tecnicas de programacion
« Respuesta #1 en: Junio 10, 2011, 08:32:55 pm »
Si seguis usando access, no hay literalmente Stored Procedures (Procedimientos almacenados), pero si hay consultas parametrizables :D, es decir, podes llamar a una sola consulta SQL desde access con parametros.

"SELECT ID, Nombre, Apellido FROM tblPersonas WHERE Nombre LIKE @nombre"
Asi lo guardas en una consulta en access

Luego

Código: [Seleccionar]
Dim objCmd As ADODB.Command
Set objCmd  = New ADODB.Command

Set objCmd.ActiveConnection = objConn ' Nuestra conexion

objCmd.CommandText = "selectPersonas" ' Nombre de la consulta
objCmd.CommandType = adCmdStoredProc ' CRUCIAL! para que funcione :P

Dim objParam
Set objParam = objCmd.CreateParameter("@nombres" , adVarchar, adParamInput, 0, 0)
objCmd.Parameters.Append objParam

objCmd.Parameters("@nombres") = "pepito"

objRS.Open objCmd

' Y aca lo recorremos, para mostrar los resultados

No lo probe, lo hice al vuelo (igual lo saque de aca)

Al menos yo lo uso mucho para evitar tenes consultas en pleno codigo :P

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:Tecnicas de programacion
« Respuesta #2 en: Junio 10, 2011, 08:55:22 pm »
Por lo que vi, voy a necesitar stored procedures y bases de datos relacionales (dos cosas de las que no tengo idea) por lo menos para no hacer un desastre en el codigo (puedo usar sqlserver). Pero sigo con muchas dudas.. voy a poner un ejemplo concreto de cosas con las que me tope.

Vamos a suponer que mi objetivo es hacer un costeador de recetas (no es el caso pero se ajusta bastante al lo que necesito... y tengo hambre!!!)

Como base tendria una tabla:
ingredientes (codigo/descripcion/precio)

Luego la de las recetas que agruparia ingredientes:
receta (receta_id/codigo del ingrediente/ cantidad)

Y para terminar el costeo
recetario (receta_id/descripcion)

esto me genera una dependecia entre datos (este es mi problema) que cuando por ejemplo modifico ingredientes, ya sea cambiar el precio, eliminar o modificar las cantidades en una receta las tendria que reflejar de manera dinamica en la interfaz que como decia antes ya se me lleno de porqueria por los queries y cargar los datos en las tablas.. la verdad me tiene mal esto, imagino que hay maneras de hacer todo esto sin tanto lio.

Estoy trabajando con vb.net 2010.


seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Tecnicas de programacion
« Respuesta #3 en: Junio 10, 2011, 09:32:41 pm »
yo nunca tuve problemas, y eso que he visto consultas que son eternas, hay algunos que lo hacen en una sola linea, y eso esta mas que mal, ya que es practicamente "inseguible" la consulta. mis consejos son los siguientes:

1 - para hacer una consulta, si vas a usar el metodo de "concatenacion", te recomiendo usar en .NET el stringbuilder, ya que como debes saber, es  infinitamente superior en velocidad al string comun (cuando se usa en bucle), por ejemplo si tenes que recorrer algun objeto con un bucle y al mismo tempo ir insertando datos y creas ese string en cada iteracion, con el string comun tardas muchisimo mas.

2 - en visual basic 6 como no existe stringbuilder, y la verdad no he encontrado forma de optimizarlo, o sea las consultas las hago con la famosa concatenacion, pero para que sea bien entendible tenes que ordenar la consulta, si la ordenas no creo que tengas problemas de entenderla, aca te paso un ejemplo de una consulta ordenada:

Código: [Seleccionar]
    Dim vSQL As String
   
    vSQL = " SELECT loc.idlocalidad,loc.nombre AS nombrelocalidad,pro.idproducto,pro.nombre AS nombreproducto,"
    vSQL = vSQL & " COUNT(DISTINCT(cd.idpdv)) AS visitados,"
    vSQL = vSQL & " COUNT(DISTINCT(CASE WHEN cd.entrega>0 THEN cd.idpdv END)) AS Alcance"
    vSQL = vSQL & " FROM censosdetalle cd"
    vSQL = vSQL & " INNER JOIN pdv p ON cd.idpdv=p.idpdv"
    vSQL = vSQL & " INNER JOIN localidades loc ON p.idlocalidad=loc.idlocalidad"
    vSQL = vSQL & " INNER JOIN productos pro ON cd.idproducto=pro.idproducto"
    vSQL = vSQL & " WHERE 1=1"
    vSQL = vSQL & " AND cd.idproducto IN (" & vIdProElegidos & ")"
    vSQL = vSQL & " AND loc.idlocalidad IN (" & vIdLocElegidas & ")"
    vSQL = vSQL & " GROUP BY loc.idlocalidad,loc.nombre,pro.idproducto,pro.nombre"
    vSQL = vSQL & " ORDER BY loc.idlocalidad,pro.idproducto"

no es una consulta grande, hay consultas 10 veces mas grandes, pero como ves es mucho mejor que hacerla en una sola linea como hacen algunos.

en .NET eso lo haces igual, pero con un objeto stringbuilder y el .Append, por las dudas para reiniciar el stringbuilder en el comienzo de cada iteracion tenes que poner el .Lenght = 0

saludos.

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:Tecnicas de programacion
« Respuesta #4 en: Junio 10, 2011, 09:39:06 pm »
Si, vi cosas asi.. y me dan vertigo, pense que era yo haciendo locuras pero aparentemente es la manera de resolverlo. Siguiendo con lo anterior, cuando tenes cosas asi tipo "cascada" donde tenes que resolver por ejemplo calculos que dependen de datos que a su vez dependen de calculos, hay que seguir la "cascada" y resolver todo a mano o hay maneras de enlazar eso? y con lo de la interfaz como se manejan? Se buscar y no soy tarado pero esto de las bases de datos me puede, veo procedimientos repetitivos e ineficientes por todos lados y me da la sensacion de que se puede hacer de otra manera.

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Tecnicas de programacion
« Respuesta #5 en: Junio 10, 2011, 09:48:10 pm »
no te entendi bien  :P, si me das un ejemplo....

otra cosa es, que si vas a programar en bases de datos, aunque sea un pedorro ABM, esta bueno siempre hacerlo en 3 capas, te queda todo ordenado, y en la capa de la interfaz (formularios) casi no te queda codigo, esta todo dentro de las clases.

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:Tecnicas de programacion
« Respuesta #6 en: Junio 10, 2011, 09:57:16 pm »
Con respecto a la interfaz lo que decia es que por ejemplo tengo un proyecto MDI con digamos tres formularios abiertos y ahi viene el ejemplo anterior

Código: [Seleccionar]
Vamos a suponer que mi objetivo es hacer un costeador de recetas (no es el caso pero se ajusta bastante al lo que necesito... y tengo hambre!!!)

Como base tendria una tabla:
ingredientes (codigo/descripcion/precio)

Luego la de las recetas que agruparia ingredientes:
receta (receta_id/codigo del ingrediente/ cantidad)

Y para terminar el costeo
recetario (receta_id/descripcion)

esto me genera una dependecia entre datos (este es mi problema) que cuando por ejemplo modifico ingredientes, ya sea cambiar el precio, eliminar o modificar las cantidades en una receta las tendria que reflejar de manera dinamica en la interfaz


cual seria la manera de "refrezcar" todas la ventanas cuando todo esta enlazado. se que se pueden tener eventos y coasas asi pero no tengo bien claro eso. Quiero aprender a hacer esto correctamente, no me interesa meter codigo por todos lados (que podria..), pero quiero que sea lo mas modular y mantenible posible porque es provable que tenga que escalar el proyecto eventualmente.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Tecnicas de programacion
« Respuesta #7 en: Junio 10, 2011, 10:07:15 pm »
Hola Cobein.

Mi estimado, pienso que estas queriendo empezar por los pies, el código sql es casi lo ultimo que debes ver, tu confusión radica en que no has hecho el diseño y por tanto (creo yo) viene tu confusión.

Lo que si es cierto (como dijo sebas) hay consultas muy muy complejas y no queda de otra que hacerla, si has hecho un diseño y mantenido un cierto orden veras que por mas grande y "compleja" que se vea la consulta en realidad no lo es. Para mi la verdadera joda es cuando tengo que leer los scripts SQLs de otros, allí si es un dolor de cabeza, pero cuando esta bien creado incluso tapando la pantalla con la mano de cierta parte del código logras entenderlo todo.
Recomendación: Usa Nombres cortos para las tablas y los campos. Veamos tu ejemplo (lo sigo en el siguiente post para q no se me meta otro usuario ya que esta fluido este hilo)

Me encuentras en YAcosta.com

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Tecnicas de programacion
« Respuesta #8 en: Junio 10, 2011, 10:09:53 pm »
Otra cosa, para empezar te puede venir muy pero muy bien usar el DataEnvironment del VB6, porque alli practicamente "dibujas" la consulta sql, osea, solo enlazas tablas y el codigo se va escribiendo, luego lo retocas- Esto no importando el motor que tengas, algunos te joderan un pelin pero es superable.
Continuo
Me encuentras en YAcosta.com

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Tecnicas de programacion
« Respuesta #9 en: Junio 10, 2011, 10:14:22 pm »
Realizar un Costeador de Recetas.:
Tabla Maestro: tIngred (Tabla de Ingredientes)
Campos:
tIngred_Id
tIngred_Desc
tIngred_Precio

Tabla Maestro tReceta (Tabla de Recetas)
tReceta_Id
tReceta_tIngred_Id
tReceta_Cant

Dime si hasta alli vamos bien o quiza mi nomenclatura marea... te juro que al final la lectura se hace tan sencilla como leer la cenicienta.

Hasta aqui no hace falta mas, ya que por consulta sale el valor de cada Receta... tu diras, sigo?
Me encuentras en YAcosta.com

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Tecnicas de programacion
« Respuesta #10 en: Junio 10, 2011, 10:15:16 pm »
cual seria la manera de "refrezcar" todas la ventanas cuando todo esta enlazado. se que se pueden tener eventos y coasas asi pero no tengo bien claro eso. Quiero aprender a hacer esto correctamente, no me interesa meter codigo por todos lados (que podria..), pero quiero que sea lo mas modular y mantenible posible porque es provable que tenga que escalar el proyecto eventualmente.

buena pregunta  8), nunca he realizado algo asi, digo de actualizar varias ventanas automaticamente ante un cambio, en realidad nunca he trabajado con mas de una ventana abierta al mismo tiempo, pienso en triggers que detecten el cambio, pero ni idea como es, estaria bueno saberlo.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Tecnicas de programacion
« Respuesta #11 en: Junio 10, 2011, 10:17:25 pm »
cual seria la manera de "refrezcar" todas la ventanas cuando todo esta enlazado. se que se pueden tener eventos y coasas asi pero no tengo bien claro eso. Quiero aprender a hacer esto correctamente, no me interesa meter codigo por todos lados (que podria..), pero quiero que sea lo mas modular y mantenible posible porque es provable que tenga que escalar el proyecto eventualmente.

buena pregunta  8), nunca he realizado algo asi, digo de actualizar varias ventanas automaticamente ante un cambio, en realidad nunca he trabajado con mas de una ventana abierta al mismo tiempo, pienso en triggers que detecten el cambio, pero ni idea como es, estaria bueno saberlo.

Pero si habla de ventanas y quiero refrescos en tiempo real de esas ventanas (o sea formularios) solo tiene dos formas. Usar controles que se actualizas automaticamente... por ejemplo el DBGrid me parece que hace eso. O poner un timer que actualice las consultas.
Me encuentras en YAcosta.com

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:Tecnicas de programacion
« Respuesta #12 en: Junio 10, 2011, 10:20:25 pm »
Verdad que vos usabas .net (y yo que sigo en vb6 xD)

Lo que te preocupa, lo han mejorado mucho a tal punto de que "lo resolvieron", son lo que serian "DataSets tipados" esto es, una vez hecha bien la base de datos, con un asistente te genera todo el entorno para que simplemente enlazes los controles a cada campo y wualá!

En cambio si queres por donde comenzamos todos, seria usar la POO y usar la programacion en capas

Interfaz  (Llaman a las clases, nunca tocan nada de la BD directamente)

Capa de negocios (Clases, aca hay una clase por cada tabla con sus respectivas propiedades y relaciones)

Capa de acceso a datos ( por lo general o para principiantes creo yo, esta muy unida a la capa de negocios. Es donde llamas a la BD y rellenas los datos de las clases)

Siempre ante cada cambio de datos, estas obligado a cambiar la interfaz, ya sea a mano (cambiando un solo dato en una fila de un Grid) o refrescando los datos enteros (si haces eso, puede que se pierda la logica de programar en capas) :P

Hay muchos aspectos sobre los cuales trabajar...

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:Tecnicas de programacion
« Respuesta #13 en: Junio 10, 2011, 10:23:34 pm »
cual seria la manera de "refrezcar" todas la ventanas cuando todo esta enlazado. se que se pueden tener eventos y coasas asi pero no tengo bien claro eso. Quiero aprender a hacer esto correctamente, no me interesa meter codigo por todos lados (que podria..), pero quiero que sea lo mas modular y mantenible posible porque es provable que tenga que escalar el proyecto eventualmente.

buena pregunta  8), nunca he realizado algo asi, digo de actualizar varias ventanas automaticamente ante un cambio, en realidad nunca he trabajado con mas de una ventana abierta al mismo tiempo, pienso en triggers que detecten el cambio, pero ni idea como es, estaria bueno saberlo.

Es que en realidad es inocomodo trabajar asi, mas facil de uno por vez, pero hay veces que no alcanza (no se si este sea el caso)

Eso si, SIEMPRE, ante cada cambio de formulario, actualizar los datos (como si fuera en la web, Ves el indice, quieres agregar, agregues o canceles, cuando vuelves al indice los datos se actualizan igual)

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Tecnicas de programacion
« Respuesta #14 en: Junio 10, 2011, 10:28:08 pm »
creo que lo esta haciendo en .NET, a proposito del Timer, he visto en internet un ejemplo que actualiza automaticamente un datagridview cada determinado tiempo, pero sin usar el evento Tick() sino que usa un delegado, igualmente debe consumir recursos.