Illegal operation on emty result set
Moderator: Moderatoren
Re: Illegal operation on emty result set
ok, es liegt an keinem trigger, wenn ich im formular die option "Nur Daten hinzufügen" auf "Ja" setze, dann bekomme ich diesen Fehler, ansonsten funktioniert es.
Wie kann ich aber jetzt ein Formular erstellen, mit dem nur datensätze hinzugefügt werden können ? es sollen keine alten datensätze angezeigt werden, sonsern nur 2 lehre felder, die man ausfüllt und auf nen button klickt und dann werden sie gespeichert (und wenn möglich gleich wieder resettet für die nächste eingabe).
Wie kann ich aber jetzt ein Formular erstellen, mit dem nur datensätze hinzugefügt werden können ? es sollen keine alten datensätze angezeigt werden, sonsern nur 2 lehre felder, die man ausfüllt und auf nen button klickt und dann werden sie gespeichert (und wenn möglich gleich wieder resettet für die nächste eingabe).
Re: Illegal operation on emty result set
Aloha
Da ich den Fehler immer noch nicht reproduzieren kann, muss ich wohl erstmal von einem JDBC-spezifischen Fehler ausgehen, bei dem ich Dir nicht weiterhelfen kann.
Dass bestehende Datensätze ohne die Formular-eigene Option nicht angezeigt werden, erreichst Du z.B., indem Du beim Formular als Datenbasis unter
"Art des Inhaltes" nicht "Tabelle" sondern "SQL-Befehl" auswählst.
"Inhalt" => "SELECT * FROM `meineTabelle` WHERE `name` = '##12##' (oder etwas ähnlich absurdes)
"SQL-Befehl analysieren" -> Ja
Zum resetten fällt mir momentan nur ein kurzes Makro ein, ob das auch anders umsetzbar ist, kann ich Dir leider nicht sagen.
(Als Formular-Ereignis "Nach der Datensatzaktion" zuweisen:)
Da ich den Fehler immer noch nicht reproduzieren kann, muss ich wohl erstmal von einem JDBC-spezifischen Fehler ausgehen, bei dem ich Dir nicht weiterhelfen kann.
Dass bestehende Datensätze ohne die Formular-eigene Option nicht angezeigt werden, erreichst Du z.B., indem Du beim Formular als Datenbasis unter
"Art des Inhaltes" nicht "Tabelle" sondern "SQL-Befehl" auswählst.
"Inhalt" => "SELECT * FROM `meineTabelle` WHERE `name` = '##12##' (oder etwas ähnlich absurdes)
"SQL-Befehl analysieren" -> Ja
Zum resetten fällt mir momentan nur ein kurzes Makro ein, ob das auch anders umsetzbar ist, kann ich Dir leider nicht sagen.
(Als Formular-Ereignis "Nach der Datensatzaktion" zuweisen:
Code: Alles auswählen
Sub FormReload
oForm = thisComponent.Drawpage.Forms(0)
oForm.Reload
End Sub
Re: Illegal operation on emty result set
hm, kann das sein, dass das daran liegt, das ich OO 3.2.0-9 verwende ?
ich würde eben gerne neue datensätze anlegen, aber ich versuch das mal über nen sql befehl, der durch den button ausgelöst wird, und dann eben ein insert macht.
so ungefähr:
bei oform1=odrawpage.forms.getByName("Benutzer anlegen") mekkert er "com.sun.star.container.NoSuchElementException"
ich würde eben gerne neue datensätze anlegen, aber ich versuch das mal über nen sql befehl, der durch den button ausgelöst wird, und dann eben ein insert macht.
so ungefähr:
Code: Alles auswählen
REM Name aus Textfeld holen
odoc=thisComponent
odrawpage=odoc.drawpage
oform1=odrawpage.forms.getByName("Benutzer anlegen")
oText=oform1.getByName("Name")
oInhalt=oText.getCurrentValue()
REM Passwort aus Textfeld Holen
oText=oform1.getByName("Passwort")
oPasswort=oText.getCurrentValue()
REM In Tabelle schreiben
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("DB")
Connection = DataSource.GetConnection("","")
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery("INSERT INTO t_users VALUES('"+oInhalt+"', '"+oPasswort+"');")
Re: Illegal operation on emty result set
Aloha
Vermutlich heisst Dein Formular an sich "Benutzer anlegen" - der Name des Formulardokuments hat allerdings erst mal gar nichts mit der Form zu tun, die Du ansprechen willst.
Mach mal im Formular den Formular-Navigator auf. Dort siehst Du unter "Formulare" die Forms, die im Formulardokument vorhanden sind sowie deren Name.
In Deinem Fall wird es reichen, wenn Du das
durch
ersetzt.
Vermutlich heisst Dein Formular an sich "Benutzer anlegen" - der Name des Formulardokuments hat allerdings erst mal gar nichts mit der Form zu tun, die Du ansprechen willst.
Mach mal im Formular den Formular-Navigator auf. Dort siehst Du unter "Formulare" die Forms, die im Formulardokument vorhanden sind sowie deren Name.
In Deinem Fall wird es reichen, wenn Du das
Code: Alles auswählen
oform1=odrawpage.forms.getByName("Benutzer anlegen")
Code: Alles auswählen
oform1=odrawpage.forms.getByName("Standard")
Re: Illegal operation on emty result set
meinst du den Ansicht -> Navigator (F5) ?
da finde ich keine Forms, da zeigt er nur Überschriften, Tabellen, Textforms etc. und da ist aber nirgends was drin.
edit:
ok, rechtsklick auf ein element und dann unter formular, das hab ich jetzt
jetzt mekkert er, dass er das net kennt: oInhalt=oText.getCurrentValue()
da finde ich keine Forms, da zeigt er nur Überschriften, Tabellen, Textforms etc. und da ist aber nirgends was drin.
edit:
ok, rechtsklick auf ein element und dann unter formular, das hab ich jetzt

jetzt mekkert er, dass er das net kennt: oInhalt=oText.getCurrentValue()
Zuletzt geändert von nahemoth am Do, 27.05.2010 12:04, insgesamt 1-mal geändert.
Re: Illegal operation on emty result set
Nein
Geh mal in den Entwurfsmodus des Formulars und aktiviere die Symbolleiste "Formular-Entwurf" (Menupunkt Ansicht -> Symbolleisten)
In der Symbolleiste gibt es ein Symbol namens "Formular-Navigator".
Die Formulare werden standardmässig "Standard" (bzw "Standard 1", "Standard 2" etc) genannt.
Geh mal in den Entwurfsmodus des Formulars und aktiviere die Symbolleiste "Formular-Entwurf" (Menupunkt Ansicht -> Symbolleisten)
In der Symbolleiste gibt es ein Symbol namens "Formular-Navigator".
Die Formulare werden standardmässig "Standard" (bzw "Standard 1", "Standard 2" etc) genannt.
Re: Illegal operation on emty result set
jap, aber da zeigt er dann nur die datensätze an, die gerade in den entsprechenden tabellen sind.
aber ich habe das rictige gefunden, glaube ich, siehe edit meines letzten postings
aber ich habe das rictige gefunden, glaube ich, siehe edit meines letzten postings
Re: Illegal operation on emty result set
Heisst Dein Textfeld denn auch "Name" (bzw. "Passwort")?
(Kontrollfeld-Eigenschaften -> Name)
(Kontrollfeld-Eigenschaften -> Name)
Re: Illegal operation on emty result set
ja, die heissen so, ich hab das formular neu angelegt ... nu bin ich weiter ... jetzt hängt er bei
ResultSet = Statement.executeQuery("INSERT INTO t_users VALUES('"+oInhalt+"','"+oPasswort+"');")
Cannot issue database manipulation statements with execute query.
edit: mit ExecuteUpdate gehts
jetzt sollten sich noch die felder resetten, dann würds passen.
mit
gehts nicht und wenn ich dem button die aktion zuweise, dass die form resettet wird, dann resettet er erst und führt dann das makro aus
ResultSet = Statement.executeQuery("INSERT INTO t_users VALUES('"+oInhalt+"','"+oPasswort+"');")
Cannot issue database manipulation statements with execute query.
edit: mit ExecuteUpdate gehts

jetzt sollten sich noch die felder resetten, dann würds passen.
mit
Code: Alles auswählen
oForm = thisComponent.Drawpage.Forms(0)
oForm.Reload
Re: Illegal operation on emty result set
Aloha
häng einfach ans Ende von Deinem Insert-Makro
häng einfach ans Ende von Deinem Insert-Makro
Code: Alles auswählen
oText=oform1.getByName("Name")
oText.Text = ""
oText=oform1.getByName("Passwort")
oText.Text = ""
oform1.Reload
Re: Illegal operation on emty result set
das funktioniert wunderbar, danke ! 
noch nebenbei ... wie kann man püfen, ob eine abfrage mit ExecuteQuery einen Datensatz zurückgegeben hat ? dann baue ich nämlich noch ein, dass wenn ein usernamen vorhanden ist, dass dann gefragt wird, ob das passwort geändert werden soll oder nicht. der username ist ja pk. so umgehe ich dann den fehler, dass ein pk 2x vorkommt.
thx!

noch nebenbei ... wie kann man püfen, ob eine abfrage mit ExecuteQuery einen Datensatz zurückgegeben hat ? dann baue ich nämlich noch ein, dass wenn ein usernamen vorhanden ist, dass dann gefragt wird, ob das passwort geändert werden soll oder nicht. der username ist ja pk. so umgehe ich dann den fehler, dass ein pk 2x vorkommt.
thx!
Re: Illegal operation on emty result set
Aloha
Das würde ungefähr so aussehen:
Das würde ungefähr so aussehen:
Code: Alles auswählen
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("DB")
Connection = DataSource.GetConnection("","")
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery("SELECT `name` FROM t_users WHERE `name` = '" +oInhalt +"'"
If ResultSet.Next Then
If MsgBox("Benutzername bereits vergeben" & Chr(13) & "Passwort für " & oInhalt & " ändern?", 36, "Hinweis") = 6 Then
Statement.executeUpdate("UPDATE t_users SET `passwort` = '" & oPasswort & "' WHERE `name` = '" & oInhalt & "'")
End If
Else
Statement.executeUpdate("INSERT INTO t_users VALUES('"+oInhalt+"', '"+oPasswort+"');")
End If
Re: Illegal operation on emty result set
fast 
unten muss es heissen
spielt das da eigentlich eine Rolle ob man executeUpdate oder executeQuery verwendet ?
p.s.: du hättest mir nicht vorkauen müssen, bissel was sollt ich auch noch selbst machen, aber danke !
edit:
hm, jetzt setzt er mir immer noch ne Zeile rein, in der kein name steht, aber ein md5-string
der code sieht mittlerweile wie folgt aus:
und die beiden trigger:

unten muss es heissen
Code: Alles auswählen
Else
Statement.executeUpdate("INSERT INTO t_users VALUES('"+oName+"','"+oPasswort+"');")
End If
p.s.: du hättest mir nicht vorkauen müssen, bissel was sollt ich auch noch selbst machen, aber danke !
edit:
hm, jetzt setzt er mir immer noch ne Zeile rein, in der kein name steht, aber ein md5-string
der code sieht mittlerweile wie folgt aus:
Code: Alles auswählen
Sub Main
REM Name aus Textfeld holen
odoc=thisComponent
odrawpage=odoc.drawpage
oform=odrawpage.forms.getByName("Benutzer_anlegen")
oText=oform.getByName("Name")
oName=oText.getCurrentValue()
REM Passwort aus Textfeld Holen
oText=oform.getByName("Passwort")
oPasswort=oText.getCurrentValue()
REM Daten in Tabelle schreiben
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("Weblogin")
Connection = DataSource.GetConnection("","")
Statement = Connection.createStatement()
REM ResultSet = Statement.executeUpdate("INSERT INTO t_users VALUES('"+oName+"','"+oPasswort+"');")
ResultSet = Statement.executeQuery("SELECT `name` FROM t_users WHERE `Name` = '" +oName+"'")
If ResultSet.Next Then
If MsgBox("Benutzername bereits vergeben" & Chr(13) & "Passwort für " & oName & " ändern?", 36, "Hinweis") = 6 Then
Statement.executeUpdate("UPDATE t_users SET `passwort` = '" & oPasswort & "' WHERE `name` = '" & oName & "'")
End If
Else
Statement.execute("INSERT INTO t_users VALUES('"+oName+"','"+oPasswort+"');")
End If
REM Felder zurücksetzen
oText=oform.getByName("Name")
oText.Text = ""
oText=oform.getByName("Passwort")
oText.Text = ""
oform.Reload
Code: Alles auswählen
USE `weblogin`;
DELIMITER //
CREATE
TRIGGER `weblogin`.`md5ize_on_insert`
BEFORE INSERT ON `weblogin`.`t_users`
FOR EACH ROW
BEGIN
SET NEW.Passwort=md5( NEW.Passwort );
END//
CREATE
TRIGGER `weblogin`.`md5ize_on_update`
BEFORE UPDATE ON `weblogin`.`t_users`
FOR EACH ROW
BEGIN
SET NEW.Passwort=md5( NEW.Passwort );
END//
Re: Illegal operation on emty result set
Aloha
XStatement: executeQuery
XStatement: executeUpdate
Ja.nahemoth hat geschrieben:spielt das da eigentlich eine Rolle ob man executeUpdate oder executeQuery verwendet ?
XStatement: executeQuery
XStatement: executeUpdate
Ich verstehe nicht ganz, was Du damit meinst.nahemoth hat geschrieben:hm, jetzt setzt er mir immer noch ne Zeile rein, in der kein name steht, aber ein md5-string
Re: Illegal operation on emty result set
naja, er fügt nen datensatz mit einem codierten string hinzu:

aber eben ohne benutzername, kene ahnung warum er das macht. den namen mit passwort fügt er aber auch passend hinzu.

aber eben ohne benutzername, kene ahnung warum er das macht. den namen mit passwort fügt er aber auch passend hinzu.