![]() |
Memo auslesen und als SQL Parameter aufbereiten
Hallo,
ich habe in einer Anwendung ein Memofeld das ein oder mehrere Zeilen Text hat. z.B. 71412 72315 Kennt jemand eine Routine die mir diese Eintrage für einen SQL Parameter erstellt. Zum Beispiel so: ('71412',72315') Gruß Walter |
AW: Memo auslesen und als SQL Parameter aufbereiten
Hallo Walter,
mal so auf die Schnelle, vorausgesetzt, das in jeder Zeile eine Zahl steht:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer; sTemp: string; begin sTemp := EmptyStr; for i := 0 to Memo1.Lines.Count - 1 do sTemp := sTemp + '''' + Memo1.Lines[i] + '''' + ','; sTemp := Copy(sTemp, 0, Length(sTemp) - 1); ShowMessage('(' + sTemp + ')'); end; |
AW: Memo auslesen und als SQL Parameter aufbereiten
Oder so:
Delphi-Quellcode:
Allerdings kann man das Ergebnis AFAIK nicht als SQL-Parameter übergeben, hier müssten noch diesbezügliche Threads zu finden sein.
function StrFromList(const List: TStrings): string;
var i: integer; begin Result := ''; if List.Count > 0 then begin Result := QuotedStr(List[0]); for i := 1 to List.Count - 1 do Result := Format('%s, %s',[Result, QuotedStr(List[i])]); end; Result := Format('(%s)', [Result]); end; |
AW: Memo auslesen und als SQL Parameter aufbereiten
Danke Thomas hat geklappt.
Kennst Du Dich auch mit SQL aus. Hier mal eine Frage: Wie setze ich den Parameter in einer SQL Abfrage. Hier der Code: BuchungenQry.SQL.Add('SELECT SUM(B.Soll) as SollBetrag, SUM(B.Haben) as HabenBetrag ' + 'FROM Konto K INNER JOIN ' + 'Buchung B ON B.DVKontonummer = K.DVKontonummer INNER JOIN ' + 'Beleg BL ON BL.DVBelegnummer = B.DVBelegnummer ' + 'WHERE (BL.Buchungsperiode Between :Anfang and :Ende) ' + //---> Hier der Fehler ? 'and (BL.Belegart = ''ER'' or BL.Belegart = ''EG'')' + 'and K.Kontonummer in (:Kontonummer) ' + //---> Hier der Fehler ? 'and (B.InfoGegenkonto = ''3425'' or B.InfoGegenkonto = ''3410'')'); Fehler: Exception-Klasse EOleException mit Meldung 'Ungültige Autorisierungsangabe' Was ist hier falsch. Kontonummer := EmptyStr; for i := 0 to dmMain.Memo1.Lines.Count - 1 do begin Kontonummer := Kontonummer + '''' + dmMain.Memo1.Lines[i] + '''' + ','; end; Kontonummer := Copy(Kontonummer, 0, Length(Kontonummer) - 1); Gruß Walter |
AW: Memo auslesen und als SQL Parameter aufbereiten
Ich denke Da müßte der SQLtext noch extra angepasst werden
(pseudocode)
Code:
Die Wertübergabe erfolgt dann über die indizierten Parameter, also nicht mit Parambyname.
for i:=0 to liste.count-1 do begin
string:=':prm'+inttostr(i)+','; delete(string,length(string),1); string:=' and wert in('+string+')' end; Gruß K-H |
AW: Memo auslesen und als SQL Parameter aufbereiten
Hallo,
bin mir nicht sicher, aber hier gibt es vermutlich mehrere Probleme: Zitat:
Bin mir nicht sicher, ob das funktioniert:
Delphi-Quellcode:
:Kontonummer enthält hier ja eine Reihe von Werten, aber der Parameter :Kontonummer wird (soweit ich das bisher verstanden und beobachtet habe) als ein Wert angesehen. (Lasse mich da aber gerne eines Besseren belehren.)
and K.Kontonummer in (:Kontonummer)
Statt
Delphi-Quellcode:
lieber
Kontonummer := Kontonummer + '''' + dmMain.Memo1.Lines[i] + '''' + ',';
Delphi-Quellcode:
Bei der IN-Klausel für die Kontonummer kann es sein, dass Du den Parameter von Hand per
Kontonummer := Kontonummer + QuotedStr(dmMain.Memo1.Lines[i]) + ',';
Delphi-Quellcode:
(oder anderer Ersetzungsmethode) austauschen musst.
AnsiReplaceText(BuchungenQry.SQL.Text,':Kontonummer',Kontonummer)
Zeig uns bitte mal den Quelltext, in dem Du die Parameter mit Inhalt versorgst. Eventuell ist dort noch etwas "unscharf". Ein Versuch, es etwas "schöner" zu machen:
Delphi-Quellcode:
Bei dieser Variante kannst Du die letzten vier Zeilen einzeln oder gemeinsam auskommentieren und (solltest) ein gültiges SQL-Statement erhalten, das Du gegen die Datenbank absetzen kannst. Damit sollte es mit einem halben Dutzend Versuchen möglich sein, die fehlerbehaftete(n) Zeile(n) zu finden.
BuchungenQry.SQL.Add('SELECT SUM(B.Soll) as SollBetrag, SUM(B.Haben) as HabenBetrag ');
BuchungenQry.SQL.Add('FROM Konto K INNER JOIN '); BuchungenQry.SQL.Add('Buchung B ON B.DVKontonummer = K.DVKontonummer INNER JOIN '); BuchungenQry.SQL.Add('Beleg BL ON BL.DVBelegnummer = B.DVBelegnummer '); BuchungenQry.SQL.Add('WHERE (BL.Buchungsperiode Between :Anfang and :Ende) '); BuchungenQry.SQL.Add(Format('and (BL.Belegart in (%s, %s)',[QuotedStr('ER'),QuotedStr('EG')])); BuchungenQry.SQL.Add('and K.Kontonummer in (:Kontonummer) '); BuchungenQry.SQL.Add(Format('and (B.InfoGegenkonto in (%s, %s)',[QuotedStr('3425'),QuotedStr('3410')]));
Delphi-Quellcode:
musst Du eventuell durch
BuchungenQry.SQL.Add('and K.Kontonummer in (:Kontonummer) ');
Delphi-Quellcode:
ersetzen.
BuchungenQry.SQL.Add(Format('and K.Kontonummer in (%s) ',[Kontonummer]));
Da ich das jetzt ungetestet hier hingedaddelt habe, sind Syntaxfehler nicht auszuschließen (und logische erst recht nicht). |
AW: Memo auslesen und als SQL Parameter aufbereiten
Hallo,
Danke an alle. So läuft es jetzt. procedure TModul.Berechnung; var i, Jahr : Integer; Kontonummer : String; begin // Gesamt Vorjahr BuchungenQry.Close; BuchungenQry.SQL.Clear; Kontonummer := EmptyStr; for i := 0 to dmMain.Memo1.Lines.Count - 1 do begin Kontonummer := Kontonummer + '''' + dmMain.Memo1.Lines[i] + '''' + ','; end; Kontonummer := Copy(Kontonummer, 0, Length(Kontonummer) - 1); BuchungenQry.SQL.Add('SELECT SUM(B.Soll) as SollBetrag, SUM(B.Haben) as HabenBetrag '); BuchungenQry.SQL.Add('FROM Konto K INNER JOIN '); BuchungenQry.SQL.Add('Buchung B ON B.DVKontonummer = K.DVKontonummer INNER JOIN '); BuchungenQry.SQL.Add('Beleg BL ON BL.DVBelegnummer = B.DVBelegnummer '); BuchungenQry.SQL.Add('WHERE (BL.Buchungsperiode Between :Anfang and :Ende) '); BuchungenQry.SQL.Add(Format('and BL.Belegart in (%s, %s)',[QuotedStr('ER'),QuotedStr('EG')])); BuchungenQry.SQL.Add(Format('and K.Kontonummer in (%s) ',[Kontonummer])); BuchungenQry.SQL.Add(Format('and B.InfoGegenkonto in (%s, %s)',[QuotedStr('3425'),QuotedStr('3410')])); Jahr := StrToINT(dmMain.cbxJahr.Text); BuchungenQry.Parameters.ParamByName('Anfang').Valu e := '01-01' + '-' + IntToStr(Jahr - 1); BuchungenQry.Parameters.ParamByName('Ende').Value := '31-12' + '-' + IntToStr(Jahr - 1); BuchungenQry.Open; end;:-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 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