G_QanReportGenerator.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597
  1. /****************************************************************************************************************************
  2. Licensed Materials - Property of IBM
  3. BI and PM: QFW
  4. © Copyright IBM Corp. 2005, 2010
  5. US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  6. *****************************************************************************************************************************/
  7. var G_QanReportGenerator = {};
  8. G_QanReportGenerator.F_convertQueryToReportSpec = function( sV5Command )
  9. {
  10. var v_docCommandXML = U_XML.F_LoadString( D_XmlError, sV5Command, false, true );
  11. var v_nModelPath = v_docCommandXML.selectSingleNode( "./command/*/querySet/modelPath" );
  12. var v_sReportSpec =
  13. '<report xmlns="http://developer.cognos.com/schemas/report/6.0/" expressionLocale="en">' +
  14. U_XML.F_SerializeNode( v_nModelPath ) +
  15. '<drillBehavior modelBasedDrillThru="true"/>' +
  16. '<layouts>' +
  17. '<layout>' +
  18. '<reportPages>' +
  19. '<page name="Page1">' +
  20. '<style>' +
  21. '<defaultStyles>' +
  22. '<defaultStyle refStyle="pg"/>' +
  23. '</defaultStyles>' +
  24. '</style>' +
  25. '<pageBody>' +
  26. '<style>' +
  27. '<defaultStyles>' +
  28. '<defaultStyle refStyle="pb"/>' +
  29. '</defaultStyles>' +
  30. '</style>' +
  31. '<contents>';
  32. var v_nQRDs = v_docCommandXML.selectNodes( "./command/*/querySet/queryResultDefinitions/queryResultDefinition" );
  33. for ( var iQRD = 0; iQRD < v_nQRDs.length; iQRD++ )
  34. {
  35. v_sReportSpec += this.f_convertQRD( v_nQRDs.item( iQRD ) );
  36. }
  37. v_sReportSpec += '</contents>' +
  38. '</pageBody>' +
  39. '<pageFooter>' +
  40. '<contents>';
  41. v_sReportSpec += '<HTMLItem>' +
  42. '<dataSource>' +
  43. '<staticValue>&lt;script&gt; '+
  44. // 'debugger; ' +
  45. // ' document.body.onload = function() { if (parent.adjustResultViewer) parent.adjustResultViewer(window); }; ' +
  46. ' setTimeout( function() { if (parent.adjustResultViewer) parent.adjustResultViewer(window); }, 10 )' +
  47. // ' document.body.onreadystatechange = function() { alert(\'onreadystatechange\'); }; ' +
  48. ' &lt;/script&gt;</staticValue>' +
  49. '</dataSource>' +
  50. '</HTMLItem>';
  51. v_sReportSpec += '</contents>' +
  52. '<style>' +
  53. '<defaultStyles>' +
  54. '<defaultStyle refStyle="pf"/>' +
  55. '</defaultStyles>' +
  56. '<CSS value="padding:0px"/>' +
  57. '</style>' +
  58. '</pageFooter>' +
  59. '</page>' +
  60. '</reportPages>' +
  61. '</layout>' +
  62. '</layouts>';
  63. var v_nQueries = v_docCommandXML.selectSingleNode( "./command/*/querySet/queries" );
  64. var v_sQueries = U_XML.F_SerializeNode( v_nQueries );
  65. v_sReportSpec += G_QanReportGenerator.f_removeQueryExtensions( v_sQueries );
  66. v_sReportSpec += '</report>';
  67. return v_sReportSpec;
  68. }
  69. G_QanReportGenerator.f_removeQueryExtensions = function( sQueries )
  70. {
  71. var v_sQuery = sQueries.replace( /\<reportMeasure[^\>]*\>/g, "" );
  72. v_sQuery = v_sQuery.replace( /rID=\"[^\"]\"/g, "" );
  73. v_sQuery = v_sQuery.replace( /orgRollupAggregate=\"[^\"]*\"/g, "" );
  74. return v_sQuery;
  75. }
  76. G_QanReportGenerator.f_convertQRD = function( nV5QRD )
  77. {
  78. var v_nV5Edges = nV5QRD.selectNodes( "edges/edge" );
  79. if( v_nV5Edges.length == 1 )
  80. {
  81. return G_QanReportGenerator.f_convertListQRD( nV5QRD, v_nV5Edges[0] );
  82. }
  83. else
  84. return G_QanReportGenerator.f_convertCrosstabQRD( nV5QRD, v_nV5Edges );
  85. }
  86. G_QanReportGenerator.f_convertListQRD = function( nV5QRD, nV5Edge )
  87. {
  88. var v_sList =
  89. '<list horizontalPagination="true" name="' +
  90. nV5QRD.getAttribute("name").F_XMLEncode() +'" refQuery="'+
  91. nV5QRD.getAttribute("refQuery").F_XMLEncode() + '">' +
  92. '<style>' +
  93. '<defaultStyles>' +
  94. '<defaultStyle refStyle="ls"/>' +
  95. '</defaultStyles>' +
  96. '<CSS value="border-collapse:collapse"/>' +
  97. '</style>';
  98. this.m_sListColumns = "";
  99. this.m_aListColumns = [];
  100. G_QanReportGenerator.f_collectListItems( nV5Edge );
  101. var v_nV5Valueset = nV5Edge.selectSingleNode( "edgeGroups/edgeGroup/valueSets/valueSet" );
  102. var v_sListGroups = "";
  103. if( v_nV5Valueset && v_nV5Valueset.getAttribute("refDataItem") )
  104. {
  105. v_sListGroups = "<listGroups>";
  106. v_sListGroups += G_QanReportGenerator.f_convertListValueset( v_nV5Valueset, 0 );
  107. v_sListGroups += "</listGroups>";
  108. }
  109. if( v_nV5Valueset )
  110. {
  111. var v_sOverallGroup = G_QanReportGenerator.f_convertOverallHeaderAndFooter( v_nV5Valueset );
  112. if( v_sOverallGroup )
  113. v_sListGroups += "<listOverallGroup>" + v_sOverallGroup + "</listOverallGroup>";
  114. }
  115. var v_nDetailSort = nV5Edge.selectSingleNode(
  116. ".//edgeGroups/edgeGroup/valueSets/valueSet[not(@refDataItem)]/groupSort" )
  117. var v_sDetailSort = G_QanReportGenerator.f_convertGroupSort( v_nDetailSort );
  118. v_sList +=
  119. '<listColumns>' +
  120. this.m_sListColumns +
  121. '</listColumns>' +
  122. ((v_sListGroups)? v_sListGroups: "") +
  123. v_sDetailSort +
  124. '</list>';
  125. return v_sList;
  126. }
  127. G_QanReportGenerator.f_generateFHItem = function( sItemName, bIsStaticValue, bIsFirstPos, iSpan, sAssociatedItems )
  128. {
  129. var v_sCell =
  130. "<rowCell colSpan=\"" + iSpan + "\">" +
  131. "<contents>" +
  132. "<textItem>" +
  133. "<dataSource>";
  134. if( bIsStaticValue )
  135. v_sCell += "<staticValue>" + sItemName.F_XMLEncode() + "</staticValue>";
  136. else
  137. v_sCell += "<dataItemValue refDataItem=\"" + sItemName.F_XMLEncode() + "\"/>";
  138. v_sCell += "</dataSource>" +
  139. "</textItem>" +
  140. sAssociatedItems +
  141. "</contents>" +
  142. "<style>" +
  143. "<defaultStyles>" +
  144. "<defaultStyle refStyle=\"" + ( bIsFirstPos? "of": "os" ) + "\"/>" +
  145. "</defaultStyles>" +
  146. "</style>" +
  147. "</rowCell>";
  148. return v_sCell;
  149. }
  150. G_QanReportGenerator.f_generateAssociatedColumn = function( sItemName )
  151. {
  152. var v_sAsscociatedColumnBlock =
  153. "<block>" +
  154. "<contents>" +
  155. "<textItem>" +
  156. "<dataSource>" +
  157. "<staticValue>" + sItemName.F_XMLEncode() + ": </staticValue>" +
  158. "</dataSource>" +
  159. "</textItem>" +
  160. "<textItem>" +
  161. "<dataSource>" +
  162. "<dataItemValue refDataItem=\"" + sItemName.F_XMLEncode() + "\"/>" +
  163. "</dataSource>" +
  164. "</textItem>" +
  165. "</contents>" +
  166. "</block>";
  167. return v_sAsscociatedColumnBlock;
  168. }
  169. G_QanReportGenerator.f_convertFooterAndHeader = function( nV5HeaderFooter, sBlockName, iGroupOrdinal, bIsOverall )
  170. {
  171. if( !nV5HeaderFooter )
  172. return "";
  173. var v_sFooterHeader =
  174. "<" + sBlockName + ">" +
  175. "<listRows>" +
  176. "<listRow>" +
  177. "<rowCells>";
  178. var v_nlV5BlockItems = nV5HeaderFooter.selectNodes( "dataItemRef" );
  179. var v_aItemPositions = [];
  180. if( !bIsOverall )
  181. v_aItemPositions[0] = this.m_aListColumns[iGroupOrdinal];
  182. var v_sNotAlignedColumns = "";
  183. for( var i = 0; i < v_nlV5BlockItems.length; ++i )
  184. {
  185. var v_sItemName = v_nlV5BlockItems[i].getAttribute( "refDataItem" );
  186. var v_iItemIndex = this.m_aListColumns.indexOf( v_sItemName );
  187. if( v_iItemIndex > iGroupOrdinal )
  188. v_aItemPositions[v_iItemIndex-iGroupOrdinal] = v_sItemName;
  189. }
  190. for( var i = 0; i < v_nlV5BlockItems.length; ++i )
  191. {
  192. var v_sItemName = v_nlV5BlockItems[i].getAttribute( "refDataItem" );
  193. var v_iItemIndex = this.m_aListColumns.indexOf( v_sItemName );
  194. if( v_iItemIndex > iGroupOrdinal )
  195. continue;
  196. var v_sNonAggrName = v_sItemName.replace( /^(Aggregate|Total|Count|Average|Minimum|Maximum|Calculated)\(/i, "" );
  197. var v_sNonAggrName = v_sNonAggrName.replace( /\)$/, "" );
  198. var v_iItemIndex = this.m_aListColumns.indexOf( v_sNonAggrName );
  199. if( v_iItemIndex > iGroupOrdinal && !v_aItemPositions[v_iItemIndex-iGroupOrdinal] )
  200. {
  201. v_aItemPositions[v_iItemIndex-iGroupOrdinal] = v_sItemName;
  202. continue;
  203. }
  204. v_sNotAlignedColumns += G_QanReportGenerator.f_generateAssociatedColumn( v_sItemName );
  205. }
  206. for( var pos = 0; pos < v_aItemPositions.length; ++pos )
  207. {
  208. if( !v_aItemPositions[pos] && !( bIsOverall && pos == 0 ) )
  209. continue;
  210. for( var nextPos = pos + 1; nextPos < v_aItemPositions.length; ++nextPos )
  211. if( v_aItemPositions[nextPos] )
  212. break;
  213. if( bIsOverall && pos == 0 && !v_aItemPositions[pos] )
  214. {
  215. v_sFooterHeader += G_QanReportGenerator.f_generateFHItem( "Summary: ", true, ( pos == 0 ),
  216. nextPos - pos, ( pos == 0 )? v_sNotAlignedColumns: "" );
  217. continue;
  218. }
  219. v_sFooterHeader += G_QanReportGenerator.f_generateFHItem( v_aItemPositions[pos], false, ( pos == 0 ),
  220. nextPos - pos, ( pos == 0 )? v_sNotAlignedColumns: "" );
  221. }
  222. v_sFooterHeader +=
  223. "</rowCells>" +
  224. "</listRow>" +
  225. "</listRows>" +
  226. "</" + sBlockName + ">";
  227. return v_sFooterHeader;
  228. }
  229. G_QanReportGenerator.f_convertOverallHeaderAndFooter = function( nV5Valueset )
  230. {
  231. var v_sListGroup = "";
  232. var v_nV5Header = nV5Valueset.selectSingleNode( "groupHeader" );
  233. v_sListGroup += G_QanReportGenerator.f_convertFooterAndHeader( v_nV5Header, "listHeader", 0, true );
  234. var v_nV5Footer = nV5Valueset.selectSingleNode( "groupFooter" );
  235. v_sListGroup += G_QanReportGenerator.f_convertFooterAndHeader( v_nV5Footer, "listFooter", 0, true );
  236. return v_sListGroup;
  237. }
  238. G_QanReportGenerator.f_convertListValueset = function( nV5Valueset, iGroupOrdinal )
  239. {
  240. var v_sItemName = nV5Valueset.getAttribute("refDataItem");
  241. if( !v_sItemName )
  242. return "";
  243. var v_nV5NestedValueset = nV5Valueset.selectSingleNode( "../../edgeGroups/edgeGroup/valueSets/valueSet" );
  244. var v_sListGroup =
  245. '<listGroup refDataItem="' + v_sItemName.F_XMLEncode() + '">';
  246. if( v_nV5NestedValueset )
  247. {
  248. var v_nV5Header = v_nV5NestedValueset.selectSingleNode( "groupHeader" );
  249. v_sListGroup += G_QanReportGenerator.f_convertFooterAndHeader( v_nV5Header, "listHeader", iGroupOrdinal );
  250. var v_nV5Footer = v_nV5NestedValueset.selectSingleNode( "groupFooter" );
  251. v_sListGroup += G_QanReportGenerator.f_convertFooterAndHeader( v_nV5Footer, "listFooter", iGroupOrdinal );
  252. }
  253. v_sListGroup += G_QanReportGenerator.f_convertGroupSort( nV5Valueset.selectSingleNode( "groupSort" ) );
  254. v_sListGroup +=
  255. '</listGroup>';
  256. // this.m_sListColumns += G_QanReportGenerator.f_generateListColumn( v_sItemName );
  257. if( v_nV5NestedValueset )
  258. v_sListGroup += G_QanReportGenerator.f_convertListValueset( v_nV5NestedValueset, iGroupOrdinal + 1 );
  259. return v_sListGroup;
  260. }
  261. G_QanReportGenerator.f_convertDetailGroup = function( nV5Edge )
  262. {
  263. }
  264. G_QanReportGenerator.f_collectListItems = function( nV5Edge )
  265. {
  266. var v_nlV5GroupItems = nV5Edge.selectNodes( ".//edgeGroups/edgeGroup/valueSets/valueSet[@refDataItem]" );
  267. for( var i = 0; i < v_nlV5GroupItems.length; ++i )
  268. {
  269. var v_sColumnName = v_nlV5GroupItems[i].getAttribute("refDataItem");
  270. this.m_sListColumns += G_QanReportGenerator.f_generateListColumn( v_sColumnName, true );
  271. }
  272. var v_nlV5DetailItems = nV5Edge.selectNodes( ".//edgeGroups/edgeGroup/valueSets/valueSet[not(@refDataItem)]/groupBody/dataItemRef" );
  273. for( var i = 0; i < v_nlV5DetailItems.length; ++i )
  274. {
  275. var v_sColumnName = v_nlV5DetailItems[i].getAttribute("refDataItem") ;
  276. this.m_sListColumns += G_QanReportGenerator.f_generateListColumn( v_sColumnName );
  277. }
  278. }
  279. G_QanReportGenerator.f_convertGroupSort = function( nV5GroupSort )
  280. {
  281. if( !nV5GroupSort )
  282. return "";
  283. var v_sGroupSort =
  284. "<sortList>";
  285. var v_nlSortItems = nV5GroupSort.selectNodes( "sortItem" );
  286. for( var i = 0; i < v_nlSortItems.length; ++i )
  287. {
  288. v_sGroupSort += v_nlSortItems[i].xml;
  289. }
  290. v_sGroupSort +=
  291. "</sortList>";
  292. return v_sGroupSort;
  293. }
  294. G_QanReportGenerator.f_generateListColumn = function( sColumnName, bIsGroupingColumn )
  295. {
  296. this.m_aListColumns.push( sColumnName );
  297. var v_sListColumn =
  298. '<listColumn>' +
  299. '<listColumnTitle>' +
  300. '<style>' +
  301. '<defaultStyles>' +
  302. '<defaultStyle refStyle="lt"/>' +
  303. '</defaultStyles>' +
  304. '</style>' +
  305. '<contents>' +
  306. '<textItem>' +
  307. '<dataSource>' +
  308. '<dataItemLabel refDataItem="'+ sColumnName.F_XMLEncode() +'"/>' +
  309. '</dataSource>' +
  310. '</textItem>' +
  311. '</contents>' +
  312. '</listColumnTitle>' +
  313. '<listColumnBody>' +
  314. '<style>' +
  315. '<defaultStyles>' +
  316. '<defaultStyle refStyle="lc"/>' +
  317. '</defaultStyles>' +
  318. '</style>' +
  319. '<contents>' +
  320. '<textItem>' +
  321. '<dataSource>' +
  322. '<dataItemValue refDataItem="'+ sColumnName.F_XMLEncode() +'"/>' +
  323. '</dataSource>' +
  324. '</textItem>' +
  325. '</contents>';
  326. if( bIsGroupingColumn )
  327. {
  328. v_sListColumn +=
  329. '<listColumnRowSpan refDataItem="'+ sColumnName.F_XMLEncode() +'"/>';
  330. }
  331. v_sListColumn +=
  332. '</listColumnBody>' +
  333. '</listColumn>';
  334. return v_sListColumn;
  335. }
  336. G_QanReportGenerator.f_convertCrosstabQRD = function( nV5QRD, v_nV5Edges )
  337. {
  338. var v_sCrosstab =
  339. '<crosstab horizontalPagination="true" name="'+
  340. nV5QRD.getAttribute("name").F_XMLEncode() +'" refQuery="'+
  341. nV5QRD.getAttribute("refQuery").F_XMLEncode() + '">' +
  342. '<crosstabCorner>' +
  343. '<contents>';
  344. if( v_nV5Edges.length >= 3 )
  345. {
  346. var v_nV5Valuesets = v_nV5Edges[2].selectNodes( ".//valueSet[@refDataItem]" );
  347. if( v_nV5Valuesets.length == 1 )
  348. {
  349. v_sCrosstab +=
  350. '<textItem>' +
  351. '<dataSource>' +
  352. '<dataItemLabel refDataItem="'+ v_nV5Valuesets[0].getAttribute("refDataItem").F_XMLEncode() +'"/>' +
  353. '</dataSource>' +
  354. '</textItem>';
  355. }
  356. }
  357. v_sCrosstab +=
  358. '</contents>' +
  359. '<style>' +
  360. '<defaultStyles>' +
  361. '<defaultStyle refStyle="xm"/>' +
  362. '</defaultStyles>' +
  363. '</style>' +
  364. '</crosstabCorner>' +
  365. '<style>' +
  366. '<CSS value="border-collapse:collapse"/>' +
  367. '<defaultStyles>' +
  368. '<defaultStyle refStyle="xt"/>' +
  369. '</defaultStyles>' +
  370. '</style>';
  371. if( v_nV5Edges.length >= 2 )
  372. {
  373. var v_sValuesets = "";
  374. var v_nV5Valuesets = v_nV5Edges[1].selectNodes( "edgeGroups/edgeGroup/valueSets/valueSet" );
  375. for( var iVS = 0; iVS < v_nV5Valuesets.length; ++iVS )
  376. {
  377. v_sValuesets += G_QanReportGenerator.f_convertValueset( v_nV5Valuesets[iVS] );
  378. }
  379. if( v_sValuesets )
  380. v_sCrosstab += '<crosstabRows>' + v_sValuesets + '</crosstabRows>';
  381. }
  382. v_sCrosstab +=
  383. '<crosstabFactCell>' +
  384. '<contents>' +
  385. '<textItem>' +
  386. '<dataSource>' +
  387. '<cellValue/>' +
  388. '</dataSource>' +
  389. '</textItem>' +
  390. '</contents>' +
  391. '<style>' +
  392. '<defaultStyles>' +
  393. '<defaultStyle refStyle="mv"/>' +
  394. '</defaultStyles>' +
  395. '</style>' +
  396. '</crosstabFactCell>';
  397. if( v_nV5Edges.length >= 3 )
  398. {
  399. var v_nV5Valuesets = v_nV5Edges[2].selectNodes( ".//valueSet[@refDataItem]" );
  400. if( v_nV5Valuesets.length == 1 )
  401. {
  402. v_sCrosstab +=
  403. '<defaultMeasure refDataItem="' + v_nV5Valuesets[0].getAttribute("refDataItem").F_XMLEncode() + '"/>';
  404. }
  405. }
  406. if( v_nV5Edges.length >= 1 )
  407. {
  408. var v_sValuesets = "";
  409. var v_nV5Valuesets = v_nV5Edges[0].selectNodes( "edgeGroups/edgeGroup/valueSets/valueSet" );
  410. for( var iVS = 0; iVS < v_nV5Valuesets.length; ++iVS )
  411. {
  412. v_sValuesets += G_QanReportGenerator.f_convertValueset( v_nV5Valuesets[iVS] );
  413. }
  414. if( v_sValuesets )
  415. v_sCrosstab += '<crosstabColumns>' + v_sValuesets + '</crosstabColumns>';
  416. }
  417. v_sCrosstab +=
  418. '</crosstab>';
  419. return v_sCrosstab;
  420. }
  421. G_QanReportGenerator.f_convertValueset = function( nV5Valueset )
  422. {
  423. var v_sValueset =
  424. '<crosstabNode>';
  425. var v_nNestedValuesets = nV5Valueset.selectNodes( "../../edgeGroups/edgeGroup/valueSets/valueSet" );
  426. if( v_nNestedValuesets.length > 0 )
  427. {
  428. v_sValueset += '<crosstabNestedNodes>';
  429. var v_sNestedValuesets = "";
  430. for( var iVS = 0; iVS < v_nNestedValuesets.length; ++iVS )
  431. {
  432. v_sNestedValuesets += G_QanReportGenerator.f_convertValueset( v_nNestedValuesets[iVS] );
  433. }
  434. v_sValueset += v_sNestedValuesets +
  435. '</crosstabNestedNodes>';
  436. }
  437. var v_nlAssociatedItems = nV5Valueset.selectNodes( "groupBody/dataItemRef" );
  438. var v_sAssociatedItems = "";
  439. for( var iItem = 0; iItem < v_nlAssociatedItems.length; ++iItem )
  440. {
  441. v_sAssociatedItems += G_QanReportGenerator.f_generateAssociatedColumn(
  442. v_nlAssociatedItems[iItem].getAttribute("refDataItem") );
  443. }
  444. var v_sGroupSort = G_QanReportGenerator.f_convertGroupSort(
  445. nV5Valueset.selectSingleNode( "groupSort" ) );
  446. v_sValueset +=
  447. '<crosstabNodeMembers>' +
  448. '<crosstabNodeMember refDataItem="' + nV5Valueset.getAttribute("refDataItem").F_XMLEncode() + '" >' +
  449. '<style>' +
  450. '<defaultStyles>' +
  451. '<defaultStyle refStyle="ml"/>' +
  452. '</defaultStyles>' +
  453. '</style>' +
  454. '<contents>' +
  455. '<textItem>' +
  456. '<dataSource>' +
  457. '<memberCaption/>' +
  458. '</dataSource>' +
  459. '</textItem>' +
  460. v_sAssociatedItems +
  461. '</contents>' +
  462. v_sGroupSort +
  463. '</crosstabNodeMember>' +
  464. '</crosstabNodeMembers>' +
  465. '</crosstabNode>';
  466. return v_sValueset;
  467. }