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??