Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Probleme beim Aufruf einer StoredProcedure (https://www.delphipraxis.net/146562-probleme-beim-aufruf-einer-storedprocedure.html)

RWarnecke 22. Jan 2010 15:02

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:
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 ; ^
Aufgerufen wird Sie so :
Delphi-Quellcode:
    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;
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.

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 ?

mkinzler 22. Jan 2010 15:10

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)?

RWarnecke 22. Jan 2010 15:16

Re: Probleme beim Aufruf einer StoredProcedure
 
Zitat:

Zitat von mkinzler
-Ich würde returning verwenden

Wo und wie genau ?
Zitat:

Zitat von mkinzler
-Warum ist ein Kunde sein eigener Vorgänger (Parent)?

Ich kann Kunden auch kopieren. Beim Kopieren steht dann in der Kopie bei Parent der Wert wovon ich kopiert habe. Der Wert in NEW_STAMMID, zieht sich wie ein roter Pfaden durch die ganzen Tabellen. Daran wird alles festgemacht.
Zitat:

Zitat von mkinzler
-Gibt es Mussfelder (NOT NULL)?

Es gibt keine bestimmten Muss-Felder. Das MUSS wird hauptsächlich durch die Programmlogik geregelt.

hoika 22. Jan 2010 15:17

Re: Probleme beim Aufruf einer StoredProcedure
 
Hallo,

Zitat:

In der Tabelle KUNDEN wird ein anderer AutoInc-Wert genommen als in der STAMMD.
NEW_STAMMID = gen_id(GEN_STAMMD_ID, 1);

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

p80286 22. Jan 2010 15:23

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:
Insert into Kunden ... values(NEW_STAMMID,...)
Insert into STAMMD ... values(NEW_STAMMID,...)
Wo bleibt das commit? Lauert da irgendwo ein Autocommit?

Falls ich ganz falsch liege, sieh es mir nach, ich kenn Firebird nicht besonders gut.

Gruß
K-H

edit:
Zitat:

Kann es sein, dass da noch ein alter Trigger auf der Tabelle STAMMD
rumlungert, der dessen ID erzeugt ?
lungert ist GUUUUUUUT!

Zitat:

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.
Muß ja nicht zwangsläufig sein oder? (Einstellungssache?)

RWarnecke 22. Jan 2010 15:25

Re: Probleme beim Aufruf einer StoredProcedure
 
Zitat:

Zitat von hoika
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 NEW_STAMMID muss ich da doppelt nehmen, daran kann ich sehen, ob es eine Kopie ist oder nicht. Ich habe lediglich nur den Trigger auf der Tabelle STAMMD liegen. Auf den Tabellen Kunden und Grunddaten, gibt es keinen Trigger.

Zitat:

Zitat von hoika
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.

Achso, dass heißt also, ich könnte den INSERT-Befehl aus so schreiben ?
SQL-Code:
insert into GRUNDDATEN (STAMMNR) VALUES (:NEW_STAMMID);

mkinzler 22. Jan 2010 15:27

Re: Probleme beim Aufruf einer StoredProcedure
 
Zitat:

Warum die ganzen Nulls, sind sie ja sowieso.
Ja darauf bezog sich meine Frage, ein häufiger Grund für die Ablehnung von Inserts sind Mussfelder.

Zitat:

Da meine Firebird-Kenntnisse eher dünn sind
Auch mit FB Kenntnisse sehe ich hier etwaige Designprobleme

Zitat:

Achso, dass heißt also, ich könnte den INSERT-Befehl aus so schreiben ?
Ja

Zitat:

Die NEW_STAMMID muss ich da doppelt nehmen, daran kann ich sehen, ob es eine Kopie ist oder nicht.
In diesem Fall würde ich hier nichts eintragen

hoika 22. Jan 2010 15:34

Re: Probleme beim Aufruf einer StoredProcedure
 
Hallo,

Zitat:

Die NEW_STAMMID muss ich da doppelt nehmen, daran kann ich sehen, ob es eine Kopie ist
Übergib doch 0 als Parent.

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

mkinzler 22. Jan 2010 15:37

Re: Probleme beim Aufruf einer StoredProcedure
 
Zitat:

Übergib doch 0 als Parent.
Ich würde ihn garnicht setzen (NULL) und erst beim Kopieren setzen.

RWarnecke 22. Jan 2010 16:14

Re: Probleme beim Aufruf einer StoredProcedure
 
Der Grund dafür, dass ich zwei unterschiedliche Werte bekommen habe, war die Zeile
SQL-Code:
NEW_STAMMID = gen_id(GEN_STAMMD_ID, 1);
Diese Zeile setzt den Generator um den Wert 1 nach oben. Wenn jetzt danach noch die Zeile
SQL-Code:
insert into STAMMD (STATUSNR, FIRMA, NAME, VORNAME, KURZNAME, ANREDENR, BEMERKUNG, KENWORT, AKTIVE)
  values (2, 1, '', '', '', 1, '', '', 1);
ausgeführt wird, wird der Trigger wieder um eins erhöht. Ich habe daher diese Zeile dann abgeändert in
SQL-Code:
insert into STAMMD (STAMMNR, STATUSNR, FIRMA, NAME, VORNAME, KURZNAME, ANREDENR, BEMERKUNG, KENWORT, AKTIVE)
  values (:NEW_STAMMID, 2, 1, '', '', '', 1, '', '', 1);
, 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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:37 Uhr.
Seite 1 von 2  1 2      

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