Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-05-2014
gustavosv gustavosv is offline
Miembro
 
Registrado: mar 2008
Posts: 51
Poder: 17
gustavosv Va por buen camino
Escribo en éste hilo porque me parece pertinente frente a mi problema, hasta ahora he trabajado la inserción de registros en tablas MySQL con campos llave AutoIncrement simplemente no asignándole valor, el asunto ahora es que eso funciona para un solo registro, pero cuando debo crear 2 o más, el primer Post pasa sin problema pero el segundo arroja un error de 'Key Violation' porque como el AutoIncrement es llave primaria, 2 valores NULL o '' no pueden coexistir.

He buscado soluciones pero no logro entenderlas, alguien puede comentar cómo ha podido solucionar dicho inconveniente ..?

Saludos.
Responder Con Cita
  #2  
Antiguo 15-05-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.054
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por gustavosv Ver Mensaje
....
Mejor crea un tema nuevo, no es exactamente el mismo problema, además esto es de hace 6 años.
Responder Con Cita
  #3  
Antiguo 17-05-2014
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Yo utilizo MySQL y nunca he tenido problemas con campos autoincrementados, simplemente ni siquiera los incluyo en los inserts y dejo que el motor haga lo suyo. Desde que creo la tabla dejo los valores por defecto para los campos autoincrementados. Cada vez que se hace un insert y se agrega una tupla si no se indica el valor del campo autoincrementado MySQL automáticamente lo inserta y coloca el valor correspondiente. Sin embargo si incluyes el campo y le das un valor (aunque sea cero) MySQL lo insertará sin alterar el contador del autoincrementado, es decir, si el campo va en 99 e insertamos un valor de 150, MySQL nos lo aceptará y agregará correctamente la fila pero el contador seguirá quedando en 99 que fue el último valor autoincrementado. El problema lo tendremos cuando llegue a 150 porque nos arrojará un error de clave duplicada (recordemos que los campos autoincrementados deben ser claves primarias).
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #4  
Antiguo 18-05-2014
gustavosv gustavosv is offline
Miembro
 
Registrado: mar 2008
Posts: 51
Poder: 17
gustavosv Va por buen camino
AzidRain, y nunca ha tenido problemas cuando necesita grabar 2 registros (2 Post) antes de hacer un ApplyUpdates ?

En mi caso debo crear algo así como el detalle de una factura, entonces creo el encabezado (factura) (1 Post) y luego el detalle (DetalleFactura) que son varios registros (varios Post), cuando se completa la operación debo hacer el Apply, pero en el 2do Post me sale el error 'Key Violation'
Responder Con Cita
  #5  
Antiguo 19-05-2014
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
El error te sale porque estas tomando y asumiendo que el valor que tienes en folio o clave de las 2 facturas que estás editando es el mismo. La clave la debes obtener hasta que ya vayas a guardar el encabezado y posteriormente pasarla al detalle. Para ello puedes hacer lo siguiente, grabas la cabecera (sin indicar la clave o folio) inmediatamente despues obtienes que número le fue asignado usando "LAST_INSERT_ID" y ya con ese número actualizas el detalle y lo guardas y listo. "LAST_INSERT_ID" te devolverá siempre el último valor autoincrementado que te asignó el motor sin importar si otros usuarios antes o después que tú hicieron lo mismo. Ojo, tienes que abrir una transacción para hacer todo esto para que si ocurre cualquier error no te quedes con una cabecera sin detalle.

En resumidas cuentas tienes que hacer toda tu operación SIN saber que clave le corresponde a la cabecera, eso lo dejas hasta el final. Al usuario si quiere le muestras el folio asignado hasta el momento en que terminas las actualizaciones a la BD, antes NO.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #6  
Antiguo 19-05-2014
gustavosv gustavosv is offline
Miembro
 
Registrado: mar 2008
Posts: 51
Poder: 17
gustavosv Va por buen camino
AzidRain, gracias por la recomendación es muy pertinente, sin embargo la PRIMARY KEY de la tabla Detalle es un campo AUTOINCREMENT, es decir, independiente de saber o no la clave de la cabecera, esa no es la clave principal, sino el campo AutoInc de la misma tabla Detalle cuyo valor no conozco en ese momento, de hecho el NroFactura (Id de la respectiva tabla cabecera) lo manejo desde otra tabla de consecutivos, por lo que al grabar el datalle si conozco el NroFactura.
Responder Con Cita
  #7  
Antiguo 21-05-2014
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Yo creo que no necesitas el autoincrement en la tabla de detalle ya que muy seguramente la estructura de la tabla ya incluye como clave foránea el número de factura. Podría ser una clave compuesta que incluya el número de factura y el número de línea de detalle, el cual no tiene que ser autoinc. ya que no necesitas llevar la cuenta de cuantas líneas has insertado en todas las facturas sino solo en cada una. De esta manera podemos identificar cada fila como única a partir de su número de factura y número de línea.

Sería bueno ver la estructura de las 2 tablas
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Auto carga de clases en PHP 5 dec PHP 1 08-03-2008 22:37:13
EAN 128 Auto Switch ?? ofillia Varios 2 02-02-2007 19:07:03
auto incremento valentino MySQL 1 14-02-2005 12:59:33
Auto borrado brandolin Varios 6 27-09-2003 21:18:37
Auto Crear Forma cmgenny Varios 2 13-05-2003 13:46:03


La franja horaria es GMT +2. Ahora son las 03:42:01.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi