Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Extrañisimo problema con Llave (https://www.clubdelphi.com/foros/showthread.php?t=72934)

juliobuitrago 21-03-2011 08:58:54

Extrañisimo problema con Llave
 
2 Archivos Adjunto(s)
Hola.
Me sucede un lio sumamente extraño.
Necesito hacer unas replicaciones a diferentes bases de datos.
Se me ocurrio usar el IBScript, donde meto todas las modificaciones que luego voy a ejecutar en cada database 8son 5 y pueden ser mas).
Esta es la tabla:
CREATE TABLE PRODUCTOS (
ID_PRODUCTO DOMAIN_ID_PRODUCTO NOT NULL,
ID_SUPLIDOR DOMAIN_ID_INT,
COD_PRODUCTO DOMAIN_COD_PRODUCTO NOT NULL,
NOM_PRODUCTO_EN DOMAIN_DESC_128,
NOM_PRODUCTO_ES DOMAIN_DESC_128,
NOM_PRODUCTO_ALIAS DOMAIN_DESC_64,
ID_UM DOMAIN_ID_CHR4_NIL,
ID_PRODUCTO_TIPO DOMAIN_ID_CHR4_NIL,
ES_INVENTARIABLE DOMAIN_BOOLEAN_T NOT NULL,
EXISTENCIA_PREFERIDA DOMAIN_VALUES,
PRECIO_LISTA DOMAIN_VALORES_DINERO,
ES_PLUS DOMAIN_BOOLEAN_F,
MONTO_PLUS DOMAIN_VALORES_DINERO,
COD_PRODUCTO1 DOMAIN_COD_PRODUCTO_NIL,
COD_PRODUCTO2 DOMAIN_COD_PRODUCTO_NIL,
COD_PRODUCTO3 DOMAIN_COD_PRODUCTO_NIL,
COD_PRODUCTO4 DOMAIN_COD_PRODUCTO_NIL,
COD_PRODUCTO5 DOMAIN_COD_PRODUCTO_NIL
);

Esta es la llave primeria
ALTER TABLE PRODUCTOS ADD CONSTRAINT PK_PRODUCTOS PRIMARY KEY (ID_PRODUCTO);

Entonces, desde IBExpert, instrucciones como esta se ejecutan perfectamente:
update PRODUCTOS
SET NOM_PRODUCTO_ALIAS = 'BLA, BLA, '
WHERE ID_PRODUCTO = '0001'


Sin embargo, cuando ejecuto el TBScript me da problemas de indice.
SI ven bien el codigo, veran que puse un query a mano para detectar si era malo el string o era la ejecucion, y me dio ocmo resultado la ejecución
En este codigo ScriptProductos. es de tipo IBScript, que antes lo habia probado y funcionaba excelente....

ScriptProductos.Script.Add('Update PRODUCTOS SET NOM_PRODUCTO_EN = ' + QuotedStr('BLA, BLA, BLA') + ' WHERE ID_PRODUCTOS = ' + QuotedStr('P340001'));
//for i := 0 to v_ElementosElementos Do Begin
//ScriptProductos.Script.Add(v_Elementos[i]);
//ShowMessage(v_Elementos[i]);
//End;

//DatosDatabase.a_Transaction_Procs_Start.Execute;
//ScriptProductos.
ScriptProductos.ExecuteScript;
//DatosDatabase.a_Transaction_Procs_Commit.Execute;

En la imagen les muestro el error, pero basicamente dice que hay un problema con el indice...
y a mi me parece que la que ejecuto por el IBExpert y esta son parecidas...

Por favor, ayudenme y gracias anticipadas.
Fdo Buitrago

guillotmarc 21-03-2011 12:13:13

Este error en realidad no marca un error de índice. Marca que una clave única (definida en el índice PK_PRODUCTOS) ya existe.

Es decir, te está indicando que intentas añadir un registro en PRODUCTOS que tiene una clave primaria igual a la clave primaria de un registro ya existente en la tabla PRODUCTOS.

Saludos.

juliobuitrago 21-03-2011 18:44:17

Gracias por contestar.
 
Lo curioso, es que es un UPDATE, no un Insert.....
Ahi es donde esta lo extraño.....que podria pasar, que hago mal ?

saluos

guillotmarc 21-03-2011 20:00:22

Cita:

Empezado por juliobuitrago (Mensaje 394190)
Lo curioso, es que es un UPDATE, no un Insert.....
Ahi es donde esta lo extraño.....que podria pasar, que hago mal ?

saluos

Puedes estar modificando el campo de clave primaria, asignándole un valor ya existente.

O bien un campo con un constraint de clave única.

Saludos.

juliobuitrago 23-03-2011 02:26:40

si te fijas en todos los codigos te daras cuenta lo extraño
 
pues la llave esta bien definida y lo curioso es que funciona fuera, pero no usando el IBScript

Alguna otra idea, ?

guillotmarc 23-03-2011 10:23:58

No, ese error es muy claro : es una violación de la clave primaria PK_PRODUCTOS.

Estás intentado añadir registros con claves primarias ya existentes, o estás intentando modificar registros cambiando su clave primaria por claves ya existentes.

Tienes que revisar tu código/script puesto que quizás el problema no está donde tu te piensas que está.

Esta sentencia es imposible que te provoque ese error :

update PRODUCTOS
SET NOM_PRODUCTO_ALIAS = 'BLA, BLA, '
WHERE ID_PRODUCTO = '0001'


Revisa las otras sentencias que tienes. Por ejemplo esta sentencia te podría provocar el error (no digo que tengas el problema aquí, pero podría ser, igual que podría ser en cualquier otro lugar que toque las claves primarias).

ALTER TABLE PRODUCTOS ADD CONSTRAINT PK_PRODUCTOS PRIMARY KEY (ID_PRODUCTO);


Si la tabla ya tiene registros con valores iguales en la clave primaria, no podrás crear esa clave primaria. Aunque creo que no saltaría el error de violación de clave primaria (puesto que aún no existe), sino que probablemente daría algún error de que no se ha podido crear la clave primaria.

En cualquier caso tienes que volver a revisar tu Script desde el principio.


La franja horaria es GMT +2. Ahora son las 14:51:45.

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