Seite 1 von 1

[gelöst] Laufzeitfehler: Objektvariable nicht belegt

Verfasst: Sa 9. Jul 2016, 13:21
von Acco
Liebe LO Freunde,

in ein Rechnungsformular mit Unterformular und Tabellenkontrollfeld soll ein (in einem anderen Formular errechneter) Preis eingetragen werden. Hier der betreffende Makroteil:

Code: Alles auswählen

    oController = ThisDatabaseDocument.CurrentController
    If not oController.isconnected then oController.connect
    oForm1 = ThisComponent.drawpage.forms.getByName ("Netto_Form")
    eNetto = oForm1.getbyname("Netto").Value
    oFormDok2 = ThisDatabaseDocument.FormDocuments.getByName("Rechnung").open   
    oForm2 = oFormdok2.drawpage.forms.MainForm

' Zuriff auf Unterformular "RechPosten" und dort auf Tabellenkontrollfeld "RechPosten" (blöde Namensgleichheit)
	oRechPostForm = oForm2.getByName("RechPosten").getByName("RechPosten")
	
xray oRechPostForm ' gibt "RechPosten" aus

	' den Fokus auf das TABELLENkontrollfeld setzen und NICHT auf das Formularfeld 
	' Bezug auf das Tabellenkontrollfeld nehmen
		oRechPostView = ThisComponent.CurrentController.GetControl(oRechPostForm)   

xray oRechPostView ' gibt "leerer Datenwert (null)"   aus
		   
	' den Fokus auf das TABELLENkontrollfeld setzen und NICHT auf das Formularfeld 
		oRechPostView.SetFocus ' bringt Fehlermeldung: BASIC-Laufzeitfehler. Objektvariable nicht belegt.
		
	' dann auf die 5.Spalte im Tabellenkontrollfeld springen (0 = 1.Spalte, 1 = 2.Spalte)
		oRechPostView.setCurrentColumnPosition(4)  
BIs zu dieser Zeile klappt es

Code: Alles auswählen

   oRechPostForm = oForm2.getByName("RechPosten").getByName("RechPosten")
Beim setzen des Focus auf das Tabellenkontrollfed jedoch folgt die Fehlermeldung: BASIC-Laufzeitfehler. Objektvariable nicht belegt. in der Zeile

Code: Alles auswählen

oRechPostView.SetFocus 
Was ist falsch im Makro? Ich komme nicht drauf.

Besten Dank und Gruß

acco

Re: Laufzeitfehler: Objektvariable nicht belegt

Verfasst: Sa 9. Jul 2016, 15:11
von RobertG
Hallo acco,

wenn xray vorher doch schon bei oRechPostView 'null' raus gibt, dann steckt dahinter kein Objekt, aus dem Du irgendetwas weiteres rausziehen kannst.

Ich nehme an, dass sich auf ein Tabellenkontrollfeld schlicht kein Focus setzen lässt. Der muss immer in dem ersten Feld in dem Tabellenkontrollfeld landen, also eine Ebene tiefer.

Gruß

Robert

Re: Laufzeitfehler: Objektvariable nicht belegt

Verfasst: Mo 11. Jul 2016, 13:31
von Acco
Hallo Robert,

danke für Deine Antwort, Du hast recht das Tabellenkontrollfeld erhält den Fokus nicht.
An anderer Stelle in derselben DB benutze ich dieselbe Makrosequenz (jetzt aber mit auskommentiertem Tabellenkontrollfeld-Fokus) und da funktioniert es einwandfrei.

Ich nehme an es liegt an "ThisComponent".
Es zeigt auf Formular "Netto_Form" (das gibt es im erwähnten funktionierenden Makro nicht) und nicht auf "RechPosten". Ich habe schon länger nicht mehr mit Base gearbeitet und stehe gerade auf dem Schlauch, wie der richtige Bezug hergestellt wird. Glücklicherweise gibt es das Handbuch.

Nochmal vielen Dank und

Gruß acco

Re: Laufzeitfehler: Objektvariable nicht belegt

Verfasst: Mi 13. Jul 2016, 14:45
von Acco
Moin HeiDieLX,

danke, guter Tip, hilft mir bei Durch- und Überblick.

Gruß acco

Re: Laufzeitfehler: Objektvariable nicht belegt

Verfasst: Do 21. Jul 2016, 22:32
von Acco
Liebe LO'ler

der guten Ordnung halber hier noch der funktionierende Code (ohne Variablendeklarationen):

Code: Alles auswählen

    oController = ThisDatabaseDocument.CurrentController
    If not oController.isconnected then oController.connect
    oFormNetto = ThisComponent.drawpage.forms.getByName ("Netto_Form")			  ' Formular mit Netto-Preis
    sNetto = oFormNetto.getbyname("Netto").Value

    oFormDok2 = ThisDatabaseDocument.FormDocuments.getByName("Rechnung").open	 ' wenn nicht .open 
    																									  '= drawpage wird nicht gefunden

	oFormRech = oFormdok2.drawpage.forms.MainForm								' Rechnungsformular
	stRechNr = oFormRech.getByName("strRechNr").TEXT							' RechnungsNr, alphanumerisch
   	oSubForm2 = oFormRech.getByName("RechPosten")							' Unterformular Rechnungsposten
	oSubGrid2 = oSubForm2.getByName("RechPosten_Grid")						 ' Tabellenkontrollfeld für Preiseintrag

	iID = oSubGrid2.getByName("ID").VALUE 

	oDatenquelle = ThisComponent.Parent.CurrentController
		If NOT (oDatenquelle.isConnected()) THEN
			oDatenquelle.connect()
		END IF
	oVerbindung = oDatenquelle.ActiveConnection()
	oSQL_Anweisung = oVerbindung.createStatement()

	'>>>> sNetto MUSS als CURRENCY deklariert sein, mit SINGLE funktioniert es nicht
	stSql = "UPDATE ""RechPosten"" SET ""EPreis"" = " + sNetto + " WHERE ""RechNr"" = '" + stRechNr + "' and ""ID"" = " + iID 

	oSQL_Anweisung.executeUpdate(stSql)

	oSubForm2.reload
Gruß acco