AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Stored Procedure Abfrage ob Eintrag vorhanden
Thema durchsuchen
Ansicht
Themen-Optionen

Stored Procedure Abfrage ob Eintrag vorhanden

Ein Thema von Metallicwar · begonnen am 28. Feb 2011 · letzter Beitrag vom 1. Mär 2011
Antwort Antwort
Seite 2 von 3     12 3      
Metallicwar

Registriert seit: 5. Feb 2010
Ort: Bad Kissingen
293 Beiträge
 
Delphi XE Architect
 
#11

AW: Stored Procedure Abfrage ob Eintrag vorhanden

  Alt 1. Mär 2011, 08:06
ah ok, habs hinbekommen !!!

Code:
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;
Vielen Dank Herr Dürr!
  Mit Zitat antworten Zitat
Metallicwar

Registriert seit: 5. Feb 2010
Ort: Bad Kissingen
293 Beiträge
 
Delphi XE Architect
 
#12

AW: Stored Procedure Abfrage ob Eintrag vorhanden

  Alt 1. Mär 2011, 08:53
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 edtRückgabe.Text := qBankdaten.FieldByName('NAME').asString möglich.
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;
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
672 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: Stored Procedure Abfrage ob Eintrag vorhanden

  Alt 1. Mär 2011, 09:16
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;
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Metallicwar

Registriert seit: 5. Feb 2010
Ort: Bad Kissingen
293 Beiträge
 
Delphi XE Architect
 
#14

AW: Stored Procedure Abfrage ob Eintrag vorhanden

  Alt 1. Mär 2011, 09:45
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
  Mit Zitat antworten Zitat
Metallicwar

Registriert seit: 5. Feb 2010
Ort: Bad Kissingen
293 Beiträge
 
Delphi XE Architect
 
#15

AW: Stored Procedure Abfrage ob Eintrag vorhanden

  Alt 1. Mär 2011, 09:49
ach, habs schon.
War ja nichts großes.
Code:
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;
Vielen Dank für die Hilfe.
MfG
  Mit Zitat antworten Zitat
Metallicwar

Registriert seit: 5. Feb 2010
Ort: Bad Kissingen
293 Beiträge
 
Delphi XE Architect
 
#16

AW: Stored Procedure Abfrage ob Eintrag vorhanden

  Alt 1. Mär 2011, 11:58
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:
SELECT sub-query returned more than one row. with scalar CAST --
bei
Code:
SELECT Bankname, Bankleitzahl FROM Bankdaten WHERE Bankleitzahl = 10000000
erhalte ich einen Banknamen
bei
Code:
SELECT Bankname, Bankleitzahl FROM Bankdaten WHERE Bankname = 'Bundesbank'
erhalte ich mehrere Einträge (immer den selben Banknamen aber unterschiedliche Bankleitzahlen)

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:
COALESCE(expr1, ..)
gestoßen "Liefert das erste ERgebnis der ARgumentenliste, welches nicht in NULL resultiert."

Kann ich mit dieser Funktion arbeiten, oder ist es auf einem anderen Weg zu lösen?
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
672 Beiträge
 
Delphi 10.4 Sydney
 
#17

AW: Stored Procedure Abfrage ob Eintrag vorhanden

  Alt 1. Mär 2011, 12:30
SELECT sub-query returned more than one row. with scalar CAST --
Dürfen mehrere Einträge zurückkommen (also: interessieren die)? Wenn ja, wäre in diesem Fall dann eine Stored Procedure richtig, da die ein komplettes Resultset liefert. Falls es nicht relevant ist und die erste Fundstelle einfach genommen werden soll, dann einfach ein max() oder top 1 einfügen, also zB
@Bankleitzahl= (SELECT top 1 Bankleitzahl FROM Bankdaten WHERE Bankname = @bankname); oder
@Bankleitzahl= (SELECT max(Bankleitzahl) FROM Bankdaten WHERE Bankname = @bankname);
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Metallicwar

Registriert seit: 5. Feb 2010
Ort: Bad Kissingen
293 Beiträge
 
Delphi XE Architect
 
#18

AW: Stored Procedure Abfrage ob Eintrag vorhanden

  Alt 1. Mär 2011, 12:40
Zitat:
Dürfen mehrere Einträge zurückkommen (also: interessieren die)? Wenn ja, wäre in diesem Fall dann eine Stored Procedure richtig, da die ein komplettes Resultset liefert
ja sind interessant, dann müsst ich wohl doch wieder eine Stored Procedure schreiben ...
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.
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
672 Beiträge
 
Delphi 10.4 Sydney
 
#19

AW: Stored Procedure Abfrage ob Eintrag vorhanden

  Alt 1. Mär 2011, 13:35
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;
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Metallicwar

Registriert seit: 5. Feb 2010
Ort: Bad Kissingen
293 Beiträge
 
Delphi XE Architect
 
#20

AW: Stored Procedure Abfrage ob Eintrag vorhanden

  Alt 1. Mär 2011, 14:11
Delphi-Quellcode:
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)
könnte mir nochmal jmd weiterhelfen?
wenn ich nur Memo1.Lines.Add(qBankdaten.FieldByName('bankleitzahl').AsString); zeigt er mir nur eine Bankleitzahl an, aber das will ich ja nicht !
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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