Loop durch Array eines externen Objektes

  • Hallo allerseits


    Ich bin gerade daran ein Script zu schreiben um Active Directory Daten auszulesen. Hab' es dabei mit ADODB versucht und stehe nun mit einem Mehrfachwert-Feld des externen Objektes an.


    Folgender Code (testeshalber schreibe ich alles mal in ein Textfeld auf dem Formular):

    Code
    Dim objConnection As Variant	Set objConnection=CreateObject("ADODB.Connection")	objConnection.Open "Provider=ADsDSOObject;"	Dim ojbCommand As Variant	Set objCommand=CreateObject("ADODB.Command")	Set objCommand.ActiveConnection=objConnection	objCommand.CommandText= "<LDAP://dc=firma,dc=ch>;(objectCategory=User);distinguishedName,name,member;subtree"	Dim objRecordSet As Variant	Set objRecordSet=objCommand.Execute	Dim ws As New NotesUIWorkspace	While Not objRecordSet.EOF		Call ws.CurrentDocument.FieldAppendText("Userdata", "USER: " & objRecordSet.Fields("Name").Value)		Call ws.CurrentDocument.FieldAppendText("Userdata", LSEnter)		Call ws.CurrentDocument.FieldAppendText("Userdata",objRecordSet.Fields("distinguishedName").Value)		Call ws.CurrentDocument.FieldAppendText("Userdata", LSEnter)		Call ws.CurrentDocument.FieldAppendText("Userdata","MEMBER: ")		Call ws.CurrentDocument.FieldAppendText("Userdata", LSEnter & LSEnter)		objRecordSet.MoveNext	Wend	objConnection.Close


    Das Problem liegt nun beim objRecordSet.Fields("member"). Dies ist ein Multivalue Feld.
    Eine Zuweisung wie

    Code
    Cstr(oRecordset.Fields("member").Value)

    schlägt fehl. Und durch das Objekt kann ich nicht durchloopen, weil LS es nicht als Array "erkennt".
    Wenn ich den Wert einer Variable (Variant) zuweise, dann hat die Variable nachher den Wert NULL.
    Auch eine Zuweisung in der Art

    Code
    objRecordSet.Fields("member")(0).Value

    bringt nichts.


    Schlussendlich müsste es eigentlich einen Loop im Sinne von

    Code
    Forall element In objRecordSet.Fields("member")
    			Call ws.CurrentDocument.FieldAppendText("Userdata", element)
    		End Forall


    geben


    Kann mir jemand weiterhelfen?

  • Hallo taurec


    Das hab ich von einem Beispiel im Netz, welches ich gefunden habe...


    Aber auch ein

    Code
    Call ws.CurrentDocument.FieldAppendText("Userdata", objRecordset.Fields("member"))


    nützt nichts. Da verlangt er einen String.
    Ein CStr() darum herum bringt auch nichts. Ebenfalls

    Code
    objRecordset.Fields("member")(0)


    Da sagt er "Wrong number of arguments for automation object"

  • Das ist das allgemeine Problem mit COM Objekten wenn diese keine definierten Rückgabewerte liefern.


    Gibt es bei den Recordsets keine Möglichkeit das ganze fix als String zurückliefern zu lassen, z.b. mit ner Methode AsString oder so ?

  • Nein, das gibt es leider nicht. Aber ich habe jetzt bemerkt, dass ich sowieso das falsche Feld hole!


    Ich muss nämlich den memberOf haben, nicht den member. Und mit dem memberOf kann man dann durchloopen. (Der member war glaub ich sowieso leer, bei meinen Usern. Der ist nur bei Gruppen-Objekten vorhanden, und ich hole die User-Objekte) :roll:


    Für alle die's interessiert, hier der Loop durch die Gruppen:

    Code
    Call ws.CurrentDocument.FieldAppendText("Userdata","MEMBER: ")
    		vMemberOf=objRecordset.Fields("memberOf").Value
    		If Isarray(vMemberOf) Then
    			Forall Group In vMemberOf
    				Call ws.CurrentDocument.FieldAppendText("Userdata", Group)
    				Call ws.CurrentDocument.FieldAppendText("Userdata", LSEnter)
    			End Forall
    		End If