![]() |
Datenbank: Firebird • Version: 2.1 • Zugriff über: UniDAC
Probleme beim Aufruf einer StoredProcedure
Hallo szuammen,
ich habe ein großes Problem. Ich habe folgende SP:
SQL-Code:
Aufgerufen wird Sie so :
SET TERM ^ ;
CREATE procedure SP_NEW_CUSTOMER returns ( NEW_STAMMID integer) as begin NEW_STAMMID = gen_id(GEN_STAMMD_ID, 1); insert into STAMMD (STATUSNR, FIRMA, NAME, VORNAME, KURZNAME, ANREDENR, BEMERKUNG, KENWORT, AKTIVE) values (2, 1, '', '', '', 1, '', '', 1); insert into KUNDEN (STAMMNR, version, PARENTNR) values (:NEW_STAMMID, 0, :NEW_STAMMID); insert into GRUNDDATEN values (:NEW_STAMMID, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); suspend; end ^ SET TERM ; ^
Delphi-Quellcode:
Nach diesem Aufruf, werden noch zwei weitere Masken aufgerufen. Bei der ersten Maske werden Werte in der STAMMD hinzugefügt oder geändert mit Update-Befehlen. In der zweiten Maske werden ebenfalls Werte geändert oder hinzugefügt in der Tabelle Grunddaten. Jetzt zu meinen zwei Problemen.
with DM_Main.UniQuery_Temp do
begin SQL.Clear; SQL.Text := 'SELECT * FROM SP_NEW_CUSTOMER'; Open; NewStammID := FieldByName('NEW_STAMMID').AsInteger; StammNr := NewStammID; Close; DM_Main.UniTrans_MainTrans.Commit; end; 1.) Die Update-Befehle für die Tabelle STAMMD werden nicht durchgeführt. 2.) In der Tabelle KUNDEN wird ein anderer AutoInc-Wert genommen als in der STAMMD. Wo habe ich einen Fehler gemacht ? |
Re: Probleme beim Aufruf einer StoredProcedure
-Ich würde returning verwenden
-Warum ist ein Kunde sein eigener Vorgänger (Parent)? -Gibt es Mussfelder (NOT NULL)? |
Re: Probleme beim Aufruf einer StoredProcedure
Zitat:
Zitat:
Zitat:
|
Re: Probleme beim Aufruf einer StoredProcedure
Hallo,
Zitat:
OK, neue ID insert into STAMMD (STATUSNR, FIRMA, NAME, VORNAME, KURZNAME, ANREDENR, BEMERKUNG, KENWORT, AKTIVE) values (2, 1, '', '', '', 1, '', '', 1); hm, nur statische Werte wo soll denn jetzt das anderer AutoInc-Wert als in der STAMMD kommen insert into KUNDEN (STAMMNR, version, PARENTNR) values (:NEW_STAMMID, 0, :NEW_STAMMID); hier nehmen wir die NEW_STAMMID doppelt Kann es sein, dass da noch ein alter Trigger auf der Tabelle STAMMD rumlungert, der dessen ID erzeugt ? Die Frage vom mkinzler bezieht sich wohl auf insert into GRUNDDATEN values (:NEW_STAMMID, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); Warum die ganzen Nulls, sind sie ja sowieso. Heiko |
Re: Probleme beim Aufruf einer StoredProcedure
Da meine Firebird-Kenntnisse eher dünn sind
1) Du generierst NEW_STAMMID 2) Du trägst NEW_STAMMID in KUNDEN und GRUNDDATEN ein, nicht in STAMMD daher sehe ich keinen Zusammenhang zwischen STAMMD und NEW_STAMMID, warum also ein Update? Welcher Autoinc-Wert in Kunden? Könnte es sein das Du soetwas wolltest?
SQL-Code:
Wo bleibt das commit? Lauert da irgendwo ein Autocommit?
Insert into Kunden ... values(NEW_STAMMID,...)
Insert into STAMMD ... values(NEW_STAMMID,...) Falls ich ganz falsch liege, sieh es mir nach, ich kenn Firebird nicht besonders gut. Gruß K-H edit: Zitat:
Zitat:
|
Re: Probleme beim Aufruf einer StoredProcedure
Zitat:
Zitat:
SQL-Code:
insert into GRUNDDATEN (STAMMNR) VALUES (:NEW_STAMMID);
|
Re: Probleme beim Aufruf einer StoredProcedure
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Probleme beim Aufruf einer StoredProcedure
Hallo,
Zitat:
Und ja, lösche den Trigger und lege den Datensatz in der SP an, so wie du es beschrieben hast. Der Trigger erzeugt eine ID, weist die Id dem neuen Record zu. Dann rufst du in der SP noch mal gen_id auf und diese ID wird bei allen anderen Tabellen benutzt. Hier fehlt ein foreign key (Kunden.StammId -> Stammd.Id) Dann wäre es sofort aufgefallen. Heiko |
Re: Probleme beim Aufruf einer StoredProcedure
Zitat:
|
Re: Probleme beim Aufruf einer StoredProcedure
Der Grund dafür, dass ich zwei unterschiedliche Werte bekommen habe, war die Zeile
SQL-Code:
Diese Zeile setzt den Generator um den Wert 1 nach oben. Wenn jetzt danach noch die Zeile
NEW_STAMMID = gen_id(GEN_STAMMD_ID, 1);
SQL-Code:
ausgeführt wird, wird der Trigger wieder um eins erhöht. Ich habe daher diese Zeile dann abgeändert in
insert into STAMMD (STATUSNR, FIRMA, NAME, VORNAME, KURZNAME, ANREDENR, BEMERKUNG, KENWORT, AKTIVE)
values (2, 1, '', '', '', 1, '', '', 1);
SQL-Code:
, womit ich in allen drei Tabellen den gleichen Wert erreicht habe. Ich war immer davon ausgegangen und hatte auch die Beschreibung falsch verstanden, dass der Befehl gen_id mir nur einen Wert liefert aber nicht den Wert im Generator ändert.
insert into STAMMD (STAMMNR, STATUSNR, FIRMA, NAME, VORNAME, KURZNAME, ANREDENR, BEMERKUNG, KENWORT, AKTIVE)
values (:NEW_STAMMID, 2, 1, '', '', '', 1, '', '', 1); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz