# Jacob - Inhalt eines Variant Objektes



## IggeB (24. März 2010)

Hallo zusammen,
mit Hilfe der Java-COM Brücke Jacob möchte ich aus einer Datenbank Daten auslesen. 
Der Verbindungsaufbau klappt gut, allerdings habe ich noch Probleme beim Auslesen der Daten.
Mit der Methode ReadTags() der zugehörigen DLL möchte ich die Daten auf ein Variant-Objekt speichern:

Variant  vResultValue = Dispatch.call( FuelWorkAuto, "ReadTags" );

Der Methodenaufruf funktioniert ohne Fehlermeldung und in vResultValue steht auch was drin. (isNull() liefert false)
Nun mein Problem: Wie komme ich an die Daten dieses Variant-Objektes. Laut Benutzerdokumentation muss es sich bei den Daten um ein mehrdimensionales Array handeln. Allerdings ist mir unklar, wie ich an dieses Array rankommen soll.
Habe schon versucht mit SafeArray an die Daten zu gelangen, was allerdngs nicht geklappt hat. Außerdem habe ich versucht mit EnumVariant weiterzukommen. Dort klappt allerdings die Initialisierung 

new EnumVariant(vResultValue.toDispatch()) 

nicht.  Würde mich über eure Hilfe wirklich sehr freuen!

MfG Igge


----------



## mccae (24. März 2010)

Hallo!

Bist du dir sicher, dass wirklich ein Array, und nicht wieder ein Dispatch zurückgegeben wird, dessen Methoden du zum Zugriff auf die Daten benutzen musst?

Denn du erwähnst nicht worum es eigentlich geht, und wie der Ausschnitt des User-docs lautet.

Aus Erfahrung kann ich sagen, dass Jacob die ein oder andere Macke hat.
Das Projekt wurde ja schon ewig nicht mehr aktualisiert.

Vielleicht wärst du mit einer anderen Lib wie Com4J besser bedient.

mfg
Martin


----------



## IggeB (25. März 2010)

Hi Martin,
danke für die Antwort.

Die Dokumentation der verwendeten Library ist leider nicht sehr umfangreich.  Es werden lediglich die verfügbaren Methoden aufgeführt. (ua. createConnection(), readTags(), writeTags(), etc...). Die von mir verwendete Methode readTags(double begin, double end) gibt ein Variant-Objekt zurück. Ich gehe davon aus, dass die Daten, die in der Zeit von begin bis end gemessen wurden jetzt in diesem Objekt drin sind. Oder hab ich da was falsch verstanden und muss auf andere Weise an die Daten gelangen?  In der Dokumentation ist ein Beispiel in Sprache VisualBasic Scirpt (VBS) beigefügt. Dort wird der Funktionsaufruf wie folgt gemacht:

Dim vTagResultName = fwa.ReadTags(TimeValue(begin),TimeValue(end))

Anschliessend wird überprüft ob vTagResultName ein Array ist und die Daten an einen String gehangen:

 If (IsArray(vTagResultName)) Then
   For i = LBound(vTagResultName,1) To  UBound(vTagResultName,1)
    OutputString = OutputString & "1." & vTagResultName(i,0) & "2." &  vTagResultName(i,1)  & "3." &  vTagResultName(i,2) & vbNewLine
   Next
End If

Meine Aufgabe ist es dieses Programm in Java zu implementieren.  Und da bin ich jetzt bei dem Problem wie ich an die Daten des Variant-Objektes kommen soll.
Habe zu dieser Klasse keine Funktionen wie isArray() oder in dieser Art gefunden.
Würde mich über eure Hilfe freuen.

Gruß Igge


----------



## mccae (25. März 2010)

Bei Arrays und Jacob ist die normale Vorgehensweise wie folgt:

Zuerst wird überprüft ob es sich beim Variant um ein Array handelt:


```
if(variantObject.getvt() == Variant.VariantArray)
```

Danach holt man sich (vor allem wenn die Arrayelemente nicht vom selben Typ sind) ein Variant array.

Doch zuvor muss man aus dem zurückgegebenen Variant ein SafeArray generieren, welches die WrapperKlasse für jedes zurückgegebene Array darstellt:


```
Variant [] data = variantObject.toSafeArray().toVariantArray();
```

Das generierte Array sollte dann dem im Userdoc beschriebenen Array gleichen.

Sollten sich alle Elemente des Arrays vom Typ her gleichen, kannst du, wenn du zum Beispiel weißt, dass nur Strings enthalten sind, direkt ein String Array erstellen indem du die _toStringArray()_ Methode aufrufst.

mfg
Martin


----------



## IggeB (26. März 2010)

Vielen Dank!
Das hilft mir schon mal weiter. Ich werde es jetzt mal ausprobieren.

MfG
Igge


----------

