Thursday, December 02, 2010

doctrine "Missing class name"
Doctrine::generateModelsFromDb()

Doctrine fails with generic exception "Missing Class Name"

the model generation fails due to cross databases foreign key constraints.


PHP MAMP MySQL NaviCat

Monday, November 15, 2010

How to check open connections to a Progress database:

proenv>e:
nav to DB file dir

proenv>cd progress\databases\customerDB

proenv>promon databaseName

use Promon instructions to view various statuses of the db and users

1. User Control
2. Locking and Waiting Statistics
3. Block Access
4. Record Locking Table
5. Activity
6. Shared Resources
7. Database Status
8. Shut Down Database

ETC...

Saturday, November 13, 2010

Progress Reports will not show.

All connections to progress database are used ("No Resources Available"). Must clear a connection and terminate process.

Wednesday, November 10, 2010

Error:
Warning: include_once(Zend/Form/Element/password.php): failed to open stream:

Solution:


$password = new Zend_Form_Element_Password('password');

Zend_Form_Element_Password is CASE SensiTive

Tuesday, August 24, 2010

iPhone - Verify account info: security code invalid

Set the credit card to "None" and save.
You can re-add the credit card number later.

Monday, August 23, 2010

How to manually add a Progress OpenEdge ODBC Driver


ALERT: This requires registry edits, so take your normal precautions.

Launch:
regedit.exe

Navigate to:
(Windows)
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI

(64bit Windows 7)
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI

Add/Create the following key:

Progress OpenEdge [XX.XN] Driver

Where [XX.XN] is your available version of the Progress bin. (e.g. 10.2C)

Open the Progress OpenEdge XX.XN Driver key and add the following strings (REG_SZ):
APILevel = "1"
ConnectFunctions = "YYN"
CPTimeout = "60"
DriverODBCVer = "3.50"
FileUsage = "0"
SQLLevel = "0"
UsageCount = "1"
Setup =  "[PATH]\pgoe1023.dll"
Driver = "[PATH]\pgoe1023.dll"

Where [PATH] is the location of the "pgoe1023.dll" library (e.g. "C:\Progress\V102A\bin").

HINT: You may place the bin file(s+) anywhere on the local system.

Next, Navigate to:
(Windows)
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers

(64bit Windows 7)
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI\ODBC Drivers

Add the following string (REG_SZ):
Progress OpenEdge [XX.XN] Driver = "Installed"

Where [XX.XN] is your available version of the Progress bin. (e.g. 10.2C)

You will now see the Progress OE ODBC driver available in the ODBC Manager (SysWoW64 version for Windows 7).

connection string sample:
<add name="ProgressDb" connectionString="DRIVER=Progress OpenEdge 10.2A driver;HOST=localhost;PORT=9999;DB=databaseName;UID=userId;PWD=password;" />
How to manually add a Progress OpenEdge ODBC Driver

Launch regedit.exe
Navigate to:
(Windows)
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI

(64bit Windows 7)
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI

Add/Create the following key:

Progress OpenEdge [XX.XN] Driver

Where [XX.XN] is your available version of the Progress bin. (e.g. 10.2C)

Open the Progress OpenEdge XX.XN Driver key and add the following strings (REG_SZ):
APILevel = "1"
ConnectFunctions = "YYN"
CPTimeout = "60"
DriverODBCVer = "3.50"
FileUsage = "0"
SQLLevel = "0"
UsageCount = "1"
Setup =  "[PATH]\pgoe1023.dll"
Driver = "[PATH]\pgoe1023.dll"

Where [PATH] is the location of the "pgoe1023.dll" library (e.g. "C:\Progress\V102A\bin"). You may place this file anywhere on the local system.

Next, Navigate to:
(Windows)
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers

(64bit Windows 7)
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI\ODBC Drivers

Add the following string (REG_SZ):
Progress OpenEdge [XX.XN] Driver = "Installed"

Where [XX.XN] is your available version of the Progress bin. (e.g. 10.2C)

You will now see the Progress OE ODBC driver available in the ODBC Manager (SysWoW64 version for Windows 7).

Wednesday, August 18, 2010

ODBC Driver Issue:  Progress OpenEdge - error code 193

You are trying to create a 64bit ODBC connection using a 32bit driver and the 32bit driver does not appear in the 32bit ODBC connection manager (SysWOW64)

You need to add the following keys:


[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI\ODBC Drivers]
"Progress OpenEdge 10.2A driver"="Installed"


[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI\Progress OpenEdge 10.2A Driver]
"Driver"="[DLC]\\bin\\pgoe1023.dll"
"Setup"="[DLC]\\bin\\pgoe1023.dll"
"DriverODBCVer"="3.50"
"APILevel"="1"
"ConnectFunctions"="YYN"
"CPTimeout"="60"
"FileUsage"="0"
"SQLLevel"="0"
"UsageCount"="1"

[DLC] should refer to the 10.2A installation directory

{From ProgressTalk Kbase Solution P141118} ERROR System.Data.Odbc.OdbcException: ERROR [IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified Be sure the ODBC connection is defined as a System DSN and was created using the C:\Windows\SysWow64\ODBCad32.exe Also be sure that the AppPool running a webservice using the DSN is enabled for 32 bit applications.

Thursday, August 12, 2010

Set multiple sites running SSL over port 443 in IIS


c:\windows\system32\cscript.exe C:\Inetpub\AdminScripts\adsutil.vbs set /w3svc/52796006/SecureBindings ":443:www.domain.com"

Wednesday, August 04, 2010

Progress SQL ODBC errors:

i) System.Data.Odbc.OdbcException: ERROR [HY000] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver][OPENEDGE]Invalid number string (7498)

SOLUTION: Lookup Type/Value Not Found - check values bound to lists/types

ii) [PROGRESS]Lock table is full. (7870)
sol: # Lock Table Entries is too small. Increase in ODBC connection properties.

iii) [System.Data.Odbc.OdbcException] = {"ERROR [HY000] [DataDirect][ODBC Progress OpenEdge Wire Protocol driver][OPENEDGE]Character string is too long (8184)"}

SOLUTION: Text in a Formatted field (Date or Time or Currency...) contains invalid or extra characters (" ", leading space).

iv) [ODBC Progress OpenEdge Wire Protocol driver]Optional feature not implemented.
[OPENEDGE]Broker rejects connection

SOLUTION: PEO database is not setup for SQL (4GL only) OR Database needed a restart.

Wednesday, July 28, 2010

SQL Server 2005 - Loop through/split a delimited string
Here is a further cleaned up, generalized, and working version of a T-SQL script to take in comma delimited list and parse it into elements and operate on the individual values:


GO
DECLARE @commaList AS VARCHAR(MAX)
SET @commaList = '1,2,3,4'

DECLARE @pos as INT
IF substring(@commaList, LEN(@commaList),1) <> ','
        SET @commaList = @commaList + ','

print substring(@commaList, LEN(@commaList),1)
SET @pos=0
DECLARE @listItem as int

WHILE charindex(',',@commaList)>0
    BEGIN
        SET @listItem = cast(substring(@commaList,0, charindex(',',@commaList)) as int)
        /***********PERFORM ACTION***********/
        PRINT @listItem
        /*************END ACTION*************/
        SET @commaList = substring(@commaList, charindex(',',@commaList)+1, LEN(@commaList) - @pos) --remove the first item from the list
    END

GO

The original script came from here, but was too specific to the original writer's needs and did not perform any action on the last value...
The original writer also mentions, that he (and I) does the cast to int because he requires an INT. If you do not, do not do the cast.

"SQL Server 2005 - Loop through/split a delimited string"
http://www.vbforums.com/showthread.php?t=507592

Tuesday, June 29, 2010

Windows 7 Blackscreen of Death BSOD - Completely black desktop with mouse activity.

Just got a windows 7 notebook machine back up and running after suffering the BlackScreenOfDeath Issue.

Initially I suspected that the screen settings had shifted the desktop off to an external monitor which was not currently attached. But when no context menu came up from a right click of the desktop, I realized there was no desktop running. This led me to believe that explorer.exe had not started. So with a ctrl+alt+del I got to the task manager (good sign) and could see that indeed there was no explorer.exe process running.

The next step was to try and fire it up manually using the "New Task" button on the Task Manager. This only returned an error message stating that no explorer.exe could be found. I did a little Google-ing to confirm that explorer  was still explorer in Windows 7 (which it is). Along with that Google search I found out that I was experiencing the BlackScreenOfDeath issue and that the security company PrevX had a solution (PrevX Article).

I later read that the PrevX solution was not the fix-all. It did address the issue of a possible missing registry key which points to the location of explorer.exe for the system to launch the desktop process when a user logs on. After confirming the registry key was intact, off to confirming the location of the exe.

The explorer.exe file should be located in the Windows directory, but it was not. Which explains why the desktop failed to launch leaving the user with the BSOD. I did a search of the user's hard drive and found several versions of the exe in question in subdirectories located in the Windows\winsxs directory. Curiously, I launched one of the executables located under an "AMD64..." directory (even though this was an INTEL) and the desktop loaded. The explorer.exe's under the "WOW64..." and "X86..." directories failed to launch with an error.

In the end, I copied the explorer.exe (the one that worked) from the Windows\winsxs\AMD64... directory into the Windows directory and restarted the machine.

Whaa Lahh, the machine is golden. Hope this helps.

Wednesday, June 23, 2010

From TIM


Serialize (convert an object instance to an XML document):
// Assuming obj is an instance of an object
XmlSerializer ser =
new
XmlSerializer(obj.GetType());
System.Text.StringBuilder sb = new
System.Text.StringBuilder();
System.IO.StringWriter writer = new
System.IO.StringWriter(sb);
ser.Serialize(writer, obj);
XmlDocument doc = new
XmlDocument();
doc.LoadXml(sb.ToString());

Deserialize (convert an XML document into an object instance):
//Assuming doc is an XML document containing a serialized object and objType is a System.Type set to the type of the object.
XmlNodeReader reader =
new
XmlNodeReader(doc.DocumentElement);
XmlSerializer ser = new
XmlSerializer(objType);
object
obj = ser.Deserialize(reader);// Then you just need to cast obj into whatever type it is eg:
MyClass myObj = (MyClass)obj;



Thanks Tim

Monday, June 14, 2010

To add user to ASAM
1) Create account
2) Add account and areacode relationship(s)

To add Sity client reports to a Client
1) Add Client SQLRS server account as "browser" to SityClient Reports folder.
2) Add Client SQLRS server account to the [AparcSystemsSpExecutor] role


NOTE:

Be sure all NEW procedures are added to the [AparcSystemsSpExecutor] role

To Add a SQLRS user
1) Create new machine/Windows account ("svcServiceAccount")
2) Add user to SQL server instance(s)
3) Add to:
i) AparcSystems with R/W permissions and AparcSystemsSpExecutor
ii) SityDb with R permissions
iii) SityDbxxxxx Client DB with R permissions and AparcSystemsSpExecutor
4) Add user account to SQLRS reports user param for Client via ASAM.

Saturday, June 12, 2010

When Posting Sity Client Reports, all reports must have their datasource properties changed to use:



Hit <Apply>

Thursday, June 03, 2010

When passing SQLRS report parameters through the URL be sure to use the ReportServer and not the Reports

Want to pass hidden parameters to an SQLRS report in a browser?
Just add the parameter name and value to the query string pointing at the ReportServer URL like so:

http://reportingserver.aparcsystems.com/ReportServer/Pages/ReportViewer.aspx?%2fReports%2fTransactionDetails&rs%3aCommand=Render&PARAMNAME=PARAMVALUE

Wednesday, May 05, 2010

Loading an unmanaged C++ dll into a managed c# class (.Net 3.5)

I am developing a .NET 3.5 C# Webservice which calls methods from within an unmanaged C++ dll. Aside from the basic issues of wrapping the structs and method calls for use by the C# class, I ran into a couple of hurdles deploying.

ISSUES:
(1)
Server was unable to process request. ---> System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)

(2)
Server was unable to process request. ---> Unable to load DLL 'SPInterface.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

SOLUTIONS:
(1)
Be sure that your app_pool managing your webservice/site is allowing 32bit applications if running on a 64bit platform (IIS7)
OR
Be sure that your application is built as an x86 project
goto Configuration Manager and set the project to build as x86
(If Configuration Manager is not available, goto Tool>Options>Projects and Solutions>General>Show advanced build configurations)

(2)
Be sure that your unmanaged dll appears in your site bin folder.
Be sure that all resources (dll, lib, etc.) referenced by your dll are also in your bin.

Wednesday, April 21, 2010

While loading controls inside an asp:LinkButton will render correctly on Page_Load, after post back the control loses the contained controls

e.g.
<asp:LinkButton id="btnShowReport" runat="server" OnClick="btnShowReport_Click">
<img src="images/16doc.gif" height="16" width="16" />
<asp:Label id="lblReportTitle" runat="server"/>
</asp:LinkButton>

This code appeared within an asp:Repeater, where the CommandName and CommandArgument of the LinkButton were being set dynamically along with the Text property of the Label. But on postback to bthShowReport_Click, all the links essentially disappeared. I discovered that the <a> tags where still in the page on PostBack, but the contents making them functional where gone.

It was a nice try but now... Just as simple but perhaps more elegant, but mostly IT WORKS!

<asp:ImageButton id="btnShowReport" runat="server" OnClick="btnShowReport_Click" ImageUrl="images/16doc.gif" style="vertical-align: middle"/>
<a>
<asp:Label id="lblReportTitle" runat="server" AssociatedControlID="btnShowReport"/>
</a>

I use the associated control to tie the label to the click event of the image button and some anchor tags give the linkbutton feel to the label.
Could have made the label a linkbutton and use the same onclick event handler as the imagebutton . But in the method I would have to check the type to do the correct cast of sender in order to get the command name and argument.

Dumb problem, simple solution. It just drove me nuts to see all the links disappear on postback so had to blog it.

Monday, April 19, 2010

Born in the West Indies, but for the next 2 weeks I'm a PROUD CANADIAN!

GO CANADA!
http://picasaweb.google.com/trinijessel See my photos from the 2010 Winter Olympics here in Vancouver

Wednesday, February 10, 2010

A Simple(rudimentary) implementation of XPath node search (SelectSingleNode) for OpenEdge 10.2A

- DOES NOT implement Node value filtering (yet)
- Implements Positional referencing/filtering
- DOES NOT implement Attribute searching (yet)
- DOES NOT implement Multiple node result selection like SelectNodes (new function coming)

NOTE: This is a work in progress.

NOTE: You will need to declare the following global variable:
DEFINE VARIABLE recurseXPath AS LOGICAL NO-UNDO.

FUNCTION SelectSingleNode RETURNS LOGICAL (INPUT hXBaseNode AS HANDLE,INPUT xPath AS CHARACTER, OUTPUT hXNode AS HANDLE):
DEFINE VARIABLE hXCurrentNode AS HANDLE.
DEFINE VARIABLE hXChildNode AS HANDLE.
DEFINE VARIABLE childCount AS INTEGER.
DEFINE VARIABLE currentPosition AS INTEGER.
DEFINE VARIABLE startPosition AS INTEGER.
DEFINE VARIABLE endPosition AS INTEGER.
DEFINE VARIABLE iterationDone AS LOGICAL.
DEFINE VARIABLE nodeName AS CHARACTER.
DEFINE VARIABLE pathSegment AS CHARACTER.
DEFINE VARIABLE nodeFilter AS CHARACTER.
DEFINE VARIABLE fqNodeName AS CHARACTER.
DEFINE VARIABLE subPath AS CHARACTER.

CREATE X-NODEREF hXCurrentNode.
CREATE X-NODEREF hXChildNode.

IF (SUBSTRING(xPath, 1, 2) = "//") THEN DO:
recurseXPath = TRUE.
subPath = SUBSTRING(xPath, 3).
hXCurrentNode = hXBaseNode:OWNER-DOCUMENT.
END.
ELSE IF (SUBSTRING(xPath,1,2) = "..") THEN DO:
subPath = SUBSTRING(xPath, 3).
hxBaseNode:GET-PARENT(hXCurrentNode).
END.
ELSE IF (SUBSTRING(xPath,1,2) = "./") THEN DO:
subPath = SUBSTRING(xPath, 3).
hXCurrentNode = hxBaseNode.
END.
ELSE IF (SUBSTRING(xPath, 1, 1) = "/") THEN DO:
subPath = SUBSTRING(xPath, 2).
hXCurrentNode = hxBaseNode.
END.
ELSE DO:
subPath = xPath.
hXCurrentNode = hxBaseNode.
END.

iterationDone = FALSE.
pathSegment = ENTRY(1, subPath, "/").
subPath = SUBSTRING(subPath,LENGTH(pathSegment) + 1).

/* need to validate prefixes used. */
DO ON ERROR UNDO, LEAVE:
fqNodeName = ENTRY(1, pathSegment, "[").
nodeFilter = ENTRY(2, pathSegment, "[").
nodeFilter = SUBSTRING(nodeFilter, 1, LENGTH(nodeFilter) - 1).

CATCH err AS Progress.Lang.SysError:
nodeFilter = "".
fqNodeName = pathSegment.
/* LOG ERROR */
END CATCH.
END.

/* need to validate prefixes used. */
DO ON ERROR UNDO, LEAVE:
nodeName = ENTRY(2, fqNodeName, ":").
CATCH err AS Progress.Lang.SysError:
nodeName = fqNodeName.
/* LOG ERROR */
END CATCH.
END.

DO ON ERROR UNDO, LEAVE:

startPosition = 1.
endPosition = hXCurrentNode:NUM-CHILDREN.

DO currentPosition = startPosition TO endPosition:
hXCurrentNode:GET-CHILD(hXChildNode, currentPosition).
IF (hXChildNode:SUBTYPE = "ELEMENT") THEN DO:
IF (hXChildNode:NAME = fqNodeName) THEN DO:
/* apply filter */
IF (nodeFilter = "" OR (hXChildNode:CHILD-NUM = INTEGER(nodeFilter))) THEN DO:
hXCurrentNode = hXChildNode.
hxNode = hXCurrentNode.
iterationDone = TRUE.
recurseXPath = FALSE.
LEAVE.
END.
END.
IF (recurseXPath = TRUE AND hXChildNode:NUM-CHILDREN > 0) THEN DO:
DEFINE VARIABLE hxFirstChild AS HANDLE.
CREATE X-NODEREF hxFirstChild.
hXChildNode:GET-CHILD(hxFirstChild,1).

IF (hxFirstChild:SUBTYPE = "ELEMENT") THEN DO:
iterationDone = SelectSingleNode(hXChildNode, pathSegment, hxNode).
IF (hxNode:NAME = fqNodeName) THEN DO:
hXCurrentNode = hxNode.
iterationDone = TRUE.
recurseXPath = FALSE.
END.
END.
END.
END.
END.

IF (iterationDone = TRUE) THEN
DO WHILE (ENTRY(2, subPath, "/") <> ""):
RETURN SelectSingleNode(hXCurrentNode, subPath, hxNode).
END.

RETURN iterationDone.

CATCH err AS PROGRESS.Lang.SysError:
RETURN iterationDone.
END CATCH.
END.
RETURN iterationDone.
END FUNCTION.
A simple pair of Get and Set Inner Text functions for OpenEdge Xml:

FUNCTION SetInnerText RETURNS CHARACTER (INPUT hxDoc AS HANDLE, INPUT-OUTPUT hXBaseNode AS HANDLE, INPUT nodeValue AS CHARACTER):
DEFINE VARIABLE hxTextNode AS HANDLE NO-UNDO.
CREATE X-NODEREF hxTextNode.

DO ON ERROR UNDO, LEAVE:
IF(hxBaseNode:NUM-CHILDREN > 0) THEN DO:
hxBaseNode:GET-CHILD(hxTextNode, 1).
IF (hxTextNode:SUBTYPE = "TEXT") THEN DO:
hxTextNode:NODE-VALUE = nodeValue.
RETURN hxTextNode:NODE-VALUE.
END.
ELSE
RETURN "".
END.
ELSE DO:
hxDoc:CREATE-NODE(hxTextNode, "", "TEXT").
hxTextNode:NODE-VALUE = nodeValue.
hXBaseNode:APPEND-CHILD(hxTextNode).
RETURN hxTextNode:NODE-VALUE.
END.
CATCH err AS PROGRESS.Lang.SysError:
RETURN "".
END CATCH.
END.
END FUNCTION.

FUNCTION GetInnerText RETURNS CHARACTER (INPUT hXBaseNode AS HANDLE):
DEFINE VARIABLE hxTextNode AS HANDLE NO-UNDO.
CREATE X-NODEREF hxTextNode.

DO ON ERROR UNDO, LEAVE:
hxBaseNode:GET-CHILD(hxTextNode, 1).
IF (hxTextNode:SUBTYPE = "TEXT") THEN DO:
RETURN hxTextNode:NODE-VALUE.
END.
ELSE
RETURN "".
CATCH err AS PROGRESS.Lang.SysError:
RETURN "".
END CATCH.
END.
END FUNCTION.
SOAP Sniffing in OpenEdge 10.2.A

From the OpenEdge development environment prompt run the following:

proenv>prosoapview PORTNUM

E.G.

proenv>prosoapview 4444

Thursday, February 04, 2010

Creating a SOAP header with AuthHead tags in Progress OpenEdge 10.2.A


DEFINE VARIABLE hWebService AS HANDLE NO-UNDO.
DEFINE VARIABLE hPortType AS HANDLE NO-UNDO.



PROCEDURE CreateMessageAuthHeader :
    DEFINE OUTPUT PARAMETER hSOAPHeader AS HANDLE .
    DEFINE INPUT PARAMETER cOperationNamespace AS CHARACTER .
    DEFINE INPUT PARAMETER cOperationLocalName AS CHARACTER .
    DEFINE OUTPUT PARAMETER lDeleteOnDone AS LOGICAL .

    DEFINE VARIABLE hTmpSoapHeader AS HANDLE NO-UNDO.
    DEFINE VARIABLE hSoapHeaderRef AS HANDLE NO-UNDO.
    DEFINE VARIABLE hNodeAuthHead AS HANDLE NO-UNDO.
  
    CREATE SOAP-HEADER hTmpSoapHeader.
    CREATE SOAP-HEADER-ENTRYREF hSoapHeaderRef.

    CREATE X-DOCUMENT hXDocAuthHeader.
    CREATE X-NODEREF hNodeAuthHead.

    hTmpSoapHeader:ADD-HEADER-ENTRY(hSoapHeaderRef).

    hXDocAuthHeader:CREATE-NODE-NAMESPACE(hNodeAuthHead, cNsUri, cNsPrefix + ":" + "AuthHeader", "ELEMENT").
    AddMessageElement(hNodeAuthHead, hXDocAuthHeader, "username", "username", cNsUri, cNsPrefix).
    AddMessageElement(hNodeAuthHead, hXDocAuthHeader, "password", "password", cNsUri, cNsPrefix).

    hSoapHeaderRef:SET-NODE(hNodeAuthHead).
    hSoapHeader = hTmpSoapHeader.

    lDeleteOnDone = TRUE.

END PROCEDURE .


FUNCTION ConnectWebService RETURNS INT ().
        /*Connect to Webservice*/
        CREATE SERVER hWebService.
                                
        /* replace connection string with config val */
        hWebService:CONNECT("-WSDL 'http://www.someservicesite.com/webservice.asmx?wsdl'").
        RUN PortType SET hPortType ON hWebService.

        /* Set up webservice call/callback */
        hPortType:SET-CALLBACK-PROCEDURE("REQUEST-HEADER", "CreateMessageAuthHeader").
END FUNCTION.


/***********************Web Methods*********************************/

FUNCTION GetStatus RETURNS INT
  (INPUT IdNumber AS CHARACTER)
  IN hPortType.

/***********************Business Methods*********************************/
FUNCTION GetMyStatus RETURNS INT (INPUT IdNumber  AS CHARACTER).
    ConnectWebService().
    statusResult = GetStatus(IdNumber).
END FUNCTION.

Using OpenEdge 10.2.A from Progress to consume a webservice:

When passing an EXTENT LONGCHAR containing an array of XML messages as a parameter to a web method, the xml message(s) are being partially HTML-ENCODED. Which the receiving web method does not appreciate in the slightest.

When I say the XML is being partially HTML-ENCODED, I mean that the '<' and '"'s are being replaced with '<' and '"' respectively. The '>'s are not being replaced. I have no access to the code block where the web call is being made and the encoding occurs as the WSDL is downloaded by Progress OpenEdge on each call. The WSDL is processed and the methods + signatures determined dynamically.

The Schema used defined a custom element type of "anyType". This was the source of the problem. Progress would not interpret the usage/implementation of this node correctly - where the anyType node was meant to be replaced by any other element in the schema defined as type anyType.

Taking the WSDL and manually modifying the schema portion of it to build the message without the anyType did the trick. The encoding also ceased.

Thursday, January 21, 2010

To have your Satellite Forms project produce an '.exe', you must have an icon file in the '\Images' directory of your project.

Note: The icon file must have the same name as your project (.sfa file), but the project may have a different application name. The application name will be the name of your '.exe' with the icon from the '\Images' directory