# 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) | | | |