Sfoglia il codice sorgente

code sync : report tuning - cross tab(infinity)

TonyKang 7 anni fa
parent
commit
1769b2bd94

+ 16 - 7
modules/reports/rpt_component/helper/jpc_helper_band.js

@@ -39,10 +39,10 @@ let JpcBandHelper = {
         band[JV.PROP_RIGHT] = orgArea[JV.IDX_RIGHT];
         band[JV.PROP_BOTTOM] = orgArea[JV.IDX_BOTTOM];
         //2. set this band
-        if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] == true) {
+        if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]]) {
             switch (band[JV.BAND_PROP_ALIGNMENT]) {
                 case JV.LAYOUT_TOP:
-                    if (band[JV.PROP_CALCULATION] == JV.CAL_TYPE_ABSTRACT) {
+                    if (band[JV.PROP_CALCULATION] === JV.CAL_TYPE_ABSTRACT) {
                         band.Bottom = band.Top + unitFactor * band[JV.BAND_PROP_HEIGHT];
                     } else {
                         band.Bottom = band.Top + (band.Bottom - band.Top) * band[JV.BAND_PROP_HEIGHT] / 100;
@@ -50,7 +50,7 @@ let JpcBandHelper = {
                     orgArea[JV.IDX_TOP] = band.Bottom;
                     break;
                 case JV.LAYOUT_BOTTOM:
-                    if (band[JV.PROP_CALCULATION] == JV.CAL_TYPE_ABSTRACT) {
+                    if (band[JV.PROP_CALCULATION] === JV.CAL_TYPE_ABSTRACT) {
                         band.Top = band.Bottom - unitFactor * band[JV.BAND_PROP_HEIGHT];
                     } else {
                         band.Top = band.Bottom - (band.Bottom - band.Top) * band[JV.BAND_PROP_HEIGHT] / 100;
@@ -58,7 +58,7 @@ let JpcBandHelper = {
                     orgArea[JV.IDX_BOTTOM] = band.Top;
                     break;
                 case JV.LAYOUT_LEFT:
-                    if (band[JV.PROP_CALCULATION] == JV.CAL_TYPE_ABSTRACT) {
+                    if (band[JV.PROP_CALCULATION] === JV.CAL_TYPE_ABSTRACT) {
                         band.Right = band.Left + unitFactor * band[JV.BAND_PROP_WIDTH];
                     } else {
                         band.Right = band.Left + (band.Right - band.Left) * band[JV.BAND_PROP_WIDTH] / 100;
@@ -66,7 +66,7 @@ let JpcBandHelper = {
                     orgArea[JV.IDX_LEFT] = band.Right;
                     break;
                 case JV.LAYOUT_RIGHT:
-                    if (band[JV.PROP_CALCULATION] == JV.CAL_TYPE_ABSTRACT) {
+                    if (band[JV.PROP_CALCULATION] === JV.CAL_TYPE_ABSTRACT) {
                         band.Left = band.Right - unitFactor * band[JV.BAND_PROP_WIDTH];
                     } else {
                         band.Left = band.Right - (band.Right - band.Left) * band[JV.BAND_PROP_WIDTH] / 100;
@@ -83,17 +83,26 @@ let JpcBandHelper = {
             }
         }
     },
-    resetBandPos: function (bandCollection, bands, contentBand, offsetY) {
-        let orgY = contentBand.Bottom;
+    resetBandPos: function (bandCollection, bands, contentBand, offsetX, offsetY) {
+        let orgX = contentBand.Right, orgY = contentBand.Bottom;
         function chkAndResetPos(targetBand) {
             let band = bands[targetBand.Name];
             if (band) {
                 if (band === contentBand) {
                     band.Bottom += offsetY;
+                    band.Right += offsetX;
                 } else {
                     if (band.Top >= orgY) {
                         band.Top += offsetY;
                         band.Bottom += offsetY;
+                    } else if (band.Bottom >= orgY && band.Top < orgY) {
+                        band.Bottom += offsetY;
+                    }
+                    if (band.Left >= orgX) {
+                        band.Left += offsetX;
+                        band.Right += offsetX;
+                    } else if (band.Right >= orgX && band.Le < orgX) {
+                        band.Right += offsetX;
                     }
                 }
                 if (targetBand[JV.BAND_PROP_SUB_BANDS]) {

+ 52 - 17
modules/reports/rpt_component/helper/jpc_helper_cross_tab.js

@@ -114,34 +114,35 @@ let JpcCrossTabHelper = {
             }
         }
     },
-    getMaxTabCntPerPage: function(bands, rptTpl, tabNodeName, tabMeasurePropName, measureForCal) {
+    getMaxRowsPerPage: function(bands, rptTpl) {
         let rst = 1;
-        if (rptTpl[JV.NODE_CROSS_INFO][tabNodeName]) {
-            let tab = rptTpl[JV.NODE_CROSS_INFO][tabNodeName];
-            let maxFieldMeasure = 1.0;
-            if (JV.CAL_TYPE_ABSTRACT == JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION])) {
-                let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
-                maxFieldMeasure = 1.0 * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] * unitFactor;
-            } else {
-                maxFieldMeasure = measureForCal * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] / JV.HUNDRED_PERCENT;
-            }
-            rst = Math.floor(measureForCal / maxFieldMeasure);
+        let band = bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.PROP_BAND_NAME]];
+        if (band) {
+            rst =  getMaxTabCntPerPage(rptTpl, JV.NODE_CROSS_ROW, JV.PROP_CMN_HEIGHT, band.Bottom - band.Top);
         }
         return rst;
     },
-    getMaxRowsPerPage: function(bands, rptTpl) {
-        let me = this, rst = 1;
+    getMaxColsPerPage: function(bands, rptTpl) {
+        let rst = 1;
+        let band = bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL][JV.PROP_BAND_NAME]];
+        if (band) {
+            rst =  getMaxTabCntPerPage(rptTpl, JV.NODE_CROSS_COL, JV.PROP_CMN_WIDTH, band.Right - band.Left);
+        }
+        return rst;
+    },
+    getActualRowsHeight: function(bands, rptTpl, segments, page) {
+        let rst = 1;
         let band = bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW][JV.PROP_BAND_NAME]];
         if (band) {
-            rst =  me.getMaxTabCntPerPage(bands, rptTpl, JV.NODE_CROSS_ROW, JV.PROP_CMN_HEIGHT, band.Bottom - band.Top);
+            rst =  getActualContentAreaMeasurement(rptTpl, JV.NODE_CROSS_ROW, JV.PROP_CMN_HEIGHT, band.Bottom - band.Top, segments, page);
         }
         return rst;
     },
-    getMaxColsPerPage: function(bands, rptTpl) {
-        let me = this, rst = 1;
+    getActualColsWidth: function(bands, rptTpl, segments, page) {
+        let rst = 1;
         let band = bands[rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_COL][JV.PROP_BAND_NAME]];
         if (band) {
-            rst =  me.getMaxTabCntPerPage(bands, rptTpl, JV.NODE_CROSS_COL, JV.PROP_CMN_WIDTH, band.Right - band.Left);
+            rst =  getActualContentAreaMeasurement(rptTpl, JV.NODE_CROSS_COL, JV.PROP_CMN_WIDTH, band.Right - band.Left, segments, page);
         }
         return rst;
     },
@@ -186,4 +187,38 @@ let JpcCrossTabHelper = {
     }
 };
 
+function getMaxTabCntPerPage(rptTpl, tabNodeName, tabMeasurePropName, measureForCal) {
+    let rst = 1;
+    if (rptTpl[JV.NODE_CROSS_INFO][tabNodeName]) {
+        let tab = rptTpl[JV.NODE_CROSS_INFO][tabNodeName];
+        let maxFieldMeasure = 1.0;
+        if (JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION])) {
+            let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
+            maxFieldMeasure = 1.0 * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] * unitFactor;
+        } else {
+            maxFieldMeasure = measureForCal * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] / JV.HUNDRED_PERCENT;
+        }
+        rst = Math.floor(measureForCal / maxFieldMeasure);
+    }
+    return rst;
+};
+
+function getActualContentAreaMeasurement(rptTpl, tabNodeName, tabMeasurePropName, measureForCal, segments, page) {
+    let rst = 1;
+    if (rptTpl[JV.NODE_CROSS_INFO][tabNodeName]) {
+        let tab = rptTpl[JV.NODE_CROSS_INFO][tabNodeName];
+        let maxFieldMeasure = 1.0;
+        if (JV.CAL_TYPE_ABSTRACT === JpcCommonHelper.getPosCalculationType(tab[JV.PROP_CALCULATION])) {
+            let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
+            maxFieldMeasure = 1.0 * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] * unitFactor;
+        } else {
+            maxFieldMeasure = measureForCal * rptTpl[JV.NODE_CROSS_INFO][tabNodeName][tabMeasurePropName] / JV.HUNDRED_PERCENT;
+        }
+        if (segments.length >= page) {
+            rst = segments[page - 1].length * maxFieldMeasure;
+        }
+    }
+    return rst;
+};
+
 module.exports = JpcCrossTabHelper;

+ 3 - 3
modules/reports/rpt_component/helper/jpc_helper_field.js

@@ -12,8 +12,8 @@ let JpcFieldHelper = {
         if (controls) {
             let val = cell[JV.PROP_VALUE];
             let showZero = controls[cell[JV.PROP_CONTROL]][JV.PROP_SHOW_ZERO];
-            if (showZero && showZero == 'F' ) {
-                if (0.0 == 1.0 * (0 + val)) {
+            if (showZero && showZero === 'F' ) {
+                if (0.0 === 1.0 * (0 + val)) {
                     cell[JV.PROP_VALUE] = "";
                 }
             }
@@ -26,7 +26,7 @@ let JpcFieldHelper = {
             for (let i = 0; i < tab_fields.length; i++) {
                 let isFounded = false;
                 for (let j = 0; j < detail_fields.length; j++) {
-                    if (tab_fields[i]["FieldID"] == detail_fields[j]["ID"]) {
+                    if (tab_fields[i]["FieldID"] === detail_fields[j]["ID"]) {
                         isFounded = true;
                         if (rstFields) rstFields.push(tab_fields[i]);
                         if (rstFieldsIdx) rstFieldsIdx.push(j);

+ 0 - 1
modules/reports/rpt_component/helper/jpc_helper_flow_tab.js

@@ -30,7 +30,6 @@ let JpcFlowTabHelper = {
             } else {
                 maxFieldMeasure = (band.Bottom - band.Top) * rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_CMN_HEIGHT] / JV.HUNDRED_PERCENT;
             }
-            //rst = Math.floor((band.Bottom - band.Top) / maxFieldMeasure);
             if (segments.length >= page) {
                 rst = segments[page - 1].length * maxFieldMeasure;
             }

+ 150 - 93
modules/reports/rpt_component/jpc_cross_tab.js

@@ -2,7 +2,6 @@ let JV = require('./jpc_value_define');
 let JpcFieldHelper = require('./helper/jpc_helper_field');
 let JpcBandHelper = require('./helper/jpc_helper_band');
 let JpcBand = require('./jpc_band');
-let JpcFlowTabHelper = require('./helper/jpc_helper_flow_tab');
 let JpcCrossTabHelper = require('./helper/jpc_helper_cross_tab');
 let JpcCommonHelper = require('./helper/jpc_helper_common');
 let JpcDiscreteHelper = require('./helper/jpc_helper_discrete');
@@ -22,7 +21,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
             if (sortedSequence) {
                 let arrDupVals = sortedSequence[segIdx];
                 let arrDupSumVals = null;
-                if (sorted_sum_value_Lst != null) {
+                if (sorted_sum_value_Lst !== null) {
                     arrDupSumVals = sorted_sum_value_Lst[segIdx];
                     sumValL = arrDupSumVals[0].length;
                 }
@@ -34,24 +33,24 @@ JpcCrossTabSrv.prototype.createNew = function(){
                         for (let ei = 0; ei < sumValL; ei++) {
                             sumVal[i][ei] = null;
                         }
-                        if (serial1stTier != null) {
+                        if (serial1stTier !== null) {
                             serial1stTier[i] = JV.BLANK_VALUE_INDEX;
                         }
                         continue;
                     }
                     let duplicateValueArr = arrDupVals[preRec + i];
                     pgseg1stTier[i] = duplicateValueArr[0];
-                    if (arrDupSumVals != null) sumVal[i] = arrDupSumVals[preRec + i];
+                    if (arrDupSumVals !== null) sumVal[i] = arrDupSumVals[preRec + i];
 
-                    if (serial1stTier != null) {
+                    if (serial1stTier !== null) {
                         serial1stTier[i] = preRec + i;
                     }
                 }
                 tabValuedIdxLst.push(pgseg1stTier);
-                if (dispSerialIdxLst != null) {
+                if (dispSerialIdxLst !== null) {
                     dispSerialIdxLst.push(serial1stTier);
                 }
-                if (sorted_sum_value_Lst != null && rst_sum_value_Lst != null) {
+                if (sorted_sum_value_Lst !== null && rst_sum_value_Lst !== null) {
                     rst_sum_value_Lst.push(sumVal);
                 }
             } else {
@@ -59,25 +58,25 @@ JpcCrossTabSrv.prototype.createNew = function(){
                 for (let i = 0; i < nextRec; i++) {
                     pgseg1stTier[i] = JV.BLANK_VALUE_INDEX;
                     sumVal[i] = null;
-                    if (serial1stTier != null) {
+                    if (serial1stTier !== null) {
                         serial1stTier[i] = JV.BLANK_VALUE_INDEX;
                     }
                 }
                 tabValuedIdxLst.push(pgseg1stTier);
-                if (dispSerialIdxLst != null) {
+                if (dispSerialIdxLst !== null) {
                     dispSerialIdxLst.push(serial1stTier);
                 }
-                if (sorted_sum_value_Lst != null && rst_sum_value_Lst != null) {
+                if (sorted_sum_value_Lst !== null && rst_sum_value_Lst !== null) {
                     rst_sum_value_Lst.push(sumVal);
                 }
             }
         }
     }
     function private_addContentValue(dispValueIdxLst_Content, sortedContentSequence, segIdx, counterRowRec, maxRowRec, counterColRec, maxColRec, page_seg_map, pageIdx) {
-        if (dispValueIdxLst_Content != null) {
+        if (dispValueIdxLst_Content !== null) {
             page_seg_map.push([pageIdx,segIdx]);
             let arrContents = [];
-            if (sortedContentSequence != null) {
+            if (sortedContentSequence !== null) {
                 let arrAllContent = sortedContentSequence[segIdx];
                 for (let i = 0; i < maxRowRec; i++) {
                     arrContents.push([]);
@@ -117,13 +116,13 @@ JpcCrossTabSrv.prototype.createNew = function(){
             for (let i = 0; i < dataSeq.length; i++) {
                 sIDX = 0;
                 let segArr = [];
-                if (dataSeq[i].length == 1) {
+                if (dataSeq[i].length === 1) {
                     JpcCrossTabHelper.pushToSeg(segArr, dataSeq, i, 0, 1);
                 } else {
                     for (let j = 1; j < dataSeq[i].length; j++) {
                         b1 = false;
                         for (let k = 0; k < rstFieldsIdx.length; k++) {
-                            if (data_details[rstFieldsIdx[k]][dataSeq[i][j - 1]] != data_details[rstFieldsIdx[k]][dataSeq[i][j]]) {
+                            if (data_details[rstFieldsIdx[k]][dataSeq[i][j - 1]] !== data_details[rstFieldsIdx[k]][dataSeq[i][j]]) {
                                 b1 = true;
                                 break;
                             }
@@ -131,10 +130,10 @@ JpcCrossTabSrv.prototype.createNew = function(){
                         if (b1) {
                             JpcCrossTabHelper.pushToSeg(segArr, dataSeq, i, sIDX, j);
                             sIDX = j;
-                            if (j == dataSeq[i].length - 1) {
+                            if (j === dataSeq[i].length - 1) {
                                 JpcCrossTabHelper.pushToSeg(segArr, dataSeq, i, j, dataSeq[i].length);
                             }
-                        } else if (j == dataSeq[i].length - 1) {
+                        } else if (j === dataSeq[i].length - 1) {
                             JpcCrossTabHelper.pushToSeg(segArr, dataSeq, i, sIDX, dataSeq[i].length);
                         }
                     }
@@ -193,6 +192,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         me.row_sum_extension_fields_idx = [];
         me.crsOrient = JV.PAGE_ORIENTATION_V_FIRST;
         me.pageStatusLst = [];
+        me.paging_option = JV.PAGING_OPTION_NORMAL;
     };
     JpcCrossTabResult.sorting = function(rptTpl, dataObj, dataSeq) {
         let me = this;
@@ -227,7 +227,8 @@ JpcCrossTabSrv.prototype.createNew = function(){
         }
     };
     JpcCrossTabResult.preSetupPages = function(rptTpl, defProperties, option) {
-        let rst = 0, me = this, dftPagingOption = option||JV.PAGING_OPTION_NORMAL;
+        let me = this, rst = 0;
+        me.paging_option = option||JV.PAGING_OPTION_NORMAL;
         //1. original initialize
         let maxRowRec = 1, maxColRec = 1, counterRowRec = 0, counterColRec = 0, pageIdx = 0, segCnt = me.sortedContentSequence.length;
         let pageStatus = [true, true, false, true, false, false, false, false];
@@ -240,83 +241,137 @@ JpcCrossTabSrv.prototype.createNew = function(){
         }
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_EXT][JV.TAB_CROSS_FIELDS], null, me.row_extension_fields_idx);
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_ROW_SUM_EXT][JV.TAB_CROSS_FIELDS], null, me.row_sum_extension_fields_idx);
-        for (let segIdx = 0; segIdx < segCnt; segIdx++) {
-            //2.1. seg level initialize
-            private_resetBandArea();
-            let orgMaxRowRec = maxRowRec, orgMaxColRec = maxColRec;
-            let rowSplitCnt = Math.ceil(1.0 * me.sortedRowSequence[segIdx].length / maxRowRec);
-            let colSplitCnt = Math.ceil(1.0 * me.sortedColSequence[segIdx].length / maxColRec);
+        if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
+            /*
+            rst = segCnt;
+            pageStatus[JV.STATUS_SEGMENT_START] = true;
+            pageStatus[JV.STATUS_SEGMENT_END] = true;
             pageStatus[JV.STATUS_CROSS_ROW_END] = true;
-            private_resetBandArea();
-            let hasAdHocRow = !JpcCrossTabHelper.chkTabEnd(JV.NODE_CROSS_ROW_SUM, rptTpl, bands, me.sortedRowSequence, segIdx, (rowSplitCnt - 1) * orgMaxRowRec, maxRowRec);
-            if (hasAdHocRow) {
-                hasAdHocRow = !JpcCrossTabHelper.chkTabEnd(JV.NODE_CROSS_ROW_EXT, rptTpl, bands, me.sortedRowSequence, segIdx, (rowSplitCnt - 1) * orgMaxRowRec, maxRowRec);
-            }
-            pageStatus[JV.STATUS_CROSS_ROW_END] = false;
             pageStatus[JV.STATUS_CROSS_COL_END] = true;
-            private_resetBandArea();
-            let hasAdHocCol = !JpcCrossTabHelper.chkTabEnd(JV.NODE_CROSS_COL_SUM, rptTpl, bands, me.sortedColSequence, segIdx, (colSplitCnt - 1) * orgMaxColRec, maxColRec);
-            pageStatus[JV.STATUS_CROSS_COL_END] = false;
-            private_resetBandArea();
-            if (hasAdHocRow) rowSplitCnt++;
-            if (hasAdHocCol) colSplitCnt++;
-            //2.2
-            for (let colIdx = 0; colIdx < colSplitCnt; colIdx++) {
-                pageStatus[JV.STATUS_CROSS_COL_END] = colIdx == (colSplitCnt - 1)?true:false;
+            for (let segIdx = 0; segIdx < segCnt; segIdx++) {
+                if (segIdx === segCnt - 1) {
+                    pageStatus[JV.STATUS_REPORT_END] = true;
+                }
+                if (segIdx > 0) {
+                    pageStatus[JV.STATUS_REPORT_START] = false;
+                }
+                me.pageStatusLst.push(pageStatus.slice(0));
+                pageIdx++;
+                private_addTabValue(me.dispValueIdxLst_Row, me.sortedRowSequence, segIdx, 0, me.sortedRowSequence[segIdx].length, me.dispSerialIdxLst_Row, me.col_sum_fields_value_total, me.dispSumValueLst_Col);
+                private_addTabValue(me.dispValueIdxLst_Col, me.sortedColSequence, segIdx, 0, me.sortedColSequence[segIdx].length, null, null, null);
+                private_addContentValue(me.dispValueIdxLst_Content, me.sortedContentSequence, segIdx, 0, me.sortedRowSequence[segIdx].length, 0, me.sortedColSequence[segIdx].length, me.page_seg_map, pageIdx);
+            }
+            //*/
+        } else {
+            for (let segIdx = 0; segIdx < segCnt; segIdx++) {
+                //2.1. seg level initialize
+                private_resetBandArea();
+                let orgMaxRowRec = maxRowRec, orgMaxColRec = maxColRec;
+                let rowSplitCnt = Math.ceil(1.0 * me.sortedRowSequence[segIdx].length / maxRowRec);
+                let colSplitCnt = Math.ceil(1.0 * me.sortedColSequence[segIdx].length / maxColRec);
+                pageStatus[JV.STATUS_CROSS_ROW_END] = true;
                 private_resetBandArea();
-                counterColRec = orgMaxColRec * colIdx;
-                let currentSortedContentSequence = me.sortedContentSequence;
-                let currentSortedColSequence = me.sortedColSequence;
-                if (hasAdHocCol && colIdx == (colSplitCnt - 1)) {
-                    currentSortedColSequence = null;
-                    currentSortedContentSequence = null;
-                    counterColRec = 0;
+                let hasAdHocRow = !JpcCrossTabHelper.chkTabEnd(JV.NODE_CROSS_ROW_SUM, rptTpl, bands, me.sortedRowSequence, segIdx, (rowSplitCnt - 1) * orgMaxRowRec, maxRowRec);
+                if (hasAdHocRow) {
+                    hasAdHocRow = !JpcCrossTabHelper.chkTabEnd(JV.NODE_CROSS_ROW_EXT, rptTpl, bands, me.sortedRowSequence, segIdx, (rowSplitCnt - 1) * orgMaxRowRec, maxRowRec);
                 }
-                for (let rowIdx = 0; rowIdx < rowSplitCnt; rowIdx++) {
-                    pageStatus[JV.STATUS_CROSS_ROW_END] = rowIdx == (rowSplitCnt - 1)?true:false;
+                pageStatus[JV.STATUS_CROSS_ROW_END] = false;
+                pageStatus[JV.STATUS_CROSS_COL_END] = true;
+                private_resetBandArea();
+                let hasAdHocCol = !JpcCrossTabHelper.chkTabEnd(JV.NODE_CROSS_COL_SUM, rptTpl, bands, me.sortedColSequence, segIdx, (colSplitCnt - 1) * orgMaxColRec, maxColRec);
+                pageStatus[JV.STATUS_CROSS_COL_END] = false;
+                private_resetBandArea();
+                if (hasAdHocRow) rowSplitCnt++;
+                if (hasAdHocCol) colSplitCnt++;
+                //2.2
+                for (let colIdx = 0; colIdx < colSplitCnt; colIdx++) {
+                    pageStatus[JV.STATUS_CROSS_COL_END] = (colIdx === (colSplitCnt - 1));
                     private_resetBandArea();
-                    me.pageStatusLst.push(pageStatus.slice(0));
-                    pageIdx++;
-                    counterRowRec = orgMaxRowRec * rowIdx;
-                    let currentSortedRowSequence = me.sortedRowSequence;
-                    if (hasAdHocRow && rowIdx == (rowSplitCnt - 1)) {
-                        currentSortedRowSequence = null;
+                    counterColRec = orgMaxColRec * colIdx;
+                    let currentSortedContentSequence = me.sortedContentSequence;
+                    let currentSortedColSequence = me.sortedColSequence;
+                    if (hasAdHocCol && colIdx === (colSplitCnt - 1)) {
+                        currentSortedColSequence = null;
                         currentSortedContentSequence = null;
-                        counterRowRec = 0;
+                        counterColRec = 0;
+                    }
+                    for (let rowIdx = 0; rowIdx < rowSplitCnt; rowIdx++) {
+                        pageStatus[JV.STATUS_CROSS_ROW_END] = (rowIdx === (rowSplitCnt - 1));
+                        private_resetBandArea();
+                        me.pageStatusLst.push(pageStatus.slice(0));
+                        pageIdx++;
+                        counterRowRec = orgMaxRowRec * rowIdx;
+                        let currentSortedRowSequence = me.sortedRowSequence;
+                        if (hasAdHocRow && rowIdx === (rowSplitCnt - 1)) {
+                            currentSortedRowSequence = null;
+                            currentSortedContentSequence = null;
+                            counterRowRec = 0;
+                        }
+                        private_addTabValue(me.dispValueIdxLst_Row, currentSortedRowSequence, segIdx, counterRowRec, maxRowRec, me.dispSerialIdxLst_Row, me.col_sum_fields_value_total, me.dispSumValueLst_Col);
+                        private_addTabValue(me.dispValueIdxLst_Col, currentSortedColSequence, segIdx, counterColRec, maxColRec, null, null, null);
+                        private_addContentValue(me.dispValueIdxLst_Content, currentSortedContentSequence, segIdx, counterRowRec, maxRowRec, counterColRec, maxColRec, me.page_seg_map, pageIdx);
                     }
-                    private_addTabValue(me.dispValueIdxLst_Row, currentSortedRowSequence, segIdx, counterRowRec, maxRowRec, me.dispSerialIdxLst_Row, me.col_sum_fields_value_total, me.dispSumValueLst_Col);
-                    private_addTabValue(me.dispValueIdxLst_Col, currentSortedColSequence, segIdx, counterColRec, maxColRec, null, null, null);
-                    private_addContentValue(me.dispValueIdxLst_Content, currentSortedContentSequence, segIdx, counterRowRec, maxRowRec, counterColRec, maxColRec, me.page_seg_map, pageIdx);
                 }
+                JpcCrossTabHelper.initialPageStatus(pageStatus);
             }
-            JpcCrossTabHelper.initialPageStatus(pageStatus);
+            //3. set pageSeq and return the result
+            rst = pageIdx;
         }
         bands = null;
-        //3. set pageSeq and return the result
-        rst = pageIdx;
         return rst;
     };
     JpcCrossTabResult.outputAsSimpleJSONPage = function(rptTpl, dataObj, page, bands, controls, $CURRENT_RPT) {
         let me = this, rst = [], tabRstLst = [];
-        let segIdx = JpcCommonHelper.getSegIdxByPageIdx(page, me.page_seg_map);
-        //1 calculate the band position
-        JpcBandHelper.setBandArea(bands, rptTpl, me.pageStatusLst[page - 1]);
-        //2. start to output detail-part
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
-        //2.1 Row-Tab
-        tabRstLst.push(me.outputRowTab(rptTpl, dataObj, page, bands, unitFactor, controls));
-        //2.2 Col-Tab
-        tabRstLst.push(me.outputColTab(rptTpl, dataObj, page, bands, unitFactor, controls));
-        //2.3 Content-Tab
-        tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls));
-        //2.4 Sum-Tab Row
-        //2.4 Sum-tab Col
-        tabRstLst.push(me.outputTabSum(rptTpl, dataObj, page, bands, unitFactor, JV.NODE_CROSS_COL_SUM, controls));
-        //2.x row tab ext
-        tabRstLst.push(me.outputTabExt(rptTpl, dataObj, page, bands, unitFactor, controls));
-        tabRstLst.push(me.outputSumTabExt(rptTpl, dataObj, page, bands, unitFactor, segIdx, controls));
-        //2.5 Discrete
-        tabRstLst.push(JpcDiscreteHelper.outputDiscreteInfo(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[page - 1], segIdx, 1, 0, $CURRENT_RPT));
+        if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
+            /*
+            let segIdx = page - 1;
+            //1 calculate the band position
+            JpcBandHelper.setBandArea(bands, rptTpl, me.pageStatusLst[page - 1]);
+            //2. then reset the band height
+            let tab = rptTpl[JV.NODE_CROSS_INFO][JV.NODE_CROSS_CONTENT];
+            let crossContentBand = bands[tab[JV.PROP_BAND_NAME]];
+            let actH = JpcCrossTabHelper.getActualRowsHeight(bands, rptTpl, me.sortedRowSequence, page);
+            let actW = JpcCrossTabHelper.getActualColsWidth(bands, rptTpl, me.sortedColSequence, page);
+            let offsetY = actH - (crossContentBand.Bottom - crossContentBand.Top);
+            let offsetX = actW - (crossContentBand.Right - crossContentBand.Left);
+            JpcBandHelper.resetBandPos(rptTpl[JV.NODE_BAND_COLLECTION], bands, crossContentBand, offsetX, offsetY);
+
+            //2.1 Row-Tab
+            tabRstLst.push(me.outputRowTab(rptTpl, dataObj, page, bands, unitFactor, controls));
+            //2.2 Col-Tab
+            tabRstLst.push(me.outputColTab(rptTpl, dataObj, page, bands, unitFactor, controls));
+            //2.3 Content-Tab
+            tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls));
+            //2.4 Sum-Tab Row
+            //2.4 Sum-tab Col
+            tabRstLst.push(me.outputTabSum(rptTpl, dataObj, page, bands, unitFactor, JV.NODE_CROSS_COL_SUM, controls));
+            //2.x row tab ext
+            tabRstLst.push(me.outputTabExt(rptTpl, dataObj, page, bands, unitFactor, controls));
+            tabRstLst.push(me.outputSumTabExt(rptTpl, dataObj, page, bands, unitFactor, segIdx, controls));
+            //2.5 Discrete
+            tabRstLst.push(JpcDiscreteHelper.outputDiscreteInfo(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[page - 1], segIdx, 1, 0, $CURRENT_RPT));
+            //*/
+        } else {
+            let segIdx = JpcCommonHelper.getSegIdxByPageIdx(page, me.page_seg_map);
+            //1 calculate the band position
+            JpcBandHelper.setBandArea(bands, rptTpl, me.pageStatusLst[page - 1]);
+            //2. start to output detail-part
+            //2.1 Row-Tab
+            tabRstLst.push(me.outputRowTab(rptTpl, dataObj, page, bands, unitFactor, controls));
+            //2.2 Col-Tab
+            tabRstLst.push(me.outputColTab(rptTpl, dataObj, page, bands, unitFactor, controls));
+            //2.3 Content-Tab
+            tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls));
+            //2.4 Sum-Tab Row
+            //2.4 Sum-tab Col
+            tabRstLst.push(me.outputTabSum(rptTpl, dataObj, page, bands, unitFactor, JV.NODE_CROSS_COL_SUM, controls));
+            //2.x row tab ext
+            tabRstLst.push(me.outputTabExt(rptTpl, dataObj, page, bands, unitFactor, controls));
+            tabRstLst.push(me.outputSumTabExt(rptTpl, dataObj, page, bands, unitFactor, segIdx, controls));
+            //2.5 Discrete
+            tabRstLst.push(JpcDiscreteHelper.outputDiscreteInfo(rptTpl[JV.NODE_CROSS_INFO][JV.NODE_DISCRETE_INFO], bands, dataObj, unitFactor, me.pageStatusLst[page - 1], segIdx, 1, 0, $CURRENT_RPT));
+        }
         for (let i = 0; i < tabRstLst.length; i++) {
             rst = rst.concat(tabRstLst[i]);
             tabRstLst[i] = null;
@@ -329,7 +384,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         let band = bands[tab[JV.PROP_BAND_NAME]];
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
-            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] == true) {
+            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
                 let tab_fields = tab[JV.TAB_CROSS_FIELDS];
                 let data_details = dataObj[JV.DATA_DETAIL_DATA];
                 let valuesIdx = me.dispValueIdxLst_Row[page - 1];
@@ -354,7 +409,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         let band = bands[tab[JV.PROP_BAND_NAME]];
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
-            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] == true) {
+            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
                 let tab_fields = tab[JV.TAB_CROSS_FIELDS];
                 let data_details = dataObj[JV.DATA_DETAIL_DATA];
                 let valuesIdx = me.dispValueIdxLst_Col[page - 1];
@@ -390,7 +445,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         let band = bands[tab[JV.PROP_BAND_NAME]];
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
-            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] == true) {
+            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
                 let tab_fields = tab[JV.TAB_CROSS_FIELDS];
                 let data_details = dataObj[JV.DATA_DETAIL_DATA];
                 let contentValuesIdx = me.dispValueIdxLst_Content[page - 1];
@@ -417,10 +472,10 @@ JpcCrossTabSrv.prototype.createNew = function(){
             band = bands[tab[JV.PROP_BAND_NAME]];
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
-            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] == true) {
+            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
                 let tab_fields = tab[JV.TAB_CROSS_FIELDS];
                 for (let i = 0; i < me.dispSumValueLst_Col[page - 1].length; i++) {
-                    if (me.dispSumValueLst_Col[page - 1][i] != null) {
+                    if (me.dispSumValueLst_Col[page - 1][i] !== null) {
                         for (let j = 0; j < me.dispSumValueLst_Col[page - 1][i].length; j++) {
                             let tab_field = tab_fields[j];
                             let val = me.dispSumValueLst_Col[page - 1][i][j];
@@ -431,7 +486,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
                     } else {
                         let sumL = 1;
                         for (let si = 0; si < me.dispSumValueLst_Col.length; si++) {
-                            if (me.dispSumValueLst_Col[si][0] != null) {
+                            if (me.dispSumValueLst_Col[si][0] !== null) {
                                 sumL = me.dispSumValueLst_Col[si][0].length;
                                 break;
                             }
@@ -455,7 +510,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         let band = bands[tab[JV.PROP_BAND_NAME]];
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
-            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] == true) {
+            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true) {
                 let tab_fields = tab[JV.TAB_CROSS_FIELDS],
                     data_details = dataObj[JV.DATA_DETAIL_DATA],
                     valuesIdx = me.dispValueIdxLst_Col[page - 1];
@@ -491,7 +546,7 @@ JpcCrossTabSrv.prototype.createNew = function(){
         let band = bands[tab[JV.PROP_BAND_NAME]];
         if (band) {
             let pageStatus = me.pageStatusLst[page - 1];
-            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] == true && pageStatus[JV.STATUS_CROSS_ROW_END] === true) {
+            if (pageStatus[band[JV.BAND_PROP_DISPLAY_TYPE]] === true && pageStatus[JV.STATUS_CROSS_ROW_END] === true) {
                 let tab_fields = tab[JV.TAB_CROSS_FIELDS],
                     data_details = dataObj[JV.DATA_DETAIL_DATA],
                     data_fields = [];
@@ -533,22 +588,24 @@ JpcCrossTabSrv.prototype.createNew = function(){
         return rst;
     };
     JpcCrossTabResult.outputTabField = function (band, tab_field, data_field, valueIdx, serialIdx, rows, rowIdx, cols, colIdx, unitFactor, isRow, controls) {
-        let me = this, rst = null;
-        if (isRow == true && tab_field[JV.PROP_IS_SERIAL] && tab_field[JV.PROP_IS_SERIAL] == true) {
-            if (serialIdx >= 0) rst = JpcCommonOutputHelper.createCommonOutput(tab_field, serialIdx + 1)
-            else rst = JpcCommonOutputHelper.createCommonOutput(tab_field, "", controls);
+        let rst = null;
+        if (isRow === true && tab_field[JV.PROP_IS_SERIAL] && tab_field[JV.PROP_IS_SERIAL] === true) {
+            if (serialIdx >= 0) {
+                rst = JpcCommonOutputHelper.createCommonOutput(tab_field, serialIdx + 1)
+            } else rst = JpcCommonOutputHelper.createCommonOutput(tab_field, "", controls);
         } else {
             rst = JpcCommonOutputHelper.createCommonOutput(tab_field, JpcFieldHelper.getValue(data_field, valueIdx), controls);
         }
         //position
-        if (isRow == true) {
+        if (isRow === true) {
             rst[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, rows, rowIdx, cols, colIdx, 1, 0, true, false);
         } else {
             rst[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, rows, rowIdx, cols, colIdx, 1, 0, false, false);
         }
         return rst;
-    }
+    };
+
     return JpcCrossTabResult;
-}
+};
 
 module.exports = new JpcCrossTabSrv();

+ 3 - 2
modules/reports/rpt_component/jpc_ex.js

@@ -146,7 +146,8 @@ JpcExSrv.prototype.createNew = function(){
             }
             me.totalPages += me.exTotalPages;
         } else if (me.crossTab) {
-            me.totalPages = me.crossTab.preSetupPages(rptTpl, defProperties);
+            //me.totalPages = me.crossTab.preSetupPages(rptTpl, defProperties, dftPagingOption);
+            me.totalPages = me.crossTab.preSetupPages(rptTpl, defProperties, JV.PAGING_OPTION_NORMAL); //infinity对交叉表来说无意义
         } else if (me.billTab) {
             me.totalPages = me.billTab.paging();
         }
@@ -207,7 +208,7 @@ JpcExSrv.prototype.createNew = function(){
             let adHocMergePos = null;
             if (me.flowTab) {
                 if (me.totalPages - me.exTotalPages >= page) {
-                    if (me.flowTab.paging_option === JV.PAGING_OPTION_INFINITY_VERTICAL) {
+                    if (me.flowTab.paging_option === JV.PAGING_OPTION_INFINITY) {
                         adHocMergePos = {};
                     }
                     rst.cells = me.flowTab.outputAsSimpleJSONPage(rptTpl, dataObj, page, bands, controls, adHocMergePos, me);

+ 4 - 4
modules/reports/rpt_component/jpc_flow_tab.js

@@ -79,7 +79,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
         me.paging_option = option||JV.PAGING_OPTION_NORMAL;
         let CURRENT_FLOW_INFO = (me.isEx)?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[CURRENT_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS], null, me.disp_fields_idx, me.isEx);
-        if (me.paging_option === JV.PAGING_OPTION_INFINITY_VERTICAL) {
+        if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
             rst = me.segments.length;
             let pageStatus = [true, true, false, true, true, true, false, false];
             for (let segIdx = 0; segIdx < me.segments.length; segIdx++) {
@@ -138,7 +138,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
         let me = this, rst = [], tabRstLst = [];
         let FLOW_NODE_STR = me.isEx?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
         let unitFactor = JpcCommonHelper.getUnitFactor(rptTpl);
-        if (me.paging_option === JV.PAGING_OPTION_INFINITY_VERTICAL) {
+        if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
             let segIdx = page - 1;
             //1 calculate the band position
             JpcBandHelper.setBandArea(bands, rptTpl, me.pageStatusLst[page - 1], !me.isEx, me.isEx);
@@ -147,7 +147,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
             let flowContentBand = bands[tab[JV.PROP_BAND_NAME]];
             let actH = JpcFlowTabHelper.getActualContentAreaHeight(bands, rptTpl, me.segments, page);
             let offsetY = actH - (flowContentBand.Bottom - flowContentBand.Top);
-            JpcBandHelper.resetBandPos(rptTpl[JV.NODE_BAND_COLLECTION], bands, flowContentBand, offsetY);
+            JpcBandHelper.resetBandPos(rptTpl[JV.NODE_BAND_COLLECTION], bands, flowContentBand, 0, offsetY);
 
             tabRstLst.push(me.outputContent(rptTpl, dataObj, page, bands, unitFactor, controls, 0, $CURRENT_RPT));
             // 2.2 Column tab
@@ -170,7 +170,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
                 arr.push(parseInt(mergedBand[JV.PROP_TOP].toFixed(0)));
                 adHocMergePos[JV.PROP_TOP] = arr;
                 arr = [];
-                arr.push(parseInt((mergedBand[JV.PROP_BOTTOM] + offsetY).toFixed(0)));
+                arr.push(parseInt((mergedBand[JV.PROP_BOTTOM]).toFixed(0)));
                 adHocMergePos[JV.PROP_BOTTOM] = arr;
             }
         } else {

+ 1 - 3
public/web/rpt_value_define.js

@@ -196,9 +196,7 @@ let JV = {
     PROP_CELLS: "cells",
 
     PAGING_OPTION_NORMAL: 'normal',
-    PAGING_OPTION_INFINITY_HORIZON: 'infinity_horizon',
-    PAGING_OPTION_INFINITY_VERTICAL: 'infinity_vertical',
-    PAGING_OPTION_INFINITY_BOTH: 'infinity_both',
+    PAGING_OPTION_INFINITY: 'infinity',
 
     PAGE_SELF_DEFINE: "自定义",
     PAGE_SPECIAL_MERGE_POS: "page_merge_pos",