agent zu langsam?

  • hallo,


    ich habe einen agenten geschrieben der aus einer anderen Datenbank datne holen soll (urlaubsdaten) und in dieser datenbank zur weiteren Verwendung speichern soll.


    Ich habe den Eindruck das dieser Agent sehr sehr langsam ist.


    Kann das an einer "seltsamen" programmierung liegen?


    hier mein codestück:


    REM erstmal alle Urlaubsformulare löschen
    searchform$ = {FORM = "Urlaub"}
    Set collection = db.Search(searchform$, Nothing, 0)
    Call collection.RemoveAll(True)
    REM Jetzt die Urlaubsdaten aus der Formulardatenbank holen
    searchform$ = {FORM = "ORDER"}
    Set collection = formular.Search(searchform$, Nothing, 0)
    Set formulardoc = collection.GetFirstDocument()
    While Not(formulardoc Is Nothing)
    Set doc = db.CreateDocument
    doc.Form = "Urlaub"
    doc.Name = Evaluate("@NameLookup([NOUPDATE];""" & formulardoc.GetItemValue("CreatedBy")(0) & """;""LastName"")")
    doc.Startdatum = formulardoc.GetItemValue("vom_1")
    doc.Enddatum = formulardoc.GetItemValue("bis_1")
    Call doc.ComputeWithForm(False,False)
    Call doc.Save(True, True)
    Set formulardoc= collection.GetNextDocument(formulardoc)
    Wend



    ------------------------------


    Hat jemand eine idee?

  • Was heisst du hast den Eindruck ?


    Prüf es doch mal indem du die verstrichene Zeit ausgeben lässt.


    Eventuell könnte es z.b. an deiner Maske in deiner DB liegen, wenn diese recht umfangreiche Berechnungen in den feldern durchführt, dann braucht ein ComputeWithForm auch recht lange
    Und je nachdem wieviel Dokumente du da anlegst multipliziert sich diese zeit

  • das dokument an sich ist nicht umfangreich..da stehen sechs felder drin..wobei ich drei mit einem dblookup auf andere dokumente in der gleichen datenbank berechnen lasse...da soll dann einfach eine nummer geholt werden aus einem anderen Dokument..und was heisst bei dir viele dokumente? es sind vielleicht alles in allem 300-500 dokumente die dort erzeugt werden müssen. die zeit die er braucht ist aber unverhältnismässig viel....(20 Min etwa)

  • Das wären dann durschschnittlich etwa 2,5 Sekunden pro Dokument bei 500 Dokumenten.
    Wenn du alle Dokumente löschst und dann jedesmal drei DBLookups auf noch nicht aufgebaute Views machst dann könnte das schon hinkommen.


    Schliesslich läuft das Speichern deines Dokumentes so ab:


    Feld1 mach DBLookup
    Ansicht für DBLookup wird aufgebaut
    Feld2 mach DBLookup
    Ansicht für DBLookup wird aufgebaut
    Feld3 mach DBLookup
    Ansicht für DBLookup wird aufgebaut


    Und das passiert ja bei jedem Dokument

  • ok..wie kann ich es denn dann optimieren?


    ich war der meinung das ich die dokumente und ansichten die er sozusagen als unterste ebene hat ..zuerst mache.....und dann eben die anderen......


    in diesem fall lösche ich nur die Dokumente "urlaub" und beziehe mich mit compute with form auf schon bestehende ansichten....wo wird da soviel zeit verschwendet?..diese ansichten bestehen doch schon....oder meinst du er baut für ein dblookup jeweils eine temporäre ansicht auf?



    ich habe zwar viele urlaubsdokumente..aber für jeden mitarbeiter nur ein dokument..aus dem ich mit dblookup daten hole..gibt es da vielleicht etwas schnelleres?

    • Offizieller Beitrag

    indem Du nur einen DBLookup machst und eien String holst in der Form


    Wert1~wert2~wert3~...~wertn


    Mit einem @Word(...) kannst DU dann den String wieder auseinandernehmen.


    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

  • Die Ansichten existieren schon, aber jedesmal wenn du ein Dokument der Datenbank hinzufügst muss der Ansichtsindex aktualisiert werden. Und das kostet auch etwas Zeit.
    Dann noch die DBLookups und andere Feldvalidierungen, -umsetzungen und du hast die Zeit zusammen

  • einen dblookup mit allen werten drin hört sich erstmal gut an,


    ABER ich lese das ganze zwar in einem Agenten ein, aber die DBLOOKUPS sind in den einzelnen Feldern und werden dann doch per computewithform erst bearbeitet in dem script sozusagen per "fern" ausgelöst....(ist ja lotusscript und ich habe keine entsprechung für dblookup im lotusscript..oder wie macht ihr das?)


    zweite frage.....wäre eine collection mit einem dokument und die bearbeitung dieser collection schneller?

  • Ob jetzt "fern" ausgelöst oder nicht, Zeit braucht es immer.


    Im Script machst du das entweder über GetDocumentByKey/GetAllDocumentyByKey oder über Evaluate die DBLookup Formel einbinden.


    Deine zweite Frage verstehe ich nicht.

  • ok...ist denn "documentbykey" schneller als dblookup?


    dann kann man ja wieder deine "zeitrechnung" aufmachen und gegenrechnen..somit würde ich mein script ja optimieren können und ich muss nciht alles ausprobieren..zumal das script bei einmal ausprobieren eine halbe std. läuft momentan


    ausserdem....wenn ich mehrere werte auf einmal aus einem dblookup holen will..in der hilfe steht aber nur ein wert...


    kann mal jemand den befehl posten mit mehreren Feldern auf einmal? das habe ich nämlich nicht genau verstanden wie man das macht..


    @DbLookup("":"ReCache";"":"";"Ressourcen";Ressourcennummer;"Gesperrt"+"~"+"Funktion")


    geht das so?

  • Nein im Normalfall nicht, außer du ersetzt z.B. drei DBLookups durch ein getDocumentByKey, dann ist GetDocumentByKey schneller.


    Ich würde an deiner Stelle erst mal testen an welchem Part genau dieser Zeitverbrauch stattfindet, indem du eben ein Time Logging einführst.


    Ohne deine Masken, deine Formeln, den Aufbau deiner Datenbank,... zu kennen ist das reine Rumraterei was man machen könnte.


    So als Beispiel: Wenn du z.B. Zeitfunktionen in deinen Lookup Ansichten drin ist, dann werden die dadurch schon im Aufbau ewig langsam. Hierbei könntest du an den DBLookups rumschrauben soviel du willst. Es würde nichts bringen, da der Zeitverlust ganz woanders herkommt.

  • Ok....um das ganze mit nur einem dblookup zu machen, was die zeit rapide abkürzt, habe ich meine Ansicht durch ein Kombifeld aus drei feldern ergänzt und ichh möchte nun dieses Kombifeld mit einem


    Evaluate in den LotusScript einfügen.....seltsamerweise
    gibt er mir eine Fehlermedlung heraus das ihm ein Semikolon fehlt..


    ich kann nur keinen Fehler entdecken in der formel..hab ich was auf dem auge?


    info$ = Evaluate("@dblookup("":"ReCache";"":"";"Ressourcen";doc.Name;"Gesamt")")



    kann vielleicht mal jemand schauen.....:-(

  • Anführungszeichen innerhalb eines Textes werden in Script entweder durch ein doppeltes Anführungszeichen dargestellt oder du machst aussen um den Text ein {} rum.


    Außerdem musst du das doc.Name ausserhalb des Strings haben

  • ok...das hat mich schon weitergebracht


    jetzt schmeisst er nen Typemismatch raus:


    info = Evaluate("@dblookup("""":""ReCache"";"""":"""";""Ressourcen"";" & doc.Name & ";""Gesamt"")")



    sorry für die zähe programmierung..aber vielleicht liegts heute am fussball :)

  • Hast du überhaupt schon mal Script programmiert ?


    Denn dann weiss man, daß wenn man einen Feldwert an einen Text anhängen will man immer mit nem (0) arbeiten muss oder aber den Feldarray in einen String umwandeln muss

  • oh..du musst dir vorstellen das lotus script nicht das einzige ist was ich mache (es gibt da auch noch ein erp system womit ich mich eigentlich beschäftige und dort ebenfalls was tun muss in sachen programmierung)......da kommen eben auch mal so BAsics vor....ich weiss das das doof klingt, aber wenn ich alle paar wochen mal etwas versuche zu programmieren, dann wirds eben immer mal etwas zähflüssig und ich bin nicht so geübt darin..trotz schulungen....




    aber wieder zurück zum thema.....das evaluate hat er nun gefressen..


    aber manchmal findet die evaluateformel keinen wert..das ist normal weil manche mitarbeiter kein passendes dokument haben...

    er schmeisst mir in der jetzigen konfiguration bei ReplaceItemValue ein operationfailed aus



    info = Evaluate("@dblookup("""":""ReCache"";"""":"""";""Ressourcen"";" & doc.Name(0) & ";""Gesamt"")")
    Call doc.ReplaceItemValue("Ressourcennummer",info)


    hab nochmal geguckt..er schmeisst ein operation failed nach sechs erfolgreichen zugriffen heraus bei einem bestimmten formular..das auch kein zugeordnetes formular hat.....


    kann ich dieses "operation failed" irgendwie abfangen und übergehen??????

  • Hallo Pegasus,


    ich würde das nicht mit Commands machen.
    Erstelle doch in der Quelldatenbank eine Ansicht in der die Daten angezeigt werden die du von der Datenbank holen willst.
    Mit deinem Agenten gehst du dann auf diese Ansicht und holst dir von jedem Dokument die Daten die du haben willst und erstellst dann in deiner Ziel Datenbank ein neues Dokument.

    73 x Version 9.0.1 Server, 2500 x 8.5.2 - 8.5.3 Clients alles auf Win

  • hallo, das will ich ja gerade machen....zur verdeutlichung:


    ich habe in der einen datenbank Ressourcen....eine untermenge der mitarbeiter. In einer anderen datenbank urlaubsanträge aller mitarbeiter (wobei diese nun keine Ressourcennummer haben)


    jetzt will ich eigentlich in der Ressourcendatenbank formulare aufbauen für spätere verwendung...nämlich


    Ressource, Urlaubsstart, Urlaubsende...weitere Infos zur Ressource



    er muss also einen MIX erzeugen aus diesen beiden datenbanken


    in pseudocode :


    hole mir alle Urlaube
    pro Urlaub guck ob es eine Ressource gibt (zu identifizieren über den Namen)
    wenn ja, dann erzeuge ein neues dokument mit
    ressourcenummer, urlaubsstart, urlaubsende
    ansonsten
    verwerfe den urlaub in dieser Datenbank weil er nicht gebraucht wird



    pro urlaub guck --> ist ja gerade die evaluate(dblookup..) zeile

  • Das meine ich ja.


    Erstelle in deiner Urlaubsdatenbank eine Ansicht mit den Urlauben.
    Geht ein Dokument nach dem anderen durch und hole den ersteller aus dem Dokument (je besser deine Ansicht ist desto schnelle arbeitet dein Agent z.b. nur die Urlaube > Heute oder so).
    Hast du dann ein Dokument aus der Ansicht dann gehe mit dem Namen in deine Resource DB und gehe dann in eine Ansicht in der die Resourcen angezeigt werden. Dann vergleiche und erstelle.

    73 x Version 9.0.1 Server, 2500 x 8.5.2 - 8.5.3 Clients alles auf Win