FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
bueno explico un poco lo que me sucedía ...
uso MySQL y siempre he manejado las tablas con llave principal AUTOINCREMENT independiente de que tenga otra posible llave primaria, como por decir, el NroFactura, la razón, entiendo que es una buena práctica en cuanto a la estructuración de la BD. en Delphi uso los componentes DBExpress TSQLQuery <- TDataSetProvider <- TClientDataSet, donde genero los campos persistentes del TQuery y a todos les quito el parámetro Required, adicionalmente al campo Id (AutoInc) le selecciono el ProviderFlags->pfInKey indicando que esa es la llave principal, de igual manera procedo en el TClientDataSet para finalmente ene l TDataSetProvider dejar la propiedad UpdateMode como 'upWhereKeyOnly'. Lo anterior para que las actualizaciones en las tablas se hagan usando la llave primaria (el Id AutoInc). Como tengo la configuración antes descrita, al grabar un registro no le indicaba ningún valor al campo Id (AutoInc) esperando que el servidor se lo asignara automáticamente, lo cual funciona pero SOLO cuando trabajaba 1 registro (situación normal en mi caso) ya que al no indicar valor, el toma su valor por defecto (p.ej. NULL) y en el ApplyUpdates al grabar el registro físicamente el servidor le asignaba el Id automáticamente. Ahora al tener 2 o más registros como para el Id se mueve el valor por defecto, al hacer el segundo Post éste también tendría el mismo valor que el primero y produce el error 'Key Violation'. |
#2
|
|||
|
|||
bueno después de investigar y leer en varios artículos, lo he resuelto de la siguiente manera:
1. en lugar de dejar el campo Id (AutoIncr) sin valor, he dispuesto ponerle un valor único a cada registro usando para ello un número entero negativo garantizando que no se me confunda con algún otro número por ahí
2. el evento BeforeUpdateRecord del TDataSetProvider se ejecuta con la instrucción ApplyUpdates antes de hacer la actualización física en el servidor, allí se implementa un mecanismo para conocer cuál sería el próximo número del Id y se actualiza usando la propiedad NewValue, para que llegue al servidor con el número que corresponde
|
#3
|
||||
|
||||
Si te funciona, me parece perfecta la solución
Sí, creo que está bien. En vez de usar un Trigger usas un StoreProcedure. Además colocas un nº negativo provisional. Me parece un poco floreado, pero si te va bien, adelante. Tu solución abre nuevos horizontes y es original (dentro de mis conocimientos). Enhorabuena!!
|
#4
|
||||
|
||||
En MySQL para obtener el último número asignado se debe usar LAST_INSERT_ID() el cual te garantiza devolverte el último número que se haya asignado a tu campo sin importar que haya pasado después. Si haces lo haces con el método de usar MAX corres el riesgo de que en el transcurso otro usuario haya insertado registros por lo que ya no será correcto el dato que obtengas.
__________________
AKA "El animalito" ||Cordobés a mucha honra|| |
#5
|
||||
|
||||
Cita:
// Saludos |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
AutoIncrement Firebird | Ubed | Conexión con bases de datos | 7 | 21-05-2014 17:21:41 |
Conversion de Autoincrement | trex2000 | Tablas planas | 0 | 07-01-2008 22:16:49 |
AutoIncrement de Firebird | alucardo | Firebird e Interbase | 2 | 15-06-2006 19:03:20 |
excepción autoincrement | jonmendi | Conexión con bases de datos | 0 | 25-04-2006 17:33:55 |
sobre campos autoincrement | ghost | MS SQL Server | 1 | 19-10-2004 10:54:59 |
|