kevind0718 has asked for the wisdom of the Perl Monks concerning the following question:

Hello Kind and Wise Monks:

I have a bit of code that I am attampting to use to get data out of a Bloomberg terminal. I think it is very close to working. And I know it can be done because I have other PERL code that works. But I do not have enough skills to see what I am doing wrong.

I get the following:
-1 subMode: 1 Error: 0 $VAR1 = bless( do{\(my $o = 27151532)}, 'Win32::OLE::Variant' ); Not an ARRAY reference at tstblpSubscribe.pl line 42.
from this code:
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, "IBM Equity"); $aFields = Variant(VT_ARRAY|VT_BSTR, 4 ); $aFields->Put(0,"NAME") ; $aFields->Put(1,"ID_SEDOL1") ; $aFields->Put(2,"ID_CUSIP") ; $aFields->Put(3,"ID_ISIN") ; $bbData = Variant(VT_EMPTY,1) ; $plug = undef; ##@bbData = $blpData->GetHistoricalData($aSec, $aFields, $sDate, $eD +ate ); $blpData->SetProperty("SubscriptionMode", 1); print "subMode: " , $blpData->SubscriptionMode ; $blpData->Subscribe( $aSec,3, $aFields, $plug, $plug, $bbData); ## $blpData->GetData($aSec, $aFields, @plug, @plug, 1000, @bbData); print "\nError: " . Win32::OLE->LastError . "\n"; #print "Array Size: " , $bbData->Dim . "\n"; #print "Returned: " . $bbData->Get(0) . "\n"; print Dumper $bbData; for my $e (@$bbData) { my $d = $e->[0]; print "zero: $d->[0] " . " one: $d->[1] \n" ; #foreach $tmp (@aDim) { # print $tmp # } print "Array Size: " , @$bbData->Dim . "\n"; foreach $bbData (@bbData) { print $bbData } print "end" ;
I think I am close because Error = 0. Always a goood sign.

I think data was returned in $bbData.
How do I get at it? Need your kind assistance.

Many thanks.

KD

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

    To find out how to get at the data in $bbData, you need to read the documentation supplied by your vendor, that is, Bloomberg. Most likely $bbData will contain a Collection and hence the Win32::OLE::in function will work for you:

    for my $item (in $bbData) { ... };

    Also, you should get into the habit of use strict; because if you fix that error, you'll be using a variable @bbData a few lines below that. The variable @bbData does not exist and Perl will stop you from using it if you allow it to by use strict;.

      Try the following:
      for my $item ( in $bbData) { print 'Dumper $item: ', Dumper $item . "\n"; # }
      and got
      -1 subMode: 1 Error: 0 Dumper $bbData: $VAR1 = bless( do{\(my $o = 27085052)}, 'Win32::OLE::V +ariant' ); Can't locate object method "in" via package "Win32::OLE::Variant" at t +stblpSubscribe.pl line 43.
      In VBA a two dimension arry is returned
      any suggestions

      kd

        You need to import the in function from Win32::OLE. Read the documentation on how to import and use in. Alternatively, you likely can call the ->Item method on your object, because most collections use that name to access their entries. Again, I can also only refer you to the documentation that the vendor provides.