| Autor |
Beitrag |
kiwicht
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Di 28.01.03 21:23
N´abend...
ist es vielleicht möglich, das ich bei Query Update
insgesamt nur rd. 25 Felder angeben darf in denen ein Wert geändert wird?
Oder bezieht sich das vielleicht sogar auf alle SQL-Befehle, das die auf eine bestimmte Zeilen-Anzahl, was 'Add' betrifft, begrenzt sind?
Zum besseren verständnis:
-------------------------------
2 Datenbanken - Einmal Vorgangsbuch, einmal History.
In der History werden die Datensätze gespeichert, die jemand im Vorgangsbuch geändert hat, und zwar so wie sie ursprünglich waren.
Beide Datenbanken haben, logisch, die gleichen Felder, knapp 25.
Wenn ich jetzt also für beide Datenbanken
Quelltext 1: 2: 3: 4:
| with Query do begin Clear; Add('UPDATE vorgbuch'); Add('SET .... = .... '); <- und das halt 25 mal, je Datenbank. |
entsprechend die Daten in die Felder schreiben will, erhalt ich bei der Ausführung, wenn das direkt unter Delphi läuft:
| Zitat: |
"Project .....exe raised expception class EDBEngineError with message:
"Type missmatch in expression" Process stopped....."
|
und wenn ich das Programm selbstständig ausführe erhalt ich:
| Zitat: |
"Bei der Eingabe der Suchkriterien ist ein Fehler aufgetreten!"
|
Also erstmal zwei völlig verschieden Meldungen, und sie erscheinen nur (!) wenn ich das Programm ausführe, und die gewisse Operation mehr als 3, 4 mal aktiviere....
ihr könnt vielleicht verstehen , das ich jetzt doch etwas sehr verstört bin, weil ich da absolut nicht kapiere wieso weshalb warum.. ich hau mir das problem jetzt schon seit heut mittag um die ohren, komm aber zu keiner lösung...
vielleicht könnt ihr mir helfen...
mfg
kiwicht
|
|
smiegel
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: Di 28.01.03 22:20
Hallo,
wie sehen Deine Set-Parameter im Detail aus?
Werden etwa in der Parameterliste falsche Datentypen übergeben, z.B. String statt Integer?
_________________ Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
|
|
kiwicht 
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Di 28.01.03 22:56
Hi
es werden nur Strings übergeben, aber damit hatte ich bisher noch kein Problem... zumal es ja erst klappt, und dann ne weile garnicht.
Jedenfalls sind sie alle schematisch wie dieser:
Quelltext 1: 2: 3: 4:
| UPDATE datenbank SET feld1 = ' + variable1); , feld2 = ' + variable2); , feld3 = ' + variable3); |
und dann halt Query.ExecSQL;
Moderiert von Tino: Code-Tags hinzugefügt.
|
|
smiegel
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: Di 28.01.03 23:41
Hallo,
es ist schwierig aus Deinen Code-Fragmenten den Fehler herauszufinden.
Poste doch einmal den Code den Benutzt. Fügst Du nach jeder Set-Zuweisung ein Komma ein, bis auf die letzte?
Etwa in der Form:
Quelltext 1: 2: 3: 4:
| Add('SET Feld1='+variable1+', '); Add('Feld2='+variable2+', '); ... Add('Feld25='+variable25); |
_________________ Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
|
|
kiwicht 
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Mi 29.01.03 09:46
stimmt.. ich wollte halt vermeiden das das forum so zu-getextet wird mit code en masse
also, dann ma los, und nich erschrecken:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107:
| procedure TForm1.Button1Click(Sender: TObject); begin
QueryVorgbuch.Active := True; QueryVorgbuch.Active := False;
Vorgang := QuotedStr(FVEvorgang.Text); // [...] und 29 weitere zuweisungen, alle nach dem gleichen Prinzip
with QueryVorgbuch.SQL do begin Clear; Add('UPDATE vorgbuch '); Add('SET vorgang = ' + Vorgang); Add(', kndcd = ' + Vkndcd); //[...] die in der Mitte hab ich mal rausgelassen, sind aber vom gleichen // Syntax-Schema wie das obere Add(', kfz = ' + Vkfz); Add('WHERE lfdnr = ' + LfdNrToEdit); end; QueryVorgbuch.ExecSQL;
// da ich das Problem hatte, das mein Prog manchmal abstürzt, hab ich // UPDATE gesplittet... hier der Rest with QueryVorgbuch.SQL do begin Clear; Add('UPDATE vorgbuch '); Add('SET provan = ' + Vprovan); Add(', bemerkung1 = ' + Vbemerkung1); [...] Add(', bemerkung7 = ' + Vbemerkung7); Add('WHERE lfdnr = ' + LfdNrToEdit); end; QueryVorgbuch.ExecSQL;
////////////////////////////// mal kommt die fehlermeldung hier...
// Hier Lese ich die Letzte Lfd nr. aus der History, und inkrementiere // mit 1.... with QueryHistory.SQL do begin Clear; Add('SELECT * FROM history'); end; QueryHistory.Active :=True; QueryHistory.Last; LfdNrHistory := QueryHistory.FieldByName('lfdnr').AsString; if LfdNrHistory = '' then LfdNrHistory := '1' else LfdNrHistory := IntToStr(StrToInt(LfdNrHistory) + 1);
// hier ermittle ich fuer die history mein aktuelles datum aend_datum := FormatDateTime('dd"."mm"."yyyy', Date); aend_datum := QuotedStr(aend_datum); QueryHistory.SQL.Clear; QueryHistory.SQL.Add('INSERT INTO history (lfdnr,vorgang )'); QueryHistory.SQL.Add('VALUES (' + LfdNrHistory + ',' + Vorgang + ')'); QueryHistory.ExecSQL;
// und dann schließlich werden die alten Daten in der History gespeichert with QueryHistory.SQL do begin Clear; Add('UPDATE history '); Add('SET kndcd = ' + Hkndcd); Add(', termin = ' + Htermin); [...] Siehe Vorgangs-Update... Add(', provan = ' + Hprovan); Add('WHERE lfdnr = ' + LfdNrHistory); end; QueryHistory.ExecSQL;
// und wieder gesplittet with QueryHistory.SQL do begin Clear; Add('UPDATE history '); Add('SET bemerkung1 = ' + Hbemerkung1); Add(', bemerkung2 = ' + Hbemerkung2); [...] Add(', aend_dat = ' + aend_datum); Add('WHERE lfdnr = ' + LfdNrHistory); end; QueryHistory.ExecSQL;
//////////////////////////// ............oder fehlermeldung halt hier.....
// damit gleich nach fertigstellung der aktuelle vorgang angezeigt wird, // kommt jetzt folgender filter QueryVorgbuch.SQL.Clear; QueryVorgbuch.SQL.Add('SELECT * FROM vorgbuch WHERE lfdnr = ' + LfdNrToEdit); QueryVorgbuch.Open;
// die history.... QueryHistory.SQL.Clear; QueryHistory.SQL.Add('SELECT * FROM history'); QueryHistory.Open; QueryHistory.Last;
// jetzt noch n paar irrelevante, so glaub ich, programm-funktionen TabFirmendt.TabVisible := True; TabSchadort.TabVisible := True; TabHistory.TabVisible := True;
TabsAktualisieren;
FormVorgbuchEdit.SendToBack; FormVorgbuch.Height := 328;
VorgangEdit := False;
end; |
sämtliche variablen werden vorher (global) als strings deklariert.... sonst gibts nichts weiter zu sagen... glaub ich
vielen dank
kiwicht
|
|
smiegel
      
Beiträge: 992
Erhaltene Danke: 1
WIN 7
D7 Prof., C#, RAD XE Prof.
|
Verfasst: Mi 29.01.03 15:44
Hallo kiwicht,
leider kann ich an Deinem Code nicht erkennen, was da falsch sein soll.
Wenn ich mich noch recht erinnere (weiss leider nicht mehr, wo ich die Info gelesen habe  ), hat DBase in Verbindung mit DML (UPDATE, INSERT, SET, ...) Probleme.
Eine andere Fehlerquelle könnte QuotedStr sein. Da diese Funktion, lt. Delphi-Hilfe nur halbe (') Anführungszeichen hinzufügt.
Versuche es doch einmal mit AnsiQuotedStr und Gänsefüsschen (").
Quelltext 1: 2: 3: 4:
| ... // statt Vorgang :=QuotedStr(FVEvorgang.Text); Vorgang:=AnsiQuotedStr(FVEvorgang.Text, '"'); ... |
_________________ Gruß Smiegel
Ich weiß, daß ich nichts weiß, aber ich weiß mehr als die, die nicht wissen, daß sie nichts wissen. (Sokrates)
|
|
kiwicht 
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Mi 29.01.03 17:47
Danke, das werd ich aufjedenfall natûrelement mal probieren, aber wundern tuts mich schon... mal klappts, dann mal wieder nicht...  obwohl ich nichts geändert hab... nun ja .. ich meld mich wenn ich neuigkeiten hab....
danke erstmal
mfg
|
|
bis11
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: Mi 29.01.03 18:18
Hi kiwicht,
Du hast doch gesagt, das Du nur Strings in Deine beiden Datenbanken reinschreibst oder ? Wenn ja, warum wird dann der String den Du übergibst nicht mit einem einfachen Hochkomma in den SQL-Befehl reingeschrieben ?
|
|
kiwicht 
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Mi 29.01.03 20:41
ähm... keine Ahnung, ich dachte so geht das nicht
so versteh ich jetzt das was du sagst:
Quelltext 1:
| Add('SELECT * FROM databank WHERE feld1 = 'mystring''); |
und so mach ich das ja für gewöhnlich:
Quelltext 1: 2: 3: 4: 5:
| MyString := QuotedStr(MyString); // aus inhalt wird also "inhalt" Add('SELECT * FROM databank WHERE feld1 = + ' mystring); das gleiche wäre: Add('SELECT * FROM databank WHERE feld1 = "inhalt" '); |
ich dacht eigentlich bisher, mein Code wäre Regel-Konform... 
|
|
kiwicht 
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Mi 29.01.03 20:53
also, mit
AnsiQuotedStr
hab ichs probiert... genau das gleiche.
Ich hab jetzt aber mal zum Testen einfach alles rausgenommen, was KEINEN string sondern Datum´se oder Integer in die DB schreibt.... es klappt (erstmal).. ich werd mich also nochmal der Übergabe von Integern und Daten an SQL widmen..
vielen herzlichen Dank für eure Hilfe..
mfg
kiwicht
|
|
|