Re: COM - Assigning to method.

From: Date: Mon, 15 Jul 2013 08:31:27 +0000
Subject: Re: COM - Assigning to method.
References: 1 2 3 4 5 6  Groups: php.general 
Request: Send a blank email to php-general+get-321614@lists.php.net to get a copy of this 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 <inkysplat@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 <aballard@gmail.com> wrote:
On Sun, Jul 14, 2013 at 3:18 PM, Adam Nicholls <inkysplat@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 <rquadling@gmail.com> wrote:
On 13 July 2013 01:24, Andrew Ballard <aballard@gmail.com> wrote:
On Jul 12, 2013 4:53 AM, "Adam Nicholls" <inkysplat@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


« previous php.general (#321614) next »