| |
|
|
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. |
|
|
| |
|
|
|
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 |
|
|
| |
|
|
|
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. |
|
|
| |
|
|