Re: COM - Assigning to method.

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

 



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

-- 
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