Das Problem liegt wahrscheinlich darin, dass Du in dem 2. SQL-String einen _Verweis_ auf das 1. Recordset hast (... bwi.vid_wohn = " & aAktIDs(Wohnung) ... und weiter unten nochmal dasselbe). Vermutlich reicht es, wenn Du statt
Code: Alles auswählen
'aAktIDs(Wohnung) = oResult1.getlong(1)
ID_Wohnung = oResult1.getlong(1)
'aAktIDs(Bauwerk) = oResult1.getlong(2)
ID_Bauwerk = oResult1.getlong(2)
schreibst. (ich vermute mal, dass aAktIDs() ein Array ist und dieses als Objekt in diesem Fall den Verweis auf die .getlong()-Funktion speichert und nicht den Wert der Variable)
Es kann auch sein, dass Du in beiden SQLs die hc_bwinf ansprichst, und Deine oSQL damit zwei mal ein "editierbares" Recordset erzeugt. Das löst dann im Treiber bei der 2. Abfrage den Fehler aus (wenn ebenfalls Schreibrechte auf die hc_bwinf angefordert werden).
Lösung: "nicht editierbares" Recordset oder evtl wie Robert vorgeschlagen hat eine 2. Connection (die würde aber ein Schreibrechte-Problem nicht lösen, einer Datenbank ist es egal ob 1 oder x Benutzer den DS ändern wollen - Rechte hat zu einem Zeitpunkt immer nur einer allein - sonst herrscht Chaos).
Ich bevorzuge das von Dir ins Spiel gebrachte Array, da das viel stabiler läuft, und man die Array-Generierung (in eine Funktion verpackt) vielseitig verwenden kann.
Folgende Funktion liefert z.B. immer ein Array mit Daten zurück. Ohne Angabe der optionalen Parameter eben den Wert aus der 1.Zelle 1.Spalte, ansonsten die Spalten im Array "aColumns" und maximal nCount Zeilen. (Beispiel in den Codeblöcken 3 und 4)
Code: Alles auswählen
function getDBValues(oRecOrSQL, optional nCount, optional aColumns)
dim oRec,i,ii,iii ' a() and aa() are defined at the end of this section
on error goto EH
' adjust variables ---------------
' get the Recordset - if it's not submitted
if isobject(oRecOrSQL) then oRec = oRecOrSQL else oRec = oSQL.executeQuery(oRecOrSQL)
' adjusts the size of the returned array (DEFAULT IS ONLY THE FIRST LINE)
if ismissing(nCount) then nCount = 1 ' return just the first line of the query
oRec.last
select case oRec.row
case 0
getDBValues = array("###LEER###") ' or choose another thing to make clear, that the SQL had an empty resultset!
exit function
case < nCount
nCount = oRec.row
case else
end select
if nCount = -1 then ' -1 takes all the rows ... -1 acts as a trigger only
' this "if" can be omitted! eg. by using something like "redim preserve a(ubound(a)+1)" in the "get values"-section
nCount = oRec.row
end if
' which columns should be returned? (DEFAULT IS COLUMN 1)
' you should eventually test whether these columns exist!!!
if ismissing(aColumns) then aColumns=array(1)
dim a(nCount-1), aa(ubound(aColumns))
' get values ---------------
oRec.beforefirst
do while oRec.next AND oRec.row <= nCount
iii = 0
for each ii in aColumns
aa(iii)=oRec.getstring(ii)
iii = iii + 1
next ii
a(oRec.row - 1) = aa()
redim aa(ubound(aColumns))
loop
getDBValues = a()
exit function
EH:
' this errorhandler could be more sophisticated --- of course ;)
getDBValues = array("###FEHLER###")
end function
Code: Alles auswählen
sub Test
a = getDBValues("Select 'HI' from ""Tabelle1""")
msgbox a(0)(0)
end sub
Dein Array würdest Du mit folgendem Code erhalten und durchlaufen:
Code: Alles auswählen
a() = getDBValues(cSqlStr, -1, array(1,2))
for each r in a()
msgbox "Wohnungs-ID: " & r(0) & " Bauwerks-ID: " & r(1)
next r
'alternativ kann man natürlich auch direkt zugreifen: a(0)(0) bzw. a(0)(1)