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