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)
-   -   Problemas con campos Numeric (https://www.clubdelphi.com/foros/showthread.php?t=65907)

José Luis Garcí 21-01-2010 14:36:41

Problemas con campos Numeric
 
Hola compañeros estoy trabajando con Delphi 2010, con Firebird 2.1 e ibexpert personal edition, y lo que me ocurre es lo siguiente, al crear la base de datos con la siguiente estructura


LOTE varchar 20
FECHA date
TIPO_DOCUMENTO varchar 40
NUMERO_DOCUMENTO varchar 15
CODIGO_PRODUCTO varchar 20
CANTIDAD Integer
UD_LITROS numeric 10,3




Al meter datos en Ibespert en el campo numeric me sale el mensaje


Cannot post cahges!
There is at least one record with same fields values!

y al hacerlo desde el programa, no dice nada pero tampocoi me registra el valor introducido, alguien sabe cual es la solución y por que puede ocurrir, como siempre gracias por vuestra ayuda

marcoszorrilla 21-01-2010 14:45:31

Hola Jose Luis, porque no pruebas a insertar un solo registro a la vez, aunque no vemos la estructura de la tabla, pienso que pueda ser problema de una PK o de un índice único que no te estén dejando grabar el registro.

Prueba a conectarte con ISQL

Connect "C:\MiBase.fdb" USER "SYSDBA" Password "masterkey";

Show Table El_Nombre_Quesea;

Exit;

Un Saludo.

José Luis Garcí 21-01-2010 16:36:14

Hola Marcos, la estructura de la tabla es la que vez en el post anterior, la tabla se llama LOTES_SALIDA, y no tiene indices ni PK ni FK ya que lo logicoes por lotes, o fechas o numero de documento, pero esto ya lo hago mediante los IbQuery, lo que me interesa es saber el último registro en cada momento, ya que estoy llevando de momento la trazabilidad, en un programa aparte del de facturación.

Casimiro Noteví 21-01-2010 23:46:18

¿Seguro que no tiene clave primaria?, es que ese error está "cantado" que es eso, no?.
¿Algún compañero que haya querido gastarte una broma y la ha creado?

También, aunque no lo he probado, leí una vez que es obligado tener siempre una clave primaria, puede que el error sea eso.


Edito: no, no es eso, lo he probado y el mensaje es muy diferente, voy a hacer otras pruebas.

Casimiro Noteví 22-01-2010 00:21:15

Por las pruebas que he hecho he llegado a la conclusión de que el problema es precisamente el no tener campo clave.
Había leído alguna vez que es necesario, haz la prueba de crear un nuevo campo, ejemplo:
Código:

ID integer
y ponlo como primary key, se acabaron los problemas.

José Luis Garcí 22-01-2010 13:09:24

Hola Caismiro, he hecho lo que me decias y funciono, pero no con un integer, sino con un numeric, lo que me pasa ahora es que los campos UD_LITROS Y CANTIDAD, no me recogen ni los nuevos datos ni las modificaciones sobre ellos, puede deberse a este fallo.

Casimiro Noteví 22-01-2010 13:19:18

Yo no te aconsejo para nada poner como clave primaria un campo que va a contener decimales, ¿por qué no usas el integer?.

Deberías poder guardar lo que quisieras en esos campos, ¿por qué no creas una nueva tabla y lo pruebas "de limpio"?

guillotmarc 22-01-2010 13:42:12

Opino igual que los compañeros, aunque no es obligatorio es muy conveniente tener una clave primaria.

Todo parece indicar que el problema es la falta de clave primaria. El mensaje de error es muy claro : "Ya hay al menos un registro con los mismos valores en los campos". ¿ Como podría el motor distinguir dos registros con exactamente los mismos valores, sin al menos una clave primaria que los permita identificar de forma única ?.

La solución es sencilla, como te dicen solo tienes que añadir una clave primaria. Puedes hacer que se rellene mediante un generador y un sencillo trigger, de esta forma no tendrás que tocar para nada tu aplicación, podrás seguir insertando registros exactamente igual a como venías haciéndolo hasta ahora, y lo mismo para su consulta.

guillotmarc 22-01-2010 13:45:11

Vaya, veo que ya habéis solucionado ese error.

Respecto a lo del integer y numeric. ¿ Estás usando los campos existentes para definir la clave primaria ?.

No lo hagas, puesto que no puedes asegurar que tengan valores únicos (requisito de cualquier clave primaria).

Simplemente añade un campo nuevo, de tipo integer, como dice Casimiro, y asígnale su valor en un trigger (de forma que no tengas que tocar para nada tu aplicación).

Casimiro Noteví 22-01-2010 13:54:27

Primero creas un "generator", ejemplo:

Código:

CREATE SEQUENCE GEN_lotes_salida_ID;
ALTER SEQUENCE GEN_lotes_salida_ID RESTART WITH 0;

/* Old syntax is:
CREATE GENERATOR GEN_lotes_salida_ID;
SET GENERATOR GEN_lotes_salida_ID TO 0;
*/

Luego creas el trigger:
Código:

CREATE OR ALTER trigger trg_lotes_salida_bi0 for lotes_salida
active before insert position 0
AS
BEGIN
  NEW.id = GEN_ID(GEN_lotes_salida_ID,1);
END

Y listo, cada vez que insertes un registro se guardará la clave primaria automáticamente.

José Luis Garcí 22-01-2010 16:28:04

Gracias Casimiro, lo intentare la semana que viene, el problema es que en el ibexpert, no sabia como crear una clave primaria sobre una tabla existente, por cierto, como se puede duplicar los campos de una tabla en otro, se que se puede, pero no me acuerdo como?.

Por cierto Casimiro, el código expuesto, en que parte debería ponerlo?.

Por cierto en el coche de camino a casa, pensando en por que me fallaba, creo que ya se la razón, no he cambiado las sentencias con los nuevos campos en el IBdataset.

Muchas gracias por vuestro apoyo

marcoszorrilla 22-01-2010 17:10:11

Si usas un "Script", para crear la base de datos en el propio "Script", debe de encontrarse por debajo del lugar en donde se crea la tabla a la que afecta.

Si usas el IbExpert, pulsas en Triggers, botón derecho y eliges "New Trigger".

Un Saludo.

José Luis Garcí 26-01-2010 18:37:16

]Como siempre teneis toda la razón, me funciona mejor con un campo integer y en cuanto al trigger, lo habia generado ya junto con el proceso y disparador, pero no sabia como aplicarlo a delphi hasta que encontre en el for esta solución
Conectar Trigger en Delphi

Doy el Tema por Solucionado, y muchas gracias a todos


La franja horaria es GMT +2. Ahora son las 00:45:59.

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