Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: Fedaykin am 27.07.04 - 16:38:07
-
Ich habe das Problem, dass ich in Lotusscript den Namen der Form eines neuen Dokumentes bräuchte. Da das Dokument aber noch nicht gespeichert ist, ist dieser nicht verfügbar. Hier noch mein Code, hoffe jemand hat eine Idee. Geht dabei darum Anhänge einzufügen ohne das Dokument zuvor speichern zu müssen.
Sub Initialize
Dim ws As New NotesUIWorkspace
Dim filenames As Variant
filenames=ws.OpenFileDialog(False,"Bitte Anhang wählen!","Text Dateien|*.txt|Notes Templates|*.ntf","M:\")
If Not(Isempty(filenames)) Then
AddAttachment ws,"fa_Person","ParentUID",filenames(0)
End If
End Sub
Sub AddAttachment(uiws As NotesUIWorkspace, FormName As String,ItemName As String,FileName As String)
Dim uidoc As NotesUIDocument
Dim ws As New NotesUIWorkspace
Dim thisdoc As NotesDocument
Dim rtitem As NotesRichTextItem
Dim olduidoc As NotesUIDocument
Set olduidoc=uiws.CurrentDocument
Set thisdoc = uiws.CurrentDocument.Document ' doc in memory but hasn't been saved yet
thisdoc.RemoveItem ItemName
Set rtitem = New NotesRichTextItem (thisdoc,ItemName)
rtitem.EmbedObject EMBED_ATTACHMENT, "", FileName
rtitem.Update
thisdoc.Form=FormName
' set the SaveOptions field so that when the uidoc is closed, the user won't be asked to save
thisdoc.SaveOptions = "0"
' close the uidoc. It won't actually happen until the code is finished executing
olduidoc.Close False
' create a new uidoc and open the backend doc that is still in memory with added doc link
Set uidoc = uiws.EditDocument(True, thisdoc)
' delete the reference to the old uidoc
' this is necessary because the code below affects it if left in memory
Delete olduidoc
' re-associate the variable with the backend doc
' have to do this because the olduidoc reference was deleted
Set thisdoc = uidoc.Document
' remove the SaveOptions field so the doc can be saved
thisdoc.RemoveItem "SaveOptions"
uidoc.Refresh
End Sub
-
In so einem Fall muss man ein Feld namens "Form" in die Maske einbauen und dort den Maskennamen bzw. Alias eingeben.
Dann kannst Du das bereits im Postopen auswerten.
Andreas
-
Hallo Andreas
Ein "Berechnet zur Anzeige" Feld mit der Formel "@If(Form="";@ThisValue;Form)" reicht aus, aber halt wieder eine Abhängigkeit an die man bei jeder Verwendung denken muss. Mit Evaluate rausfinden funktioniert leider auch nicht. Frage mich wie Notes überhaupt weiss was da rein schreiben. ;)
Gruss
Remo
-
Ein "Berechnet zur Anzeige" Feld mit der Formel "@If(Form="";@ThisValue;Form)" reicht aus,
Hallo,
diese Formel funktioniert aber auch erst nach dem Speichern eines Dokuments. Gibt es wirklich keine Möglichkeit, den Maskennamen vor dem Speichern herauszufinden ??
echt seltsam!
-
Das ist richtig, dass man auf den Standardwert "Form" erst nach dem Speichern zugreifen kann. Aber was spricht denn dagegen, ein berechnetes Feld namens Form zu machen, in dem der Name hardcodiert drin steht? Problematisch ist dabei nur die Pflege der Maske, denn wenn der Maskenname geändert wird, muss man auch daran denken, dieses Feld zu ändern.
-
OK,
wie wichtig es ist zeigt das folgende Szenario:
Eine generische Subform wurde entwickelt, die in beliebige Datenbanken, in beliebige Forms eingebunden werden kann. Die Subform benutzt nun den alias Formnamen als Key, um auf Konfigurationsdokumente zu zugreifen. Die Subform muss irgendwie herausfinden wo sie ist! Jetzt können aber Werte nicht berechnet werden, da kein Key (Formname) und keine Werte herangeholt werden können.
Ein statisches Formfeld hilft an dieser Stelle leider nicht, da alles generisch ist.
Toll wäre in der ws noch eine property wie currentdocument...currentform oder so
-
Da muss aber irgendwo ein architektonischer Designfehler drinstecken. Daten sollten von der Darstellung völlig getrennt werden. Mit dem Zugriff auf den Formnamen bekommst Du eine Abhängigkeit von der Darstellung statt vom Inhalt. Sprich, da fehlt doch irgendwo eine Datenmarkierung.
-
Das Szenario habe ich nicht ausführlich erläutert: Die Subform wird in bereits bestehende Datenbanken eingebunden. Hierbei handelt es sich um eine Modulkomponente, ein Feature.
Wenn ich nun ein neues Dokument mit der neuen Komponente erstelle, dann brauche ich irgendein Key das mir sagt, wo ich bin, um das dafür entsprechende Profildokument in DBx, für diese Maske! heranhole. Ich nehme den Formnamen als Key.
Ich weiss, den Formnamen als Key ist nicht gut, aber ich habe keine andere Alternative gefunden. eine Ideee ?
-
OK, typische Realitätslösung :)
Musst Du eben tatsächlich in die Formulare, in denen Du das einfügst, zusätzlich noch ein Feld mit dem Formnamen einfügen.
-
In jeder gut gemachten Maske gibt es wohl irgendein Feld, dass sich eindeutig zu Deiner Konfiguration zuordnen lässt. Du musst das Mapping etwas dynamischer gestalten.
Noch ein Hinweis: Es gibt auch die Möglichkeit, die Maske im Dokument zu speichern. In diesem Fall legt Notes NICHT automatisch das Feld "Form" an, sondern ein Feld namens "$TITLE". Das muss eine wie auch immer geartete Lösung ebenfalls berücksichtigen.
Andreas
-
ich weiß nicht, ob ich das richtig verstanden habe, aber falls ja, dann würde ich nicht den Namen der Form als Key nehmen, sondern einen eigens zur Identifikation bestimmten Wert, der in einem speziellen Feld steht (Berechnet beim Anlegen).
Grund: Form ist ein Systemfeld und hat schon eine Bedeutung, würde also zusätzlich eine zweite Bedeutung erhalten, die nicht für jeden sofort ersichtlich ist. + Der Formname ist nicht eindeutig, also zur Identifikation ungeeignet.
-
Das von Thomas gesagte geht genau in die Richtung, die ich oben erwähnt habe. Die Idee, hier mit einer unabhängigen Identifikation zu arbeiten, ebenfalls. Super Vorschlag.
-
Hallo Fedaykin,
Wenn ich dich richtig verstehe, benötigst du unterschiedliche Teilmasken, je nach dem, welche Aufgabe der User lösen soll. Frage, wie erzeugst du dein Dokument: per @Compose?
Gruß von Ekki.
-
Hallo,
vielen Dank für eure Vorschläge!
@Glombi : daran hatte ich auch schon gedacht '$Title-Feld' das stimmt !
@All:
Also mein Problem ist nur, wie finde ich ein Key, als von beiden Seite eindeutig ist. Idee: Kann ich in ein Design Note über Script erstellen ? Dann würde ich ein Key Produzieren und es dem Deisgn Note mitgeben ?
-
Na, irgendwie bekommt man das schon hin, nur sehe ich den Sinn nicht ganz, was hindert Dich daran, die Formulare zu ändern, in die Du ja sowieso eingrefen musst, um Deine Teilmaske zu integrieren?
-
Gute Frage!
Ziel ist es, den Designeingriff so gering wie möglich zu halten. Das Einfügen der Subform übernehmen externe Desginer.