Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: Joe Kinley am 27.01.04 - 16:49:40
-
Wie ich diese Fehlermeldung hasse. Beim Scripten mit Lotus und Probieren vieler Scripte, und Scriptteile ist mir noch nie so oft ein bestimmter Fehler zuvorgekommen, wie der "Object Variable not set". Und ich weiß echt nicht weiter. Egal was ich versuche, alles führt doch auf diesen Fehler zurück. Mein Script ist nahezu fertiggestellt, sollte dieser Fehler behoben werden.... dazu brauch ich eure Hilfe:
Sub Initialize
Dim t(87) As String
'Variablen
t(1)="90/1-10-03-0001" ...
'[TEIL 1 - DATABASEAUSWAHL]
daba = Inputbox$("Bitte den Dateinamen ihrer Lokalen Datenbank [Im Allgemeinen C: \Lotus\Notes\Data] eingeben","Hinweis")
Dim da As New NotesDatabase("",daba)
Dim daba as New NotesDatabase("","0001-Testbank.nsf")
'[TEIL 2 - KATEGORISIERUNG]
Dim x As Integer
Dim x2 As Integer
Dim y As Integer
Dim selection As String
Dim collection As NotesDocumentCollection
Dim dati As New NotesDateTime("")
Dim doc As NotesDocument
Dim tit As String
x=1
x2=1
Do
tit = Right$(t(x),4)
Call db.CreateCopy("",tit)
Dim dx As New NotesDatabase ("",tit)
dx.Title = t(x)
selection = "@Contains(Subject;"""+tit+""")"
Set collection = da.Search(selection,dati,0)
y=collection.count
'Kategorisierung
Do
Set doc = collection.GetNthDocument(x2)
Call doc.CopyToDatabase(dx)
x2=x2+1
Loop Until x2=y+1
x=x+1
Loop Until x=3
'[TEIL 3 - FERTIG]
Messagebox "Fertig",MB_OK,"Erfolg"
End Sub
Was bitte ist an meinem Script falsch ? Ich hab herausgefunden, dass der Fehler sich in der Inneren Do-Schleife befindet, denn wenn ich diese deaktiviere, funktioniert alles andere. Aber auf diese Schleife kommts doch an.... hoffentlich könnt ihr da helfen...
-
Abgesehen davon, dass der Code äußerst verwirrend ist, solltest Du das mal durch den Debugger laufen lassen.
Generell: Wenn Du ein Document aus einer Collection anspricht, immer vorher abfragen, ob das Document auch da ist - sprich nicht Nothing ist.
Ansonsten kapier ich nicht, was der Code machen soll, sorry.
Andreas
-
Wie ich diese Fehlermeldung hasse.
Hm, die Fehlermeldung solltest Du aber nicht hassen, sondern sie loben. Sie sagt Dir wenigstens noch, dass DU Mist gemacht hast. Andere (nativere) Programmiersprachen lassen den Code da schon mal weiterlaufen, und ohne irgend einen netten Hinweis himmelt es bestenfalls das Programm oder das OS, eventuell zerlegt es Dir aber auch noch mehr.
Wie Andreas schon geschrieben hat: Der Debugger sagt, wo im Code es scheppert. Und prinzipiell gilt: Wo nur die kleinste Chance besteht, dass ein Objekt (unter welchen Umständen auch immer) nicht instantiiert werden kann, muss der Programmierer dafür sorgen, dass solche Fälle abgefangen werden.
Dim ws as New NotesUIWorkspace
Dim uidoc as NotesUIDocument
Dim doc as NotesDocument
Dim item as NotesItem
Set uidoc = ws.CurrentDocument
Set doc = uidoc.Document
Set item = doc.GetFirstItem ("Leser")
If Not (item is Nothing) then
item.IsReaders = True
End If
Gibt es also aus irgendeinem Grunde in diesem Dokument das Item gar nicht, muss das vom Programmierer (!) abgefangen werden.
Was ganz prinzipielles zum Abschluss: Programmieren ist eine sehr ernsthafte Angelegenheit ...
HTH,
Bernhard
-
Sorry Leute.... habt Recht, ich sollte den Code Kommentieren.
Also Prinzipiell soll das Script eine bestimmte Datenbank nehmen, alle Dokumente dort anschauen, und nach einem speziellen Suchbegriff sortieren. (Hier "0001"). Diese Collection kopiert es dann in eine speziell angefertigte Datenbank.
Das Problem ist, beim ersten Suchdurchlauf klappt alles wunderbar. Der Code ermittelt meine Collection, liest sie aus, und kopiert diese Dokumente in eine eigens erstellte Database. Doch wenn der Loop zum 2. Durchgang kommt, kommt entsprechende Fehlermeldung. Das versteh ich nicht ganz, da doch der erste Lauf perfekt geklappt hat, aber der zweite bricht ab.... das kapier ich net ganz....
Und das Coden eine ernste Sache ist, das müsst ihr mir net sagen... dieses Script ist für meine Arbeit, und sehr wichtig
-
Es bleiben unsere Fragen:
- Was sagt der Debugger ?
- Wenn dieser zu unhandlich sein sollte (wegen vieler Dokumente oder das das Stop-Statement nicht greift): Was sagt einer ErrorHandler, den Du noch einbauen müsstest ?
- Hast Du Dir alle Objekte, die Du instantiierst, schon mal durchgeschaut ? Der Code ist ja sehr kurz.
Und: Hast Du den Rat von Andreas und mir bereits berücksichtigt, die Objects nach dem Instantiierungsversuch auf Erfolg zu kontrollieren ?
Bernhard
-
Leider kann ich erst morgen auf Arbeit die Dinge austesten, vorher kann ich immer nur sagen was ich weiß.
Also:
Die Schleife enthält ja als Durchlaufszahl die Anzahl der Dokumente in der Collection. Desshalb ist dort doch schon genommen, dass ein Dokument dort nicht gegeben ist, oder irre ich mich da?
Ausserdem müsste der doch dann schon beim ersten Versuch abbrechen, oder nicht? Der erste Durchlauf geht ja tadellos, aber beim zweiten durchlauf der Schleife bricht er ab.... das ist mein Problem, und das macht es mir völlig unverständlich...
-
Debugger ... oder ErrorHandler.
Ich mag jetzt nicht im Nebel stochern.
-
Ich fang mal an zu meckern:
1.)
Bei Collections solltest Du immer kopfgesteuerte Schleifen nehmen.
Bei Dir:
Set collection = da.Search(selection,dati,0)
y=collection.count
'Kategorisierung
Do
Set doc = collection.GetNthDocument(x2)
Call doc.CopyToDatabase(dx) 'hier kracht es dann
Wenn Collection.Count = 0 ist, kracht er Dir mit der genannten Meldung um die Ohren!
2.)
x2 wird nach der innersten Schleife nicht wieder auf 1 gesetzt, d.h. beim nächsten Durchlauf beginnt das Teil mindestens mit dem Wert 2. Wenn dann die Collection.Count wieder = 1 ist, kracht's erneut.
Andreas
-
Ich danke euch Leute...
Da ich mir alles selbst beigebracht hab, hab ich nicht gewusst, dass es einen Debugger gibt.
Der hat mir dann auch den Fehler angezeigt, den mir auch Glombi nun gezeigt hat =)
Sorry für eure Umstände, ich lerne noch.
Ich bessere mich =)
Und danke nochmals an alle
-
bis demnächst dann; bleibst dem Forum hoffentlich treu ...
-
Jo, sag' einfach weiter an. Wir alle haben mal klein angefangen ;-)
Bernhard