/*==+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * 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;
} |