![]() |
Datenbank: ADS • Version: 9 • Zugriff über: Delphi 2009
Stored Procedure Abfrage ob Eintrag vorhanden
Hallo zusammen,
ich bin gerade dabei eine Stored Procedure zu schreiben, die mir anhand einer Bankleitzahl den Banknamen zurück gibt, oder anhand dem Banknamen die Bankleitzahl! Hier mein bisheriger Code: Dieser funktioniert schon so weit, dass ich eine Bankleitzahl eintragen kann und er mir den Banknamen zurückgibt, falls es einen gibt. Aber wie bau ich das ein, dass ich beim Ausführen der Stored Procedure entweder eine PLZ (integer) oder einen Banknamen (char) angeben kann, nachdem gesucht werden soll. Und ich möchte nur einen Parameter übergeben.
Code:
Aufruf der Stored Procedure:
PROCEDURE SP_ZMI_Bankdaten
( Bankleitzahl Integer, o Memo OUTPUT ) BEGIN DECLARE @Bankleitzahl INTEGER; DECLARE @Bankname char (60); @Bankleitzahl = (SELECT Bankleitzahl FROM __input); @Bankname = (SELECT Bankname FROM Bankdaten WHERE Bankleitzahl = @Bankleitzahl); IF @Bankname <> '' then INSERT INTO __output VALUES('Bankname lautet: ' +@Bankname); ELSE INSERT INTO __output VALUES('Keinen passenden Eintrag gefunden.'); END; END;
Code:
EXECUTE PROCEDURE SP_ZMI_Bankdaten(Bankleitzahl oder Bankname);
|
AW: Stored Procedure Abfrage ob Eintrag vorhanden
Zitat:
SQL-Code:
Aufruf:
create function ZMI_Bankdaten(such cichar(100))
returns Memo begin declare @blz integer; declare @name string; try @blz=cast(such as sql_integer); catch all @name=trim(such); end try; if @blz is NULL then @blz=12345; //hier BLZ aus name ermitteln else @name='hallo test'; //hier name aus BLZ ermitteln endif; return trim(cast(@blz as sql_char))+' '+@name; end;
SQL-Code:
select
ZMI_Bankdaten('testbank eG'), ZMI_Bankdaten('60069911') from system.iota; |
AW: Stored Procedure Abfrage ob Eintrag vorhanden
Also mit einer Bankleitzahl lässt sich eine Bank eindeutig identifizieren.
Mit einem Bankname ist dies nicht möglich. Man bräuchte mindestens noch die Postleitzahl als weiteres Kriterium. Daher würde ich empfehlen doch zwei getrennte SPs zu verwenden. Ausserdem sollte die SP nur die reinen Daten liefen; also ohne den Text "Bankname lautet: ". |
AW: Stored Procedure Abfrage ob Eintrag vorhanden
Muß die BLZ ein Integer sein?
Soweit ich weiß, wird damit nicht gerechnet und da würde ein Char-Typ sich doch eher anbieten. Gruß K-H |
AW: Stored Procedure Abfrage ob Eintrag vorhanden
das Feld in der Tabelle ist ein Integer Feld, daher wird auch ein Integer erwartet, oder nicht?
|
AW: Stored Procedure Abfrage ob Eintrag vorhanden
Code:
Soo, beim Eingeben einer Zahl natürlich in '' (
FUNCTION ZMI_Bankdaten
( such cichar(100) ) RETURNS Memo BEGIN declare @Bankleitzahl integer; declare @Bankname string; try @Bankleitzahl=cast(such as sql_integer); catch all @Bankname=trim(such); end try; if @Bankleitzahl is NULL then @Bankleitzahl= (SELECT Bankleitzahl FROM Bankdaten WHERE Bankname = such); else @Bankname= (SELECT Bankname FROM Bankdaten WHERE Bankleitzahl = such); endif; return trim(cast(@Bankleitzahl as sql_char))+' '+@Bankname; END;
Code:
bekomm ich folgende Fehlermeldung:
DECLARE @test Memo;
@test = ZMI_Bankdaten('10000000'); Invalid operand for operator: = ** Script error information: -- Location of error in the SQL statement is: 295 (line: 11 column: 16) Error in UDF: ZMI_Bankdaten Bei Eingabe einer Bank (
Code:
liefert er mir die entsprechende PLZ zurück. Dazu eine Frage, werden bei Functionen der Rückgabewerd nicht wie bei Prozeduren in der Messagebox angezeigt?
DECLARE @test Memo;
@test = ZMI_Bankdaten('Bundesbank'); |
AW: Stored Procedure Abfrage ob Eintrag vorhanden
Könnte es sein, daß
Code:
ein NULL zurück liefert, was dann wieder in '' übersetzt werden müßte?
SELECT Bankname FROM Bankdaten WHERE Bankleitzahl = such
Gruß K-H |
AW: Stored Procedure Abfrage ob Eintrag vorhanden
hmn, mir is jetzte nicht klar, wieso ich das wieder umwandeln muss?
@bankname is vom typ string und bei meinem Select erhalte ich doch auch einen Text zurück ?!? |
AW: Stored Procedure Abfrage ob Eintrag vorhanden
Zitat:
SQL-Code:
@Bankleitzahl= (SELECT Bankleitzahl FROM Bankdaten WHERE Bankname = @bankname);
|
AW: Stored Procedure Abfrage ob Eintrag vorhanden
Er knallt in der Zeile,
Code:
nicht in der @Bankleitzahl .....
@Bankname= (SELECT Bankname FROM Bankdaten WHERE Bankleitzahl = such);
wie gesagt mit der Fehlermeldung: Invalid operand for operator... |
AW: Stored Procedure Abfrage ob Eintrag vorhanden
ah ok, habs hinbekommen !!!
Code:
Vielen Dank Herr Dürr!
FUNCTION ZMI_Bankdaten
( suchwert cichar(100) ) RETURNS Memo BEGIN DECLARE @Bankleitzahl integer; DECLARE @Bankname string; TRY @Bankleitzahl=cast(suchwert as sql_integer); catch all @Bankname=trim(suchwert); END TRY; IF @Bankleitzahl is NULL then @Bankleitzahl= (SELECT Bankleitzahl FROM Bankdaten WHERE Bankname = @bankname); ELSE @Bankname= (SELECT Bankname FROM Bankdaten WHERE Bankleitzahl = @Bankleitzahl); ENDIF; return trim(cast(@Bankleitzahl as sql_char))+' '+@Bankname; END; |
AW: Stored Procedure Abfrage ob Eintrag vorhanden
Doch noch eine Frage :)
Beim Aufruf der Function über Delphi, wie kann ich mir das Ergebnis der Query in einem Editfeld anzeigen lassen. Bei gewöhnlichen Abfragen (Select NAME from BENUTZER WHERE NAME = Hugo) ist dies ja über
Delphi-Quellcode:
möglich.
edtRückgabe.Text := qBankdaten.FieldByName('NAME').asString
Wenn ich hier als Feld ZMI_Bankdaten angebe, sagt er, dass er das angegebene Feld nicht finden kann. Wie kann ich das lösen?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin qBankdaten.SQL.Text := 'SELECT ZMI_Bankdaten('+QuotedStr(edtSuchwert.Text)+') FROM system.iota'; qBankdaten.Open; edtRückgabe.Text := // das Ergebnis der Query als Text an mein EditFeld übergeben end; |
AW: Stored Procedure Abfrage ob Eintrag vorhanden
zuallererst würde ich Parameter verwenden, damit Formatprobleme und SQL injections umgangen werden. Dann muss man das unbekannte Feld der Selektion natürlich auch benamen - oder man greift auf dessen index zu:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin qBankdaten.SQL.Text := 'SELECT ZMI_Bankdaten(:suchwert) AS BANKDATEN FROM system.iota'; qBankdaten.ParamByName('suchwert').AsString:=edtSuchwert.Text; qBankdaten.Open; edtRückgabe.Text := qBankdaten.FieldByName('bankdaten').AsString; //oder edtRückgabe.Text := qBankdaten.Fields[0].AsString; end; |
AW: Stored Procedure Abfrage ob Eintrag vorhanden
da funktioniert doch recht gut !!! :)
nur zeigt er mir in meinem Editfeld immer beides an, also '10000000 Bundesbank' ich möchte aber immer nur die zugehörige PLZ oder eben den zugehörigen Banknamen. Naja werd ich wohl nochmal in der Function was ändern müssen. Mal schaun, ob ich es selber hinbekommen ;) Bis dahin, vielen Dank. Falls ich's nicht hinbekomme, melde ich mich ;) |
AW: Stored Procedure Abfrage ob Eintrag vorhanden
ach, habs schon.
War ja nichts großes.
Code:
Vielen Dank für die Hilfe.
CREATE FUNCTION ZMI_Bankdaten
( suchwert cichar(100) ) RETURNS Memo BEGIN DECLARE @Bankleitzahl integer; DECLARE @Bankname string; TRY @Bankleitzahl=cast(suchwert as sql_integer); catch all @Bankname=trim(suchwert); END TRY; IF @Bankleitzahl is NULL then @Bankleitzahl= (SELECT Bankleitzahl FROM Bankdaten WHERE Bankname = @bankname); return trim(cast(@Bankleitzahl as sql_char)); ELSE @Bankname= (SELECT Bankname FROM Bankdaten WHERE Bankleitzahl = @Bankleitzahl); return @Bankname; ENDIF; END; MfG |
AW: Stored Procedure Abfrage ob Eintrag vorhanden
doch nochmal ne Frage:
Habe die ganze Zeit zum Testen eine gekürzte Bankdatenliste verwendet, nur die ersten 20 Einträge der Liste, damit das Suchen nicht zu lange dauert. Verwende ich nun aber die vollständige Liste werden mir bei manchen BLZ mehrere Banken angezeigt und auch umgekehrt. Logischerweise knallt es dann:
Code:
bei
SELECT sub-query returned more than one row. with scalar CAST --
Code:
erhalte ich einen Banknamen
SELECT Bankname, Bankleitzahl FROM Bankdaten WHERE Bankleitzahl = 10000000
bei
Code:
erhalte ich mehrere Einträge (immer den selben Banknamen aber unterschiedliche Bankleitzahlen)
SELECT Bankname, Bankleitzahl FROM Bankdaten WHERE Bankname = 'Bundesbank'
ich hab im Buch von Herrn Dürr mal nachgeschlagen, ob es evtl. eine Funktion gibt um mit dem ersten Ergebnis des Selects weiterzuarbeiten und bin auf
Code:
gestoßen "Liefert das erste ERgebnis der ARgumentenliste, welches nicht in NULL resultiert."
COALESCE(expr1, ..)
Kann ich mit dieser Funktion arbeiten, oder ist es auf einem anderen Weg zu lösen? |
AW: Stored Procedure Abfrage ob Eintrag vorhanden
Zitat:
SQL-Code:
oder
@Bankleitzahl= (SELECT top 1 Bankleitzahl FROM Bankdaten WHERE Bankname = @bankname);
SQL-Code:
@Bankleitzahl= (SELECT max(Bankleitzahl) FROM Bankdaten WHERE Bankname = @bankname);
|
AW: Stored Procedure Abfrage ob Eintrag vorhanden
Zitat:
kann ich diesen Code nicht einfach übernehmen? würde es mir dann so vorstellen, dass ich alle Bankleitzahlen + Bankname in eine Listbox oder in ein Memo schreibe. |
AW: Stored Procedure Abfrage ob Eintrag vorhanden
geht viel einfacher als über functions oder storedprocs:
Delphi-Quellcode:
query.sql.text:='select * from bankdaten where contains(bankname,:such1) or cast(bankleitzahl as sql_char) like :such2';
query.parambyname('such1').asstring:=edtSuchwert.Text; query.parambyname('such2').asstring:=edtSuchwert.Text; query.open; |
AW: Stored Procedure Abfrage ob Eintrag vorhanden
Delphi-Quellcode:
könnte mir nochmal jmd weiterhelfen?
procedure TForm1.Button1Click(Sender: TObject);
var sZeichenLoeschen: String; iDatensätze: Integer; begin qBankdaten.sql.text:='select * from bankdaten where contains(bankname,:such1) or cast(bankleitzahl as sql_char) like :such2'; qBankdaten.parambyname('such1').asstring:=edtSuchwert.Text; qBankdaten.parambyname('such2').asstring:=edtSuchwert.Text; qBankdaten.open; for iDatensätze := 0 to qBankdaten.{?} - 1 do // Alle Ergebnisse in ein Memo schreiben Memo1.Lines.Add(Bankleitahl + Bankname) wenn ich nur
Delphi-Quellcode:
zeigt er mir nur eine Bankleitzahl an, aber das will ich ja nicht !
Memo1.Lines.Add(qBankdaten.FieldByName('bankleitzahl').AsString);
|
AW: Stored Procedure Abfrage ob Eintrag vorhanden
Zitat:
entweder Du holst alles über Fields /Fieldcount ab, hat den Vorteil, daß Du den Namen nicht kennen mußt, oder du mußt alle zurückgegebenen Felder mit Namen ansprechen:
Delphi-Quellcode:
Gruß
Memo1.Lines.Add(qBankdaten.FieldByName('Feld1').AsString);
Memo1.Lines.Add(qBankdaten.FieldByName('Feld2).AsString); .. Memo1.Lines.Add(qBankdaten.FieldByName('FeldN').AsString); K-H |
AW: Stored Procedure Abfrage ob Eintrag vorhanden
irgendwie hab ich grade einen Hänger :oops:
Delphi-Quellcode:
Er trägt mir irgendwie immer drei Bankleitzahlen ein + den zugehörigen Banknamen, aber es müssen etliche mehr sein, was mach ich denn noch falsch? :x
procedure TForm1.Button1Click(Sender: TObject);
var sZeichenLoeschen: String; iDatensätze: Integer; begin qBankdaten.sql.text:='select * from bankdaten where contains(bankname,:such1) or cast(bankleitzahl as sql_char) like :such2'; qBankdaten.parambyname('such1').asstring:=edtSuchwert.Text; qBankdaten.parambyname('such2').asstring:=edtSuchwert.Text; qBankdaten.open; for iDatensätze := 0 to qBankdaten.FieldCount - 1 do begin Memo1.Lines.Add(qBankdaten.FieldByName('Bankleitzahl').AsString + '= ' + qBankdaten.FieldByName('Bankname').AsString); qBankdaten.Next; end; end; Und wenn ich anstatt eines Banknamens eine PLZ eintrage (und diese ist ja eindeutig) krieg ich trotzdem 3 mal die selbe BLZ + Banknamen angezeigt. |
AW: Stored Procedure Abfrage ob Eintrag vorhanden
Zitat:
|
AW: Stored Procedure Abfrage ob Eintrag vorhanden
Zitat:
Code:
Und durch die for Schleife, wollte ich eben, erst das erste Ergebnis ins Memo schreiben, dann durch .Next das nächste Ergebnis, usw. ich hoffe ihr versteht wie ich's vorhatte.
1 Testbank
2 Testbank 3 Testbank 4 Testbank 5 Testbank |
AW: Stored Procedure Abfrage ob Eintrag vorhanden
Delphi-Quellcode:
erscheint mir wesentlich zielführender ;)
while not qBankdaten.EOF do
begin Memo1.Lines.Add(qBankdaten.FieldByName('Bankleitzahl').AsString + '= ' + qBankdaten.FieldByName('Bankname').AsString); qBankdaten.Next; end; |
AW: Stored Procedure Abfrage ob Eintrag vorhanden
Zitat:
Vielen Dank, super Lösung!!!!! Das wars !!! (falls mir nicht wieder irgendwas auffällt) *grins* |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:02 Uhr. |
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