Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Error Key Violation (https://www.clubdelphi.com/foros/showthread.php?t=61318)

judit25 04-11-2008 01:03:44

Error Key Violation
 
Buenas Noches a tod@s

Mi problema es el siguiente:

Estoy trabajando con delphi 7, access 2003 y Ado. La conexion esta en un Data Module y lo hago a traves de Microsoft.Jet.OLEDB.4.0.

Tengo un formulario que funciona como facturacion en el cual lo manejo con 2 TClientDataset; el problema es que al momento del ApplyUpdate(0) del primer ClientDataSet (el que hace referencia al encabezado de la factura) me da el error de "Project Sistema.exe raised exception class EDBClient with message 'Key violation.'. Process stopped. Use Step or Run to continue"

Antes de grabar le asigno los valores a este uno por uno. El codigo que empleo es este:

Código Delphi [-]
        CDS1.Append;
        CDS1Tipo_Doc.Value := 'F';
        CDS1Ano.Value := inttostr(Ano);
        CDS1Numero.Value := numerof;
        CDS1Fecha_Emision.Value := strtodate(edit39.Text);
        if DBLCB1.KeyValue <> null then
          begin
            CDS1Cod_Cliente.Value := dblcb1.KeyValue;
          end
        else
          begin
            CDS1Cod_Cliente.Value := 0;
          end;
        CDS1Forma_Pago.Value := DBRG1.Value;
        CDS1Tipo_Cliente.Value := '';
        if edsub.Text <> '' then
          CDS1SubTotal.Value := strtofloat(edsub.Text)
        else
          CDS1SubTotal.Value := 0;
        if eddesc.Text <> '' then
          CDS1Descuento.Value := strtofloat(eddesc.Text)
        else
          CDS1Descuento.Value := 0;
        If edimp.Text <> '' then
          begin
            CDS1Impuesto.Value := strtofloat(edimp.Text);
          end
        else
          CDS1Impuesto.Value := 0;
        If edtotal.Text <> '' then
          CDS1Total.Value := strtofloat(edtotal.Text)
        else
          CDS1Total.Value := 0;
        CDS1Fechacre.Value := dateOf(Now);
        CDS1Horacre.Value := Now;
        CDS1Userwcre.Value := String(Nombre);
        CDS1Estacioncre.Value := String(buffer);
        CDS1Estado.Value := 'A';        
        CDS1.ApplyUpdates(0);

La clave principal de mi tabla esta compuesta por el Tipo_Doc, Ano, Numero

Alguien sabe donde estoy fallando para que me de ese error?

Gracias anticipadas

Saludos

marcoszorrilla 04-11-2008 06:51:39

El error significa que tienes un valor duplicado en la clave primaria, por lo tanto antes de grabar el documento deberías comprobar que no existe otro con el mismu número.

Un Saludo.

judit25 04-11-2008 07:03:00

Cita:

Empezado por marcoszorrilla (Mensaje 324005)
El error significa que tienes un valor duplicado en la clave primaria, por lo tanto antes de grabar el documento deberías comprobar que no existe otro con el mismu número.

Un Saludo.

Gracias por responder.

Actualmente cuando presiono el boton de agregar, este me trae el ultimo numero de la tabla en el que guardo las facturas y le agrego uno, es decir que el numero del documento aun no existe. Es por eso que no se que podria ser lo que me esta causando el error :confused:.

Lo calculo de la siguiente manera:

Código Delphi [-]
if DM.QDocumento.Fields[0].IsNull then
  begin
    numerof := 1;
  end
else
  begin
    numerof := DM.QDocumento.Fields[0].AsInteger;
    numerof := numerof + 1;
  end;

Alguna otra sugerencia?

Gracias anticipadas

Ana María 04-11-2008 15:08:00

Facturación?
 
Dices que estás haciendo algo de facturación, mi pregunta es si tienes otra tabla con los detalles de factura, de ser así es probable que la violación de clave no sea en la tabla maestra si no en la tabla de detalles.

saludos

judit25 04-11-2008 22:40:20

Cita:

Empezado por Ana María (Mensaje 324071)
Dices que estás haciendo algo de facturación, mi pregunta es si tienes otra tabla con los detalles de factura, de ser así es probable que la violación de clave no sea en la tabla maestra si no en la tabla de detalles.

saludos

Es en el momento que quiere hacer el ApplyUpdate(0) del TClientDataSet que hace referencia al encabezado. El ApplyUpdate(0) que hace referencia al detalle no me da ningun problema.

Gracias

Ana María 05-11-2008 16:25:58

Me da la impresión que podría estar fallando el diseño de la aplicación en sí, en la manera como enlazas los componentes maestro detalles y en la forma como resuelven la relación los TDatasetProvider (porque personalmente con solo un ApplyUpdates , actualizo tanto detalles como encabezado, utilizando la propiedad DatasetField del TClientDataset para los detalles), si quieres sube un pequeño ejemplo de la aplicación donde se recree el problema y con mucho gusto la reviso a ver si encontramos solución.

judit25 05-11-2008 17:51:03

Cita:

Empezado por Ana María (Mensaje 324300)
Me da la impresión que podría estar fallando el diseño de la aplicación en sí, en la manera como enlazas los componentes maestro detalles y en la forma como resuelven la relación los TDatasetProvider (porque personalmente con solo un ApplyUpdates , actualizo tanto detalles como encabezado, utilizando la propiedad DatasetField del TClientDataset para los detalles), si quieres sube un pequeño ejemplo de la aplicación donde se recree el problema y con mucho gusto la reviso a ver si encontramos solución.

Que necesitas que te envie y como lo hago?

Gracias


La franja horaria es GMT +2. Ahora son las 21:07:32.

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