CCalculate.js 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076
  1. /****************************************************************
  2. ** Licensed Materials - Property of IBM
  3. **
  4. ** BI and PM: qs
  5. **
  6. ** (C) Copyright IBM Corp. 2001, 2015
  7. **
  8. ** US Government Users Restricted Rights - Use, duplication or
  9. ** disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
  10. *****************************************************************/
  11. // Copyright (C) 2008 Cognos ULC, an IBM Company. All Rights Reserved.
  12. // Cognos and the Cognos logo are trademarks of Cognos ULC (formerly Cognos Incorporated) in the United States and/or other countries. IBM and the IBM logo are trademarks of International Business Machines Corporation in the United States, or other countries, or both. Other company, product, or service names may be trademarks or service marks of others.
  13. function CCalculate()
  14. {
  15. this.m_bFeatureRequiresQualityOfService = true;
  16. };
  17. CCalculate.prototype = new AFeatureObject();
  18. CCalculate.prototype.setup = function (aFeatureParams)
  19. {
  20. if (typeof aFeatureParams != "undefined" && aFeatureParams instanceof Array && aFeatureParams.length > 0)
  21. {
  22. newCalculation(aFeatureParams[0]);
  23. }
  24. else
  25. {
  26. newCalculation();
  27. }
  28. };
  29. var calcListDefault = new Array(
  30. "CALCULATION_CONCATENATION", "calcConcat", false
  31. );
  32. var calcListNumber = new Array(
  33. "CALCULATION_SUM", "calcNumericMultiple", true,
  34. "CALCULATION_DIFFERENCE", "calcNumericDouble", true,
  35. "CALCULATION_PRODUCT", "calcNumericMultiple", true,
  36. "CALCULATION_DIVISION", "calcNumericDouble", true,
  37. "CALCULATION_POWER", "calcNumericAdvanced", false,
  38. "CALCULATION_ABSOLUTE", "calcNumericAdvanced", false,
  39. "CALCULATION_ROUND", "calcNumericAdvanced", false,
  40. "CALCULATION_ROUND_DOWN", "calcNumericAdvanced", false,
  41. "CALCULATION_SQUARE_ROOT", "calcNumericAdvanced", false,
  42. "CALCULATION_PERCENTAGE", "calcNumericDouble", true,
  43. "CALCULATION_PERCENT_TOTAL", "calcNumericPercentTotal", false,
  44. "CALCULATION_PERCENT_DIFFERENCE", "calcNumericDouble", false,
  45. "CALCULATION_AVERAGE", "calcNumericMultiple", true,
  46. "CALCULATION_MAXIMUM", "calcNumericMultiple", false,
  47. "CALCULATION_MINIMUM", "calcNumericMultiple", false,
  48. "CALCULATION_RANK", "calcNumericRank", false,
  49. "CALCULATION_PERCENT_TOTAL", "calcNumericPercentTotal", false,
  50. "CALCULATION_PERCENTILE", "calcNumericPercentile", false,
  51. "CALCULATION_QUARTILE", "calcNumericPercentile", false,
  52. "CALCULATION_QUANTILE", "calcNumericPercentile", false
  53. );
  54. var calcListDate = new Array(
  55. "CALCULATION_DATETIME_DIFFERENCE", "calcDateTimeDifference", true,
  56. "CALCULATION_DATETIME_DAYS_BETWEEN", "calcDateTimeDifference", false,
  57. "CALCULATION_DATETIME_MONTHS_BETWEEN", "calcDateTimeDifference", false,
  58. "CALCULATION_DATETIME_YEARS_BETWEEN", "calcDateTimeDifference", false,
  59. "CALCULATION_DATETIME_ADD_DAYS", "calcDateTimeAdd", false,
  60. "CALCULATION_DATETIME_ADD_MONTHS", "calcDateTimeAdd", false,
  61. "CALCULATION_DATETIME_ADD_YEARS", "calcDateTimeAdd", false,
  62. "CALCULATION_EARLIEST", "calcDateTimeMaxMin", false,
  63. "CALCULATION_LATEST", "calcDateTimeMaxMin", false,
  64. "CALCULATION_YEAR", "calcDateTimeUnits", false,
  65. "CALCULATION_MONTH", "calcDateTimeUnits", false,
  66. "CALCULATION_WEEK", "calcDateTimeUnits", false,
  67. "CALCULATION_DAY", "calcDateTimeUnits", false
  68. );
  69. var calcListTime = new Array(
  70. "CALCULATION_DATETIME_DIFFERENCE", "calcDateTimeDifference", true,
  71. "CALCULATION_EARLIEST", "calcDateTimeMaxMin", false,
  72. "CALCULATION_LATEST", "calcDateTimeMaxMin", false,
  73. "CALCULATION_HOUR", "calcDateTimeUnits", false,
  74. "CALCULATION_MINUTE", "calcDateTimeUnits", false,
  75. "CALCULATION_SECOND", "calcDateTimeUnits", false
  76. );
  77. var calcListDatetime = new Array(
  78. "CALCULATION_DATETIME_DIFFERENCE", "calcDateTimeDifference", true,
  79. "CALCULATION_DATETIME_DAYS_BETWEEN", "calcDateTimeDifference", false,
  80. "CALCULATION_DATETIME_MONTHS_BETWEEN", "calcDateTimeDifference", false,
  81. "CALCULATION_DATETIME_YEARS_BETWEEN", "calcDateTimeDifference", false,
  82. "CALCULATION_DATETIME_ADD_DAYS", "calcDateTimeAdd", false,
  83. "CALCULATION_DATETIME_ADD_MONTHS", "calcDateTimeAdd", false,
  84. "CALCULATION_DATETIME_ADD_YEARS", "calcDateTimeAdd", false,
  85. "CALCULATION_EARLIEST", "calcDateTimeMaxMin", false,
  86. "CALCULATION_LATEST", "calcDateTimeMaxMin", false,
  87. "CALCULATION_YEAR", "calcDateTimeUnits", false,
  88. "CALCULATION_MONTH", "calcDateTimeUnits", false,
  89. "CALCULATION_WEEK", "calcDateTimeUnits", false,
  90. "CALCULATION_DAY", "calcDateTimeUnits", false,
  91. "CALCULATION_HOUR", "calcDateTimeUnits", false,
  92. "CALCULATION_MINUTE", "calcDateTimeUnits", false,
  93. "CALCULATION_SECOND", "calcDateTimeUnits", false
  94. );
  95. var calcListString = new Array(
  96. "CALCULATION_LEFT", "calcStringLeftRightTrim", false,
  97. "CALCULATION_RIGHT", "calcStringLeftRightTrim", false,
  98. "CALCULATION_CONCATENATION", "calcConcat", false,
  99. "CALCULATION_TEXT_TRIM", "calcStringLeftRightTrim", false
  100. );
  101. var calcListInterval = new Array(
  102. "CALCULATION_SUM", "calcNumericMultiple", true,
  103. "CALCULATION_DIFFERENCE", "calcDateTimeDifference", true,
  104. "CALCULATION_DAYS", "calcIntervalUnits", true,
  105. "CALCULATION_LATEST", "calcDateTimeMaxMin", true,
  106. "CALCULATION_EARLIEST", "calcDateTimeMaxMin", true,
  107. "CALCULATION_RANK", "calcNumericRank", true
  108. );
  109. var defaultList = new Array(
  110. new Array("ces_concatenate")
  111. );
  112. var numberList = new Array(
  113. new Array("ces_add"),
  114. new Array("ces_subtract"),
  115. new Array("ces_multiply"),
  116. new Array("ces_divide"),
  117. new Array("sql99_power"),
  118. new Array("sql99_abs"),
  119. new Array("btf_round"),
  120. new Array("sql99_floor"),
  121. new Array("sql99_sqrt", "sql99_abs"),
  122. new Array("ces_divide"),
  123. new Array("ces_divide", "ces_for", "ces_for_report", "FOR_REPORT_IN_SIBLING_VSETS_EGROUPS"),
  124. new Array("ces_subtract", "ces_divide", "sql99_abs"),
  125. new Array("ces_add", "ces_subtract", "ces_divide"),
  126. new Array("ces_if", "ces_greater"),
  127. new Array("ces_if", "ces_less"),
  128. new Array("ces_rank", "ces_for", "ces_for_report", "ces_prefilter", "FOR_REPORT_IN_SIBLING_VSETS_EGROUPS"),
  129. new Array("ces_divide", "ces_for", "ces_for_report", "FOR_REPORT_IN_SIBLING_VSETS_EGROUPS"),
  130. new Array("ces_percentile", "ces_for", "ces_for_report", "ces_prefilter", "FOR_REPORT_IN_SIBLING_VSETS_EGROUPS"),
  131. new Array("ces_quartile", "ces_for", "ces_for_report", "ces_prefilter", "FOR_REPORT_IN_SIBLING_VSETS_EGROUPS"),
  132. new Array("ces_quantile", "ces_for", "ces_for_report", "ces_prefilter", "FOR_REPORT_IN_SIBLING_VSETS_EGROUPS")
  133. );
  134. var dateList = new Array(
  135. new Array("ces_subtract"),
  136. new Array("btf_days_between"),
  137. new Array("btf_months_between"),
  138. new Array("btf_years_between"),
  139. new Array("btf_add_days"),
  140. new Array("btf_add_months"),
  141. new Array("btf_add_years"),
  142. new Array("ces_if", "ces_less"),
  143. new Array("ces_if", "ces_greater"),
  144. new Array("sql99_extract"),
  145. new Array("sql99_extract"),
  146. new Array("btf_week_of_year"),
  147. new Array("sql99_extract", "btf_day_of_week", "btf_first_of_month", "btf_last_of_month", "btf_day_of_year")
  148. );
  149. var timeList = new Array(
  150. new Array("ces_subtract"),
  151. new Array("ces_if", "ces_less"),
  152. new Array("ces_if", "ces_greater"),
  153. new Array("sql99_extract"),
  154. new Array("sql99_extract"),
  155. new Array("sql99_extract")
  156. );
  157. var intervalList = new Array();
  158. var datetimeList = new Array(
  159. new Array("ces_subtract"),
  160. new Array("btf_days_between"),
  161. new Array("btf_months_between"),
  162. new Array("btf_years_between"),
  163. new Array("btf_add_days"),
  164. new Array("btf_add_months"),
  165. new Array("btf_add_years"),
  166. new Array("ces_if", "ces_less"),
  167. new Array("ces_if", "ces_greater"),
  168. new Array("sql99_extract"),
  169. new Array("sql99_extract"),
  170. new Array("btf_week_of_year"),
  171. new Array("sql99_extract", "btf_day_of_week", "btf_first_of_month", "btf_last_of_month", "btf_day_of_year"),
  172. new Array("sql99_extract"),
  173. new Array("sql99_extract"),
  174. new Array("sql99_extract")
  175. );
  176. var stringList = new Array(
  177. new Array("sql99_substring"),
  178. new Array("sql99_substring", "sql99_character_length"),
  179. new Array("ces_concatenate"),
  180. new Array("sql99_trim")
  181. );
  182. var oldNumericSelection = 0;
  183. var cSizeOfCalcListItem = 3;
  184. var cNumCalcDialogs = 7;
  185. var cErrInvalidSelection = -1;
  186. var cErrInvalidStringSelection = -2;
  187. var cErrInvalidDateSelection = -3;
  188. function CCalcDlg(aDlgOperations, DbValidationArray, labelId)
  189. {
  190. this.aDlgOperations = aDlgOperations;
  191. this.DbValidationArray = DbValidationArray;
  192. this.labelId = labelId;
  193. this.checkCalcFunctionAgainstDB = checkCalcFunctionAgainstDB;
  194. this.getCalcDlgOperationName = getCalcDlgOperationName;
  195. this.hasValidOperations = hasValidOperations;
  196. };
  197. function getCalcDlgOperationName(oldCalcType)
  198. {
  199. var selection;
  200. var selectionBumper = null;
  201. if (oldCalcType)
  202. {
  203. selection = cfgGet("CALCULATION_INDEX_" + oldCalcType.toUpperCase());
  204. if (cfgGet("CALCULATION_INDEX_" + oldCalcType.toUpperCase() + "_BUMPER"))
  205. selectionBumper = cfgGet("CALCULATION_INDEX_" + oldCalcType.toUpperCase() + "_BUMPER");
  206. }
  207. else
  208. {
  209. selection = cfgGet("CALCULATION_INDEX_" + this.labelId.toUpperCase());
  210. if (cfgGet("CALCULATION_INDEX_" + this.labelId.toUpperCase() + "_BUMPER"))
  211. selectionBumper = cfgGet("CALCULATION_INDEX_" + this.labelId.toUpperCase() + "_BUMPER");
  212. }
  213. if (selection == null)
  214. selection = 0;
  215. var numericSelection;
  216. var calculationDialogSlot;
  217. if (this.labelId == "number")
  218. {
  219. numericSelection = cfgGet("CALCULATION_INDEX_NUMERIC_TYPE");
  220. var numericSelectionValue = parseInt(cfgGet("CALCULATION_INDEX_NUMERIC_TYPE_VALUE"));
  221. if (numericSelection == null)
  222. {
  223. numericSelection = 0;
  224. numericSelectionValue = 0;
  225. selection = 0;
  226. }
  227. else if (oldNumericSelection != numericSelection)
  228. {
  229. oldNumericSelection = numericSelection;
  230. selection = 0;
  231. }
  232. if (selection > 0 && selectionBumper != null)
  233. calculationDialogSlot = (numericSelectionValue * cSizeOfCalcListItem) + (selectionBumper * cSizeOfCalcListItem);
  234. else
  235. calculationDialogSlot = (numericSelectionValue * cSizeOfCalcListItem) + (selection * cSizeOfCalcListItem);
  236. }
  237. else
  238. calculationDialogSlot = selection * cSizeOfCalcListItem;
  239. dlgGlobalSetParm("xxCalcTypeIdx", selection);
  240. if (this.labelId == "number")
  241. dlgGlobalSetParm("xxCalcSubTypeIdx", numericSelection);
  242. dlgSetParm("xxCalcType", this.labelId);
  243. dlgGlobalSetParm("xxCalcType", this.labelId);
  244. dlgSetParm("xxDialogType", this.aDlgOperations[calculationDialogSlot]);
  245. dlgGlobalSetParm("xxDialogType", this.aDlgOperations[calculationDialogSlot]);
  246. return this.aDlgOperations[calculationDialogSlot + 1];
  247. };
  248. var aCalcDialogs = new Array(cNumCalcDialogs);
  249. if (bEnablePercentageOfFooter === true)
  250. {
  251. calcListNumber.splice(33,0,"CALCULATION_PERCENT_FOOTER", "calcNumericPercentFooter", false);
  252. numberList.splice(11,0,new Array("ces_divide", "ces_for", "ces_for_report", "FOR_REPORT_IN_SIBLING_VSETS_EGROUPS"));
  253. };
  254. aCalcDialogs[0] = new CCalcDlg(calcListNumber, numberList, "number");
  255. aCalcDialogs[1] = new CCalcDlg(calcListDate, dateList, "date");
  256. aCalcDialogs[2] = new CCalcDlg(calcListTime, timeList, "time");
  257. aCalcDialogs[3] = new CCalcDlg(calcListDatetime, datetimeList, "datetime");
  258. aCalcDialogs[4] = new CCalcDlg(calcListInterval, intervalList, "interval");
  259. aCalcDialogs[5] = new CCalcDlg(calcListString, stringList, "string");
  260. aCalcDialogs[6] = new CCalcDlg(calcListDefault, defaultList, "default");
  261. function getCalculationDlgIdx(calcType)
  262. {
  263. for(var dlgIdx = 0; dlgIdx < cNumCalcDialogs; ++dlgIdx)
  264. {
  265. if(aCalcDialogs[dlgIdx].labelId == calcType)
  266. return dlgIdx;
  267. }
  268. return -1;
  269. };
  270. function requireDialogRefresh(calcType)
  271. {
  272. var _calcPrevIndex = cfgGet("CALCULATION_PREVIOUS_INDEX_" + calcType.toUpperCase());
  273. var _calcIndex = cfgGet("CALCULATION_INDEX_" + calcType.toUpperCase());
  274. var calcDlgIdx = getCalculationDlgIdx(calcType);
  275. if(calcDlgIdx == -1)
  276. return true;
  277. if(aCalcDialogs[calcDlgIdx].labelId == "number")
  278. {
  279. var numericSelectionValue = parseInt(cfgGet("CALCULATION_INDEX_NUMERIC_TYPE_VALUE"));
  280. if ((_calcPrevIndex != null) && (_calcIndex != null) && (numericSelectionValue != null) &&
  281. (aCalcDialogs[calcDlgIdx].aDlgOperations[(numericSelectionValue * cSizeOfCalcListItem) + (_calcPrevIndex * cSizeOfCalcListItem) + 1] == aCalcDialogs[calcDlgIdx].aDlgOperations[(numericSelectionValue * cSizeOfCalcListItem) + (_calcIndex * cSizeOfCalcListItem) + 1]) &&
  282. (aCalcDialogs[calcDlgIdx].aDlgOperations[(numericSelectionValue * cSizeOfCalcListItem) + (_calcPrevIndex * cSizeOfCalcListItem) + 2] == true) &&
  283. (aCalcDialogs[calcDlgIdx].aDlgOperations[(numericSelectionValue * cSizeOfCalcListItem) + (_calcIndex * cSizeOfCalcListItem + 2)] == true))
  284. return true;
  285. }
  286. else
  287. {
  288. if ((_calcPrevIndex != null) && (_calcIndex != null) &&
  289. (aCalcDialogs[calcDlgIdx].aDlgOperations[_calcPrevIndex * cSizeOfCalcListItem + 1] == aCalcDialogs[calcDlgIdx].aDlgOperations[_calcIndex * cSizeOfCalcListItem + 1]) &&
  290. (aCalcDialogs[calcDlgIdx].aDlgOperations[_calcPrevIndex * cSizeOfCalcListItem + 2] == true) &&
  291. (aCalcDialogs[calcDlgIdx].aDlgOperations[_calcIndex * cSizeOfCalcListItem + 2] == true))
  292. return true;
  293. }
  294. return false;
  295. };
  296. function refreshNewCalculation(calcType, forceRefresh)
  297. {
  298. var _calcPrevIndex = cfgGet("CALCULATION_PREVIOUS_INDEX_" + calcType.toUpperCase());
  299. var _calcIndex = cfgGet("CALCULATION_INDEX_" + calcType.toUpperCase());
  300. var addInsert = false;
  301. var calcIndexNT = cfgGet("CALCULATION_INDEX_NUMERIC_TYPE");
  302. if (calcIndexNT != null && calcIndexNT != oldNumericSelection)
  303. addInsert = false;
  304. else
  305. addInsert = requireDialogRefresh(calcType);
  306. cfgRemove("CALCULATION_REFRESH");
  307. if (addInsert && !forceRefresh)
  308. {
  309. getDialogFrame().addInsert();
  310. return false;
  311. }
  312. else
  313. {
  314. goApplicationManager.getFeatureManager().launchFeature('Calculate', [calcType]);
  315. return true;
  316. }
  317. };
  318. function newCalculation(oldCalcType)
  319. {
  320. cfgSet("LAST_DIALOG", "newcalculation");
  321. dlgReset();
  322. dlgGlobalReset();
  323. if (cfgSize("SelColumns") == 0)
  324. {
  325. dlgShowMessage("CALCULATE_CREATE_BASIC_TITLE", "", "CALCULATION_CREATE_NO_SELECTION");
  326. return;
  327. }
  328. setupCalculation(oldCalcType);
  329. };
  330. function setupCalculation(oldCalcType)
  331. {
  332. var selColCount = cfgSize("SelColumns");
  333. if(selColCount <= 0)
  334. {
  335. dlgShowMessage("CALCULATE_CREATE_BASIC_TITLE", "", "CALCULATION_CREATE_NO_SELECTION");
  336. return;
  337. }
  338. var calcDlgIdx = getCalculationDlgIdxFromSelection();
  339. if (calcDlgIdx == cErrInvalidStringSelection)
  340. {
  341. dlgShowMessage("CALCULATE_CREATE_BASIC_TITLE", "", "CALCULATION_INVALID_STRING_SELECTION");
  342. return;
  343. }
  344. if (calcDlgIdx == cErrInvalidDateSelection)
  345. {
  346. dlgShowMessage("CALCULATE_CREATE_BASIC_TITLE", "", "CALCULATION_INVALID_DATE_SELECTION");
  347. return;
  348. }
  349. if ( (calcDlgIdx == cErrInvalidSelection) || (calcDlgIdx < 0 || calcDlgIdx >= cNumCalcDialogs) )
  350. {
  351. dlgShowMessage("CALCULATE_CREATE_BASIC_TITLE", "", "CALCULATION_INVALID_SELECTION");
  352. return;
  353. }
  354. if(!aCalcDialogs[calcDlgIdx].hasValidOperations())
  355. {
  356. dlgShowMessage("CALCULATE_CREATE_BASIC_TITLE", "", "CALCULATION_HAS_NO_VALID_OPERATIONS");
  357. return;
  358. }
  359. dialogName = aCalcDialogs[calcDlgIdx].getCalcDlgOperationName(oldCalcType);
  360. if (dialogName == "")
  361. {
  362. dlgShowMessage("CALCULATE_CREATE_BASIC_TITLE", "", "CALCULATION_CREATE_NO_SELECTION");
  363. return;
  364. }
  365. if (!checkForValidSelection(true))
  366. return;
  367. buildExpression(aCalcDialogs[calcDlgIdx].labelId, dialogName);
  368. if (cfgGet("calcConstants"))
  369. setupSubstVars(determineDataType(aCalcDialogs[calcDlgIdx].labelId), "calculation");
  370. dlgSetParm("m", "/" + qs_dir + "/" + dialogName + ".xts");
  371. dlgSubmit();
  372. };
  373. function setupSubstVars(dialogType, operation)
  374. {
  375. var numConstants = cfgSize("calcConstants");
  376. for (var i = 0; i < numConstants; i++)
  377. {
  378. var substVarArray = cfgGetAt("calcConstants", i);
  379. if ((operation == "calculation") && ((dialogName == "calcDateTimeAdd") || (dialogName == "calcStringLeftRightTrim")))
  380. {
  381. if (substVarArray[2] == 2 || substVarArray[2] == 10 || substVarArray[2] == 11 || substVarArray[2] == 12)
  382. dlgGlobalSetParmAt("xxSubstVarPair", dlgGlobalSize("xxSubstVarPair"), new Array(substVarArray[0], substVarArray[1]));
  383. }
  384. else if (dialogType == determineDataType(parseInt(substVarArray[2])))
  385. dlgGlobalSetParmAt("xxSubstVarPair", dlgGlobalSize("xxSubstVarPair"), new Array(substVarArray[0], substVarArray[1]));
  386. }
  387. if (dlgGlobalSize("xxSubstVarPair") > 0)
  388. dlgSetParm("xxSubstVar", "true");
  389. };
  390. function buildExpression(calcType, dialogName)
  391. {
  392. if ( dialogName == "calcNumericPercentFooter" )
  393. {
  394. if ( calcType == "number" || calcType == "interval" )
  395. {
  396. if ( buildExpressionForPercentFooter() )
  397. {
  398. return;
  399. }
  400. }
  401. }
  402. var oMQMgr = goApplicationManager.getMiniQueryManager();
  403. var selColCount = cfgSize("SelColumns");
  404. var detailAggForCalculation, detailAggOfThisColumn;
  405. var before_col_id = "-1";
  406. var lastSelIdx = -1;
  407. var i;
  408. for (i = 0; i < selColCount; i++)
  409. {
  410. if (cfgGetAt("SelColumns", i) > lastSelIdx)
  411. lastSelIdx = cfgGetAt("SelColumns", i);
  412. }
  413. if (lastSelIdx < (oMQMgr.getAllColumns().length - 1))
  414. before_col_id = oMQMgr.getColumnId(lastSelIdx + 1);
  415. dlgGlobalSetParm("xxInsBeforeColid", before_col_id);
  416. var thisColumn, columnLabel, columnExpr, columnExprWithoutAggWrapped;
  417. if (((calcType == "number")||(calcType == "interval")) && (dialogName == "calcNumericPercentTotal" || dialogName == "calcNumericPercentFooter" || dialogName == "calcNumericRank" || dialogName == "calcNumericPercentile"))
  418. {
  419. var hasPivot = false;
  420. var groupings = new Array();
  421. for (i = 0; i < oMQMgr.getAllColumns().length; i++)
  422. {
  423. if (oMQMgr.isPivoted(i))
  424. {
  425. hasPivot = true;
  426. break;
  427. }
  428. if (oMQMgr.getColumnRole(i) === MINI_QUERY_GROUP_LIST || oMQMgr.getColumnRole(i) === MINI_QUERY_GROUP_SECTION)
  429. groupings[groupings.length] = i;
  430. }
  431. if (hasPivot == true)
  432. {
  433. groupings = new Array();
  434. for (i = 0; i < oMQMgr.getAllColumns().length; i++)
  435. {
  436. if (oMQMgr.isMeasure(i) === false)
  437. {
  438. groupings[groupings.length] = i;
  439. }
  440. }
  441. }
  442. for (i = 0; i < groupings.length; i++)
  443. {
  444. dlgGlobalSetParmAt("xxGroupedColInfo", dlgGlobalSize("xxGroupedColInfo"), new Array (oMQMgr.getColumnLabel(groupings[i]), oMQMgr.getExpression(groupings[i])));
  445. }
  446. for (i = 0; i < selColCount; i++)
  447. {
  448. thisColumn = cfgGetAt("SelColumns", i);
  449. if ((oMQMgr.isCalculation(thisColumn) && (isNumeric(thisColumn) || calcType == "interval")) || !oMQMgr.isCalculation(thisColumn))
  450. {
  451. detailAggOfThisColumn = oMQMgr.getDetailAggregate(thisColumn);
  452. var regularAgg = oMQMgr.getRegularAggregate(thisColumn);
  453. if (((detailAggOfThisColumn == "") || (detailAggOfThisColumn == "none")) && oMQMgr.isMeasure(thisColumn))
  454. {
  455. if ((regularAgg == "") || (regularAgg == "none"))
  456. detailAggOfThisColumn = "total";
  457. else
  458. detailAggOfThisColumn = regularAgg;
  459. }
  460. detailAggForCalculation = "total";
  461. switch (detailAggOfThisColumn)
  462. {
  463. case "none":
  464. case "any":
  465. case "automatic":
  466. case "calculated":
  467. columnExpr = oMQMgr.getExpression(thisColumn);
  468. detailAggForCalculation = detailAggOfThisColumn;
  469. break;
  470. case "averageNonZero":
  471. case "countDistinct":
  472. case "countNonZero":
  473. case "median":
  474. if (oMQMgr.isCalculation(thisColumn))
  475. columnExpr = "(" + oMQMgr.getCalculatedExpression(thisColumn) + ")";
  476. else
  477. columnExpr = "(" + oMQMgr.getExpression(thisColumn) + ")";
  478. break;
  479. default:
  480. if (oMQMgr.isCalculation(thisColumn))
  481. columnExpr = "(" + oMQMgr.getCalculatedExpression(thisColumn) + ")";
  482. else
  483. columnExpr = "(" + oMQMgr.getExpression(thisColumn) + ")";
  484. detailAggForCalculation = detailAggOfThisColumn;
  485. }
  486. if ((dialogName != "calcNumericPercentTotal") || (dialogName == "calcNumericPercentTotal" && !oMQMgr.isCalculation(thisColumn)))
  487. {
  488. switch (detailAggOfThisColumn)
  489. {
  490. case "none":
  491. case "any":
  492. case "automatic":
  493. case "calculated":
  494. break;
  495. case "countDistinct":
  496. columnExpr = "count(distinct " + columnExpr + ")";
  497. break;
  498. default:
  499. columnExpr = detailAggOfThisColumn + columnExpr;
  500. }
  501. }
  502. if (oMQMgr.isMUN(thisColumn))
  503. {
  504. dlgGlobalSetParmAt("xxColInfo", dlgGlobalSize("xxColInfo"), new Array(oMQMgr.getColumnLabel(thisColumn), "RoleValue('_memberCaption'" + goApplicationManager.getMiniQueryManager().getListSeparator() + " " + columnExpr + ")"));
  505. }
  506. else
  507. {
  508. dlgGlobalSetParmAt("xxColInfo", dlgGlobalSize("xxColInfo"), new Array(oMQMgr.getColumnLabel(thisColumn), columnExpr));
  509. }
  510. dlgGlobalSetParmAt("xxAggs", dlgGlobalSize("xxAggs"), new Array(detailAggForCalculation, oMQMgr.getSummaryAggregate(thisColumn)));
  511. }
  512. }
  513. }
  514. else
  515. {
  516. var needToWrapWithCast = false, regularAggForCalculation = -1, detailAggToMatch = "";
  517. detailAggForCalculation = -1;
  518. for (i = 0; i < selColCount; i++)
  519. {
  520. thisColumn = cfgGetAt("SelColumns", i);
  521. if (dialogName == "calcConcat" && getDataType(thisColumn) != 5)
  522. needToWrapWithCast = true;
  523. columnExpr = "";
  524. columnExprWithoutAggWrapped = "";
  525. var detailAggOfThisColumn = oMQMgr.getDetailAggregate(thisColumn);
  526. var regularAggOfThisColumn = oMQMgr.getRegularAggregate(thisColumn);
  527. if (((detailAggOfThisColumn == "") || (detailAggOfThisColumn == "none")) && oMQMgr.isMeasure(thisColumn))
  528. {
  529. if ((regularAggOfThisColumn == "") || (regularAggOfThisColumn == "none"))
  530. detailAggOfThisColumn = "total";
  531. else
  532. detailAggOfThisColumn = regularAggOfThisColumn;
  533. }
  534. if (i == 0)
  535. detailAggToMatch = detailAggOfThisColumn;
  536. else if (detailAggOfThisColumn != detailAggToMatch)
  537. {
  538. if (detailAggOfThisColumn == "calculated" || detailAggToMatch == "calculated")
  539. detailAggForCalculation = "calculated";
  540. else
  541. detailAggForCalculation = "total";
  542. regularAggForCalculation = "total";
  543. }
  544. if (oMQMgr.isCalculation(thisColumn))
  545. {
  546. columnLabel = "(" + oMQMgr.getColumnLabel(thisColumn) + ")";
  547. switch (detailAggOfThisColumn)
  548. {
  549. case "none":
  550. case "any":
  551. case "automatic":
  552. columnExpr = oMQMgr.getExpression(thisColumn);
  553. break;
  554. case "calculated":
  555. columnExpr = oMQMgr.getExpression(thisColumn);
  556. regularAggForCalculation = oMQMgr.getSummaryAggregate(thisColumn);
  557. break;
  558. default:
  559. columnExpr = oMQMgr.getCalculatedExpression(thisColumn);
  560. detailAggForCalculation = detailAggOfThisColumn;
  561. regularAggForCalculation = oMQMgr.getSummaryAggregate(thisColumn);
  562. }
  563. if (needToWrapWithCast)
  564. columnExpr = "CAST((" + columnExpr + ") as nvarchar(30))";
  565. else
  566. {
  567. switch (detailAggOfThisColumn)
  568. {
  569. case "none":
  570. case "any":
  571. case "automatic":
  572. break;
  573. case "calculated":
  574. columnExprWithoutAggWrapped = oMQMgr.getCalculatedExpression(thisColumn);
  575. break;
  576. case "countDistinct":
  577. columnExpr = "count(distinct " + columnExpr + ")";
  578. break;
  579. case "averageNonZero":
  580. case "countNonZero":
  581. case "median":
  582. columnExprWithoutAggWrapped = columnExpr;
  583. columnExpr = "total(" + columnExpr + ")";
  584. break;
  585. default:
  586. columnExpr = detailAggOfThisColumn + "(" + columnExpr + ")";
  587. }
  588. }
  589. if (detailAggOfThisColumn != "calculated" || columnExprWithoutAggWrapped == "")
  590. columnExprWithoutAggWrapped = columnExpr;
  591. }
  592. else
  593. {
  594. columnLabel = oMQMgr.getColumnLabel(thisColumn);
  595. if (needToWrapWithCast)
  596. {
  597. columnExpr = "CAST";
  598. columnExprWithoutAggWrapped = "CAST";
  599. if (dialogName == "calcConcat")
  600. {
  601. switch (detailAggOfThisColumn)
  602. {
  603. case "none":
  604. case "any":
  605. case "automatic":
  606. case "calculated":
  607. break;
  608. case "countDistinct":
  609. columnExpr = "count(distinct " ;
  610. break;
  611. case "averageNonZero":
  612. case "countNonZero":
  613. case "median":
  614. columnExpr += "(total";
  615. columnExprWithoutAggWrapped += "(total";
  616. break;
  617. default:
  618. columnExpr += "(" + detailAggOfThisColumn;
  619. columnExprWithoutAggWrapped += "(" + detailAggOfThisColumn;
  620. }
  621. }
  622. }
  623. else
  624. {
  625. switch (detailAggOfThisColumn)
  626. {
  627. case "none":
  628. case "any":
  629. case "automatic":
  630. break;
  631. case "countDistinct":
  632. columnExpr="count(distinct ";
  633. break;
  634. case "calculated":
  635. case "averageNonZero":
  636. case "countNonZero":
  637. case "median":
  638. columnExpr = "total";
  639. break;
  640. default:
  641. columnExpr = detailAggOfThisColumn;
  642. }
  643. }
  644. columnExpr += "(" + oMQMgr.getExpression(thisColumn);
  645. columnExprWithoutAggWrapped += "(" + oMQMgr.getExpression(thisColumn);
  646. if (needToWrapWithCast)
  647. {
  648. if (dialogName == "calcConcat")
  649. {
  650. switch (detailAggOfThisColumn)
  651. {
  652. case "none":
  653. case "any":
  654. case "automatic":
  655. case "calculated":
  656. break;
  657. default:
  658. columnExpr += ")";
  659. columnExprWithoutAggWrapped += ")";
  660. }
  661. }
  662. columnExpr += " as nvarchar(30)";
  663. columnExprWithoutAggWrapped += " as nvarchar(30)";
  664. }
  665. columnExpr += ")";
  666. columnExprWithoutAggWrapped += ")";
  667. if(detailAggOfThisColumn == "countDistinct")
  668. columnExpr += ")";
  669. }
  670. if (oMQMgr.isMUN(thisColumn))
  671. {
  672. dlgGlobalSetParmAt("xxColInfo", dlgGlobalSize("xxColInfo"), new Array(columnLabel, "RoleValue('_memberCaption'" + goApplicationManager.getMiniQueryManager().getListSeparator() + " " + columnExpr + ")"));
  673. dlgGlobalSetParmAt("xxSummExpr", dlgGlobalSize("xxSummExpr"), new Array(detailAggOfThisColumn, "RoleValue('_memberCaption'" + goApplicationManager.getMiniQueryManager().getListSeparator() + " " + columnExprWithoutAggWrapped + ")"));
  674. }
  675. else
  676. {
  677. dlgGlobalSetParmAt("xxColInfo", dlgGlobalSize("xxColInfo"), new Array(columnLabel, columnExpr));
  678. dlgGlobalSetParmAt("xxSummExpr", dlgGlobalSize("xxSummExpr"), new Array(detailAggOfThisColumn, columnExprWithoutAggWrapped));
  679. }
  680. }
  681. if ((dialogName == "calcDateTimeDifference") || (dialogName == "calcNumericDouble"))
  682. dlgSetParm("xxColCount", selColCount);
  683. dlgGlobalSetParmAt("xxDetailAgg", dlgGlobalSize("xxDetailAgg"), detailAggForCalculation);
  684. dlgGlobalSetParmAt("xxRegularAgg", dlgGlobalSize("xxRegularAgg"), regularAggForCalculation);
  685. }
  686. };
  687. function buildExpressionForPercentFooter()
  688. {
  689. var isDone = false;
  690. var oMQMgr = goApplicationManager.getMiniQueryManager();
  691. var selColCount = cfgSize("SelColumns");
  692. var detailAggForCalculation, detailAggOfThisColumn;
  693. var before_col_id = "-1";
  694. var lastSelIdx = -1;
  695. var i;
  696. for (i = 0; i < selColCount; i++)
  697. {
  698. if (cfgGetAt("SelColumns", i) > lastSelIdx)
  699. lastSelIdx = cfgGetAt("SelColumns", i);
  700. }
  701. if (lastSelIdx < (cfgSize("QueryIDs") - 1))
  702. before_col_id = cfgGetAt("QueryIDs", lastSelIdx + 1);
  703. dlgGlobalSetParm("xxInsBeforeColid", before_col_id);
  704. var thisColumn, columnExpr;
  705. var hasPivot = false;
  706. var groupings = new Array();
  707. for (i = 0; i < oMQMgr.getAllColumns().length; i++)
  708. {
  709. if (oMQMgr.isPivoted(i))
  710. {
  711. hasPivot = true;
  712. break;
  713. }
  714. if (oMQMgr.getColumnRole(i) === MINI_QUERY_GROUP_LIST || oMQMgr.getColumnRole(i) === MINI_QUERY_GROUP_SECTION)
  715. groupings[groupings.length] = i;
  716. }
  717. if (hasPivot == true)
  718. {
  719. groupings = new Array();
  720. for (i = 0; i < oMQMgr.getAllColumns().length; i++)
  721. {
  722. if (oMQMgr.isMeasure(i) === false)
  723. groupings[groupings.length] = i;
  724. }
  725. }
  726. for (i = 0; i < groupings.length; i++)
  727. {
  728. dlgGlobalSetParmAt("xxGroupedColInfo", dlgGlobalSize("xxGroupedColInfo"), new Array (oMQMgr.getColumnLabel(groupings[i]), oMQMgr.getExpression(groupings[i])));
  729. }
  730. for (i = 0; i < selColCount; i++)
  731. {
  732. thisColumn = cfgGetAt("SelColumns", i);
  733. if ( (oMQMgr.isCalculation(thisColumn) && (isNumeric(thisColumn) || calcType == "interval")) || !oMQMgr.isCalculation(thisColumn) )
  734. {
  735. detailAggOfThisColumn = oMQMgr.getDetailAggregate(thisColumn);
  736. var regularAgg = oMQMgr.getRegularAggregate(thisColumn);
  737. if ( detailAggOfThisColumn == "" ||
  738. detailAggOfThisColumn == "none" ||
  739. detailAggOfThisColumn == "any" ||
  740. detailAggOfThisColumn == "automatic" ||
  741. detailAggOfThisColumn == "calculated"
  742. )
  743. {
  744. detailAggOfThisColumn = regularAgg;
  745. }
  746. detailAggForCalculation = oMQMgr.getSummaryAggregate(thisColumn);
  747. if ( detailAggForCalculation == "" ||
  748. detailAggForCalculation == "none" ||
  749. detailAggForCalculation == "any" ||
  750. detailAggForCalculation == "default" ||
  751. detailAggForCalculation == "automatic" ||
  752. detailAggForCalculation == "calculated"
  753. )
  754. {
  755. detailAggForCalculation = detailAggOfThisColumn;
  756. }
  757. if ( detailAggOfThisColumn == "" ||
  758. detailAggOfThisColumn == "none" ||
  759. detailAggOfThisColumn == "any" ||
  760. detailAggOfThisColumn == "automatic" ||
  761. detailAggOfThisColumn == "calculated"
  762. )
  763. {
  764. detailAggOfThisColumn = "";
  765. detailAggForCalculation = "total";
  766. }
  767. if (oMQMgr.isCalculation(thisColumn))
  768. {
  769. columnExpr = "(" + oMQMgr.getCalculatedExpression(thisColumn) + ")";
  770. }
  771. else
  772. {
  773. columnExpr = oMQMgr.getExpression(thisColumn);
  774. }
  775. if (oMQMgr.isMUN(thisColumn))
  776. {
  777. dlgGlobalSetParmAt("xxColInfo", dlgGlobalSize("xxColInfo"), new Array(oMQMgr.getColumnLabel(thisColumn), "RoleValue('_memberCaption'" + goApplicationManager.getMiniQueryManager().getListSeparator() + " " + columnExpr + ")"));
  778. }
  779. else
  780. {
  781. dlgGlobalSetParmAt("xxColInfo", dlgGlobalSize("xxColInfo"), new Array(oMQMgr.getColumnLabel(thisColumn), columnExpr));
  782. }
  783. dlgGlobalSetParmAt("xxAggs", dlgGlobalSize("xxAggs"), new Array(detailAggOfThisColumn, detailAggForCalculation));
  784. isDone = true;
  785. }
  786. }
  787. return isDone;
  788. };
  789. function hasValidOperations()
  790. {
  791. var i;
  792. if(aCalcDialogs[getCalculationDlgIdxFromSelection()].labelId == "interval")
  793. {
  794. for (i = 0; i < this.aDlgOperations.length / cSizeOfCalcListItem; i++)
  795. dlgGlobalSetParmAt("xxValidCalcItem", dlgGlobalSize("xxValidCalcItem"), i);
  796. return true;
  797. }
  798. else
  799. {
  800. var bHasValidOperations = false;
  801. for (i = 0; i < this.DbValidationArray.length; i++)
  802. {
  803. var isValid = true;
  804. for (var j = 0; j < this.DbValidationArray[i].length; j++)
  805. {
  806. var currentOperation = this.DbValidationArray[i][j];
  807. currentOperation = currentOperation.split(",");
  808. var tempValid = false;
  809. for (var k = 0; k < currentOperation.length; k++)
  810. {
  811. if (this.checkCalcFunctionAgainstDB(currentOperation[k]))
  812. {
  813. tempValid = true;
  814. break;
  815. }
  816. }
  817. if (tempValid == false)
  818. {
  819. isValid = false;
  820. break;
  821. }
  822. }
  823. this.aDlgOperations[(i * cSizeOfCalcListItem) + 2] = isValid;
  824. if(isValid)
  825. dlgGlobalSetParmAt("xxValidCalcItem", dlgGlobalSize("xxValidCalcItem"), i);
  826. if(!bHasValidOperations && isValid)
  827. bHasValidOperations = true;
  828. }
  829. return bHasValidOperations;
  830. }
  831. };
  832. function checkCalcFunctionAgainstDB(calcFunction)
  833. {
  834. var calcFnSize = cfgSize("CalcFns");
  835. for (var iter = 0; iter < calcFnSize; iter++)
  836. {
  837. if (cfgGetAt("CalcFns", iter) == calcFunction)
  838. return true;
  839. }
  840. return false;
  841. };
  842. function checkRestrictedCalcFunctionAgainstDB(calcFunction)
  843. {
  844. var calcFnSize = cfgSize("CalcFnsRestricted");
  845. for (var iter = 0; iter < calcFnSize; iter++)
  846. {
  847. if (cfgGetAt("CalcFnsRestricted", iter) == calcFunction)
  848. return true;
  849. }
  850. return false;
  851. };
  852. function getCalculationDlgIdxFromSelection()
  853. {
  854. var outputTypeIsMeasure = false;
  855. var oMQMgr = goApplicationManager.getMiniQueryManager();
  856. var numSelCols = cfgSize("SelColumns");
  857. var type = cErrInvalidSelection;
  858. for (var i = 0; i < numSelCols; ++i)
  859. {
  860. var sel = cfgGetAt("SelColumns", i);
  861. if (oMQMgr.isMeasure(sel))
  862. {
  863. outputTypeIsMeasure = true;
  864. }
  865. dlgGlobalSetParmAt("xxCalcParentIds", dlgGlobalSize("xxCalcParentIds"), new Array(oMQMgr.getColumnId(sel), oMQMgr.getColumnLabel(sel)));
  866. if(oMQMgr.isCalculation(sel))
  867. {
  868. var calcType = getCalcType(sel);
  869. var colType = oMQMgr.getDataType(sel);
  870. if( (calcType == "unknown") || ( (calcType == "model") && (colType == 0) ) )
  871. return cErrInvalidSelection;
  872. }
  873. if (oMQMgr.getDisplayType(sel) === 1)
  874. {
  875. return cErrInvalidSelection;
  876. }
  877. var selType = getDataType(sel);
  878. if (oMQMgr.hasNumericDetailAggregate(sel))
  879. {
  880. selType = 0;
  881. }
  882. if(i > 0 && type != selType)
  883. {
  884. if ((selType >= 1 && selType <= 4) && ((type >= 1 && type <= 4) || type == cErrInvalidDateSelection))
  885. type = cErrInvalidDateSelection;
  886. else
  887. type = cErrInvalidStringSelection;
  888. }
  889. else
  890. {
  891. type = selType;
  892. }
  893. }
  894. dlgGlobalSetParm("xxIsMeasureOutput", outputTypeIsMeasure);
  895. if(type >= cNumCalcDialogs)
  896. return cErrInvalidSelection;
  897. return type;
  898. };
  899. function isDetailFilterEnabled()
  900. {
  901. var bEnabled = ( checkCalcFunctionAgainstDB("DETAIL_FILTER_BEFORE_AGGREGATION") || checkRestrictedCalcFunctionAgainstDB("DETAIL_FILTER_BEFORE_AGGREGATION") );
  902. return bEnabled;
  903. };