AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Memo auslesen und als SQL Parameter aufbereiten
Thema durchsuchen
Ansicht
Themen-Optionen

Memo auslesen und als SQL Parameter aufbereiten

Ein Thema von Walter Landwehr · begonnen am 31. Mai 2013 · letzter Beitrag vom 1. Jun 2013
Antwort Antwort
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
384 Beiträge
 
Delphi 10.4 Sydney
 
#1

Memo auslesen und als SQL Parameter aufbereiten

  Alt 31. Mai 2013, 16:02
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
Walter Landwehr
  Mit Zitat antworten Zitat
madtom

Registriert seit: 24. Feb 2005
Ort: Hamburg
115 Beiträge
 
Delphi XE7 Professional
 
#2

AW: Memo auslesen und als SQL Parameter aufbereiten

  Alt 31. Mai 2013, 16:48
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;
Thomas
Delphi Programming

Geändert von madtom (31. Mai 2013 um 16:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Memo auslesen und als SQL Parameter aufbereiten

  Alt 31. Mai 2013, 17:03
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
384 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Memo auslesen und als SQL Parameter aufbereiten

  Alt 31. Mai 2013, 18:07
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
Walter Landwehr
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Memo auslesen und als SQL Parameter aufbereiten

  Alt 31. Mai 2013, 18:33
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

AW: Memo auslesen und als SQL Parameter aufbereiten

  Alt 31. Mai 2013, 20:51
Hallo,
bin mir nicht sicher, aber hier gibt es vermutlich mehrere Probleme:
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: 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 Kontonummer := Kontonummer + '''' + dmMain.Memo1.Lines[i] + '''' + ','; lieber 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 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.
BuchungenQry.SQL.Add('and K.Kontonummer in (:Kontonummer) '); musst Du eventuell durch
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).
  Mit Zitat antworten Zitat
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
384 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Memo auslesen und als SQL Parameter aufbereiten

  Alt 1. Jun 2013, 08:10
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;
Walter Landwehr
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:28 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