Verstrichene Zeit

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

Moderator: Moderatoren

mumpel
****
Beiträge: 133
Registriert: So, 22.08.2004 05:27
Wohnort: Lindau (B)
Kontaktdaten:

Re: Verstrichene Zeit

Beitrag von mumpel »

turtle47 hat geschrieben:
Bei Dir sind es ja schon 3 Subs die parallel laufen sollen.
1. Sub Timer.
2. Sub ProgressBar
3. Sub Einfärben
Nicht ganz. Sub Einfaerben wird doch nur einmal zum Öffnen des Dialogs ausgeführt. Wenn der Dialog geöffnet wurde, ist diese Sub doch schon beendet. Also sind es zwei Prozeduren. Mir ist natürlich bekannt, dass immer nur eine Prozedur laufen kann (ist in MSO nicht anders). Die nächste Sub startet erst mit einem Klick auf die Schaltfläche. Die Progressbar selber ist in dem "Färbemakro" eingebaut. Das funktioniert auch fehlerfrei. Jetzt wollte ich eigentlich noch eine Zeitanzeige zusätzlich zur Prozentanzeige, auch wenn es nicht zwingend erforderlich ist. Ich habe schon befürchtet, dass das nicht möglich oder zumindest sehr schwierig umzusetzen ist.

Hier die Datei, um welche es geht: Arbeitszeitberechnung_ODS

Windows 7 Home Premium (auf Acer Desktop PC)
Windows 8 Professional (auf Microsoft Surface Pro 3).
MSO 365 Home Premium
LibreOffice 4.2.
F-Secure Internet Security
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Verstrichene Zeit

Beitrag von Stephan »

Dann hat derjenige, der das Beispiel in der Onlinehilfe erstellt hat da was nicht mitbekommen denn
der Beispielcode hat einen gravierenden Fehler.
Tschuldigung, nur ganz offensichtlich reden wir über völlig unterschiedliche Dinge.
Ich bezog mich darauf das Kenntnisse über Timer oder StarBasic nicht nötg sind wenn wenn über grundlegende Programmierkenntnisse (z.B. in VBA) verfügt und die aufgabe heißt aus einer beliebig erzeugten Ganzzahl (Timer liefert eine solche, sie kann aber genausogut aus einer Tabellenzelle, oder aus manueller Eingabe poder... stammen) den durc h 60 teilbaren Teil zu ermitteln und vom Rest abzutennen.
Sofern die Ganzzahl nicht größer ist wie 3600 (entspricht dem Gewünschten das René sagte ein Makro würde nur Minuten und Sekundenanzeige brauchen) geht das z,B, so, egal ob die Zahl von Timer stammt:

Code: Alles auswählen

'beliebige Ganzzahl:
x = 1234

r = x Mod 60
y = (x - r)/60

Msgbox y & " Minuten und " &  r & " Sekunden"
Beim Überschreiten der 30-Sekundenmarke wird bei >Timer> einfach eine Minute hinzugezählt.
das kann ich nicht nachvollziehen, wenn ich nun bereits zum zweiten Mal in diesem Tread darauf verweise das die Rückgabe von Timer an eine Variable erfolgen sollte die vorher als Long deklariert wurde.
Zum bequemen Ausprobieren ändere einfach das eine der Makros Deiner Beispieldatei wie folgt:

Code: Alles auswählen

Sub MyTimer
myctrl = myDlg.getControl("Label1")	
Dim a2 As long
	a2 = Timer
	myStatus = 0
	While True

	myctrl.Text = "Verstrichene Zeit: " & Timer-a2

	if MyStatus = 1 Then
	goto Ende
	End if
	wait 1000
	Wend
	Ende:
	myDlg.endexecute
end sub
und die SEkunden werden als einfache Zahl fortlaufend hochgezählt, ich zumindest sehe keinen Sprung beim .


Das hingegen Time und Timer die gleiche Rückgabe liefern davon war nirgens die Rede, auch:
(Jürgen machts jetzt etwas anders indem er Time statt Timer verwendet)
sagt das nicht, sondern sollte nur kennzeichnen das ich mir das Ganze angeschaut hatte und mitbekommen das Du Timer nicht verwendest.


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

Re: Verstrichene Zeit

Beitrag von turtle47 »

Den Startbutton zu Einfärben würde ich nach dem Start auch deaktivieren. Denn wenn man diese mittendrinn nochmals betätigt fängt das Einfärben wiede von vorne an!

Vor der "lbrZeiten" steht einer und sagt "Hier kommst Du net rein" :lol:
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
mumpel
****
Beiträge: 133
Registriert: So, 22.08.2004 05:27
Wohnort: Lindau (B)
Kontaktdaten:

Re: Verstrichene Zeit

Beitrag von mumpel »

turtle47 hat geschrieben: Vor der "lbrZeiten" steht einer und sagt "Hier kommst Du net rein" :lol:
PN unterwegs. Kennwort bitte geheimhalten!

Windows 7 Home Premium (auf Acer Desktop PC)
Windows 8 Professional (auf Microsoft Surface Pro 3).
MSO 365 Home Premium
LibreOffice 4.2.
F-Secure Internet Security
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Verstrichene Zeit

Beitrag von Stephan »

Ich habe schon befürchtet, dass das nicht möglich oder zumindest sehr schwierig umzusetzen ist.[/[uote]
Es ist schlicht eine Frage der gewünschten Genauigkeit, wenns nicht milisekundengenau sein muß reicht es doch Timer bei jedem Schleifendurchlauf einmalig aufzurufen.
Da Du sinnigerweise hier eine Datei mit geschütztem Code hochlädtst habe ich eine Demo in Jürgens Datei eingebaut.


Gruß
Stephan
Dateianhänge
Timer_II.ods
(10.72 KiB) 103-mal heruntergeladen
mumpel
****
Beiträge: 133
Registriert: So, 22.08.2004 05:27
Wohnort: Lindau (B)
Kontaktdaten:

Re: Verstrichene Zeit

Beitrag von mumpel »

Mit einer Schleife funktioniert es. Da ich aber zwei separate Schleifen habe, muss ich versuchen, die Zeiten für beide Schleifen in ein Label zu bringen. Vielleicht durch addieren der Zeiten am Ende des Makros?

Windows 7 Home Premium (auf Acer Desktop PC)
Windows 8 Professional (auf Microsoft Surface Pro 3).
MSO 365 Home Premium
LibreOffice 4.2.
F-Secure Internet Security
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Verstrichene Zeit

Beitrag von Stephan »

Vielleicht durch addieren der Zeiten am Ende des Makros?
Es wird in meinem Beispiel einmal der momentane Zeitwert ermittelt und a2 zugewiesen restliche Werte sind immer die Differenz zu a2, auch in 2 Schleifen.




Gruß
Stephan
Dateianhänge
Arbeitszeitberechnung_ODS-a.ods
(338.04 KiB) 95-mal heruntergeladen
mumpel
****
Beiträge: 133
Registriert: So, 22.08.2004 05:27
Wohnort: Lindau (B)
Kontaktdaten:

Re: Verstrichene Zeit

Beitrag von mumpel »

Mir ist gerade eingefallen, dass ich eine Schleife zuviel habe. Ich prüfe in zwei Schleifen jeweils eine Spalte. Das ist aber unsinnig. Wenn das Datum in Spalte B stimmt, dann stimmt es auch in Spalte AC, da beide Spalten im Inhalt identisch sind und auch jeweils in der selben Zeile stehen. Also genügt es doch, wenn ich nur die Spalte B prüfe und bei Übereinstimmung Spalte B und Spalte AC gleichzeit einfärbe. Da habe ich mir wieder zuviel Arbeit gemacht.

Windows 7 Home Premium (auf Acer Desktop PC)
Windows 8 Professional (auf Microsoft Surface Pro 3).
MSO 365 Home Premium
LibreOffice 4.2.
F-Secure Internet Security
mumpel
****
Beiträge: 133
Registriert: So, 22.08.2004 05:27
Wohnort: Lindau (B)
Kontaktdaten:

Re: Verstrichene Zeit

Beitrag von mumpel »

Problem gelöst. Habe jetzt beide Schleifen zusammengeführt. Somit ist nur noch eine Schleife vorhanden. Damit läuft das Makro zwar auch nicht schneller, aber man braucht es in der Regel ohnehin nur einmal im Jahr (am Jahresanfang). Danke nochmal an alle Helfer!

Windows 7 Home Premium (auf Acer Desktop PC)
Windows 8 Professional (auf Microsoft Surface Pro 3).
MSO 365 Home Premium
LibreOffice 4.2.
F-Secure Internet Security
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Verstrichene Zeit

Beitrag von Stephan »

Damit läuft das Makro zwar auch nicht schneller,[
Damit Dein Makro schneller läuft mußt Du versuchen den Code optimieren, beispielsweise ist es in Calc, im Vergleich zu Excel, absolut zeitfressend direkt durch Tabellenzellen zu interieren, diese sollten möglichst erst in ein Array gelesen werden.

Zur Verdeutlichung 2 kurze Beispiele, die beide dassselbe tun, wobei das schnelle Makro <1 Sekunde braucht, das langsame hingegen 16 Sekunden.

Code: Alles auswählen

Sub langsam()
For i = 1 To 10000
	ThisComponent.Sheets().getByIndex(0).getCellRangeByName("A"&i).Value = i
Next i
End Sub

Code: Alles auswählen

Sub schnell()
x = ThisComponent.Sheets().getByIndex(0).getCellRangeByName("A1:A10000")
Dim daten()
Dim z()
daten() = x.getDataArray()
For i = LBound(daten()) To UBound(daten())
	z() = daten(i)
	For j = LBound(z()) To UBound(z())
		z(j) = i
	Next
Next
x.setDataArray(daten())
End Sub

In diese Dinge mußt Du Dich einfach einmal einarbeiten, beispielsweise das Dokument von Pitonyak enthält Code zu get/set DataArray. Ingesamt gehört natürlich zur Codeoptimierung auch immer etwas Erfahrung.
So große Zeiteinsparungen wie oben kriegst Du nicht immer aber bei halbwegs komplexen Calc-Tabellen ist eine Beschleunigung um Faktor 6-8 meist drin.



Gruß
Stephan
mumpel
****
Beiträge: 133
Registriert: So, 22.08.2004 05:27
Wohnort: Lindau (B)
Kontaktdaten:

Re: Verstrichene Zeit

Beitrag von mumpel »

Danke für den Hinweis. Darüber kümmere ich mich zu gegebener Zeit. Jetzt muss ich erst einmal ein Konzept erstellen, um ein paar Wünsche von Anwendern einbauen zu können. Es soll möglich sein, für unterschiedliche Tageszeiten auch unterschiedliche Löhne berechnen zu können. Ist ja nicht schwehr, aber dauert eben.

Windows 7 Home Premium (auf Acer Desktop PC)
Windows 8 Professional (auf Microsoft Surface Pro 3).
MSO 365 Home Premium
LibreOffice 4.2.
F-Secure Internet Security
Antworten