import.css=/download/attachments/327912/newLayout.css

FAQ: 856-Dataserver Oracle X Clave doble
Produto:Datasul
Ambiente:
Versão:2
Sintoma
856-Dataserver Oracle X Clave doble
Causa
Dataserver Oracle X Clave doble
Solução
Síntoma:Un mensaje de "unique constraint violated" es presentado. El mensaje tiene la sintaxis parecida con:“unique constraint (HR205POR08P914UNI.UN004##CODIGO) violated”Después de la presentación del mensaje, la creación del registro es cancelada.
Causa:El mensaje indica un error de clave doble, o sea, ya existe un registro con la misma clave única.
El problema se nota con dificultad porque generalmente, antes de la creación del registro, es verificada la existencia de otro registro con la misma clave; sin embargo, esa validación falla, mismo existiendo el registro.
Eso ocurre, porque los registros grabados en ambiente Oracle conservan los espacios en blanco a la derecha, si son informados. Con esto, si el valor informado en el comando FIND no contiene el mismo espacio, o aún, el comando FIND contiene espacio, pero no existe en la base, el registro no será encontrado. Y, entonces, al grabar un registro nuevo, ya existirá un registro con aquella información, causando error de clave doble.
El ejemplo abajo simula el problema, suponiendo que la tabla “Customer” tenga un índice único por el campo “Name”.
Ejemplo:
Create Customer.
Assign Customer.Name = "Prueba".
Find Customer
    where Customer.Name = "Prueba" no-error.
If  not avail Customer then do:
    /* El registro no será encontrado y uno nuevo será creado */
    create Customer.
    assign Customer.Name = "Prueba". /* Generará error de clave doble */
End.

Solución:Para dar vuelta sobre esa característica, los registros deben ser siempre grabados sin los espacios en blanco a la derecha. Para eso, se puede usar siempre la función RIGHT-TRIM para remover esos espacios en la grabación.
También en la hora de la lectura se puede usar la misma función arriba del valor a ser buscado.
En Oracle, los campos del tipo Carácter son grabados con los espacios en blanco a la derecha, cuando ellos sean informados. Sin embargo, esa característica puede causar problemas.
Cuando se ejecuta un FIND, el registro no es encontrado, entonces cuando si intenta grabar un registro nuevo con la misma clave, ocurre el error de clave doble.
La solución es siempre sacar los espacios excedentes antes de ejecutar los FIND y antes de grabar los datos, usando la función RIGHT-TRIM.
El ejemplo abajo simula la solución del problema, suponiendo que la tabla “Customer” tenga un índice único por el campo “Name”.
Ejemplo:
Create Customer.
Assign Customer.Name = RIGHT-TRIM("Prueba").
Find Customer
    where Customer.Name = RIGHT-TRIM("Prueba") no-error.
If  not avail Customer then do:
    /* El registro será encontrado y el registro nuevo no será creado */
    create Customer.
    assign Customer.Name = RIGHT-TRIM("Prueba").
End.