Schönheitsfehler mit Compose

  • Hallo,


    ich habe ein kleines Problem bei der Erstellung von Antwortmasken.


    Zum Hintergrund: ich stehe in einem offenen (neu erstellten) Dokument und möchte über einen Button ca. 10 Antworten dazu erstellen, die auch Feldwerte übernehmen.


    Das Ganze funktioniert auch einwandfrei.
    Das Problem ist nur, daß die Erstellung der Antwortmasken sichtbar ist. Das heisst, der Benutzer sieht 10 Dokumente kurz aufblitzen, und das gefällt mir nicht so besonders.


    Lässt sich das verhindern?


    Mein Code:
    @Command([FileSave]) &
    @Command([Compose];"Antwortmaske1") &
    @PostedCommand([FileSave]) & @PostedCommand([FileCloseWindow]) &
    @Command([Compose];"Antwortmaske2") &
    @PostedCommand([FileSave]) & @PostedCommand([FileCloseWindow]) &
    @Command([Compose];"Antwortmaske3") &
    @PostedCommand([FileSave]) & @PostedCommand([FileCloseWindow]) ..................


    Danke schon mal
    Lizzy

  • Na ja, das hab ich schon versucht. Das Problem ist, daß ich hier nur sehr wenig Erfahrung hab.


    Es wird zwar das Dokument angelegt, aber nicht als Antwort und es werden dann natürlich auch keine Werte übernommen.



    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim doc As NotesDocument
    Set db = session.CurrentDatabase
    Set doc = New NotesDocument(db)
    doc.Form = "Antwortmaske1"
    doc.Save True, True, True



    was mache ich denn falsch?

  • Danke. Ich hab gesucht, aber einfach nicht das richtige gefunden. So ist das leider, wenn man Anfänger ist.


    Ich hab aber leider noch ein Problem.
    Das Antwortdokument wird jetzt erstellt, aber es werden keinerlei Werte übernommen.


    Funktioniert die Einstellung "Formeln übernehmen Werte aus gewähltem Dokument" nicht, wenn es mit Script erstellt wird?


    Auch der Mailversand im Querysave des Antwortdokuments funktioniert so nicht.


    Kannst Du mir hier bitte auch noch ein paar Tips geben?
    Danke

  • Nein die funktionieren nicht, denn das sind Frontendeinstellungen, die im Backend nicht greifen.


    Die Werte musst du durch Zuweisung im Script manuell übernehmen und der Mailversand muss dann ebenfalls in das Script mit rein.

  • Hallo


    Dank der Hilfe hab ich das Ganze jetzt hinbekommen.


    Damit das Ganze etwas übersichtlicher wird und weil ich den Mailversand auch in anderen Bereichen brauche, wollte ich diesen jetzt in ein Sub auslagern.


    Also im Agenten funktioniert alles.


    Im Sub bekomme ich es nicht hin, daß ich im Subject und im Mailtext Text und Variable mischen kann.


    ...
    maildoc.subject = "Text" & variable(0) & "Text"
    ...
    Call rtitem.appendtext ("Text " & variable(0)
    ...


    Die Formel funktioniert im Agenten - aber nicht mehr, wenn die Mailfunktion in ein Sub in einer Scriptbibliothek ausgelagert ist

  • das ist die Sub in der Scriptbibliothek:


    Sub mailversand(empf,lzart,mitarb,doc,subj,lztext As Variant)
    'E-Mail versenden
    Dim session As New NotesSession
    Dim richStyle As NotesRichTextStyle
    Set richStyle = session.CreateRichTextStyle
    Set db = session.CurrentDatabase


    Dim maildoc As notesdocument
    Dim rtitem As NotesRichTextItem
    Set maildoc = db.createdocument
    Set rtitem = New NotesRichTextItem( maildoc, "Body" )



    maildoc.form = "MEMO"
    maildoc.sendto = empf
    maildoc.from = "Server"
    maildoc.subject = subj
    Call rtitem.appendtext("Bitte bearbeiten Sie den Laufzettel")
    Call rtitem.addnewline(3)

    richStyle.Bold = True
    Call rtitem.AppendStyle(richStyle)

    Call rtitem.appendtext (lztext )

    ' Call rtitem.AppendDocLink(doc,"Verknüpfung zum Laufzettel","")

    richStyle.Bold = False
    Call rtitem.AppendStyle(richStyle)

    Call rtitem.addnewline(3)
    Call rtitem.appendtext ("Abteilung/GS / Funktion: ")
    Call rtitem.AddTab(1)
    Call rtitem.AppendText ( " / " )
    Call rtitem.addnewline(1)
    Call rtitem.appendtext ("Eintrittsdatum: ")
    Call rtitem.AddTab(3)
    Call rtitem.AppendText("eintritt")
    Call maildoc.send( False,True )
    End Sub



    ---------------------------
    Aufruf im Agenten:


    'E-Mail versenden
    Dim empf,lzart,mitarb,doc,subj,lztext As Variant

    empf = dbprofile.GetItemValue( "p_edv" )
    lzart = laufzettelart
    mitarb = mname
    subj = "Laufzettel - "
    lztext = lzart(0) & mitarb(0)
    Set doc = doc1

    Call mailversand(empf,lzart,mitarb,doc,subj,lztext)
    --------------------
    bei der Zeile lztext = lzart(0) & mitarb(0) im Agenten kommt der Fehler: Variant enthält keinen Container


    wenn ich in der Zeile die (0) weglasse, bekomme ich Type mismatch

  • Wieso verwendest du da als Parameter überall Variants und greifst dann eh nur immer auf das erste Element zu ?


    Übergib an die Funktion dann doch gleich Strings.


    Vermutlich wird dein Aufruf irgendwie so aussehen:


    call mailversand("empf","lzart","mitarb",doc,"subj","lztext")


    Und dann versuchst du auf einen Array zuzugreifen der gar keiner ist, was natürlich zu der Fehlermeldung führt.


    Variant sollte nur dann verwendet werden wenn es unbedingt notwendig ist oder der Datentyp nicht zur Designzeit bestimmt werden kann.
    Bei dir ist das aber sicher nicht der Fall

  • Ok, ich hab das jetzt auf String umgestellt.


    Das ändert aber nichts an meinem Problem, daß ich festen Text und Werte aus einer Variable nicht zusammenhängen kann.



    Und Deine Zeile
    call mailversand("empf","lzart","mitarb",doc,"subj","lztext")
    verstehe ich ehrlich gesagt nicht. Warum sind die Variablen hier in Anführungszeichen eingeschlossen?

  • Das war auch nur ein Beispiel, ob du da jetzt Variablen übergibst die String Elemente enthalten oder direkt Strings wie in meinem Beispiel ist egal.


    Hast du nach der Umstellung auf String auch deinen restlichen Code entsprechend angepasst, denn ein empf(0) wird beim Typ String immer zu einem Fehler führen. Und der Aufruf muss natürlich auch den korrekten Typ übergeben.

  • Gut, das habe ich jetzt verstanden.


    Aber mein Problem habe ich auch noch.



    Dim mname,..... As String
    .....
    mname = maindoc.GetItemValue( "mname" ) 'ist Hauptdok., Werte werden in Antwortdok. übernommen
    ...
    Dim lztext As String
    ...
    lztext = "Laufzettel: " & mname 'Text im Mailbody ---- und hier kommt der Type Mismatch




    ich komm einfach nicht drauf, was das noch sein könnte

  • Zitat


    Lizzy schrieb:
    Dim mname,..... As String


    Wenn das ausgeschrieben so aussieht


    Dim mname, nname, oname As String


    dann ist das ein schwerer (Denk-)Fehler: mname und nname werden nicht explizit einem Datentyp zugewiesen und sind daher Variants!!


    Es muss also heissen:
    Dim mname As String, nname As String, oname As String


    Und das ist auch in der Dokumentation so aufgeführt. Lesen bildet (und sei es fremder Code von guten Leuten).


    HTH,
    Bernhard

  • OH OH, da hatte ich wirklich einen schweren Denkfehler.



    Jetzt bekomme ich aber schon vorher einen Type mismatch.


    Dim maindoc As NotesDocument 'Hauptdokument
    Set maindoc = session.DocumentContext
    Dim doc1 As NotesDocument 'Antwortdokumente
    Set doc1 = New NotesDocument(db)
    ...
    Dim abt As String,mname As String,....
    ...
    'Feld aus Hauptdokument holen für Antwortdokument, Feldname hat die gleiche Bezeichnung in Haupt u. Antwortdok
    mname = maindoc.GetItemValue( "mname" )
    ....
    Call doc1.replaceItemValue("mname", mname)




    bei der Zeile mname = maindoc.GetItemValue( "mname" ) kommt jetzt ein Type mismatch
    das Feld in der Maske ist ein Textfeld und im Script ist es als String definiert
    ???

  • Und da hast du den zweiten Denkfehler:


    GetItemValue liefert immer einen Array zurück, da Felder ja auch aus mehreren Einträgen bestehen können.


    D.h. die Zeile müsste dann so aussehen:


    mname = maindoc.GetItemValue("mname")(0)


    Natürlich unter der Vorraussetzung, daß das Feld nur einen Wert enthält bzw du nur den ersten willst

  • OK - funktioniert - Danke



    noch eine Frage


    wie muss ich denn dann ein Datumsfeld definieren?


    mit String funktioniert es nicht, da kommt ein Fehler am Ende, wenn ich das Dokument aktualisiere.


    mit NotesDateTime geht's aber auch nicht



    Dim geburtstag As ???
    geburtstag = maindoc.GetItemValue( "geburtstag" )(0) ???







    PS: hab's grad gefunden, muss Variant sein

  • Bei einem Datumsfeld hast du zwei Möglichkeiten:


    Entweder du wandelst den in einen String um oder aber du greifst auf die DateTimeValue Eigenschaft des NotesItems zu um es als NotesDateTime zu bekommen.


    Welche Variante sinnvoller ist hängt vom jeweiligen Zweck ab