Ir al contenido


Foto

Un AutoIncrementable que no funciona


  • Por favor identifícate para responder
7 respuestas en este tema

#1 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 16 julio 2009 - 09:53

Bueno, olvidando el post anterior aqui vengo con una pregunta sobre un PK de tipo autoincrementable. DELPHI2009 + IBX + FB2.1

Este codigo es para una pequeña bd en FB:


//******************************************************************************/
/*        Generated by IBExpert 2009.03.25 15/07/2009 11:20:41 a.m.          */
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES ISO8859_1;

CREATE DATABASE 'LOCALHOST:D:\RAD 6.0\TalaCath\BD\Capturas.fdb'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 4096
DEFAULT CHARACTER SET ISO8859_1;



/******************************************************************************/
/*                                Generators                                */
/******************************************************************************/

CREATE GENERATOR "GEN_PK_ID";
SET GENERATOR "GEN_PK_ID" TO 0;



/******************************************************************************/
/*                                  Tables                                  */
/******************************************************************************/



CREATE TABLE NOMBRES (
    ID      INTEGER NOT NULL,
    NOMBRE  VARCHAR(10) NOT NULL
);

CREATE TABLE PRODUCTOS (
    ID      INTEGER NOT NULL,
    CODIGO  INTEGER NOT NULL,
    PESO    FLOAT NOT NULL,
    HF      TIMESTAMP NOT NULL
);



/******************************************************************************/
/*                                Primary Keys                                */
/******************************************************************************/

ALTER TABLE NOMBRES ADD CONSTRAINT PK_NOMBRES PRIMARY KEY (ID);
ALTER TABLE PRODUCTOS ADD CONSTRAINT PK_PRODUCTOS PRIMARY KEY (ID);


/******************************************************************************/
/*                                  Triggers                                  */
/******************************************************************************/


SET TERM ^ ;



/******************************************************************************/
/*                            Triggers for tables                            */
/******************************************************************************/



/* Trigger: NOMBRES_BI */
CREATE TRIGGER NOMBRES_BI FOR NOMBRES
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id("GEN_PK_ID",1);
end
^

/* Trigger: PRODUCTOS_BI */
CREATE TRIGGER PRODUCTOS_BI FOR PRODUCTOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id("GEN_PK_ID",1);
end
^

SET TERM ; ^


Para la tabla productos desde delphi estoy ejecutando esto:



delphi
  1.   dbDataset.Insert ;
  2.   dbDatasetcodigo.Value := StrToInt(Num);
  3.   dbDatasetHF.Value := Now;
  4.   dbDatasetPeso.Value := StrToFloat(MidStr(str,3,7));
  5.   dbDataset.Post ;



y obtengo un mensaje de error diciendome que el "Field ID debe tener un valor", se supone que para eso esta el trigger, al detectar que no hay valor genera uno nuevo Antes de Insertar.

Debo decir que este codigo me funcionaba bien en D7 por lo que tengo mis dudas si algo se me esta olvidando o hay algun defecto en D12
  • 0

#2 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 16 julio 2009 - 09:59

yo probaria dos cambios:

quitar esta linea del trigger  if (new.id is null) then

y probando un INSERT INTO en lugar de la forma que lo haces, solo para descartar de donde sale el error.
  • 0

#3 axesys

axesys

    Advanced Member

  • Moderadores
  • PipPipPip
  • 640 mensajes
  • LocationLos Mochis

Escrito 16 julio 2009 - 09:59

En el componente ibdataset tiene una propiedad que se llama GeneratorField a lo mejor eso te falta


Saludos
  • 0

#4 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 16 julio 2009 - 10:11

En el componente ibdataset tiene una propiedad que se llama GeneratorField a lo mejor eso te falta


Saludos


Si hago uso del GeneratorField el numero de ID funciona pero va de 2 en 2 es decir que a cada registro le coloca el id asi: 1,3,5,7,9,11...

Probare esos cambios Eduardo.
  • 0

#5 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 16 julio 2009 - 10:33

Según veo en tú codigo fuente, estás utilizando el mismo generador para dos tablas.

Lo normal es que cada tabla lleve su propio generador para que el valor se incremente en uno por cada vez que insertas un registro en dicha tabla.

Saludos




  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 16 julio 2009 - 10:39

Hola

Intenta con esto



delphi
  1.   dbDataset.Insert ;
  2.   dbDatasetID.Value := null;
  3.   dbDatasetcodigo.Value := StrToInt(Num);
  4.   dbDatasetHF.Value := Now;
  5.   dbDatasetPeso.Value := StrToFloat(MidStr(str,3,7));
  6.   dbDataset.Post ;



Salud OS
  • 0

#7 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 16 julio 2009 - 10:55

Sensei, no puedo usar null porque al ser ID un integer envia un mensaje de error de que no son compatibles asi que le mande el valor 0 y modifique el trigger asi:

/* Trigger: PRODUCTOS_BI */
CREATE TRIGGER PRODUCTOS_BI FOR PRODUCTOS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null or new.id = 0) then
    new.id = gen_id("GEN_PK_ID",1);
end
^


Esta funcionando, aunque como detalle en la rejilla donde estoy probando veo que el ID no se actualiza siempre muestra 0 debo cerrar la aplicacion y volverla a abrir. Modificare la aplicacion para que cerrar el dataset y volver a abrirlo para que actualice.
  • 0

#8 axesys

axesys

    Advanced Member

  • Moderadores
  • PipPipPip
  • 640 mensajes
  • LocationLos Mochis

Escrito 16 julio 2009 - 12:38

Si hago uso del GeneratorField el numero de ID funciona pero va de 2 en 2 es decir que a cada registro le coloca el id asi: 1,3,5,7,9,11...


Entonces a lo mejor no se ocupa el trigger, podrí­as borrarlo y ver si los ibx se encargan de incrementarlo automaticamente sin necesidad del trigger


Saludos
  • 0




IP.Board spam blocked by CleanTalk.