einen Wert über getitemvalue ändern

  • Hallo!


    Ich habe folgendes Problem, und ich bekomme es einfach nicht gebacken:


    Ich möchte in einem Feld, dessen Wert ich mit "getitemvalue" hole (es steht ein einziger Zahlenwert darin), eine Zahl subtrahieren.


    Das geht aber scheinbar mit diesem Befehl nicht; ebenso bekomme ich eine Fehlernachricht, wenn ich es mit "replaceitemvalue" versuche.


    Was ich machen möchte, ist folgendes:


    Feld1 = zeitenpooldoc.GetItemValue( "psbes1" -1000000)


    oder auch


    Call zeitendoc.replaceItemValue( "psbes1" , psbes1-1000000)


    Sobald ich die "-1000000" anfüge, läuft das ganze auf einen Fehler:


    Type mismatch.....


    Falls jemand hier einen guten Tip für mich hat, würde ich mich sehr freuen!


    Vorab schon mal vielen Dank!


    Gruß
    Achim

    • Offizieller Beitrag

    oder kürzer
    zeitenpooldoc.psbes1 = zeitenpooldoc.psbes1(0) -1000000


    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

  • Hallo!


    Danke für die Info; sieht jetzt schon anders aus, jedenfalls bekomme ich damit keinen Fehler mehr, allerdings zieht er jetzt die 1000000 nicht ab. Er läuft über das script, in dem Feld (über Debugger gesehen), schreibt z.B. "1000014,96" rein, und dann sollte nach dieser Zeile doch in dem Feld nur noch der Wert "14,96" drinstehen. Es behält aber leider den ursprünglichen Wert, die 1000000 wird nicht abgezogen.


    Muss man hier vielleicht die Klammern anders setzen, oder doch eine andere Funktion bauen?


    Call zeitenpooldoc.ReplaceItemValue("psbes1", zeitenpooldoc.GetItemValue( "psbes1")(0) -1000000)


    Gruß
    Achim

    • Offizieller Beitrag

    hast Du nach der Zeile auch das Dokument gespeichert?


    Gruß
    Dirk

  • Hallo!


    Ja, gespeichert habe ich das ganze, aber der Wert ist leider immer noch der gleiche - soll heissen, die Zahl wird nicht vom Wert des Feldes abgezogen....


    Über weitere Infos würde ich mich sehr freuen!


    Trotzdem schon mal danke!!!


    Gruß
    Achim

  • Hallo nochmal!


    Ja und... ja; das Feld ist nicht berechnet und es ist auch ein Zahlenwert drinnen; das sieht auch im Debugger.


    Das Feld ist allerdings als "Variabel" deklariert, aber da kann ja durchaus ein Zahlenwert drinstehen. Kann es sein, dass das ein Problem macht?


    Kann ich vielleicht vor der Operation sicherstellen, dass das Feld als Zahlenfeld behandelt wird?


    Vielen Dank nochmal!


    Gruß
    Achim

  • Hallo!


    Hier habe ich mal den Code reinkopiert; ich habe die Subtraktion an zwei Stellen eingefügt; einmal, wenn es den Satz, für den die Subtraktion durchgeführt werden soll, noch nicht gibt, und nochmal, wenn der Satz schon vorhanden ist - dann soll er upgedated werden.


    Vielen Dank!


    Sub Initialize
    Dim i As Integer

    'Zu Prüfende Schlüssel
    Dim koaunr As Variant
    Dim psposi As Variant
    Dim pkadr1 As Variant
    Dim adadr1 As Variant
    Dim pkadr101 As Variant
    Dim kovast As Variant
    Dim pstebz As Variant
    Dim pskzli As Variant
    Dim prueb As Variant
    Dim pspdkz As Variant
    Dim psbes1 As Variant
    Dim psmek1 As Variant
    Dim pslfs1 As Variant
    Dim p9mek1 As Variant
    Dim p9swgs_v As Variant
    Dim p9swgs_n As Variant
    Dim p9sngs_v As Variant
    Dim p9sngs_n As Variant
    Dim p9algs_v As Variant
    Dim p9algs_n As Variant
    Dim p9sfgs_v As Variant
    Dim p9sfgs_n As Variant
    Dim koyald1 As Variant
    Dim pskzli01 As Variant
    Dim pskzli02 As Variant
    Dim key As String
    Dim keys (0 To 2) As String

    Dim session As New NotesSession

    Dim fileNum As Integer
    Dim now_time As String
    Dim dateTime As New NotesDateTime( "" )
    dateTime.LSLocalTime = Now
    Call dateTime.SetNow
    now_Time = dateTime.LocalTime



    ' fileNum% = Freefile()
    ' Open "g:\logs\NotesAgentLog.txt" For Append As fileNum%
    ' Print #fileNum%, now_Time", " ; "Agent zum kopieren Zeitenpool zu Zeiten fuer OCS gestartet"
    ' Close fileNum%

    Set dbzeiten = New notesDatabase ("OCS02/OCS GmbH","Zeiten.nsf")
    Set dbzeitenpool = New notesDatabase ("OCS02/OCS GmbH","Zeitenpool.nsf")
    Set collectzeitenpool = dbzeitenpool.alldocuments

    Set viewzeiten = dbzeiten.getview ("ugabe")


    Print collectzeitenpool.count
    For i = 1 To collectzeitenpool.count

    Set zeitenpooldoc = collectzeitenpool.GetNthDocument(i)

    koaunr = zeitenpooldoc.GetItemValue( "KOAUNR" )
    psposi = zeitenpooldoc.GetItemValue( "PSPOSI" )
    pkadr1 = zeitenpooldoc.GetItemValue( "pkadr1" )
    adadr1 = zeitenpooldoc.GetItemValue( "adadr1" )
    pkadr101 = zeitenpooldoc.GetItemValue( "pkadr101" )
    kovast = zeitenpooldoc.GetItemValue( "kovast" )
    pstebz = zeitenpooldoc.GetItemValue( "pstebz" )
    pskzli = zeitenpooldoc.GetItemValue( "pskzli" )
    prueb = zeitenpooldoc.GetItemValue( "prueb" )
    pspdkz = zeitenpooldoc.GetItemValue( "pspdkz" )
    psbes1 = zeitenpooldoc.GetItemValue( "psbes1" )
    pslfs1 = zeitenpooldoc.GetItemValue( "pslfs1" )
    p9mek1 = zeitenpooldoc.GetItemValue( "p9mek1" )
    p9swgs_v = zeitenpooldoc.GetItemValue( "p9swgs_v" )
    p9swgs_n = zeitenpooldoc.GetItemValue( "p9swgs_n" )
    p9sngs_v = zeitenpooldoc.GetItemValue( "p9sngs_v" )
    p9sngs_n = zeitenpooldoc.GetItemValue( "p9sngs_n" )
    p9algs_v = zeitenpooldoc.GetItemValue( "p9algs_v" )
    p9algs_n = zeitenpooldoc.GetItemValue( "p9algs_n" )
    p9sfgs_v = zeitenpooldoc.GetItemValue( "p9sfgs_v" )
    p9sfgs_n = zeitenpooldoc.GetItemValue( "p9sfgs_n" )
    koyald1 = zeitenpooldoc.GetItemValue( "koyald1" )
    pskzli01 = zeitenpooldoc.GetItemValue( "pskzli01" )
    pskzli02 = zeitenpooldoc.GetItemValue( "pskzli02" )

    keys(0) = koaunr(0)
    keys(1) = psposi(0)
    key = keys(0) + " " + keys(1)


    Set collectzeiten = viewzeiten.getalldocumentsbykey(key,exact)
    Print collectzeiten.count


    If (collectzeiten.count = "0") Then
    Set zeitendoc = New NotesDocument( dbzeiten )
    Call zeitenpooldoc.CopyAllItems( zeitendoc, True )
    Call zeitenpooldoc.ReplaceItemValue("psbes1", zeitenpooldoc.GetItemValue( "psbes1")(0) -1000000)
    Call zeitendoc.Save( True, True )


    End If

    For a = 1 To collectzeiten.count

    Set zeitendoc = collectzeiten.GetNthDocument(a)

    Call zeitendoc.replaceItemValue("KOAUNR", koaunr )
    Call zeitendoc.replaceItemValue( "PSPOSI" , psposi)
    Call zeitendoc.replaceItemValue( "pkadr1" , pkadr1)
    Call zeitendoc.replaceItemValue( "adadr1" , adadr1)
    Call zeitendoc.replaceItemValue( "pkadr101" , pkadr101)
    Call zeitendoc.replaceItemValue( "kovast" , kovast)
    Call zeitendoc.replaceItemValue( "pstebz" , pstebz)
    Call zeitendoc.replaceItemValue( "pskzli" , pskzli)
    Call zeitendoc.replaceItemValue( "prueb" , prueb)
    Call zeitendoc.replaceItemValue( "pspdkz" , pspdkz)
    ' Call zeitendoc.replaceItemValue( "psbes1" , psbes1)
    Call zeitenpooldoc.ReplaceItemValue("psbes1", zeitenpooldoc.GetItemValue( "psbes1")(0) -1000000)
    Call zeitendoc.replaceItemValue( "psmek1" , psmek1)
    Call zeitendoc.replaceItemValue( "pslfs1" , pslfs1)
    Call zeitendoc.replaceItemValue( "p9mek1" , p9mek1)
    Call zeitendoc.replaceItemValue( "p9swgs_v" , p9swgs_v)
    Call zeitendoc.replaceItemValue( "p9swgs_n" , p9swgs_n)
    Call zeitendoc.replaceItemValue( "p9sngs_v" , p9sngs_v)
    Call zeitendoc.replaceItemValue( "p9sngs_n" , p9sngs_n)
    Call zeitendoc.replaceItemValue( "p9algs_v" , p9algs_v)
    Call zeitendoc.replaceItemValue( "p9algs_n" , p9algs_n)
    Call zeitendoc.replaceItemValue( "p9sfgs_v" , p9sfgs_v)
    Call zeitendoc.replaceItemValue( "p9sfgs_n" , p9sfgs_n)
    Call zeitendoc.replaceItemValue( "koyald1" , koyald1)
    Call zeitendoc.replaceItemValue( "pskzli01" , pskzli01)
    Call zeitendoc.replaceItemValue( "pskzli02" , pskzli02)
    Call zeitendoc.save (True,True )





    Next ' collectzeiten



    Next ' collectzeitenpool




    ' fileNum% = Freefile()
    ' Open "g:\logs\NotesAgentLog.txt" For Append As fileNum%
    ' Print #fileNum%, now_Time", " ; "Agent zum kopieren Zeitenpool zu Zeiten fuer OCS beendet"
    ' Close fileNum%

    Print "Kopieren Zeitenpool zu Zeiten für OCS beendet"




    End Sub

    • Offizieller Beitrag

    zu Deinem Code:
    Erstmal ein paar Optimierungen

    Code
    For i = 1 To collectzeitenpool.count   Set zeitenpooldoc = collectzeitenpool.GetNthDocument(i)   ...Next


    Code
    For a = 1 To collectzeiten.count   Set zeitendoc = collectzeiten.GetNthDocument(a)   ...Next


    GetNthDocument in DocumentCollection ist sehr inperformant. Besser ist es

    Code
    Set zeitenpooldoc = collectzeitenpool.GetFirstDocumentWhile Not zeitenpooldoc is nothing   ...   Set zeitenpooldoc = collectzeitenpool.GetNextDocument(zeitenpooldoc)Wend


    oder noch performanter

    Code
    Set zeitenpooldoc = collectzeitenpool.GetFirstDocumentFor a = 1 To collectzeiten.count   ...   Set zeitenpooldoc = collectzeitenpool.GetNextDocument(zeitenpooldoc)Next


    zu verwenden.


    Code
    Set dbzeiten = New notesDatabase ("OCS02/OCS GmbH","Zeiten.nsf")Set dbzeitenpool = New notesDatabase ("OCS02/OCS GmbH","Zeitenpool.nsf")


    warum feste codiert? - Besser ist es sowas aus einen Konfig-Dokument auszulesen bzw. wenn es sich um die DB handelt in der das Script läuft

    Code
    Set db = session.CurrentDatabase

    zu verwenden.


    Zur Berechnung:

    Code
    ...
    Call zeitendoc.replaceItemValue( "prueb" , prueb)
    Call zeitendoc.replaceItemValue( "pspdkz" , pspdkz)
    ' Call zeitendoc.replaceItemValue( "psbes1" , psbes1)
    Call zeitenpooldoc.ReplaceItemValue("psbes1", zeitenpooldoc.GetItemValue( "psbes1")(0) -1000000)
    Call zeitendoc.replaceItemValue( "psmek1" , psmek1)
    Call zeitendoc.replaceItemValue( "pslfs1" , pslfs1)
    ...

    Du schreibst mit großer Wahrscheinlichkeit den Wert ins falsche Dokument. Du benutzt immer zeitendoc und bei der Berechnung zeitenpooldoc. Wenn dies so trotzdem richtig ist, dann hast Du vergessen zeitenpooldoc zu speichern.


    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

  • Hallo nochmal!!!


    Wollte nur eine Erfolgmeldung geben; hat jetzt funktioniert.
    Super!!! Vielen Dank!!!


    Das Problem war wirklich das falsche Dokument; und weiterhin vielen Dank für die Info zur Verbesserung des Codes!!!


    Werde ich versuchen umzusetzen.


    Gruß
    Achim