Update per Makro funktioniert nur im 1. Schleifendurchlauf,
Moderator: Moderatoren
Re: Update per Makro funktioniert nur im 1. Schleifendurchlauf,
Ich war oben als Gast angemeldet: "hfr" wäre richtig gewesen.
Re: Update per Makro funktioniert nur im 1. Schleifendurchlauf,
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
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
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
Re: Update per Makro funktioniert nur im 1. Schleifendurchlauf,
Hallo eBayer,
das ist ja ein lustig-mehrdeutiger Name -
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
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.:
das ist ja ein lustig-mehrdeutiger Name -

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
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
Re: Update per Makro funktioniert nur im 1. Schleifendurchlauf,
Oops
natürlich sind in obiger Fehlermeldung Zeilen-Nr und Uhrzeit andere geworden - na ja
natürlich sind in obiger Fehlermeldung Zeilen-Nr und Uhrzeit andere geworden - na ja
Re: Update per Makro funktioniert nur im 1. Schleifendurchlauf,
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.
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
Stephan
LibreOffice 5.3 - MAC OS/X 10.11
Re: Update per Makro funktioniert nur im 1. Schleifendurchlauf,
Aus der API:
http://api.openoffice.org/docs/common/r ... ltSet.html
Lösung:
Für das Abfrageergebniss und jegliche darauf basierende Weiterverarbeitung unterschiedliche Statements benutzen.
http://api.openoffice.org/docs/common/r ... ltSet.html
Für euch heisst das kurz übersetzt: Wird ein Statement neu ausgeführt, wird automatisch das vorher erzeugte ResultSet disposed (entsorgt / freigegeben)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.
Lösung:
Für das Abfrageergebniss und jegliche darauf basierende Weiterverarbeitung unterschiedliche Statements benutzen.
Re: Update per Makro funktioniert nur im 1. Schleifendurchlauf,
Hallo DPunch,
vielen Dank für den Hinweis.
vielen Dank für den Hinweis.
Gruß
Stephan
LibreOffice 5.3 - MAC OS/X 10.11
Stephan
LibreOffice 5.3 - MAC OS/X 10.11