Beiträge von tbahn

    Enthält NumberOfOCT denn deine Auswahl?


    Hast du in deinem Dokument ein Feld namens numberOfFields?


    Mache mal ein verstecktes Feld unterhalb der Auswahl
    Typ: Zahl, Berechnet zur Anzeige, Formel: @TextToNumber("0" + NumberOfOCT)
    Wird die richtige Zahl angezeigt?

    OK, dann auf die harte Tour ;-)<br />
    Erstelle eine neue Funktion für die Berechnung des Feldwertes, z. B. CalculateUserSwitch(swName as String)<br />
    <p>Im QueryOpen:
    <pre>If continue Then
    If Not IsNewDoc Then
    Call source.Document.ReplaceItemValue("calcUserSwitch", CalculateUserSwitch(source.FieldGetText("swName")))
    End If
    End If</pre>
    Wenn das auch bei neuen Dokumenten berechnet werden soll, dann zusätzlich im PostOpen:
    <pre>If IsNewDoc Then
    Call source.Document.ReplaceItemValue("calcUserSwitch", CalculateUserSwitch(source.FieldGetText("swName")))
    End If</pre>
    HTH
    Thomas


    EDIT: Im PostOpen-If das Not entfernt.

    Dann einmal andersherum:
    Enthält NumberOfOCT den deine Auswahl?


    Hast du in deinem Dokument ein Feld namens numberOfFields?


    Hat NumberOfOCT die Eigenschaft gesetzt, dass nach Feldänderungen das Dokument aktualisiert wird?


    Mache mal ein verstecktes Feld unterhalb der Auswahl
    Typ: Zahl, Berechnet zur Anzeige, Formel: @TextToNumber("0" + NumberOfOCT)
    Wird die richtige Zahl angezeigt?


    Wenn du das Zahlenfeld benutzt, geht es dann?


    Ciao
    Thomas

    Sorry, dann müsstes du dein Problem etwas detailierter beschreiben.


    Aber @Integer "[k]onvertiert eine Zahl oder die Zahlen in einer Zahlenliste in Ganzzahlen." laut Designer-Hilfe.


    Ciao
    Thomas

    Stelle den Feldtyp auf "Berechnet" ein.


    Beispiel: Das Feld heißt "MeineListe", Text, keine Mehrfachwerte, Berechnet, Formel:
    MeineListe


    Dann kannst du im PostOpen-Ereignis der Maske darauf zugreifen und den Feldwert setzen:
    Call source.Document.ReplaceItemValue("MeineListe", berechneterWert)


    (source ist ein Parameter vom PostOpen).



    HTH
    Thomas

    Eine simple Möglichkeit wäre es, eine Mail-In-Datenbank für das Projekt aufzusetzen. Mails sollten dann an die DB gehen (und ggf. werden die Projektmitglieder per E-Mail mit Link auf das Original benachrichtigt).


    Generell besser halte ich es aber, wenn man Projekte nicht allein über E-Mails managt und dokumentiert, sondern dafür eine "richtige" Projektdatenbank benutzt, wo dann auch größere Dokumente abgelegt werden, Aufgaben erstellt und zugewiesen, Meetings und Vorschritte dokumentiert werden usw. So finden auch Projektmitarbeiter, die später hinzukommen, alles was es zum Projekt gibt. Außerdem kann man dann die Berechtigungen je nach Rolle im Projekt oder Beteiligung an bestimmten Aufgaben fein regeln.


    Eine komplexe, wenn auch nicht so leistungsfähige Schablone wird bei Notes/Domino schon mitgeliefert: der Teamroom.


    Kostenlose Schablonen gibt es sonst auch unter http://www.openntf.org


    Für einen günstigen "Maßanzug" kannst du mich sonst auch unter tbahn@assono.de kontaktieren.



    Ciao
    Thomas

    Du hast Recht, ich bin so an meine "Standard"-Funktionen gewöhnt...


    Meine Funktion kann zusätzlich nach Teilstrings suchen und läuft auch unter Notes R5.


    Ansonsten und für diesen Fall geht natürlich auch ArrayGetIndex.


    Ciao
    Thomas

    Erst mal eine kleine Hilfsfunktion:


    Public Function LSContains(array As Variant, text As String, asSubstring As Integer, caseInsensitive As Integer) As Integer
    '/**
    ' * returns if the array contains the text.
    ' *
    ' * @param array array to be searched for the text.
    ' * @param text text to be searched for.
    ' * @param asSubstring is it sufficent, if text is a substring of an entry?
    ' * @param caseInsensitive should the text be compared case-insensitive.
    ' * @return <code>true</code> if the array contains the text.
    ' *
    ' * @author Thomas Bahn <tbahn@assono.de>
    ' * @version 2006-06-27
    ' */

    Dim normalizedText As String
    Dim normalizedEntry As String
    Dim i As Integer

    normalizedText = text
    If Not caseInsensitive Then ' case-insensitive -> compare uppercase
    normalizedText = Ucase(normalizedText)
    End If

    If Not(Isarray(array)) Then ' array is no array
    normalizedEntry = Cstr(array)
    If Not caseInsensitive Then ' case-insensitive -> compare uppercase
    normalizedEntry = Ucase(normalizedEntry)
    End If

    If asSubstring Then
    LSContains = (Instr(normalizedEntry, normalizedText) > 0) ' found as substring
    Else
    LSContains = (normalizedEntry = normalizedText) ' equal strings?
    End If
    Exit Function

    Else ' array is an array
    For i = Lbound(array) To Ubound(array)
    normalizedEntry = Cstr(array(i))
    If Not caseInsensitive Then ' case-insensitive -> compare uppercase
    normalizedEntry = Ucase(normalizedEntry)
    End If

    If asSubstring And (Instr(normalizedEntry, normalizedText) > 0) Then ' found as substring
    LSContains = True
    Exit Function

    Elseif (normalizedEntry = normalizedText) Then ' equal entry found
    LSContains = True
    Exit Function
    End If
    Next
    End If

    LSContains = False ' not found until now -> text is not contained in array
    End Function



    Eine Prozedur zum Vergleichen könnte dann (wie Diali schrieb) erst einmal die Anzahl an Elementen vergleichen und dann bei identischer Anzahl das erste Array durchlaufen und für jeden Eintrag nachsehen, ob es im zweiten vorhanden ist.
    Bei der ersten Abweichung weiß man schon, dass sie nicht gleich sind und kann die Funktion verlassen. Erlebt man das Ende der Schleife, so sind alle Elemente von ersten Array auch im zweiten.


    Wenn doppelte Feldwerte möglich sind, muss man jetzt das gleiche noch einmal in die andere Richtung machen.


    Was dann immer noch nicht unterschieden wird, ist folgender Fall:
    ["A", "B", "B"] und ["A", "A", "B"]


    Wenn du das auch unterscheiden möchtest, müsstes du für beide Arrays einen "Zähler" aufbauen, also z. B. eine Liste. Beim Durchlaufen eines Arrays muss du dann für jeden Feldwert einen Listeneintrag mit dem Feldwert als Schlüssel und 1 als Wert erstellen bzw. den Wert um 1 erhöhen.
    Danach dann beide Listen noch vergleichen...



    HTH
    Thomas

    Die SetProhibitDocOpening ist natürlich eine Methode der ProUIView-Klasse. Ob und wie Objekte dieser Klasse auf ein gesetztes Attribut ProhibitDocOpening reagieren (z. B. das Verhindern eines direkten Öffnens) ist allein Sache der Klasse.


    Nur die Ansicht weiss aber über sich selbst Bescheid. D. h. insbesondere, es ist völlig in Ordnung, dass im Code der Ansicht
    Call pView.SetProhibitDocOpening(True)
    aufgerufen wird (oder eine Subklasse instanziiert wird statt der ProUIView-Klasse).


    Die Alternative wäre, dass die ProUIView-Klasse ALLE Ansichten kennt, auf die sie besonders reagieren soll. Das wiederspricht aber ganz stark dem Prinzip der Kapselung, weil sie ganz viel "Wissen um ihre Umwelt" haben müsste.


    Außerdem müsstes du dann bei weiteren Ansichten immer wieder die Klasse ändern. Nicht besonders wartungsfreundlich...



    Weitere Attribute, wie ProhibitDocPasting lassen sich trivial ergänzen und haben keinen Einfluss auf den Code in den Ansichten, es sei denn, sie wollen diese Funktion nutzen.



    Ciao
    Thomas

    Vielleicht kann man die Aktion in der Ansicht nach Thema umbenennen in "Für Export markieren" o.ä.


    Sie fügt dann die markierten Dokumente dem persönlichen Ordner hinzu (und bringt öffnet ihn vielleicht auch).


    In dem Ordner ist dann die Aktion "Exportieren". Wenn du über die UIView an die NotesView kommst, kannst du auch mit einem Navigator oder einer NotesViewEntryCollection arbeiten, um den Export sortiert nach den Ordner-Kriterien durchzuführen.


    Verkaufen könnte man den Anwendern das eventuell darüber, dass sie erst aus verschiedenen Ansichten die zu exportierenden Dokumente sammeln können und dann auf einen Schlag exportieren.


    Ist der Ordner sichtbar, dann können die Benutzer sogar per Drag'n'drop Dokumente auf den Ordner ziehen...



    HTH
    Thomas

    Und wenn du den Export in einen Agenten packst, der auf alle Dokumente der aktuellen Ansicht läuft und den du von einer Ansichten-Aktion aufrufst.


    Dann sollte session.CurrentDatabase.UnprocessedDocuments doch alle Dokumente liefern.


    Oder vielleicht bekommst du über die UIView Kontakt zu der NotesView selbst.


    HTH
    Thomas

    Hallo Patrick,


    wie wäre es dann mit einer Unterklasse, die immer sperrt? Dann könntest du in den Keyword-Ansichten diese Unterklasse verwenden, sonst die globale.


    Andere Idee: Nicht als Konstruktor-Parameter, sondern als Attribut mit Setter (oder Set-Property). Vorgabewert: nicht sperren. In den Ansichten, wo gesperrt werden soll, direkt nach dem Erzeugen des Objekts den Setter aufrufen, um das Attribut zu ändern.


    Beispiel:


    Public Sub SetProhibitDocOpening(ProhibitDocOpening)
    Me.ProhibitDocOpening = ProhibitDocOpening
    End Sub


    Im Normalfall
    Set pView = New ProUIView (Source, Continue)


    Bei den Ansichten, wo das Öffnen von Dokumenten verboten sein soll:
    Set pView = New ProUIView (Source, Continue)
    Call pView.SetProhibitDocOpening(True)



    Das Problem mit dem späteren Hinzufügen von Parametern verstehe ich nicht ganz: Wenn du weitere Parameter hinzufügst, musst du doch sowieso alle Aufrufe anpassen, egal ob du ProhibitDocOpening als Parameter aufnimmst oder nicht?!?



    HTH Thomas

    Irgendwo einen Tabulator markieren, Strg-C, in das Feld wechseln und Strg-V.


    Nicht gerade etwas, was man einem Benutzer zeigt oder häufiger benutzt, aber im Not- und Einzelfall geht es.


    Ansonsten ist es, wie Taurec schon schriebn, nur bei RichText-Feldern möglich:
    Dort gibt es in den Feldeigenschaften, 2. Reiter eine Einstellung, ob TAB ins nächste Feld springen soll.
    Ansonsten kann man dort mit Strg-Tab einen Tabulator einfügen.


    HTH
    Thomas