![]() |
String-Literale
Hallo!
Ich hab folgendes Problem. Beim kompilieren bekomme ich diese Fehlermeldung: Zitat:
Delphi-Quellcode:
Und der Witz an der Geschichte ist, in einer anderen Unit funktioniert die Konstellation.
Procedure PutKundeObj(AOwner : TComponent; DataModule : TMySQLModule; MandantenId : String;KundenObjData : TKundenObj);
Var Stmt : String; i : Integer; Begin Try Screen.Cursor := crSQLWait; DataModule.KundenObjQuery.Close; DataModule.KundenObjQuery.SQL.Clear; Stmt := UTF8Encode('INSERT INTO KundenObj (mandantenid, objnr, kundnr, typnr, typ,'+ ' umsatz1, umsatz2, umsatz3, umsatz4, umsatz5, umsatz6, umsatz7, umsatz8, umsatz9, umsatz10, umsatz11, umsatz12, umsatz13, umsatz4,'+ ' ertrag1, ertrag2, ertrag3, ertrag4, ertrag5, ertrag6, ertrag7, ertrag8, ertrag9, ertrag10, ertrag11, ertrag12, ertrag13, ertrag4,'+ ' anzahl1, anzahl2, anzahl3, anzahl4, anzahl5, anzahl6, anzahl7, anzahl8, anzahl9, anzahl10, anzahl11, anzahl12, anzahl13, anzahl4) VALUES '+ '('''+KundenObjData.MandantenId+''','+ // An dieser Stelle, bei dieser Variable tritt der Fehler auf ''''+KundenObjData.ObjNr+''','+ ''''+KundenObjData.KundNr+''','+ ''''+KundenObjData.TypNr+''','+ IntToStr(KundenObjData.Typ)+','); : : : Hab ich da was übersehen? Oder wo liegt das Problem? :gruebel: Stephan |
Re: String-Literale
Eine Sache habe ich vergessen. Die Variable KundenObjData.MandantenID ist von Typ String[3].
|
Re: String-Literale
Dein String is einfach zu lang ... schreib einfach mal mitten in den String '+' rein, danach dürfte das funktionieren :)
Edit: Ja, mit den Hochkomma... |
Re: String-Literale
Das klappt leider nicht.
Das komische ist, wenn ich die Variable MandantenID (Typ String) aus dem Procedure-Kopf nehme, dann geht es. |
Re: String-Literale
INSERT INTO KundenObj (mandantenid, objnr, kundnr, typnr, typ,'+
' umsatz1, umsatz2, umsatz3, umsatz4, umsatz5, umsatz6, umsatz7, umsatz8, umsatz9, umsatz10, umsatz11, umsatz12, umsatz13, umsatz4,'+ ' ertrag1, ertrag2, ertrag3, ertrag4, ertrag5, ertrag6, ertrag7, ertrag8, ertrag9, ertrag10, ertrag11, ertrag12, ertrag13, ertrag4,'+ ' anzahl1, anzahl2, anzahl3, anzahl4, anzahl5, anzahl6, anzahl7, anzahl8, anzahl9, anzahl10, anzahl11, anzahl12, anzahl13, anzahl4) VALUES Dieser String hängt zusammen und er hat mehr als 255 Zeichen. Splitte den string auf und speichere ihn in eine Variable zwischen. |
Re: String-Literale
Hallo,
Ist doch logisch. Im Kopf deklarierst du mandantenid als string (unbegrenzt). Wie du geschrieben hast ist der Typ den du übergibst string[3]. Irgendwie passt das nicht zusammen. OK vergiss meinen Beitrag! Mein Vorgänger hat Recht. Grüsse |
Re: String-Literale
Hallo Stephan,
hast du in dieser Unit den Typ String umdefiniert? Ich vermute, daß du mit einem ShortString arbeitest, anders ist die Fehlermeldung nicht zu erklären. Suche in der Unit mal nach den Compilerdirektiven
Delphi-Quellcode:
Überprüfe auch die Compilereinstellung in den Projektoptionen ("Huge-String").
{$H-} bzw. {$LONGSTRINGS OFF}
Gruß Hawkeye |
Re: String-Literale
Du könntest es auch so machen:
Delphi-Quellcode:
Das ist IMHO auch lesbarer. Bei 4 Hochkommas hintereinander wird mir schwummerig. :-)
procedure PutKundeObj(AOwner: TComponent; KundenObjData: TKundenObj);
const cStmt = 'INSERT INTO KundenObj (mandantenid, objnr, kundnr, typnr, typ,' + ' umsatz1, umsatz2, umsatz3, umsatz4, umsatz5, umsatz6, umsatz7, umsatz8, umsatz9, umsatz10, umsatz11, umsatz12, umsatz13, umsatz4,' + ' ertrag1, ertrag2, ertrag3, ertrag4, ertrag5, ertrag6, ertrag7, ertrag8, ertrag9, ertrag10, ertrag11, ertrag12, ertrag13, ertrag4,' + ' anzahl1, anzahl2, anzahl3, anzahl4, anzahl5, anzahl6, anzahl7, anzahl8, anzahl9, anzahl10, anzahl11, anzahl12, anzahl13, anzahl4) VALUES ' + '(''%s'',''%s'',''%s'',''%s'',%i,'; var Stmt: string; begin Stmt := UTF8Encode(Format(cStmt, [KundenObjData.MandantenId, KundenObjData.ObjNr, KundenObjData.KundNr, KundenObjData.TypNr, KundenObjData.Typ])); end; Oder erzeug den ersten Teil des Strings mit 14x "umsatzN", "ertragN", "anzahlN" in einer Schleife. Uli. |
Re: String-Literale
Standardmäßig wird unter Delphi ein String als Ansistring gespeichert, d.h. er kann ca. 2^31 Zeichen (bis 4 GB) speichern.
Das mit dem String-Splitting passt nicht mit dem Phänomän zusammen. Außerdem kann ich in einer anderen Unit weitaus größere Strings erstellen ohne Meldung. Ich habe auch keine Compilerdirektiven verändert bzw. hinzugefügt. Ich hab so das Gefühl, dass mein Delphi 7 ne Macke hat... Stephan |
Re: String-Literale
Hallo Stephan,
ich habe die Zeichen in der Stringkonstanten nicht gezählt. Falls es jedoch mehr als 255 sind, kann das zu Problemen führen:
Delphi-Quellcode:
Die Fehlermeldung dürfte dir bekannt vorkommen...
procedure Test;
const s8 = '12345678'; s32 = s8 + s8 + s8 + s8; s127 = s32 + s32 + s32 + s8 + s8 + s8 + '1234567'; s128 = s32 + s32 + s32 + s32; s255 = s128 + s127; s256 = s128 + s128; var s1 : AnsiString; s2 : ShortString; begin s1 := s256; s2 := s255; s2 := s256; end; Gruß Hawkeye |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 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