Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: braincrusha am 25.08.04 - 12:44:28

Titel: Druck von Dokumenten durch Agent
Beitrag von: braincrusha am 25.08.04 - 12:44:28
Also ich habe mal wieder ein Problem....

Ich würde gerne einen Agenten schreiben welcher Dokumente nach bestimmten Anforderungen durchsucht und die Dokumente die den Anforderungen entsprechen ausdruckt.

Ich habe schon einen ähnlichen Agenten. Doch dieser kopiert einfach die Feldinhalte ohne Formatierung und ohne die eingefügten Bitmaps/Bilder raus und schreibt diese in ein txt-file.... ich hätte es aber gerne so dass das Dokument so ausgedruckt wird wie es in meiner Datenbank ist?

Ist sowas möglich? Hat jemand vielleicht ein paar Anhaltspunkte wie wo ich am besten anfang?
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: elajen am 25.08.04 - 13:25:16
Hallo,

soll der Agent im Background auf dem Server laufen. Ich denke mal ja, aber ich frag trotzdem.
Wenn Du im Frontend arbeitest, dann kannst Du die Dokumente im UI öffnen und per NotesUIDocument.print drucken.

Gruß von Ekki
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: braincrusha am 25.08.04 - 13:39:32
ja er soll im Hintergrund laufen...

und ich hab was wichtiges vergessen... schickt er die Dokumente dann alle einzeln an den Drucker? Besser wäre es wenn er sie erst alle aneinanderhängt und dann zum Drucker schickt (Papier sparen und manchmal wird so ein PDF-Drucker benützt).
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: elajen am 25.08.04 - 13:49:21
Hallo,

Notes selbst bietet Dir Druckfunktionen nur in den UI-Klassen. Geht also im Hintergrund-Agent nicht. Wenn Du auf Windows arbeitest, und das sicherstellen kannst, dann mußt Du wohl das Windows-Api verwenden. Da kenn ich mich allerdings nicht aus. :(

Edit: -> Was mir noch einfällt. Mach doch einen Java-Agent. Mit dem kannst Du ohne API drucken

Gruß von Ekki
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: Spalter am 25.08.04 - 13:57:24
Hallo brainchrusha,

ungefähr so:

Dim session As New NotesSession
Dim db As NotesDatabase
Dim workspace As New NotesUIWorkspace
Dim collection As NotesDocumentCollection
Dim doc As NotesDocument
Dim uiview As NotesUIView
Set db = session.CurrentDatabase
Set uiview = workspace.Currentview
Set collection = db.AllDocuments
Set doc = collection.GetFirstDocument

While Not doc Is Nothing
Call uiview.SelectDocument(doc)
Call uiview.print(1)
Set doc = collection.GetnextDocument(doc)
Wend


Gruß
Spalter 8)
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: Axel am 25.08.04 - 14:07:32
@Spalter

Das soll ein Background-Agent werden, da sind keine UI-Klassen (Frontend-Klassen) erlaubt.


@brainchrusha

Dir wird als Lösung wohl nur die von elajen übrigbleiben.


Axel


 
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: Spalter am 25.08.04 - 14:14:12
Hallo Axel,

das mit den Ui's ist mir schon klar. Bei Java muß ich leider passen.

Gruß
Spalter  :-[
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: braincrusha am 30.08.04 - 11:54:59
da ich bei Java auch passen muss werd ich die Lösung von Spalter benützen... ich hab jetzt noch ein bisschen dran rumgespielt damit er auch meinen Anforderungen entspricht... nur leider muss ich mal wieder irgendwo einen Fehler eingebaut haben weil immer wenn ich ihn starte hängt sich der Agent von alleine auf...

Sub Initialize
   Dim session As NotesSession
   Dim db As NotesDatabase
   Dim workspace As NotesUIWorkspace
   Dim collection As NotesDocumentCollection
   Dim coll As NotesDocumentCollection
   Dim doc As NotesDocument
   Dim uiview As NotesUIView
   Dim bis_date As Variant
   Dim von_date As Variant
   
   Set session = New NotesSession
   Set db = session.CurrentDatabase
   Set collection = db.AllDocuments
   Set doc = collection.GetFirstDocument
   
   
   von_date = Inputbox("Letze Version vom?", "Letzte Version", "31.05.2001")    
   bis_date = Inputbox("Datum der Version die ausgeliefert wird?", "Auslieferungsdatum","03.07.2001")
   
   
   Do While Not (doc Is Nothing)
      
      If (((doc.Feld1(0) = "Ja" Or doc.Feld1(0) = "1") Or _
      Not(Isempty(Feld2)))And Datevalue(von_date)<= doc.Feld3(0) And _
      doc.Feld3(0) <= Datevalue(bis_date)) Then   
         Set coll = doc.AddDocument
         Set doc = collection.GetNextDocument(doc)   
      End If
   Loop
   
   
   
   Set doc = coll.GetFirstDocument
   
   While Not doc Is Nothing
      
      Call uiview.SelectDocument(doc)
      Call uiview.print(1)
      Set doc = coll.GetnextDocument(doc)
      
   Wend
End Sub

also ich bin mal wieder mit meinem Latein am Ende... wenn ich den debugger einschalt läuft er aufjedenfall bis zur If-Schleife... ich bin mir nicht sicher aber ich glaube er läuft sie auch noch komplett durch bevor er sich dann komplett aufhängt.
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: koehlerbv am 30.08.04 - 12:02:09
Ich denke, der Agent soll auf dem Server laufen ? Dann kann es sowieso nicht funktionieren, wie in diesem Thread schon beschrieben wurde.
Soll der Agent im Client ablaufen, wird dies auch nix. Ein erster kurzer Blick  zeigte schon:
Set coll = doc.AddDocument
gibt es nicht.
Und: Du holst das nächste NotesDocument der Collection in einer If-Abfrage. Wenn die If-Bedingung mal nicht stimmt: "In Ewigkeit - Amen !", sprach die Endlosschleife.

Bernhard
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: braincrusha am 30.08.04 - 12:24:17
Ich denke, der Agent soll auf dem Server laufen ? Dann kann es sowieso nicht funktionieren, wie in diesem Thread schon beschrieben wurde.
Soll der Agent im Client ablaufen, wird dies auch nix. Ein erster kurzer Blick  zeigte schon:
Set coll = doc.AddDocument
gibt es nicht.
Und: Du holst das nächste NotesDocument der Collection in einer If-Abfrage. Wenn die If-Bedingung mal nicht stimmt: "In Ewigkeit - Amen !", sprach die Endlosschleife.

Bernhard

Also eigentlich sollte er auf dem Server laufen.. doch da dies nicht ohne erheblichem Mehraufwand funktioniert (ich kann kein Stück Java bis jetzt) habe ich mich entschlossen die Version von Spalter zu benützen.. schön wäre es zwar wenn er auf dem Server läuft ist aber nicht zwingend...

werd mich gleich nochmal reinlesen... sah für mich sehr passabel aus und der Debugger hat sich auch nicht beschwert.. aber ich schau nochmal wie man es richtig macht...

irgendwelche Ideen wie ich die Dokumente dann sortier wenn ohne If-Schleife?
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: elajen am 30.08.04 - 13:37:16
Hallo,

du kannst schon sortieren mit If aber das ..getnextDocument solltest du tunlichst außerhalb vom If unterbringen. :D

Gruß von Ekki. :D
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: koehlerbv am 30.08.04 - 13:42:09
Aber was soll die NotesDocumentCollection beim Drucken helfen ?
Ausserdem ist coll nicht instantiiert, somit kann da auch nix "geadded" werden.
Weiterhin: Wo wird die NotesUIView instantiiert ?

Bernhard
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: braincrusha am 31.08.04 - 11:01:12
Aber was soll die NotesDocumentCollection beim Drucken helfen ?
Ausserdem ist coll nicht instantiiert, somit kann da auch nix "geadded" werden.
Weiterhin: Wo wird die NotesUIView instantiiert ?

Bernhard
Also ich hab jetzt noch ein bisschen dran rumgebaut.. hab aber jetzt ne Frage... wie instantiiere ich coll dass nur die Dokumente reinkommen die ich benötige???

Ist es nicht so dass wenn ich die NotesDocumentCollection dann drucke dass alle Dokumente am Stück sind?? Wenn nicht hab ich wohl einige Beiträge hier falsch interpretiert oder jemand hat meine Beiträge falsch interpretiert.
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: Spalter am 31.08.04 - 11:06:30
Hallo bc,

was Du brauchst ist wahrscheinlich die Search-Methode. Damit kannst Du eine Auswahl all der Dokumente treffen, die Deine Kriterien erfüllen.

Du erhälst eine Collection, die Du dann in Deinem Script weiterverarbeiten kannst.

Gruß
Spalter
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: koehlerbv am 31.08.04 - 11:11:43
NotesDocumentCollection ist Backend, das Drucken funktioniert aber nur im FrontEnd.
Statt einer Collection könntest Du einen Folder verwenden (darüber könntest Du auch gleich die Sortierung durchführen).

Bernhard
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: braincrusha am 31.08.04 - 12:16:09
Also okay hab es jetzt wieder ein bisschen umgebaut...

Code
Sub Initialize
   Dim session As NotesSession
   Dim db As NotesDatabase
   Dim doc As NotesDocument
   Dim view As NotesView
   Dim oh_document As NotesDocument
   Dim temp As NotesDocument
   Dim bis_date As Variant
   Dim von_date As Variant
   
   Set session = New NotesSession
   Set db = session.CurrentDatabase
   Set view = db.GetView("NextAuslieferung")   
   Set oh_document = view.GetFirstDocument
   
   Call db.EnableFolder(ausliefer)
   
   
   von_date = Inputbox("Letze Version vom?", "Letzte Version", "31.05.2001")     
   bis_date = Inputbox("Datum der Version die ausgeliefert wird?", "Auslieferungsdatum","03.07.2001")
   
   
   Do While Not (doc Is Nothing)   
      Set temp = view.GetNextDocument(oh_document)
      If (((oh_document.voiAuslieferungCall(0) = "Ja" Or oh_document.voiAuslieferungCall(0) = "1") Or _
      Not(Isempty(voiInbetriebKunde)))And Datevalue(von_date)<= oh_document.voiAbgeschlossen(0) And _
      oh_document.voiAbgeschlossen(0) <= Datevalue(bis_date)) Then   
         Call oh_document.PutInFolder(ausliefer)
      End If
      Set oh_document = temp
   Loop
   
End Sub

kann ich irgendwie jetzt den ganzen Folder drucken oder muss ich mit einer Schleife durch die einzelnen Dokumente durch?? Wenn zweiteres werden die dann trotzdem aneinandergehängt?
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: koehlerbv am 31.08.04 - 12:32:37
Du kannst die Dokumente der UIView direkt drucken.

Über den Print-Parameter pageseparator% bestimmst Du, wie beim Druck verkettet wird:
0 - direkt vekettet
1 - eine Leerzeile dazwischen
2 - Seitenumbruch zwischen den Dokumenten

HTH,
Bernhard
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: koehlerbv am 31.08.04 - 12:39:08
Nachtrag: In den gegenwärtigen R6-Versionen funktioniert der PageSeparator nicht ! Siehe KBase-Doc 1105025

Das werden einige gar nicht lustig finden.

Bernhard
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: koehlerbv am 31.08.04 - 12:44:13
Und noch ein Nachtrag: In Deinem Code wird niemals das erste Dokument Deiner View ausgewertet, Du startest mit Dokument 2. Da müsstest Du Deine Schleife nochmal überarbeiten.

HTH,
Bernhard
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: braincrusha am 31.08.04 - 12:57:20
Und noch ein Nachtrag: In Deinem Code wird niemals das erste Dokument Deiner View ausgewertet, Du startest mit Dokument 2. Da müsstest Du Deine Schleife nochmal überarbeiten.

HTH,
Bernhard
Bist du dir da sicher? Also rein logisch wenn ich es mir anschau müsste es eigentlich funktionieren. Ich hab zwei Dokumente eins davon ist oh_document, das andere temp. Oh_document wird auf das erste Document in der Ansicht gestellt noch vor der Schleife. Vor der If Abfrage wird Temp auf das nächste Dokument gestellt also Nummer Zwei in der Ansicht. Nach der If Abfrage wird oh_document zu temp also Nummer 2. So seh ich das aufjedenfall.

Mit R6 ist kein Problem da ich es hier nicht benutzt wird.
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: koehlerbv am 31.08.04 - 13:01:27
Jo, Du hast Recht - und ich habe schief geguckt  :)

Sorry,
Bernhard
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: braincrusha am 31.08.04 - 15:17:58
Ist es irgendwie möglich bei der UIView auch diese NextAuslierferung Ansicht zu benützen oder muss dort CurrentView benützt werden?
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: braincrusha am 31.08.04 - 16:18:20
Jetzt bin ich vollends verwirrt.

Also erst sagst du mir ich soll sie in einen Ordner packen. Was ich  auch getan habe und jetzt soll ich es über eine UIView drucken?? Wie bekomm ich es hin dass nur die Dokumente aus dem Ordner in der UIView sind?? Oder muss ich das mit dem Ordner doch lassen und eine UIView benützen?  ???
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: koehlerbv am 31.08.04 - 16:28:44
Die UIView musst Du ja sowieso irgendeiner View (oder eben ein Folder) zuordnen. Einzige Bedingung: Die View oder der Folder müssen aktuell im Client angezeigt werden.
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: braincrusha am 31.08.04 - 16:32:39
aha okay.. so ähnlich hab ich mir dass auch gedacht... aber dann hätte ich auch gleich die nächste Frage... kann ich mittem im Agent ihm sagen dass er diesen Folder öffnen soll? Weil wenn nicht müsste ich ja zwei Agenten schreiben.. einer der diesen Folder erstellt dann müsste man auf diesen Folder klicken und dann noch ein Agent der ihn ausdruckt...
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: koehlerbv am 31.08.04 - 16:36:04
Das beste wäre, den Code gleich in einen Button des Folders zu stecken. Ein Agent ist ja eigentlich unnötig.
Sonst musst Du das Ding öffnen mit NotesUIDatabase.OpenView.

Bernhard
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: Semeaphoros am 31.08.04 - 16:45:06
Jo, ist richtig so
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: braincrusha am 01.09.04 - 13:14:31
ich hab es immer noch als agent gelassen und lass ihn den folder währrend der laufzeit des agenten öffnen. Nun hab ich aber noch eine Frage. Wie druck ich nun jedes Dokument in diesem Folder beziehungsweise der UIView. Ich habe in der UIVIew ja nicht die Möglichkeit GetNextDocument und in meinem Handbuch zum nachschlagen find ich absolut gar nix über Folder. Kann mir da noch irgendjemand helfen?
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: koehlerbv am 01.09.04 - 13:28:40
Schau mal in die Designer-Hilfe in das Beispiel zu NotesUIView.SelectDocument ... Die Collection dort müsstest Du durch ein Loop durch durch Dokumente der zugehörigen backend view ersetzen.

HTH,
Bernhard
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: braincrusha am 01.09.04 - 15:35:56
Wir reden über diesen Teil vom Code oder?


Code
   

   Set oh_document = view.GetFirstDocument   
   Call uidb.OpenView("ausliefer")
   Set uiview = ws.currentview

While Not oh_document Is Nothing   
   Call uiview.SelectDocument(oh_document)
   Call uiview.print(1)
   Set oh_document = view.GetnextDocument(oh_document) 
Wend

und du willst dass ich jetzt in das Argument von uiview.SelectDocument(...) eine Schleife baue die durch die View durchläuft und alle Dokumente einliest die in dem Folder sind (also auch in der UIView). Ich suche aber doch gar nicht die Dokumente aus meiner View sondern will die Dokumente die nun in den Folder aussortiert worden sind. Und genau danach frag ich. Wie mach ich das am dümmsten?

Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: braincrusha am 03.09.04 - 11:52:41
also ich hab jetzt eine Lösung die funktioniert nur falls es jemanden interessiert

Code
Sub Initialize
   Dim session As NotesSession
   Dim db As NotesDatabase
   Dim doc As NotesDocument
   Dim view As NotesView
   Dim vw As NotesView
   Dim ws As New NotesUIWorkspace
   Dim oh_document As NotesDocument
   Dim temp As NotesDocument
   Dim bis_date As Variant
   Dim von_date As Variant
   Dim uiview As NotesUiView
   Dim uidb As NotesUIDatabase
   
   Set session = New NotesSession
   Set db = session.CurrentDatabase
   Set view = db.getview("NextAuslieferung")
   Set uidb = ws.currentdatabase
   Set oh_document = view.GetFirstDocument
   
   
   von_date = Inputbox("Letze Version vom?", "Letzte Version", "31.05.2001")     
   bis_date = Inputbox("Datum der Version die ausgeliefert wird?", "Auslieferungsdatum","03.07.2001")
   
   
   Call uidb.OpenView("ausliefer")
   Set uiview = ws.currentview
   Set vw = db.getview("ausliefer")
   
   
   Do While Not (oh_document Is Nothing)   
      Set temp = view.GetNextDocument(oh_document)
      If (((oh_document.voiAuslieferungCall(0) = "Ja" Or oh_document.voiAuslieferungCall(0) = "1") Or _
      Not(Isempty(voiInbetriebKunde)))And Datevalue(von_date)<= oh_document.voiAbgeschlossen(0) And _
      oh_document.voiAbgeschlossen(0) <= Datevalue(bis_date)) Then   
      
         Call oh_document.PutInFolder("ausliefer")
         Call uiview.SelectDocument(oh_document)
         Call uiview.print(1)      
      End If
      Set oh_document = temp
   Loop
   
   Set oh_document = view.GetFirstDocument   
   
   
   
   While Not oh_document Is Nothing
      Call oh_document.removefromfolder("ausliefer")
      Set oh_document = view.GetnextDocument(oh_document) 
   Wend
   
End Sub

Jetzt hab ich aber noch eine Frage (mir kommen die Ideen immer erst wenn ich eigentlich fertig bin). Ist es möglich die Werte von dem Dokument in einer anderen Maske die anders angeordnet ist als die erste auszudrucken?
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: koehlerbv am 03.09.04 - 11:55:54
Hast Du Dir in der DesignerHelp mal genau die Parameter der Methode Print angeschaut ?
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: braincrusha am 03.09.04 - 12:46:58
Ich nehm mal an ich muss den Maskennamen den ich benutzen will in den Parameter Form Override schreiben? Wie muss die Maske aussehen?? Müssen die Felder genauso heißen wie bei der Originalmaske oder reicht es wenn ich über "Berechnet beim anlegen" die Werte aus der Originalmaske hole?
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: MadMetzger am 03.09.04 - 13:08:48
Dann müsstest du aber das Dokument erst berechnen lassen, einfacher wäre es die Felder exakt gleich zu benennen. Wenn du es so machen willst, dann empfehle ich dir, die Felder als Berechnet zur Anzeige zu nehmen.
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: koehlerbv am 03.09.04 - 13:11:24
"Berechnet zur Anzeige" wäre der Typ der Wahl  ;)

Bernhard
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: braincrusha am 03.09.04 - 14:20:03
Ist ja egal ich hab jetzt die Felder einfach mal gleichgenannt. Damit Bilder etc die zwischen den Texten stehen auch mitrübergenommen werden. Nun hab ich aber immer noch ein Problem (immer wenn eins geht kommt ein neues :-( )

Also ich übernehm die Texte und geb in den Eigenschaften des Text-Feldes an dass er es als Arial und Schriftgröße 12 schreiben/bzw. drucken soll und mit der Farbe schwarz.

Diese Änderungen werden aber nicht übernommen und bei manchen Dokumenten geht er soweit dass er die Hälfte des Feldes außerhalb der PDF Datei steht...
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: koehlerbv am 03.09.04 - 14:23:08
Sind das RTFs ? Da kannst Du (logischerweise) für Farbe und Schriftart etc. einstellen, was Du willst - es gilt das originale RT Item.

"Ausserhalb der PDF-Datei": Ist jetzt Dein Festplattengehäuse kaputt ?  ;D
Titel: Re:Druck von Dokumenten durch Agent
Beitrag von: braincrusha am 03.09.04 - 14:28:12
Sind das RTFs ? Da kannst Du (logischerweise) für Farbe und Schriftart etc. einstellen, was Du willst - es gilt das originale RT Item.

"Ausserhalb der PDF-Datei": Ist jetzt Dein Festplattengehäuse kaputt ?  ;D
Also die OriginalFelder sind Text Felder? Kann ich die im Nachhinein nicht mehr nur für diesen Druck formatieren???

Nein mein Festplattengehäuse hat weder Löcher noch Risse...  :P

ich mein damit ein Satz beginnt irgendwann ist er am Ende so und dann müsste eigentlich ja eine neue Zeile kommen und die kommt auch. Nur leider fängt die da nicht an wo die davorige aufgehört hat sondern da fehlt halt en Stück