Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: zhermann am 23.09.04 - 09:11:50
-
Hallo Leute,
ich bekomme sporadisch beim ausführen einer eigenen Function folgende FM: "Automation object member not found."
Hier mal die Function:
Function dokcounter
Dim ProgLevel As Integer
Stop
Counter = Counter + 1
ProgLevel = Round( ( Counter * 100 / FileCounter ), 0)
dokcounter = ProgLevel
End Function
Die Variablen Counter und FileCounter sind Globale Variablen. Filecounter ist auch gefüllt.
Laut Debugger passt Notes die Zeile zum berechnen des ProgLevels nicht.
Das komische ist aber mal geht es mal geht es nicht. ??? Oder er bricht mittendrin zusammen.
Hat einer von Euch eine Idee?
Gruß
Zsolt
-
Hallo,
Filecounter ist aber nicht ab und zu mal 0?
Hast Du vielleicht einen Datentypen Überlauf?
Teile doch mal die Berechnung in mehrere Zeilen auf. Habe ähnliches auch schon mal gehabt.
Gruß von Ekki.
-
Die Fehlermeldung verweist auf ein nicht vorhandenes OLE-Object, was in diesem Zusammenhang vollkommen abstrus erscheint.
Was läuft denn in dem Programm noch ab ? Arbeitest Du dort mit OLE ?
Wenn nicht, dann hast Du eindeutig einen R6-Bug entdeckt.
Bernhard
PS:
Die von Ekki genannten Möglichkeiten würden zu den Fehlern 6 und 11 führen - das müsste also anders aussehen. Trotzdem sollte geprüft werden, ob Overflow und DevisionByZero ausgeschlossen werden kann.
-
Hallo Ekki,
nein FileCounter ist immer voll. Habe das mit geprüft, in dem ich die Variablen Counter und FileCounter in eine Text-Datei geschrieben habe.
Teile mal die Zeielen auf. Vielleicht funzt es dann.
Gruß
Zsolt
-
Ausprobiert. >:(
Habe die Function nun so gemacht:
Function dokcounter
Dim ProgLevel As Integer
Dim x As Integer
Dim y As Integer
Stop
Counter = Counter + 1
x = Counter * 100
y = x / FileCounter
ProgLevel = Round( y, 0)
dokcounter = ProgLevel
End function
Der Debugger sprint immer beim Round an, wie ein Drogenhund...
Habe auch schon y als Doble oder Long definiert alles das gleiche.
Gruß
Zsolt
-
Eine ganz andere Frage: Warum verwendest Du denn überhaupt Round, wenn y sowieso Integer ist ? Da gibt es nix mehr zu runden auf's nächste Ganze ...
Bernhard
-
Genau wie Bernhard sagt, das Round einfach mal vergessen und schauen, ob das Problem verschwindet, oder ob er jetzt bei einer anderen Stelle rausspringt. Mögliche Ursachen: da läuft ein anderer Prozess auch noch (gibts irgendwo ein Timer-Objekt?) oder die DB ist schlichtweg korrupt
-
Ok,
Round ist weg, jetzt bekomme ich bei 6% einen Overflow.
Ich glaube ich geh ma eine Kaffee und ein Kamel verdrücken.
Gruß
Zsolt
-
In welcher Zeile?
-
Also, habe den einen Fehler gefunden:
erster Overflow beim 328 Schritt: Weil x as integer nett geht (ich dummkopf)
328 * 100 = 32800 damit mehr als 32768 (scheiß Anfängerfehler)
Jetzt habe ich x, y und Proglevel auf Double gesetzt und immer noch Fehler:
OVERFLOW - jetzt krieg ICH gleich einen.
Hier nun die abgeänderte Function
Function dokcounter
Dim ProgLevel As Double
Dim x As Double
Dim y As Double
Counter = Counter + 1
x = Counter * 100
Proglevel = x / FileCounter
Dokcounter = Int(ProgLevel)
End Function
Also bis zum 327 Schritt (Counter) funzt es.
Filecounter steht auf 5202 (soviele Dateien sollen bearbeitet werden)
Schritt 327:
x : 327 * 100 = 32700
Proglevel: 32700 / 5202 = 6,2830436 (laut meinen elek. Abakus)
dokCounter: 6
Schritt 328:
x : 328 * 100 = 32800
Proglevel: 32800 / 5202 = 6,3052672 (laut meinen elek. Abakus)
dokCounter: sollte auch 6 sein, aber Notes meint OVERFLOW
...
Es scheitert immer am ändern von Double in Integer.
Gibt es im 6.5.1 Notes einen Bug oder ist das ein neues Feature???
-
G E F U N D E N !!!
Counter ist von Typ Integer.
Notes mag es halt nicht wenn typübergreifende Berechnungen durchführt.
Double = Integer * 100
Habe die Variable Counter in den Typ Double geändert und siehe da es geht.
Gruß Zsolt
-
Und wir halten mal fest: Die Fehlermeldung ist ein R6-Bug, denn mit OLE hat das nun wirklich nix zu tun ...
Bernhard
-
Im Prinzip ja, es sei denn, wir haben es trotzdem noch mit einer Datenpanbk-Korruption zu tun, denn dann wirds irrelevant, was er meldet. So ganz unter einen Hut bringe ich die Infos, die wir hier haben, noch nicht so richtig.
-
Hallo Semeaphoros,
es ist eigentlich ganz einfach.
Ich versuche eine einfache Prozentberechnung zu machen, damit ich in der Statusleiste fogenden Text ausgeben kann: "xxx% bearbeitet..."
Nun habe ich mit der Berechnung der Prozentzahl Probleme bekommen.
Ich habe immer die FM siehe Subject bekommen. Nachdem ich das Round rausgenommen habe habe ich ein Overflow bekommen. Die Db kann nicht Korrupt sein, da ich die Fehler auch in einer neuen DB bekommen habe.
Somit schließe ich mich Bernhard an, es handelt sich wohl um einen kleinen Käfer.
Gruß Zsolt
-
Wenn Du das zuverlässig reproduzieren kannst - indem Du eine Datenbank baust, die das Problem hat, dann solltest Du das unbedingt als Bugreport an den Support melden.
-
Hallo nochmal,
mir ist da noch was eingefallen.
Es kann kein Bug sein weil:
y as integer
x as Double
y = 238
x = CDbl( 328 * 100)
Ergebnis ist ein Overflow, weil Notes erst die Zahlen in der Klammer (328 * 100) als Integer berechnen will. Danach sollte es in ein Double-Wert umgewandelt werden, nur kommt er nicht mehr dazu, weil schon der Overflow (32800) da ist.
Gruß
Zsolt
P.S. Im Notes 7 ist der gleiche Overflow aufgetretten.
-
Alles ist korrekt.
Wenn Du
x = CDbl( 328 * 100)
machst, multiplizierst Du 2 Integer und es gibt korrekterweise einen Overflow.
Ein Blick in die Notes Designer Hilfe zur Multiplikation:
The result is a value whose data type is generally the same as that of the operand whose data type is latest in this ordering: Integer, Long, Single, Currency, Double. For example, if one operand is a Double and the other is a Long, then the data type of the result is Double.
Wenn Du bspw.
erg = 328.0 * 100.0
Msgbox x
verwendest, geht es.
Also: Alles KEIN Bug oder sowas!
Andreas
-
Der hier diskutierte Bug bezieht sich aber - sowie ich das bisher gesehen habe - nicht auf das korrekte Verhalten bei der Integer-Multiplikation, sondern auf die Ausgabe der Meldung "Automation object member not found".
Aber offensichtlich haben wir nicht mehr so richtig die Chance, hinter deren wahre Ursache zu kommen ...
Bernhard
-
Ja, stimmt. Die Meldung "Automation object member not found." steht zwar in der KBASE, aber in einem ganz anderen Zusammenhang.
Andreas
-
Das ist (oder besser: SOLLTE) ein OLE-Fehler sein ("OLE-Server zuckt nicht"). In diesem Zusammenhang isses gaga.
Wenn man jetzt noch den kompletten Erst-Code von Zsolt hätte, dann wäre das reif für einen Call bei IBM ;)
Bernhard
-
Der Vollständigkeit halber hier der Auszug aus der KBASE. Es hat nicht wirklich was mit OLE direkt zu tun.
LotusScript code that accesses a third party object (a non-Lotus object) results in the following error when calling methods which contain no parameters:
"Automation object member not found."
The same code logic works within Visual Basic without error.
The following code sample demonstrates this issue. The below code runs on Windows systems to access the Assigned Directories Services (ASDi) object. When the Members method is called, the error occurs:
Dim Group
Dim Member
' Bind to a known group object.
Set Group = GetObject("WinNT://ComputerName/Administrators")
Set member = Group.Members 'The code will error when executing this line
Forall x In member
Print x.name
End Forall
Msgbox group.name ' Returns "Administrators"
Msgbox group.class ' Returns "Group"
Msgbox group.AdsPath ' Returns "WinNT://Domain/ComputerName"
If Group.IsMember("WinNT://Domain/ComputerName/csmith") Then
Msgbox "Already a Member"
Else
group.Add("WinNT://ComputerName/csmith")
End If
LotusScript requires the use of parentheses when calling the methods of non-Lotus objects, even when the methods do not have any parameters.
From the example above, the Members method call would be made as follows:
Set member = Group.Members()
Within Notes, when working with Notes objects it is recommended, but not required, to use parentheses when calling a method that does not contain any parameters.
For example, both of the following calls to GetFirstDocument (of the NotesDocumentCollection class) run without error:
Set doc = collection.getfirstdocument
Set doc = collection.getfirstdocument()
Supporting Information:
A directory service is basically a database that contains the attributes and locations of shared objects connecting the network. Users that want to access these resources may do so by using a special syntax. An assigned directory service uses a syntax which is called a namespace. For example, //CompanyName/csmith would identify a workstation and a logged-in user. The collection of all workstations and users on the network can be accessed this way from a namespace. A directory service provides a method to manage the data stored in internal tables. You can read and set security flags and descriptions.
The ability to access and/or update the Active Directories depends on the ADSi object control and is available through COM.
It is also important when using the IsMember method, that the complete ADsPath is used.
Related Documents:
Setting Third-Party Object Property to an Object Causes Error: "Automation Object Member Not Found"
Document #: 1084270
-
Hallo Bernhard,
hier der erstcode.
Function dokcounter
Dim ProgLevel As Integer
Counter = Counter + 1
ProgLevel = Round( ( Counter * 100 / FileCounter ), 0)
dokcounter = ProgLevel
End Function
Ich habe den Automation Error in der Zeilt ProgLevel = ... bekommen.
Gruß
Zsolt
-
dieses thema ist zwar schon viele jahre alt, hat mir aber heute nach stunden erfolglosen versuchen die lösung gebracht. hatte auch das problem dass object.Members zwar in VB script funktioniert, nicht aber in LN script. dass die lösung mit object.Members() derart simpel ist, hätte ich nicht gedacht.
ein dankeschön an das notes forum und dessen member welche mir wieder einmal weiterhelfen konnten! 8) :love: