Datentypumwandlung bzw Problem mit Datum Feld

  • Ich habe in einer Form ein Feld angelegt. Das Feld habe ich auf Date/Time eingestellt.
    Nun wollte ich in einem script dieses Feld verändern, je nach Bedingung 1,3,6 oder 12 Monate raufaddieren.
    Das ganze habe ich so machen wollen:


    Call dateTime.AdjustMonth( 3 )


    jedoch kam immer ein Typemissmatch.
    Mitlerweile habe ich (so glaube ich zumindest) mit dem Debugger herausgefunden, das Notes das Date/Time Feld als Variant abspeichert. Also habe ich mir im Script eine neue Variable deklariert und dort die Zeit verändert, müsste sie aber nun noch in variant umwandeln, da es ja NotesDateTime ist...


    noch viel besser wäre natürlich, wenn ich direkt auf das Feld aus der Maske zugreifen und verändern könnte... aber was muss ich in den Feld Eigenschaften einstellen, dass dieses dann auch wirklich NotesDateTime ist... ???

  • Notes speichert Felder immer als Variant ab, da intern alle Felder als Arrays gespeichert werden.
    Bei einem Element eben als ARray mit einem Element.


    Du musst das ganze dann eben einer Variablen zuweisen, entsprechend verändern und dann einfach wieder dem Feld zuweisen.

  • dh ich müsste 2 mal eine Typenumwandlung durchführen?!?


    Jedoch habe ich noch nichts gefunden, wie man NotesDateTime in Variant umwandelt...


    in der Hilfe steht :
    ' The Abs function requires a numeric or Variant argument.
    ' Convert a string value to Variant and use it in Abs.
    Dim gNum As String
    gNum$ = "-1"
    Print Abs(CVar(gNum$)) ' Prints 1 (absolute value of -1)

  • Hallo,


    du hast die Möglichkeit, Mit DateOnly bzw. TimeOnly dein NotesDatetime in einen String umzuwandeln. Diesen String kannst du mit Cvar(String) in einen Variant Datentyp umwandeln.


    Ich würde dein Problem jedoch anders lösen:
    Du kannst doch mit Cstr(doc.GetItemValue(...)) den Wert des Feldes gleich in einen String umwandeln. Mit diesem Wert kannst du ein NotesDateTime Element erstellen (new NotesDateTime(...))
    NotesDateTime kann jetzt normal mit Adjust bearbeitet werden.


    Jetzt musst kannst du das Datumsfeld löschen(remove oder so ähnlich im NotesItem) und ein neues mit
    Dim item = new NotesItem("Feldname", NotesDateTime)
    erstellen.


    Hoffe ich konnte dir weiterhelfen.


    Gruß,
    Steal

  • ok danke erst mal für die bisherige Hilfe.
    Das umwandeln klappt schon mal, nur habe ich noch Probleme den Wert zurück ins Feld zu schreiben.


    Hier mal das script:
    Sub Initialize
    Dim sess As New NotesSession
    Dim db As NotesDatabase
    Dim newdocView As NotesView
    Dim doc As NotesDocument
    Dim doc_new As NotesDocument
    Dim dateval As String
    Dim item As NotesItem

    Set db =sess.CurrentDatabase
    Set newdocView = db.GetView("new_documents")
    If newdocView Is Nothing Then
    Messagebox "Cannot create Project List!", MB_OK + MB_ICONEXCLAMATION, "ERROR"
    Exit Sub
    End If

    Set doc = newdocView.GetFirstDocument

    Set tday = New NotesDateTime( "Today" )
    dateval=Cstr(doc.GetItemValue("confi_nextdate")(0))
    Set dateTime = New NotesDateTime("dateval")

    While Not doc Is Nothing
    Set doc_new = doc.CopyToDatabase( db )
    doc.doc_status = "old"
    Call doc.Save( True, True )
    Set item = doc_new.confi_nextdate

    If (doc_new.confi_range(0) = "monthly") Then
    Call dateTime.AdjustMonth(1)
    Set item = ReplaceItemValue( "confi_nextdate", "dateTime" )
    End If


    wie muss ich das Feld denn einbinden... bzw wie muss der Befehl richtig lauten???

  • also er schreibt das feld immer noch nicht... :cry:


    hier mal das komplett script:
    Sub Initialize
    Dim sess As New NotesSession
    Dim db As NotesDatabase
    Dim newdocView As NotesView
    Dim doc As NotesDocument
    Dim doc_new As NotesDocument
    Dim dateval As String
    Dim item As NotesItem

    Set db =sess.CurrentDatabase
    Set newdocView = db.GetView("new_documents")
    If newdocView Is Nothing Then
    Messagebox "Cannot create Project List!", MB_OK + MB_ICONEXCLAMATION, "ERROR"
    Exit Sub
    End If

    Set tday = New NotesDateTime( "Today" )
    dateval=Cstr(doc.GetItemValue("confi_nextdate")(0))
    Set dateTime = New NotesDateTime("dateval")

    Set doc = newdocView.GetFirstDocument
    While Not doc Is Nothing
    Set doc_new = doc.CopyToDatabase( db )
    doc.doc_status = "old"
    Call doc.Save( True, True )

    If (doc_new.confi_range(0) = "monthly") Then
    Call dateTime.AdjustMonth(1)
    Set item = doc_new.ReplaceItemValue( confi_nextdate, dateTime )
    End If

    If (doc_new.confi_range(0) = "quarterly") Then
    Call dateTime.AdjustMonth(3)
    Set item = doc_new.ReplaceItemValue( confi_nextdate, dateTime )
    End If

    If (doc_new.confi_range(0) = "half year") Then
    Call dateTime.AdjustMonth(6)
    Set item = doc_new.ReplaceItemValue( confi_nextdate, dateTime )
    End If

    If (doc_new.confi_range(0) = "yearly") Then
    Call dateTime.AdjustMonth(12)
    Set item = doc_new.ReplaceItemValue( confi_nextdate, dateTime )
    End If

    Call doc_new.Save( True, True )

    Set doc = newdocView.GetNextDocument(doc)
    Wend

    End Sub



    noch ne andere Frage.
    Ich habe in der Form 2 Zeitfelder die ich voneinander subtrahiere um die Tagedifferenz zwischen den beiden zu erhalten. Das Feld das die Tage beinhaltet ist computed... das Problem ist. Um das Feld zu aktualisieren muss ich das Dokument öffnen, in den Editiermodus gehen und wieder spiechern. Muss ich da jetzt auch n agent schreiben, der das übernimmt??? Alle Formulare durchschauen und speichern??

  • Zitat


    waxweazl schrieb:
    Set item = doc_new.ReplaceItemValue( confi_nextdate, dateTime )

    Hättest Du bitte die Freundlichkeit, zuerst mal in die Online-Hilfe zu schaun. Dort steht:


    Code
    Set notesItem = notesDocument.ReplaceItemValue( itemName$, value )
    ItemName$
    String. The name of the item(s) you want to replace.
    value
    The value of the new item.


    Also den ersten Parameter den NAMEN des Feldes (ALS STRING) und den zweiten Parameter als WERT übergeben:
    Set item = doc_new.ReplaceItemValue( "confi_nextdate", dateTime )


    2) Für neue Fragen bitte einen neuen Thread anfangen, sonst wirds unübersichtlich.

  • Hallo,
    Versuch am besten mal, dir die Funktion anhand eines einfachen Beispiels klar zu machen.


    Bei Komplesen Skripten ist es immer schwer zu sagen, ob ein Fehler an der Syntax oder der Logik liegt.


    Gruß
    Steal

  • Zitat


    dateval=Cstr(doc.GetItemValue("confi_nextdate")(0))
    Set dateTime = New NotesDateTime("dateval")
    Set doc = newdocView.GetFirstDocument


    beim instanzieren von "dateTime" ist "doc" noch "nothing" eigentlich sollte das einen laufzeitfehler geben ("object variable not set")...?
    wenn das irgendwo abgefangen ist mit "on error..." dann ist das datum leer, weil "dateVal" dann ein "leerstring" ist...

    • Offizieller Beitrag

    Set dateTime = New NotesDateTime("dateval")


    lass mal die Hochkommas um datval weg, denn Du übergibst nicht die Var datval sondern den String "datval"!


    Ist datval ein LeerString, dann steht im Datum 30.12.1899.


    Gruß
    Dirk

    Rein logisches Denken verschafft uns keine Erkenntnis über die wirkliche Welt.
    Alle Erkenntnis der Wirklichkeit beginnt mit der Erfahrung und endet mit ihr.
    Alle Aussagen, zu denen man auf rein logischen Wegen kommt, sind, was die Realität angeht, vollkommen leer.
    Albert Einstein