게시판을 이용해 주셔서 감사합니다.
다음양식에 맞게 입력해주세요.
* 고객시스템명 :
* GAUCE 버전 : 4013
* WAS 종류(WebLogic 등등) : weblogic
* DB 종류 : oracle
* 문의 유형(질문/요청/참조) : Stack OverFlow 에러
* 내용 :
10월 31주 32주 33주
가전(Total) 150 70 30 50
컴퓨터(Total) 150 70 30 50
Tx-4000 100 20 30 50
Sx-1000 50 50 0 0
Dataset 은 위처럼 저장되고
Tx-4000제품의 월 수량을 입력하면 주로 배분되고 제품 주 수량을 수정하면 가전(Total), 컴퓨터(Total)의 수량도 변경되는 로직입니다. 즉 Tx-4000제품의 월 수량을 200으로 수정하면
가전(Total) 250 90 60 100
컴퓨터(Total) 250 90 60 100
Tx-4000 200 40 60 100
Sx-1000 50 50 0 0
처럼 변경되는 로직입니다.
아래 소스처럼 입력했을때 datatset의 OnExit(row,colid,olddata) 이벤트를 타고
월분배=> jsResetMonthDiv 와 월총합계산 => jsResetMonthSum 함수를 타고
상단 Total 합계는 datatset의 OnColumnChanged 이벤트를 타고
상위 Level 총계를 변경 => jsResetTotalSum 함수를 타도록 개발했습니다.
근데 로직은 다 타고 "Stack Overflow at line:0" 에러가 발생합니다.
아래는 JSP 소스내용입니다.
<SCRIPT LANGUAGE="JAVASCRIPT" FOR="das_grid_sales_plan" EVENT="OnColumnChanged(row,colid)" >
<!--
var intAddCnt = 0;
var arrChgFlagId = new Array();
var intChgFlag = 0;
var boolFlag = true;
if( !colid.substring(0,3) == "CS_" || !colid.substring(0,3) == "CD_"){
return;
}
if( das_grid_sales_plan.NameValue(row,"add_yn" ) == "N"){
for(var j=0; j<=arrChgFlagId.length; j++){
if(arrChgFlagId[j] == colid){
boolFlag = false;
}
}
if(boolFlag){
if(colid.substring(0,3) == "CD_"){
if(iCnt%2 != 0){
jsResetTotalSum( row, colid, intAddCnt, das_grid_sales_plan, grid_sales_plan, "VIEW_SEQ", "01", "FILTER_COLUMN" );
} else {
jsResetTotalSum2( row, colid, intAddCnt, das_grid_sales_plan, grid_sales_plan, "VIEW_SEQ", "01", "FILTER_COLUMN" );
}
iCnt++;
}
if(colid.substring(0,3) == "CS_"){
jsResetTotalSum3( row, colid, intAddCnt, das_grid_sales_plan, grid_sales_plan, "VIEW_SEQ", "01", "FILTER_COLUMN" );
}
arrChgFlagId[intChgFlag] = colid;
intChgFlag++;
}
}
das_grid_sales_plan.ResetStatus();
-->
</SCRIPT>
<SCRIPT LANGUAGE="JAVASCRIPT" FOR="grid_sales_plan" EVENT="OnExit(row,colid,olddata)" >
<!--
var intAddCnt = 0;
var arrChgFlagId = new Array();
var intChgFlag = 0;
var boolFlag = true;
if( !colid.substring(0,3) == "CS_" || !colid.substring(0,3) == "CD_" || das_grid_sales_plan.NameValue(row,"TFLAG" ) != "D"){
return;
}
if( das_grid_sales_plan.NameValue(row,"add_yn" ) == "N"){
for(var j=0; j<=arrChgFlagId.length; j++){
if(arrChgFlagId[j] == colid){
boolFlag = false;
}
}
if(boolFlag){
if(colid.substring(0,3) == "CS_"){
jsResetMonthDiv( row, colid, das_empty_calendar, das_grid_sales_plan, grid_sales_plan);
}else if(colid.substring(0,3) == "CD_"){
jsResetMonthSum( row, colid, das_empty_calendar, das_grid_sales_plan, grid_sales_plan);
}
arrChgFlagId[intChgFlag] = colid;
intChgFlag++;
}
}
das_grid_sales_plan.ResetStatus();
-->
</SCRIPT>
그리고 각 실행 함수는 다음과 같습니다.
=> 상위 총합계를 변경하는 함수
function jsResetTotalSum( row, colid, intAddCnt, dsObjName, gridObj, strColName, strColValue, strNaviColName ){
gridObj.ReDraw = false;
var arrNaviColValue = new Array();
var strNaviValue = dsObjName.NameValue(row, strNaviColName);
var intOrgValue = parseInt(dsObjName.OrgNameValue(row,colid));
var intAmdValue = parseInt(dsObjName.NameValue(row,colid));
var intCurLevel = Number(dsObjName.NameValue(row,"T_LEVEL"));
for(var i = 1; i <= row; i++ ){
var intTotRow = i + intAddCnt;
if(dsObjName.NameValue(intTotRow,strColName) == strColValue){
var intTotSum = parseInt(dsObjName.NameValue(intTotRow,colid)) - intOrgValue + intAmdValue;
var strCurNaviValue = dsObjName.NameValue(intTotRow, strNaviColName);
if(strNaviValue.indexOf(strCurNaviValue) != -1&& intCurLevel == Number(dsObjName.NameValue(i, "T_LEVEL"))+1){
dsObjName.NameValue(intTotRow, colid ) = Math.round(intTotSum);
break;
}
}
}
gridObj.ReDraw = true;
}
=> 월합계를 변경하는 함수
function jsResetMonthSum( row, colid, dsCarlenName, dsObjName, gridObj){
gridObj.ReDraw = false;
var intOrgValue = parseInt(dsObjName.OrgNameValue(row,colid));
var intAmdValue = parseInt(dsObjName.NameValue(row,colid));
var strColid = colid.substr(3,colid.length);
for(var i = 1; i <= dsCarlenName.CountRow; i++ ){
var strMonthAscRank = das_empty_calendar.NameValue(i,"month_asc_rank" );
var strMonCode = das_empty_calendar.NameValue(i,"m_code");
var strWeekCode = das_empty_calendar.NameValue(i,"h_code");
if(strWeekCode == strColid){
var intTotSumM = parseInt(dsObjName.NameValue(row,"CS_"+strMonCode)) - intOrgValue + intAmdValue;
dsObjName.NameValue(row, "CS_"+strMonCode ) = Math.round(intTotSumM);
break;
}
}
gridObj.ReDraw = true;
}
=> 월을 주로 배분하는 함수
function jsResetMonthDiv( row, colid, dsCarlenName, dsObjName, gridObj){
gridObj.ReDraw = false;
var intAmdChgValue = dsObjName.NameValue(row,colid) - dsObjName.OrgNameValue(row,colid);
var strColid = colid.substr(3,colid.length);
var arrChgSum = new Array();
var arrColName = new Array();
var intChgIndex = 0;
for(var i = 1; i <= dsCarlenName.CountRow; i++ ){
var strMonthAscRank = das_empty_calendar.NameValue(i,"month_asc_rank" );
var strMonCode = das_empty_calendar.NameValue(i,"m_code" );
var strWeekCode = das_empty_calendar.NameValue(i,"h_code" );
if(strMonCode == strColid){
var intWeek = parseInt(dsObjName.NameValue(row,"CD_"+strWeekCode));
var intMonth = parseInt(dsObjName.OrgNameValue(row,"CS_"+strMonCode));
var intChgSum = intWeek + (intWeek/intMonth*intAmdChgValue);
dsObjName.NameValue(row, "CD_"+strWeekCode ) = Math.round(intChgSum);
arrChgSum[intChgIndex] = intChgSum;
arrColName[intChgIndex] = strWeekCode;
intChgIndex++;
}
}
var intRemainSum = 0;
for(var j = 0; j < intChgIndex-1; j++){
intRemainSum += parseInt(arrChgSum[j]);
}
dsObjName.NameValue(row, "CD_"+ arrColName[intChgIndex-1]) = parseInt(dsObjName.NameValue(row,colid)) - intRemainSum;
gridObj.ReDraw = true;
}