AtNotes Übersicht Willkommen Gast. Bitte einloggen oder registrieren.
20.08.19 - 11:44:13
Übersicht Hilfe Regeln Glossar Suche Einloggen Registrieren
News:
Schnellsuche:
+  Das Notes Forum
|-+  Lotus Notes / Domino 8
| |-+  ND8: Entwicklung (Moderatoren: Axel, Thomas Schulte, koehlerbv)
| | |-+  ExcelExport als Background Thread / Agent
« vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: ExcelExport als Background Thread / Agent  (Gelesen 631 mal)
booltrue
Frischling
*
Online Online

Beiträge: 42


« am: 18.07.19 - 10:17:34 »

Hallo,

ich habe eine ExcelExport Funktion, die durch einen Button getriggert wird.
Das möchte ich nun in einen Hintergrundthread / Agent verschieben,
der weiterhin von dem Button getriggert wird.

Was ich gemacht habe, ich habe die ExcelExport Funktion in einen Agent kopiert, der folgendermaßen konfiguriert ist:
- Auslöser "Ereignis"
- Auswahl im Menü 'Aktionen'
- Ziel 'Keine' (wenn hier etwas anderes gewählt wird, kommt ein Notes Fehler)
- Im Hintergrund-Client-Thread ausführen

Der Button ruft den Agent auf:
- mit Run funktioniert das auch, nur eben läuft das ganze nicht im Hintergrund
- rufe ich den Agent mit RunOnServer auf, passiert gar nichts
Gespeichert
Peter Klett
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 2601



« Antworten #1 am: 18.07.19 - 10:47:03 »

Hast Du Excel auf dem Server installiert?
Gespeichert
booltrue
Frischling
*
Online Online

Beiträge: 42


« Antworten #2 am: 18.07.19 - 10:55:47 »

Ah ok, nein.
Das läuft nur auf den Clients.
Excel muß für RunOnServer auf dem Server installiert sein?

Gibt es eine andere Möglichkeit?
Gespeichert
ronka
Aktives Mitglied
***
Offline Offline

Beiträge: 235


Was macht der hier denn, muß der überall sein ?


WWW
« Antworten #3 am: 18.07.19 - 11:22:42 »

Vielleicht solltest du mal überlegen was du selber mit "Hintergrund" meinst.

Ich nehme an das die Datei die exportiert wird LOKAL (oder auf ein netzlaufwerk in direkten zugriff des Users) Gespeichert werden muss, oder ?

Wenn ja, dann hast du keine andere wahl als es auch dort auszuführen.

wenn du mit "Hintergrund" meinst das der User weiter arbeiten kann ohne einschränkungen, dann brauchst du einen 2. Process (wie z.B. Excel) das dort alles ausführt. 
Gespeichert

das neueste von Domino 10 auf den AdminCamp in September -> www.AdminCamp.de
booltrue
Frischling
*
Online Online

Beiträge: 42


« Antworten #4 am: 18.07.19 - 11:28:44 »


User exportieren damit eine Auswahl des aktuell geöffneten Views.
ExportFunktion->Excel wird geöffnet->Daten werden in Excel geschrieben
Passiert alles lokal bei den Usern selber.

Beim Export wird leider für dessen Dauer der Notes Client geblockt.
Gespeichert
eknori
@Notes Preisträger
Moderatoren
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 11273


« Antworten #5 am: 18.07.19 - 11:59:23 »

Ah ok, nein.
Das läuft nur auf den Clients.
Excel muß für RunOnServer auf dem Server installiert sein?

Gibt es eine andere Möglichkeit?

Geht auf dem Server auch ohne Excel. Mit Java.
Gespeichert
booltrue
Frischling
*
Online Online

Beiträge: 42


« Antworten #6 am: 18.07.19 - 12:03:39 »


Hast du da ein Beispiel oder einen Ansatz für mich?
Gespeichert
eknori
@Notes Preisträger
Moderatoren
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 11273


« Antworten #7 am: 18.07.19 - 12:08:35 »

https://de.m.wikipedia.org/wiki/Apache_POI
Gespeichert
Peter Klett
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 2601



« Antworten #8 am: 18.07.19 - 12:34:43 »

1. Woher weiß der Agent bei RunOnServer, welche Dokumente markiert sind? Musst Du dem irgendwie mitgeben. UnprocessedDocuments wird sicherlich nicht funktionieren

2. Wartet der Client auch, bis das RunOnServer ausgeführt wurde

Natürlich kann man das mit STRG+Pause abbrechen, aber sag das den Usern, dann brechen die jeden Prozess, der denen zu lange dauert, mit STRG+Pause ab.

Dauert das wirklich so lange, ein paar markierte Dokumente in Excel zu schreiben, dass das ein Problem darstellt? Vielleicht kann die Routine optimiert werden. Um wieviele Dokumente geht es denn?
Gespeichert
Patrick Schneider
Aktives Mitglied
***
Offline Offline

Beiträge: 152


« Antworten #9 am: 18.07.19 - 13:13:13 »


Zitat
Das Apache-POI-Projekt enthält die folgenden Teilkomponenten:

POIFS (Poor Obfuscation Implementation File System): Diese Komponente liest und schreibt Dateien in Microsofts OLE-2-Compound-Document-Format. Beim OLE-2-Compound-Document-Format handelt es sich um ein Dateisystem, in dem die Daten eines Microsoft-Office-Dokuments in Form von Dateien abgelegt werden. Das Wort Obfuscation spielt darauf an, dass dieses Dateisystem etwas verschleiert ist.
HSSF (Horrible Spreadsheet Format) und XSSF: Diese Komponente liest und schreibt Dateien im Excel-Format (Excel-97, Excel-XP, Excel-2003, Excel-2007, Excel-2008).
HPSF (Horrible Property Set Format): Diese Komponente liest und schreibt Informationen über die Dokumenteigenschaften einer Datei im Microsoft-Office-Format (»Datei → Eigenschaften«).
HWPF (Horrible Word Processor Format) und XWPF: Diese Komponente liest und schreibt Dateien im Word-Format (Word-97, Word-XP, Word-2003, Word-2007). Die Komponente befindet sich im Scratchpad (siehe unten).
...
Danke - made my day  Grin
Gespeichert
booltrue
Frischling
*
Online Online

Beiträge: 42


« Antworten #10 am: 18.07.19 - 13:30:37 »


Wie gesagt, mit RunOnServer kann ich den Agent ja nicht starten, da kommt eine Fehlermeldung.
Starten des Agent geht nur mit Run.

Der Button, der den Agent ausführt, ruft diesen nur auf
Set agent = db.GetAgent("test")
Call agent.RunOnServer

Der Rest passiert im Agent selber.
Habe wie gesagt nur die Exportfunktion,
die vorher der Button ausgeführt hat, in den Agent kopiert.

Es wird der ganze View exportiert, aktuell ~5000 Zeilen.
Die Routine ist schon ziemlich schnell, jedoch blockiert der Client für ~5 bis 10s

Beim Exportieren von selektierten Dokumenten hatte ich Probleme,
da im View Multivalues angezeigt werden, aber nicht in einem Feld,
sondern verteilt auf mehrere Zeilen.

Gespeichert
eknori
@Notes Preisträger
Moderatoren
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 11273


« Antworten #11 am: 18.07.19 - 13:50:22 »

Das da „eine Fehlermeldung „ kommt, ist doch logisch, oder? Wenn auf dem Server kein Excel installiert ist, dann rennt der Code gegen die Wand, wenn Excel angesprochen wird.
Mitdem Java Code brauchst du aber kein Excel mehr. Kannst es sogar auf Linux laufen lassen.
Gespeichert
PromITheus
Junior Mitglied
**
Offline Offline

Beiträge: 58


« Antworten #12 am: 19.07.19 - 10:09:02 »

Ich fasse mal die 3 Ansätze zusammen. Du könntest...

1. Das Ganze über Java laufen lassen

2. Es über Excel auf dem Server laufen lassen
Dafür muss Excel auf dem Server installiert sein. Außerdem musst du sicherstellen, dass der Server die markierten Dokumente(oder View) übermittelt bekommt.
Der Server muss den Pfad für die Ablage der Datei kennen und auch Zugriff darauf haben.

3. Du lässt es weiter beim Benutzer laufen (da 5-10 Sekunden zumutbar sind)
Beim Benutzer "verschönern" z.B.:
- Excel beim Benutzer ausblenden mit "objxl.visible = False"
- Über die Statuszeile den aktuellen Stand des Exports ausgeben, per "Print Starte Excel , Print Exportiere Dokument 1..."
- Meldungsfenster vorschalten."Export starten? Kann 10 Sekunden dauern..."
« Letzte Änderung: 22.07.19 - 07:27:55 von PromITheus » Gespeichert

Gruß Marcel
Peter Klett
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 2601



« Antworten #13 am: 19.07.19 - 12:32:32 »

Zu 1. (falls das auf dem Server laufen soll) und 2.:

Die Wartezeit bleibt erhalten, da das Script auf die Beendigung des Agenten auf dem Server wartet - hatte ich weiter oben schon mal erwähnt (vielleicht gibt es bei Java eine Möglichkeit, das parallel laufen zu lassen, weiß ich aber nicht, nicht mein Gebiet).

Bei 5-10 Sekunden ist die Frage, wieviel schneller das auf dem Server läuft. Vielleicht gehst Du dann runter auf 4-8 Sekunden. Wow, da lohnt sich der Aufwand ...
Gespeichert
Tode
Moderatoren
Gold Platin u.s.w. member:)
*****
Offline Offline

Geschlecht: Männlich
Beiträge: 6249


Geht nicht, gibt's (fast) nicht... *g*


« Antworten #14 am: 19.07.19 - 13:24:14 »

Also mich wundert, dass bisher niemand die offensichtliche Lösung genannt hat: ich löse sowas immer mit üblicherweise 3 Agenten.

Der erste Agent hat nur 2 Zeilen Formelsprache:

Code:
@Command([RunAgent] ; "Agent2" );
@Command([RunAgent] ; "LongRunningBackgroundAgent" );

Im Agent2 werden die ganzen Vorbereitungen gemacht (reagieren auf Selektionen, User- Abfragen, z.B. Dateiname festlegen, etc). Die Informationen schreibt der Agent dann in ein "JobDokument".
LongRunningBackgroundAgent hat die Eigenschaft "im Client Hintergrundthread laufen" aktiviert und öffnet das JobDokument und arbeitet die ab. Der User muss nicht auf den Agenten warten, weil der aufrufende Agent 1 sofort terminiert, nachdem er die zweite Zeile Code abgearbeitet hat. Die Laufzeit des Hintergundagenten sieht man dann am Laufband unten Rechts im Client...

Die übergabe des JobDokuments kann man entweder über einen Notes.ini- Eintrag mit dessen UNID machen oder indem man ein Dokument pro User / Aktion erstellt, das dann in einer Ansicht gesucht werden kann...

Natürlich kann man hierbei dann nicht auf das Ende des Agenten reagieren, aber das könnte man mit einem LotusScript- Timer in einer offenen Maske machen, der z.B. prüft, ob die Ausgabedatei fertig ist.

Etwas komplizierter das Ganze, aber funktioniert zuverlässig.


ABER: Wenn das generieren einer Excel- Datei aus Notes- Daten so lange dauert, dass es dem User zu lange geht, dann ist was mit dem Code falsch. Ich habe hier Excel- Export- Code, der 20.000 Dokumente innerhalb weniger Sekunden verarbeitet...
« Letzte Änderung: 19.07.19 - 13:29:03 von Tode » Gespeichert

Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen...

Mit jedem Tag meines Lebens erhöht sich zwangsweise die Zahl derer...
... denen ich am AdminCamp ein Bier schulde... Wenn ich hier jemanden angehe: Das ist nie persönlich, sondern immer gegen die "Sparwut" der Firmen gedacht, die ungeschultes Personal in die Administration unternehmenskritischer Systeme werfen... Sprecht mich einfach am AdminCamp an, ich zahle gerne zur "Wiedergutmachung" das ein oder andere Bierchen an der Bar
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  


Einloggen mit Benutzername, Passwort und Sitzungslänge

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006, Simple Machines Prüfe XHTML 1.0 Prüfe CSS
Impressum Atnotes.de - Powered by Syslords Solutions - Datenschutz | Partner: