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