Beiträge von Grizzly

    Zitat


    taurec schrieb:
    Bei der remove Methode des RTItems hab ich auch schon oft festgestellt, daß der Anhang nicht ganz entfernt wird.
    In manchen Fällen hat es funktioniert indem ich danach noch das Attachment aus dem Dokument selbst removet habe.
    In anderen musste ich danach noch die Items durchgehen und die $FILE Felder mitlöschen


    Die Attachments des Dokuments habe ich mir gerade auch angeschaut. Aber das ist immer nix drin (size() == 0). Aber $FILE durchzugehen habe ich noch nicht probiert.

    Am Anfang des Agenten hole ich mir meine zwei Rich Text Felder:

    Code
    printPage = this.getRTField(doc, FIELDNAME_PRINT);				actualPrintPage = this.getRTField(doc, FIELDNAME_PRINT_ACTUAL);


    Danach fange ich mit dem Löschen nach dem Verfahren in meinem letzten Post im Feld actualPrintPage an. Am Ende werden dann beide Felder mit jeweils einem Anhang wieder befüllt. Also ist am Ende in printPage eine Historie der Anhänge und in actualPrintPage immer der letzte / aktuelle Anhang.


    Hier die Funktion zum Holen der Felder:

    Code
    private RichTextItem getRTField(final Document doc,		final String fieldname) throws NotesException {		RichTextItem rti;		if (doc.hasItem(fieldname)) {			rti = (RichTextItem) doc.getFirstItem(fieldname);		} else {			rti = this.createRTField(doc, fieldname);		}		return rti;	}	private RichTextItem createRTField(final Document doc,		final String fieldname) throws NotesException {		RichTextItem rti;		rti = doc.createRichTextItem(fieldname);		return rti;	}


    Was ich jetzt noch probiert habe:

    Code
    this.removeAllEmbeddedObjects(doc, actualPrintPage);


    und


    Das Ergebnis ist aber leider das gleiche: Der ehemalige Anhang aus actualPrintPage ist nicht gelöscht sondern befindet sich am Ende der Maske.

    Ich möchte in einem Agenten den Anhang in einem Rich Text Feld löschen und anschließend das Feld mit einem neuen Anhang befüllen. Aber irgendwie scheint das nicht zu funktionieren. Der alte Anhang verschwindet zwar aus dem Rich Text Feld, taucht aber nach einer Absatzlinie am Ende der Maske unter einem kryptischen Namen wieder auf (wahrscheinlich die Notes interne ID des Anhangs).


    Ich habe schon probiert Document.removeItem sowie RichTextItem.remove aufzurufen. Ebenso hat ein Neuerstellen des Feldes im Dokument mit Document.createRichTextItem nicht zum gewünschten Erfolg geführt.


    Irgendwelche Ideen? :-?

    Hallo,


    ich schreibe gerade an einem kleinen LotusScript Script. Dieses soll eine Benachrichtungsmail verschicken, wenn ein Dokument zum ersten Mal gespeichert wird.


    In der Prozedur

    Code
    Sub Querysave(Source As Notesuidocument, Continue As Variant)

    in der Antwort-Maske lasse ich möchte ich dazu an Daten aus dem Hauptdokument ran kommen. Ich rufe also ParentDocumentUNID des Antwort-Dokuments auf. Hier steht aber nichts drin, solange ich das Dokument nicht gespeichert habe. Dann weis ich allerdings ja nicht mehr, ob das Dokument neu ist. Und nun habe ich ein kleines Problem.


    Kann ich das irgendwie umgehen? In Postsave wird ja wahrscheinlich Source.IsNewDoc false liefern. Gibt es vielleicht noch eine andere Möglichkeit an das Hauptdokument ran zu kommen?

    @SetViewInfo funktioniert. Danke Dirk. :)
    Auch wenn das durch die vielen Framesets, die ich verwende, dadurch etwas komplizierter ist. ;)


    Was ich allerdings nicht ganz verstehe:
    Der Befehl

    Code
    @SetViewInfo([SetViewFilter]; @Name([Abbreviate]; @UserName); "Verantwortlich"; 1)


    auf eine Kalenderansicht angewendet, sollte eigentlich den Benutzernamen mit dem Wert in der Spalte Verantwortlich vergleichen. Die 1 erzwingt einen genauen Vergleich der Werte. Fazit ist aber, dass dann plötzlich alles angezeigt wird. Setze ich hier den Wert 0, was für eine ungenaue Suche steht, dann bekomme ich die nur die zutreffenden Dokumente angezeigt.


    In der Hilfe steht dazu:

    Zitat

    exactMatch


    Number. Boolean value. Optional in a Calendar view; not for use in Standard Outline views. 1 indicates that the string in the columnName column must exactly match the string specified in filterString. 0 indicates that the filterString does not have to match exactly. For instance, if the filterString is "A," and exactMatch is set to 0, documents with "A" and "A plus" in the column specified in columnName will both be included in the view.


    Also entweder ist die Hilfe falsch oder ich habe etwas falsch verstanden. :-?

    Da wir dank der Geschäftsleitung aber relativ oft Ansichten wieder umschreiben, wäre das wohl keine so tolle Idee. :(


    Sonst können halt die Mitarbeiter nicht suchen. Es gibt ja noch andere Listen, in denen sie nach ihren Dokumenten suchen können. Nur den Kalender als Applet nochmal neu zu programmieren, finde ich halt nicht so der Renner. Naja, mal schauen... ;)

    Ich denke mal, Du hast Du Felder als Berechnet zur Ansicht gemacht. Stell' sie einfach auf Berechnet um. Dann wird der Wert aus der anderen Datenbank geholt und im Formular gespeichert. Damit kannst Du den Wert auch in einer Ansicht anzeigen lassen.


    Du hast dann halt ein Problem mit der Aktualisierung der Kontaktdaten. Sprich wenn jemand etwas im Adreßbuch ändert, wird es halt es beim nächsten Speichern des Dokumentes aktualisiert.

    Naja, Fazit ist dann aber, dass ich in allen Scripten, in denen ich das benutze, eine Liste aller Server unseres Unternehmens halten darf. Und wenn ein Server dazukommt, seinen Namen ändert oder abgeschalten wird, kann ich überall die entsprechenden Scripte ändern. Das finde ich eine etwas unglückliche Lösung.

    Das das eine Frontend und das andere Backend Funktionen sind, leuchtet mir ein. Das aber keine Backend Funktion gibt, die ohne Server Angabe auskommt, verstehe ich nicht. Vor allem da man ja Agenten auch einfach im Client laufen lassen kann.


    Und wie meinst Du das mit lokalen Datenbanken bei zeitgesteuerten Agenten? Kann ich nicht auf eine Datenbank auf einem anderem Notes Server zugreifen? Also wenn ich ihn explizit angebe? :-?

    In der Formelsprache geht es ja. Beispiel:

    Code
    _ReplicaID := "hier steht die ReplikID";
    @PickList([Custom]:[Single]; _ReplicaID; "Name der Anischt"; "Titel des Fenster"; "Aufforderungstext"; 1);


    Hier muss ich keinen Server angeben.


    Zu der Sache mit OpenWithFailover: Ich möchte es schon gerne über die Replik ID machen, da sich hier leider sehr oft ;) die Namen der Datenbanken (inkl. der Dateinamen) ändern können.

    Ist es in Lotus Script möglich eine Replik einer Datenbank ohne Angabe des Servers zu öffnen?


    Erst dachte ich, dass es mit

    Code
    notesDatabase.OpenByReplicaID( server$, replicaID$ )

    ginge. Aber das braucht ja zwingend eine Serverangabe.


    Momentan gehe ich halt den lokalen Rechner und alle unsere Server durch und schau, auf welchem System ich die Datenbank erfolgreich öffnen kann. Das ist ja aber auch nicht sooo die saubere Lösung.

    Für eine Art Ticket System arbeite ich in verschiedenen Ansicht mit @UserName. Damit zeige ich die die Ticket für den aktuellen Benutzer an. Allerdings scheint das nicht immer zu funktionier. Manchmal werden Tickets für einen anderen Benutzer angezeigt. Und wenn ich dann @UserName in einer extra Spalte ausgeben lasse, steht da auch ein anderer Benutzer als der gerade angemeldete.

    SQL
    SELECT (Verantwortlich = @Name([CN]; @UserName);


    Ein weiteres Problem stellen Rollen dar. Nach einer Replikation passiert es öfters, dass eine Person Schaltflächen und Menüpunkte in Outlines nicht mehr angezeigt bekommt. Und das obwohl in der ACL die Rolle gesetzt ist.

    Code
    @IsNotMember("[Rolle]"; @UserRoles);


    Ist das ein prinizipiell Notes Problem? Oder muss man da andere Befehle benutzen?

    So, habe letzte Woche die Lösung gefunden und wollte sie Euch nicht vorenthalten: Man lässt den Agenten laufen und danach ruft man @Command([SwitchForm]; "Maske"); auf, wobei Maske die aktuelle Maske sein muss. Der Benutzer landet dann zwar - wenn bspw. eine Tabelle mit Reitern verwendet wird - wieder auf dem ersten Reiter, aber die Maske enthält die neuen Daten.


    Wichtig ist, dass das Umschalten der Maske auf sich selber wirklich danach erfolgt. Es gibt ja zwei Kommands in der Formelsprache, um einen Agenten zu starten (mir fallen Sie bloss gerade nicht ein, da ich zu Hause sitze und kein Notes hier habe). Einer startet einen Agenten und lässt die Formelsprache erst weiterlaufen, wenn der Agent fertig ist. Der andere Befehl startet den Agenten und lässt die Formel parallel weiterlaufen. Das Letztere geht natürlich in die Hose, da der Agenten in 99,999% fällen nach der Formel fertig ist. Damit hat man immer noch die alten Werte in der Maske.