![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: Interbase
Not in edit mode
Hallo zusammen.
Ich steh grad auf dem Schlauch mit der Fehlermeldung, die kommt, unmittelbar nachdem ich das Dataset in den Edit-Mode gesetzt habe. Dataset.state ist dsEdit. Vielleicht seh den Wald vor lauter Bäumen nicht. Wär schön wenn einer von euch die passende Axt auspacken könnte. Danke im voraus.
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
var Tnr, Inr, Gnr : Integer; begin if not Form1.tabuecher.InTransaction then Form1.tabuecher.StartTransaction; Form1.dsTitel.Close; Form1.dsTitel.SelectSQL.Text := 'select TitelNr, Genre from Titel where Sammelband = ' +QuotedStr('J'); Form1.dsTitel.Open; Tnr := Form1.dsTitel.FieldByName('TitelNr').Value; Gnr := Form1.dsTitel.FieldByName('Genre').Value; Form1.dsInhalt.Close; Form1.dsInhalt.SelectSQL.Text := 'select InhaltNr, Genre from Inhalt order by InhaltNr'; Form1.dsInhalt.Open; repeat Form1.qyRTitelInhalt.Close; Form1.qyRTitelInhalt.SQL.Text := 'select TitelNr, InhaltNr from RTitelInhalt where TitelNr = :nr'; Form1.qyRTitelInhalt.ParamByName('nr').Value := Tnr; Form1.qyRTitelInhalt.Open; repeat Inr := Form1.qyRTitelInhalt.FieldByName('InhaltNr').Value; Form1.dsInhalt.Edit; >>>hier kommt der Fehler>>> if Form1.dsInhalt.Locate('InhaltNr', Inr, []) then Form1.dsInhalt.FieldByName('Genre').Value := Gnr else Begin ShowMessage('In die Tabelle Inhalt konnte in den Datensatz mit der Nummer ' + IntToStr(Inr) + 'kein Wert für Genre eingetragen werden' +#13+ 'Programm wird abgebrochen.'); Form1.tabuecher.Rollback; Break; End; Form1.qyRTitelInhalt.Next; until Form1.qyRTitelInhalt.Eof; Form1.dsTitel.Next; until Form1.dsTitel.Eof; Form1.tabuecher.Commit; Form1.Close; end; end. |
AW: Not in edit mode
Das Locate hebt den Modus auf.
Erst navigieren, dann Editmode aktivieren. (Für einen Datensatz). |
AW: Not in edit mode
Danke für die schnelle Hilfe. Klappt wunderbar!
Grüße karolus |
AW: Not in edit mode
Und ich rate dazu ein paar Dinge zu ändern.
QuotedStr ist keine Funktion, um einen SQL-String zu maskieren, denn das ist ausschließlich für Pascal-Strings und kennt z.B. keinen
Delphi-Quellcode:
.
\
Am Besten wird mit Parametern in der SQL-Komponente gearbeitet, oder man sucht in den Units dieser Komponente nach der "richtigen" Escape-Funktion. > Repeat-Until Warum kein While-Do? Kannst du sicherstellen, dass immer mindestens ein Datensatz überall drin ist, weil du nicht zu Beginn prüfst? Die sinnlose Variable aus deinem Code zu entfernen. > Form1 Sowie den falschen ungünstigen Zeilenumbruch loszuwerden. > #13 ![]() |
AW: Not in edit mode
Zitat:
mfg |
AW: Not in edit mode
OK, dann nennen wir es besser mal "grob fahrlässig", wenn dir dieses Bezeichnung besser gefällt.
Innerhalb eines Objektes/Klasse greift man niemals über externe blöse globale Variablen auf sich selbst zu. Einfach das "Form1" weglassen und sollte man doch mal einen Zeiger benötigen, dann verwendet man den impliziten/unsichtbaren Parameter "Self", welchen jede Methode einer Klasse als Ersten besitzt. (abgesehn von Static-Class-Methoden) Grund: Erstell mal deine Form das Objekt doppelt, dann greift die eine Instanz nicht auf sich zu, sondern auf die Andere. Es gab schon welche die im so leere Edits ausgelesen hatten, obwohl sie in der Form etwas eingaben. FormCreate war ausversehn on der DPR doppelt drin. Die erste Instanz war die, welche angezeigt wurde, aber die Zweite stand in der Variable, weil sie sich zuletzt dort rein schrieb. |
AW: Not in edit mode
Wenn das nicht ein einfahces "wegwerf" Testprogramm ist, wonach es jetzt nicht aussieht, sollte
eine Form-Variable eher nicht Form1 sondern irgendwie sinnvoller heißen. |
AW: Not in edit mode
Zitat:
Habe mal eben die Form1 rausgenommen, mit dem Erfolg, daß ich nun jede Menge 'Undeklarierte Bezeichner' habe. Zitat:
mfg |
AW: Not in edit mode
Zitat:
|
AW: Not in edit mode
Ja, den Punkt auch.
|
AW: Not in edit mode
Wegwerf: Kurzes Programm, welches bald wieder gelöscht wird und man nicht "unnötig" Arbeit reinstecken will. (wobei, siehe nachfolgend das "immer")
Gut, gibt es nur eine Form, dann ist der Name schon "eindeutig", aber auch nicht, sobald mehrere Programme aktiv sind. (das fällt dann auf, wenn man GUI-Testframewörks oder eine Fernsteuerung drauf lossässt) Am Einfachsten immer "allem" einen eindeutigen Namen geben, dann kann man auch nicht mal was vergessen, wenn es schon fast automatisiert sofort gemacht wird, sobald man was erstellt. (Die Form heißt so ähnlich wie die Unit und wenn es die einzige Unit ist, dann kann sie auch so ähnlich die das Programm heißen ... jeweils mit entsprechendem Prefix/Postfix) Wo kommen denn nun diese Fehler? (an welcher Stelle im Code) Wo hast'e denn gelernt/gefunden, wie man diese Variable benutzt? Besser wäre es ja sie Ursache auch gleich zu beseitigen, damit es nicht noch jemand so lernt. (du glaubst garnicht wieviele Veraltetes oder gar Falsches sich hartnäckig verbreitet) Analogie zur Wirklichkeit: Du bist daheim (in deiner Klasse), aber fragst erstmal den Staat wo du wohnst (die Variable), um den Schrank im Schlafzimmer zu finden (das auf/in deiner Form). Bist du aber umgezogen oder wo anders und die Fragestelle hat noch die andere/falsche Adresse, dann landest du auch im falschen Schrank. :zwinker: Hier wird es immer ohne gehen und vor allem an dieser Stelle ist diese Variable auch ein Fehler.
Delphi-Quellcode:
In einem WITH innerhalb dieser Methode, da würde SELF helfen,
procedure TForm1.Irgendwas(...)
begin // hier bist schon in Form1 drin, also ist die Variable [S]nicht nötig[/S] Fehl am Platz. end; auch wenn man eher sehen sollte ob/wie man das WITH los wird. In einer globalen/externen Prozedur, da kann man sich überlegen die ins PRIVATE seiner Klasse zu verschieben, oder man übergibt die Instanz als Parameter/Property/... Und z.B. aus einer anderen Form, OK, da wäre es eine Möglichkeit, aber es gibt auch andere Lösungen. Grundsätzlich ist es ganz einfach
|
AW: Not in edit mode
Zitat:
Sprich: ist es in der selben Unit deklariert wie das von dir gezeigte OnShow Event? Falls ja dürfte Entfernen von Form1. in der OnSHow nicht zu unkeklarierten Dingen Fehlern führen. Wir versuchen dir einfach guten und weniger fehleranfälligen Stil beizubringen. Natürlich musst du uns da etwas steuern, da wir nicht wissen können, was du schon alles weisst und kannst. Grüße TurboMagic |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:30 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