Beiträge von Diali

    Von einem Backend-Dokument kommst du über diese beiden Wege zum Frontend-Dokument:


    set uidoc = ws.Editdocument(...)
    set uidoc = ws.ComposeDocument(...)


    mit
    uidoc.GotoField ... gelangst du in ein Feld, mit
    uidoc.SelectAll ... markierst du alles, mit
    uidoc.Copy ... kopierst du den markierten Teil in die Zwischenablage und mit
    uidoc.Paste ... wird der Teil in der Zwischenablage eingefügt.


    Gruß
    Dirk

    fertigen Code habe ich nicht.


    Aber der Ansatz wäre eine leere lokale DB (als temp. Datenbank) mit einer Maske und einem RT-Feld.
    Dort kannst du dann speichern und löschen wie du willst und in dem RT-Feld alles im Frontend oder Backend zusammenbauen und zum Schluß über die Zwischenablage in das "produktive" Dokument kopieren.


    Die temp.-Db kannst du auch noch automatisch anlegen, wenn diese nicht vorhanden ist.


    Gruß
    Dirk

    Löschen ist so eine Sache ...


    Mit "ModifiedSinceSaved" aus der Klasse NotesUIDocument bekommst du einen boolischen Wert und kannst abfragen, ob das aktuelle UIDokument nach dem letzten speichern verändert wurde.
    Dabei fällt mir gerade auf, dass dies in der 8.x und 9.x Hilfe nicht mehr drin steht. Auf den Klassenpostern zur Version 7 taucht diese Eigenschaft noch auf.


    Wurde das Dokument schon einmal vom Anwender gespeichert, darfst du es auf keinem Fall löschen. Auch speichern ist hier nicht optimal, da du den Stand des Dokumentes änderst.
    Handelt es sich um ein neues Dokument hat das Löschen auch einen Nachteil. Wird danach am UI nichts mehr verändert, dann muss der Anwedner aktiv speichern, denn die Abfrage nach dem Speichern beim Schließen des UI-Dokumentes kommt nicht, denn das UI-Dokument wurde nach dem letzten Öffnen nicht verändert.
    Aber auch da gibt es eine Abhilfe - wieder mit anderen Nachteilen verbunden. Z.B. über ein Feld im UI, welches beim Öffnen verändert wird. Nachteil: jetzt kommt immer die Abfrage nach dem Speichern.


    Gruß
    Dirk

    RT-Feld bedeutet, dass du keinen Layoutbereich verwendest, damit sind die beiden Parameter [autoHorzFit] und [autoVertFit] wirkungslos.


    Dann bleibt nur noch um alles eine Tabellenzelle zu machen und dann den Parameter [sizeToTable] auf True zu setzen.


    ALLERDINGS wirst du keine dymaische Dialogbox erhalten, sondern die Ausgangsgröße der Tabelle bestimmt die Größe der Dialogbox.


    Ist etwas unschön. Ich helfe mir da immer mit einer "angemessenen" Zahl an Leerzeilen, am Ennde und innerhalb der Tabellenzelle. Ggf. werden dann die Leerzeilen nach unten ins AUS geschoben.


    Gruß
    Dirk

    Auf die Ergebnisse oder Auswahl kannst du über das Dokument dialogdoc.Feldname zugreifen, wenn [noNewFields] , [noFieldUpdate] auf False steht.


    Die Dimension des Fensterns kannst du bestimmen über:
    - bei Layoutbereichen: [autoHorzFit] , [autoVertFit] auf True setzen
    - bei einer einzellnen Tabellenzelle: [sizeToTable] auf True setzen


    Code
    flag = notesUIWorkspace.DialogBox( form$ , [autoHorzFit] , [autoVertFit] , [noCancel] , [noNewFields] , [noFieldUpdate] , [readOnly] , [title$] , [notesDocument] , [sizeToTable] , [noOkCancel] , [okCancelAtBottom] )


    An den Anfang der Maske kommst du, wenn du dir das UI-Dokument holst und dann in das 1. Feld springst mit notesUIDocument.GotoField( Feldname ).


    Gruß
    Dirk

    das Ansprechen eines Feldes ist langsamer, das dafür das Dokument geöffnet werden muss. Geht es direkt über die Ansicht, wird der Wert aus dem Ansichtsindex genommen.


    Aber noch besser ist es nur einen DBLookup / DBColumn zu nehmen. Dies geht dann über eine eigene Spalte, beid er die Felder als ein String hinterlegt werden.
    z.B.

    Code
    trenner := "#####";trenner_mehrfachwerte := "&&&&&";@Implode(Feld1; trenner_mehrfachwerte) + trenner + @Implode(Feld2; trenner_mehrfachwerte)


    In einem Feld (berechnet zur Anzeige) wird dann mit einem DBLookup / DBColumn genau diese Spalte wieder ausgelesen.
    Mit @Explode und @Word oder @Left oder @Right kann dann auf die einzelnen Werte zugegriffen werden.
    z.B.:

    Code
    trenner := "#####";
    trenner_mehrfachwerte := "&&&&&";
    wert := @DBLookup(...);
    liste := @Explode(wert; trenner);
    @Trim(@Unique(@Expolode(@Word(liste, 1);trenner_mehrfachwerte)))


    Gruß
    Dirk

    na es geht schon über Script.


    Über ein Temp. Feld, welches beim PostOpen mit Script gefüllt wird. In der Listbox steht dann als Formel nur der Name des temp. Feldes.


    Je nachdem, ob die Auswahl von irgend etwas abhängig ist, kannst du das Script in Feld-Events oder anderen Masken-Events noch einmal ausführen und das Feld neu befüllen.


    im PostSave wurde ich dann das temp. Feld wieder löschen.


    Gruß
    Dirk

    ein kleinen Script macht dies.
    Ggf. beschränkst du es noch auf ein Verzeichnis, damit die System-DBs nicht mit indiziert werden.
    Wird versucht ein Index auf eine indizierte DB zu erstellen, so ist dies kein Fehler der Index wird nicht verändert - es wird also nix doppelt gemacht.
    Alternativ kannst du noch eine Prüfung einbauen, die abfragt, ob ein FT-Index schon existiert.


    Parameter für Createftindex:
    FTINDEX_ALL_BREAKS (4) to index sentence and paragraph breaks
    FTINDEX_ATTACHED_BIN_FILES (16) to index attached files (binary)
    FTINDEX_ATTACHED_FILES (1) to index attached files (raw text)
    FTINDEX_CASE_SENSITIVE (8) to enable case-sensitive searches
    FTINDEX_ENCRYPTED_FIELDS (2) to index encrypted fields


    Viele Grüße
    Dirk

    ok, aber dann hast du das Problem , dass du den Bezug nicht zu der kategorisierten Spalte bekommst, da immer alle Einträge in dem Feld geliefert werden.


    Verwendest du keine kategorisierte Spalte, sondern nur sortierte Spalten, dann ist es machbar.


    Alternativ geht es auch mit XPage und der Verwendung dem userspezifischen Scope.


    Gruß
    Dirk

    Der Username in "$1" wird dort per @Username angezeigt?
    @Username hat an der Stelle ein Problem im Zusammenhang mit den Ansichtsindexen, diese werden nicht pro User vorgehalten.
    Die Lösung (mit allen Nachteilen) wäre eine "gemeinsame Ansicht - privat bei Erstbenutzung" oder eine private Ansicht.


    Gruß
    Dirk

    Dafür benutze ich nur geplante Agente die jeder Stunde aktiv sind, und einen (Profil-) Dokument befragen ob sie zur Zeit grünes Licht haben oder nicht.

    Dies kann aber in die Hose gehen, bzw. startet der Agent eventuell nicht, weil das Profildokument auf dem Server gecacht wird. Ich rate hier dies auf Dokumente umzubauen, wenn die Aufgaben des Agenten zeitnah erledigt werden müssen.


    Gruß
    Dirk

    du hast eine Maske "DBProfile", mit der erstellst du ein Profildokument.
    Profildokumente kommen in einer DB nur einmal vor und erzeugen keine Speicher- und Repl.-konflikte. Außerdem werden diese Dokumente gecacht.
    Willst du kein Caching haben, musst du dies auf normale Dokumente umbauen.
    Halt erstellst du wirklich mit der Maske ein Profilokumnet?
    - kommt darauf an, wie du die Maske öffnest
    - - - > über Menü Erstellen, Compose usw. wird immer ein Dokument und kein Profildokument erzeugt
    - - - > über notesUIWorkspace.EditProfile(...), @Command( [EditProfile] ...), @Command( [EditProfileDocument] ...) wird ein Profildokument erzeugt


    Dann sollte auch ein @GetProfileField("DBProfile";"Name") funktionieren.


    Gruß
    Dirk

    also ich bin erstaunt, wie man von Listbox auf einen Prompt kommt - ich wäre nie auf diese Lösung für dein beschriebenes Problem gekommen.


    Willst du wirklich ein Prompt eigener Dialog dafür aufmachen oder sollen nur die wählbaren Inhalte eienr Listbox (Feld) geändert werden?


    Gruß
    Dirk

    das @Text(0:0:0)) macht Probleme bei Kalenderansichten! Und zwar werden dann die Termine mal am richtigen oder einen Tag vorher angezeigt.
    Also wenn ihr die Zeitzonen inkl. der Sommer-, Winterzeitumstellung im Zusammenhang mit Abgleichen auf mobile Endgeräte (z.B. Traveler) im Griff habt, reicht es eine Sekunde mehr einzutragen.
    IBM verwendet bei den Tages-Einträgen immer 4:00 Uhr bis 20:00 Uhr (damit ist zumindest die Sommer-,Winterzeitproblematik außen vor).


    Gruß
    Dirk

    die notesRichTextItem.ValueLength ist keine gute Idee, weil sich die Größe bei leeren Feldern je nach Notesversion ändert. Die Größe ist auch nicht 0, wenn das Feld leer ist.


    An den Inhalt des RT-Feldes kommst du erst im Backend heran (auch an die ValueLength).
    Und gleich der nächste Nachteil, Text, Anhänge, eingebettete Objekte sind kein Problem. Aber es gab etwas, an das kam man mit den RT-Klassen nicht heran - bin mir nicht mehr sicher was es war. Die Lösung war damals ein DXL-Export in einen Stream und dort prüfen, was im RT-Feld steht.


    Gruß
    Dirk