Firebird Foreign Key hiba !

Firebird Foreign Key hiba !
2009-05-06T16:37:09+02:00
2009-05-09T15:48:22+02:00
2022-11-13T13:41:58+01:00
harris
sziasztok
nagyon elakadtam !!!
ket firebird tablat szeretnek ossze kotni (foreign key) segitsegevel de nem nagyon akar mukodni
mikor insertet kap ezt a hibat dobja vissza nekem es nem ertem hol cseszem el

SQL Error: conversion error from string "@1" @1. Error Code: -413. Overflow occurred during data type conversion.

ez a tarolt eljarasom :


SET TERM ^ ;

RECREATE PROCEDURE SP_BANK_ACCOUNT_INSERT (
BANK_ACCOUNT_NUMBER VARCHAR(200),
BANK_ACCOUNT_NAME VARCHAR(200),
CLIENT_ID INTEGER)
RETURNS (
BANK_ACCOUNT_ID INTEGER,
RCODE SMALLINT)
AS
DECLARE ACCOUNT_EXISTS SMALLINT;
BEGIN
RCODE=0;
ACCOUNT_EXISTS=0;

--CHECK IF ACCOUNT NUMBER ALLREADY EXISTS
SELECT FIRST 1 CLIENT_ID
FROM BANK_ACCOUNT
WHERE CLIENT_ID=:CLIENT_ID AND BANK_ACCOUNT_NUMBER=:BANK_ACCOUNT_NUMBER
INTO :ACCOUNT_EXISTS;
IF (:ACCOUNT_EXISTS=0) THEN
BEGIN
BANK_ACCOUNT_ID = GEN_ID(GEN_CLIENT_BANK_ACCOUNT_ID,1);
INSERT INTO BANK_ACCOUNT (
BANK_ACCOUNT_ID,
BANK_ACCOUNT_NAME,
BANK_ACCOUNT_NUMBER,
CLIENT_ID)
VALUES (:BANK_ACCOUNT_ID,
: BANK_ACCOUNT_NAME,
: BANK_ACCOUNT_NUMBER,
: CLIENT_ID);

END
-- ACCOUNT NUMBER ALLREADY EXISTS
ELSE RCODE=1;
SUSPEND;
END^

SET TERM ; ^


van valami otletetek hogy miert nem megy?
Mutasd a teljes hozzászólást!
Nem lehet, hogy a CLIENT_ID és az ACCOUNT_EXISTS okozza a problémát. A CLIENT_ID intgeger az ACCOUNT_EXISTS smallint
SELECT FIRST 1 CLIENT_ID ... into :ACCOUNT_EXISTS
Ha a CLIENT_ID már nagyobb mint a smallint maximális értéke akkor biztosan ez lesz a hibaüzenet.
Mutasd a teljes hozzászólást!

  • a generátor nevét nem kell "" közé tenni?
    ... BANK_ACCOUNT_ID = GEN_ID("GEN_CLIENT_BANK_ACCOUNT_ID",1); ...
    Mutasd a teljes hozzászólást!
  • De mi a köze egy tárolt eljárásnak az inserthez?
    Két táblával és az insert sql utasításokkal többet segíthetnénk...
    Mutasd a teljes hozzászólást!
  • a generátor nevét nem kell "" közé tenni?


    Nem kell idézőjel!!!

    De mi a köze egy tárolt eljárásnak az inserthez?

    Csak annyi, hogy elegánsabb, jobb tárolt eljárással dolgozni...

    Maga a tárolt eljárás így szerintem jó!
    ...gyanítom, máshol lesz a hiba...
    Tudod a tárolt eljárást debugolni? (IBExpettel van rá lehetőség!)
    Mutasd a teljes hozzászólást!
  • Szia

    Kellene a "BANK_ACCOUNT" táblának a szerkezete. Nem lehet, hogy a táblában kisebb mezőket használsz mint "varchar(200)" és emiatt nem fér bele az adat? Vagy a BANK_ACCOUNT_NUMBER nem integer típusú.
    Mutasd a teljes hozzászólást!
  • a mezok merete megegyezik a tarolt eljarasba es a tablaba

    itt a tabla structuraja

    CREATE TABLE BANK_ACCOUNT (
    BANK_ACCOUNT_ID INTEGER NOT NULL,
    BANK_ACCOUNT_NUMBER VARCHAR(200) DEFAULT '' NOT NULL,
    BANK_ACCOUNT_NAME VARCHAR(200) DEFAULT '' NOT NULL,
    CLIENT_ID INTEGER DEFAULT '' NOT NULL,
    /* Keys */
    UNIQUE (CLIENT_ID),
    PRIMARY KEY (BANK_ACCOUNT_ID),
    /* Foreign keys */
    CONSTRAINT FRK_BANK_ACCOUNT
    FOREIGN KEY (CLIENT_ID)
    REFERENCES CLIENT(CLIENT_ID)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
    );

    CREATE UNIQUE INDEX BANK_ACCOUNT_IDX
    ON BANK_ACCOUNT
    (BANK_ACCOUNT_ID);


    SET TERM ^ ;

    CREATE TRIGGER BANK_ACCOUNT_BI FOR BANK_ACCOUNT
    ACTIVE BEFORE INSERT POSITION 0
    AS
    BEGIN
    IF (NEW.BANK_ACCOUNT_ID IS NULL) THEN
    NEW.BANK_ACCOUNT_ID = GEN_ID(GEN_BANK_ACCOUNT_ID,1);
    END^

    SET TERM ; ^

    mar egesz ejjel nem aludtam ezt butykoltem de nem akar osszejonni sehogysem
    Mutasd a teljes hozzászólást!
  • Hi!

    A tiggerben és az eljárásban miért használsz két különböző generátort???
    GEN_BANK_ACCOUNT_ID vs. GEN_CLIENT_BANK_ACCOUNT_ID

    Alex
    Mutasd a teljes hozzászólást!
  • ebbe igazad van hogy 2 kulombozo trigger volt hasznalva most megvaltoztattam 1 hasznala a tarolt eljaras is es a tabla is de igy sem megy!!!
    senkinek semmi otlete??
    Mutasd a teljes hozzászólást!
  • Hali,

    CLIENT_ID INTEGER DEFAULT '' NOT NULL,


    ez a sor érdekes. Integer mezőbe üres string default-nak?

    szerk:

    create table teszt(
    id integer default '' not null
    )

    --nem fog sikerülni
    insert into teszt(id) values(1)
    Mutasd a teljes hozzászólást!
  • Nem lehet, hogy a CLIENT_ID és az ACCOUNT_EXISTS okozza a problémát. A CLIENT_ID intgeger az ACCOUNT_EXISTS smallint
    SELECT FIRST 1 CLIENT_ID ... into :ACCOUNT_EXISTS
    Ha a CLIENT_ID már nagyobb mint a smallint maximális értéke akkor biztosan ez lesz a hibaüzenet.
    Mutasd a teljes hozzászólást!
  • rozman igazad van !!!
    de meg van egy problemam
    firebiird szinten jol mukodik tehat adatokat tudok felvinni es jol is mukodik a relacio is!!!
    DELPHIBE A DBGRIDEK SZUPERUL MUKODIK A PROBLEMA AZ AZ HOGY DELPHI ALOL NEM TUDOK HOZZA ADNI

    EZ AZ ELJARASOM

    procedure TFMain.SpeedButton4Click(Sender: TObject);
    var
    PCBA_ID:TPARAM;
    PACCOUNT_NUMBER:TPARAM;
    PBANK_NAME:TPARAM;
    PCLIENT_ID:TPARAM;
    PRCODE:TPARAM;
    begin

    UDM.DM.IB_BANK_ACCOUNT_INSERT.Params.Clear;

    PCBA_ID := TParam.Create(UDM.DM.IB_BANK_ACCOUNT_INSERT.Params, ptOutput);
    UDM.DM.IB_BANK_ACCOUNT_INSERT .Params[0].Name:='BANK_ACCOUNT_ID';

    PACCOUNT_NUMBER := TParam.Create(UDM.DM.IB_BANK_ACCOUNT_INSERT.Params, ptInput);
    UDM.DM.IB_BANK_ACCOUNT_INSERT.Params[1].Name:='BANK_ACCOUNT_NUMBER';

    PBANK_NAME:=TParam.Create(UDM.DM.IB_BANK_ACCOUNT_INSERT.Params, ptInput);
    UDM.DM.IB_BANK_ACCOUNT_INSERT.Params[2].Name:='BANK_ACCOUNT_NAME';

    PCLIENT_ID := TParam.Create(UDM.DM.IB_BANK_ACCOUNT_INSERT.Params, ptInput);
    UDM.DM.IB_BANK_ACCOUNT_INSERT.Params[3].Name:='CLIENT_ID';

    PRCODE := TParam.Create(UDM.DM.IB_BANK_ACCOUNT_INSERT.Params, ptOutput);
    UDM.DM.IB_BANK_ACCOUNT_INSERT.Params[4].Name:='RCODE';

    UDM.DM.IB_BANK_ACCOUNT_INSERT.ParamByName('BANK_ACCOUNT_NUMBER').AsString:=LabeledEdit19.Text;
    UDM.DM.IB_BANK_ACCOUNT_INSERT.ParamByName('BANK_ACCOUNT_NAME').AsString:=LabeledEdit20.Text;
    UDM.DM.IB_BANK_ACCOUNT_INSERT.ParamByName('CLIENT_ID').AsInteger:=UDM.DM.IBTable1.FieldValues['CLIENT_ID'];;
    UDM.DM.IBTransaction4.CommitRetaining;
    UDM.DM.IBTable4.Refresh;
    DBGrid3.Refresh;
    LabeledEdit20.Text:=IntToStr(UDM.DM.IB_BANK_ACCOUNT_INSERT.Params.ParamValues['CLIENT_ID']);
    PCBA_ID.Free;
    PACCOUNT_NUMBER.Free;
    PBANK_NAME.Free;
    PCLIENT_ID.Free;
    PRCODE.Free;
    end;

    MIT CSESZEK EL NEM ERTEM??
    REMELEM VAN VALAMI OTLETETEK!!
    KOSZI A VALASZOKAT IDAIG IS!!!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd