Einzelnen Beitrag anzeigen

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