Makro auf Tabellenspalte in Datenbankformular (gelöst)

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

puzzledag
*
Beiträge: 10
Registriert: Mi, 06.05.2009 14:08

Makro auf Tabellenspalte in Datenbankformular (gelöst)

Beitrag von puzzledag »

Hallo,

ich habe in einem Datenbankformular eine Tabelle bei der zwei Spalten (Essen1, Essen2) mit einem Markierfeld belegt sind. Es darf in jeder Zeile nur aber nur entweder Essen1 oder Essen2 gesetzt werden. Nun sollen diese Spalten mit einem Makro belegt werden, das beim Klicken in eine der Spalten z.B. Essen1 prüft, ob
a) die Markierung in dieser Spalte gesetzt wurde und
b) wenn sie gesetzt wurde, die evtl. vorhandene Markierung der anderen Spalte (Essen2) löscht.

Ich habe nun ein Makro aufgezeichnet, das genau diese Schritte vornimmt. Nur leider funktioniert dieses nach erneutem Aufruf nicht mehr.

Hier der Code des Aufgezeichneten Makros.

sub xxx
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:RecSave", "", 0, Array())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Refresh", "", 0, Array())


end sub


was ist falsch?

Ich habe nun probiert, die Daten direkt per SQL zu ändern. Hier bekomme ich aber Fehlermeldungen.


sub essen1_aendern (tc_teilnehmer as Intereger) as Integer
DIM iEssen AS Integer
DIM oStatement As Object, oDatenbankKontext As Object, oDatenquelle As Object
DIM oVerbindung As Object, oResultSet As Object
DIM sSQL As String, sHeute AS String, sEssen AS String, sTeilnehmer as String
CALL datensatz_speichern()
sTeilnehmer = tc_teilnehmer
sHeute = Right(Date, 4) & "-" & Mid(Date, 4, 2) & "-" & Left(Date, 2) 'Tagesdatum in Datenbankformat umwandeln
oDatenbankKontext = CreateUnoService ( "com.sun.star.sdb.DatabaseContext" )
oDatenquelle = oDatenbankKontext.getByName( "db_kantinenabrechnung" )
oVerbindung = oDatenquelle.getConnection( "" , "" )
oStatement = oVerbindung.createStatement()
oQuery = oVerbindung.createStatement()

sSQL = "SELECT ""essen1"" FROM ""tab_essensmarkenausgabe"" WHERE ""erfassungsdatum"" = '"+ sHeute +"' and ""id_teilnehmer"" = '"+ sTeilnehmer +"'"
oResultSet = oQuery.executeQuery(sSQL)
while oResultSet.next()
iEssen = oResultSet.getInt( 1 )
If iEssen = 1 Then
sEssen = iEssen
else
sEssen = "0"
end If
sSQL = "UPDATE ""tab_essensmarkenausgabe"" SET ""essen1 = ""essen2"" = 0 WHERE ""erfassungsdatum"" = '"+ sHeute +"' and ""id_teilnehmer"" = '"+ sTeilnehmer +"'"
oStatement.execute(sSQL)
wend
oResultSet.close()
oVerbindung.close()
oStatement.close()
oQuery.close()
CALL essen_akt() 'Formular aktualisieren
end sub

Jetzt habe ich keine Idee mehr.

Bitte dringend um Hilfe!!!!

Gruß

Dagmar
Zuletzt geändert von puzzledag am Di, 16.06.2009 14:18, insgesamt 1-mal geändert.
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Problem mit Makro auf Tabellenspalte in Datenbankformular

Beitrag von turtle47 »

Hi Dagmar,

folgenden Code mit dem Ereignis "Status geändert" bei beiden Checkboxe zuweisen:

Code: Alles auswählen

Sub click_Checkbox( oEvt as Object)
set oCheckbox = oEvt.Source
	oDoc = thisComponent
	oForm = oDoc.drawpage.forms.getbyindex(0)
	StateCB1 = oForm.getByName("CheckBox1")
	StateCB2 = oForm.getByName("CheckBox2")
if oCheckbox.Model.Name = "CheckBox1" Then
StateCB2.state = 0
end if
if oCheckbox.Model.Name = "CheckBox2" Then
StateCB1.state = 0
end if
end Sub
Hilft das weiter?

Viel Erfolg.

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
puzzledag
*
Beiträge: 10
Registriert: Mi, 06.05.2009 14:08

Re: Problem mit Makro auf Tabellenspalte in Datenbankformular

Beitrag von puzzledag »

Hallo Jürgen,

vielen dank für die Hilfe. Habe Dein Beispiel angepasst und versucht.

Sub click_Checkbox( oEvt as Object)
set oCheckbox = oEvt.Source
oDoc = thisComponent
oForm = oDoc.drawpage.forms.getbyindex(0)
StateCB1 = oForm.getByName("tc_essen1") 'Tabellenspalte
StateCB2 = oForm.getByName("tc_essen2")
if oCheckbox.Model.Name = "tc_essen1" Then
If StateCB1 = 1 Then
StateCB2.state = 0
ELSE
StateCB1.state = 0
end If
end if
if oCheckbox.Model.Name = "tc_essen2" Then
If StateCB2 = 1 Then
StateCB1.state = 0
ELSE
StateCB2.state = 0
end If
end if
CALL essen_akt() 'Formular aktualisieren
end Sub

Jetzt bekomme ich folgende Fehlermeldung.


Basic Laufzeitfehler

Type: com.sun.star.container.NoSuchElementExceptionmessage:.

Was kann das sein?

Gruß
Dagmar
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Problem mit Makro auf Tabellenspalte in Datenbankformular

Beitrag von turtle47 »

Hallo Dagmar,
puzzledag hat geschrieben:StateCB1 = oForm.getByName("tc_essen1") 'Tabellenspalte
Wieso nimmst Du Bezug auf die Tabellenspalte? Dieser ist doch schon hergestellt über die Eigenschaft "Datenfeld" unter dem Reiter "Daten". Oder nicht?

Ich kann mich eigentlich nur wiederholen:

Code: Alles auswählen

Sub click_Checkbox1( oEvt as Object)
set oCheckbox = oEvt.Source
	oDoc = thisComponent
	oForm = oDoc.drawpage.forms.getbyindex(0)
	StateCB1 = oForm.getByName("CheckBox1")'Name der Checkbox (anpassen)!!
	StateCB2 = oForm.getByName("CheckBox2")'Name der Checkbox (anpassen)!!
if oCheckbox.Model.Name = "CheckBox1" Then 'Name der Checkbox (anpassen)!!
StateCB2.state = 0
end if
if oCheckbox.Model.Name = "CheckBox2" Then 'Name der Checkbox (anpassen)!!
StateCB1.state = 0
end if
end Sub
Du musst die Checkbox in der Form über den Namen ansprechen und nicht die Tabellenspalte ansprechen.

StateCB1 = oForm.getByName("CheckBox1")'Name der Checkbox !!

Bei mir in einem Testformular läuft das reibungslos.

Oder habe ich da was ganz falsch verstanden?

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
puzzledag
*
Beiträge: 10
Registriert: Mi, 06.05.2009 14:08

Re: Problem mit Makro auf Tabellenspalte in Datenbankformular

Beitrag von puzzledag »

Hallo Jürgen,


Die Tabellenspalten tc_essen1/2 sind als Checkbox definiert. Siehe Anhang.

Danke !

Schönes Wochenende

Dagmar
form_essensmarken.odt
(107.26 KiB) 213-mal heruntergeladen
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Problem mit Makro auf Tabellenspalte in Datenbankformular

Beitrag von turtle47 »

Hallo Dagmar,
puzzledag hat geschrieben:Die Tabellenspalten tc_essen1/2 sind als Checkbox definiert.
Sorry, aber da muss ich passen.
Ich war davon ausgegangen, dass in dem Formular zwei Checkboxen vorhanden sind und diese gesteuert werden sollen.

Ob das mit der Abhängigkeit in der Tabelle direkt möglich ist kann ich Dir leider nicht sagen. Vielleicht fragst Du mal im Baseforum nach.

Dir auch ein schönes Wochenende.


Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Christiana
***
Beiträge: 62
Registriert: Di, 20.03.2007 11:41

Re: Problem mit Makro auf Tabellenspalte in Datenbankformular

Beitrag von Christiana »

Hallo Dagmar,

zur Zeit arbeite ich auch gerade an einem Formular mit Tabellen-Kontrollfeld und Markierfeld.
Ersetze mal Deine Zeilen

Code: Alles auswählen

oForm = oDoc.drawpage.forms.getbyindex(0)
StateCB1 = oForm.getByName("tc_essen1") 'Tabellenspalte
StateCB2 = oForm.getByName("tc_essen2")
durch

Code: Alles auswählen

oForm = oDoc.drawpage.forms.getbyindex(0)
oGrid  = oForm.getByName("TableControl")      'Tabelle
StateCB1 = oGrid.getByName("tc_essen1")       'Tabellenspalte
StateCB2 = oGrid.getByName("tc_essen2")
Eventuell musst Du noch den Tabellennamen anpassen. Die Spaltennamen müssen ebenfalls vom Tabellen-Kontrollfeld sein.

Ich hoffe, dass ich Dir damit helfen konnte
und wünsche Dir ein schönes Wochenende!

Christiana
puzzledag
*
Beiträge: 10
Registriert: Mi, 06.05.2009 14:08

Re: Problem mit Makro auf Tabellenspalte in Datenbankformular

Beitrag von puzzledag »

Hallo Christina,

danke für Deine Hilfe. Es gibt aber immer noch ein Problem. Ich bekomme immer die Fehlermeldung

Falscher Wert für Eigenschaft


oForm = oDoc.drawpage.forms.getbyindex(0)
oGrid = oForm.getByName("tb_essensmarken") 'Tabelle
StateCB1 = oGrid.getByName("tc_essen1") 'Tabellenspalte
StateCB2 = oGrid.getByName("tc_essen2")
'set iEssen1 = StateCB1
' CALL datensatz_speichern()
if oCheckbox.Model.Name = "tc_essen1" Then
If StateCB1 = TRUE Then 'weder true noch 1 funktioniert,
iEssen1 = 1
iEssen2 = 0
ELSE
iEssen1 = 0
end If
end if


Danke

Gruß

Dagmar
Christiana
***
Beiträge: 62
Registriert: Di, 20.03.2007 11:41

Re: Problem mit Makro auf Tabellenspalte in Datenbankformular

Beitrag von Christiana »

Hallo Dagmar,

versuchs mal so

Code: Alles auswählen

If StateCB1.State = 1 Then 
Gruß
Christiana
puzzledag
*
Beiträge: 10
Registriert: Mi, 06.05.2009 14:08

Re: Problem mit Makro auf Tabellenspalte in Datenbankformular

Beitrag von puzzledag »

Hallo Christina,
Hat super funktioniert.

DANKE !!!!! :D :D :D
Gruß

dagmar
Zuletzt geändert von puzzledag am Mo, 15.06.2009 12:12, insgesamt 1-mal geändert.
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: Problem mit Makro auf Tabellenspalte in Datenbankformular

Beitrag von eBayer »

Hallo Dagmar,
ich verfolge Eure Versuche jetzt schon eine Weile, wollte mich aber nicht einmischen.
Wenn es Dir Recht ist, würde ich mir Deine Anwendung mal anschauen, denn aus dem was hier geschrieben wird, werde ich nicht schlau. Vielleicht kannst Du, sofern vorhanden, die echten Daten zu Testdaten verfälschen..... dann kann ja auch nichts passieren.
Noch eine Frage: Du änderst die Daten direkt in der Tabellenansicht?
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
Christiana
***
Beiträge: 62
Registriert: Di, 20.03.2007 11:41

Re: Problem mit Makro auf Tabellenspalte in Datenbankformular

Beitrag von Christiana »

Hallo Dagmar,

könnte es sein, dass Du Deine Spalten "E1" und "E2" in Deinem Tabellen-Kontrollfeld noch nicht als Markierfelder (Checkboxen) eingerichtet hast?

- Spalte im Entwurfsmodus mit der rechten Maustaste anklicken
- Ersetzen durch auswählen
- und dann Markierfeld auswählen

Noch eine Frage. Benutzt Du xray? Das ist sehr hilfreich. Wenn Du hier im Forum nach xray suchst, findest Du genügend Hinweise dazu.

Gruß
Christiana
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Problem mit Makro auf Tabellenspalte in Datenbankformular

Beitrag von turtle47 »

Hallo Ladies,

ich habe jetzt mal einen anderen Ansatz gewählt.
Aktuelle Zeile holen wo der Datensatzzeiger steht und dann über den Spalten- und Zeilenindex den Status auslesen der Checkbox auslesen und dann den Wechsel ausführen.

Hier mal der Code für eine Spalte:

Code: Alles auswählen

Sub Change_Checkbox_1 'für Spalte tc_essen_1
	Dim oDatCtr as object
	Dim oDoc as Object, oForm as Object
	oDoc = thisComponent
	oForm = oDoc.drawpage.forms.getbyindex(0)	
	myTable = oForm.getByName("TableControl")	
	myRow = myTable.Parent.row 'aktive Datenbankzeile holen
	NF_Status = (oForm.getString(2,(myrow)))
	if NF_Status = "1" Then 
	oTableField = myTable.getbyindex(2,myrow)
	oTableField.State = "0"
	end if
	'folgend den Tri-State eliminieren
	if NF_Status = "" Then 
	oTableField = myTable.getbyindex(1,myrow)
	oTableField.State = "1"
	end if
End Sub
Für die zweite Spalte ensprechend anpassen!

Den Tri-Status habe ich in dem Code auch berücksichtigt.

Hier mal ein Beispiel.

Viel Erfolg.

Jürgen
Dateianhänge
DB_Essensmarken.odb
(11.56 KiB) 162-mal heruntergeladen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
puzzledag
*
Beiträge: 10
Registriert: Mi, 06.05.2009 14:08

Re: Problem mit Makro auf Tabellenspalte in Datenbankformular

Beitrag von puzzledag »

Hallo,


an alle noch mal vielen Dank !!!

Mit dem letzten Befehl von Christa hat es funktioniert. Habe mich erst nur verschrieben geklappt.

Ich werde die anderen Varianten aber auch noch ausprobieren. es kommen ja noch mehr Makros.

Viele Grüße

dagmar
Snoopy
**
Beiträge: 31
Registriert: Mi, 03.06.2009 14:41

Re: Problem mit Makro auf Tabellenspalte in Datenbankformular

Beitrag von Snoopy »

turtle47 hat geschrieben:...ich habe jetzt mal einen anderen Ansatz gewählt...
Hi turtle47,

bei dem neuen Ansatz ist es nicht so einfach zu erkennen was passiert, da bin ich doch froh das es einen ersten Ansatz gibt :D .

Einfach schön was man hier so an Code-Schnipseln findet, Danke.

Da es auch mehr als zwei Optionsfelder geben kann habe ich mir erlaubt den Code für meine Bedürfnisse anzupassen, und gebe das Ergebnis zurück:

Code: Alles auswählen

Sub Optionsfeld_geklickt( oEvt as Object)
	Dim klick as integer
	Dim iAuswahl as integer
	set oCheckbox = oEvt.Source
	oDoc = thisComponent
	oForm = oDoc.drawpage.forms.getbyindex(0)
	for klick = 0 to 3
		StateOB_X = oForm.getByName("OptionButton" & klick)
		if oCheckbox.Model.Name <> "OptionButton" & klick Then
			StateOB_X.state = 0
		else
			iAuswahl = klick
		end if
	next klick
	Select Case iAuswahl
	Case 0
		msgBox "Es wurde Optionsfeld 0 angeklickt!"
	Case 1
		msgBox "Es wurde Optionsfeld 1 angeklickt!"
	Case 2
		msgBox "Es wurde Optionsfeld 2 angeklickt!"
	Case 3
		msgBox "Es wurde Optionsfeld 3 angeklickt!"
	End Select
End Sub
Antworten