Autor Tema: Buenas practicas de programación  (Leído 636 veces)

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

yogutero

  • Bit
  • Mensajes: 3
  • Reputación: +0/-0
    • Ver Perfil
Buenas practicas de programación
« en: Noviembre 04, 2022, 06:37:48 pm »
Buenas noches:
Me presento,  soy Carlos desde España, me acabo de registrar en el foro puesto que soy desarrollador de vb6 hace décadas y me gustara consultaros algunas dudas que tengo en cuanto a buenas practicas de programación.

inicialmente son dos las dudas.


Cuando se está haciendo el CRUD de un documento digamos albaranes existe varias lógicas a la hora de programar pero no se cual es la mas eficiente.
Suelo tener dos tablas una con la cabecera del documento y otra con las líneas.
La cabecera se crea llamando a carga_cliente por ejemplo y las lineas a carga_lineas. Esto es cuando quiero consultar desde un listado con X albaranes uno en concreto, haciendo doble click en la linea de un listview. Sin problema.
Pues bien al crear un albarán nuevo sigo llamando a carga_cliente simplemente cuando pones el nombre o el código del cliente pero a la hora de añadir líneas me surge la duda

Opción uno: cada vez que se rellena una línea y pulsamos el botón de insertar linea se añade al listview Y SE GUARDA EN LA BD. insert into albaranes_lineas.....
No hay botón guardar documento sino que se va creando o modificando el albarán "sobre la marcha" y claro si un cliente tiene un albarán más de 30 lineas y el ordenador le da un error no pierde nada.

Opción Dos: el botón insertar linea solo añade los campos al listview de forma que es en el botón guardar final donde
  - se guarda la cabecera en la tabla albaranes
 -  se guardan las líneas todas a la vez recorriendo el listview y haciendo el Insert en albaranes_lineas.

Se hacen menos consultas a la base de datos pero si el cliente tiene un albarán con 30 líneas y se va la luz te quedas sin albarán.

Stocks

 - Con la opción uno una vez que hago doble clic en una linea del albaran subo esa linea para poder ser modificada (y guardo las unidades que se suben) y cuando se modifica y se vuelve a bajar
    veo los cambios que hay en la cantidad y asi sumo o resto del stock.
-  con la opción dos , hago un delete de toda las líneas sumando el stock y un nuevo insert de todas las líneas restando el stock.

¿Qué opináis?


Segunda duda.

cuando se crea un documento se debe obtener el siguiente en la lista de albaranes , después del A22-0034 va el A22-0035,
¿Qué es mejor guardar siempre el ultimo en una tabla digamos contadores y extraer el código de esa tabla sumándole uno o buscar en la tabla albaranes el ultimo y añadirle uno?



« última modificación: Noviembre 10, 2022, 05:42:42 pm por yogutero »

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Buenas practicas de programación
« Respuesta #1 en: Noviembre 10, 2022, 09:50:26 pm »
Hola Carlos.

Te diría sobre la primera inquietud, yo uso una combinación de tu Opcion1 y Opcion2 a la vez.

Verás, Siempre creaba la lista de ítems (o líneas) en el control de lista y al final grababa. Así por años, y si es cierto, algunas pocas veces (muy pocas) podía ocurrir algún percance y si se corta la luz o lo que fuera se pierde toda la lista. Actualmente ya no lo hago así.
Lo que actualmente hago es que mientras se va agregando ítems o líneas a la lista estas las grabo ya mismo en la BD pero en una tabla temporal. Si se va la luz ya sabes de donde tomo los datos para volver a poblar la lista.
Cuando el usuario termina hago el volcado a la tabla "real" y listo. Resuelto el problema de cualquier corte de luz o lo que fuera.
Y ¿Por qué grabarlo en una tabla temporal y no directamente en la "real"? Porque en mi caso al grabar un registro en la tabla "real" también a la vez se tocan otras tablas ya sea por triggers u otros, por ello prefiero mantenerlo separado. Si el commit es exitoso ya borro la temporal.
¿Se toca mucho la BD con esto? Pues si, pero la verdad y dependiendo del motor que uses esto seria insignificante (en realidad seria nada para todos los motores menos Access).
Comentarte además que esta tabla la uso para varios temporales distinguiendo usuario y maquina desde donde hace el llenado a la lista.

Sobre la parte de Stocks no te entendí

Con la segunda duda:
Si usas un numero de control en una tabla para la parte de negocio es conveniente hacerlo como indicas, o sea allí le sumas uno y ya. Incluso uso esa forma con documentos fiscales y cero problemas.


Saludos desde algún lugar de Lima-Perú como dice mi amigo Abtm.



Me encuentras en YAcosta.com

yogutero

  • Bit
  • Mensajes: 3
  • Reputación: +0/-0
    • Ver Perfil
Re:Buenas practicas de programación
« Respuesta #2 en: Noviembre 11, 2022, 05:16:35 pm »
Gracias por tus aportes.
En cuanto a los stocks trato de explicarme mejor.

Con el método 1 que usas para gestionar las unidades que se añaden o que salen del almacén cuando tienes un lsv relleno con decenas de productos
se debe guardar las unidades en algún sitio ANTES de editar la nueva linea para que cuando de guarde en el lsv se sume o se reste automaticamente con las cantidades cambiadas.
EJ: Producto 1   45 Unidades  3.40 Euros

cuando se edite la línea se guarda las unidades temporalmente , al actualizar pues se suma o resta la cantidad cambiada menos la temporal.



Con el método 2 ya que no se guarda hasta que se le da al botón guardar , al guardar las líneas no se sabe que numero de unidades hay después de los cambios así que opto por:
- se eliminan TODAS las líneas del albarán restando el stock
- Se insertan TODAS las líneas al mismo albarán SUMANDO las unidades, así se controla el stock correctamente.

¿Qué método es mejor? ¿Hay otros más eficientes?







 

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Buenas practicas de programación
« Respuesta #3 en: Noviembre 14, 2022, 01:09:41 pm »
La verdad que no te entendí bien... o sea, no entiendo que quieres hacer, es momento de decir: "No eres tu, soy yo".
Lsv supongo que te refieres a Listview? creo que si, será que no uso ese control pero asumo que ese es.

No me queda claro si hablas exclusivamente de la capa de presentación (de allí el lst) o de la bd.
"...guardar las unidades en algún sitio ANTES de editar ..."  ¿para que?

"cuando se edite la línea se guarda las unidades temporalmente , al actualizar pues se suma o resta la cantidad cambiada menos la temporal."  ¿¿¿???

"al guardar las líneas no se sabe que numero de unidades hay después de los cambios..." numero de unidades de donde??? del lst o de la bd???

A ver, yo lo manejo así:
Lo siguiente es muy al margen de la lista que guardas en la BD temporalmente por si se presenta algún tipo de corte.

En la medida que voy agregando items a la lista voy validando la disponibilidad (checando el stock). Ya será tu política permitir o no permitir stock cero, notificar si lo que se pide es mayor a lo que existe, si hay items en reserva, etc.
Cuando se termina toda la lista y le dan al botón grabar, antes de tocar las tablas de la BD hago un bloqueo y valido nuevamente cada una de las líneas (ya que trabajo en red), si la validación no pasa doy un mensaje y no toco nada en la BD y la libero. Si la validación pasa entonces grabo/actualizo/elimino todo lo que requiera esa transaccion y fin.

Saludos
Me encuentras en YAcosta.com

yogutero

  • Bit
  • Mensajes: 3
  • Reputación: +0/-0
    • Ver Perfil
Re:Buenas practicas de programación
« Respuesta #4 en: Noviembre 16, 2022, 04:14:44 pm »
Buenas tardes:
Gracias por preocuparte de responder a estas preguntas un poco filosóficas.

intentaré explicarme mejor.

Con un albarán hecho (cabecera + líneas) que aparece resumido en una linea de un listview del tipo

codigo albaran     fecha              cliente         subtotal    IVA      total 
A22-03434       10/11/2022       Cliente 1       100          21         121


al hacer doble click pasamos a mostrar el albarán concreto seleccionado en un formulario aparte donde carga la cabecera concreta y todas las lineas del mismo 


Cada línea es del tipo

Articulo                      Cantidad    Precio     descuento subtotal
Disco duro 500 Gb           1              30            10          24,40
Memora DDR4                 2              25             0              50

Mostrados también en un listview. cuando hacemos Click en el Listview podemos cambiar la cantidad por ejemplo de 1 a 4 , pero como NO guardamos en la base de datos hasta terminar todos los cambios , al guardar como las cantidad han cambiado tenemos que saber las cantidades que ha antes de modificar para poder cambiar correctamente el stock.

O bien eliminar TODAS las lineas del albarán -> añadir las unidades al stock -> guardar TODAS las lineas al stock -> restar las uinidades al stock.


Si se guardara cada linea en la base de datos al modificar no habría que hacer esto.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Buenas practicas de programación
« Respuesta #5 en: Noviembre 16, 2022, 07:29:50 pm »
Por eso te comentaba antes que yo guardo el albaran (creo que albaran es como factura) en otra tabla por temas de corte de luz, pero esto solo para recuperación.

Y en esta parte donde dices:
"... cuando hacemos Click en el Listview podemos cambiar la cantidad por ejemplo de 1 a 4 , pero como NO guardamos en la base de datos hasta terminar todos los cambios , al guardar como las  ..."

Alli justo al final donde dices "..., al guardar..." es que te comenté anteriormente que justo antes de guardar pero dentro de la transaccion debes VOLVER a validar cada una de las líneas comprobando la disponibilidad.
Por ejemplo, tu lo debes tener +/- así:

Código: [Seleccionar]
GuardarCabecera
GuardarDetalle
OtrasOperacionesQueHagas

Tendría que ser así:
Código: [Seleccionar]
db.BeginTrans         <-- AbrirTransaccion 
If ComprobarDisponiblidad then   <--Esta seria una función booleana
   GuardarCabecera
   GuardarDetalle
   OtrasOperacionesQueHagas
   db.CommitTrans    <-- Comitear 
   Msgbox(ok)
Else
   db.RollBacks        <--  Deshacer
   Msgbox(No hubo cambios)
End if
Me encuentras en YAcosta.com