Irgendwie scheinen da doch ein paar Bugs drin zu sein.
Definitiv ja, beim Öffnen und Schließen der Tabellen über den Objektinspektor werden zuweilen die Felddefinitionen zerschossen.
Man sollte die Tabellen in der
IDE vor dem Kompilieren auf jeden Fall schließen und erst zur Laufzeit (FormCreate....) öffnen und beim Programmende (FromClose...) schließen.
Nach ewigem herumprobieren habe ich herausgefunden wo bei mir das Problem lag.
Ich habe mehrere KbmMemTables auf einer Form. Die habe ich alle geöffnet, also activ auf true und dann die Daten per LoadFromFile eingelesen. Ergebnis: Die Lookupfelder bleiben leer.
Lade ich die Daten für jede Tabelle sofort nach dem Öffnen, dann funktionierts. Erkläre mir mal einer warum...
Das ist doppeltgemoppelt. Mit Active := True wird die Tabelle geöffnet und die Daten geladen. Die bereits geladenen Daten werden mit LoadFromFile nochmals geladen.
Während bei Active := True aber (allem Anschein nach) die Abhängigkeiten zu den Lookup-Feldern berücksichtigt werden, scheint das bei LoadFromFile nicht der Fall zu sein.
Was mir noch aufgefallen ist, setze ich sfSaveDef und sfLoadDef auf true, dann bekomme ich bei einigen Tabellen beim Laden die Meldung, das die Felddefinitionen falsch sind. Kann aber nach mehrmaliger Kontrolle keinen Fehler finden.
Da scheint es auch irgendwo einen Bug zu geben.
Habe mir angewöhnt, die KBMTabels immer als
CSV zu speichern.
Nur erstmalig zum Erstellen der Tabellen mache ich im Objektinspektor die Feld- und Indexdefinitionen und lasse beim ersten Programmstart die Tabellen erstellen und als Dateien speichern.
Danach wird in der
IDE nichts mehr an den Tabellen geändert, die Felddefinitionen werden auch nichtmehr extra gespeichert...
Sind Änderungen an der Tabellendefinition nötig oder wird ein zusätzlicher Index gebraucht, so ändere ich die
CSV-Dateien. Die Struktur des Tabellenkopfes ist so, dass man die Definitionen problemlos lesen und verstehen kann, eine händische Änderung ist auch problemlos möglich.
Mit den IndexDefs scheint es auch ein paar Probleme zu geben, die man aber umgehen kann, wenn man direkt IndexFieldNames verwendet.
Auch da hakt es ab und an, wobei ich noch nicht herausgefunden habe, in welcher Situation man was wie nutzen muss. Habe da aber auch noch nicht viel Zeit investiert.