• 고객센터
  • 교육
  • 매뉴얼
  • 데모
  • 제품소개
기술지원31
조회 수 : 1051
2009.10.19 (09:59:27)
OnColumnChanged 이벤트는 컬럼이 변경될 때마다 발생하는데
이벤트 발생 중에 다른 스크립트 함수에서 또 컬럼을 변경해서
동일한 이벤트 함수를 계속 호출해서 문제가 생기는 겁니다.

해결 방법은 이벤트 작동시에 복사 DataSet을 만들어 놓고
복사 DataSet을 변경한 다음에 변경된 내용을 그리드에 옮기던가
아니면 다른 방법을 연구해서 사용하셔야 할 것 같습니다.

가우스 컴포넌트 구조상 이런 형태의 코딩은 불가능합니다.


>게시판을 이용해 주셔서 감사합니다.
>다음양식에 맞게 입력해주세요.
>
>* 고객시스템명 :
>* 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;
>}
>
>
>
 
Tag List
XE Login