Ich habe versucht, eine bequeme Datenbankanbindung für SQLITE-DBs zu erstellen, bei der die Eingaben zuvor auf Korrektheit im Sinne der Typdefinitionen überprüft werden. Das ist für SQLITE-DBs aus mehreren Gründen besonders schwierig:
a) SQLITE kennt nur Typklassen
b) An die eigentliche CREATE-Definition kommt man nur mit einem Parser für die CREATE-Anweisung.
c) Manche Datentypen wie ENUM(alt,neu,gebraucht) lassen sich überhaupt nicht in CREATE eingeben.
Zwar kann man eine korrekte Typzuordnung mit sog. CONSTRAINTS in der DB-Definition erzwingen, doch sind bei einer Fehleingabe die Rückmeldungen über DatabaseError() oft recht schwer zu analysieren. ('Error near by ; ' ist wenig aussagekräftig)
Als Ausweg bleibt, zusätzlich zur Datenbankdefinition ein ListiconGadget mit speziellen Typdefinitionen zu definieren. In jede Zelle des Gadgets wird dann ein passendes Gadget eingebaut.
Beispiele für solche Gridtypen:
EDIT1: Hier öffnet sich ein Editorfenster.
PIC : Es erscheint ein Bildbetrachtungsfenster
URL : Es öffnet sich ein Webgadget zur Anzeige/Auswahl der Adresse.
ENUM: Eine Combobox mit Auswahlmöglichkeiten erscheint.
Am Beispiel der (sinnfreien) Tabelle 'Lager' der DB "DemoDB4.sqlite3" wird deutlich, wie dazu die recht wenigen, übersichtlichen Benutzerfestlegungen aussehen müssen:
Code: Alles auswählen
Define GridFont.i,GridWin.i,DBNum.i,TestGrid.Grid,Table.DBTable,actDB.DB
GridFont=LoadFont(#PB_Any,"Arial",8)
;Datenbank öffnen und Struktur in actDB speichern
openDB("DemoDB4.sqlite3",#PB_Database_SQLite,@actDB)
; Window für Daten-(manipulation) erzeugen. Dabei ist "Lager" die Primärdatei
GridWin=createDataWin(50,100,1100,500,"Testwindow",@TestGrid,"Lager",GridFont)
;Spalteneigenschaften des DataGrids definieren
; Aufruf: addGridCol(Grid,Spaltenbez,SpaltenTyp,Parameter,änderbar?,Spaltenbreite im Grid)
addGridCol(@TestGrid,@actDB,"ID","INTEGER","",0,20) ;0: Werte dieser Spalte nicht änderbar (z.B. weil ID)
addGridCol(@TestGrid,@actDB,"Abbildung","PIC","",1,100)
addGridCol(@TestGrid,@actDB,"ausgemustert","BOOLEAN","",1,80)
addGridCol(@TestGrid,@actDB,"Artikel","STRING","",1,80) ;1: Spalteninhalt kann geändert werden
addGridCol(@TestGrid,@actDB,"Bemerkung","EDIT1","",1,100) ;EDIT1:extra Editorfenster
addGridCol(@TestGrid,@actDB,"ArtikelNr","INTEGER","",1,60)
addGridCol(@TestGrid,@actDB,"Kaufdatum","DATE","",1,80)
addGridCol(@TestGrid,@actDB,"Zustand","ENUM","neu,gebraucht,wertlos",1,80) ;ComboBox mit 3 Auswahlmöglichkeiten
addGridCol(@TestGrid,@actDB,"Bestand","INTEGER","",1,60)
addGridCol(@TestGrid,@actDB,"Einzelpreis","FLOAT","",1,80)
addGridCol(@TestGrid,@actDB,"Abverkauf","BOOLEAN","",1,70) ;Für Boolean sind die Werte "JA,NEIN" vordefiniert
addGridCol(@TestGrid,@actDB,"WWW_Infos","URL","",1,80)
handleEvents(@actDB,@TestGrid)
CloseDatabase(actDB\DBNum)
https://share.mailbox.org/ajax/share/07 ... e5/1/8/NTE
Ich wüsste gern, ob es sich eurer Meinung nach grundsätzlich lohnt, hier mehr Arbeit (als die bisherigen 1500 Zeilen) zu investieren.