Seite 1 von 1

Laufzeitfehler bei von OO übernommenem Script

Verfasst: Mi 3. Mai 2017, 12:28
von holdrio76
Hallo Zusammen,

ich habe unter OpenOffice einen Fahrtkostenrechner erstellt, welcher unter Libre ständig Fehler bei der Ausführung der Scripte bringt. Einige habe ich schon bereinigen können. Im Moment komme ich jedoch nicht weiter.

Das Script tauscht Daten mit einer Maske zur Erfassung der Fahrten aus. Hauptsächlich bei Datum/Zeitwerten wird der Fehler "Falscher Wert für Eigenschaft" angezeigt.

Bsp: Beim Script AddSatzFahrt erscheint dieser Fehler, obwohl in der Maske ein Datum im Formant TT/MM/JJJJ eingegeben ist und in der Maskendefinition dem Feld ebenfalls dieser Wert zugeordnet ist.

Ich steh glaub grad auf dem Schlauch.

Code: Alles auswählen

REM  *****  BASIC  *****
REM ****************************************************************************
Rem *** Fahrtkostenabrechnung								 ***
Rem ***	Version 1.1     													 ***
Rem *** Programmiert durch Holger Merkle									 ***
Rem *** Fertigstellung:  03.01.2013											 ***
Rem ****************************************************************************


Dim eM1 as Object	'Eingabemaske
Dim myDoc as Object	'das aktuelle Dokument
Dim oT1 as Object, oT2 as Object, oT3 as Object, oT4 as Object	'die Datenblätter 2, 3, 4 und 5
Dim nNeuerDatensatzKilometer as integer 'fortlaufende Nummer eingetragene km
Dim nNeuerDatensatzBeleg as integer		'fortlaufende Nummer eingetragene Belege
Dim dZeitCh as date    'Zeitspanne bei Änderung 
Dim dZeitAnk as date   'Differenz bei automatischer Ankunftszeit
'---------

'---------
Sub Main
REM grundsätzliche Zuweisungen
	myDoc = thisComponent
	oT1 = myDoc.sheets(1)
	oT2 = myDoc.sheets(2)
	oT3 = myDoc.sheets(3) 
	oT4 = myDoc.sheets(4)
REM Eingabeaske initialisieren
	DialogLibraries.LoadLibrary("Standard")
	eM1 = CreateUnoDialog( DialogLibraries.Standard.Maske )
	initMaske
	eM1.Execute()
End Sub

Sub initMaske
REM Maske initialisieren (aus Sub Main gestartet)
REM Hier alle Felder für die Fahrtabrechnung
REM Neue Zeilennummer
	nNeuerDatensatzKilometer = oT4.getCellRangeByName("b1").value+3
REM Zeitspanne eintragen
	dZeitCH = oT4.getCellRangeByName("b9").value
REM Zietdifferenz eintragen	
	dZeitAnk = oT4.getCellRangeByName("b10").value
REM Datensaztnummer Fahrt eintragen
	eM1.getcontrol("lfdNr").text = nNeuerDatensatzKilometer -2
REM Letzte Fahrt (lF) eintragen
	eM1.getcontrol("lfdNrHis").value = oT2.getCellRangeByName("A"&nNeuerDatensatzKilometer-1).value
REM lF Datum
	eM1.getcontrol("DatumHis").text = oT2.getCellRangeByName("C"&nNeuerDatensatzKilometer-1).string
REM lF Grund
	eM1.getcontrol("GrundHis").text = oT2.getCellRangeByName("B"&nNeuerDatensatzKilometer-1).string
	REM lf Gefahrene km
	eM1.getcontrol("kmHis").value = oT2.getCellRangeByName("I"&nNeuerDatensatzKilometer-1).value
REM Dropdownlisten füllen
	FuellListe("Grund","e",2,20)
	FuellListe("Abfahrt","g",2,20)
	FuellListe("Ziel","i",2,20)			
REM Felder leeren
	heute
	eM1.getControl("Grund").text=""
	eM1.getControl("Abfahrt").text=""
	eM1.getControl("Ziel").text=""
	eM1.getControl("km").text=""
	eM1.getControl("Beginn").text=""
	eM1.getControl("Ende").text=""
REM Hier alle Felder für die Belegabrechnung
REM Neue Zeilennummer
	nNeuerDatensatzBeleg = oT4.getCellRangeByName("b2").value+3
REM Datensaztnummer Fahrt eintragen
	eM1.getcontrol("lfdNrBeleg").text = nNeuerDatensatzBeleg -2
REM den letzten Beleg (lB) eintragen
REM lB laufende Nummer
	eM1.getcontrol("lfdNrBelegHis").value = oT3.getCellRangeByName("A"&nNeuerDatensatzBeleg-1).value
REM lF Datum
	eM1.getcontrol("Datum3His").text = oT3.getCellRangeByName("B"&nNeuerDatensatzBeleg-1).string
REM lF Grund
	eM1.getcontrol("BelegHis").text = oT3.getCellRangeByName("C"&nNeuerDatensatzBeleg-1).string
	REM lf Gefahrene km
	eM1.getcontrol("BetragHis").value = oT3.getCellRangeByName("D"&nNeuerDatensatzBeleg-1).value
REM Dropdownlisten füllen
	FuellListe("Belege","l",2,20)
	FuellListe("MwSt","p",2,3)
REM Felder leeren	
	eM1.getControl("Belege").text=""
	eM1.getControl("Betrag").text=""
	eM1.getControl("MwSt").text=""
End Sub
REM Datumsfelder mit aktuellem Datum befüllen
Sub Heute
	Dim dh as Date
	dh = date
	eM1.getControl("Datum1").date=CDateToUnoDate(dh)
	eM1.getControl("Datum2").date=CDateToUnoDate(dh)
	eM1.getControl("Datum3").date=CDateToUnoDate(dh)
REM	Fokus in erstes Datumsfeld setzten
	eM1.getcontrol("Datum1").setFocus
end Sub

REM Füllen der Dropdownfelder in der Eingabemaske mit den Werten aus der Tabelle Daten
Sub FuellListe(Liste, spalte, zeile, eNr)
	FFeld=eM1.getControl(Liste)
	FFeld.removeitems(0, eNr)
	for i=0 to eNr
		adr="$"+spalte+"$"+(i+zeile)
		inhalt=oT4.getCellRangeByName(adr).string
		FFeld.additem(inhalt,i)
	next
	FFeld.additem("",0)
End Sub

REM Button Zeit + Abfahrt
Sub ZeitPlusAbf
	Dim dStd as long
	dStd = eM1.getcontrol("Beginn").time
	if dStd = 0 then
		dStd = 08000000
	end if 
	dStd = ZeitAnd(dStd, 1)
	eM1.getcontrol("Beginn").time = dStd
	eM1.getcontrol("Beginn").setFocus()
end Sub
REM Button Zeit - Abfahrt
Sub ZeitMinusAbf
	Dim dStd as long
	dStd = eM1.getcontrol("Beginn").time
	if dStd = 0 then
		dStd = 08000000
	end if 
	dStd = ZeitAnd(dStd, -1)
	eM1.getcontrol("Beginn").time = dStd
	eM1.getcontrol("Beginn").setFocus()
end Sub
REM Button Zeit + Ankunft
Sub ZeitPlusAnk
	Dim dStd as long
	dStd = eM1.getcontrol("Ende").time
	if dStd = 0 then
		dStd = 18000000
	end if 
	dStd = ZeitAnd(dStd, 1)
	eM1.getcontrol("Ende").time = dStd
	eM1.getcontrol("Ende").setFocus()
end Sub
REM Button Zeit - Abfahrt
Sub ZeitMinusAnk
	Dim dStd as long
	dStd = eM1.getcontrol("Ende").time
	if dStd = 0 then
		dStd = 18000000
	end if 
	dStd = ZeitAnd(dStd, -1)
	eM1.getcontrol("Ende").time = dStd
	eM1.getcontrol("Ende").setFocus()
end Sub

REM DatenbankbereichKilometer neu festlegen (Tabelle Fahrten ab A3 ... muss nach jedem Eintrag einer Autofahrt vergrößert werden)
Sub DatenBereichKilometer
	Dim aPos1 as new com.sun.star.table.CellAddress
	oBereich = ThisComponent.NamedRanges
	oBereich.removebyname("Datenbank")
	obereich.addNewbyName("Datenbank","$Fahrten.$A$2:$J$"&nNeuerDatensatzKilometer,aPos1,0)
end Sub

REM DatenbankbereichBeleg neu festlegen (Tabelle Belege ab A2 ... muss nach jedem Eintrag eines Beleges vergrößert werden)
Sub DatenBereichBeleg
	Dim aPos2 as new com.sun.star.table.CellAddress
	oBereich = ThisComponent.NamedRanges
	oBereich.removebyname("Belege")
	obereich.addNewbyName("Belege","$Belege.$A$2:$N$"&nNeuerDatensatzBeleg,aPos2,0)
end Sub

REM Datenadresse des neuen Datensatzes Fahrt bestimmen
function dat_adrF(sp)
	zeile1 = nNeuerDatensatzKilometer
	dat_adrF="$"+sp+"$"&zeile1
end function

REM Datenadresse des neuen Datensatzes Beleg bestimmen
function dat_adrB(sp)
	zeile2 = nNeuerDatensatzBeleg
	dat_adrB="$"+sp+"$"&zeile2
end function
REM Zeit korrekt verarbeiten
function ZWertF(Zeit as string)
	Dim ZeitF as long
	ZeitF= left(Zeit, 2)& Mid(Zeit, 4, 2) & Mid(Zeit, 7,2) & "00"
	zWertF=ZeitF
end Function
REM Zeit korrekt verarbeiten
function ZWert(ZDat)
	if ZDat = 0 then
		zDat = 100
	end if
	sZDat=Format(ZDat,"00000000")
	ZWert=left(sZDat,2)&":"&Mid(sZDat,3,2)&":"&Mid(sZDat,5,2)
end function

function ZeitAnd(zeit, vorz)
	Dim sT1 as date
    sT1 = Timevalue(ZWert(zeit))
	sT1 = sT1+(vorz * dZeitCH)
	ZeitAnd=zWertF(sT1)
end function

REM Button Fahrt Hinzufügen mit Funktion versehen
REM erts Fehlerkontrolle
sub AddSatzFahrt
	if eM1.getControl("Datum1").date=0 then
		msgbox "Das Abfahrtsdatum muss eingegeben werden!"
		eM1.getControl("Datum1").setFocus()
	elseif eM1.getControl("Beginn").time=0 then
		msgbox "Die Abfahrtszeit muss eingegeben werden!"
		eM1.getControl("Beginn").setFocus()
	elseif eM1.getControl("Datum2").date=0 then
		msgbox "Das Ankunftsdatumatum muss eingegeben werden!"
		eM1.getControl("Datum2").setFocus()
	elseif eM1.getControl("Ende").time=0 then
		msgbox "Die Ankunftszeit muss eingegeben werden!"
		eM1.getControl("Ende").setFocus()
	elseif eM1.getControl("Grund").text="" then
		msgbox "Der Fahrtgrund muss eingetragen werden!"
		eM1.getControl("Grund").setFocus()
	elseif eM1.getControl("Abfahrt").text="" then
		msgbox "Der Abfahrtsort muss eingegeben werden!"
		eM1.getControl("Abfahrt").setFocus()
	elseif eM1.getControl("Ziel").text="" then
		msgbox "Der Zielort muss eingegeben werden!"
		eM1.getControl("Ziel").setFocus
	elseif eM1.getControl("km").value=0 then
		msgbox "Die gefahrenen Kilometer müssen eingetragen werden!"
		eM1.getControl("km").setFocus()
	else
		SatzSpeichernFahrt
	end if
end Sub


REM Die eingegebenen Daten werden in die Tabelle eingetragen
Sub SatzSpeichernFahrt
REM geschützten Tabellenbereich zur Änderung freigeben
	oT4.unprotect("qrx-10")
REM Datum eintragen
	fd1 = eM1.getcontrol("Datum1").date
	ad=dat_adrF("c")
	oT2.getCellRangeByName(ad).value=CDateFromIso(fd1)
	fd2 = eM1.getcontrol("Datum2").date
	ad=dat_adrF("f")
	oT2.getCellRangeByName(ad).value=CDateFromIso(fd2)
REM Fortlaufende Nummer eintragen	
	ad=dat_adrF("a")
	oT2.getCellRangeByName(ad).value=nNeuerDatensatzKilometer-2
REM Beleg eintragen	
	gr = eM1.getcontrol("Grund").text
	ad=dat_adrF("b")
	oT2.getCellRangeByName(ad).string=gr
REM Betrag eintragen	
	abf = eM1.getcontrol("Abfahrt").text
	ad=dat_adrF("d")
	oT2.getCellRangeByName(ad).string=abf
REM Fahrtziel eintragen	
	ziel = eM1.getcontrol("Ziel").text
	ad=dat_adrF("g")
	oT2.getCellRangeByName(ad).string=ziel
REM Abfahrtszeit eintragen
	zAbf1 = ZWert(eM1.getControl("Beginn").time)
	ad=dat_adrF("e")
	oT2.getCellRangeByName(ad).value=TimeValue(zAbf1)
REM Ankunftszeit eintragen
	zAnk = ZWert(eM1.getControl("Ende").time)
	ad=dat_adrF("h")
	oT2.getCellRangeByName(ad).value=TimeValue(zAnk)
REM Gefahrene KM eintragen	
	kms = eM1.getcontrol("km").value
	ad=dat_adrF("i")
	oT2.getCellRangeByName(ad).value=kms
REM Dienstfahrt wg. Funktion DBSumme eintragen	
	adf = "Fahrt"
	ad=dat_adrF("j")
	oT2.getCellRangeByName(ad).string=adf
REM Zähler für fortlaufende Nummer erhöhen	
	nDatNr = oT4.getCellRangeByName("b1").value+1
	oT4.getCellRangeByNAme("b1").value=nDatNr
	DatenBereichKilometer
REM Tabellenbereich nach Änderung schützen
	oT4.protect("qrx-10")
REM Formular speicher
	myDoc.store()
REM Maske neu initialisieren
	initMaske	
End Sub

REM Button Beleg Hinzufügen mit Funktion versehen
REM erts Fehlerkontrolle
sub AddSatzBeleg
	if eM1.getControl("Belege").text=0 then
		msgbox "Die Belegart muss eingegeben werden!"
		eM1.getControl("Belege").setFocus()
	elseif eM1.getControl("Datum2").date="" then
		msgbox "Das Datum muss eingetragen werden!"
		eM1.getControl("Datum3").setFocus()
	elseif eM1.getControl("Betrag").text="" then
		msgbox "Der Betrag muss eingegeben werden!"
		eM1.getControl("Betrag").setFocus()
	elseif eM1.getControl("MwSt").text="" then
		msgbox "Der Mehrwertsteuersatz muss eingegeben werden!"
		eM1.getControl("MwSt").setFocus()
	else
		SatzSpeichernBeleg
	end if
end Sub

REM Die eingegebenen Daten werden in die Tabelle eingetragen
Sub SatzSpeichernBeleg
REM geschützten Tabellenbereich zur Änderung freigeben
	oT4.unprotect("q")
REM Datum eintragen
	fd3 = eM1.getcontrol("Datum3").date
	ad=dat_adrB("b")
	oT3.getCellRangeByName(ad).value=CDateFromIso(fd3)
REM Fortlaufende Nummer eintragen	
	ad=dat_adrB("a")
	oT3.getCellRangeByName(ad).value=nNeuerDatensatzBeleg-2
REM Fahrtgrund eintragen	
	gr = eM1.getcontrol("Belege").text
	ad=dat_adrB("c")
	oT3.getCellRangeByName(ad).string=gr
REM Abfahrtort eintragen	
	bet = eM1.getcontrol("Betrag").value
	ad=dat_adrB("d")
	oT3.getCellRangeByName(ad).value=bet
REM Mehrwertsteuer eintragen	
	mwst = eM1.getcontrol("MwSt").text
	ad=dat_adrB("e")
	oT3.getCellRangeByName(ad).string=mwst
REM Beleg wg. Funktion DBSumme eintragen	
	bl = "Beleg"
	ad=dat_adrB("f")
	oT3.getCellRangeByName(ad).string=bl
REM Zähler für fortlaufende Nummer erhöhen	
	nDatNrBeleg = oT4.getCellRangeByName("b2").value+1
	oT4.getCellRangeByNAme("b2").value=nDatNrBeleg
	DatenBereichBeleg
REM Tabellenbereich nach Änderung schützen
	oT4.protect("q")
REM Formular speicher
	myDoc.store()
REM Maske neu initialisieren
	initMaske	
End Sub

REM Prozedur abbrechen
Sub Abbrechen

	eM1.EndExecute()
	
End Sub


REM Rest ist noch ohne Funktion
Sub Daten_entfernen


myDoc = thisComponent
mySheet = myDoc.sheets(1)

mycell = mysheet.getCellRangeByName("B28:EndUp")
flag=com.sun.star.sheet.CellFlags.VALUE+com.sun.star.sheet.CellFlags.STRING+com.sun.star.sheet.CellFlags.DATETIME
mycell.clearcontents(flag)


	'oBereich.getControl("Datenbank","$Tabelle.B28:H28")
	'ThisComponent.sheets(0).getCellRangeByName(oBereich).clearContents(com.sun.star.sheet.CellFlags.value + com.sun.star.sheet.CellFlags.Datetime + com.sun.star.sheet.CellFlags.String)
	'flag = com.sun.star.sheet.CellFlags.VALUE+com.sun.star.sheet.CellFlags.STRING+com.sun.star.sheet.CellFlags.DATETIME
	'oBereich.clearcontents(flag)
end sub
Vielen Dank für Eure Unterstützung

Holger

Re: Laufzeitfehler bei von OO übernommenem Script

Verfasst: Do 4. Mai 2017, 10:50
von mikele
Hallo,
wie bereits weiter oben im Code müssen die .date Zuweisungen bearbeitet werden (sie sind unter LO ein Uno-Struct)
Also

Code: Alles auswählen

eM1.getControl("Datum1").date=0
funktioniert nicht. Soll hier wirklich das Nulldatum (also 30.12.1899) stehen?

Re: Laufzeitfehler bei von OO übernommenem Script

Verfasst: Fr 5. Mai 2017, 17:04
von holdrio76
Hallo Mikele,

vielen Dank für die Antwort.

Nein, natürlich soll da nicht das Nulldatum drin stehen, unter OO konnte man so prüfen ob das Feld leer ist und dann eine entsprechende Meldung ausgeben, dass ein Wert eingetragen werden muss.

Ich habe raus gefunden, dass ich bis auf eine unwesentlich Kleinigkeit das Problem so lösen kann, dass ich nicht mit Datums- und Zeitwerten arbeite, sondern mit .text.

Liebe Grüße
Holger

Re: Laufzeitfehler bei von OO übernommenem Script

Verfasst: Fr 5. Mai 2017, 20:34
von mikele
Hallo,
das Dilemma ist nur, dass die Eigenschaft .text nicht verändert wird, wenn das Datum per Makro (.date) gesetzt wird (wohl aber der angezeigte Wert) und anders herum, wenn die .text-Eigenschaft gesetzt wird, der sich Datumswert (inkl. angezeigter Wert) nicht ändert.
Um das Datumsfeld zu leeren kannst du:

Code: Alles auswählen

eM1.getControl("Datum1").date=void
Um zu testen, ob das Datumsfeld leer ist:

Code: Alles auswählen

If isempty(eM1.getControl("Datum1").date) ...