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

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.

Replies are listed 'Best First'.
Re^6: parsing Win32::OLE::Variant
by kevind0718 (Scribe) on Sep 26, 2008 at 22:25 UTC
    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.

        Hello:

        Again thanks for your patience on this issue.

        And I agree that the code you posted last should work. But it does not. However, taking another look at the Bloomberg documentation I found another function call that is simpler and does the same thing.

        This code works.
        use Data::Dumper; use Win32::OLE; use Win32::OLE::Variant; $blpData = Win32::OLE->new('Bloomberg.Data.1') or die "can NOT load t +he blpData" ; #print $blpData->Timeout . "\n"; $aSec = Variant(VT_BSTR, "VDE.A Equity"); #@tmpArray = ("PX_Last"); $aFields = Variant(VT_ARRAY|VT_BSTR, 5 ); $aFields->Put(0,"NAME") ; $aFields->Put(1,"ID_SEDOL1") ; $aFields->Put(2,"ID_CUSIP") ; $aFields->Put(3,"ID_ISIN") ; $aFields->Put(4,"ETF_UNDL_INDEX_TICKER") ; $bbData = Variant(VT_EMPTY,1) ; $bbData = Variant(VT_EMPTY, 1); $bbData = $blpData->BLPSubscribe($aSec, $aFields ); print "Error: " . Win32::OLE->LastError . "\n"; #print "Array Size: " , $bbData->Dim . "\n"; #print "Returned: " . $bbData->Get(0) . "\n"; print Dumper $bbData; for my $e (@$bbData) { print Dumper $e; my $d = @$e->[0]; print "Col Zero: " . @$e->[0] . " Col One: " . @$e->[1] . " Col + Four: " . @$e->[4] . " \n" ; print "Col Zero: " . $d . " \n" ; #foreach $tmp (@aDim) { # print $tmp } print "end" ;
        It returns the following
        Using an array as a reference is deprecated at tstblpSubscribeIIg.pl l +ine 37. Using an array as a reference is deprecated at tstblpSubscribeIIg.pl l +ine 39. Using an array as a reference is deprecated at tstblpSubscribeIIg.pl l +ine 39. Using an array as a reference is deprecated at tstblpSubscribeIIg.pl l +ine 39. Error: 0 $VAR1 = [ [ 'VANGUARD ENERGY ETF', 'B031N66', '92204A306', 'US92204A3068', 'MSCIEN' ] ]; $VAR1 = [ 'VANGUARD ENERGY ETF', 'B031N66', '92204A306', 'US92204A3068', 'MSCIEN' ]; Col Zero: VANGUARD ENERGY ETF Col One: B031N66 Col Four: MSCIEN end
        However it has a minor issue. Using an array as a reference.
        I tried many variations of syntax to access the arrays returned. The @$e-> is the only one that worked. Hoping you would provide me with clean syntax to parse the results returned.

        thanks in advance.

        kd