AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Probleme beim Aufruf einer StoredProcedure
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme beim Aufruf einer StoredProcedure

Ein Thema von RWarnecke · begonnen am 22. Jan 2010 · letzter Beitrag vom 23. Jan 2010
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#1

Probleme beim Aufruf einer StoredProcedure

  Alt 22. Jan 2010, 15:02
Datenbank: Firebird • Version: 2.1 • Zugriff über: UniDAC
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 ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Probleme beim Aufruf einer StoredProcedure

  Alt 22. Jan 2010, 15:10
-Ich würde returning verwenden
-Warum ist ein Kunde sein eigener Vorgänger (Parent)?
-Gibt es Mussfelder (NOT NULL)?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#3

Re: Probleme beim Aufruf einer StoredProcedure

  Alt 22. Jan 2010, 15:16
Zitat von mkinzler:
-Ich würde returning verwenden
Wo und wie genau ?
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 von mkinzler:
-Gibt es Mussfelder (NOT NULL)?
Es gibt keine bestimmten Muss-Felder. Das MUSS wird hauptsächlich durch die Programmlogik geregelt.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Probleme beim Aufruf einer StoredProcedure

  Alt 22. Jan 2010, 15:17
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
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Probleme beim Aufruf einer StoredProcedure

  Alt 22. Jan 2010, 15:23
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?)
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#6

Re: Probleme beim Aufruf einer StoredProcedure

  Alt 22. Jan 2010, 15:25
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 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 ?
insert into GRUNDDATEN (STAMMNR) VALUES (:NEW_STAMMID);
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Probleme beim Aufruf einer StoredProcedure

  Alt 22. Jan 2010, 15:27
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
Markus Kinzler
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Probleme beim Aufruf einer StoredProcedure

  Alt 22. Jan 2010, 15:34
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
Heiko
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Probleme beim Aufruf einer StoredProcedure

  Alt 22. Jan 2010, 15:37
Zitat:
Übergib doch 0 als Parent.
Ich würde ihn garnicht setzen (NULL) und erst beim Kopieren setzen.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#10

Re: Probleme beim Aufruf einer StoredProcedure

  Alt 22. Jan 2010, 16:14
Der Grund dafür, dass ich zwei unterschiedliche Werte bekommen habe, war die Zeile 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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz