Hallöchen Tom,
herzlichen Dank!
Würde Deine "setQuery()" Funktion aber sauber definiert werden " sub setQuery(byVal oResultset as object, byVal sSQL as string)" - so würde Dein Weg nicht mehr funktionieren - byVal übergibt die Variablen als Werte, nicht als Referenz. Aber da wir typischerweise das "byVal" weglassen, werden sie eben als Referenz übergeben und somit auch dynamisch verändert.
Die Funktion von ByVal ist mir sehr wohl bewusst. Ich benutzte sie bisher aber grundsätzlich nicht, da ich nicht wenige meiner wiederverwendbaren Funktionen eben genau mit der vorher beschriebenen Syntax erstellt habe.
Ich muss dir zustimmen. Ich denke, allein unter dem Aspekt der Gewissheit (oder auch Logik), daß der zu berechnende Wert bei Aufruf der Funktion "oResultSet = setQuery("SELECT...")" zu jeder Zeit schon in ihr enthalten ist, werde ich das jetzt alles mal abändern.
Och, die 10 Franken nehme ich gerne *hihi*.
Wenn du willst, gib' mir in irgendeiner Art und Weise eine Adresse oder Bankverbindung - ich stehe zu meinen Aussagen.
Das aber kann ich nicht nachvollziehen. Habe ich eine Abfrage wie "SELECT SpalteA, SpalteB FROM MeineTab" spielt es überhauüpt keine Rolle , weiviel Spalten die Tabelle tatsächlich hat oder wo die Spalten sich befinden - es wird immer nur die beiden Spalten mit dem Namen "SpalteA" und "SpalteB" in genau der angegebenen Reihenfolge im Resultset zu finden sein. Da kannst Du der Tabelle beliebige Spalten an beliebiger Stelle hinzufügen. Da ändert sich nix. Und damit kann ich die Werte leicht auslesen mit .getString(1) für die 1. Spalte und so weiter.
Ich habe das wohl nicht eindeutig genug erklärt. Im Beitrag zuvor schrieb ich etwas von
ResultSet-Abfrage, also der Weiterbearbeitung des generierten ResultSets. Du meintest jetzt aber die SQL-Anweisung und im SELECT-Befehl ist natürlich alles absolut eindeutig - da bin ich voll und ganz bei dir!
Hier mal ein Beispiel für eine meiner ResultSet-Abfragen. Viele meiner Dialoge haben zwanzig und mehr I/O-Elemente, welche alle irgendwie mit einer Datenbank verknüpft sind.
Die Spalten-Indizes
in den ResultSets sind ja stets die gleichen, egal in welche Richtung die Werte später verschoben werden.
Dies ist ein Auszug einer ResultSet-Abfrage aus einem fertigen Programm, mit der Methode .findColumn (das Objekt .columns davor ist dem verwendeten DB-Treiber geschuldet); Funktion: Erstellung von Zeilen-Arrays für ein TableGrid:
Code: Alles auswählen
With oQueryOverview
If Not isNull(oQueryOverview) Then
While .Next()
Redim Preserve arrRows(n)
arrRows(n) = Array(_
Format(.getInt(.columns.findColumn("ID")), "000000"),_
.getString (.columns.findColumn("realEstate")),_
.getString (.columns.findColumn("building")) & IIF(.getString(.columns.findColumn("floorLevel")) <> "", "→", "") &_
.getString(.columns.findColumn("floorLevel")) & IIF(.getString(.columns.findColumn("place")) <> "", "→", "") &_
.getString(.columns.findColumn("place")),_
.getString (.columns.findColumn("concerning")),_
.getInt (.columns.findColumn("priorityID")),_
.getString (.columns.findColumn("processingState")) & IIF(.getString(.columns.findColumn("dateSendNAV")) <> "", " [NAV]", ""),_
.getInt (.columns.findColumn("processed")),_
.getString (.columns.findColumn("dateChange")))
n = n + 1
Wend
End If
.Close()
End With
Dieses Programm läuft wunderbar, aber ich benutze hier eben auch noch eine andere Datenbankverbindung.
... und nun mal abgeändert
ohne .findColumn:
Code: Alles auswählen
With oQueryOverview
If Not isNull(oQueryOverview) Then
While .Next()
Redim Preserve arrRows(n)
arrRows(n) = Array(_
Format(.getInt(1), "000000"),_
.getString (2),_
.getString (3) & IIF(.getString(4) <> "", "→", "") &_
.getString(4) & IIF(.getString(5) <> "", "→", "") &_
.getString(5),_
.getString (6),_
.getInt (7),_
.getString (8) & IIF(.getString(9) <> "", " [NAV]", ""),_
.getInt (10),_
.getString (11))
n = n + 1
Wend
End If
.Close()
End With
Wenn nun im letzten Fall, in der Datenbank, rechts neben der ID(1), eine einzige Spalte hinzugefügt wird und sich somit alle anderen Spalten-Indizes um 1 erhöhen, müssen diese dann folglich auch im Code wieder angepasst werden - jeder einzelne Index, außer die ID(1). Und dies in allen korrelierenden ResultSet-Anweisungen. Bei drei solcher Anweisungen (z.B. je einmal QUERY, INSERT, UPDATE) pro Tabelle, sind das dann gleich 60 Werte (bei 20 Feldern) - nur wegen der Änderung einer Spalte in der Datenbank.
Denke ich vielleicht zu umständlich?
Code: Alles auswählen
nSP1 = oQueryConfig.findColumn("SpalteA")
nSP2 = oQueryConfig.findColumn("SpalteB")
With oQueryConfig
While .Next()
Select Case .getString(nSP1)
Case "cameraDirectory" : sCAM_DIR = .getString(nSP2)
Dies macht zumindest die ResultSet-Abfrage übersichtlicher.
Aber hast du noch in Erinnerung, daß die Methode .findColumn per DriverManager nicht unterstützt wird?
WAS mach' ich denn nun genau, um dieses Problem zu lösen? Ich wollte davon weg, die SQLite-Dateien (also externe Datenbanken) erst in OOo-Base anzumelden und erst später über das Dokument darauf zuzugreifen.
Wie macht denn sowas ein Profi, wie du?
Liebe Grüße,
Marcel