Dokumente vergleichen und Felder updaten

  • Hallo Leute,


    ich importiere aus einer Excel Datei ca. 2000 Datensätze mit einem Agent in eine View "Import" in einer DB.
    Ich wollte jetzt die ca. 2000 Dokumente die sich in der View "Import" befinden mit den Dokumenten in der View "Lager" vergleichen. Der Key für den Vergleich würde die Produktnummer sein.
    Ich wollte das mit einem Agent machen der die Dokumente in den beiden Views vergleicht und wenn es die Produktnummer schon gibt, dann sollen 2 Felder upgedatet werden. Wenn es die Produktnummer noch nicht gibt soll ein neues Dokument in der View "Lager" erstellt werden.



    Habt ihr ne Idee wie ich da am besten starten kann?


    Danke

    • Offizieller Beitrag

    mach eine Schleife über die 2000 Dokumente.
    Für jedes Dokument prüfst Du ob in der Lager DB die Prod-Nr vorhanden ist (NotesView.GetDocumentByKey).
    Bekommst Du ein Dokument zurück, kopierst Du die 2 Felder in das Lager-Dokument (NotesItem.CopyItemToDocument).
    Bekommst Du kein Kokument zurück, dann kopierst Du das Dokument (NotesDocument.CopyToDatabase).


    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

  • Hab jetzt folgenden Script:


    Aber irgendwo klemmt es noch. Der Agent läuft zwar durch aber es passiert nichts.



    Sub Initialize
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim doc As NotesDocument
    Dim view As NotesView
    Dim itemA As NotesItem
    Dim itemB As NotesItem

    Set db = session.CurrentDatabase
    Set view =db.GetView( "Textfileimport" )
    Set doc = view.getdocumentbykey("PN1", True)

    If doc Is Nothing Then

    Set view = db.GetView("Lager")

    'Neues Doc erstellen

    Set doc = New NotesDocument(db)

    'Maske
    doc.form="Test"

    Else

    Set view = db.GetView("Lager")

    Set itemA = doc.GetFirstItem( "Menge" )
    Set itemB = doc.GetFirstItem( "Lagerort" )

    Call itemA.CopyItemToDocument( Test, "AufLager" )
    Call itemB.CopyItemToDocument( Test, "Lagerort" )


    End If



    End Sub

    • Offizieller Beitrag

    Du musst das Dokument noch speichern.


    Irgendwie fehlt da noch die Schleife über alle Dokumente und wenn es kein Dokument im Lager gibt, erstellst Du ein leeres Dokument mit der Form "Test".


    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

  • Hey bin auf einpaar Probleme gestoßen.
    Ich bekomm eine Fehlermeldung "Object variable not set" bei Set itemA......
    Hab aber leider keine Idee.
    Und könnte die schleife funktionieren?


    Danke



    Sub Initialize
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim doc As NotesDocument
    Dim view As NotesView
    Dim itemA As NotesItem
    Dim itemB As NotesItem
    Dim itemC As NotesItem
    Dim uidoc As NotesUIDocument
    Dim uidocNeu As NotesUIDocument
    Dim workspace As New NotesUIWorkspace

    Set db = session.CurrentDatabase
    Set view =db.GetView( "Textfileimport" )
    Set doc = view.getdocumentbykey("SAPNum", True)


    Do While doCount% < 10000
    doCount% = doCount% + 1


    If doc Is Nothing Then

    Set view = db.GetView("Lager")

    'Neues Doc erstellen

    Set doc = New NotesDocument(db)

    'Maske
    doc.form="Test"
    Set itemA = doc.GetFirstItem( "AufLager" )
    Set itemB = doc.GetFirstItem( "Lagerort" )
    Set itemC = doc.GetFirstItem( "SAPNum")

    Call itemA.CopyItemToDocument( Test, "AufLager" )
    Call itemB.CopyItemToDocument( Test, "Lagerort" )
    Call itemC.CopyItemToDocument( Test, "SAPNum" )

    Else


    Set view = db.GetView("Lager")

    Set itemA = doc.GetFirstItem( "AufLager" )
    Set itemB = doc.GetFirstItem( "Lagerort" )
    Set itemC = doc.GetFirstItem( "SAPNum")

    Call itemA.CopyItemToDocument( Test, "AufLager" )
    Call itemB.CopyItemToDocument( Test, "Lagerort" )
    Call itemC.CopyItemToDocument( Test, "SAPNum" )

    End If

    doc.Save True, True, True

    Loop

    End Sub

  • Hallo,


    na da passt noch was nicht ganz...


    die Schleife würde ich über den view machen, dann hasst du auch alle Dokumente durch:



    Außerdem musst Du die verschiedenen Dokumente auseinanderhalten. Wenn du ein neues Dokument in der Datenbank erstellst, solltest Du einen anderen Objektnamen wählen wie in der Schleife.


    Gruß,
    Gerd

  • Der Fehler liegt daran, dass Du die Variable view doppelt verwendest. Sobald Du die Zeile
    Set view = db.GetView("Lager")
    erreichst, wird die Variable doc zurückgesetzt.


    Hintergrund ist, dass sobald der Garbage Collector von LotusScript merkt, dass eine Variable frei wird (in diesem Fall die Variable "view"), werden alle Objecte, deren Zugriff über diese Variable erfolgte ebenfalls gelöscht.


    Du musst einfach in Deinem Script eine zweite Variabe für die Ansicht "Lager" einfügen. Dann sollte der Fehler nicht mehr passieren.


    Aber abgesehen von dem Problem mit der Fehlermeldung, macht Dein Agent so überhaupt nicht, was er soll.


    Dieser Agent sollte eigentlich funktionieren:


    Eventuell musst Du die Feldnamen noch einmal überprüfen.


    Allgemein solltest Du Dir angewöhnen, sprechende Variablennamen zu verwenden, sobald Du mehr als zwei Dokumentarten und/oder Ansichten usw. hast.


    So, jetzt habe ich doch wieder wesentlich mehr geschrieben als ich eigentlich wollte. ;)