automatisches speichern Makro mit Fehler

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

Moderator: Moderatoren

rudi1978
*
Beiträge: 17
Registriert: So, 12.08.2012 20:17

automatisches speichern Makro mit Fehler

Beitrag von rudi1978 »

Hi,

ich habe ein Makro was meine Tabelle automatisch aller xx Minuten unter den gleichen Dateinamen speichern.
Das Makro rufe ich über einen Button auf.

Nun zu meinem Fehler:
Immer wenn ich ein zweites mal auf den Button drücke bleibt meine Tabelle stehen und ich kann sie nur noch über den Taskmanager beenden.

Könnt ihr mir helfen und sagen was ich an meinem Makro ändern muss.


DANKE

Sub autosave()
intervall = intervall*300000
stop_value = 0
aktDoc = Thiscomponent.URL
wird_schon_gesichert = 1
gesichertes_dokument = Thiscomponent
oEvents = gesichertes_dokument.getEvents()
Dim oProps(1) As New com.sun.star.beans.PropertyValue
oProps(0).Name = "EventType"
oProps(1).Name = "Script"
oProps(0).Value = "Script"
oProps(1).Value = "vnd.sun.star.script:Autosichern.Module1.MyDoc_notifyClosing?language=Basic&location=application"
oEvents.replaceByName("OnPrepareUnload",oProps)

tmp_zeit = 0

Do
Wait 300000
If stop_value = 1 Then
Exit Sub
End If
tmp_zeit = tmp_zeit + 300000
If tmp_zeit >= intervall Then
gesichertes_dokument.Store
tmp_zeit = 0
End If
Loop
End Sub
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: automatisches speichern Makro mit Fehler

Beitrag von Stephan »

Könnt ihr mir helfen und sagen was ich an meinem Makro ändern muss.
Ohne mir genau die Einzelheiten angeschaut zu haben, wäre es wohl zuallerserst wichtig den Doppelstart zu verhindern, indem das Makro bei erstmaligem Aufruf die Schaltfläche deaktiviert oder im Makro eine Variable frühestmöglich das Verlassen des Makros auslöst wenn das Makro bereits einmal gestartet wurde, sofern hierfür im Makro die Variable "stop_value" gedacht ist, gehört:

Code: Alles auswählen

If stop_value = 1 Then
Exit Sub
End If
auf jeden Fall an den Anfang, genauer gesagt müßte es dann heißen:

Code: Alles auswählen

If stop_value = 1 Then
  stop_value = 0
  Exit Sub
 Else
  stop_value = 1
End If
wobei stop_value mit genügendem Gültigkeitsbereich deklariert sein müßte.



GRuß
Stephan
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: automatisches speichern Makro mit Fehler

Beitrag von juetho »

Ich habe mich mit deinem Code nicht genauer befasst, weil ich mit diesem Arbeitsablauf nichts anfangen kann. Ich wundere mich aber über diese Anweisung:
rudi1978 hat geschrieben:intervall = intervall*300000
intervall scheint eine globale Variable zu sein. mit der in der Schleife die Wartezeit gesteuert wird. Dann sind es beim ersten Aufruf (abhängig vom Vorgabewert) 300.000 Zeiteinheiten und beim zweiten Aufruf 9*10^10 Zeiteinheiten (ich habe jetzt nicht gesucht, ob es sich um Millisekunden oder was sonst handelt). Es ist deshalb kein Wunder, dass das Makro den gesamten Arbeitsablauf aufhält. Oder verstehe ich die Funktionalität völlig falsch?

Nebenbei: Es gibt die schöne Schaltfläche Code. Wenn du den Code-Auszug markierst und damit kennzeichnest, bleiben auch Einrückungen erhalten; der Code ist insgesamt deutlich besser lesbar; das kannst du durch "Ändern" auch nachträglich erledigen. Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
rudi1978
*
Beiträge: 17
Registriert: So, 12.08.2012 20:17

Re: automatisches speichern Makro mit Fehler

Beitrag von rudi1978 »

Hi,

ich habe das ganze nun so gelöst....


sub Speichervorgang

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 ----------------------------------------------------------------------

REM Beginne die Schleife

Do
REM 1000 Millisekunden= 1 Sekunde * 60 Sekunden = 1 Minute * 10 = 10 Minuten (600000 Millisekunden)
wait 500000
REM speichere die Datei
dispatcher.executeDispatch(document, ".uno:Save", "", 0, Array()) REM dieser Befehl führt das Speichern aus.
Loop until kontrolle <> 0
end sub


Alles funktioniert super mit nur zwei Ausnahmen.

1: Wenn die Tabelle geschlossen wird bleibt sie 8Minuten als geöffnet (.~lock.139.ods#) stehen und danach kommt eine Fehlermeldung
2: Wenn das Skript zwei mal gestartet wird hängt sich die Tabelle auf.

Habt ihr dazu eine Lösung?

Danke :)
HHTiger
**
Beiträge: 27
Registriert: Di, 18.12.2012 15:57

Re: automatisches speichern Makro mit Fehler

Beitrag von HHTiger »

Hallo rudi1978,

zunächst solltest Du wohl die gut gemeinten Ratschläge von Stephan und juetho beherzigen! :wink: Bisher ist nichts davon zu erkennen. :(

Gruss Klaus
ich verwende OpenOffice 3.1.4 auf Windows 7 Ultimate
Antworten