Re: COM - Assigning to method.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Andrew

Thanks for this.

But I'm still getting errors. I think I need to explain a bit more.

Unfortunately there isn't a PHP API for this application I'm trying to
interact with, my goal really is to be able to expose the COM
functionality over a web-service such as SOAP so I can use it in a
CMS. The application I'm trying to integrate with is Blackbuad's
Raiser's Edge - API documentation here:
https://www.blackbaud.com/files/support/guides/re7ent/api.pdf

I think part of the problem is that the field names are also
represented by an integer. So to get data out I would do:

$oBank->Fields(22);   // which maps to BANK_fld_BRANCH_NAME.

When I do:

$oBank->22 = 'blah blah';

I get an error because a property can't be numeric, it has to start as
alpha character. If I use:

$oBank->BANK_fld_BRANCH_NAME = 'blah blah blah';

I get the following error:

Fatal error: Uncaught exception 'com_exception' with message 'Unable
to lookup `BANK_fld_BRANCH_NAME': Unknown name.

I've also tried using your Value property returned by Fields():

$oBank->Fields(22)->Value = 'Blah Blah blah blah';

Which I then get:
PHP Warning:  Creating default object from empty value in [C:\Users....]
Fatal error: Call to undefined method variant::Save()

Soo seems nearly impossible to implement a safe way to write to the COM API.


At the moment, I'm still in the scoping/prototype stage of my project,
so I'm beginning to think that using this COM API for this project is
a no-go, which is unfortunate. I'm also guessing even if we did
implement this API, exposing it as a Web Service is going to be tricky
for performance sake (given that I've read that COM doesn't
multithread very well??)

Many Thanks
Adam.

On 14 July 2013 22:16, Andrew Ballard <aballard@xxxxxxxxx> wrote:
> On Sun, Jul 14, 2013 at 3:18 PM, Adam Nicholls <inkysplat@xxxxxxxxx> wrote:
>>
>> Richard - I've tried that I get an error about it not being defined as
>> property of the object.
>>
>> Andrew - do you mean try using the method Richard has shown?
>>
>> Cheers
>> Adam.
>>
>> On 13 July 2013 17:11, Richard Quadling <rquadling@xxxxxxxxx> wrote:
>> >
>> >
>> >
>> > On 13 July 2013 01:24, Andrew Ballard <aballard@xxxxxxxxx> wrote:
>> >>
>> >> On Jul 12, 2013 4:53 AM, "Adam Nicholls" <inkysplat@xxxxxxxxx> wrote:
>> >> >
>> >> > Hi Guys/Gals,
>> >> >
>> >> > I'm doing some integration work with a COM API and according to their
>> >> > documentation to save data in the API, you have to assign to the
>> >> > method.
>> >> >
>> >> > This is their example in Visual Basic:
>> >> >
>> >> >
>> >>
>> >> -------------------------------------------------------------------------------------
>> >> >     Set oBank = New CBank
>> >> >     oBank.Init Application.SessionContext
>> >> >     With oBank
>> >> >         .Fields(BANK_fld_ACCOUNT_NAME) = "Test account"
>> >> >         .Fields(BANK_fld_ACCOUNT_NO) = "12345"
>> >> >         .Fields(BANK_fld_BANK) = "Bank of the Nation"
>> >> >         .Fields(BANK_fld_BRANCH_NAME) = "State Street Branch"
>> >> >     End With
>> >> >     oBank.Save
>> >> >
>> >>
>> >> -------------------------------------------------------------------------------------
>> >> >
>> >> > Obviously in PHP is isn't possible to assign to a method in this way
>> >> > (thats what parameters are for!) So I'm at a bit of a loose end. I'm
>> >> > wondering if anyone else has come across this? Or am I missing
>> >> > something obvious in PHP's implementation of the COM that allows me to
>> >> > work around this?
>> >> >
>> >> > My PHP Code is looks like this:
>> >> >
>> >>
>> >> -------------------------------------------------------------------------------------
>> >> > $API = new COM('API7.API');
>> >> > $API->Init($SerialNo, $Login, '', 1, '', 1);
>> >> > $API->SignOutOnTerminate = True;
>> >> >
>> >> > $Record = new COM("Data.Record");
>> >> > $Record->Init($API->SessionContext);
>> >> >
>> >> > $Record->Fields('BANK_fld_ACCOUNT_NAME') = 'Test Account';//doesn't work
>> >> >
>> >>
>> >> -------------------------------------------------------------------------------------
>> >> >
>> >> > I've also tried (below) but the API says wrong number of parameters
>> >> > $Record->Fields('BANK_fld_ACCOUNT_NAME', 'Test Account');
>> >> >
>> >> > I've also tried something crazy like this (below) but that overwrites
>> >> > the $Record object.
>> >> > $_R = &$Record->Fields('BANK_fld_ACCOUNT_NAME');
>> >> > $_R = 'Test Account';
>> >> >
>> >> >
>> >> > Any ideas? Is it possible?
>> >> >
>> >> >
>> >> > Many Thanks
>> >> > Adam Nicholls
>> >> >
>> >>
>> >> That example isn't assigning values to method return value. Fields is a
>> >> collection of ADO Field objects. The default property of a Field object is
>> >> its Value property, so the shorthand is simply assigning the values of the
>> >> variables to the value of each field in a record within a Recordset.
>> >>
>> >> Andrew
>> >
>> >
>> > So ..
>> >
>> > $oBank->BANK_fld_ACCOUNT_NAME = "Test account";
>> >
>> > sort of thing.
>> >
>> > --
>> > Richard Quadling
>> > Twitter : @RQuadling
>>
>>
>>
>> --
>> Adam Nicholls
>
> Richard has the general idea correct, but as I recall it is a little
> more involved because it's COM. I've never done that much with COM in
> PHP because it was always such a pain. The example you posted probably
> used to require com_set() in PHP 4, although it looks like that has
> been deprecated in favor of a more typical OO syntax in PHP 5. Is
> there any chance there is a PHP version of the library that you can
> work with to avoid COM? If not, hopefully what follows will help start
> you on the right direction.
>
> A more explicit version of your original VBScript example looks like this:
>
> Set oBank = New CBank
> oBank.Init Application.SessionContext
>
> Set oField = oBank.Fields(BANK_fld_ACCOUNT_NAME)
> oField.Value = "Test account"
> Set oField = oBank.Fields(BANK_fld_ACCOUNT_NO)
> oField.Value = "12345"
> Set oField = oBank.Fields(BANK_fld_BANK)
> oField.Value = "Bank of the Nation"
> Set oField = oBank.Fields(BANK_fld_BRANCH_NAME)
> oField.Value = "State Street Branch"
>
> oBank.Save
>
>
> I'm not familiar with your CBank COM class, but the rest of it looks
> like it is similar to the COM('ADODB.Recordset'). If so, a rough
> translation of your original example should resemble this:
>
> <?php
> // I'm not familiar with this object, so I'm guessing on the call to
> instantiate it here.
> $oBank = new COM('CBank');
>
> /**
> Application.SessionContext in the original refers to an object that is
> global to every request in an application. PHP does not have such a
> global registry, so I'm not sure where you're $config needs to come
> from.
> */
> $oBank->Init($config);
>
> /**
> I am assuming that BANK_fld_ACCOUNT_NAME and such are constant names
> that were already defined with the names of the actual column names in
> a recordset returned by $oBank.
> */
> $oBank->Fields(BANK_fld_ACCOUNT_NAME)->Value = "Test account";
> $oBank->Fields(BANK_fld_ACCOUNT_NO)->Value = "12345";
> $oBank->Fields(BANK_fld_BANK)->Value = "Bank of the Nation";
> $oBank->Fields(BANK_fld_BRANCH_NAME)->Value = "State Street Branch";
>
> $oBank->Save();
>
> ?>
>
> I don't know if you could leave out the ->Value part of the syntax in
> PHP like you can in the VBScript example you posted. If so, then
> Richard's syntax would have been pretty close:
>
> $oBank->Fields(BANK_fld_BRANCH_NAME) = "State Street Branch";
>
> Andrew



-- 
Adam Nicholls

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php





[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux