/****************************************************************************************** * 기능 : 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);} |
|
☞ |
|
☞ |
|
|
|
|