Ir al contenido


Foto

Leer datos en una misma transaccion sin commit


  • Por favor identifícate para responder
43 respuestas en este tema

#1 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 22 enero 2009 - 01:06

gracias por la atención, tratare de Resumir:

Trabajo con Delphi 7, Componentes Zeos, Firebird 2.0

Realizo multiples inserciones en un script, un insert para la cabecera de la factura, y un insert por cada detalle de la factura.  Hasta aqui voy de las mil maravillas.  El asunto es cuando me toca asignarle el nuevo proveedor al producto recibido, esta operacion la hago en un trigger del  AfterUpdate de la tabla Detalle de compras, que entre otras cosas asigna los nuevos costos, calcula las nuevas utilidades, y en este caso deberia asignar el nuevo proveedor.

El asunto radica en que en ese momento que se dispara el trigger no se ha realizado el commit, por lo cual pienso yo que no recupera el codigo de la cabecera.

La pregunta es esta: ¿Es cierto mi manera de pensar, Firebird no ve las actualizaciones en la otra tabla hasta que no se haya realizado el commit?

Si les interesa no tengo problemas en postear el codigo.
  • 0

#2 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 22 enero 2009 - 01:10

lo olvidaba, de momento lo he solucionado agregando un update por cada detalle, donde actualizo el campo de proveedor.
  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 22 enero 2009 - 02:29

Hola Eduardo,
Efectivamente, no se leerán los datos actuales sino es hasta que se realicen los commit correspondientes. Claro está, dependerá de como esté configurado en nivel de transacción.

Ahora lo que me queda en duda, es la forma en como está relacionadas tus tablas. No se si entendí bien: ¿guardas en el detalle de las compras alguna información sobre el proveedor?
Si me pudieras comentar más al respecto de como está estructurada tu base de datos va a ser más fácil que lo entienda.

Saludos,

  • 0

#4 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 22 enero 2009 - 04:01

ese es el problema que los detalles no guardan informacion del proveedor, esta se guarda en la cabecera.  Lo que sucede es que a lo que se graba un detalle de compras este actualiza el proveedor en la ficha del producto.

seria algo asi:

Encabezado --< Detalles >-- Productos
  • 0

#5 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 22 enero 2009 - 09:54

ese es el problema que los detalles no guardan informacion del proveedor, esta se guarda en la cabecera.  Lo que sucede es que a lo que se graba un detalle de compras este actualiza el proveedor en la ficha del producto.

seria algo asi:

Encabezado --< Detalles >-- Productos


Todavía no entiendo bien porque debes de hacer un Update a Productos al momento de guardar en el detalle de Compras.  Se supone que le asignas el Proveedor al Producto al momento de la creación del mismo (producto).
  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 22 enero 2009 - 10:14


ese es el problema que los detalles no guardan informacion del proveedor, esta se guarda en la cabecera.  Lo que sucede es que a lo que se graba un detalle de compras este actualiza el proveedor en la ficha del producto.

seria algo asi:

Encabezado --< Detalles >-- Productos


Todavía no entiendo bien porque debes de hacer un Update a Productos al momento de guardar en el detalle de Compras.  Se supone que le asignas el Proveedor al Producto al momento de la creación del mismo (producto).


Efectivamente, a eso quería llegar. Por eso yo prefería ver como estaba relacionando las cosas.

O a la inversa, una vez que se da de alta un Proveedor se asignan (o se dan de alta) los productos. Ahora bien, como bien sabemos, si se trata de que para un mismo producto existen muchas proveedores, y además un mismo productor puede ofrecer muchos productos, tendremos que disponer de una tabla intermedia. E incluso, tal vez un histórico.

Como bien apunta Eduardo, en la tabla maestra de compras se debe disponer de una clave foránea hacia el ID del proveedor. A menos claro que en una misma compra intervinieran varios proveedores, allí si va ser necesario disponer dicho campo en el detalle. ¿Se trata de esto último amigo?

Saludos,
  • 0

#7 Kipow

Kipow

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 228 mensajes
  • LocationGuatemala

Escrito 22 enero 2009 - 11:24

Pues como lo tienes lo veo bien, lo unico que debes de considerar es el nivel de aislamiento. (readcommited en tu caso) para que podas leer datos que aun no han sido commiteados (jaja rara tu palabra). me imagino que hay una llave foranea del detalle de compras hacia productos?.
  • 0

#8 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 23 enero 2009 - 07:08

Gracias por responder,  la necesidad de hacer un update hacia productos se debe a que cuando se ingresa la factura que siempre es de un solo proveedor este actualiza los productos que en esos momentos no tengan proveedor asignado, es algo extraño, pero es un caso muy puntual.

La idea de asignar los productos al proveedor al crearlos no es conveniente por el tiempo que demoraria, es decir, a medida que vayan llegando se les va actualizando el proveedor.

Tambien tengo la posibilidad desde la pantalla de productos  asignar el proveedor, pero como les dije es ahorrar trabajo, y es un proveedor por productos, no se maneja el concepto de multiproveedor.

Con respecto al nivel de aislamiento efectivamente lo tengo en read commited
  • 0

#9 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 23 enero 2009 - 11:15

Ahora entiendo,
Para complementar todo lo dicho, si no es molestia, ¿Podrías darnos una muestra del código? Así vemos como estás llevando todo y ver de que modo le podemos dar la vuelta.

Saludos,
  • 0

#10 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 23 enero 2009 - 01:38

este es el codigo donde se realizan los insert, viene luego de las respectivas validaciones:



delphi
  1. //Graba la cabecera
  2.     Modulo.CON.AutoCommit := False;
  3.     sq.Script.Clear;
  4.     sq.Script.Add('Insert Into FCM(CORRELATIVO, FACTURA, TIPO,
  5. PROVEEDORCODIGO, PROVEEDORNOMBRE, PROVEEDORDIRECCION,
  6. PROVEEDORRIF, SUBTOTAL, DESCUENTO, PORCIVA, MONTOIVA, TOTAL,
  7. FECHACOMPRA, ESTATUS, PLAZO, CUOTAS, FECHACREACION, ');
  8.                                                                                                                         //CORRELATIVO,                                         
  9. FACTURA                              TIPO,                   
  10. PROVEEDORCODIGO,                    PROVEEDORNOMBRE,                   
  11. PROVEEDORDIRECCION,                    CLIENTERIF                       
  12. CLIENTETIPO,                  SUBTOTAL,                  DESCUENTO, 
  13.                       PORCIVA,                            MONTOIVA,                  TOTAL,                      FECHAVENTA,            ESTATUS
  14.  
  15. (Activo - Devuelto) , PLAZO,  CUOTAS, MONTOCUOTAS, FECHACREACION,
  16. FECHAMODIFICACION, USUARIOCREADO,
  17. USUARIOMODIFICADO,                                                                                                                                                      EFECTIVO,          TDEBITO,                  TCREDITO,                CHEQUE,                CREDITO,                      CLIENTETELF,
  18.  
  19. DESCLINEAS
  20.     sq.Script.Add('FECHAMODIFICACION, EFECTIVO, TDEBITO, TCREDITO, CHEQUE, CREDITO, MONTOCUOTAS) values (lPad((Select
  21.  
  22. Gen_Id(COMPRAS, 1) from rdb$database), 8, ''0''), ' + QuotedStr
  23. (txDocumento.Text) +  ' ,' + QuotedStr('FCM') + ', '  +  QuotedStr
  24. (txCodigo.Text) + ', ' + QuotedStr(txNombre.Text) + ', ' + QuotedStr(Copy(txDireccion.Text, 1, 60)) + ',  ' +
  25.     //PROVEEDORRIF,                      SUBTOTAL,                       
  26. DESCUENTO,                          PORCIVA,
  27.  
  28.  
  29.                           MONTOIVA,                     
  30.  
  31. TOTAL,                                          FECHACOMPRA,                         
  32. ESTATUS, 
  33.  
  34.  
  35.                         PLAZO,          CUOTAS,               
  36.  
  37. FECHACREACION,                                                 
  38. FECHAMODIFICACION,   
  39.  
  40.  
  41.           EFECTIVO,                  TDEBITO,                   
  42. TCREDITO,                CHEQUE,              CREDITO,               
  43.  
  44. MONTOCUOTAS
  45.  
  46.     QuotedStr(txRif.Text) + ',  ' +  FloattoStr(nSubTotal) + ', ' + FloattoStr
  47. (nDescuento) + ', ' +  FloattoStr(Sistema.IvaCompra) + ', '
  48. + FloattoStr(nIva) + ',  ' + FloattoStr(nTotal) + ', ' + QuotedStr
  49. (FormatDateTime('mm/dd/yyyy', txFecha.Date)) + ', ' + QuotedStr('A')
  50. + ', ' + FloattoStr(Sistema.Plazo) +  ', 0, ' + QuotedStr(FormatDateTime('mm/
  51. dd/yyyy', Date)) + ',' +
  52. QuotedStr(FormatDateTime('mm/dd/yyyy', Date)) + ', ' + FloattoStr(nEfe) +
  53. ', ' + FloattoStr(nTdb) + ', ' + FloattoStr(nTdc) + ', ' +
  54.  
  55. FloattoStr(nChe) + ', ' + FloattoStr(nCredito) + ', 0);');
  56.     //Agrega los detalles a la factura
  57.     tbDetalles.First;
  58.     nLinea := 0;
  59.  
  60.     while not tbDetalles.Eof do
  61.     begin
  62.       Inc(nLinea);
  63.                                         //CORRELATIVOPRINCIPAL, LINEA, TIPO,
  64. CODIGOPRODUCTO, CANTIDAD, DESCRIPCION,
  65. COSTOUNITARIOSINIVA, SUBTOTAL, PORCIVA, DESCUENTOESTRUC, DESCUENTOPROMO, VALORDESCUENTO, NETO, ESTATUS
  66.  
  67.       sq.Script.Add('Insert Into FcmDet (CORRELATIVOPRINCIPAL, LINEA,
  68. TIPO, CODIGOPRODUCTO, CANTIDAD, DESCRIPCION,
  69.  
  70. COSTOUNITARIOSINIVA, SUBTOTAL, PORCIVA, DESCUENTOESTRUC,
  71. DESCUENTOPROMO, VALORDESCUENTO, NETO, ESTATUS) ');
  72.  
  73.                       //
  74. CORRELATIVOPRINCIPAL,                                                        LINEA,                      TIPO,                   
  75.  
  76.  
  77.       CODIGOPRODUCTO,                       
  78. CANTIDAD,                                  DESCRIPCION,                             
  79. COSTOUNITARIOSINIVA,              SUBTOTAL,                                  PORCIVA,                          DESCUENTOESTRUC,               
  80.  
  81.       DESCUENTOPROMO,                           
  82. VALORDESCUENTO,                            NETO,                          ESTATUS
  83.  
  84.       sq.Script.Add('values (lPad((Select Gen_Id(COMPRAS, 0) from rdb
  85. $database), 8, ''0''), ' + InttoStr(nLinea) + ', ' +
  86.  
  87. QuotedStr('FCM')  + ', ' + QuotedStr(tbDetallesCodigo.AsString) + ', ' +
  88. tbDetallesCant.AsString + ',  ' +
  89. QuotedStr(tbDetallesDescripcion.AsString) + ',  ' +  tbDetallesPrecio.AsString + ', ' + tbDetallesSUBTOTAL.AsString + ', ' + 
  90.  
  91. FloattoStr(Sistema.IvaCompra) + ',  ' + tbDetallesDescEstruc.AsString + ', ' +
  92. tbDetallesDescPromo.AsString + ', ' +
  93.  
  94. tbDetallesValorDescuento.AsString + ', ' + tbDetallesNeto.AsString + ', ' +
  95. QuotedStr('A')  + ');');
  96.  
  97.       tbDetalles.Next;
  98.     end;
  99.     frCierrePago.tb.First;
  100.  
  101.     while not frCierrePago.tb.Eof do
  102.     begin
  103.       //graba los detalles del pago
  104.       sq.Script.Add('Insert into pagocompra (CORRELATIVOCMP, CODIGOPAGO, MONTO, FECHA, FECHACREACION, FECHAMODIFICACION, MONTOCOMISION, ');
  105.  
  106.       sq.Script.Add('PORCCOMISION, PORCISRL,
  107. MONTOISRL,PORCOTROSIMPUESTOS, MONTOOTROSIMPUESTOS, ESTATUS,
  108. NUMERODOCUMENTO, BANCODOCUMENTO, CUENTADEPOSITO, USUARIOCREADO, USUARIOMODIFICADO, TIPODOCUMENTO) values ');
  109.  
  110.                       //
  111. CORRELATIVOCMP,                                                        CODIGOPAGO,                                      MONTO,     
  112.  
  113.                       FECHA,                                                         
  114. FECHACREACION,                                                   
  115.  
  116. FECHAMODIFICACION,                                   
  117. MONTOCOMISION,                                                                                       
  118.  
  119.                     PORCCOMISION,
  120.       sq.Script.Add('(lPad((Select Gen_Id(COMPRAS, 0) from rdb$database), 8, ''0''), ' + frCierrePago.tbCodigo.AsString + ', ' + 
  121.  
  122. frCierrePago.tbMonto.AsString + ', ' + QuotedStr(FormatDateTime('mm/dd/
  123. yyyy', txFecha.Date))  + ', ' + 
  124.  
  125. QuotedStr(FormatDateTime('mm/dd/yyyy', Date)) + ', ' + QuotedStr
  126. (FormatDateTime('mm/dd/yyyy', Date)) + ', ' +
  127. FormatFloat('0.000', frCierrePago.tbMonto.AsFloat * (frCierrePago.tbPORCCOM.AsFloat / 100)) + ', ' +
  128.  
  129. FormatFLoat('0.00', frCierrePago.tbPORCCOM.AsFloat) + ', ' +
  130.  
  131.                                 //
  132. PORCISRL,                                                        MONTOISRL,                                                         
  133.  
  134.                                                                       PORCOTROSIMPUESTOS,                                     
  135.  
  136. MONTOOTROSIMPUESTOS,                                                                                                 
  137. ESTATUS,             
  138. NUMERODOCUMENTO,                     
  139. BANCODOCUMENTO,                                                CUENTADEPOSITO,                         
  140.  
  141.  
  142.   USUARIOCREADO,            USUARIOMODIFICADO,    TIPODOCUMENTO
  143.       FormatFLoat('0.00', frCierrePago.tbPORCISRL.AsfLOAT ) + ', ' + FormatFloat('0.000', (frCierrePago.tbMonto.AsFloat / (1 +
  144.  
  145. (Sistema.IvaVenta / 100))) * (frCierrePago.tbPORCISRL.AsFloat / 100)) + ', '
  146. + FormatFloat('0.00',
  147. frCierrePago.tbPORCOTROS.AsFloat) + ', ' + FormatFloat('0.000', (frCierrePago.tbMonto.AsFloat * (frCierrePago.tbPORCCOM.AsFloat /
  148.  
  149. 100)) * (frCierrePago.tbPORCOTROS.AsFloat / 100)) + ', ' +  QuotedStr('A') +
  150. ', ' + QuotedStr('') + ', ' + QuotedStr(ds.FieldbyName
  151.  
  152. ('codigobanco').AsString) + ', ' + QuotedStr(ds.FieldbyName
  153. ('CUENTAAFECTADA').AsString) + ', ' + QuotedStr(Usuario)  + ', ' +
  154. QuotedStr(Usuario) + ', ''FCM'');');
  155.       frCierrePago.tb.Next;
  156.     end;
  157.     //Devuelve o aplica los cambios
  158.     try
  159.       sq.Script.Add('Commit Retain;');
  160.       sq.Execute;
  161.  
  162.       Modulo.sqConsulta.Active := False;
  163.           Modulo.sqConsulta.SQL.Text := 'Select Lpad(Gen_Id(COMPRAS, 0), 8, ''0'') from rdb$database';
  164.       Modulo.sqConsulta.Active := True;
  165.       IniciarVariables;
  166.     except
  167.       //devuelve los cambios en caso de excepcion
  168.       on E: Exception do
  169.       begin
  170.           lEx := TStringList.Create;
  171.           lEx.Text := E.Message;
  172.           lEx.SaveToFile('\exception.txt');
  173.           FreeandNil(lEx);
  174.           sq.Clear;
  175.           sq.Script.Text := 'Rollback Retain;';
  176.           sq.Execute;
  177.           msgError('No se puede grabar el documento con el siguiente error: ' + E.Message);
  178.       end;
  179.     end;
  180.     Modulo.CON.AutoCommit := True;



Este es el trigger, en el after insert:



sql
  1. SET TERM ^ ;
  2.  
  3. CREATE TRIGGER FCMDET_AI0 FOR FCMDET ACTIVE AFTER INSERT POSITION 0 AS
  4.  
  5. DECLARE variable CostoActual FLOAT;
  6. DECLARE variable PrecioSinIva1 FLOAT;
  7. DECLARE variable PrecioSinIva2 FLOAT;
  8. DECLARE variable PrecioSinIva3 FLOAT;
  9. DECLARE variable PrecioSinIva4 FLOAT;
  10. DECLARE variable PU1 FLOAT;
  11. DECLARE variable PorcUtilidad2 FLOAT;
  12. DECLARE variable PorcUtilidad3 FLOAT;
  13. DECLARE variable PorcUtilidad4 FLOAT;
  14. DECLARE variable proveedor VARCHAR(12);
  15.  
  16. BEGIN
  17.  
  18. /*Si es factura de compra acumula el inventario, de lo contrario lo resta.*/
  19. IF (NEW.tipo = 'FCM') THEN
  20. BEGIN
  21.   UPDATE productos SET Existencia_Actual = COALESCE(Existencia_Actual, 0) + NEW.cantidad WHERE Codigo = NEW.CodigoProducto;
  22. END
  23. ELSE
  24. BEGIN
  25.   UPDATE productos SET Existencia_Actual = COALESCE(Existencia_Actual, 0) - NEW.cantidad WHERE Codigo = NEW.CodigoProducto;
  26. END
  27.  
  28. SELECT CostoUnitario, PrecioSinIva1, PrecioSinIva2, PrecioSinIva3, PrecioSinIva4 FROM PRODUCTOS WHERE codigo = NEW.codigoproducto INTO :CostoActual, :PrecioSinIva1, :PrecioSinIva2, :PrecioSinIva3, :PrecioSinIva4;
  29.  
  30. /*Actualiza los costos*/
  31. IF (:CostoActual <> NEW.costounitariosiniva) THEN
  32. BEGIN
  33.   IF (:PrecioSinIva1 > 0) THEN
  34.   BEGIN
  35.       PU1 = ((:PrecioSinIva1 - NEW.costounitariosiniva) / :PrecioSinIva1) * 100;
  36.   END
  37.   IF (:PrecioSinIva2 > 0) THEN
  38.   BEGIN
  39.       PorcUtilidad2 = ((:PrecioSinIva2 - NEW.costounitariosiniva) / :PrecioSinIva2) * 100;
  40.   END
  41.   IF (:PrecioSinIva3 > 0) THEN
  42.   BEGIN
  43.       PorcUtilidad3 = ((:PrecioSinIva3 - NEW.costounitariosiniva) / :PrecioSinIva3) * 100;
  44.   END
  45.   IF (:PrecioSinIva4 > 0) THEN
  46.   BEGIN
  47.       PorcUtilidad4 = ((:PrecioSinIva4 - NEW.costounitariosiniva) / :PrecioSinIva4) * 100;
  48.   END
  49.   /*Ubica el nuevo proveedor*/
  50.   SELECT ProveedorCodigo FROM FCM WHERE correlativo = NEW.correlativoprincipal INTO :proveedor;
  51.   UPDATE Productos SET Proveedor = :Proveedor, CostoUnitario = NEW.costounitariosiniva, PorcUtilidad1 = :PU1, PorcUtilidad2 = :PorcUtilidad2, PorcUtilidad3 = :PorcUtilidad3, PorcUtilidad4 = :PorcUtilidad4 WHERE Codigo = NEW.codigoproducto;
  52.   END
  53. END^
  54. SET TERM ; ^[/SQL]


  • 0

#11 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 23 enero 2009 - 01:43

Hola

Me permiti modificar tus etiquetas, perdón :)

Saluld OS

PD, Estamos trabajando con la creación de las etiquetas que no se tenian en la nueva versión, no desesperen :)
  • 0

#12 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 23 enero 2009 - 01:46

mejor, porque confiar en mi memoria es como confiar en los dedos de Carlos y la cordura de Delphius... jajaja

a mi me habia extrañado que fuera un solo bloque de Delphi cuando realmente tenia dos jejeje
  • 0

#13 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 23 enero 2009 - 01:52

¿Porqué está tan horizontal? Ahora veo que quedó un enorme espacio al costado izquierdo. ¿Será FireFox?
  • 0

#14 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 23 enero 2009 - 01:54

es posible, en opera esta normal.
  • 0

#15 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 23 enero 2009 - 01:55

¿Porqué está tan horizontal? Ahora veo que quedó un enorme espacio al costado izquierdo. ¿Será FireFox?


Yo creo que es tu FF, de todos modos, aun falta bajar un poco el tamaño de letra.

Salud OS
  • 0

#16 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 23 enero 2009 - 02:04

Pues si, es el FF. En los otros hilos veo normal, pero en éste debo desplazar la barra de dezplazamiento horizontal unos 6 cm y recién veo el texto. Y la barra sigue... en algo no está intepretando bien FF las etiquetas se me hace.

EDITO:
Bueno, me voy a poner a ver el tema.

Saludos,
  • 0

#17 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 23 enero 2009 - 02:18

Ya veo, parece que es un problema con la forma como pego el código eduardo :p :D

Puedes cambiar el code amigo eduardo?

Salud OS
  • 0

#18 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 23 enero 2009 - 02:24

como lo cambio??? lo paso a visual basic???  *-)
  • 0

#19 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 23 enero 2009 - 02:28

como lo cambio??? lo paso a visual basic???  *-)


jajajajaja, no seria mala idea, jajajaja, no amigo, es que imagino que algunas lineas de tu code son muy largas, y por eso es que se ve asi. :p

Salud OS
  • 0

#20 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 23 enero 2009 - 02:41

Saludos.

Eduarcol un consejo, quizás para esta aplicación no sea posible, pero para las próximas trata de que el servidor de BD trabaje.

A que me refiero con esto, tus sentencias SQL Embebidas no son de lo mejor, te lo digo por experiencia propia, en la empresa para la que laboro se programo todas sus aplicaciones de esta manera entonces cuando tenemos que modificar alguna sentencia tenemos que buscar en el proyecto completo para ver si esa misma sentencia se esta usando; ya sabes lo que provoca esto: dolores de cabeza, perdida de cabello, insultos a Delphi, al computador y demás.  :)

Por ende, a manera personal osea en mis proyectos personales opte por hacer todo en Stored Procedure, realmente es más trabajo pero la flexibilidad que obtienes para el mantenimiento de la aplicación es inmensa. Por cada tabla yo tengo 5 SP:
  1.- ALL: Este es un select que trae todos los registros.
  2.- INSERT: Este inserta y hace las validaciones de lugar.
  3.- UPDATE: Este actualiza y hace las validaciones de lugar.
  4.- DELETE: Este borra y hace las validaciones de lugar.
  5.- REFRESH: Este es un select que trae el registro activo.

Supongo que en un inicio podrías solamente usar el "SP_INSERT" y "SP_UPDATE" así concentras tu lógica de negocio en ellos, al momento de tener que variar alguna validación quizás no tengas que enviar tu ejecutable sino correr el Script de modificación en tu cliente y en caso por ejemplo de agregar un campo más a la tabla pues ni modo se modifican ambos tanto los SP como la aplicación.

No he utilizado Zeos, pero los IBX y FIBPlus (componentes IBDataSet y pFIBDataSet) tienen secciones distintas para las sentencias tanto de Select, Insert, Update, Delete y Refresh en ellas en vez de poner las sentencias plain pones el Execute o Select según amerite el caso del procedimiento.

Todavía me voy más lejos en mis desarrollos, utilizo un DataModule por cada tabla, así concentro todo la lógica de esa tabla ( funciones, procedimientos, propiedades y demás), con esto me evito el tener que estar haciendo lo mismo una y otra vez para la misma tabla, esto porque según veo en tu código pones los "TTable" en la presentación del cliente (Formularios) y volvemos al inicio de mi mensaje.

Tomando en cuenta el párrafo anterior y poniendo un ejemplo; imagina que tienes una tabla de TIPOS_CLIENTES es obvio que necesitas un mantenimiento de la misma pues haces un DataModule pones tu lógica y echa a andar el mantenimiento, también en el mantenimiento de CLIENTE necesitas a TIPOS_CLIENTES pues simplemente lo pones en uso (te evitas codificar nuevamente el Select) pero digamos también que la necesitas para una consulta, nada otra vez la pones en uso y listo (te evitas codificar nuevamente el Select).

Espero que me hayas captado la idea y puedas poner en practica por lo menos la parte de los "SP_INSERT" y "SP_UPDATE".
  • 0




IP.Board spam blocked by CleanTalk.