❤️ Helfen Sie noch heute, unser LibreOffice Forum zu erhalten! ❤️
Unterstützen Sie das LibreOffice-Forum und helfen Sie uns, unser Ziel für 2025 zu erreichen!

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱


❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[gelöst] geschachteltes oResult

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
RobertG
* LO-Experte *
Beiträge: 2888
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: geschachteltes oResult

Beitrag von RobertG » Di 20. Dez 2016, 17:37

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
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: geschachteltes oResult

Beitrag von gogo » Mi 21. Dez 2016, 00:55

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)
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: [gelöst] geschachteltes oResult

Beitrag von gogo » Mi 21. Dez 2016, 07:58

Wie sieht denn die oSQL() aus?
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten