Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Memo auslesen und als SQL Parameter aufbereiten (https://www.delphipraxis.net/175124-memo-auslesen-und-als-sql-parameter-aufbereiten.html)

Walter Landwehr 31. Mai 2013 16:02

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

madtom 31. Mai 2013 16:48

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;

DeddyH 31. Mai 2013 17:03

AW: Memo auslesen und als SQL Parameter aufbereiten
 
Oder so:
Delphi-Quellcode:
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;
Allerdings kann man das Ergebnis AFAIK nicht als SQL-Parameter übergeben, hier müssten noch diesbezügliche Threads zu finden sein.

Walter Landwehr 31. Mai 2013 18:07

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

p80286 31. Mai 2013 18:33

AW: Memo auslesen und als SQL Parameter aufbereiten
 
Ich denke Da müßte der SQLtext noch extra angepasst werden
(pseudocode)
Code:
for i:=0 to liste.count-1 do begin
  string:=':prm'+inttostr(i)+',';
  delete(string,length(string),1);
  string:=' and wert in('+string+')'
end;
Die Wertübergabe erfolgt dann über die indizierten Parameter, also nicht mit Parambyname.

Gruß
K-H

nahpets 31. Mai 2013 20:51

AW: Memo auslesen und als SQL Parameter aufbereiten
 
Hallo,
bin mir nicht sicher, aber hier gibt es vermutlich mehrere Probleme:
Zitat:

Zitat von Walter Landwehr (Beitrag 1217121)
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

Von welchem Typ sind :Anfang und :Ende? Numerisch, dann sollte das so gehen.

Bin mir nicht sicher, ob das funktioniert:
Delphi-Quellcode:
and K.Kontonummer in (:Kontonummer)
: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.)

Statt
Delphi-Quellcode:
Kontonummer := Kontonummer + '''' + dmMain.Memo1.Lines[i] + '''' + ',';
lieber
Delphi-Quellcode:
Kontonummer := Kontonummer + QuotedStr(dmMain.Memo1.Lines[i]) + ',';
Bei der IN-Klausel für die Kontonummer kann es sein, dass Du den Parameter von Hand per
Delphi-Quellcode:
AnsiReplaceText(BuchungenQry.SQL.Text,':Kontonummer',Kontonummer)
(oder anderer Ersetzungsmethode) austauschen musst.

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:
  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')]));
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.
Delphi-Quellcode:
BuchungenQry.SQL.Add('and K.Kontonummer in (:Kontonummer) ');
musst Du eventuell durch
Delphi-Quellcode:
BuchungenQry.SQL.Add(Format('and K.Kontonummer in (%s) ',[Kontonummer]));
ersetzen.

Da ich das jetzt ungetestet hier hingedaddelt habe, sind Syntaxfehler nicht auszuschließen (und logische erst recht nicht).

Walter Landwehr 1. Jun 2013 08:10

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 18:17 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