in reply to Re^3: parsing Win32::OLE::Variant
in thread parsing Win32::OLE::Variant

I gave the documentation a good read through and do not have clue how to import the IN function. I am certain that the data is in $bbData but I clueless as how to get at it.

how do you know that $bbData is a collection?

KD

Replies are listed 'Best First'.
Re^5: parsing Win32::OLE::Variant
by Corion (Patriarch) on Sep 26, 2008 at 20:10 UTC

    Because collections are the usual datatype to pass around list. I think they use the ICollection interface and possibly can also be accessed through the string dispatch methods.

    I still wonder how you failed to notice the Overloading section in Win32::OLE, but maybe we have different notions of what "a good read through" means.

    Maybe if you can show us some VB code, we can give you more ideas of what to try to replicate the same behaviour in Perl. My approach is to open up Excel, press Alt-F11 to launch the VB environment, then add the OLE object I want from the menu under Tools\References, and then press F2 to browse the object model of said OLE object. This is usually available even when the documentation is bad. But maybe you want to use a different approach.

      I realize that you are being very patient with me.

      Here is some VBA code that gets the job done.

      Sub testSubscribeC() On Error GoTo Handler: Dim oBlp As BLP_DATA_CTRLLib.BlpData Dim ReqSecurities As Variant Dim ReqFields As Variant Dim vtResult As Variant Dim n As Integer Set oBlp = New BlpData ReqSecurities = Array("VDE.A Equity") ReqFields = Array("NAME", "ID_SEDOL1", "ID_CUSIP", "ID_ISIN", "ETF_UND +L_INDEX_TICKER") With oBlp .SubscriptionMode = ByRequest .Subscribe ReqSecurities, 3, ReqFields, , , vtResult End With Stop 'and look at the results in Local or Watch Window For n = 0 To UBound(vtResult, 2) Debug.Print n, vtResult(0, n) Next Handler: If Err.Number <> 0 Then MsgBox Err.Description, vbCritical End If Set oBlp = Nothing End Sub
      vtResult is two dimension array. As follows:
      2 0 VANGUARD ENERGY ETF 1 B031N66 2 92204A306 3 US92204A3068 4 MSCIEN
      so what would this look like in Perl?
      There has to be a way to get VBA out of my life.
      Many thanks.

      KD

        Looking again through Win32::OLE::Variant, it documents the access to arrays by using the ->Dim method to get at the bounds and by using the ->Get method to get at single array elements. So starting from your original code, which gets the results in $bbData, you should be able to get at the information through the following calls:

        ... my $res = $blpData->Subscribe( $aSec,3, $aFields, $plug, $plug, $bbDa +ta); warn "->Subscribe returns $res"; my @dimensions = $bbData->Dim(); warn "Dimensions are " . Dumper \@dimensions; for my $x ($dimensions[0]->[0].. $dimensions[0]->[1]) { for my $y ($dimensions[1]->[0].. $dimensions[1]->[1]) { my $value = $bbData->Get($x, $y); print Dumper( $value ), ">$value<"; }; }

        If that doesn't work either, maybe the ->Subscribe call doesn't return values immediately and you need a different approach.