Siebel HTTP traffic includes a variety of dynamic data that are sent to servers within HTTP requests. Such data can be parsed from previous server responses and substituted into scripts in place of hard-coded values.
This includes:
Siebel uses database keys to identify records in databases. Such keys are present in HTTP traffic emanating from both browsers and applets. Database keys are also known as Row IDs. Accurate handling of row IDs and other dynamic data is essential for successful replay.
Row IDs and other dynamic data can be included in HTML documents (see first example below) or in responses to HTTP requests from Java applets (see second example below).
Dynamic data are always contained in value arrays (lists of values for single rows to be displayed in the Siebel GUI).
<script> row = new top._swescript.JSSRecord(); row.id = "1-9Q1"; row.valueArray = ["Foo","Bar","1234567890","","Active", "http://www.foo.com/bar","","","USD", "11/26/2002","","USD","11/26/2002", "","","","","N","N","","1-9Q1"]; S_BC1.Rec(row); </script>
@0`0`3`2``0`UC`1`Status`Completed`SWEC`10`0`24`Notifications`0`2`0``0`OP`bn`bc`S_BC1`7`0``0`type`SWEIRowSelection`OP`g`br`0`cr`6`bc`S_BC1`size`7`ArgsArray`20*Account Entry Applet1*1`7`0``0`type`SWEIRowSelection`OP`g`br`0`cr`6`bc`S_BC1`size`7`ArgsArray`19*Account List Applet1*11*01*01*01*01*01*0`7`0``0`type`SWEIPrivFlds`OP`g`br`0`cr`6`bc`S_BC1`size`7`ArgsArray`19*Account List Applet11**BlankLine11*?11**BlankLine21*?9**HTML URL1*?15**HTML RecNavNxt1*?`7`0``0`type`SWEICanInvokeMethod`OP`g`br`0`cr`6`bc`S_BC1`size`7`ArgsArray`19*Account List Applet1*01*11*11*01*21*11*31*01*41*11*51*11*61*11*71*11*81*11*91*12*101*02*111*02*121*12*131*02*141*12*151*12*161*12*171*12*181*12*191*12*201*12*211*12*221*12*231*12*241*12*251*02*261*12*271*12*281*02*291*02*301*02*311*02*321*02*331*02*341*12*351*12*361*1`7`1``0`OP`iw`index`7`br`0`cr`6`bc`S_BC1`size`7`ar`0`1`0`FieldValues`0`ValueArray`3*Foo3*Bar10*12345678900*6*Active22*http://www.foo.com/bar0*0*3*USD10*11/26/20020*3*USD10*11/26/20020*0*0*0*1*N1*N0*5*1-9N9`8`0``0`OP`dw`index`7`br`0`cr`6`bc`S_BC1`nr`1`size`7`ar`0`8`0``0`value`0`OP`sc`br`0`cr`6`bc`S_BC1`size`7`ar`0`state`n`8`0``0`value`1`OP`sc`br`0`cr`6`bc`S_BC1`size`7`ar`0`state`n`8`0``0`value`7`OP`sc`br`0`cr`6`bc`S_BC1`size`7`ar`0`state`cr`8`0``0`value`1`OP`sc`br`0`cr`6`bc`S_BC1`size`7`ar`0`state`nrk`8`0``0`value`13`OP`sc`br`0`cr`6`bc`S_BC1`size`7`ar`0`state`nr`6`0``0`OP`nd`br`0`cr`6`bc`S_BC1`size`7`ar`0`2`0``0`OP`en`bc`S_BC1`0`3`
Dynamic information typically appears in the dclform section of scripts.
When required, the Web Recorder automatically generates a parsing function (WebParseDataBoundEx) and substitutes parsed values wherever they appear in scripts. Parsing functions parse for complete value arrays in HTML and applet responses. The Recorder uses an appropriate tokenizing function SiebelTokenHtml or SiebelTokenApplet to retrieve individual tokens from parsed value arrays.
This example shows fragments of a recorded script that utilizes the following techniques:
The parsed result can be used wherever it is required. In this example, individual tokens of the parsed values occur in various locations in form definitions. Informational comments are used to enhance readability.
var gsRowValArray : string; // = ["Foo","Bar","1234567890","","Active", // "http://www.foo.com/bar","","","USD", // "11/26/2002","","USD","11/26/2002", // "","","","","N","N","","1-9Q1"]; gsRowValArray_001 : string; // 3*Foo3*Bar10*12345678900*6*Active // 22*http://www.foo.com/bar // 0*0*3*USD10*11/26/20020*3*USD10*11/26/2002 // 0*0*0*0*1*N1*N0*5*1-9N9 // ... WebParseDataBoundEx(gsRowValArray, sizeof(gsRowValArray), "row.valueArray", 2, "S_", WEB_FLAG_IGNORE_WHITE_SPACE, 1); // function call where parsing function is in effect WebParseDataBoundEx(gsRowValArray_001, sizeof(gsRowValArray_001), "ValueArray`", 1, "`", WEB_FLAG_IGNORE_WHITE_SPACE, 1); // function call where parsing function is in effect // ... dclform // ... SALES_ENU_START_SWE016 <ENCODE_CUSTOM> : "SWEMethod" := "Drilldown", "SWEView" := "Account List View", "SWEApplet" := "Account List Applet", "SWEReqRowId":= "1", "s_1_2_40_0" := SiebelTokenHtml(gsRowValArray, 0), // value: "Foo" "s_1_2_41_0" := SiebelTokenHtml(gsRowValArray, 1), // value: "Bar" "s_1_2_42_0" := "(123) 456-7890", "s_1_2_51_0" := "", "s_1_2_47_0" := SiebelTokenHtml(gsRowValArray, 4), // value: "Active" "s_1_2_45_0" := SiebelTokenHtml(gsRowValArray, 5), //value:"http://www.foo.com/bar" "SWECmd" := "InvokeMethod", "SWERowId" := SiebelTokenHtml(gsRowValArray, 20), // value: "1-9Q1" "SWETS" := GetTimeStamp(); // value: "1038305654969" // ... SALES_ENU_START_SWE022 <ENCODE_CUSTOM> : "SWEMethod" := "Drilldown", "SWEView" := "Account List View", "SWEApplet" := "Account List Applet", "SWEReqRowId":= "1", "s_1_2_40_0" := SiebelTokenApplet(gsRowValArray_001, 0), // value: "Foo" "s_1_2_41_0" := SiebelTokenApplet(gsRowValArray_001, 1), // value: "Bar" "s_1_2_42_0" := "(123) 456-7890", "s_1_2_51_0" := "", "s_1_2_47_0" := SiebelTokenApplet(gsRowValArray_001, 4), // value: "Active" "s_1_2_45_0" := SiebelTokenApplet(gsRowValArray_001,5), // value: "http://www.foo.com/bar" "SWECmd" := "InvokeMethod", "SWERowId" := SiebelTokenApplet(gsRowValArray_001, 20), // value: "1-9N9" "SWETS" := GetTimeStamp(); // value: "1038305711331"