Seite 1 von 1

Re: geschachteltes oResult

Verfasst: Di 20. Dez 2016, 17:37
von RobertG
Hallo Switi,

wie hast Du denn oSQL definiert? Ich glaube, dass ich einmal etwas Ähnliches konstruiert habe - mit einer 2. Verbindung zus Datenbank:

Code: Alles auswählen

oSQL_Anweisung = oVerbindung.createStatement()
oSQL_Anweisung1 = oVerbindung.createStatement()
... habe das jetzt aber gerade nicht parat.

Gruß

Robert

Re: geschachteltes oResult

Verfasst: Mi 21. Dez 2016, 00:55
von gogo
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)

Re: [gelöst] geschachteltes oResult

Verfasst: Mi 21. Dez 2016, 07:58
von gogo
Wie sieht denn die oSQL() aus?