Illegal operation on emty result set

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

nahemoth
**
Beiträge: 29
Registriert: Do, 20.08.2009 08:27

Re: Illegal operation on emty result set

Beitrag von nahemoth »

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).
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Illegal operation on emty result set

Beitrag von DPunch »

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:

Code: Alles auswählen

Sub FormReload
oForm = thisComponent.Drawpage.Forms(0)
oForm.Reload
End Sub
)
nahemoth
**
Beiträge: 29
Registriert: Do, 20.08.2009 08:27

Re: Illegal operation on emty result set

Beitrag von nahemoth »

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:

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+"');")
bei oform1=odrawpage.forms.getByName("Benutzer anlegen") mekkert er "com.sun.star.container.NoSuchElementException"
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Illegal operation on emty result set

Beitrag von DPunch »

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

Code: Alles auswählen

oform1=odrawpage.forms.getByName("Benutzer anlegen") 
durch

Code: Alles auswählen

oform1=odrawpage.forms.getByName("Standard") 
ersetzt.
nahemoth
**
Beiträge: 29
Registriert: Do, 20.08.2009 08:27

Re: Illegal operation on emty result set

Beitrag von nahemoth »

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()
Zuletzt geändert von nahemoth am Do, 27.05.2010 12:04, insgesamt 1-mal geändert.
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Illegal operation on emty result set

Beitrag von DPunch »

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.
nahemoth
**
Beiträge: 29
Registriert: Do, 20.08.2009 08:27

Re: Illegal operation on emty result set

Beitrag von nahemoth »

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
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Illegal operation on emty result set

Beitrag von DPunch »

Heisst Dein Textfeld denn auch "Name" (bzw. "Passwort")?
(Kontrollfeld-Eigenschaften -> Name)
nahemoth
**
Beiträge: 29
Registriert: Do, 20.08.2009 08:27

Re: Illegal operation on emty result set

Beitrag von nahemoth »

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

Code: Alles auswählen

oForm = thisComponent.Drawpage.Forms(0)
oForm.Reload
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
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Illegal operation on emty result set

Beitrag von DPunch »

Aloha

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
nahemoth
**
Beiträge: 29
Registriert: Do, 20.08.2009 08:27

Re: Illegal operation on emty result set

Beitrag von nahemoth »

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!
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Illegal operation on emty result set

Beitrag von DPunch »

Aloha

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
nahemoth
**
Beiträge: 29
Registriert: Do, 20.08.2009 08:27

Re: Illegal operation on emty result set

Beitrag von nahemoth »

fast ;)
unten muss es heissen

Code: Alles auswählen

Else
   Statement.executeUpdate("INSERT INTO t_users VALUES('"+oName+"','"+oPasswort+"');")
End If
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:

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
		
und die beiden trigger:

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//
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Illegal operation on emty result set

Beitrag von DPunch »

Aloha
nahemoth hat geschrieben:spielt das da eigentlich eine Rolle ob man executeUpdate oder executeQuery verwendet ?
Ja.
XStatement: executeQuery

XStatement: executeUpdate

nahemoth hat geschrieben:hm, jetzt setzt er mir immer noch ne Zeile rein, in der kein name steht, aber ein md5-string
Ich verstehe nicht ganz, was Du damit meinst.
nahemoth
**
Beiträge: 29
Registriert: Do, 20.08.2009 08:27

Re: Illegal operation on emty result set

Beitrag von nahemoth »

naja, er fügt nen datensatz mit einem codierten string hinzu:
Bild
aber eben ohne benutzername, kene ahnung warum er das macht. den namen mit passwort fügt er aber auch passend hinzu.
Antworten