edu-senex/edu/content/flashcards/deck-gotchas.md

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)