[ Nexacro.Grid -  copy & paste ]

 

/*==+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 * Group : 10. Grid 영역 copy & paste

 **=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/


/******************************************************************************************
 * 기능 : 그리드 Ctrl + C 입력시 그리시 Cell Text 복사
 * 인자 : obj:Grid
 *         e:KeyEventInfo
 * 리턴 :
 * 예문 :
 *****************************************************************************************/

function gfn_CopyGridCellText(obj:Grid, e:KeyEventInfo)

{

    if( e.ctrlKey && e.keycode == 67)

    {

        var selectedValue = obj.getCellText(obj.currentrow, obj.currentcell);

        // ClipBoard 초기화

        system.clearClipboard();

        //선택값 복사.

        system.setClipboard("CF_TEXT", selectedValue);

    }

}

/*++
개요: Grid에서 copy,paset,del 이 작동하게 한다
@name    esm_copy.xjs
@author  허원무
@since   2012.01.10
@remark  복사(ctrl+C) 붙여넣기(ctrl+V) 가능.
@remark  1) 한 cell복사해서 -> 다중셀 선택후 붙여넣기 가능
@remark  2) 다중 cell복사해서 -> 한cell선택후 붙여넣기 : 구역이 붙여넣기됨
@remark  3) 다중 cell선택후 Del키 -> 일괄삭제됨
*/
 

var GRID_VAL_DIV = "\t";

var CLIPBOARD_TYPE = "CF_UNICODETEXT"; // 클립보드에 저장시 데이터 타입

 

/**************************************************************************/
//  ESEST4120XM 복사, 붙여넣기 참조
//
//  copy and paste 사용시 필수 항목..
//  grid selecttype = area
//  grid 에 Dataset이 bind되있어야 함..
//
//  esm_fn_GridPasteVal 사용시  
//  마지막 파라메터로 값 체크할 함수명("func_test" X, func_test O)
//  함수 파라메터 1. grid에 bind된 Dataset
//                  2. Dataset columnID
//                  3. Dataset row index
//                  4. 복사된 값
/**************************************************************************/
 

/******************************************************************************/
/**   popup 메뉴 동적 생성       
 * ★ Function    : esm_fn_SetPopUpMenu
 * ★ 설명        : 그리드이 팝덥메뉴를 동적으로 생성한다.
 * ★ Parameter   : dsObj (바인드된 dataset)
 *                  e GridMouseEventInfo
                    clickEvent 메뉴를 눌렀을때 발생시킬 함수
/******************************************************************************/

function esm_fn_SetPopUpMenu(dsObj:Dataset, e:GridMouseEventInfo, clickEvent:Function)

{

    // 기존에 GridPopMenu id로 등록된 값이 있을 경우 remove 시킨다.

    if(this.all["esmPopMenu"]) {

        this.removeChild("esmPopMenu");

    }

    

    // 팝업메뉴 객체 생성 및 초기화(id, size)

    var popupMenu = new PopupMenu("esmPopMenu", 0, 0 ,0 ,0);

 

    popupMenu.innerdataset = dsObj;

    popupMenu.captioncolumn = "name";

    popupMenu.idcolumn = "id";

    popupMenu.levelcolumn = "lev";

    popupMenu.enablecolumn = "enable";

 

    this.addChild("esmPopMenu", popupMenu);

 

    popupMenu.onmenuclick.setHandler(clickEvent);

    popupMenu.show();

    popupMenu.trackPopup(e.screenX , e.screenY);

}

 

function esm_fn_GridCopyKeyEvent(gridObj:Grid, e:KeyEventInfo, enterFlag){

    var reBool = false;

    enterFlag = gfn_IsNull(enterFlag) ? "key" : enterFlag;

 

    if(e.keycode == 46 || (e.ctrlKey && (e.keycode == "67" || e.keycode == "86")))

    { gridObj.autoenter = "none"; }

    

    if(e.keycode == 46){

        reBool = true;

        esm_fn_DelGridArea(gridObj);

    }

    

    if(e.ctrlKey) {

        if(e.keycode == 67) {

            reBool = true;

            esm_fn_GridCopyVal(gridObj);

        }else if(e.keycode == 86){

            reBool = true;

            esm_fn_GridPasteVal(gridObj);   

        }

    }

 

    gridObj.autoenter = enterFlag;

    return reBool;

}

 

function esm_fn_DelGridArea(gridObj:Grid){

    if(gridObj.selecttype == "row"){ return; }

    var colId;

    var editType;

    var objDs = eval(gridObj.binddataset);

    

    var sRow = toNumber(gridObj.selectstartrow);

    var eRow = toNumber(gridObj.selectendrow);

    var sCol = toNumber(gridObj.selectstartcol);

    var eCol = toNumber(gridObj.selectendcol);

    

    for (var i = sRow; i <= eRow; i++)

    {

        for (var z = sCol; z <= eCol; z++)

        {

            /* ------------------------------------------------------

                삭제 항목에서 제외되는 경우

                    1) edittype이 null, none일 경우

                    2) 컬럼이 숨겨져 있을 경우(size <= 0 )

                    3) 공종(Title)

                    4) 표준내역중  내역명, 규격명, 단위명

            --------------------------------------------------------- */            

            editType = gridObj.getCellProperty("Body", z, "edittype");

            

            if(gfn_IsNull(editType) || editType == "none")                        { continue; }

          //if(!gfn_IsNull(objDs.getColumn(i, "title")))                          { continue; } 

            if(toNumber(gridObj.getFormatColProperty(z, "size")) <= 0)            { continue; }

            

            colId    = gridObj.getCellProperty("Body", z, "text").replace("bind:", "");

            

            if(!gfn_IsNull(objDs.getColumn(i, "brkdnCd"))){

                if(gfn_IsNull(colId))                                             { continue; }

                if(colId == "brkdnNm" || colId == "normNm" || colId == "unitNm")  { continue; }

            }

            

            objDs.setColumn(i, colId, "");

        }

    }

}

 

function fn_GetSelectCk(sRow, eRow, sCol, eCol){

    if(sRow <= -1 || eRow <= -1 || sCol <= -1 || eCol <= -1){ return false; }

    return true;

}

 

/******************************************************************************/
/**   grid value copy         
 * ★ Function    : esm_fn_GridCopyVal
 * ★ 설명        : 그리드에서 영역을 선택하여 복사한다.
 * ★ Parameter   : gridObj (그리드)
 *                  dstObj (바인드된 dataset)                    
/******************************************************************************/

function esm_fn_GridCopyVal(gridObj:Grid){

    if(gridObj.selecttype != "area") return;    

    // 임시 데이터셋에 넣을 값을 포멧형식에 맞쳐서 넣는 변수...

    var sVal;

    var result = "";   

    var sRow = toNumber(gridObj.selectstartrow);

    var eRow = toNumber(gridObj.selectendrow);

    var sCol = toNumber(gridObj.selectstartcol);

    var eCol = toNumber(gridObj.selectendcol);

    

    if(!fn_GetSelectCk(sRow, eRow, sCol, eCol)) return false;

    

    for (var i = sRow; i<=eRow; i++) {

        for (var z = sCol; z<=eCol; z++) {

            // 항목 보기 이벤트가발생할 경우 건너띄워야 한다.

            if(toNumber(gridObj.getFormatColProperty(z, "size")) > 0){

                if(gridObj.getCellProperty("Body", z, "edittype") == "combo")

                { result += esm_fn_GetDataCode("date", gridObj, z, gridObj.getCellValue(i,z)); }

                

                else

                { result += gridObj.getCellValue(i,z); }                

                

                if(z < gridObj.selectendcol) result += GRID_VAL_DIV;

            }

        }

        if (i < gridObj.selectendrow) {

            result += "\r\n";

        }

    }

    result += "\r\n";

    

    //20120927권창진(past시 누락되서 삭제) result = result.trimRight("\r\n");

    

    // 복사 전 이전에 사용된 clipboard 내용을 지운다.

    system.clearClipboard();

    //CF_CSV 타입으로 저장한다.

    system.setClipboard(CLIPBOARD_TYPE, result);

}

 

/******************************************************************************/
/**   grid value paste         
 * ★ Function    : esm_fn_tempDatasetCreate
 * ★ 설명        : 복사된 값을 임시 데이터셋에 저장한다.
/******************************************************************************/

function esm_fn_tempDatasetCreate(){

    // 임시 데이터 셋을 생성한다.

    var dsObj = new Dataset();

    

    //임시 데이터셋 삭제 후 추가

    if(this.all["ds_tempHWM"])

    { this.removeChild("ds_tempHWM"); }

    this.addChild("ds_tempHWM", dsObj);

 

    var sVal;

    var arrCol;

    var nRow = 0;

    var copyVal = system.getClipboard(CLIPBOARD_TYPE);

    

    if(copyVal == null)

    { return false; }

    

    copyVal = new String(copyVal);

    copyVal = copyVal.split("\r\n");

    

    var max = (copyVal.length == 1) ? copyVal.length : copyVal.length - 1;

 

    // 한줄이 하나의 row가 되므로 \n를 기준으로 row를 나눈다.

    for(var i = 0; i < max; i ++){

        // ','를 기점으로 column(temp_col + index)를 생성하고 값을 저장한다.

        arrCol = copyVal[i].split(GRID_VAL_DIV);

        for(var z = 0; z < arrCol.length; z++){

            // 컬럼 추가는 첫번째 row가 생성될 때에만 생성된다.

            if(i == 0){ dsObj.addColumn("tempCol" + eval(z),"String"); }

            

            // row는 한줄이 생성될 때에만 생성된다.

            // 마지막 컬럼값에 스페이스 영역이 들어와(test결과) trim를 사용

            if(z == 0){ nRow = dsObj.addRow(); }

 

            arrCol[z] = arrCol[z].trim();

            arrCol[z] = (arrCol[z] == "undefined") ? "" : arrCol[z];

            arrCol[z] = arrCol[z].replace("\"", "");

 

            dsObj.setColumn(nRow, "tempCol" + eval(z), arrCol[z]);

        }

    }

    ds_tempHWM.name = "tempDS";

    //trace(dsObj.saveXML());

    return true;

}

 

/******************************************************************************/
/**   grid value paste         
 * ★ Function    : esm_fn_GridPasteVal
 * ★ 설명        : 복사된 값을 붙여넣는다.
 * ★ Parameter   : gridObj (그리드)
 *                  dstObj (바인드된 dataset)      
                    setPasteFunc (붙여넣기 할 함수 - 개발자 부분)
/******************************************************************************/

function esm_fn_GridPasteVal(gridObj:Grid, preFunc){

    if(gridObj.selecttype != "area") return;

    // 임시 테이타셋에 저장한다.

    if(!esm_fn_tempDatasetCreate()) return false;

    

    var dsObj = gridObj.binddataset;

        dsObj = gfn_IsNull(dsObj) ? "noDataset" : eval(dsObj);

    

    if(dsObj == "noDataset"){

        if (gsLocale == LANG_MODE_KR) {    // 한글모드

            gfn_Alert("그리드의 Bind된 Dataset이 존재 하지 않습니다.");

        } else {

            gfn_Alert("There is not a dataset to be bound to the grid.");

        }

        

        return false;

    };

    

    // 임시 테이타셋을 변수에 넣고 정보를 삭제한다.

    var tempDS = ds_tempHWM;

    if(this.all["ds_tempHWM"]){

        this.removeChild("ds_tempHWM");

    }

 

    var flag;

    var arrCol;

    var colInfo;

    var sRow = toNumber(gridObj.selectstartrow);

    var eRow = toNumber(gridObj.selectendrow);

    var sCol = toNumber(gridObj.selectstartcol);

    var eCol = toNumber(gridObj.selectendcol);

    

    if(!fn_GetSelectCk(sRow, eRow, sCol, eCol)) return false;

        

    if(tempDS.getRowCount() == 1 && tempDS.getColCount() == 1){

        flag = "oneRow";

        colInfo = esm_fn_GetArrColID(gridObj, sCol, eCol, flag);

    }

    else if(tempDS.getRowCount() >= 1){

        flag = "moreRow";

        colInfo = esm_fn_GetArrColID(gridObj, sCol, tempDS.getColCount(), flag);

    }

 

    arrCol      = colInfo.getColId;

    arrColIndex = colInfo.getColIndex;

 

    if(flag == "moreRow")

    {

        for(var i = 0; i < tempDS.getRowCount(); i++){

            for(var z = 0; z < arrCol.length; z++){

                if(arrCol[z] == "_noCol") continue;

                if(!gfn_IsNull(preFunc))

                { if(!eval(preFunc(dsObj, arrCol[z], sRow, tempDS.getColumn(i, z)))) continue; }

                

                esm_fn_SetPasteData(gridObj, tempDS, dsObj, arrCol[z], arrColIndex[z], i, z, sRow);

            }

            sRow++;

        }

    }

    else

    {

        while(true){

            if(sRow > eRow) break;

            for(var i = 0; i < arrCol.length; i++){

            

                if(arrCol[i] == "_noCol") continue;

                if(!gfn_IsNull(preFunc))

                { if(!eval(preFunc(dsObj, arrCol[i], sRow, tempDS.getColumn(0, 0)))) continue; }

                

                esm_fn_SetPasteData(gridObj, tempDS, dsObj, arrCol[i], arrColIndex[i], 0, 0, sRow);

                

            }

            sRow++;

        }

    }

}

 

function esm_fn_SetNumberVal(nVal){

    var sCharAt;

    var resultVal = "";

 

    for(var i = 0; i < nVal.length; i++){

        sCharAt = toNumber( gfn_CharAt(nVal, i) );

 

        if(gfn_IsNumber(sCharAt) && !isNaN(sCharAt))

        { resultVal += sCharAt; }

    }

    

    return resultVal;

}

 

function esm_fn_SetPasteData(gridObj, tempDS, dsObj, colId, colIndex, tempDsRow, tempDsCol, nRow, endFlag){

    var nVal = tempDS.getColumn(tempDsRow, tempDsCol);

    

    if(dsObj.getColumnInfo(colId).type != "STRING"){

        nVal = nVal.replace(",", "");

 

        if(!gfn_IsNumber(nVal))

        { nVal = esm_fn_SetNumberVal(nVal); }

 

        tempDS.setColumn(tempDsRow, tempDsCol, nVal);

    }

    

    if(gridObj.getCellProperty("Body", colIndex, "edittype") == "combo"){

        nVal = tempDS.getColumn(tempDsRow, tempDsCol);

        nVal = esm_fn_GetDataCode("code", gridObj, colIndex, nVal);

        tempDS.setColumn(tempDsRow, tempDsCol, nVal);

    }

    

    dsObj.rowposition = nRow;

    dsObj.setColumn(nRow, colId, tempDS.getColumn(tempDsRow, tempDsCol));

    

    if(gridObj.getCellProperty("Body", colIndex, "edittype") == "combo"){

        nVal = tempDS.getColumn(tempDsRow, tempDsCol);

        nVal = esm_fn_GetDataCode("data", gridObj, colIndex, nVal);

        tempDS.setColumn(tempDsRow, tempDsCol, nVal);

    }   

}

 

function esm_fn_GetDataCode(flag, grdiObj:Grid, colIndex, sData){

    var rtnVal;

    var vDs  = eval(grdiObj.getCellProperty("Body", colIndex, "combodataset"));

    var code = grdiObj.getCellProperty("Body", colIndex, "combocodecol");

    var data = grdiObj.getCellProperty("Body", colIndex, "combodatacol");

    

    if(gfn_IsNull(vDs) || gfn_IsNull(code) || gfn_IsNull(data)) return null;

    

    if(flag == "code")

    { rtnVal = vDs.lookup(data, sData, code); }

    else

    { rtnVal = vDs.lookup(code, sData, data); }

    

    return gfn_IsNull(rtnVal) ? null : rtnVal;

}

 

//시작 컬럼부터 Dataset의 컬럼명을 가져 온다.

function esm_fn_GetArrColID(grdObj:Grid, nStartCol, nTotCol, flag)

{

    var totCol;

    var index = 0;  

    var colInfo = new Object();

    var result  = new Array();

    var result2 = new Array();

 

    if(flag == "moreRow") totCol = nTotCol;

    else{ totCol = nTotCol - nStartCol + 1; }                 

 

    for(var i = 0; i < totCol; i++){

        if(grdObj.getFormatColProperty(nStartCol, "size") > 0){

            if( grdObj.getCellProperty("Body", nStartCol, "edittype") == "none"

                || gfn_IsNull(grdObj.getCellProperty("Body", nStartCol, "edittype")))

            { result[index] = "_noCol"; }

            else

            { result[index] = grdObj.getCellProperty("Body", nStartCol, "text").replace("bind:", ""); }

            

            result2[index] = nStartCol;

            

            index++;

        }else{ i--; }

        nStartCol++;

        if(nStartCol >= grdObj.getFormatColCount()){ break; }

    }

    

    colInfo.getColId = result;

    colInfo.getColIndex = result2;

    

    return colInfo;

}

 

/******************************************************************************
 * ★ Function명 : esm_fn_grdCopyPaste
 * ★ 설명       : Grid에서 클립보드 Data Ctrl+C(복사), Ctrl+V(붙여넣기) 기능 처리
 * ★ Parameter
 *     1. poGrid: 대상 Grid
 *     2. psKey : KeyEventInfo (Keydown시 입력된 값)
 * ★ Return     : 없음
    - 스크립트 예)  esm_fn_grdCopyPaste(obj, e);
 ******************************************************************************/

function esm_fn_grdCopyPaste(poGrid:Grid, psKey:KeyEventInfo)

{

    var obj = poGrid;

    var e = psKey;

 

    if(e.ctrlKey) {

 

        if(e.keycode == 67) {       // Ctrl + C (복사)

            //Grid Binddataset

            var sGrdDsNm = obj.binddataset;

            var v_clip = "";

            var sSeperate = "   ";

            for (var i=obj.selectstartrow;i<=obj.selectendrow;i++) {

                for (var j=obj.selectstartcol;j<=obj.selectendcol;j++) {

                    if (j < obj.selectendcol) {

                        v_clip += obj.getCellValue(i,j) + sSeperate;

                    } else {

                        v_clip += obj.getCellValue(i,j);

                    }

                }

                if (i < obj.selectendrow) {

                    v_clip += "\r\n";

                }

            }

            v_clip += "\r\n";

            system.clearClipboard();

            system.setClipboard("CF_TEXT",v_clip);  

 

        } else if(e.keycode == 86) {      // Ctrl + V (붙여넣기)

 

            var bAddrow = true;

            if (!gfn_IsNull(esm_fn_grdCopyPaste.arguments[2])) {

                bAddrow = esm_fn_grdCopyPaste.arguments[2];

            }

            //Grid Binddataset

            var sGrdDsNm = obj.binddataset;

            //cell count

            var nGrdCellCnt = obj.getCellCount("body");

            //cell position

            var nGrdCellPos = obj.getCellPos();         

            //row position

            var nRowPos = eval(sGrdDsNm).rowposition;

            //aText2 index

            var k = 0;

            //Dataset rowcount

            var nDsRowCnt = eval(sGrdDsNm).getRowCount();

            

            var t_clip = system.getClipboard("CF_UNICODETEXT");

            var sText = new String(t_clip);

            var aText = new Array();

            var aText2 = new Array();

            aText = sText.split("\r\n");

            if (nDsRowCnt < (aText.length + nRowPos -1)) {

                if (bAddrow) {

                    

                } else {

                    return false;

                }           

            }           

            //복사한 Row만큼

            for (var i=0;i<aText.length;i++) {

                if (gfn_IsNull(aText[i])) {

                    return;

                }

                aText2 = aText[i].split("   ");

 

                //기존 dataset갯수보다 많은 경우

                if ( nDsRowCnt <= nRowPos) {

                    var nAddrow = eval(sGrdDsNm).addRow();

                }

                

                var nLoopCnt = (nGrdCellPos + aText2.length);

                if (nLoopCnt > nGrdCellCnt) {

                    nLoopCnt = nGrdCellCnt;

                }

                //Dataset setcolumn

                for (var j=nGrdCellPos;j<nLoopCnt;j++) {    

                    obj.setCellPos(j);

                    obj.showEditor(true);

                    obj.setEditText(aText2[k]);

                    k++;

                    obj.showEditor(false);

                }               

                nRowPos++;

                eval(sGrdDsNm).rowposition = nRowPos;

                k = 0;

            }

            return true;

        }

    }

}

 

☞  

 

☞  

 
 
 
 

  

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

Nexacro.Grid - treeView  (0) 2017.01.28
Nexacro.Grid - excel exort  (0) 2017.01.28
Nexacro.Grid - Conents Editor  (0) 2017.01.28
Nexacro.Grid - all Checked 처리  (0) 2017.01.28
Nexacro.Grid - grid header  (0) 2017.01.28
Posted by 농부지기
,

[ Nexacro.Grid -  Conents Editor ]

 

/*==+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 * Group : 2. Conents Editor
 **=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/


/******************************************************************************************
 * 기능 : Grid에서 컬럼명에 해당하는 값을 찾아서 Retrun
 *         콤보에 보여주는 값도 얻을 수 있음
 * 인자 : objGrid - Grid 명
 *         nRow - row
 *         asColId - 찾을 컬럼명
 * 리턴 : Grid에서 보여주고 있는 Text 값
 * 예문 :
 *****************************************************************************************/

function gfn_GetCellText(objGrid, nRow, asColId){

        return objGrid.getCellText(nRow, gfn_GetColIndex(objGrid, asColId));

}

 

/******************************************************************************************
 * 기능 : 컬럼명(영문명)에 대한 Grid index 찾아서 Return
 * 인자 : objGrid - Grid 명
 *        asColNm - physical Column name
 *        
 * 리턴 : Grid컬럼명에 대한 index
 * 예문 :
 *****************************************************************************************/

function gfn_GetColIndex(objGrid, asColNm)

{

        var nCnt = objGrid.getCellCount("Body");

        var sCurColNm;

        

        for(var i=0; i < nCnt; i++){

                sCurColNm = objGrid.getCellProperty("Body", i, 'text');

                if ('bind:' + asColNm == sCurColNm) return i;

        }

        return '';

}

 

/******************************************************************************************
 * 기능 : Grid의 binding된 컬럼명 찾기
 * 인자 : objGrid - Grid 명
 *         asTextNm - Header title name
 * 리턴 :
 * 예문 : Grid header에 대한 index
 *****************************************************************************************/

function gfn_GetGridColumnId(objGrid, anCell)

{

        var sColId = objGrid.getCellProperty("Body", anCell, "text");

        

        return sColId.replace("bind:", "");

}

 

/******************************************************************************************
 * 기능 : Grid의 특정Cell에 focus 위치시키기
 * 인자 : objGrid - Grid 명
 *         pnRow   - 포커스 갈 Row
 *         psColId - 포커스 갈 컬럼명
 * 리턴 :
 * 예문 :
 *****************************************************************************************/

function gfn_SetGridFocus(objGrd, objDs, pnRow, psColId)

{

    objDs.rowposition = pnRow;  // 오류가 있는 라인으로 이동

    objGrd.setCellPos(objGrd.getBindCellIndex("Body",psColId));

    objGrd.setFocus();

}

 

 

/*******************************************************************************
  ★ 설명
      그리드 삭제 컬럼 전체 체크
  ******************************************************************************/

 function gf_gridDelChk(obj, cellNm, cellIdx)

 {

         var bindDs = eval(obj.binddataset);

         var sTitle, sValue;

         

        sTitle = obj.getCellProperty( "head", cellIdx, "text");

         //sTitle = obj.getCellText(-1, cellIdx);

         

        bindDs.enableevent = false;

         

        if( sTitle == "삭제" )

         {

                 sTitle = "삭제-All";

                 sValue = 1;

                 obj.setCellProperty( "head", cellIdx, "text", sTitle);

                 

                for(idx=0; idx<bindDs.rowcount; idx++)

                 {

                         if( bindDs.getRowType(idx)==Dataset.ROWTYPE_INSERT

                          || bindDs.getRowType(idx)==Dataset.ROWTYPE_UPDATE )

                         {

                                 continue;

                         }

                         bindDs.setColumn(idx,cellNm,sValue);

                 }

         }

         else

         {

                 sTitle = "삭제"

                 sValue = "0";

                 obj.setCellProperty( "head", cellIdx, "text", sTitle);

                 

                for(idx=0; idx<bindDs.rowcount; idx++)

                 {

                         if( bindDs.getRowType(idx)==Dataset.ROWTYPE_INSERT

                          || bindDs.getRowType(idx)==Dataset.ROWTYPE_UPDATE )

                         {

                                 ////trace("continue["+idx+"]::"+ bindDs.getRowType(idx));

                                 if(bindDs.getColumn(idx,cellIdx-1)=="수정" || bindDs.getColumn(idx,cellIdx-1)=="입력" )

                                 {

                                         continue;

                                 }

                         }

                         bindDs.setColumn(idx,cellNm,sValue);

                 }

         }

         

        bindDs.enableevent = true;                

}

 

/*******************************************************************************
  ★ 설명
      Grid Column Head Fix 하는 함수(Header Fix 컬러 변경)
  ★ parameter
    1. obj:Grid : Grid Object ( 예 : Grid00 )
     2. nCellIdx : Click Event Object ( Grid Col Index )
     
 ★ return
    - 성공 = true
     - 실패 = false
  ******************************************************************************/

function gf_gridColFix(obj:Grid, nCellIdx, sFixColor)

 {

 //trace( "gf_gridColFix["+nCellIdx+"/"+obj.getCellCount("Head")+"] ");

         var nCell;

         var sDefaultFixColor = "lightgrey";

         var sDefaultBgImage = "URL('img::img_GridPil.png')";

         

        for(nCell = 0; nCell <= nCellIdx; nCell++)

        {

                 //obj.setFormatColProperty(nCell,"fix","");

                 obj.setFormatColProperty(nCell,"band","");

                 

                if( obj.getFormatColProperty(nCell,"band") == "right" ) break;

                 

                var bgProp = ""+obj.getCellProperty("head",nCell,"background");

                 ////trace( "bgProp : " + obj.getCellProperty("head",nCell,"background") );

                 if( nCell <= nCellIdx )

                 {

                         ////trace( "nCell : " + nCell );

                         obj.setFormatColProperty(nCell,"band","left");

                         if(bgProp==null || bgProp=="")

                         {

                                 obj.setCellProperty("head",nCell,"background",sDefaultFixColor);

                         }

                         else if(sDefaultBgImage.indexOf(bgProp)!=-1 || sDefaultFixColor.indexOf(bgProp)!=-1)

                         {

                                 obj.setCellProperty("head",nCell,"background",sDefaultFixColor + " " + bgProp);

                         }

                         else

                         {

                                 ////trace("nCel/IdxnCell ["+nCellIdx+"/" + nCell +"]="+bgProp);

                                 obj.setCellProperty("head",nCell,"background",sDefaultFixColor);

                         }

                 }

                else

                 {

                         obj.setFormatColProperty(nCell,"band","body");

                         

                        if(bgProp==null || bgProp=="")

                         {

                                 obj.setCellProperty("head",nCell,"background","");

                        }

                         else if(bgProp.indexOf(sDefaultBgImage)!=-1)

                         {

                                 obj.setCellProperty("head",nCell,"background",obj.getCellProperty("head",nCell,"background"));

                        }

                         else

                         {

                                 obj.setCellProperty("head",nCell,"background","");

                         }                       

                }

                //trace("background["+nCell+"] ===========>"+obj.getCellProperty("head",nCell,"background"));

         }

 }

 

/*******************************************************************************
  ★ 설명
      Grid Column Head Fix 해제 하는 함수(Header Fix 컬러 변경)
  ★ parameter
    1. obj:Grid : Grid Object ( 예 : Grid00 )
    2. nCellIdx : Click Event Object ( Grid Col Index )
    3. nStartIdx : 기본 Fix Column Index
  ******************************************************************************/

function gf_gridColFixFree(obj:Grid, nCellIdx, nStartIdx)

 {

 //trace( "gf_gridColFixFree["+nCellIdx+"/"+nStartIdx+"] ");

         var nCell;

         var sDefaultFixColor = "lightgrey";

         var sDefaultBgImage = "URL('img::img_GridPil.png')";

         

        var nStart = obj.getCellCount("Head") - 1;

         

        //for(nCell = obj.getCellCount("Head"); nCell > 0 ; nCell--)

        for(nCell = nStart; nCell > nStartIdx ; nCell--)

        {

                 if( obj.getFormatColProperty(nCell,"band") == "right" || obj.getFormatColProperty(nCell,"band") == "body" )

                        continue;

 

                //gridObj.setFormatColProperty(nCell-1,"fix","");

                 obj.setFormatColProperty(nCell,"band","body");

 

                var bgProp = ""+obj.getCellProperty("head",nCell,"background");

                 

                //trace( "["+nCell+"/"+bgProp.indexOf(sDefaultBgImage)+"] "+sDefaultBgImage+"   // bgProp = " + obj.getCellProperty("head",nCell,"background") );

                 if(bgProp==null || bgProp=="")

                 {

                         obj.setCellProperty("head",nCell,"background","");

                 }

                 else if(bgProp.indexOf("URL")!=-1)

                 {

                        obj.setCellProperty("head",nCell,"background",sDefaultBgImage);

                 }

                 else

                 {

                         obj.setCellProperty("head",nCell,"background","");

                 }       

                //trace("background["+nCell+"/"+nStartIdx+"] =========== "+obj.getCellProperty("head",nCell,"background"));

         }

        

}

☞  

 

☞  

 
 
 
 

  

 

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

Nexacro.Grid - treeView  (0) 2017.01.28
Nexacro.Grid - excel exort  (0) 2017.01.28
Nexacro.Grid - copy & paste  (0) 2017.01.28
Nexacro.Grid - all Checked 처리  (0) 2017.01.28
Nexacro.Grid - grid header  (0) 2017.01.28
Posted by 농부지기
,

[ Nexacro.Grid -  all Checked 처리 ]

 

 

                  [  ◎ Grid에서 전체 CheckBox클릭 시 모두 Check처리 ]     


/******************************************************************************************
 * 기능 : 그리드 헤드 클릭시 전체체크
 *        전체ROW 체크시 해당ROW의 특정컬럼이 값이 특정값일 경우만 체크처리도 됨
 * 인자 : obj     : Grid Object
 *        e       : GridClickEventInfo
 *        asColId : 찾을 컬럼명
 *        psExpr  : 전체 체크시 제외되어야할 함수명 또는 표현식
 *        paColId : 컬럼배열목록
 * 리턴 : none
 * 예문 : gfn_SetGridCheckAll(obj, e, "USE_CNT==0 && ST_CD=='KC'", ["USE_CNT","ST_CD"]);
 *         USE_CNT 컬럼 값이 0일 이면서(AND) ST_CD값이 ='KC' 인 경우만 체크 한다.
 *
- 그리드 헤드 예) <Cell displaytype="checkbox" edittype="checkbox" text="expr:0"/> 로 해야함.
 *****************************************************************************************/

function gfn_SetGridCheckAll(obj:Grid, e:GridClickEventInfo, psExpr, paColId)
{
    
if (obj.readonly == true) return;
    
var strType;
    
var vl_chk;
    
var strVal;
    
var strChkVal;
    
var objDS;
    
var nCell  = gfn_getHeadToBodyCell(obj,e.cell);
    
var nSubCnt = obj.getSubCellCount("head",nCell);

    objDS  = eval(obj.binddataset);
    strChkVal = gfn_BlankStr(obj.getCellProperty("
body", nCell, "text"));
    strChkVal = strChkVal.replace("bind:", "");
 
    
if (nSubCnt > 0) // Merge한 셀이 있는 경우
    {
        var nChkIdx = -1;
        for (var i = 0; i < nSubCnt; i++) {
            strType = obj.getSubCellProperty("
head",e.cell,i,"displaytype");
 
            if (strType == "checkbox") {
                nChkIdx =  i;
                
break;
            }
        }
        
if (nChkIdx == -1)
            
return;
 
        // Head셋팅
        strVal = obj.getSubCellProperty("
head", nCell, nChkIdx, "text");
        
if (gfn_IsNull(strVal)) strVal = "0";
 
        
if (strVal == "0") {
            obj.setSubCellProperty("
head",nCell,nChkIdx,"text", '1');
            vl_chk="1";
        } else {
            obj.setSubCellProperty("
head",nCell,nChkIdx,"text", '0');
            vl_chk="0";
        }
 
    }
    else // Merge한 셀이 없는 경우
    {
        strType = obj.getCellProperty("
head", e.cell, "displaytype");
 
        
if (strType != "checkbox") {
            
return;
        }
 
        // Head셋팅
        strVal = obj.getCellProperty("
head", nCell, "text");
        
if (gfn_IsNull(strVal)) strVal = "0";
        
        
if (strVal == "0") {
            obj.setCellProperty("
head", nCell, "text", '1');
            vl_chk="1";
        } else {
            obj.setCellProperty("
head", nCell, "text", '0');
            vl_chk="0";
        }
    }
    
    // Body셋팅
    
for (var i=0; i< objDS.rowcount; i++) {
        
if (gfn_ExistVal(psExpr)){
            var chkExpr = psExpr;
            for(var kk=0; kk<paColId.length; kk++){
                var sValue = gfn_BlankStr(objDS.getColumn(i, paColId[kk]));
                chkExpr = chkExpr.replace(paColId[kk], sValue);
            }
            
if (eval(chkExpr)){
                objDS.setColumn(i, strChkVal, vl_chk);
            }
        }
else{
            objDS.setColumn(i, strChkVal, vl_chk);
        }  
    }
}

 

☞  

 
 

 

--  아래는 위 function에서 필요한  공통함수들 임 --

 

/*++

프로그램 설명     : 클릭한 그리드 헤드에서 cell 정보를 가져온다.

@ Name            : cfn_getHeadToBodyCell

@ Parameter       : oGrid : Grid Object

@ Parameter       : e     : GridClickEventInfo

@ Return          : Cell Index

*/

function gfn_getHeadToBodyCell(oGrid:Grid,nCell)

{

    var sBand ="body";

    var nBodyCell  = oGrid.getCellProperty("head",nCell,"col");

    var nHeadRow   = oGrid.getCellProperty("head",nCell,"row");

    var nCellCount = oGrid.getCellCount(sBand);

    var nColCount  = oGrid.getFormatColCount();

    

    if (nHeadRow > 0 && nCellCount > nColCount) {

        return nCell;

    }

    

    for (var nCellIdx = 0; nCellIdx <nCellCount; nCellIdx++) {

        if (nBodyCell == oGrid.getCellProperty(sBand,nCellIdx,"col")) {

            nBodyCell = nCellIdx;

            break;

        }

    }

 

    return nBodyCell;

}

 

 

 

 

/////////////////////////////////////////////////////////////////

// method name  : cfn_BlankStr

// description  : 값이 존재하는지 여부 체크

// parameter    : oParam (object나 문자열)

// return       : undefined이면 ""(널 스트링)

// example      :

/////////////////////////////////////////////////////////////////

function cfn_BlankStr(oParam) {

 

    var strParam = new String(oParam);

    if(strParam.valueOf() == "undefined") {

        return "";

    }

 

    return oParam;

}

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

Nexacro.Grid - treeView  (0) 2017.01.28
Nexacro.Grid - excel exort  (0) 2017.01.28
Nexacro.Grid - copy & paste  (0) 2017.01.28
Nexacro.Grid - Conents Editor  (0) 2017.01.28
Nexacro.Grid - grid header  (0) 2017.01.28
Posted by 농부지기
,

[ Nexacro.Grid -  grid header ]

 

/*==+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 * Group : 1. Grid Header 관련 함수
 * Group : 2. Conents Editor
 * Group : 3. Copy & Paste
 **=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

 

/*==+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 * Group : 1. Grid Header 관련 함수
 **=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

 


/******************************************************************************************
 * 기능 : Grid의 Head.이름에 해당하는 index 를 반환
 * 인자 : objGrid - Grid 명
 *         asTextNm - Header title name
 * 리턴 : Grid header에 대한 index
 * 예문 :
 *****************************************************************************************/

function gfn_GetHeadIndex(objGrid, asTextNm)

{

        var nCnt = objGrid.getCellCount("Head");

        var sCurTextNm;

        

        for(var i=0; i < nCnt; i++){

                sCurTextNm = objGrid.getCellProperty("Head", i, 'text');

                if (asTextNm == sCurTextNm) return i;

        }

        return '';

}

 

/******************************************************************************************
 * 기능 : Grid의 Head.이름에 해당하는 index 를 반환 (중간에만 있어도 해당 index 반환)
 * 인자 : objGrid - Grid 명
 *         asTextNm - Header title name
 * 리턴 : Grid header에 대한 index
 * 예문 :
 *****************************************************************************************/

function gfn_GetHeadIndexLike(objGrid, asTextNm)

{

        var nCnt = objGrid.getCellCount("Head");

        var nLastIdx;

 

        for(var i=0; i < nCnt; i++){

                sCurTextNm = objGrid.getCellProperty("Head", i, 'text');

                

                if ( sCurTextNm.indexOf(asTextNm) >=0  ) return i;

        }

        return '';

}


/*******************************************************************************
 ★ 설명
     Grid Sorting하는 함수(Header Sorting여부 표시 포함)
 ★ parameter
    1. obj:Grid : Grid Object ( 예 : Grid00 )
    2. e:GridClickEventInfo : Click Event Object ( Grid Onclick Envent의 Argument e )
    3. ASC_MARK : Ascending Mark (옵션 : Default = "▼")( 예 : "▼" )
    4. DESC_MARK : Descending Mark (옵션 : Default = "▲")( 예 : "▲" )
    5. sSortMark    : Sorting 강제 지정 (옵션 : Default = "" ==> 상태에 따라 알아서 함)
                      (예 : ASC_MARK 또는 DESC_MARK 지정 )
 ★ return
    - 성공 = true
    - 실패 = false
 ******************************************************************************/

function GridSort(obj:Grid, e:GridClickEventInfo, ASC_MARK, DESC_MARK, sSortMark)

{

 if( fn_IsNull(obj) || fn_IsNull(e) ) return false;

 

 // 컬럼의 정렬방식을 'head'의 text에 "↑,↓"여부로 판단.

 // 이미지로 대체 가능.

 var bindDs = eval(obj.binddataset);

 var i, cell_cnt;

 

 if (bindDs.rowcount == 0) return false;

 if( fn_IsNull(ASC_MARK) )  ASC_MARK = "▼";

 if( fn_IsNull(DESC_MARK) )  DESC_MARK = "▲";

 

 cell_cnt = obj.getCellCount("head");

 var BodyColId = (obj.getCellProperty("body", e.col,"text")).toString().split(":"); // e.col : 바인드된 컬럼.

                     

 for( i = 0 ; i < cell_cnt ; i++ )

 {

  if(obj.getCellText(-1, i)=="undefined")

   continue;

  

  var strHeadText = obj.getCellText(-1, i);

 

  if(i==e.cell)

  {

   if(strHeadText.substr(strHeadText.length-1) == ASC_MARK)

   {

    if( fn_IsNull(sSortMark) || sSortMark == DESC_MARK )

    {

     obj.setCellProperty( "head", i, "text", strHeadText.substr(0, strHeadText.length - 1)+DESC_MARK);

     bindDs.keystring = "S:-"+BodyColId[1];

    }

   }

   else if (strHeadText.substr(strHeadText.length-1) == DESC_MARK)

   {

    if( fn_IsNull(sSortMark) || sSortMark == ASC_MARK )

    {

     obj.setCellProperty( "head", i, "text", strHeadText.substr(0, strHeadText.length - 1)+ASC_MARK);

     bindDs.keystring = "S:+"+BodyColId[1];

    }

   }

   else

   {

    var def_mark;

    if( fn_IsNull(sSortMark) ) def_mark = ASC_MARK;

    else     def_mark = sSortMark;

     

    obj.setCellProperty( "head", i, "text", strHeadText+def_mark);

    if( def_mark == ASC_MARK )

     bindDs.keystring = "S:+"+BodyColId[1];

    else

     bindDs.keystring = "S:-"+BodyColId[1];

   }

  }

  else // 정렬표시 삭제

  {

   if (strHeadText.substr(strHeadText.length-1) == ASC_MARK || strHeadText.substr(strHeadText.length-1) == DESC_MARK)

   {

    obj.setCellProperty( "head", i, "text", strHeadText.substr(0, strHeadText.length - 1));

   }

  }

 }

 return true;

}

/******************************************************************************
  * Function명 : gf_gridCheckAll
  * 설명       : 그리드에서 특정 컬럼의 체크박스를 모두 체크하거나 체크 해제
  * Params     : gridObj       - Grid
  *              cellNm        - 해당 cell의 Bind된 Dataset 컬럼명
  *              cellIdx       - cell index
  * Return     :
  ******************************************************************************/

 function gf_gridCheckAll(gridObj:Grid, cellNm, cellIdx)

 {

         var edittype = gridObj.getCellProperty( "head", cellIdx, "edittype");

         

        if (edittype != "checkbox") return;

         

        var bindDs = eval(gridObj.binddataset);

         var checkValue = gridObj.getCellProperty( "head", cellIdx, "text");

         

        if (gf_isNull(checkValue)) checkValue = 0;

         

        checkValue = (checkValue == 0)  1 : 0;

 

        gridObj.setCellProperty( "head", cellIdx, "text", checkValue);

         

        for(var idx=0; idx<bindDs.rowcount; idx++)

         {

                 if( bindDs.getRowType(idx) == Dataset.ROWTYPE_DELETE ) continue;

                 bindDs.setColumn(idx, cellNm, ((checkValue == 0)  0 : 1));

        }

 }

 

☞  

 
 
 
 

  

 

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

Nexacro.Grid - treeView  (0) 2017.01.28
Nexacro.Grid - excel exort  (0) 2017.01.28
Nexacro.Grid - copy & paste  (0) 2017.01.28
Nexacro.Grid - Conents Editor  (0) 2017.01.28
Nexacro.Grid - all Checked 처리  (0) 2017.01.28
Posted by 농부지기
,

[ Nexacro.Dataset -  개별 validation ]

 

 

/*==+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 * Group : 2. 각 개별적으로 호출되는 validation 검사
 **=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

/******************************************************************************************
 * 기능 : 값이 NULL인지 검사
 * 인자 : val - 검사하고 싶은 값
 * 리턴 : true / false
 * 예문 :
 *****************************************************************************************/

function gfn_IsNull(val)

{

    var sVal = new String(val);

    

    if (sVal == null || sVal == "NaN" || sVal == "null" || sVal.trim().length <= 0 || escape(sVal) == "undefined"){

        return true;

    }else{

        return false;

    }

}

 

/******************************************************************************************
 * 기능 : 값이 존재하는지 체크
 * 인자 : val - 검사하고 싶은 값
 * 리턴 : true / false
 * 예문 :
 *****************************************************************************************/

 function gfn_IsExist(val)

{

    if (gfn_IsNull(val)){

        return false;

    }else{

        return true;

    }

}

 

/******************************************************************************************
 * 기능 : 값이 존재하는지 여부 체크 (zero도 null 로 판단)
 * 인자 : val : null 을 검증해야 될 값
 * 리턴 : true / false
 * 예문 :
 *****************************************************************************************/

function gfn_IsNullZero(val)

{

    var sVal = new String(val);

    sVal = sVal.trim();

    

    if(gfn_IsNull(val) == true || sVal == "0" || sVal == "0.0" || sVal == "0.00" || sVal == "0.000"){

        return true;

    }else{

        return false;

    }

}

 

/******************************************************************************************

 * 기능 : 그룹별 SUM 구하여 검사하고 싶은 MAX값보다 크면 해당 ROW를 RETURN

 * 인자 : objDs       - 검사할 dataset

 *         psGrpCol   - Group을 묶어서 검사할 컬럼 리스트

 *         psSumCol   - 합계용 컬럼

 *         pnMinValue  - 최소값

 *         pnMaxValue - 최대값

 * 리턴 : -1           : 정상

 *         0보다 크면 : 해당 오류 ROW임

 * 예문 : gfn_bpCheckGroupSum(dsExceptShop, "SHOP_CD,IMP_CD", "CLASS_RATT", 100, 100);

 *         "SHOP_CD,IMP_CD" 2개의 컬럼 그룹별로  SUM(CLASS_RATT:율) 합이 : 최소100, 최대100 이여야 함.

 *****************************************************************************************/

function gfn_CheckGroupSum(objDs, psGrpCol, psSumCol, pnMinValue, pnMaxValue){

    var arrGrpCol = psGrpCol.split(",");

    var sFindExpr, nFindRow, nSumValue;

    

    pnMinValue = toNumber(pnMinValue);

    pnMaxValue = toNumber(pnMaxValue);

    

    for(var nRow=0; nRow < objDs.getRowCount(); nRow++){

        

        sFindExpr = "";

        for(var ii=0; ii<arrGrpCol.length; ii++){

            if (ii==0)

                sFindExpr += arrGrpCol[ii] + "=='" + objDs.getColumn(nRow, arrGrpCol[ii]) + "'";

            else

                sFindExpr += " && " + arrGrpCol[ii] + "=='" + objDs.getColumn(nRow, arrGrpCol[ii]) + "'";

        }

 

        nSumValue = 0;

        nFindRow  = -1;

        do{

            nFindRow = objDs.findRowExpr(sFindExpr, nFindRow + 1);

            if (nFindRow < 0) break;

            

            nSumValue += toNumber(objDs.getColumn(nFindRow, psSumCol));

            

        }while(true);

        if (pnMinValue > nSumValue || nSumValue > pnMaxValue){

            return nRow;

        }

    }

    

    return -1;

}

 

/******************************************************************************************
 * 기능 : 여러개의 레코드에서 연속된 FROM~TO 일자가 존재 할 경우 검사
 * 인자 : objDs        - 검사할 dataset
 *         psGrpCol     - 그룹으로 묶을 컬럼목록
 *         psDtFormat   - 시작~종료가 년, 년월, 년월 구분값(YEAR, YM, YMD)
 *         psContYn     - 위라인 종료일자와 현재라인 시작일자간 계속연결여부
 *                        (Y - 날자가 계속 연결되어야 됨.      (위 라인.종료일자+1 = 현재라인.시작일자  이면 정상)
 *                         N - 날자가 계속 연결되지 않아다 됨. (위 라인.종료일자   < 현재라인.시작일자  이면 정상)
 * 리턴 : -1           : 정상
 *         0보다 크면 : 해당 오류 ROW임
 * 예문 :
 * 화면컬럼 : 부서, 매장, 판매방법, 시작일자 ,  종료일자
 *             A001 , 111  , 1        , 2013.01.01,  2013.06.01
 *             A001 , 111  , 1        , 2013.06.02,  2013.08.01
 *             A001 , 111  , 1        , 2013.08.01,  2014.01.15   <--이부분에서 오류 처리.  시작일자 2013.08.01은 위쪽 시작~종료일자에 포함 되므로.
 *             B001 , 111  , 1        , 2013.01.01,  2013.06.01
 *
 * 필수처리 : 시작~종료일자는 반드시 필수 이면서,  일자검사(년, 년월, 년월일,  최소값, 최대값)는 마친 후에 호출 해야 됨
 *****************************************************************************************/

function gfn_CheckGroupFromToDate(objDs, psGrpCol, psDateCol, psDtFormat, psContYn){

    var nRowCnt = objDs.rowcount;

    if (nRowCnt == 0) return -1;

 

    psDtFormat = psDtFormat.toUpperCase();

    var aGrpCol  = psGrpCol.split(',');

    var aDateCol = psDateCol.split(',');

    var sFromDt, sToDt, sNextDt;

    

    // 1. 컬럼 그룹별, 날짜별로 정렬

    var sKeyString = "S:";

    for(var ii=0; ii<aGrpCol.length; ii++){

        sKeyString = sKeyString + "+" + aGrpCol[ii];

    }

    for(var ii=0; ii<aDateCol.length; ii++){

        sKeyString = sKeyString + "+" + aDateCol[ii];

    }

    objDs.keystring = sKeyString;

    

    //------------------------------------------------------------------

    // 3. 이전ROW와 현재 ROW간에 일자 검사 (0 row는 skip)

    //------------------------------------------------------------------

    var bSame;

    for(var nRow=1; nRow<nRowCnt; nRow++){

        // a. 위쪽ROW와 현재ROW간에 그룹컬럼값들이 동일하지 검사

        //    --동일하면 : 위쪽ROW.종료일자 와 현재ROW.시작일자간 검사

        bSame = true;

        for(var ii=0; ii<aGrpCol.length; ii++){

            if (objDs.getColumn(nRow-1, aGrpCol[ii]) != objDs.getColumn(nRow, aGrpCol[ii])){

                bSame = false;

                break;

            }

        }

        if (bSame == false) continue;

 

        

        // b. 현재 ROW에 대한 시작일자 < 종료일자 검사

        sFromDt = objDs.getColumn(nRow, aDateCol[0]);

        sToDt   = objDs.getColumn(nRow, aDateCol[1]);

        if (sFromDt > sToDt){

            alert("시작일자가 종료일자보다 더 클 수 없습니다.");

            return nRow;

        }

        

        // c. 위쪽ROW와 현재ROW간에 그룹컬럼값들이 동일하므로 검사

        sToDt   = objDs.getColumn(nRow-1, aDateCol[1]);

        sFromDt = objDs.getColumn(nRow  , aDateCol[0]);

        

        if (psDtFormat == "YEAR"){

            sNextDt = (toNumber(sToDt) + 1).toString();

        }else if(psDtFormat == "YM"){

            sNextDt = gfn_AddMonth(sToDt, 1);

        }else if(psDtFormat == "YMD"){

            sNextDt = gfn_AddDate(sToDt, 1);

        }

        

        if (psContYn == 'Y'){

            if (sNextDt != sFromDt){

                alert("종료일자와 시작일자가 연속으로 입력되지 않았습니다.");

                return nRow;

            }

        }else{

            if (sNextDt > sFromDt){

                alert("종료일자와 시작일자가 연속으로 입력되지 않았습니다..");

                return nRow;

            }

        }

    }

    return -1;

}

 

☞  

 

☞  

 
 
 
 

  

'Nexacro-Function > Dataset' 카테고리의 다른 글

Nexacro.Dataset - ds validation2  (0) 2017.01.28
Nexacro.Dataset - ds validation1  (0) 2017.01.28
Nexacro.Dataset - 숫자 계산처리  (0) 2017.01.28
Nexacro.Dataset - 한줄 추가.삭제  (0) 2017.01.28
Nexacro.Dataset - 복사(copy)  (0) 2017.01.28
Posted by 농부지기
,

[  ◎ Data Validation 종류 1  (물 회사) ]     

1. dataset 컬럼 및  체크 값

    - expr : 컬럼에 검사방법에 대한 사항을 입력


2. source

function fn_OnLoadInit()

{

      gfn_SetGridValidation(dsGridValidation, divDataArea.grdEvalList, dsTerm);  // 3. Grid validation 사용시 index를 사용

}

 

function fn_SaveValidate()

{

    // 1. 수정여부 검사

    if (gfn_CheckDsModified(dsEvalList) == false) return false;

    ...

    // 9. 검사

    if (gfn_ValidateGrid(dsGridValidation, divDataArea.grdEvalList) == false) return false;

    

    return true;

}

 

3. 참고

   1.  gfn_SetGridValidation 을 사용했던 이유는   gfn_ValidateGrid()함수가 grid의 index를 이용해서 했기 때문에

        차후 개발시 gfn_ValidateGrid()함수에서 컬럼값으로 처리하는 방법으로 수정 필요

 

 

/**

 * 프로그램 ID   : lib_validation.xjs

 * 프로그램명    : 필수값 검증 함수

 * 프로그램 설명 : 업무에서 공통으로 사용하는 필수값 검증 함수 정의

 * 작성자        : tobesoft

 * 작성일        : 2012.01.16

 *

 * =============================================================================

 * 변경이력    수정자    내    용

 * =============================================================================

 * 2012.01.16  tobesoft  최초작성

 *

 */

 

/******************************************************************************/

/**   Include                                                                 */

/******************************************************************************/

include "lib::lib_string.xjs";

include "lib::lib_date.xjs";

 

/******************************************************************************

 * ★ Function명 : gfn_Validate

 * ★ 설명       : 다건 필수값 검증 함수 - Dataset에 검증정보 포함

 *                 검증할 Row의 범위 지정시 pnStartRow, pnEndRow 지정

 * ★ Parameter  : 1. poDataset : 필수값 검증 데이타를 가지고 있는 Dataset

 *                 2. pnStartRow : 필수값 검증 Start Row

 *                 3. pnEndRow : 필수값 검증 End Row

 * ★ Return     : 없음

 ******************************************************************************/

function gfn_Validate(poDataset, pnStartRow, pnEndRow)

{

    if (gfn_IsNull(pnStartRow)) pnStartRow = 0;

    if (gfn_IsNull(pnEndRow)) {

        pnEndRow = poDataset.rowcount;

    } else {

        pnEndRow = pnEndRow + 1;

    }

    

    for (var nRow = pnStartRow; nRow < pnEndRow; nRow++) {

        var sPath = poDataset.getColumn(nRow, "path");

        var sComp = poDataset.getColumn(nRow, "component");

        var sTermCode = poDataset.getColumn(nRow, "termCode");

        var sExpr = poDataset.getColumn(nRow, "expr");

        var oComp;

        

        if (gfn_IsNull(sPath))

            oComp = eval(sComp);

        else

            oComp = eval(sPath + "." + sComp);

        

        if (!gfn_IsNull(oComp)) {

            var bReturn = gfn_CheckValidData(gfn_GetLabel(sTermCode), sExpr, oComp.value);

            

            if (!bReturn) {

                if (sExpr.indexOf("function") == -1) {

                    oComp.setFocus();

                }

                return false;

            }

        }

    }

    

    return true;

}

 

/******************************************************************************

 * ★ Function명 : gfn_ValidateGrid

 * ★ 설명       : Grid 필수값 검증 함수 - Dataset에 검증정보 포함

 * ★ Parameter  : 1. poDataset : 필수값 검증정보를 가지고 있는 Dataset

 *                 2. poGrid : 필수값 검증할 Grid

 *                 3. pbCheckOnly : check한 Row만 대상으로 함(check Row의 colId는 "_chk"로 되어있어야 함)

 * ★ Return     : 없음

 ******************************************************************************/

function gfn_ValidateGrid(poDataset, poGrid, pbCheckOnly)

{

    if (gfn_IsNull(pbCheckOnly)) pbCheckOnly = false;

    

    var oBindDataset = eval(poGrid.binddataset);

    

    for (var nRow = 0; nRow < oBindDataset.rowcount; nRow++) {

        if (pbCheckOnly) {

            if (oBindDataset.getColumn(nRow, "_chk") != "1") {

                continue;

            }

        }

        

        for (var i = 0; i < poDataset.rowcount; i++) {

            var sTermCode = poDataset.getColumn(i, "termCode");

            var nIndex = poDataset.getColumn(i, "index");

            var sValue = poGrid.getCellValue(nRow, nIndex);

            var sExpr = poDataset.getColumn(i, "expr");

            

            var bReturn = gfn_CheckValidData(gfn_GetLabel(sTermCode), sExpr, sValue);

            

            if (!bReturn) {

                oBindDataset.rowposition = nRow;

                poGrid.setCellPos(nIndex);

                poGrid.showEditor(true);

                

                return false;

            }

        }

    }

    

    return true;

}

 

/******************************************************************************

 * ★ Function명 : gfn_CheckData

 * ★ 설명       : 필수값 검증 함수 및 gfn_Alert 호출

 * ★ Parameter  : 1. psTitle : 필수값 검증 대상 Title

 *                 2. psExpr : 필수값 검증 Expression

 *                 3. psValue : 필수값

 * ★ Return     : 없음

 ******************************************************************************/

function gfn_CheckValidData(psTitle, psExpr, psValue)

{

    if (gfn_IsNull(psTitle) || gfn_IsNull(psExpr)) {

        gfn_Alert("WRN00037", gfn_GetLabel("param"));

        return false;

    }

    

    var bReturn = true;

    var aExpr = psExpr.split(";");

    

    for (var i = 0; i < aExpr.length; i++) {

        if (!gfn_IsNull(aExpr[i])) {

            var aParam = aExpr[i].split("=");

            

            switch(aParam[0]) {

                case "required": //WRN00038/{0}은(는) 필수 입력 항목입니다.

                    if (gfn_IsNull(psValue)) {

                        bReturn = false;

                        gfn_Alert("WRN00038", psTitle);

                    } else { //checkbox 무조건 Check 해야 할때,required=true

                        if (aParam[1] == "true" && (psValue+"") != aParam[1]) {

                            bReturn = false;

                            gfn_Alert("WRN00038", psTitle);

                        }

                    }

                    break;

                case "length": //WRN00039/{0}은(는) {1}자리입니다.

                    if (!gfn_IsNull(psValue)) {

                        if (psValue.trim().length != parseInt(aParam[1])) {

                            bReturn = false;

                            gfn_Alert("WRN00039", [psTitle, aParam[1]]);

                        }

                    }

                    break;

                case "maxlength": //WRN00040/{0}의 최대 길이는 {1}자리입니다.

                    if (!gfn_IsNull(psValue)) {

                        if (gfn_GetLengthB(psValue) > parseInt(aParam[1])) {

                            bReturn = false;

                            gfn_Alert("WRN00040", [psTitle, aParam[1]]);

                        }

                    }

                    break;

                case "minlength": //WRN00041/{0}의 최소 길이는 {1}자리입니다.

                    if (!gfn_IsNull(psValue)) {

                        if (gfn_GetLengthB(psValue) < parseInt(aParam[1])) {

                            bReturn = false;

                            gfn_Alert("WRN00041", [psTitle, aParam[1]]);

                        }

                    }

                    break;

                case "min": //WRN00042/{0}값의 최소값은 {1}입니다.

                    if (parseFloat(psValue) < parseFloat(aParam[1])) {

                        bReturn = false;

                        gfn_Alert("WRN00042", [psTitle, aParam[1]]);

                    }

                    break;

                case "max": //WRN00043/{0}값의 최대값은 {1}입니다.

                    if (parseFloat(psValue) > parseFloat(aParam[1])) {

                        bReturn = false;

                        gfn_Alert("WRN00043", [psTitle, aParam[1]]);

                    }

                    break;

                case "digit": //WRN00044/{0}은(는) 숫자 입력 항목입니다.

                    if (!gfn_IsNull(psValue)) {

                        if (!gfn_IsNumber(psValue)) {

                            bReturn = false;

                            gfn_Alert("WRN00044", psTitle);

                        }

                    }

                    break;

                case "date": //WRN00046/{0}은(는) 날짜 입력 항목입니다.

                    if (!gfn_IsNull(psValue)) {

                        if (!gfn_IsDate(psValue)) {

                            bReturn = false;

                            gfn_Alert("WRN00046", psTitle);

                        }

                    }

                    break;

                case "dateym": //WRN00047/{0}은(는) 년월 입력 항목입니다.

                    if (!gfn_IsNull(psValue)) {

                        if (!gfn_IsDate(psValue + "01")) {

                            bReturn = false;

                            gfn_Alert("WRN00047", psTitle);

                        }

                    }

                    break;

                case "range": //WRN00051/{0}은(는) {1}사이의 값입니다.

                    if (!gfn_IsNull(psValue)) {

                        var aRange = aParam[1].split(",");

                        if (parseInt(psValue) < parseInt(aRange[0]) || parseInt(psValue) > parseInt(aRange[1])) {

                            bReturn = false;

                            gfn_Alert("WRN00051", [psTitle, aRange[0] + " ~ " + aRange[1]]);

                        }

                    }

                    break;

                case "code" : //WRN00051/{0}은(는) {1}사이의 값입니다.

                    if (!gfn_IsNull(psValue)) {

                        var aRange = aParam[1].split(",");

                        for (var i = 0; i < aRange.length; i++) {

                            if (psValue == aRange[i]) {

                                return true;

                            }

                        }

                        

                        bReturn = false;

                        gfn_Alert("WRN00051", [psTitle, aRange]);

                    }

                    break;

                case "declimit": //WRN00052/{0}길이는 소수점 {1}자리로 구성되어야 합니다.

                    if (!gfn_IsNull(psValue)) {

                        var nExistDot = psValue.indexOf(".");

                        if (nExistDot == -1) {

                            bReturn = false;

                            gfn_Alert("WRN00052", [psTitle, aParam[1]]);

                        } else {

                            var nDecLength = psValue.substr(nExistDot + 1, psValue.trim().length);

                            if (nDecLength.length != parseInt(aParam[1])) {

                                bReturn = false;

                                gfn_Alert("WRN00052", [psTitle, aParam[1]]);

                            }

                        }

                    }

                    break;

                case "function": //함수로 검증

                    bReturn = eval(aParam[1]);

                    break;

            }

        }

        

        if (!bReturn) break;

    }

    

    return bReturn;

}

 

/******************************************************************************

 * ★ Function명 : gfn_ValidateOnlyOne

 * ★ 설명       : 단건 필수값 검증 함수

 * ★ Parameter  : 1. poObject : 필수값 검증할 Object

 *                 2. psTermCode : Title로 보여줄 용어코드

 *                 3. psExpr : 필수값 검증 Expression

 * ★ Return     : 없음

 ******************************************************************************/

function gfn_ValidateOnlyOne(poObject, psTermCode, psExpr)

{

    var bReturn = gfn_CheckValidData(gfn_GetLabel(psTermCode), psExpr, poObject.value);

    

    if (!bReturn) {

        if (psExpr.indexOf("function") == -1) {

            poObject.setFocus();

        }

        return false;

    }

    

    return true;

}

Posted by 농부지기
,

[ Nexacro.Dataset -  ds validation1 ]

 

/*==+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 * Group : 1. Dataset Validation 검사
 * Group : 2. 각 개별적으로 호출되는 validation 검사
 **=++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/


/******************************************************************************************
 * 기능 : 사용자가 입력한 Dataset에 대한 validation check
 * 인자 : objGrd       :  화면에 보여주고 있는 Grid name
           objDsChkType : 검사할 check 목록된 기록된 Dataset
           bChkBoxExist : Grid 맨 왼쪽에 check box가 존재 시 check 된 자료만 검사할지 여부
                          이때 check column은 Grid에서 맨 앞쪽(0 index)에 위치되어져 있어야 함.
           bAllRowChk   : Dataset에서 모든 row를 검사 할지 여부 (false일 경우 insert,update된 row만 검사)
 * 리턴 : true/false
 * 예문 :
 * 개발 : 김용학.
 * objDsChkType 컬럼리스트 : colId   :  colNm    :  checkType                 : message : messageViewYn
 *              컬럼값     : EMP_NO  :  사원번호 : Required;Duplicate=EMP_NO :         :
                             EMP_NM  :  사원명   : Required;                 :         :
                             REG_NO  :  주민번호 : Required;MinLen=13;MaxLen=13    :         :
 *****************************************************************************************/

 

//------------------------------------------------------------------------------------------------
// 데이터셋에 선언해놓은 여러건에 대한 정보 체크
// dsChkGrid.check 컬럼 값 예 : Required;Date=YYYY;                       [ 필수이면서 년도 검사]
//                               Date=YYYY;                                [년도     검사]
//                               Date=YYYYMM;                              [년.월    검사]
//                               Date=YYYYMMDD;                            [년.월.일 검사]
//                               Compare=lessEqual,계획종료월,PLAN_EYM;  [ (날짜 대소 비교 가능) (fromDate <= toDate 이면 정상) ]
//                               Compare=less,     계획종료월,PLAN_EYM;  [ (날짜 대소 비교 가능) (fromDate <  toDate 이면 정상) ]
//                               CondRequired=FIX_YN:Y,PLAN_YY,SALE_NO    [ (특정조건일 경우 만 필수)  ]
//                                          (위와 같을 경우 FIX_YN='Y' 일경우 필수 && PLAN_YY 값이 존재 하면 필수 && PLAN_CD 값이 존재 하면 필수
//                               Duplicate=BRAND_CD,DTL_PLAN_CD           [ 컬목 목록만틈 중복 중복 검사 ]
//                               Between=201311,201502                    [ 문자 TYPE 인 경우 가능.  숫자가 가능할 수 있음 ]
//                               BetweenNum=201311,201502                  [ 숫자 type 만 가능 ][Between A AND B 검색]
//------------------------------------------------------------------------------------------------
// 향후 개발해야 될 check목록 : 주민번호 검사 (Resident)
//                                 email 형식     (Email)
//                                 MinLen  : 최소 length (문자에 활용됨) (MinLen=5)
//                                 MaxLen  : 최대 length (문자에 활용됨) (MaxLen=15)
//                                 MinValue : 최소값 (숫자에 활용됨) (MinValue=10)
//                                 MaxValue : 최대값 (숫자에 활용됨) (MaxValue=999)
//                                 MinDate  : 최소년도, 최소년월, 최소일자  (MinDate=YYYY,2014; MinDate=YYYYMM,201405; Mindate=YYYYMMDD,20140505;)
//                                 MaxDate  : 최대년도, 최대년월, 최대일자  (MaxDate=YYYY,2014; MaxDate=YYYYMM,201405; MaxDate=YYYYMMDD,20140505;)
//                                 
//------------------------------------------------------------------------------------------------

function gfn_DataValidation(objGrd:Grid, objDsChkType:Dataset, bChkBoxExist:Boolean , bAllRowChk:Boolean ) {

    var sChkColId, sColId, sColNm, sCheckType, arrCheckType, sMessage, sGubun, sMessageViewYn;

    var sFunction = "";

    var objBusiDs     = eval(objGrd.binddataset);

    var nBusiDsCnt    = objBusiDs.rowcount;

    var nChkTypeDsCnt = objDsChkType.rowcount;

    var nRowType;

    

    if(gfn_IsNull(bChkBoxExist)) bChkBoxExist = false;

    if(gfn_IsNull(bAllRowChk))   bAllRowChk = false;

    

    if(  bChkBoxExist == true ) {

        sChkColId = objGrd.getCellProperty("body",0,"text");

        sChkColId = sChkColId.replace("bind:","");

    }

    

    if(nChkTypeDsCnt <= 0 || nBusiDsCnt <= 0 ) return true;

    

    // 0. 업무 Dataset별로 수행

    for(var nRow = 0 ; nRow < nBusiDsCnt ; nRow ++ ) {

        nRowType = objBusiDs.getRowType(nRow);

        

        if (nRowType == Dataset.ROWTYPE_NORMAL && bAllRowChk == false) continue;

        

        for(var i = 0 ; i < nChkTypeDsCnt ; i ++ ) {

            sColId         = objDsChkType.getColumn(i,"colId"        );

            sColNm         = objDsChkType.getColumn(i,"colNm"        );

            sCheckType     = objDsChkType.getColumn(i,"checkType"    );

            sMessage       = objDsChkType.getColumn(i,"message"      );

            sMessageViewYn = objDsChkType.getColumn(i,"messageViewYn");  //검사 후 오류가 있으면 alert()을 보여줄지 말지 여부

            

            if (gfn_IsNull(sColId) || gfn_IsNull(sCheckType)) continue;

            

            // 1.함수 호출

            if(sColId == "func") {

                if (typeof eval(sCheckType) == "function"){

                    // 존재시 함수 호출

                    if(eval( sCheckType ).call(this,objBusiDs,nRow) == false )

                        return false;

                }

            }else{

                if(((bChkBoxExist == false) || bChkBoxExist == true && objBusiDs.getColumn(nRow,sChkColId) == '1')){

                    arrCheckType = sCheckType.split(";");

                    

                    // 체크 부분 (체크 방법이 여러건 존재)

                    for(var k = 0 ; k < arrCheckType.length ; k ++ ) {

                        if(gfn_IsExist(arrCheckType[k].trim())){

                            // 변수 값에 "=" 이 존재 가능하기때문에

                            if(arrCheckType[k].indexOf("=")  > -1 ) {

                                sFunction = "gfn_DataValidation_" + arrCheckType[k].substring(0,arrCheckType[k].indexOf("="));

                                sGubun    = arrCheckType[k].substr(arrCheckType[k].indexOf("=") + 1);

                            }else {

                                sFunction = "gfn_DataValidation_" + arrCheckType[k];

                                sGubun    = "";

                            }

                            

                            //해당  Function 존재 여부 체크

                            if (typeof eval(sFunction) == "function"){

                                // 존재시 함수 호출

                                if(eval( sFunction ).call(this,sColId, sColNm, objBusiDs, nRow, sGubun, sMessage, sMessageViewYn) == false ) {

                                    objBusiDs.rowposition = nRow;

                                    return false;

                                }

                            }

                        }

                    }  // for end

                }

            } // if end

        }// for end

    }

    

    return true;

}

 

/******************************************************************************************
 * 기능 : 필수값 체크
 * 인자 : sColId  : column id
           sColNm : 컬럼 한글명
           objDs  : 업무 dataset
           nRow   : 검사중인 row
           sGubun : 검사방법 (옵션)
           psMessage  : 메세지 옵션) - 미 존재 시 .. 임으로 alert처리.  존재 시 (화면에서 개발자가 지정한 message로 조회)
 * 리턴 : true/false
 * 예문 :
 *****************************************************************************************/

function gfn_DataValidation_Required(sColId, sColNm, objDs, nRow ,sGubun, psMessage, psMessageViewYn){

    var sColValue = String(objDs.getColumn(nRow , sColId)).trim();

    

    if(gfn_IsExist(sGubun) ) {

        // 필수 체크 시 sGubun에 대한 컬럼값이 존재 할 경우만 필수체크 처리

        // 즉, sGubun값이 미 존재 하면 필수 체크 안함

        var sTagetValue = objDs.getColumn(nRow, sGubun);  

        if(gfn_IsNull(sTagetValue)) {

            if(gfn_IsNull(sColValue) ) {

                gfn_DataValidation_ErrorMessage(psMessageViewYn, psMessage, sColNm + " 은(는) 필수 항목 입니다.");

                

                return false;

            }

        }

    } else {

        if(gfn_IsNull(sColValue) ) {

            gfn_DataValidation_ErrorMessage(psMessageViewYn, psMessage, sColNm + " 은(는) 필수 항목 입니다.");

            

            return false;

        }

    }

    return true;

}

/******************************************************************************************
 * 기      능 : 날짜 확인 로직
 * 인      자 :
 * 반      환 : sGubun - YYYY,YYYYMM,YYYYMMDD, (lessEqual,계획종료월,PLAN_EYM)
 *****************************************************************************************/

function gfn_DataValidation_Date(sColId,sColNm,objDs,nRow ,sGubun, psMessage, psMessageViewYn){

    var strDate = String(objDs.getColumn(nRow , sColId)).trim();

    

    if (gfn_IsNull(strDate)) return true;

    strDate = strDate.replace('.', '');

    strDate = strDate.replace('-', '');

    strDate = strDate.replace('/', '');

    

    if (strDate.length == 4) strDate = strDate + '0101';

    if (strDate.length == 6) strDate = strDate + '01'  ;

    

    // 1. 단순일자 검사

    if (sGubun == "YYYY" || sGubun == 'YYYYMM' || sGubun == 'YYYYMMDD'){

        if(gfn_IsDate(strDate) == false) {

            gfn_DataValidation_ErrorMessage(psMessageViewYn, psMessage, sColNm + "가(이) 정확하지 않습니다.");

            

            return false;

        }

        return true;

    }

 

    return true;

}

 

/******************************************************************************************
 * 기      능 : 두개 컬럼 비교
 *****************************************************************************************/

function gfn_DataValidation_Compare(sColId,sColNm,objDs,nRow ,sGubun, psMessage, psMessageViewYn){

    var sColValue = String(objDs.getColumn(nRow , sColId)).trim();

    var arrVal    = sGubun.split(",");

    

    // 1. 첫 번째 값 처리

    if (gfn_IsNull(sColValue)) return true;

    

    // 2. 두 번째 값 처리

    var sSecondValue = objDs.getColumn(nRow, arrVal[2]).trim();

    if (gfn_IsNull(sSecondValue)) return true;

        

    //3. 두 개 컬럼 대소 비교 (첫번째 일자 <= 두번째 일자)

    if (arrVal[0] == "lessEqual"){

        if (sColValue > sSecondValue){

            gfn_DataValidation_ErrorMessage(psMessageViewYn, psMessage, sColNm + "는(은) " + arrVal[1] + " 보다 더 클 수 없습니다.");

            

            return false;

        }

    }else if (arrVal[0] == "less"){

        if (sColValue >= sSecondValue){

            gfn_DataValidation_ErrorMessage(psMessageViewYn, psMessage, sColNm + "는(은) " + arrVal[1] + " 보다 더 크거나 같을 수 없습니다.");

            

            return false;

        }

    }

    

    return true;

}

 

/******************************************************************************************
 * 기      능 : 한 값이 존재 또는 특정 값 일 경우 필수 처리
 * 인      자 :
 * 반      환 : sGubun - CondRequired=FIX_YN:Y,PLAN_YY,PLAN_CD
 *                         (위와 같을 경우 FIX_YN='Y' 일경우 필수 && PLAN_YY 값이 존재 하면 필수 && PLAN_CD 값이 존재 하면 필수
 *****************************************************************************************/

function gfn_DataValidation_CondRequired(sColId,sColNm,objDs,nRow ,sGubun, psMessage, psMessageViewYn){

    var strDestVal = String(objDs.getColumn(nRow, sColId)).trim();

    var aColList   = sGubun.split(",");

    var aEssentialYN = "N";  //일단 sColId 에 미 필수 항목이라고 처리

    

    // 1. 값이 존재 하면 정상

    if (gfn_IsExist(strDestVal)) return true;

 

    // 2. 각 체크할 컬럼 처리

    for(var ii=0; ii<aColList.length; ii++){

        var aRealColList = aColList[ii].split(":");

        var strColVal    = objDs.getColumn(nRow, aRealColList[0]);

        

        // 1. 특정컬럼값이 null이면.. 필수 아님

        if (aRealColList.length == 1){

            if (gfn_IsNull(strColVal)){

                return true;

            }else{

                gfn_DataValidation_ErrorMessage(psMessageViewYn, psMessage, sColNm + " 은(는) 필수 항목 입니다.");

                

                return false;

            }

        

        // 2. 특정컬럼값이 null이 아니면서 특정값 이면 필수

        }else if (aRealColList.length == 2){

            if (gfn_IsNull(strColVal)) return true;

            if (strColVal == aRealColList[1]){

                gfn_DataValidation_ErrorMessage(psMessageViewYn, psMessage, sColNm + " 은(는) 필수 항목 입니다.");

                

                return false;

            }

        }

    }

    

    return true;

}

/******************************************************************************************
 * 기      능 : 중복 검사
 *****************************************************************************************/

function gfn_DataValidation_Duplicate(sColId,sColNm,objDs,nRow ,sGubun, psMessage, psMessageViewYn){

    var aColList = sGubun.split(",");

    var sFildCond, sColValue, nFindRow;

    

    sFildCond = aColList[0] + "=='" + objDs.getColumn(nRow, aColList[0]) + "'";

    for(var ii=0; ii<aColList.length; ii++){

        sFildCond += "&& " + aColList[ii] + "=='" + objDs.getColumn(nRow, aColList[ii]) + "'";

    }

    

    nFindRow = objDs.getCaseCount(sFildCond);

    

    if (nFindRow > 1){

        gfn_DataValidation_ErrorMessage(psMessageViewYn, psMessage, "중복된 건이 발견되었습니다.");

        

        return false;

    }

    return true;

}

 

/******************************************************************************************
 * 기      능 : 날짜 비교 로직
 *****************************************************************************************/

function gfn_DataValidation_DateLt(sColId,sColNm,objDs,nRow ,sGubun, psMessage, psMessageViewYn){

    if(gfn_IsNull(sColValue) ) {

        gfn_DataValidation_ErrorMessage(psMessageViewYn, psMessage, sColNm + " 을 확인 하십시오.");

        

        return false;

    }

    return true;

}

 

/******************************************************************************************
 * 기      능 : Between A AND B 검색
 *****************************************************************************************/

function gfn_DataValidation_Between(sColId,sColNm,objDs,nRow ,sGubun, psMessage, psMessageViewYn){

    var sColValue = String(objDs.getColumn(nRow , sColId)).trim();

    var arrVal    = sGubun.split(",");

    

    // 1. 첫 번째 값 처리

    if (gfn_IsNull(sColValue)) return true;

    

    // 2. Between 검색

    if (arrVal[0] > sColValue || sColValue > arrVal[1]){

        gfn_DataValidation_ErrorMessage(psMessageViewYn, psMessage, sColNm + "는(은) " + arrVal[0] + " ~ " +  arrVal[1] + " 사이만 가능합니다.");

        

        return false;

    }else{

        return true;

    }

}

 

/******************************************************************************************
 * 기      능 : Between A AND B 검색
 *****************************************************************************************/

function gfn_DataValidation_BetweenNum(sColId,sColNm,objDs,nRow ,sGubun, psMessage, psMessageViewYn){

    var sColValue = String(objDs.getColumn(nRow , sColId)).trim();

    var arrVal    = sGubun.split(",");

    

    // 1. 첫 번째 값 처리

    if (gfn_IsNull(sColValue)) return true;

    

    // 2. Between 검색

    if (toNumber(arrVal[0]) > toNumber(sColValue) || toNumber(sColValue) > toNumber(arrVal[1])){

        gfn_DataValidation_ErrorMessage(psMessageViewYn, psMessage, sColNm + "는(은) " + arrVal[0] + " ~ " +  arrVal[1] + " 사이만 가능합니다.");

                

        return false;

    }else{

        return true;

    }

}

/******************************************************************************************
 * 기능 : DataValidation 검수 후 오류 존재 하면 조회
 *****************************************************************************************/

function gfn_DataValidation_ErrorMessage(psMessageViewYn, psDsMessage, psLocalMessage){

    if (psMessageViewYn == 'N') return;

 

    if (gfn_IsNull(psDsMessage))

        gfn_alert(psLocalMessage);

    else

        gfn_alert(psDsMessage);

}

 

/******************************************************************************************
 * 기능 : 입력일자의 정합성 체크
 * 인자 : 'yyyyMMdd' 형태로 표현된 날짜.
 * 리턴 : true , false
 * 예문 :
 *****************************************************************************************/

function gfn_IsDate(strDate)

{

    var v_date = gfn_Date2Str(gfn_bpStr2Date(strDate));

 

    if (v_date == strDate)

        return true;

    else

        return false;

}

 

/******************************************************************************************
 * 기능 : 날짜를 문자로 변환.
 * 인자 : inDate 문자열
 * 리턴 : 해당일자
 * 예문 :
 *****************************************************************************************/

function gfn_Date2Str(inDate)

{

  return (new Date(inDate)).getFullYear()

           + (((new Date(inDate)).getMonth() + 1) + "").padLeft(2, '0')

           + (((new Date(inDate)).getDate()) + "").padLeft(2, '0');

}

 

 

 

☞  

 

☞  

 
 
 
 

  

Posted by 농부지기
,

[ Nexacro.Dataset -  숫자 계산처리 ]

 

            [  ◎  Dataset에 존재 하는 값을 찾아서 Dynamic 계산 ]     

/******************************************************************************************
 * 기능 : Dynamic Calcurate
 * 인자 : objDs - 값을 얻을 dataset
 *         psSrcColList - 계산식에 사용될 컬럼 리스트
 *         psFomula     - 계산식
 *         psSetColId   - 계산된 값을 넣을 컬럼
 *         psSetCond    - 계산된 값을 넣을 때 처리방법 (NULL=0,  NULL=NULL, 0=NULL)
 * 리턴 : Grid header에 대한 index
 * 예문 : gfn_DynamicCalcurate(objDs, "컬럼명,row=3:컬럼명,row=3"
 *                                  , "([컬럼명1] + [컬럼명2])/100 - 100"
 *                                  , "컬럼명,row=3"
 *                                  , "NULL=0")
 *
 *        gfn_DynamicCalcurate(objDs, "컬럼명, find=컬럼명1=='3'&&컬럼명2>=30:컬럼명,row=3"
 *                                            , "([컬럼명1] + [컬럼명2])/100 - 100"
 *                                            , "컬럼명,find=컬럼명1=='3'&&컬럼명2>=30"
 *                                            , "NULL=NULL")
 * 개발자 : 김용학 (아직 프로젝트 적용한적 없음.  혹시 이 소스를 사용하시면 개발자 지우지 말아주세요.
 *          나름 아이디어 상품이라서 ^^
 * 참고 : find 조건으로 넘와 왔을 경우 값을 못찾으면 null('')로 set
 *****************************************************************************************/
function gfn_DynamicCalcurate(objDs, psSrcColList, psFomula, psTargetColId, psSetCond){
    var aSrcColList = psSrcColList.split(':');
    var sValue, nRow, sFindExpr;
    var sFomulaCal=psFomula;
    var sLastValue;
    
    //1. 계산식에 적용될 컬럼에 대한 값 찾기 와   계산식에 값 Replace
    for(var idx=0; idx<aSrcColList.length; idx++){
    
        //a. 각 컬럼에 대한 row찾기
        var aSrcCol = aSrcColList[idx].split(',');
        if (aSrcCol[1].indexOf("row=") >= 0){
            nRow   = aSrcCol[1].replace("row=", '');
        }else{
            sFindExpr = aSrcCol[1].replace("find=", '');
            nRow      = objDs.findRowExpr(sFindExpr);
            if (nRow < 0){
                sFomulaCal = '';
                break;
            }
        }
        
        //b. 값 얻기
        sValue = objDs.getColumn(nRow, aSrcCol[0]);
        if (gfn_isNull(sValue)) sValue = 0;
        
        //c. 산술식에서 컬럼명을 값으로 대체하기
        sFomulaCal = sFomulaCal.replace('[' + aSrcCol[0] + ']', sValue);
    }
    
    //3. 값 계산하기  (eval()함수에서 나눗셈에  0 이 존재 하면 오류는 안나고,  NaN 으로 결과가 나옴)

    sLastValue = eval(sFomulaCal);  
    if (sLastValue == "NaN" || sLastValue == "Infinity"){
        if (psSetCond == "NULL=0"   ) sLastValue = 0;
        if (psSetCond == "NULL=NULL") sLastValue = '';
    }else if (sLastValue == "0=NULL"){
        sLastValue = '';
    }
    
    //4. 계산된 값을 Dataset에 set
    var aTargetCol = psTargetColId.split(',');
    
    if (aTargetCol[1].indexOf("row=") >= 0){
        nRow   = aTargetCol[1].replace("row=", '');
    }else{
        sFindExpr = aTargetCol[1].replace("find=", '');
        nRow      = objDs.findRowExpr(sFindExpr);
        if (nRow < 0) return;
    }
    
    objDs.setColumn(nRow, aTargetCol[0], sLastValue);
}

 


 

 
 
 

 

 

'Nexacro-Function > Dataset' 카테고리의 다른 글

Nexacro.Dataset - ds validation2  (0) 2017.01.28
Nexacro.Dataset - ds validation1  (0) 2017.01.28
Nexacro.Dataset - 한줄 추가.삭제  (0) 2017.01.28
Nexacro.Dataset - 복사(copy)  (0) 2017.01.28
Nexacro.Dataset - 검색 관련  (0) 2017.01.28
Posted by 농부지기
,

[ Nexacro.Dataset -  한줄 추가.삭제 ]

  

 

/******************************************************************************************

 * 기      능 : dataset 한줄 삽입

 * 인      자 : objGrid - Grid 명

 *              objCopyDs - 선택된 row를 복사한다.

 *              objGrid   - 존재시 insert된 row이 이동

 *              nInstRow  - 추가할 row지정

 *****************************************************************************************/

function gfn_InsertRow(objDs, objCopyDs, objGrid, sFosColId, nInstRow){

    if (gfn_isNotNull(objGrid)){

        objGrid.setFocus();

    }

    var nRow;

    if (nInstRow >= 0)

        nRow = objDs.insertRow(nInstRow);

    else

        nRow = objDs.addRow()

    

    if (gfn_isNotNull(objCopyDs)){

        objDs.copyRow( nRow,  objCopyDs,  objCopyDs.rowposition);       

    }

    

    objDs.rowposition = nRow;

    if (gfn_isExist(sFosColId)){

        var nIdx = gfn_GetColIndex(objGrid, sFosColId);

        if (nIdx >= 0){

            objGrid.setCellPos(nIdx);

        }

    }

 

    return nRow;

}

 

/******************************************************************************************

 * 기      능 : 선택한 dataset Row삭제

 * 인      자 : objDs - 삭제할 Dataset

 * 반      환 : 삭제 row (-1이면 오류)

 *****************************************************************************************/

function gfn_DeleteSelRow(objDs){

    var nRow, nType;

    // 1. 선택한줄 확인

    nRow = objDs.rowposition;

    if (nRow < 0){

        gfn_alert("선택된 ROW가 존재 하지 않습니다.");

        return -1;

    }

    

    // 2. 신규 자료 인지 검사

    nType = objDs.getRowType(nRow);

    if (nType == 2){

        objDs.deleteRow(nRow);

        return -1;

    }

    return nRow;

}

 

function gfn_ExistColumnId(objDs, sColId){

    var nColCnt = objDs.colcount;

    

    for(var i=0; i < nColCnt; i++){

        if (sColId == objDs.getColID(i)) return true;

    }

    return false;

}

 

 

☞  

 
 
 
 

  

 

'Nexacro-Function > Dataset' 카테고리의 다른 글

Nexacro.Dataset - ds validation1  (0) 2017.01.28
Nexacro.Dataset - 숫자 계산처리  (0) 2017.01.28
Nexacro.Dataset - 복사(copy)  (0) 2017.01.28
Nexacro.Dataset - 검색 관련  (0) 2017.01.28
Nexacro.Dataset - Check Box  (0) 2017.01.28
Posted by 농부지기
,

[ Nexacro.Dataset -  복사(copy) ]

 

 

 

/******************************************************************************************
 * 기      능 : Dataset 복사
 * 인      자 : tarDs - 추가될 dataset
 *              srcDs - 자료를 가지고 있는 daaset
 *****************************************************************************************/

function gfn_AddCopyRow(tarDs, srcDs){

    var nAddRow;

    for(var nRow=0; nRow<srcDs.rowcount; nRow++){

        nAddRow = tarDs.addRow();

        tarDs.copyRow(nAddRow, srcDs, nRow);

    }   

}

 

'Nexacro-Function > Dataset' 카테고리의 다른 글

Nexacro.Dataset - 숫자 계산처리  (0) 2017.01.28
Nexacro.Dataset - 한줄 추가.삭제  (0) 2017.01.28
Nexacro.Dataset - 검색 관련  (0) 2017.01.28
Nexacro.Dataset - Check Box  (0) 2017.01.28
Nexacro.Dataset - 속성(Properties)  (0) 2017.01.28
Posted by 농부지기
,