[gelöst] Man. Abbrechen von Batch-Jobs - Wie ermöglichen?

5. November 2009 09:47

Hallo Allerseits,

brauche mal wieder Tipps von Euch, diesmal zum Thema Batch-Verarbeitung, bei der ich eine Möglichkeit haben will, den Batch-Job durch den Benutzer ggf. abzubrechen.

Gegeben sei eine Tabelle mit etlichen Datensätzen. Diese Tabelle wird von oben nach unten abgearbeitet. Für jeden Datensatz wird hintereinander ein komplexerer Prozess angestoßen. Ist die Tabelle abgearbeitet, dann sind alle glücklich.

Nun mag es sein, daß dem Anwender die Abarbeitung der Tabelle zu lange dauert, und er soll die Möglichkeit haben, einen Abbruch-Button zu klicken, durch den der "Loop" unterbrochen wird.

In den Loop habe ich einen Dialog implementiert, der mir einen Verlaufsbalken anzeigt (analog des Tipps von MichaelSchumacher in den Navision24-Tutorials)

Das bekomme ich leider nicht hin. Starte ich meinen Job, dann bekomme ich die weiße Sanduhr, und das Progrämmle läßt sich hartnäckig nicht ansprechen, bis es denn den Job bis zum bitteren Ende abgearbeitet hat.

Bisherige Vorgehensweise:

-----------------------------------

Start erfolgt über einen Button in einer Form.

Eine Funktion in einer CU wird aufgerufen.

In der Funktion wird ein Record auf die abzuarbeitenden Datensätze gefiltert (Reset, Setrange, Findfirst).

OpenDialog

REPEAT

UpdateDialog

Für jeden Datensatz wird eine Unterfunktion in einer anderen CU aufgerufen. Da passiert ganz viel, das ich jetzt erstmal als Blck-Box auffasse.

Commit; //Damit diese Daten schonmal geschrieben sind, egal, was mit dem Batch weiter passiert

Until Record.Next = 0;

CloseDialog

Ende der Funktion

-----------------------------------

Starte ich jetzt über meinen Form-Button den Prozess, läuft alles ganz prima - nur kann ich den Job nicht unterbrechen.

2. Versuch: Ein Yield nach meinem Commit. Nützt nix.
3. Versuch: Ein Sleep(200) nach meinem Commit. Ganz übel. Das System stürzt gänzlich ab.

4. Versuch: Ich mache den Loop gar nicht über die CU, sondern verwende, jetzt in noch näherer Analogie zum MichaelSchumacher-Tipp im Navision24-Tutorial, einen Report, über den ich dann meine untergeodneten Funktionen aufrufe, und lasse den Report ansonsten meine Ausgangstabelle abarbeiten. Nützt leider auch nix.

Hat irgendjemand eine Idee?

Viele Grüße,

SafetyFirst
Zuletzt geändert von SafetyFirst am 11. November 2009 14:29, insgesamt 1-mal geändert.

Re: Manuelles Abbrechen von Batch-Jobs - Wie ermöglichen?

5. November 2009 10:15

Hallo SafetyFirst,

Das mit dem Report scheint mir allerdings die beste Lösung zu sein. Den kann man zwar meistens nicht mit dem Abbrechen-Button beenden, wohl aber mit der ESC-Taste :mrgreen:

Ob du nach jedem Datensatz ein COMMIT machst, hängt ein wenig von deiner Datenstruktur, es beschleunigt das ganze aber nicht unbedingt, genauso die Dialogbox, die sollte bei einer großen Anzahl Datensätzen auch nur bei jedem 100en- Datensatz erfolgen.

Gruß, Fiddi

Re: Manuelles Abbrechen von Batch-Jobs - Wie ermöglichen?

5. November 2009 10:18

Das Problem ist, dass der Abbrechen-Button des Dialogfenster nur dann funktioniert, wenn das UPDATE durchgeführt wird.

Nehmen wir also mal an, dass man nach dem UPDATE ein Zeitfenster von 0,5 Sek. hat.
In dieser Zeit reagiert NAV also auf den Klick auf Abbrechen.
Anschließend wird die normale Verarbeitung fortgeführt.
Nehmen wir hier mal an, diese benötigt für einen Durchlauf der Schleife 2 Sek.
In dieser Zeit reagiert NAV nicht auf Klicks.

Somit bleibt dir nur ein Zeitfenster von 0,5 Sek. pro 2,5 Sek.

Lösung: Klicke einfach mehrmals auf Abbrechen, bis du das Zeitfenster erwischt :wink:

Re: Manuelles Abbrechen von Batch-Jobs - Wie ermöglichen?

5. November 2009 12:58

Hallo Allerseits,

schon einmal vielen Dank für die Antworten - leider retten sie mir noch nicht den Tag... :-?

a) Mein Report läßt sich auch nicht mit Esc abbrechen.
b) Der geschwindigkeitsbestimmende Schritt ist der komplexe Prozess; dagegen fällt das Update für den Dialog nicht wirklich mehr ins Gewicht.

c) Genau b) ist da wohl das Problem, denn das Verhältnis, das Timo beschreibt, ist bei mir noch ungünstiger.

Hmmm - ob es wohl was bringt, wenn ich mit einer Schleife einfach das Update ein paar mal mehr durchlaufe? Das widerspricht aber zwar arg meinem ästhetischen Empfinden, aber zur Not frisst der Teufel Fliegen....

Ich werde berichten.

Das Yield und das Sleep bringen also in diesem Zusammenhang gar nix, richtig?

Danke Euch schon mal,

SafetyFirst.

Re: Manuelles Abbrechen von Batch-Jobs - Wie ermöglichen?

5. November 2009 13:28

ESC funktioniert nur, wenn er im Report läuft, wenn dein Code natürlich den Größten Teil der Bearbeitungszeit frisst, hilft das auch nicht.
Sleep hilft nur nach dem Commit aber vor der nächsten DB- Transaktion, damit andere auch mal dürfen.
Yield ist, glaube ich, nur noch aus Kompatibilitäts- Gründen drin, und hat nur unter Win98 und kleiner eine Wirkung.

Gruß, Fiddi

Re: Manuelles Abbrechen von Batch-Jobs - Wie ermöglichen?

5. November 2009 13:50

Hallo Fiddi,

danke für die Infos.

Baue ich das Sleep ein, dann nimmt sich mein Client leider direkt den Strick und steigt auf die harte Tour aus.

Ich habe jetzt mal eine For-i-Schleife um meinen Dialog.Update gelegt, die von 1 bis 1000 zählt. Dadurch kann ich tatsächlich das "Abbrechen " treffen, und die Verzögerung macht mir den Kohl bei meinem Batch auch nicht mehr fett.

Aber: Die Verzögerung wird so wohl abhängig sein vom Rechner, auf dem der Loop läuft, oder? Gibt es da irgendeine elegante Form der Realisierung? Mein Workaround funktioniert zwar - aber irgendwie sieht das doof aus....

Viele Grüße,

H.H.

Re: Manuelles Abbrechen von Batch-Jobs - Wie ermöglichen?

5. November 2009 14:59

Nur mal so ins blaue getippt, aber vielleicht hilft ja folgender Ansatz:

1.) Bau den Fortschrittsdialog als Form nach mit Abbrechen-Button, der nur eine boolsche Variable - nennen wir sie einfach CANCELED - auf TRUE setzt.
2.) Die Form bekommt alle wichtigen Funktionen, wie UPDATE, IsCanceled etc.
3.) Im Report rufst du die Form auf und sagst vor jedem UPDATE noch schnell:
Code:
IF frmDialog.IsCanceled THEN ERROR('');


Mit etwas Glück schaffst du es, die Form im Vordergrund zu halten und mit noch etwas mehr Glück ist der Abbrechen-Button sogar ansprechbar.

Ich hab grad keine Zeit, sowas mal testweise zu basteln, aber vielleicht hast du ja saumäßiges Glück und es funktioniert.

Beste Grüße
Falk

Re: Manuelles Abbrechen von Batch-Jobs - Wie ermöglichen?

5. November 2009 18:05

Hmmmm, ich fürchte, da reichen meine Programmierkenntnisse noch nicht, um dies nachzuvollziehen.

Die Form versuche ich zu starten mit Formvariable.RUN oder mit Formvariable.RUNMODAL(dann bleibt der Code stehen und wartet auf eine Benutzer-Eingabe, was auch wieder nicht erwünscht ist); ist aber egal, denn wenn ich alsbald im Loop versuche, die "Update-Funktion" in der Form anzusprechen, meckert das Programm, die Form sei nicht offen.

Vielleicht wäre das Problem mit einer Zeitreise-Funktion zu lösen: Das Programm guckt in die Zukunft, bei welchem Datensatz der Benutzer den Job wird abbrechen wollen, und dann prüfe ich in der Gegegwart ab, ob ich im Loop den Datensatz schon erreicht habe.... 8-)

Dank Euch allen aber für die wertvollen Tipps.

Bis später,

SafetyFirst