🙏 Bitte helfen Sie uns das LibreOffice Forum zu erhalten. 🙏
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.

🍀 Wir hoffen auf Ihre Unterstützung - vielen Dank!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[gelöst] Makro: Fokus ins nächste Formularfeld setzen

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
harald235

[gelöst] Makro: Fokus ins nächste Formularfeld setzen

Beitrag von harald235 » Mi 18. Apr 2012, 15:14

Hallo liebe Helfenden,

mit meiner Datenbankanwendung komme ich nicht weiter:

Der Fokus soll per Makro ins nächste Formularfeld gesetzt werden. Und zwar in einem Unterformular-Tabellenkontrollfeld. Dort werden Rechnungspositionen eingegeben. Nach errechnen und eintragen der PosNr (soweit funktioniert es) soll der Cursor ins Feld "Artikel" springen, damit nicht erst per Tab-Taste dieses Feld angesteuert werden muß (das funktioniert nicht).
Base meldet: Basic Laufzeitfehler. Objektvariable nicht belegt.

Ich nehme an, er bezieht sich dabei auf die Verwendung des getCurrentController. Allerdings funktioniert der Bezug darauf weiter oben im selben Makro einwandfrei. Auch mehrere Versuche den Controller mit anderer Syntax anzusprechen schlugen fehl, z.B. "...oForm.Parent.CurrentController"
Bin jetzt ratlos und bitte um Eure Hilfe.

Arbeitsmittel:
openSUSE 12.1
LibreOffice Base 3.4.5
HSQLDB 1.8.0.10-24.1 eingebettet

Hier das Makro:

Code: Alles auswählen

Sub PosNr
	Dim oDoc as Object
	Dim oDocView as Object
	Dim oDrawpage as Object
	Dim oDatenquelle as Object
	Dim oVerbindung as Object
	Dim oStatement as Object
	Dim oResultSet as Object
	Dim oForm as Object
	Dim oRechPostForm as  Object 	' Unterformular, Tabellenkontrollfeld
	Dim oPosNr as Object
	Dim sPosNr as String
	Dim sCountPos as String
	Dim sAnzPos as String			' Anzahl der bisherigen Rechnungspositionen
	Dim sRechNr as String
	Dim FokusGo as Object
	Dim oFokusFeld as Object
		
' Zugriff auf das Formular
	oDoc = thisComponent
	oDocView = oDoc.getCurrentController()
	oDrawpage = oDoc.DrawPage
	oForm = oDrawpage.forms.getByName("MainForm")
' Zuriff auf Unterformular "RechPosten" und Tabellenkontrollfeld "RechPosten" (blöde Namensgleichheit)
	oRechPostForm = oForm.getByName("RechPosten").getByName("RechPosten")

xray oDocView
	
' PosNr aus dem Unterformularfeld "PosNr" auslesen  
	oPosNr = oRechPostForm.getByName("PosNr")
' in Variable sPosNr schreiben
	sPosNr = oPosNr.text
	
' RechNr aus Formularfeld "strRechNr" auslesen
	sRechNr = oForm.getByName("strRechNr").text
' SQL-Abfrage mit sRechNr zusammenstellen
	sAnzPos = "SELECT COUNT(""PosNr"") FROM ""RechPosten"" WHERE ""RechNr"" = '" +  sRechNr + "'"

'  Datenbankverbindung erstellen 
	oDatenquelle = ThisComponent.Parent.DataSource
	oVerbindung = oDatenquelle.GetConnection("","")
	oStatement = oVerbindung.createStatement
	
' Abfrage ausführen
	oResultSet = oStatement.executeQuery(sAnzPos)
	
' derzeitigen Wert aus Formularfeld "PosNr" in Variable sPosNr schreiben
'	sPosNr = oRechPostForm.getByName("PosNr").text
	
' Wenn sPosNr noch keinen Wert hat, dann Wert ermitteln und speichern
	If sPosNr = "" then
		While oResultSet.next()
	  	 	' erste Spalte des Resultset ausgeben
			' msgbox oResultSet.getString(1)
		' die PosNr um 1 erhöhen, dafür oResultSet.getstring(1) auf Integer setzen
  			sPosNr = cint(oResultSet.getString(1)) +1
 	 	Wend
 	' PosNr in String umwandeln
		cstr(sPosNr)

	' Formularfeld "PosNr" mit neuer PosNr füllen 
		oRechPostForm.getByName("PosNr").text = sPosNr

	' Formularfeld "strRechNr"im Formular speichern
		oRechPostForm.getByName("PosNr").commit = true	

	' Feld in das der Fokus nach eintragen der PosNr springen soll
		oFokusFeld = oRechPostForm.getByName("Artikel")

	' Currentcontroller über oDocview setzen auf oFokusFeld
		FokusGo = oDocView.getControl(oFokusFeld)
		
		xray oFokusGo		' (xray sagt: empty)
		' hier hakt's, das macht er nicht, sagt: Objektvariable nicht belegt
		FokusGo.setFocus
	Endif	
End Sub
Besten Dank schon jetzt.

Gruß
harald
Zuletzt geändert von harald235 am So 22. Apr 2012, 11:55, insgesamt 1-mal geändert.

harald235

Re: Makro: Fokus ins nächste Formularfeld setzen (gelöst)

Beitrag von harald235 » Fr 20. Apr 2012, 01:11

Hier die Lösung, die ich in einem englischsprachigen Forum gefunden habe:

Postby void64 » Sat Jan 30, 2010 9:59 pm
... The mistake was trying to get the control for the Field (which returned empty) rather than getting the control for the Table and then setting the current column position to the desired field - the field object is not used at all. In my particular case (where the table resides in a sub-sub-form), the final working code is:

Code: Alles auswählen

 Select all   Expand view
    oDoc            = thiscomponent.drawpage.forms
    oForm           = oDoc.getbyname("Steps")
    oSubForm        = oForm.getbyname("CompList")
    oSubSubForm     = oSubForm.getbyname("FailureModes")
    oSubSubFormGrid = oSubSubForm.getbyname("TableControl")

    oControlView    = ThisComponent.CurrentController.GetControl(oSubSubFormGrid)       
    oControlView.SetFocus
    oControlView.setCurrentColumnPosition(2) 
Der Fehler war den Fokus auf das Formularfeld setzen zu wollen. Richtig ist auf das Tabellenkontrollfeld setzen und anschließend auf die entsprechende Spalte. Es funktioniert. Meinen herzlichen Dank an den den findigen Kopf.

Für mein im 1. Post aufgeführtes Makro ist die Lösung demnach (hier die If bis Endif Sequenz):

Code: Alles auswählen

	If sPosNr = "" then
		While oResultSet.next()
	  	 	' erste Spalte des Resultset ausgeben
			' msgbox oResultSet.getString(1)
		' die PosNr um 1 erhöhen, dafür oResultSet.getstring(1) auf Integer setzen
  			sPosNr = cint(oResultSet.getString(1)) +1
 	 	Wend
 		' PosNr in String umwandeln
			cstr(sPosNr)

		' Bezug auf das Tabellenkontrollfeld nehmen
			oRechPostView = ThisComponent.CurrentController.GetControl(oRechPostForm) 
			     
		' den Fokus auf das TABELLENkontrollfeld setzen und NICHT auf das Formularfeld 
			oRechPostView.SetFocus
			
		' auf die 2.Spalte im Tabellenkontrollfeld springen (0 = 1.Spalte, 1 = 2.Spalte)
			oRechPostView.setCurrentColumnPosition(1)  

		' Formularfeld "PosNr" mit neuer PosNr füllen 
			oRechPostForm.getByName("PosNr").text = sPosNr
	
		' Formularfeld "strRechNr"im Formular speichern
			oRechPostForm.getByName("PosNr").commit = true	
		
	Endif	
Gruß
harald


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten