AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi IBSQL - INSERT Problem
Thema durchsuchen
Ansicht
Themen-Optionen

IBSQL - INSERT Problem

Ein Thema von Quake · begonnen am 23. Feb 2004 · letzter Beitrag vom 26. Feb 2004
Antwort Antwort
Quake

Registriert seit: 25. Aug 2003
222 Beiträge
 
Delphi 7 Enterprise
 
#1

IBSQL - INSERT Problem

  Alt 23. Feb 2004, 10:41
Hallo,

ich benutze eine IB-Datenbank un habe dort einen Before-Insert-Trigger erstellt, der mir einige Felder berechnet. Füge ich nun einen Datensatz per INSERT ein, wird eine ID im Trigger generiert und die anderen Felder berechnet.
Nun zu meiner Frage. Wie bekomme ich die ID und die berechneten Felder zurück?

Code:
var
  i: integer;
begin
  ibsql1.sql.clear;
  ibsql1.SQL.Add('insert into MyTable (MyIntWert) values (20);');
  ibsql1.ExecQuery;
  ibsql1.sql.clear;
  ibsql1.SQL.add('commit retain;');
  ibsql1.ExecQuery;

  i:=ibsql1.FieldByName('ID').AsInteger;    // Hier bekomme ich immer einen Fehler, daß das Feld nicht existiert
Muss ich hier in diser Procedure was ändern oder muss ich in meinem Trigger irgendwie einen Wert zurückgeben? Wenn Ja, wie?

ciao und schon mal vielen Dank für eure Mühe


PS : Vielleicht sollte ich noch sagen, ich benötige dafür keine Ausgabe auf dem Bildschirm. Ich möchte nur mit den Errechneten Feldern meines Triggers in meinem Delphi-Progi weiter rechnen.
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#2

Re: IBSQL - INSERT Problem

  Alt 23. Feb 2004, 10:47
Du hast doch garkeine Datenmenge, die ein Feld enthalten könnte!
Dein letztes SQL-Statement war "commit retain" das wird nun wirklich nix zurückliefern...
  Mit Zitat antworten Zitat
Quake

Registriert seit: 25. Aug 2003
222 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: IBSQL - INSERT Problem

  Alt 23. Feb 2004, 11:08
Auch wenn ich die Reihenfolge ändere funzt das nicht

Code:
var
  i: integer;
begin
  ibsql1.sql.clear;
  ibsql1.SQL.Add('insert into MyTable (MyIntWert) values (20);');
  ibsql1.ExecQuery;

  i:=ibsql1.FieldByName('ID').AsInteger;    // Hier bekomme ich immer einen Fehler, daß das Feld nicht existiert

  ibsql1.sql.clear;
  ibsql1.SQL.add('commit retain;');
  ibsql1.ExecQuery;
  Mit Zitat antworten Zitat
Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#4

Re: IBSQL - INSERT Problem

  Alt 23. Feb 2004, 15:02
Wie Robert_G faka GeorgeWNewbie schon sagte:

Du öffnest keine Datenmenge sondern sendest Nur einen Befehl an die DB. Wenn Du die gerade erzeugte Id haben möchtest müßtest Du noch:
Code:
var
  i: integer;
begin
  ibsql1.sql.clear;
  ibsql1.SQL.Add('insert into MyTable (MyIntWert) values (20);');
  ibsql1.ExecQuery;
  ibsql1.sql.clear;
  ibsql1.SQL.add('commit retain;');
  ibsql1.ExecQuery;

  [color=red]ibsql1.sql.clear;
  ibsql1.SQL.add('select max(ID) from MyTable where MyIntWert=20');
  ibsql.Open;[/color]
  i:=ibsql1.FieldByName('ID').AsInteger;
  ...
Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat
Quake

Registriert seit: 25. Aug 2003
222 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: IBSQL - INSERT Problem

  Alt 23. Feb 2004, 15:29
Danke schon mal,

Eine Frage habe ich dazu aber noch. Währe es denkbar, daß in dem Fall wenn 2 PC gleichzeitig einen Datensatz einfügen, das der eine PC den Falschen Datensatz zurück bekommt?

Wenn ja könnte ich nur eine Stored Procedure schreiben die den Datensatz einfügt, die Berechnungen durchführt und mir diese Werte zurück gibt.

Oder gibt es noch eine Methode, bei der ich die Werte direkt bei dem insert zurück bekomme ohne nachfolgendes select, da der Wert MyIntWert sehr oft vorkommen kann?

ciao

PS: ich hatte nur noch das SELECT abgeänder
Code:
select * from MyTable where ID=(select max(ID) from MyTable)
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#6

Re: IBSQL - INSERT Problem

  Alt 23. Feb 2004, 15:41
Do könntest die Tabelle sperren oder hoffen, das es wie bei Oracle auch in IB eine RETURNING-Clause gibt:
Delphi-Quellcode:
Var
  NewID :Integer;
Begin
  With Query Do
  Begin
    SQL.Text :=
      'INSERT INTO Tabelle (Feld2) VALUES (:i_Value)' + #10 +
      ' RETURNING ID INTO :o_ID';
    Prepared := True;
    Parameters.ParamByName('i_Value').Value := 'Hallo';
    Parameters.ParamByName('o_ID').Direction := pdOutput;
    ExecSQL;
    NewID := Parameters.ParamByName('o_ID').Value;
  End;
End;
  Mit Zitat antworten Zitat
Quake

Registriert seit: 25. Aug 2003
222 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: IBSQL - INSERT Problem

  Alt 23. Feb 2004, 15:48
Ja, das ist genau das was ich suche, aber es funktionirt bei IB nicht (soweit ich weis).
Deinen Vorschlag hatte ich hier im Forum auch schon irgendwo gefunden.

Aber trotzdem Danke.

Wenn jemand noch eine Ide hat währe sehr schön.
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: IBSQL - INSERT Problem

  Alt 24. Feb 2004, 17:50
Hi,

die meiner Meinung nach einzig sinnvolle Vorgehensweise in diesem Fall ist die Verwendung einer Stored Procedure die den Insert durchführt und die berechneten Daten zurückgibt.
Ein MAX(ID) wird bei einem Netzwerkbetrieb nicht sicher funktionieren.

Grüße
Lemmy
  Mit Zitat antworten Zitat
Benutzerbild von Marcel Gascoyne
Marcel Gascoyne

Registriert seit: 18. Nov 2003
Ort: Uetersen
271 Beiträge
 
Delphi 2005 Architect
 
#9

Re: IBSQL - INSERT Problem

  Alt 24. Feb 2004, 23:10
Ich würd es auch mit einer Procedure probieren. Dein Programm sollte dann folgendes machen:

Delphi-Quellcode:
var
  i: integer;
begin
  ibsql1.SQL.Text := 'select id from myprocedure(:myintwert)';
  ibsqll.ParamByName('myintwert').AsInteger := 20;
  ibsql1.Open;

  if not ibsqll.Eof then
    i := ibsqll.FieldByName('ID').AsInteger
  else
    i := -1;

  ibsqll.Close;
Und hier die Procedure dazu:

SQL-Code:
create procedure myprocedure (
  myintwert integer
)
returns (
  id integer
)
as
begin
  insert into MyTable (MyIntWert)
  values (:myintwert);

  // hier Deine Berechnungen

  id = gen_id(generator_name,1); // oder wie auch immer du den wert bekommst...
  suspend;
end
Gruß,
Marcel
Marcel Gascoyne
  Mit Zitat antworten Zitat
Quake

Registriert seit: 25. Aug 2003
222 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: IBSQL - INSERT Problem

  Alt 26. Feb 2004, 07:57
So in der Art werde ich das mache.

Danke euch allen.
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:39 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