Dynamic Data

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).

Value Array in JavaScript Code, within a HTML Document

  row = new top._swescript.JSSRecord();
  row.id = "1-9Q1";
  row.valueArray = ["Foo","Bar","1234567890","","Active",

Value Array in an Applet Response

@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.

Script Fragment Utilizing Parsing Functions

This example shows fragments of a recorded script that utilizes the following techniques:

  • Variables are declared for the value array (gsRowValArray and gsRowValArray_001).
  • Parsing functions WebParseDataBoundEx are inserted to parse the value arrays, which are included in the server response of the subsequent function (see examples above).

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.

  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

// ...


// ...

  "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),
  "SWECmd"     := "InvokeMethod",
  "SWERowId"   := SiebelTokenHtml(gsRowValArray, 20), // value: "1-9Q1"
  "SWETS"      := GetTimeStamp(); // value: "1038305654969"

// ...

  "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"