Das Notes Forum
Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: Wupperhannes am 12.05.09 - 02:50:30
-
Ich muss für eine Datenbankabfrage aus einer SQL Datenbank drei Tabellen gleichzeitig auslesen. In Tabelle 1 stehen Projektdaten, in Tabelle 2 Kundendaten, in Tabelle 3 Kontaktdaten. In den Projektdaten stehen die Indizes der Datensätze aus Tabelle 2 und 3. Die Abfrage läuft so dass ich einen Datensatz aus Tabelle 1 lese, die Daten speichere und dann mit Hilfe der Indizes aus Tabelle 2 und 3 die zugehörigen Kunden- bzw. Kontaktdaten lese und in dasselbe Notes Dokument speichere.
Soweit die Theorie. In der Praxis stellt sich heraus, dass ich immer nur einen Resultset gleichzeitig offen haben kann. Wenn ich z.B. eine Zeile aus dem Projekt Resultset ausgelesen habe und dann über die Indizes in den beiden anderen Tabellen eine Abfrage starte, bekomme ich immer leere resultsets. Schließe ich den Projekt resultset, dann kann ich die Kundendaten lesen usw.
Ich poste das Programm einmal wie es prinzipiell läuft. Der Originaltext wäre zu viel und zu verschachtelt da das Ganze auch noch in Objekte gekapselt ist.
Public Sub new
Set conPrj = New ODBCConnection
Set conCln = New ODBCConnection
Set conCnt = New ODBCConnection
Set qryPrj = New ODBCQuery
Set qryCln = New ODBCQuery
Set qryCnt = New ODBCQuery
Set resultPrj = New ODBCresultSet
Set resultCln = New ODBCresultSet
Set resultCnt = New ODBCresultSet
Set qryPrj.Connection = conPrj
Set qryCln.Connection = conCln
Set qryCnt.Connection = conCnt
Set resultPrj.Query = qryPrj
Set resultCln.Query = qryCln
Set resultCnt.Query = qryCnt
End Sub
Public Sub Delete
resultPrj.Close(DB_CLOSE)
resultCln.Close(DB_CLOSE)
resultCnt.Close(DB_CLOSE)
conPrj.Disconnect
conCln.Disconnect
conCnt.Disconnect
End Sub
Public Function getAllProjects( ) As Boolean
sSQLQuery = "SELECT * FROM tblProject"
qryPrj.SQL = sSQLQuery
resultPrj.cachelimit = DB_NONE
Call resultPrj.Execute()
getAllProjects = resultPrj.IsresultSetAvailable
End Function
Public Function getClientByID(sID As Integer) As Boolean
sSQLQuery = "SELECT * FROM tblClient WHERE SystemID=" + Str(sID)
qryCln.SQL = sSQLQuery
resultCln.cachelimit = DB_NONE
Call resultCln.Execute()
getClientByID = resultCln.IsresultSetAvailable
End Function
--------------------------------------------------------------------------------------------------
If BTDatabase.getAllProjects = True Then
Call BTDatabase.gotoFirstProject
Call oProject.getLinks( BTDatabase )
If BTDatabase.getClientByID( oProject.ClientID )= True Then
Call BTDatabase.gotoFirstClient()
Call oProject.Job.getData( BTDatabase )
Call oProject.Client.getData( BTDatabase )
Call oProject.Contact.getData( BTDatabase )
End If
End If
------------------------------------------------------------------------------------------------------
Wie gesagt, das sind nur Auszüge aus dem Programm. Ist alles etwas umfangreicher. Separate Connection, Query und Resultset für jede Tabelle war ein Akt der Verzweiflung weil ich dachte, dass es vielleicht daran liegen könnte dass ich nur eine Connection und eine Query definiert hatte. War aber nicht die Ursache - hab es trotzdem drin gelassen.
Hat jemand eine Idee??
-
Beschäftige dich mal mit dem SQL Syntax, hier gibt es Sachen wie "join" um mehrere Tabellen zu verknüpfen
-
Oder direkt eine Abfrage / View in der SQL-Datenbank erstellen. Diese kann wie eine Tabelle ausgelesen werden.
Markus
-
Hallo Hannes!
Wie dir JBubbleBoy schon gesagt hat, solltest du eventuell einen SQL Kurs besuchen. Prinzipiell soll man im SQL Umfeld so viel wie möglich die Datenbank arbeiten lassen und deshalb die gesamte Logik in SQL verpacken und dann nur noch das fertige Resultset zeilenweise auslesen.
Aber aufgepasst. SQL ist keine Technologie in die man sich schnell mal einen Nachmittag einarbeitet sondern das ist eher mit der Lernkurve von Loutsscript vergleichbar. Vor allem kann man performancemäßig furchtbar auf die Nase fliegen, wenn man etwas falsch macht.
Grüße
Ralf
-
Danke allen die geantwortet haben und mich auf den richtigen Pfad gebracht. Das mit dem Kurs wird nicht nötig sein. Habe früher viel in SQL programmiert, in diesem Falle aber überhaupt nicht in diese Richtung gedacht. Peinlich peinlich. Ich war total versteift auf die separate Abfrage der Tabellen.
Rein aus technischem Interesse würde ich aber schon gerne wissen ob es in LS möglich ist mehrere Resultsets offen zu haben. Die Online Hilfe ist da leider nicht sehr eindeutig.
Na dann werde ich mal an meinem SQL statement basteln :) Thnx again!
-
Bin mir nicht 100% sicher, aber die Anzahl möglicher Verbindungen wird in der SQL-DB verwaltet, oder?
-
Rein aus technischem Interesse würde ich aber schon gerne wissen ob es in LS möglich ist mehrere Resultsets offen zu haben. Die Online Hilfe ist da leider nicht sehr eindeutig.
Ohne es mal gemacht zu haben, hätte ich es mit mehreren Objekten vom Typ ODBCResultSet probiert, die vor der Ausführung des Statement evtl. entsprechend den Beispielen in der Hilfe "verknüpft" werden.
Sonst bleibt nur der Fußweg ...
Bin aber auch gespannt, ob es eine "richtige" Antwort auf diese Frage gibt. Stehe in absehbarer Zeit selbst vor der Aufgabe, eine Unternehmensdatenbank auf Basis eines SQL-Servers zu bauen mit Notes als FrontEnd ....
Markus
-
@jBubbleBoy
ich die Windows ODBC Verbindung auf einen entsprechenden Parameter hin untersucht. Nichts dabei womit man das beeinflussen könnte. Auf die Datenbank selbst habe ich keinen Einfluss. Die ist von einem anderen Unternehmen.
@BigWim
Viel Spaß bei dem Projekt. Und die Idee mit dem SQL statement hat es gebracht. Also lieber die Datenbank arbeiten lassen als Lotus :))