|  | @@ -195,6 +195,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
 | 
	
		
			
				|  |  |          me.dispSumValueLst_Col = [];
 | 
	
		
			
				|  |  |          me.page_seg_map = [];
 | 
	
		
			
				|  |  |          me.row_fields_idx = [];
 | 
	
		
			
				|  |  | +        me.row_fields_adhoc_idx = [];
 | 
	
		
			
				|  |  |          me.col_fields_idx = [];
 | 
	
		
			
				|  |  |          me.content_fields_idx = [];
 | 
	
		
			
				|  |  |          me.row_extension_fields_idx = [];
 | 
	
	
		
			
				|  | @@ -207,6 +208,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
 | 
	
		
			
				|  |  |          let me = this;
 | 
	
		
			
				|  |  |          //IMPORTANT: the data should be sorted in SQL/NoSQL level!
 | 
	
		
			
				|  |  |          me.sortedRowSequence = private_SortAndOptimize(rptTpl, dataObj, dataSeq, JV.NODE_CROSS_ROW, me.row_fields_idx, $CURRENT_RPT);
 | 
	
		
			
				|  |  | +        private_SortAndOptimize(rptTpl, dataObj, dataSeq, JV.NODE_CROSS_ROW_AD_HOC, me.row_fields_adhoc_idx, $CURRENT_RPT);
 | 
	
		
			
				|  |  |          me.sortedColSequence = private_SortAndOptimize(rptTpl, dataObj, dataSeq, JV.NODE_CROSS_COL, me.col_fields_idx, $CURRENT_RPT);
 | 
	
		
			
				|  |  |          me.sortedContentSequence = private_SortForDisplayContent(rptTpl, me.sortedRowSequence, me.sortedColSequence, me.content_fields_idx);
 | 
	
		
			
				|  |  |          JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL_SUM][JV.PROP_CROSS_FIELDS], null, me.col_sum_fields_idx);
 | 
	
	
		
			
				|  | @@ -452,8 +454,8 @@ JpcCrossTabSrv.prototype.createNew = function(){
 | 
	
		
			
				|  |  |              //2. start to output detail-part
 | 
	
		
			
				|  |  |              //2.1 Row-Tab
 | 
	
		
			
				|  |  |              //tabRstLst.push(me.outputRowTab(rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg));
 | 
	
		
			
				|  |  | -            tabRstLst.push(me.outputRowTabCommon(rptTpl, dataObj, page, bands, JV.NODE_CROSS_ROW, unitFactor, controls, $CURRENT_RPT, customizeCfg));
 | 
	
		
			
				|  |  | -            tabRstLst.push(me.outputRowTabCommon(rptTpl, dataObj, page, bands, JV.NODE_CROSS_ROW_AD_HOC, unitFactor, controls, $CURRENT_RPT, customizeCfg));
 | 
	
		
			
				|  |  | +            tabRstLst.push(me.outputRowTabCommon(rptTpl, dataObj, page, bands, JV.NODE_CROSS_ROW, me.row_fields_idx, unitFactor, controls, $CURRENT_RPT, customizeCfg));
 | 
	
		
			
				|  |  | +            tabRstLst.push(me.outputRowTabCommon(rptTpl, dataObj, page, bands, JV.NODE_CROSS_ROW_AD_HOC, me.row_fields_adhoc_idx, unitFactor, controls, $CURRENT_RPT, customizeCfg));
 | 
	
		
			
				|  |  |              //2.2 Col-Tab
 | 
	
		
			
				|  |  |              tabRstLst.push(me.outputColTab(rptTpl, dataObj, page, bands, unitFactor, controls, $CURRENT_RPT, customizeCfg));
 | 
	
		
			
				|  |  |              //2.3 Content-Tab
 | 
	
	
		
			
				|  | @@ -473,7 +475,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          return rst;
 | 
	
		
			
				|  |  |      };
 | 
	
		
			
				|  |  | -    JpcCrossTabResult.outputRowTabCommon = function(rptTpl, dataObj, page, bands, tabStr, unitFactor, controls, $CURRENT_RPT, customizeCfg) {
 | 
	
		
			
				|  |  | +    JpcCrossTabResult.outputRowTabCommon = function(rptTpl, dataObj, page, bands, tabStr, rowFieldsIdxArr, unitFactor, controls, $CURRENT_RPT, customizeCfg) {
 | 
	
		
			
				|  |  |          let me = this, rst = [];
 | 
	
		
			
				|  |  |          let tab = rptTpl[JV.NODE_CROSS_INFO][tabStr];
 | 
	
		
			
				|  |  |          let band = (tab)?bands[tab[JV.PROP_BAND_NAME]]:null;
 | 
	
	
		
			
				|  | @@ -485,13 +487,13 @@ JpcCrossTabSrv.prototype.createNew = function(){
 | 
	
		
			
				|  |  |                  let valuesIdx = me.dispValueIdxLst_Row[page - 1];
 | 
	
		
			
				|  |  |                  let serialsIdx = me.dispSerialIdxLst_Row[page - 1];
 | 
	
		
			
				|  |  |                  let flexiblePrecisionRefObj = null, flexibleRefField = null, precision_ref_data = null;
 | 
	
		
			
				|  |  | -                for (let i = 0; i < me.row_fields_idx.length; i++) {
 | 
	
		
			
				|  |  | +                for (let i = 0; i < rowFieldsIdxArr.length; i++) {
 | 
	
		
			
				|  |  |                      let tab_field = tab_fields[i];
 | 
	
		
			
				|  |  |                      if (!(tab_field[JV.PROP_HIDDEN])) {
 | 
	
		
			
				|  |  |                          let data_field = null;
 | 
	
		
			
				|  |  |                          let map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
 | 
	
		
			
				|  |  | -                        if (typeof me.row_fields_idx[i] !== 'object') {
 | 
	
		
			
				|  |  | -                            data_field = data_details[me.row_fields_idx[i]];
 | 
	
		
			
				|  |  | +                        if (typeof rowFieldsIdxArr[i] !== 'object') {
 | 
	
		
			
				|  |  | +                            data_field = data_details[rowFieldsIdxArr[i]];
 | 
	
		
			
				|  |  |                          } else {
 | 
	
		
			
				|  |  |                              if (map_data_field) {
 | 
	
		
			
				|  |  |                                  data_field = map_data_field[JV.PROP_AD_HOC_DATA];
 |