Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: skywook am 10.02.05 - 07:22:22

Titel: DokumentCollection
Beitrag von: skywook am 10.02.05 - 07:22:22
Hallo,
in einer kategorisierten Ansicht werden Dokumente ausgewählt die an eine DokumentenCollection übergeben werden. Wenn keine Dokument (greife ich über count ab) gewählt wurde wird ein Hinweis ausgegeben. 
Aber wie kann ich eine Meldung ausgeben wenn nur die Kategorie ausgewählt wurde und kein Dokument. Kann ich das abgreifen?
Titel: Re: DokumentCollection
Beitrag von: Thomator am 10.02.05 - 08:13:08
Hi skywook,

Du mußt halt eine ViewEntryCollection von den markierten Elementen bilden und dann beim durchlaufen für die einzelnen ViewEntries die Eigenschaft 'isDocument' prüfen.

Mit ViewEntry.Document bekommst Du dann Zugriff auf das Dokument hinter dem Entry.

Oder hab ich die Frage falsch verstanden? ???

Thomas
Titel: Re: DokumentCollection
Beitrag von: klaussal am 10.02.05 - 08:35:47
Man keine "Kategorie" auswählen, sondern nur Dokumente.

klaus
Titel: Re: DokumentCollection
Beitrag von: Axel am 10.02.05 - 08:43:31
Man keine "Kategorie" auswählen, sondern nur Dokumente.

klaus


Klar kann man eine Kategorie auswählen, nur ist die Collection dann leer. Dieses kann auch über Count geprüpft werden.


Axel
Titel: Re: DokumentCollection
Beitrag von: Thomator am 10.02.05 - 08:45:57
Einspruch, euer Ehren!

in einer NotesUIView mit Kategorisierung kann man auch eine Kategorie markieren.

Und wenn man über einer UIView eine ViewEntryCollection bildet, sind alle betroffenen Kategorien und Unterkategorien als NotesViewEntrys mir in der Collection. Vorausgesetzt, die Kategorien werden nicht flach angezeigt...

Thomas

Edit: Oh, hier gehts ja um die DocumentCollection  8)
Titel: Re: DokumentCollection
Beitrag von: TMC am 11.02.05 - 00:05:14
Edit: Oh, hier gehts ja um die DocumentCollection  8)

Jo  ;D
Deswegen ist Axel's Hinweis auch goldrichtig:

Klar kann man eine Kategorie auswählen, nur ist die Collection dann leer. Dieses kann auch über Count geprüpft werden.

"If collection.Count > 0 " sollte da ein guter Ansatz sein. Die Collection = 0, wenn leer - also kein Dokument ausgewählt.
Titel: Re: DokumentCollection
Beitrag von: skywook am 14.02.05 - 14:53:10
Hallo,

if collection.count = 0 then
messagebox .....
end if

funktioniert leider nicht wenn bei der kategorisierten Ansicht nur die Kategorie ausgewählt wurde.

Titel: Re: DokumentCollection
Beitrag von: Axel am 14.02.05 - 15:35:31
Hi,

versuch's mal so:

....
Set doc = collection.GetFirstDocument
  If doc Is Nothing Then
       Messagebox "Zum Anlegen einer Kontaktperson muss der Markierungsrahmen" + Chr$(10) + _
      "auf dem entsprechenden Firmendokument stehen.", 48, "Adressen"
       Exit Sub
  Else
....


Axel
Titel: Re: DokumentCollection
Beitrag von: Thomas Schulte am 14.02.05 - 15:42:53
@skywook
Mich beschleicht beim lesen deiner Threads immer mehr das Gefühl, das dir erheblich Basiswissen in der Programmierung fehlt. Wie heute schon in anderem Zusammenhang gesagt, lese doch bitte erst einmal ein oder zwei Basisbücher über Programmierung und da ist das was der Seemann empfohlen hat nicht das schlechteste.

Hier speziell habe ich den Eindruck das du den Unterschied zwischen einer DocumentCollection und einer ViewEntryCollection nicht verstanden hast. Zumindest gehst du mit keinem Wort in deinen Posts darauf ein was du denn tatsächlich verwendest.

Es wäre für alle Beteiligten wirklich wünschenswert, wenn du zum Beispiel die echten Klassennamen anstelle deiner eigenen Kreationen verwenden würdest. Eine gemeinsame Sprachbasis erleichtert die Kommunikation nämlich ungemein.
Titel: Re: DokumentCollection
Beitrag von: skywook am 14.02.05 - 16:15:49
@Thomas
Manchmal verstehe ich dieses Forum nicht!
Ich lese hier täglich die neuen Einträge, habe einige Bücher über Lotus Script. Die ich sogar gelesen habe. Aber als Anfänger ist es schwierig alle Zusammenhänge zu verstehen. Deshalb greife ich gerne auf dieses Forum zurück. Ok, ich drücke mich manchmal vielleicht nicht wie ein Profi aus. Aber für was ist dann dieses Forum da? Um nur schlaue Fragen zu stellen?

Wenn ich wirklich etwas nicht verstanden habe, dann bitte, erklärt es mir doch. Von diesen Dingen lebt doch ein Forum! Muss ich hier ein schlechtes Gewissen haben, wenn ich hier eine Frage poste. Ist das der Sinn? Klar, ist das Zeitaufwendig. Finde ich auch super wenn man sich Zeit für solche Dinge nimmt. Aber es hat doch jeder mal Klein angefangen. Oder?
Titel: Re: DokumentCollection
Beitrag von: Thomator am 14.02.05 - 16:25:55
Da hast Du schon Recht, aber was Thomas angesprochen hat (vor allem das mit den Klassennamen zwecks Kommunikation) ist schon wichtig.

Wir sind ja alle keine Kaffeesatz-Leser hier.

Also nicht gleich beleidigt abwenden. A bissi mehr Struktur in den Fragen und wir können Dir besser helfen... ;)

Thomas
Titel: Re: DokumentCollection
Beitrag von: Thomas Schulte am 14.02.05 - 18:33:29
@skywook
Thomas hat eigentlich die richtige Anwort schon gegeben.

Und ja die Einwohner (bei manchen kann man das wirklich sagen) dieses Forums helfen, wo es zu helfen gibt.

Nur gibt es Damen und Herren die es dem Helfenden etwas leichter machen und solche die es unnötig schwer machen.

Wie Thomas schon gesagt hat. E bissi mehr Struktur in die Fragen und vor allem den Folgefragen. Komplette Angaben und ein wenig intensiver nachdenken was das/die Gegenüber da gerade von sich gegeben ha(t)(ben) und Fragen lassen sich mit der Hälfte an Aufwand, Zeit und Nerven vernünftig beantworten.
Titel: Re: DokumentCollection
Beitrag von: Axel am 14.02.05 - 19:36:51
Hi,

nicht gleich aufregen und einen kühlen Kopf behalten.

@skywook
Hast du eigentlich meinen Vorschlag aus Antwort #7 mal probiert?
Wenn's nicht funktioniert, dann poste doch mal das relevante Stück Code.


Axel

Titel: Re: DokumentCollection
Beitrag von: skywook am 15.02.05 - 07:55:49
Ok, habs verstanden und werde die Dinge fürs nächste mal beachten.

@Axel
Hat leider nicht funktioniert. Habs mit Deinem letzten Tipp versucht, mit = 0 und mit = "". Alles vergebens. Hier mein Code:

Sub Initialize
Dim ordner As String
Dim auswahl As Integer   
Dim session As New NotesSession
Dim ws As New NotesUIWorkspace   
Dim db As NotesDatabase
Dim collection As NotesDocumentCollection
Dim doc As NotesDocument
Dim newdoc As NotesDocument
   
Set db = session.CurrentDatabase
Set collection = db.UnprocessedDocuments
Set doc = collection.GetFirstDocument

' Diese Abfrage wird übergangen
If collection.Count = 0 Then
   Messagebox "Sie haben kein Dokument markiert!",0 + 16,"Achtung"
   Exit Sub
End If
........   
   
Titel: Re: DokumentCollection
Beitrag von: Thomator am 15.02.05 - 08:10:13
Hi skywook,
lass Dir doch mal in einer MsgBox den collection.Count ausgeben und schau nach, wann dat Dingen 0 ist und wann nicht.

Thomas
Titel: Re: DokumentCollection
Beitrag von: skywook am 15.02.05 - 08:21:46
Hi Thomator,
habe ich versucht. Aber wenn der User ausversehen nur die Kategorie auswählt. Wird die Abfrage collection.count = 0 übergangen. Auch wenn ich die Anzahl vorher in einer msgbox ausgebe wird diese nicht einmal angezeigt.

Habe ich Dokumente ausgewählt. Wird mir die Anzahl in der msgbox korrekt angezeigt. 
Titel: Re: DokumentCollection
Beitrag von: Semeaphoros am 15.02.05 - 08:27:06
Ist der Code vollständig oder gibts da irgendwo ein On Error?

Wenn nur Kategorien ausgewählt werden, ist dann die UnprocessedDocuments instantiiert oder ist sie "Nothing"? kannst Du im Debugger überprüfen.
Titel: Re: DokumentCollection
Beitrag von: eknori am 15.02.05 - 08:28:44
ich hab es mit dem Schnipsel probiert; funzt einwandfrei
Titel: Re: DokumentCollection
Beitrag von: dirk_2909 am 15.02.05 - 08:29:22
Hallo

Frag doch noch ab ob die collection überhaupt initialisiert wurde:

if coll is Nothing Then
    msgbox " :-( "
elseif coll.Count = 0 Then
    msgbox " :-| "
else
    msgbox " :-) "
end if

Ich hoffe das hilft.

Dirk
Titel: Re: DokumentCollection
Beitrag von: Thomator am 15.02.05 - 08:34:00
Hi skywook,

mich beschleicht da eine dunkle Ahnung.
Kann es sein, dass vorher im code noch irgendwo auf ein Objekt zugegriffen wird, das Nothing ist?
Ich hatte vor langer, langer Zeit auch einmal einen Fall, wo ich nach einer while not doc is nothing-Schleife mal auf doc zugegriffen habe.

Das hat dann auch die Auswirkung gehabt, dass nachfolgende Message-Boxen ohne Fehlermeldung einfach übersprungen wurden.

Kannst Du das mal prüfen?

Thomas
Titel: Re: DokumentCollection
Beitrag von: Axel am 15.02.05 - 08:55:43
Ok, habs verstanden und werde die Dinge fürs nächste mal beachten.

@Axel
Hat leider nicht funktioniert. Habs mit Deinem letzten Tipp versucht, mit = 0 und mit = "". Alles vergebens. Hier mein Code:

...

' Diese Abfrage wird übergangen
If collection.Count = 0 Then
   Messagebox "Sie haben kein Dokument markiert!",0 + 16,"Achtung"
   Exit Sub
End If
........   
   


Hi,

so weit waren wir doch schon. Ich hatte dir dann die Version aus Antwort#7 angeboten. Hast du es damit mal probiert?

So sollte das aber jetzt funktionieren.

Code
Sub Initialize
Dim ordner As String
Dim auswahl As Integer   
Dim session As New NotesSession
Dim ws As New NotesUIWorkspace   
Dim db As NotesDatabase
Dim collection As NotesDocumentCollection
Dim doc As NotesDocument
Dim newdoc As NotesDocument
   
Set db = session.CurrentDatabase
Set collection = db.UnprocessedDocuments

'Abfrage, ob überhaupt ein Eintrag markiert wurde
If collection.Count = 0 Then
   Messagebox "Sie haben kein Dokument markiert!",0 + 16,"Achtung"
   Exit Sub
End If

Set doc = collection.GetFirstDocument
'Abfrage, ob Kategorie gewählt wurde
If doc Is Nothing Then
   Messagebox "Sie haben eine Kategorie markiert!",0 + 16,"Achtung"
   Exit Sub
End If
...


Axel
Titel: Re: DokumentCollection
Beitrag von: skywook am 15.02.05 - 09:07:44
Hab den Fehler gefunden!
Danke für die schnellen Antworten und die Zeit die Ihr investiert habt.

@Axel
Hatte ich getestet. Hat leider auch nichts gebracht. Sorry, habs vergessen zu posten.

@All
Haltet mich nicht für blöd aber kann das wirklich der Fehler gewesen sein? Habe in den Agenteneigenschaften im Abschnitt Laufzeit:
Das Ziel von "Alle gewählten Dokumente" auf "Keines" geändert. Und jetzt funkts.
Titel: Re: DokumentCollection
Beitrag von: Thomas Schulte am 15.02.05 - 09:10:44
ich hab es mit dem Schnipsel probiert; funzt einwandfrei

Bei mir funzt das auch.  Axels Lösung muss auch funktionieren.
Liegen könnte das daran, das hier
Code
Sub Initialize
Dim ordner As String
Dim auswahl As Integer   
Dim session As New NotesSession
Dim ws As New NotesUIWorkspace   
Dim db As NotesDatabase
Dim collection As NotesDocumentCollection
Dim doc As NotesDocument
Dim newdoc As NotesDocument
   
Set db = session.CurrentDatabase
Set collection = db.UnprocessedDocuments
Set doc = collection.GetFirstDocument

' Diese Abfrage wird übergangen
If collection.Count = 0 Then
   Messagebox "Sie haben kein Dokument markiert!",0 + 16,"Achtung"
   Exit Sub
End If
die set doc =  collection.unprocessedoducments Anweisung vor der dc.Count = 0 kommt.  Das einfach mal umzustellen so das die Anweisung nach der .count Abfrage kommt könnte auch helfen. Standard ist auf jeden Fall, wenn nix oder Kategeorie ausgewählt, dann Rückgabewert der Anzahl der Dokumente in der Collection = 0. Ist ja auch irgendwie logisch, denn Kategorien sind keine Dokumente.
Titel: Re: DokumentCollection
Beitrag von: Thomas Schulte am 15.02.05 - 09:14:17
@All
Haltet mich nicht für blöd aber kann das wirklich der Fehler gewesen sein? Habe in den Agenteneigenschaften im Abschnitt Laufzeit:
Das Ziel von "Alle gewählten Dokumente" auf "Keines" geändert. Und jetzt funkts.
Genau das meinte ich mit vollständigen Informationen. Du hast nirgends erwähnt, das du das nicht über eine Aktion (von der wir alle ausgegangen sind) machst, sondern über einen Agent.
Bei einer Vorgangsschilderung, die gab es früher mal als Aufsatzthema in der Schule, so nach dem Motto ich erstelle eine Aktion wäre das ein glatter Fünfer, weil für den Fortgang der Handlung wichtige Bestandteile fehlen.
Titel: Re: DokumentCollection
Beitrag von: Thomator am 15.02.05 - 09:16:54
Hallo skywook,

Das wird so sein. Wenn so ein Agent aus Datanbankereignissen gestartet wird, dann muss die Einstellung auf keine Dokumente stehen. Die anderen sind eigentlich nur für Zeitgesteuerte Agenten wichtig.

Dann ist aber der Agent auch überhaupt nicht gelaufen.
mal so als Tipp für die Zukunft: Bau Dir in solche Agenten gleich an erster Stelle mal eine MsgBox ein, um zu überprüfen, ob er überhaupt startet. Da sparst Du Dir viel Arbeit (wie in diesem Fall).

Thomas
Titel: Re: DokumentCollection
Beitrag von: eknori am 15.02.05 - 09:17:42
hm,#
Zitat
Du hast nirgends erwähnt, das du das nicht über eine Aktion ... machst, sondern über einen Agent.
Sub Initialize ?? Das mach m.W. nur über einen Agenten Sinn  :D

Zitat
von der wir ALLE ausgegangen sind
Objection, your honor .. unzulässige Verallgemeinerung  ;D
Titel: Re: DokumentCollection
Beitrag von: Thomas Schulte am 15.02.05 - 09:23:49
hm,#
Zitat
Du hast nirgends erwähnt, das du das nicht über eine Aktion ... machst, sondern über einen Agent.
Sub Initialize ?? Das mach m.W. nur über einen Agenten Sinn  :D

Zitat
von der wir ALLE ausgegangen sind
Objection, your honor .. unzulässige Verallgemeinerung  ;D
;) Nicht ganz. Bau den Code mal in das initalize Event, ja das gibt es auch, der Aktion ein. Da geht das ebenfalls. Und bis zu dem Post mit dem kompletten Code war auch das "Sub Initialize" nicht bekannt.

Also Einspruch abgewiesen euer Ehren.  8)

Allerdings, funzt das nur beim ersten Aufruf des Aktion Buttons, beim zweiten Mal springt er den Initialize Event nicht mehr an. Ist das jetzt ein Bug oder ein Feature?
Titel: Re: DokumentCollection
Beitrag von: skywook am 15.02.05 - 09:35:07
OK,
(wieder) mein Fehler. Bitte tausendmal um Entschuldigung  ::)

Hab auf jedenfall was dazugelernt.
Titel: Re: DokumentCollection
Beitrag von: Semeaphoros am 15.02.05 - 09:38:37
Zitat
Allerdings, funzt das nur beim ersten Aufruf des Aktion Buttons, beim zweiten Mal springt er den Initialize Event nicht mehr an. Ist das jetzt ein Bug oder ein Feature?

Das ist weder Bug noch Feature sondern gut zu wissen ....  ;D

Heisst, dass die Aktion gecached wird und erst beim Verlassen des Umfeldes freigegeben wird. Schon probiert, was mit dem Terminate passiert?
Titel: Re: DokumentCollection
Beitrag von: Thomas Schulte am 15.02.05 - 09:38:55
OK,
(wieder) mein Fehler. Bitte tausendmal um Entschuldigung ::)

Hab auf jedenfall was dazugelernt.
Eigentlich bräuchten wir jetzt noch so einen zerfliesenden Smiley  ;D

Aber is eh wurscht. Solange aus Fehlern gelernt wird
Titel: Re: DokumentCollection
Beitrag von: Thomas Schulte am 15.02.05 - 09:50:50
Zitat
Allerdings, funzt das nur beim ersten Aufruf des Aktion Buttons, beim zweiten Mal springt er den Initialize Event nicht mehr an. Ist das jetzt ein Bug oder ein Feature?

Das ist weder Bug noch Feature sondern gut zu wissen .... ;D

Heisst, dass die Aktion gecached wird und erst beim Verlassen des Umfeldes freigegeben wird. Schon probiert, was mit dem Terminate passiert?
Ausprobiert:
Der Terminate Event der Aktion wird erst ausgeführt, wenn die View keinen Focus mehr hat, das heist entweder geschlossen oder mit einer anderen Aktion überblendet wird.

Und jetzt wird es noch interessanter.
Bei zwei Aktionen ziehen die Initialize Events je Aktion jeweils einmal beim ersten Aufruf der Aktion, nicht bei der View. Die OnClick Events ziehen immer und die Terminate events in der Reihenfolge der Aktionen in der Aktionsleiste beim verlassen des Views.

KORREKTUR: Die Reihenfolge in der die Terminate Events ziehen scheint nicht festgelegt zu sein.

Das Objectexceute scheint so zu funktionieren wie das OnClick. Wobei ich keinen blassen Schimmer habe für was man das verwenden könnte.
Titel: Re: DokumentCollection
Beitrag von: Semeaphoros am 15.02.05 - 10:10:02
Hochinteressant, danke Thomas fürs Ausprobieren. Nach Deiner ersten Bemerkung habe ich das ungefähr so erwartet. Kann es sein, dass die Reihenfolge der Terminate dadurch bestimmt ist, in welcher Reihenfolge die Aktionen zuerst aufgerufen wurden? Ich nehme mal an, dass beim ersten Klick einer Aktion diese initialisiert wird und gleichzeitig in eine "Childcollection" der View eingetragen wird. Beim Fokusverlust der View wird diese Childcollection mit den entsprechenden Terminates aufgerufen, das ist ungefähr das Modell, das Windows verwendet, wenn dynamische Bereiche in einem Fenster vorhanden sind.
Titel: Re: DokumentCollection
Beitrag von: skywook am 15.02.05 - 11:57:51
Jetzt bräucht ich doch noch mal Hilfe.

Mit der o.g. Änderung habe ich jetzt das Problem, dass die Anzahl (collection.count) immer nur 1 zurückliefert. Obwohl mehr Dokumente angehackt sind. Mir kommts so vor als ob nur das Dokument gezählt wird das in der Ansicht (keine eingebettete) mit dem Cursor umrandet ist.

- Script läuft in einem Agent.
- Agent wird über das Menü Aktionen aufgerufen
- Testweise habe ich den Agenten auch über eine Aktion mit Formelaufruf getestet. Brachte aber keine Änderung
Titel: Re: DokumentCollection
Beitrag von: Thomas Schulte am 15.02.05 - 12:07:33
Wenn du die Auswahl deines Agents immer noch auf keines stehen hast, dann ist das kein Wunder denn da bringt er dann wirklich über die eigenschaft db.unprocessed Dokuments jeweils immer nur ein Dokument zurück, vollkommen egal wieviel Haken du setzt. Deswegen nimmt man bei sowas ja auch als Ziel immer alle ausgewählten Dokumente.
Titel: Re: DokumentCollection
Beitrag von: skywook am 15.02.05 - 12:10:35
ja, aber dann habe ich doch das o.g. Problem wieder. Kann ich nur eins von beiden lösen?
Titel: Re: DokumentCollection
Beitrag von: Thomas Schulte am 15.02.05 - 12:24:24
Also ich hab das jetzt mal vorwärts wie rückwärts probiert und bei mir hat das immer richtig gefunzt
Agent mit Run on Selected. folgenden
Code
Sub Initialize
	Dim ordner As String
	Dim auswahl As Integer   
	Dim session As New NotesSession
	Dim ws As New NotesUIWorkspace   
	Dim db As NotesDatabase
	Dim collection As NotesDocumentCollection
	Dim doc As NotesDocument
	Dim newdoc As NotesDocument
	
	Set db = session.CurrentDatabase
	Set collection = db.UnprocessedDocuments
	
	' Diese Abfrage wird übergangen
	If collection.Count = 0 Then
		Messagebox "Sie haben kein Dokument markiert!",0 + 16,"Achtung"
		'Exit Sub
	Else
		Msgbox collection.count & " Dokumente wurden markiert - sie können über die Klasse" & Chr$(10) &_
		"NotesDocumentCollection weiter bearbeitet werden"
	End If
End Sub
im Agenten drin und den Agenten über eine Aktion in einer kategorisierten Ansicht mit folgendem
Code
@Command([ToolsRunMacro];"testSelect")
aufgerufen
Das funktioniert einwandfrei mit und ohne Kategorien, mit einem zwei oder fünzig Dokumenten. mit Dokumenten + Kategorien ...
Er zeigt mir in der Documentcollection immer nur die echten Dokumente an.