Deutsch
Forum

Firebird SQL RETURNING-Klausel

 

rquindt
Hallo

Ich möchte in einer SQL Datenbank bei den übergebenen Datensätzen automatisch eine Kunden-Nr vergeben lassen.
Das funktioniert soweit auch per Generator:

Db("fbSQLExec", hdb&, "CREATE TABLE ADRESSEN \
( KDNR Integer generated by Default as identity (start With 0) primary key Not NULL,\
NAME CHAR(30),\
VORNAME CHAR(30))",1)

Wenn ich jetzt einen Datensatz einfüge, möchte ich gern diese Kunden-Nr zurück übergeben haben, damit ich sie in einem weiteren Schritt nutzen kann. Das soll laut Internet per "RETURNING" funktionieren

db("fbSQLExec",hdb&,"INSERT INTO ADRESSEN (NAME,VORNAME) \
VALUES ('Mustermann','Max')" + " RETURNING KDNR",1)

Nur bekomme ich das Ergebnis nicht in eine Variable.
Zu dem ganzen habe ich einen DELPHI-Code gefunden,
bekomme den aber nicht in XPROFAN angepasst:

with DBank.IBC_Anschrift do
begin
Close;
SQL.Clear;
SQL.Add('INSERT INTO anschrift (AUFTRAG, Name_1, Name_2)');
SQL.Add('VALUES (''87777'', ''Schulze'', ''Nummer 2'')');
SQL.Add('RETURNING ID');

ExecSQL;
NewID:= DBank.IBC_Anschrift.ParamByName('RET_ID').Value;

ShowMessage(IntToStr(NewID);
end;

Kann mir da jemand helfen?
Vielen Dank im vorraus.
 
02.04.2018  
 




H.Brill
Ich denke mal, du mußt auch eine Variable angeben, an die
der SQL-Befehl den generierten Inhalt der ersten Spalte KDNR
hin triggert.

Declariere mal eine Variable Wert%
und probiere es mal so :
db("fbSQLExec",hdb&,"INSERT INTO ADRESSEN (NAME,VORNAME) \
VALUES ('Mustermann','Max')" + " RETURNING KDNR INTO :Wert%",1)

Stichpunkt : eingebettete Variablen mit Doppelpunkt.

In Wert% müßte dann der Inhalt stehen.
Auch vielleicht mal einen String (wert$) probieren.

So habe ich das mal im Internet gelesen. Will mir aber jetzt
nicht wegen dieser einen Sache eine extra DB bauen.

Probiere es halt einfach mal
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
03.04.2018  
 




Michael
W.
Meines Wissens geben die db(SQLExec/fbSQLExec/slSQLExec nur die Anzahl der verarbeiteten Datensätze zurück.

Auf der FireBird-Seite fehlt bei RETURNING die ESQL-Kennung. Also gibt es in der eingebetteten Version "fbembedded" das RETURNING auch nicht.
siehe:  [...] 
und:  [...] 

Also eine Funktion bauen, die die Adresse aufnimmt und die Kundennummer zurück gibt.
Proc neue_Adresse

    Parameters pName$, pVorname$
    Declare hGrid&
    hGrid& = Create("Grid",3,0)
    db("fbSQLExec", hdb&, "INSERT INTO ADRESSEN ( Name,Vorname ) VALUES ( :pName$, :pVorname$ )", 1)
    db("fbSQLExec", hdb&, "SELECT KdNr,Name,Vorname FROM ADRESSEN WHERE (Name = ':pName$') AND (Vorname = ':pVorname$')", hGrid&)
    ' Die Werte können dann alle kontrolliert werden; benötigt wird nur der erste
    ' Im Grid landen keine Überschriften, die Basis ist also Zeile 0 und Spalte 0
    Return Val( GetText$(hGrid&, 0,0) )

EndProc

KdNr& = neue_Adresse( "Mustermann", "Max" )

Das bedeutet zwar zwei SQL-Befehle auf die Datenbank loszulassen, aber dadurch lassen sich die Werte auch gleich kontrollieren.

Ein weiterer Vorteil der Funktion: Meistens braucht man für Kundennummern bestimmte Nummernkreise und Bereiche, die dafür nötige Bearbeitung kann man dort mit aufnehmen.

Das kann man sich dann für Produkt-, Rechnungs- und andere Nummern abschauen und auch so kapseln.
 
System: Windows 8/10, XProfan X4
Programmieren, das spannendste Detektivspiel der Welt.
04.04.2018  
 




rquindt
Danke für die Tips.
Da es häufig mal gleiche Namen und Vornamen oder sonstige Kombinationen gibt,
habe das ganze mal mit nem Generator umgebaut.

Db("fbSQLExec",hdb&,"CREATE GENERATOR KDNR",1) '----- Generator für Daten-Satz Nr wird erzeugt -------
Db("fbSQLExec",hdb&,"SET GENERATOR KDNR TO 0",1) '----- KDNR = Daten-Satz-Nr, Wert startet mit 0 ------

KdNr& = Datei_SatzNr( hdb& ) ' Nächste SatzNr ermitteln

db("fbSQLExec",hdb&,"INSERT INTO ADRESSEN (KDNR,NAME,VORNAME) \
VALUES (:KdNr&,'Mustermann','Max')",1)

End

'--------------------------------------------------------------------------------
Proc Datei_SatzNr

Parameters hdb1&
Declare hGrid&

hGrid& = Create("Grid",3,0)

Db("fbSQLExec",hdb1&,"select gen_id(KDNR,1) from RDB$DATABASE",hGrid&)

Return Val( GetText$(hGrid&, 0,0) )

' Im Grid landen keine Überschriften, die Basis ist also Zeile 0 und Spalte 0

EndProc
 
08.04.2018  
 




Michael
W.
Ja, nicht ganz.
hGrid& = Create("Grid",3,0)' <-- erzeugt ein Grid mit 3 Spalten
' hier wird von SELECT aber nur 1 Wert generiert... (im Beispiel waren es KdNr,Name,Vorname)
Db("fbSQLExec",hdb1&,"select gen_id(KDNR,1) from RDB$DATABASE",hGrid&)
Return Val( GetText$(hGrid&, 0,0) )

Außerdem wird in den meisten SELECT die gesamte Datenbank durchlaufen, es sei denn man grenzt die Suche mit einer WHERE-Klausel ein.
Das gen_id() könnte aber solch eine Begrenzung auf eine Zeile beinhalten.
 
Alle Sprachen
System: Windows 8/10, XProfan X4
Programmieren, das spannendste Detektivspiel der Welt.
09.04.2018  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

5.568 Betrachtungen

Unbenanntvor 0 min.
rquindt13.02.2024
Stringray05.01.2022
iF31.10.2020
Thomas Zielinski29.08.2019
Mehr...

Themeninformationen

Dieses Thema hat 3 Teilnehmer:

rquindt (2x)
Michael W. (2x)
H.Brill (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie