Das Notes Forum

Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: Basti* am 11.01.13 - 11:48:20

Titel: Wie ScriptVoodoo bekämpfen?
Beitrag von: Basti* am 11.01.13 - 11:48:20
Hallo miteinander!

Ich dreh hier bald am Rad. Ich hab ein Script, das mir Kopfzerbrechen macht.

Was ich bisher weiß:

- Das Script läuft als lokale DB auf meinem 7er Client & Designer-Computer rund. Alles ok.
- Wird es auf den Server gespielt (8.5er o.s.ä.), fliegt es aus der Kurve.
- Die Fehler-Meldung: Function requires a valid ADT argument.
- Schalte ich den Debugger ein und hangel mich mehr oder weniger manuel von Zeile zu Zeile, läuft das Script mal durch und mal nicht.


Das Teil-Script, wo er rausfliegt:

.................................................
               :
               :
Set db = session.CurrentDatabase
Set view = db.GetView(viewname)
Set vc = view.AllEntries

Set entry = vc.GetFirstEntry()
   
While Not (entry Is Nothing)   
        Set doc = entry.Document
>>> Call dc.AddDocument(doc) <<<
        Set entry = vc.GetNextEntry(entry)
Wend
               :
               :
.................................................

Der Debugger zeigt, dass das doc auch wirklich leer ist. Aber entry ist nicht leer! Wie kann das sein!? Entweder ich habe ein Dokument in der Ansicht, dann gibt es ein Entry und dann müsste ich darüber wieder das Doc bekommen. Oder es gibt kein Document, dann gibt es auch keinen Entry und dann will ich ja auch kein Dokument haben. Was hab ich hier falsch verstanden?!

Kleine Anmerkung:
vc.Count (ViewEntryCollection) = 5000
entry.ISDOCUMENT = TRUE

Und wie kann es sein, dass der Fehler mal auftritt und mal nicht? Ich hab leider noch keine Gesetztmäßigkeit gefunden. Ich dachte erst, wenn ich das Script als ganzes laufen lasse, gehts schief und wenn ich es Step-By-Step durchklicke, geht es gut. Aber das stimmt nun wohl doch nicht.

Hat jemand da einen Tipp, wie ich dem Übel auf die Spur kommen kann?

Basti


Titel: Re: Wie ScriptVoodoo bekämpfen?
Beitrag von: m3 am 11.01.13 - 11:59:58
Zitat
This error occurs when a LotusScript function or method is supplied a parameter that does not evaluate to the expected object value - it has been passed an invalid argument. Some reasons this error could occur would be because the object was not set, it was deleted or moved, or it was incorrectly specified in an earlier reference.
...
In most cases, this error can be avoided by adding conditionals, or revising code logic, to ensure that an attempt to access a deleted object, or an object with a value of Nothing, is avoided.
http://www-01.ibm.com/support/docview.wss?uid=swg21316690

Siehe auch http://www-01.ibm.com/support/docview.wss?uid=swg21093032
Titel: Re: Wie ScriptVoodoo bekämpfen?
Beitrag von: Peter Klett am 11.01.13 - 12:00:53
Hast Du es mal ohne Entry probiert?

Set db = session.CurrentDatabase
Set view = db.GetView(viewname)

Set doc = view.GetFirstDocument()
  
While Not (doc Is Nothing)  
>>> Call dc.AddDocument(doc) <<<
        Set doc = view.GetNextDocument (doc)
Wend

Ist auch kürzer.

Eine Fehlerursache könnten Lesersteuerungen sein. Vielleicht wird ein Entry gefunden, aber für das dazugehörige Dokument fehlt der Lesezugriff (nur so aus dem Bauch, habe noch nie diese Methode benutzt).
Titel: Re: Wie ScriptVoodoo bekämpfen?
Beitrag von: Driri am 11.01.13 - 12:35:53
Das ist aber keine kategorisiert View oder ?

Weil View Entries sind auch Kategoriezeilen und Summen. Prüf doch zur Not einfach mit entry.IsDocument ab, ob es tatsächlich ein Dokument ist.
Titel: Re: Wie ScriptVoodoo bekämpfen?
Beitrag von: Basti* am 14.01.13 - 09:27:50
Guten Morgen zusammen!

Vielen Dank für eure Tipps :) Die klingen gut. Werd ich gleich mal austesten.

Basti
Titel: Re: Wie ScriptVoodoo bekämpfen?
Beitrag von: Basti* am 15.01.13 - 09:29:02
Ich hab nun den Vorschlag von Peter Klett umgesetzt und lasse die Entries außen vor und schnappe mir gleich die Docs. Faszinierender Weise läuft dann auch noch so einiges merkwürdig. Ich hab plötzlich Dokumente ohne Inhalt => Felder = leer, kein CrerateDate, keinen Creator, etc..

Und da kommt der Gedanke von Driri ins Spiel: es ist zwar keine Kategorie, aber so ähnlich! Das Flag IsValid = false und IsDeleted=true. Irgendwas ist komisch. Warum die Docs gelöscht und nicht valid sind, kann ich noch nicht erklären, aber zumindest scheint es sehr hilfreich, ein Doc vor der Verwendung auf isValid und isDeleted zu prüfen. (=> Aufwand => *nerv*)

Ein Gedanke: kann es daran liegen, dass ich die Doks in der Ansicht zu erst komplett lösche, dann dort haufwenweise neue erzeuge und diese sofort wieder über db.getView einlese? Alles quasi in einem Atemzug. Ein refresh der Ansicht mache ich vorher eigentlich noch. Aber vielleicht reicht das ja nicht?!

Grüße
Basti
Titel: Re: Wie ScriptVoodoo bekämpfen?
Beitrag von: Driri am 15.01.13 - 11:56:24
Das sind vermutlich Deletion Stubs. Wenn Du auf Nummer Sicher gehen willst, mußt Du auf IsValid prüfen.
Titel: Re: Wie ScriptVoodoo bekämpfen?
Beitrag von: Basti* am 15.01.13 - 14:21:56
Deletion Stubs? Aha .. ok ... Hab gelesen, dass es die Dinger gibt, man sie ggf. los werden oder zählen möchte, aber was hat es damit auf sich? Kommt irgendwie beim Löschen und wird x Tage vorgehalten, aber was, warum und wieso???  ???
Titel: Re: Wie ScriptVoodoo bekämpfen?
Beitrag von: Mitch am 15.01.13 - 14:45:53
Deletion Stubs? Aha .. ok ... Hab gelesen, dass es die Dinger gibt, man sie ggf. los werden oder zählen möchte, aber was hat es damit auf sich? Kommt irgendwie beim Löschen und wird x Tage vorgehalten, aber was, warum und wieso???  ???

Wird für die Replikation benötigt. Damit der andere Server weiß, was er denn löschen soll.

Man sollte die Dinger nicht unnötig produzieren. Du schriebst von "haufenweise löschen und neu anlegen" - für den Fall, dass das "Aktualisieren für Faule" ist: Besser echt aktualisieren. ;)

Gruß,

Mitch
Titel: Re: Wie ScriptVoodoo bekämpfen?
Beitrag von: Basti* am 15.01.13 - 16:30:02
Das heißt, wenn ich ein Dokument lösche, wird jedes mal so ein Deletion-Stubs-Dings erzeugt?? Ok.

"Aktualisieren für Faule"? ... hmmm ... weiß nicht, obs das ist ... ;)

Ich muß einmal am Tag (beim Entwickeln & Debuggen öfters) eine Datei mit rund 50.000 Datensätzen importieren. Jeder Datensatz wird dabei ein neues HilfsDokument. Mit den HilfsDokumenten aktualisiere ich dann die Hauptdokumente.

Bei jedem neuen Import schmeiß ich alle HilfsDokumente wieder weg. Sprich: ich lösche sie. Um dann wieder neue anzulegen.

Das Verfahren ist was die Stubs betrifft wohl nicht so gut, oder??

Basti
Titel: Re: AW: Wie ScriptVoodoo bekämpfen?
Beitrag von: Mitch am 15.01.13 - 16:39:16
Wenn du nicht replizierst, ist es vermutlich kein Drama mit den ganzen Löschungen.

Ginge aber vielleicht schneller ohne. Zum Beispiel wenn du die alten Dokumente wiederverwerten würdest.

Bei 50.000 temporären Dokumenten würde ich aber überlegen ob es keinen anderen Weg gibt um die Hauptdokumente zu aktualisieren. Hört sich irgendwie umständlich an. :)

Gruß,

Mitch
Titel: Re: Wie ScriptVoodoo bekämpfen?
Beitrag von: DAU-in am 15.01.13 - 17:39:15
Wenn du /dein Server die DB replizierst, sind die Deletion-Stubs eine absolute Katastrophe.

Es ergibt bei 50.000 Dokumenten täglich im Monat 1,5 Mio neue Deletionstubs.

Aber auch wenn du bzw. dein Server deine DB nicht replizierst, ist das ständige Neuanlegen und Löschen eine Katastrophe für den Indexer, und mit einer ziemlichen Sicherheit komplett überflüssig. In diesem Fall solltest du unbedingt bei den Replication Settings der DB die Aufbewahrungszeit für nicht bearbeitete Dokumente von 90 (Standard) heruntersetzen (ohne den Haken dort zu setzen).

Und langfristig solltest du dieses Verfahren umstellen.
Vor allem, wenn eure Admins in Laufnähe untergebracht sind und mal kurz vorbeikommen könnten, um mit dir Szenen aus dem Film 'Herr der Ringe' nachzustellen.
Titel: Re: Wie ScriptVoodoo bekämpfen?
Beitrag von: Basti* am 15.01.13 - 18:08:14
Verflixt, selbst wenn man denkt, man hat das mit Notes so halbwegs verstanden, gibt es doch immer noch so einige ungeahnte Stolperfallen. Danke für eure Hinweise!! :)

Will sehen, dass ich meinen Prozess umbaue. Admins sind bekanntlich am längeren Hebel ;D
Basti
Titel: Re: Wie ScriptVoodoo bekämpfen?
Beitrag von: DAU-in am 15.01.13 - 18:54:38
Was genau machst du beim Aktualisieren?

Das geht bestimmt auch ohne die Massenlöschung.