or to the record on which the interface was executed:
The latter is accomplished through the payload parsing I talked about which allows us to create a view which links an object record to the payload record once the transaction id is stored on the payload record. On these views, I expose I nice looking form applet which displays both the request and response sides of the interface. The form fields are actually calculated fields, defined as DTYPE_TEXT, with the following expression:
InvokeServiceMethod("XXX Utilities", "ConcatenateField", "bo.bc='XXX User Session.XXX User Session XML Detail', FieldName='Log Text', SearchExpr='[Parent Id]=""+[Id]+"" AND [Field]="Request"'", "Out")where:
- 'XXX Utilities' is my eScript framework service with many commonly used functions
- 'ConcatenateField' is a method on that service 'bo.bc' is a parameter name for that method
- 'XXX User Session' is the name of the business object where my user sessions are stored
- 'XXX User Session XML Detail' is the name of the business component containing the split up log data 'FieldName' is another parameter for this method
- 'Log Text' is the name of the field on the 'XXX User Session XML Detail' BC where the split payload text is stored defined as DTYPE_CLOB
- 'SearchExpr' is another parameter for this method
Finally the search expression looks a bit complicated as passing quotes to the InvokeServiceMethod is difficult. I have improvised by using a commonly used XML expression of " which the method then recognizes and converts back to a quote. Here is the method:
function ConcatenateField(Inputs, Outputs) { //Inputs: bo.bc "boName.bcName" // FieldName // SearchExpr BC Search Expression (Optional) var retValue = ""; var found = false; var search = Inputs.GetProperty("SearchExpr"); try { var arSplit = Inputs.GetProperty("bo.bc").split("."); var bcQuery:BusComp; if (arSplit[0] == "ACTIVE") bcQuery = TheApplication().ActiveBusObject().GetBusComp(arSplit[1]); else bcQuery = TheApplication().GetBusObject(arSplit[0]).GetBusComp(arSplit[1]); var delimeter = (Inputs.GetProperty("delimeter") != "" ? Inputs.GetProperty("delimeter") : "\n"); with (bcQuery) { if (search != "") { ClearToQuery(); arSplit = Inputs.GetProperty("SearchExpr").split("""); search = arSplit.join("'"); SetSearchExpr(search); ActivateField(Inputs.GetProperty("FieldName")); SetViewMode(AllView); ExecuteQuery(ForwardOnly); } found = FirstRecord(); while(found) { retValue += GetFieldValue(Inputs.GetProperty("FieldName")); found = NextRecord(); if (found) retValue += delimeter; } Outputs.SetProperty("Out", retValue); } } catch(e) { TheApplication().RaiseError(e); } finally { bcQuery = null; arSplit = null; } }
No comments:
Post a Comment