[ Nexacro.Grid -  grid Header Merge ]

 

 


/******************************************************************************************
 * 기능 : Grid header Merge 처리
 * 인자 : objDsHeader  - Grid Header와 동일하게 저장된 Dataset
 *         objGrdHeader - Header가 적용된 Dataset (이미 Header는 적용 되어져 있어야 됨
 * 리턴 :
 * 예문 :
 *****************************************************************************************/
//=================================================================================================
//  grid.mergeContentsCell(strBand,nStartRow,nStartCol,nEndRow,nEndCol,nFirstCell,bKeepSubCell)
//  arg : nStartRow,nStartCol,nEndRow,nEndCol - 특징은 cell이 병합 되기 이전 row, index이다.
//                                              즉, header가 merge되어도 이 4개 값은 이 merge 되기전의 index이다.
//        nFirstCell : 은 cell이 병합된 후의 index이다.
//=================================================================================================

function gfn_pivotGridHeaderMerge(objDsHeader, objGrdHeader){    //넘겨받은 dataset을 복사 해서.. 사용함    var objDsPiovotHeader = new Dataset;    objDsPiovotHeader.name = "objDsPiovotHeader";    this.addChild("objDsPiovotHeader", objDsPiovotHeader);    objDsPiovotHeader.copyData(objDsHeader);     var bCellContinue;    var nMergeIdx = 0, sMergeIdx;    var nHeadCellIdx  = 0;    var nRow=0;    var sBaseText, sNextText, sBefText;    var nStartRow,nStartCol,nEndRow,nEndCol,nFirstCell;    var nAllRow = objDsPiovotHeader.rowcount;    var nColCnt = objDsPiovotHeader.getColCount();    var arrMerge = new Array();    var sMaxMergeIdx; //이미 Merge했던 값 들중 가장 큰값        do {        bCellContinue = false;                //--------------------------------------------------------------------------------------
        // 1. sBaseText 찾기 (merge를 시작할 첫번째 텍스트 값)
        //--------------------------------------------------------------------------------------

        nHeadCellIdx = -1;        sMaxMergeIdx = '';        for(var nColIdx=0; nColIdx<nColCnt; nColIdx++){            sBaseText = objDsPiovotHeader.getColumn(nRow, "headCol" + nColIdx);            // if (nMergeIdx == 4) trace('sBaseText > ' + sBaseText);                        // 숫자면.. 이미 merge를 한 cell로 인식
            if (sBaseText >= "-000" && sBaseText <= "-999"){                continue;                            // 문자명.. 다음 merge를 시작한 baseText로 처리
            }else{                nStartRow = nRow;                nStartCol = nColIdx;                nEndRow   = nRow;                nEndCol   = nColIdx;                //if (nMergeIdx == 0) trace( nMergeIdx.toString().padLeft(3, '0'));
                sMergeIdx = '-' + nMergeIdx.toString().padLeft(3, '0');                objDsPiovotHeader.setColumn(nRow, "headCol" + nColIdx, sMergeIdx ); //찾은 baseText cell은 merge를 한걸로 marking
                bCellContinue = true;                break;            }        }         //--------------------------------------------------------------------------------------
        // 2. BaseText가 Merge후에 몇번째 cell인지 찾기(nFirstCell)
        //    그래서, 이 index를 가지고 merge 후 text값으로 지정하기 위해서.
        //--------------------------------------------------------------------------------------

        nHeadCellIdx  = 0;        sBefText     = '';        sMaxMergeIdx = '';        for(var i=0; i<nAllRow; i++){            for(var j=0; j<nColCnt; j++){                sNextText = objDsPiovotHeader.getColumn(i, "headCol" + j);                if (sMergeIdx == sNextText){                    nFirstCell = nHeadCellIdx;                    break;                }else{                    //문자면 무조건 cellIndex증가
                    if (sNextText < "-000" || sNextText > "-999" || (sNextText >= "가" && sNextText <= "힣"))                        nHeadCellIdx++;                                            //숫자면
                    else{                         //숫자가 달라 졌으면서 &&
//                      if (sBefText <> sNextText) nHeadCellIdx ++;
                                                //if (sMaxMergeIdx < sBefText) sMaxMergeIdx = sBefText;
                        
                        //숫자가 달라 졌으면서 && (다음문자 > 가장큰Merge index)이면 cell 증가
                        if (sBefText <> sNextText && sNextText > sMaxMergeIdx )                               nHeadCellIdx ++;                                                if (sMaxMergeIdx < sBefText) sMaxMergeIdx = sBefText;                    }                }                sBefText = sNextText;            }        }                //--------------------------------------------------------------------------------------
        // 3. 한 Row 끝. 다음 Row 처리 여부 결정
        //--------------------------------------------------------------------------------------
        // bCellContinue == false는 .. 작업중인 row에 merge 모두 완료..   그래서 nRow++로 해서 다음row처리
        // bCellContinue == true는  .. 작업중인 row에 header text가 남은 상황. sBaseText값을 기준으로 다음cell에 같은 값이 존재 하는지 계속 검사

        if (bCellContinue == false){            nRow++;            if (nAllRow<=nRow)                 break;            else                continue;        }                //--------------------------------------------------------------------------------------
        // 4. 기준 sBaseText값을 기준으로 동일한 값이 존재 하는 지 검사
        //--------------------------------------------------------------------------------------

        for(var ii=0; ii<nAllRow; ii++){            for(var nCell=0; nCell<nColCnt; nCell++){                sNextText = objDsPiovotHeader.getColumn(ii, "headCol" + nCell);                // if (nMergeIdx == 2)  trace(' sNextText->' + sNextText + '   :: ' + nHeadCellIdx);            
// if (nMergeIdx == 2) trace('row > ' + ii + ' --. ' + nColIdx + ' ::: ' + nCell + ' --> sBaseText :: ' + sBaseText + ' === ' + sNextText);             
 
                // 문자면
                if (sNextText < "-000" || sNextText > "-999" || (sNextText>="가" && sNextText <= "힣")){ // if (nMergeIdx == 2)  trace('row > ' + ii + ' --. ' + nColIdx + ' ::: ' + nCell + ' --> sBaseText :: ' + sBaseText + ' === ' + sNextText);   
                                 if(sBaseText == sNextText && nColIdx <= nCell){ //  if (nMergeIdx == 1) trace('row > ' + ii + ' .. ' + nHeadCellIdx + ' ::: ' + nCell + ' --> sBaseText :: ' + sBaseText + ' === ' + sNextText + ' :: nMergeIdx > ' + nMergeIdx);   
                                     nEndRow = ii;                        nEndCol = nCell;                                                objDsPiovotHeader.setColumn(ii, "headCol" + nCell, sMergeIdx); //찾은 baseText cell은 merge를 한걸로 marking                    }else{                        if (nColIdx <= nCell) break;   //sBaseText의 cell보다 현재 cell이 더 크면 stop                    }                }            }        }        arrMerge[arrMerge.length] = nStartRow + ',' + nStartCol + ',' + nEndRow + ',' + nEndCol + ',' + nFirstCell; //      trace('--------------------------------' + arrMerge[arrMerge.length-1]);
        nMergeIdx++;    }while(true)    //trace(arrMerge);        //--------------------------------------------------------------------------------------
    // 5. Merge 시작
    //--------------------------------------------------------------------------------------

    var arrMergeValue = new Array();    var nEndCell;    for(var idx=0; idx<arrMerge.length; idx++){        arrMergeValue = arrMerge[idx].split(',');                objGrdHeader.mergeContentsCell("Head",arrMergeValue[0], arrMergeValue[1], arrMergeValue[2],arrMergeValue[3], arrMergeValue[4],false);    }        this.removeChild("objDsPiovotHeader");    //  trace(arrMerge);}
 
☞  
 
☞  
 
 
 
 

  

'Nexacro-Grid > Head' 카테고리의 다른 글

Nexacro.Grid.Head 컬럼 Fixed 처리  (0) 2017.10.17
Posted by 농부지기
,