4,3 KiB
Flashcard Deck: Gotchas & Haeufige Fehler
Thema: Typische Fallen und wie man sie vermeidet Karten: 15
Karte 1 | Kritisch
Q: Warum liefert meine Berechnung manchmal unerwartet 0 oder leer?
A: NULL-Propagation! Wenn IRGEND ein Wert in einem Ausdruck NULL ist, wird das GANZE Ergebnis NULL. Loesung: Immer vorher auf NULL pruefen mit isnull(lVar) oder nullValuesWhenORtestedBecomeZero setzen.
Karte 2 | Kritisch
Q: Ich rufe eine Methode auf, aber sie wird nicht gefunden. Warum?
A: Die Methode ist wahrscheinlich auf der SUPERKLASSE definiert. Omnis-Klassen erben Methoden. Pruefe: oSuperData, T_Super, wMainWindow, wBaseWindow. Auch: Tippfehler im $-Methodennamen!
Karte 3 | Kritisch
Q: Mein lList.spalte gibt immer leer zurueck. Warum?
A: Die Liste hat keine aktuelle Zeile gesetzt ($line = 0). Setze zuerst $line: Do lList.$line.$assign(1) oder nutze For each line in list.
Karte 4 | Kritisch
Q: Do $cinst.$objs.feld.$contents = "Test" funktioniert nicht. Warum?
A: Man kann Notation-Properties NICHT mit = setzen! Immer $assign() verwenden: Do $cinst.$objs.feld.$contents.$assign("Test"). Das ist DER haeufigste Anfaengerfehler!
Karte 5 | Wichtig
Q: Mein Remote Form reagiert traege. Warum?
A: Jeder $event() macht einen Server-Roundtrip! Loesung: Validierung und UI-Logik in $eventclient() (Browser-seitig) ausfuehren. Nur Datenbankzugriff im Server-Event.
Karte 6 | Wichtig
Q: Mein SQL mit [lVar] erzeugt seltsame Fehler bei Sonderzeichen. Warum?
A: [lVar] macht direkte Text-Substitution - Apostroph im Namen -> SQL-Fehler oder SQL-Injection! Immer @[lVar] (Bind-Variable) oder :1-Parameter verwenden!
Karte 7 | Wichtig
Q: Meine Aenderungen an einer Variable werden in einem anderen Window nicht sichtbar. Warum?
A: Variable-Scoping! lVar (lokal) lebt nur in der Methode. iVar (Instanz) nur im Objekt. Fuer fenster-uebergreifend: tVar (Task) verwenden oder Daten explizit uebergeben.
Karte 8 | Wichtig
Q: Ich habe eine Klasse geaendert, aber die Aenderung wirkt sich nicht aus. Warum? A: Moeglicherweise laeuft noch eine alte Instanz! Schliesse alle offenen Fenster/Instanzen und oeffne neu. Oder: Die Methode ist auf der Superklasse und du aenderst die falsche Klasse.
Karte 9 | Mittel
Q: Warum zaehlt $linecount von 1 und nicht von 0?
A: Omnis-Listen sind 1-basiert (wie VB, anders als JS/Python). $line = 1 ist die ERSTE Zeile. $line = 0 bedeutet "keine Zeile gewaehlt".
Karte 10 | Mittel
Q: Mein $search findet nichts, obwohl der Wert existiert. Warum?
A: String-Vergleich ist Case-Sensitive in Omnis! "Harry" <> "harry". Loesung: Do lList.$search(upp(lList.name) = upp(lSearchTerm)) oder low() verwenden.
Karte 11 | Mittel
Q: Was passiert wenn ich Calculate lList as lOtherList mache?
A: Du bekommst eine KOPIE, keine Referenz! Aenderungen an lList aendern lOtherList NICHT. Das ist anders als bei Arrays in JavaScript!
Karte 12 | Mittel
Q: Mein $sendall wirft einen Fehler bei leeren Listen. Warum?
A: $sendall auf eine leere Liste ist eigentlich ok, aber wenn der Ausdruck auf Spalten zugreift die nicht existieren, kommt ein Fehler. Immer vorher pruefen: If lList.$linecount > 0.
Karte 13 | Fortgeschritten
Q: Mein Quit method gibt nichts zurueck, obwohl ich einen Wert angebe. Warum?
A: Der Aufrufer muss Returns lVar verwenden! Ohne Returns geht der Rueckgabewert verloren: Do iObj.$method() Returns lResult (richtig) vs Do iObj.$method() (Wert geht verloren).
Karte 14 | Fortgeschritten
Q: In Solution2: Warum sehe ich einen Datensatz mit valid = false?
A: Soft-Delete! valid = false bedeutet "geloescht" aber noch in der DB. Immer WHERE valid = true in Abfragen verwenden. Solution2 nutzt valid konsequent statt physischem DELETE.
Karte 15 | Fortgeschritten
Q: Mein Report druckt leere Seiten. Warum?
A: Die Report-Klasse hat keine Daten! Reports brauchen eine definierte Liste als Datenquelle ($dataname). Pruefe: Wurde die Liste vor dem Report-Aufruf korrekt befuellt?
Spaced Repetition Tracking
| Karte | Zuletzt | Naechste | Schwierigkeit |
|---|---|---|---|
| (wird beim Ueben gefuellt) |