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