Update per Makro funktioniert nur im 1. Schleifendurchlauf,

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

hfr
**
Beiträge: 37
Registriert: Mo, 09.07.2007 14:42
Wohnort: München

Re: Update per Makro funktioniert nur im 1. Schleifendurchlauf,

Beitrag von hfr »

Ich war oben als Gast angemeldet: "hfr" wäre richtig gewesen.
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: Update per Makro funktioniert nur im 1. Schleifendurchlauf,

Beitrag von eBayer »

Du hast SQL_WHERE als Integer definiert und versuchst dann diese Variable mit folgender Anweisung zu füllen:
Sql_WHERE = Abfrageergebnis.getString(1)
Du versuchst also eine Integervariable mit einem String zu füllen. Ich vermute, das geht in die Hose.
Hier versuchst Du von der Syntax her den Wert von Sql_WHERE auf einen String zu addieren:
Sql_Update = "UPDATE tests SET Untersucher = 'U_Update_A' WHERE IdTest = " + Sql_WHERE
Das geht ganz sicher in die Hose!
Weitere Frage: was ist 'U_Update_A'? Wenn das eine Variable sein soll, wird das auch nicht so funktionieren.
Gruß eBayer
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
hfr
**
Beiträge: 37
Registriert: Mo, 09.07.2007 14:42
Wohnort: München

Re: Update per Makro funktioniert nur im 1. Schleifendurchlauf,

Beitrag von hfr »

Hallo eBayer,
das ist ja ein lustig-mehrdeutiger Name - 8)

Ich habe die Variablen-Typen-Handhabung nach gearbeitet und dabei vielleicht übertrieben, weil Basic dabei locker ist.

Der erste Schleifen-Durchlauf führt wie vor der Nacharbeitung wieder zu einem erfolgreichen Update der Tabelle
aber der 2. Schleifendurchlauf erzeugt dieselbe Fehlermeldung wie zuvor bei der Zeile

Code: Alles auswählen

WHILE Abfrageergebnis.next 
Fehler 0: Es ist eine Exception aufgetreten
Type: com.sun.star.lang.DisposedException
Message: .
In line 50
24.10.2009 10:45:37


Hier der nach-gearbeitete Code mit besserer Kommentierung z.B. bzgl. Variablen etc.:

Code: Alles auswählen

REM  *****  BASIC  *****

Sub Main

End Sub

Sub SQL_testen_04
	' 2009-10-24 hfr
	' Anfängliche Quelle01: "http://www.ooowiki.de/BaseApi" z.B. im Abschnitt 'SQL-Kommunikationskanal aufbauen' und folgende.
	' Anfängliche Quelle02: "http://www.ooowiki.de/FortlaufendeRechnungsnummer" 'als ein Beispiel-Makro
	
	' Deklaration der Datenbankobjekte (nur zur Klarheit 1.Buchstabe: n INTEGER, o OBJECT, s STRING, ...) 
	DIM oDatabaseContext AS OBJECT
	DIM oDatenquelle AS OBJECT
	DIM oVerbindung AS OBJECT
	DIM oAuthentifizierung AS OBJECT
	DIM oSQL_Anweisung AS OBJECT
	DIM sSuch_Zeichenfolge AS STRING
	DIM sSql AS STRING
	DIM oAbfrageergebnis AS OBJECT
	DIM nSql_WHERE AS INTEGER 'ein Integer-Primärschlüssel wird erwartet
	DIM sSql_Update AS STRING
	
	ON ERROR GOTO Fehlerbehandlung
	
	'Allgemeines:
		' Datenbankkontext erzeugen
		oDatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
		' oDatenquelle wählen
		oDatenquelle = oDatabaseContext.getByName("Hfr Datenbank 2009")' "Name der in OO registrierten Datenbank"
		' oVerbindung zur oDatenquelle aufbauen
		' Empfohlener Code für die BenutzeroAuthentifizierung bei Bedarf.
		' bei Bedarf Dialog für Passwortschutz aufrufen
		IF NOT oDatenquelle.IsPasswordRequired THEN
		  oVerbindung = oDatenquelle.GetConnection("","")' ("Benutzername","Passwort")
		ELSE
		  oAuthentifizierung = createUnoService("com.sun.star.sdb.InteractionHandler")
		  oVerbindung = oDatenquelle.ConnectWithCompletion(oAuthentifizierung)
		END IF
		' SQL-Kommunikationskanal aufbauen
		oSQL_Anweisung = oVerbindung.createStatement()
	
	' Update-Anweisungen vorbereiten (Where-Bedingungen ermitteln ähnlich verschachtelter SQL's)
	sSuch_Zeichenfolge = INPUTBOX("[Hfr] Bitte eine Zeichenfolge, nach der gesucht werden soll, eingeben:")
	sSql = "SELECT IdTest FROM tests WHERE Untersucher LIKE '%"+sSuch_Zeichenfolge+"%'" 
	oAbfrageergebnis = oSQL_Anweisung.executeQuery(sSql)
	
	' Abfrageergebnis auswerten und pro gefundenem Datensatz je ein Update ausführen:
	IF NOT ISNULL(oAbfrageergebnis) THEN
	  WHILE oAbfrageergebnis.next
	    'MsgBox oAbfrageergebnis.getString(1)' Erstes Datenfeld anzeigen (optional zu Testzwecken) 
	    nSql_WHERE = VAL(oAbfrageergebnis.getString(1)) 'Oben wurde nur ein (1) Datenfeld [IdTest als Int-Zahl Prim-Schl] pro Datensatz selektiert
	    												'Die Funktion Val wandelt eine Zeichenfolge in eine Zahl um, 
	    												'erwartet darin jedoch immer einen Punkt als Dezimaltrennzeichen.
	    ' Update-Anweisungen 
	    '    funktionieren beim ersten Schleifendurchlauf 
	    '    ??? versagen aber beim 2. Durchlauf ohne Fehler-Message-Text
		' z.B.: sSql_Update = "UPDATE tests SET Untersucher = 'U_Update_A' WHERE IdTest = 1"
		sSql_Update = "UPDATE tests SET Untersucher = 'U_Update_A' WHERE IdTest = " + CStr(nSql_WHERE)
					' Untersucher ist ein Feldname
					' 'U_Update_A' ist ein beliebiger Feldinhalt
					' IdTest ist der tests-Tabellen-Primärschlüssel vom Typ INT(11) 	
					' nSql_WHERE d.h. mit den oben gefundenen Where-Bedingungen, meistens mehrere.
					'            CStr(Var): konvertiert jeden Datentyp in den Typ String (Zeichenfolge)
		oSQL_Anweisung.executeUpdate (sSql_Update) 'Update ausführen
	  WEND ' nächster Datensatz
	END IF
	
	GOTO Ende
	
	Fehlerbehandlung:
	Msg = "Fehler " & ERR & ": " & ERROR$ + CHR(13) + "In line : " + ERL + CHR(13) + NOW
	MsgBox Msg,16,"Fehler aufgetreten"
	
Ende:
End Sub ' SQL_testen_04
hfr
**
Beiträge: 37
Registriert: Mo, 09.07.2007 14:42
Wohnort: München

Re: Update per Makro funktioniert nur im 1. Schleifendurchlauf,

Beitrag von hfr »

Oops
natürlich sind in obiger Fehlermeldung Zeilen-Nr und Uhrzeit andere geworden - na ja
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: Update per Makro funktioniert nur im 1. Schleifendurchlauf,

Beitrag von geimist »

Hallo,

derzeit habe ich das selbe Problem. Mit "Insert Into" ging die Schleife noch ohne Probleme, aber als ich sie für ein "Update" umgeschrieben habe, wird nur noch der erste Datensatz aus dem Resultset verarbeitet. Springt die Schleife wieder auf "While", so stoppt sie hier mit der oben genannten Fehlermeldung???

Gibt es Hilfe?
Danke schon mal.
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Update per Makro funktioniert nur im 1. Schleifendurchlauf,

Beitrag von DPunch »

Aus der API:

http://api.openoffice.org/docs/common/r ... ltSet.html
A ResultSet is automatically closed (disposed) by the Statement that generated it when that Statement is closed, re-executed, or used to retrieve the next result from a sequence of multiple results.
Für euch heisst das kurz übersetzt: Wird ein Statement neu ausgeführt, wird automatisch das vorher erzeugte ResultSet disposed (entsorgt / freigegeben)

Lösung:

Für das Abfrageergebniss und jegliche darauf basierende Weiterverarbeitung unterschiedliche Statements benutzen.
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: Update per Makro funktioniert nur im 1. Schleifendurchlauf,

Beitrag von geimist »

Hallo DPunch,

vielen Dank für den Hinweis.
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
Antworten