Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-10-2011
AnuardMichelen AnuardMichelen is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 38
Poder: 0
AnuardMichelen Va por buen camino
Error de Primary Key

Hola como estan todos, espero que bien.

Nesecito ayuda urgente con este error, miren la imagen:
https://mail.google.com/mail/?ui=2&i...f_gtrbw26v0&zw
Responder Con Cita
  #2  
Antiguo 14-10-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
alguien puede ver la imagen?
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #3  
Antiguo 14-10-2011
AnuardMichelen AnuardMichelen is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 38
Poder: 0
AnuardMichelen Va por buen camino
Perdon si no se puede ver la imagen esto es lo que dice el error:


General SQL Error.
lock conflict on no way transaction
violation of PRIMARY or UNIQUE KEY contraint 'CITAS_PK' on table CITAS.

Disculpen por la imagen.
Responder Con Cita
  #4  
Antiguo 14-10-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Lo normal es que estés dando de alta un registro con la misma primary key que otro.
Responder Con Cita
  #5  
Antiguo 14-10-2011
AnuardMichelen AnuardMichelen is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 38
Poder: 0
AnuardMichelen Va por buen camino
Pero como puedo resolver, ya que al momento de grabar un registro en la esta tabla me da ese error.
Responder Con Cita
  #6  
Antiguo 14-10-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pues poniéndole otro código, lo normal 1, 2, 3, 4, 5, etc...
Responder Con Cita
  #7  
Antiguo 14-10-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
verifica que el codigo que estas grabando no se esté repitiendo
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #8  
Antiguo 14-10-2011
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Sino puedes generar automáticamente el código con un generador, puedes lanzar un SQL que verifique si ese registro ya existe, todo esto antes de intentar grabarlo.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #9  
Antiguo 19-10-2011
adan12 adan12 is offline
Miembro
NULL
 
Registrado: jun 2011
Posts: 17
Poder: 0
adan12 Va por buen camino
Cita:
Empezado por marcoszorrilla Ver Mensaje
Sino puedes generar automáticamente el código con un generador, puedes lanzar un SQL que verifique si ese registro ya existe, todo esto antes de intentar grabarlo.

Un Saludo.
IF EXISTS(SELECT ID FROM TABLA WHERE ID = @ID)
INSERT INTO TABLA (Campo1,ID) VALUES (@Valor,@ID)
ELSE
UPDATE TABLA SET Campo1 = @Valor WHERE ID = @ID

HAY ESTA CAVAL MODIFICA ESTE QUERY PODRAS MODIFICAR EL CAMPO DUPLICADO
Responder Con Cita
  #10  
Antiguo 19-10-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Bienvenido a clubdelphi, por favor, lee nuestra guía de estilo, gracias.
Responder Con Cita
  #11  
Antiguo 19-10-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por marcoszorrilla Ver Mensaje
Sino puedes generar automáticamente el código con un generador, puedes lanzar un SQL que verifique si ese registro ya existe, todo esto antes de intentar grabarlo.
Un Saludo.
Realmente no es muy seguro hacer eso, porque en un entorno multiusuario puedes comprobar que no exista un código, y antes de grabarlo ya desde otro equipo lo ha usado, así que te daría error porque ya existe.

En firebird también exista una sentencia "update or insert", pero en este caso no valdría porque si el código es creado por otro usuario entonces estaríamos actualizando el mismo en lugar de crear uno nuevo nosotros.

Del blog de jhonny:
http://jhonny.clubdelphi.com/2010/08...-1-recuperado/
Responder Con Cita
  #12  
Antiguo 19-10-2011
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Yo en estos casos tengo una tabla que almacena un contador, primero lo incremento en 1 y luego ese número se lo doy al documento/factura.

Me gustaría ver que otras opciones utilizais, para generar una numeración consecutiva sin saltos.

Me funciona pero quisiera ver otras opciones.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #13  
Antiguo 19-10-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Si quieres números consecuentivos entonces descartamos un generador.
No mantengo contadores porque me parecen innecesarios y una fuente potencial de problemas.
Para esos casos yo compruebo el ultimo número dado de alta y le sumo uno.
Si alguien ha dado de alta ese número mientras tanto, pues vuelvo a pedir de nuevo el último y le sumo 1, y así varias veces.
Si transcurridos varios intentos están siempre ocupados los números que voy pidiendo es que algo anormal ha ocurrido y ya saco el mensaje de error.
He modificado un trozo de código, simplificándolo, a ver si no me he equivocado, pero al menos sirve para que se entienda lo que hago.

Uutiles.pas (datos de configuración del programa)
Código Delphi [-]
const
  _INTENTOS_GRABAR_ = 5;

Cualquier otra Unit.pas
-------------------------------------------------
Código Delphi [-]
procedure TForm1.btGrabarClick(Sender: TObject);
var  
  iIntentos : Integer;  
begin
  iIntentos := 0;
  //
  DS.DataSet.FieldByName('codigo').AsInteger := getNuevoCodigo( tabla, campo );  // esto sólo hace un select max(campo)+1 from tabla
  try
    DS.DataSet.Post;
  except
    try
      while iIntentos < _INTENTOS_GRABAR_ do
      begin
        try
          DS.DataSet.Post;
          Break;
        except
          DS.DataSet.FieldByName('codigo').AsInteger := getNuevoCodigo( tabla, campo );
        end;
        inc(iIntentos);
      end;
    except
      on E:exception do
        Error(-100, Format('(%s) Error: %s', [E.ClassName, E.Message]));
    end;
  end;
end;
Responder Con Cita
  #14  
Antiguo 19-10-2011
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
También he utilizado algo similar, pero tengo un problema.

Año:2011 --->Factura=11+0000
110001
110002
115200

El 11 lo extraigo de un Campo que llamo ejercicio, no lo cojo directamente de la fecha, porque puede que el cliente quiera hacer todavía a principios de Enero algunas facturas con fecha del año anterior que tiene pendientes.

Año:2012--->Factura=125201

Yo quiero que al cambiar el año, esto lo hago con la tabla contadores.
1.-Llegado el momento, cambio el ejercicio.
2.-Cambio los contadores de Facturas - Albaranes - Pedidos etc.

Año:2012--->Factura=120001
Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #15  
Antiguo 19-10-2011
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.464
Poder: 21
newtron Va camino a la fama
Hola.

Esto quiero recordar que lo hemos comentado alguna vez.

Yo particularmente creo que lo más sano es mantener una tabla de contadores con el número completo porque, aunque no es frecuente, es posible que el cliente quiera dejar un rango de facturas vacias para hacerlas posteriormente. El único problema es que si anulas la última factura y quieres reutilizar ese número tienes que retroceder el contador manualmente.

En mi aplicación en particular a cada factura se le asigna una serie 'A-' 'B-', etc... y cada serie tiene sus contadores de albaranes, facturas, tickets, etc. y documentos de impresión independientes. De esta manera dependiendo de la serie de factura saldrá con un formato u otro y tendrá una numeración u otra. El número de factura se compone de la serie+el número que corresponda según el contador, p.e.: A-110001,B-110032, etc.

Saludos
__________________
Be water my friend.
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
Error al crear Primary Key Chogo Firebird e Interbase 18 07-07-2010 17:17:24
Primary Key - SQL Server Oxa78 MS SQL Server 3 09-01-2006 23:27:47
Error Violation Primary Key maui Conexión con bases de datos 16 11-05-2004 15:49:46
primary key AMO SQL 7 14-02-2004 20:50:05
Primary key interbase 6 rafadrover Conexión con bases de datos 2 07-08-2003 08:40:20


La franja horaria es GMT +2. Ahora son las 14:40:04.


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