php-general Digest 15 Jul 2013 21:26:50 -0000 Issue 8297

Topics (messages 321614 through 321616):

Re: COM - Assigning to method.
        321614 by: Pøemysl Fiala
        321615 by: Andrew Ballard

Urgent Requirement - PHP Senior Developer / Seasoned Trainer
        321616 by: Nitin Sathawane

Administrivia:

To subscribe to the digest, e-mail:
        php-general-digest-subscr...@lists.php.net

To unsubscribe from the digest, e-mail:
        php-general-digest-unsubscr...@lists.php.net

To post to the list, e-mail:
        php-gene...@lists.php.net


----------------------------------------------------------------------
--- Begin Message ---
Hello,

did you tried var_dump or print_r the $oBank object to see his structure ?

Also you can try:

 $BANK_fld_BRANCH_NAME = 22;
 $oBank->$BANK_fld_BRANCH_NAME  = 'something';


Premek.


On Mon, 15 Jul 2013 10:21:48 +0200, Adam Nicholls <inkysp...@gmail.com> wrote:

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 <aball...@gmail.com> wrote:
On Sun, Jul 14, 2013 at 3:18 PM, Adam Nicholls <inkysp...@gmail.com> 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 <rquadl...@gmail.com> wrote:
>
>
>
> On 13 July 2013 01:24, Andrew Ballard <aball...@gmail.com> wrote:
>>
>> On Jul 12, 2013 4:53 AM, "Adam Nicholls" <inkysp...@gmail.com> 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




--- End Message ---
--- Begin Message ---
On Mon, Jul 15, 2013 at 4:21 AM, Adam Nicholls <inkysp...@gmail.com> wrote:
> 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.

It's definitely possible to do, once you figure out the syntax you
need for this object.

I'm guessing you must have gotten past the $oBank->Init() method call
without issues.

What happens if you just use this for the value assignment?

$oBank->Fields(BANK_fld_ACCOUNT_NAME) = "Test account";
$oBank->Fields(BANK_fld_ACCOUNT_NO) = "12345";
$oBank->Fields(BANK_fld_BANK) = "Bank of the Nation";
$oBank->Fields(BANK_fld_BRANCH_NAME) = "State Street Branch";

It also looks like you're getting errors from the call to
$oBank->Save() saying that the method is not defined.

Andrew

--- End Message ---
--- Begin Message ---
Dear All,

AIT Learning (American Institute of Technology) is passionate about
imparting hands on training (2 months boot camp) on PHP. We are expanding
and looking for brilliant and self driven PHP developers / trainers who are
passionate about teaching as us and have hunger to make an impact.

Compensation - 50-75 % increment on your current pay stub plus bonus. Our
philosophy is to reward deserving employees.

Role - Based on your experience and interview panel feedback you will be
hired as Principal Trainer or Associate Trainer.

Responsibilities -  In short - need to ensure that candidates who are
enrolled for training can develop website of their own after the training
is complete. We will be placing them with our Clients on Day 1.

If interested, please contact Sach at 240 672 7654 or reply back to this
email.

Regards
Nitin

--- End Message ---

Reply via email to