Autor Beitrag
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Di 07.01.14 10:03 
Hallo Leute,

mal wieder ein merkwürdiges Phänomen, das ich mir nicht erklären kann. Ich habe (Delphi 5, Access-Datenbank über ODBC, bitte jetzt keine Antworten, das sei überaltet) einen Effekt:

Bei einer TQuery werden Abfragen mit Quotedstr für Texte (" als Delimiter) ordnungsgemäß geöffnet.

Wenn ich jedoch eine Abfrage nach Summen von Feldern mache, und dort dann Eingrenzungen habe, muss ich die " durch ' ersetzen, sonst bekomme ich eine Fehlermeldung, dass die Abfrage Parameter sucht. Wie kann das sein, dass die TQuery.SQL mal so und mal zu benutzen ist? Liegt das etwa an RequestLive? Das ist bei der Summenabfrage nämlich auf False zu setzen, während es bei der normalen Abfrage auf True steht.


Beispiel "normale" TQuery:
ausblenden Delphi-Quelltext
1:
'Select * FROM '#$D#$A'AUFTRÄGE'#$D#$A'WHERE (AKTJAHR = -1)'#$D#$A'AND NOT(AUFTR_TYP = "AN")'#$D#$A'ORDER BY NR'#$D#$A					

Beispiel Summenabfrage (ebenfalls TQuery):
ausblenden Delphi-Quelltext
1:
Select sum(IST_BET) as Ist, sum(Rechn_BET) as Rechn, sum(Netto_BET) as Netto, sum(Rabatt_BET) as Rabatt, Count(Auftr_Nr) As n'#$D#$A'FROM AUFTRÄGE '#$D#$A'WHERE (AKTJAHR = -1)'#$D#$A'AND NOT(AUFTR_TYP = 'AN')'#$D#$A					

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
jaevencooler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 166
Erhaltene Danke: 6

MS-DOS,Win32, Win95, Win 98, Me,XP, Linux, NT4.0, NT 2000-2008, Vista, Windows 7
Turbo Pascal,D1 Enter,D2 Enter,D3 Enter,D5 Enter, Kylix, D2007, PL/SQL, MS/SQL, Delphi 2010, Delphi XE
BeitragVerfasst: Do 09.01.14 15:49 
Moin, Moin,

Du solltest die Abfrage mit Parametern machen, das ist so oder so besser.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
myQuery.close;
myQuery.sql.add(' Select * FROM AUFTRÄGE '); 
myQuery.sql.add(' WHERE AKTJAHR = -1 ');
myQuery.sql.add('   AND NOT AUFTR_TYP = :refAuftr_typ ');
myQuery.sql.add(' ORDER BY NR ');

myQuery.ParambyName('refAuftr_typ').asstring = 'AN';
myQuery.Open;


das gleichg Schema für deine andere Abfrage, und da den ParambyName eben als asfloat oder asInteger
definieren.

Gruß
Michael

_________________
Wissen ist Macht, nichts wissen macht auch nichts...

Für diesen Beitrag haben gedankt: Tranx
Tranx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Fr 10.01.14 10:25 
Das mit den Parametern ist schwierig, da ich sehr unterschiedliche Abfragen (unterschiedliche Anzahl von Feldern auf unterschiedliche Anzahl von Vergleichswerten) in einer TQuery nutze. Und die Übertragung der SQL-Abfrage einer TQuery auf eine andere nutze ich für von Delphi erstellte SQL-Abfrage einer Access-Abfrage. Sie soll genau die gleiche Datenmenge abbilden, wie die aktuelle Abfrage auf die Access-Tabelle "Aufträge".

Was ich eben nicht verstehe ist die Tatsache, dass einmal das " als Textbegrenzer und zum anderen das ' als Textbegrenzer genommen werden muss. Ich habe das zwar dadurch gelöst, dass ich in dem SQL-Text jedes " durch ' ersetze, aber verstehen tue ich das nicht.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.