Autor Thema: Wie ScriptVoodoo bekämpfen?  (Gelesen 8645 mal)

Offline Basti*

  • Junior Mitglied
  • **
  • Beiträge: 87
Wie ScriptVoodoo bekämpfen?
« 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



Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Re: Wie ScriptVoodoo bekämpfen?
« Antwort #1 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
HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Wie ScriptVoodoo bekämpfen?
« Antwort #2 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).

Driri

  • Gast
Re: Wie ScriptVoodoo bekämpfen?
« Antwort #3 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.

Offline Basti*

  • Junior Mitglied
  • **
  • Beiträge: 87
Re: Wie ScriptVoodoo bekämpfen?
« Antwort #4 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

Offline Basti*

  • Junior Mitglied
  • **
  • Beiträge: 87
Re: Wie ScriptVoodoo bekämpfen?
« Antwort #5 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

Driri

  • Gast
Re: Wie ScriptVoodoo bekämpfen?
« Antwort #6 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.

Offline Basti*

  • Junior Mitglied
  • **
  • Beiträge: 87
Re: Wie ScriptVoodoo bekämpfen?
« Antwort #7 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???  ???

Mitch

  • Gast
Re: Wie ScriptVoodoo bekämpfen?
« Antwort #8 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

Offline Basti*

  • Junior Mitglied
  • **
  • Beiträge: 87
Re: Wie ScriptVoodoo bekämpfen?
« Antwort #9 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

Mitch

  • Gast
Re: AW: Wie ScriptVoodoo bekämpfen?
« Antwort #10 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

Offline DAU-in

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.129
  • Geschlecht: Weiblich
  • - unterwegs -
Re: Wie ScriptVoodoo bekämpfen?
« Antwort #11 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.
mühsam ernährt sich das Eichhörnchen

aktuelle Tätigkeit: Feldschubse

Offline Basti*

  • Junior Mitglied
  • **
  • Beiträge: 87
Re: Wie ScriptVoodoo bekämpfen?
« Antwort #12 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

Offline DAU-in

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.129
  • Geschlecht: Weiblich
  • - unterwegs -
Re: Wie ScriptVoodoo bekämpfen?
« Antwort #13 am: 15.01.13 - 18:54:38 »
Was genau machst du beim Aktualisieren?

Das geht bestimmt auch ohne die Massenlöschung.
mühsam ernährt sich das Eichhörnchen

aktuelle Tätigkeit: Feldschubse

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz