![]() |
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);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 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 by Thomas Breitkreuz