본문 바로가기

Frontend/Nexacro

[넥사크로] Dataset

반응형

1. Dataset 2가지

Application Information\Application Variables\Datasets : Global Dataset
각각 Form의 Dataset : Local Dataset

2. 구성요소

1) Property

enableevent : Dataset의 이벤트를 멈추고 단순 데이터만 세팅하려고 할 때 사용하는 속성
keystring : Dataset을 Grouping하거나 Sort할 때 사용하는 속성
rowcount : Dataset의 전체 Row건수를 확인
rowposition : Dataset에서 현재 Row위치
useclientlayout : Dataset Latout을 내가 작성한 것과 서버에서 return해주는 Layout을 쓸건지 선택하는 속성 Default : false
...

2) Method

addColumn : Column추가
addRow : 마지막 줄에 Row추가
insertRow : 원하는 위치에 Row추가
deleteRow : 선택한 위치 Row삭제
getColumn : Dataset에 특정 Column의 최종 값 얻기
setColumn : Dataset에 특정 Column의 값 Setting
getOrgColumn : Dataset에 특정 Column의 최초 데이터(수정 전의) 값 얻기
getDeleteColumn : 삭제된 Record의 삭제된 특정 Column값 얻기
filter : 결과 내 검색
findRow : 조건에 맞는 특정 Record 위치 얻기
getAvg : 특정 Column의 평균 얻기
getCaseAvg : Expression을 사용해 Column의 평균 얻기
clearDate : Dataset에 있는 모든 Record를 지우는 메서드
reset : 서버 통신 서비스 없이 최초 조회 상태로 되돌리기
copyData : Dataset 전체 복사
copyRow : Dataset에서 특정 Row만 복사
...

3) Event

onload : 데이터가 로딩 되었을 때 발생
cancolumnchange : 입력한 데이터를 Dataset에 반영하기 전에 발생
oncolumnchanged : 입력한 데이터를 Dataset에 반영한 후에 발생 
canrowposchange : Dataset의 Row가 변경되기 전 발생
onrowposchanged : Dataset의 Row가 변경된 후 발생
...
 

3. Dataset 실습

1) 컬럼 조회

this.btn_Exe1_1_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo){
var nColCount = this.Dataset1.getColCount(); // this.Dataset1.colcount;
var nRowCount = this.Dataset1.getRowCount(); // this.Dataset1.rowcount;
        // 컬럼 갯수 조회
trace("Col Count=" + nColCount + " : Row Count=" + nRowCount);
 
this.txtRtn1.set_value("Col Count=" + nColCount + " : Row Count=" + nRowCount);
        
for(var i=0; i<nColCount; i++){
                // 컬럼 ID 조회
// var sColID = this.Dataset1.getColID(i);
// trace("Col ID=" + sColID);
                // 컬럼 정보 조회
var objCol = this.Dataset1.getColumnInfo(i);
trace(objCol.id + " : " + objCol.type + " : " + objCol.size + " : " + objCol.prop);
}
};

2) 컬럼 추가

this.btn_Exe1_2_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
this.Dataset1.addColumn("COL_CHK", "STRING");
};

3) 조건 1개 검색

this.btn_Exe2_1_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
var nRow = this.Dataset1.findRow("EMPL_ID", "KR120");
var sVal = this.Dataset1.getColumn(nRow, "FULL_NAME");
 
    trace(sVal);
this.txtRtn1.set_value(sVal);
};

4) 조건 2개 검색

this.btn_Exe2_2_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
var nRow = this.Dataset1.findRowExpr("DEPT_CODE == 'K10' && SALARY <= 5000");
var sVal = this.Dataset1.getColumn(nRow, "FULL_NAME");
trace(sVal);
this.txtRtn1.set_value(sVal);
};

5) 조건을 이용해 목록 출력

this.btn_Exe2_3_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
var sText = "";
var arrRow = this.Dataset1.extractRows("DEPT_CODE=='K10'");
for(var i=0; i<arrRow.length; i++){
var sValue = this.Dataset1.getColumn(arrRow[i], "FULL_NAME");
trace(sValue);
sText += sValue + "\n";
}
 
this.txtRtn1.set_value(sText);
// 2-3 extractRows -> findRow 함수로 변경한다면? 
// var nCnt = this.Dataset1.getRowCount();   //iCnt 변수로 건수를 받아서 체크
// for(var i=0;i<nCnt; i++){ 
//     var nRow = this.Dataset1.findRow("DEPT_CODE","K10", i,-1);  //<-- startrow, endrow
//     if(nRow >= 0){
//         i = nRow ;
//         trace(nRow + "===" + i + "==" + this.Dataset1.getColumn(i,"FULL_NAME"));
//     }
// } 
};

6) 조건에 맞춰 검색 후 연산

this.btn_Exe3_1_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
var nAvgM  = this.Dataset1.getCaseAvg("GENDER=='M'", "SALARY");
var nAvgW1 = this.Dataset1.getCaseAvg("GENDER=='W'", "SALARY");
var nAvgW2 = this.Dataset1.getCaseAvg("GENDER=='W'", "SALARY",0, -1, false);
trace("Man Avg=" + Math.round(nAvgM, 2) + " : Woman Avg=" + nAvgW1 + " : " + nAvgW2);
this.txtRtn1.set_value("Man Avg=" + Math.round(nAvgM, 2) + " : Woman Avg=" + nAvgW1 + " : " + nAvgW2);
};

7) 수식 연산

this.btn_Exe3_2_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
var nAvg = this.Dataset1.getAvg("SALARY+BONUS");
trace("Salary+Bonus AVG=" + nAvg);
this.txtRtn1.set_value("Salary+Bonus AVG=" + nAvg);
};

8) 정렬

this.btn_Exe3_3_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
this.Dataset1.set_keystring("S:-HIRE_DATE"); // 내림차순
        //this.Dataset1.set_keystring("S:+HIRE_DATE"); // 오름차순
};

9) 필터링

this.btn_Exe3_4_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
this.Dataset1.filter("GENDER == 'M' && MARRIED == '0'");
};

10) 대소문자 관계없이 이름에 e가 들어간 사람 필터링

this.btn_Exe3_Filter_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
    // like filter --> String.indexOf()
var sText = "e"; // 'e'는 에러발생 : 인덱스 안에서 ''가 들어가 닫히는 부분이 잘못 닫힘
        this.Dataset1.filter("FULL_NAME.toUpperCase().indexOf('" + sText.toUpperCase()+"') >= 0");
        // this.Dataset1.filter("String(FULL_NAME).toUpperCase().indexOf('" + nexacro.replaceAll(s.Text,"'","\\'").toUpperCase() + "') >= 0"); // 이렇게 하면 ''에 상관없이 됨
 
};

11) 원본과 필터된 레코드 개수 비교

this.btn_Exe3_5_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
var nCnt   = this.Dataset1.getRowCount();
var nCntNF = this.Dataset1.getRowCountNF(); // NF는 NotFilter를 의미
trace(nCnt + " : " + nCntNF);
this.txtRtn1.set_value(nCnt + " : " + nCntNF);
};

12) 최상위에 새로운 Row추가

this.btn_Exe4_1_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
var nRow  = this.Dataset4.insertRow(0);
var nType = this.Dataset4.getRowType(nRow);
        // 0 : 존재 안함, 1 : 초기, 2 : 추가, 4 : 수정, 8 : 삭제, 16 : 그룹 정보
trace("Insert Rowtype: " + nType);
this.txtRtn2.set_value("Insert Rowtype: " + nType);
};

13) 특정 컬럼 값 변경

this.btn_Exe4_2_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
this.Dataset4.setColumn(1, "FULL_NAME", "Nexacro");
var nType = this.Dataset4.getRowType(1);
trace("Update Rowtype: " + nType);
this.txtRtn2.set_value("Update Rowtype: " + nType);
};

14) 변경 전후 데이터 확인

this.btn_Exe4_3_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
var sCurData = this.Dataset4.getColumn(1, "FULL_NAME");
var sOrgData = this.Dataset4.getOrgColumn(1, "FULL_NAME");
trace("Cur Data=" + sCurData + " : Org Data=" + sOrgData);    
this.txtRtn2.set_value("Cur Data=" + sCurData + " : Org Data=" + sOrgData);
};

15) Row Index에 따른 다중 레코드 삭제

this.btn_Exe4_4_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
var arrRow = [3,4,5]; 
  this.Dataset4.deleteMultiRows(arrRow);
// 4-4 deleteMultiRows -> deleteRow 함수로 변경한다면? 
// var iCnt = this.Dataset4.getRowCount();
// this.Dataset4.set_enableevent(false);
// for(var i=iCnt;i>=0;i--)
// {
//     this.Dataset4.deleteRow(i);
// }
// this.Dataset4.set_enableevent(true);
 
};

16) 삭제한 레코드와 데이터 반환

this.btn_Exe4_5_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
var nDelCnt  = this.Dataset4.getDeletedRowCount();
var sDelData = this.Dataset4.getDeletedColumn(0, "FULL_NAME");
         // Stack구조라 가장 뒤쪽 Row가 가장 먼저 지워짐, 예를 들어 1~6에서 3, 4, 5, 6을 지우면 6부터 지워짐
trace("Del Count=" + nDelCnt + " Del Data=" + sDelData);
this.txtRtn2.set_value("Del Count=" + nDelCnt + " Del Data=" + sDelData);
 
// var arrDel = this.Dataset4.getDeletedRowset();
// trace(arrDel[0]);
 
 
};

17) 데이터 변경여부 체크

this.btn_Exe4_Check_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
    this.fn_checkdata(this.Dataset4);
    this.fn_checkdata(this.Dataset6); // 데이터 셋 별로 변경여부 체크 가능
};
 
this.fn_checkdata = function(objDs){
        if(this.Dataset4.getDeletedRowCount() > 0){
            //alert("삭제");
            return true;
        }
        for(var i = 0 ; i < this.Dataset4.rowcount ; i++ ){
            var nRowType = this.Dataset4.getRowType(i);
            if( nRowType == 2 || nRowType == 4 ){
                //alert("신규/변경");
                return true;
            }
        }
        return false;
}
// onbeforeclose이벤트에 아래를 넣으면 창을 닫기 전, 확인 옵션을 활성화 할수있다.
        if(this.fn_checkdata(this.Dataset4)){
            return "변경된 데이터가 존재합니다. 닫으시겠습니까?";
        }

18) Dataset 복사 // 데이터만 복사(레코드 타입은 1로 변경됨)

this.btn_Exe5_1_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
this.Dataset5.copyData(this.Dataset4);
this.Grid5.createFormat();
};

19) 입력, 수정한 데이터 복사 저장 // 레코드 타입도 복사(유지 됨)

this.btn_Exe5_2_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
this.Dataset5.assign(this.Dataset4);
this.Grid5.createFormat();
};

20) 특정 조건에 맞는 Row만 복사

this.btn_Exe5_3_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
var nFromRow = this.Dataset4.findRow("EMPL_ID", "KR040");
var nToRow   = this.Dataset5.addRow();
this.Dataset5.copyRow(nToRow, this.Dataset4, nFromRow);
};

21) 특정 조건에 맞는 Data만 복사

this.btn_Exe5_4_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
var nFromRow = this.Dataset4.findRow("EMPL_ID", "KR210");
var nToRow   = this.Dataset5.addRow();
var sCol = "EMPL_ID=EMPL_ID, FULL_NAME=FULL_NAME";
this.Dataset5.copyRow(nToRow, this.Dataset4, nFromRow, sCol); // 20)과 차이점
};

22) 변경 전 데이터 와 변경 후 데이터 확인

( 중복처리는 cancolumn에서 해야 반영되지 않고 멈출 수 있음 )

this.Dataset6_cancolumnchange = function(obj:nexacro.NormalDataset,e:nexacro.DSColChangeEventInfo)
{
// 수정시 중복발생 했을 때 처리
        var nCnt = obj.findRowExpr("FULL_NAME == '" + e.newvalue + "' && currow != " + e.row);
        if(nCnt >= 0){
            this.alert("Data Duplication");
            return false;
        }
        trace("cancolumnchange");
};
 
this.Dataset6_oncolumnchanged = function(obj:nexacro.NormalDataset,e:nexacro.DSColChangeEventInfo)
{
trace("oncolumnchanged");
};

23) 데이터 변경시 이벤트 발생 순서 확인

this.btn_Exe6_3_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
        // 0은 row index임
this.Dataset6.setColumn(0, "FULL_NAME", "Modify1");
};

24) 데이터 변경시 이벤트 발생 멈춤

this.btn_Exe6_5_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
        this.Dataset6.set_enableevent(false);
for( var i = 0 ; i < 10 ; i++ ){
            this.Dataset6.setColumn(i, "FULL_NAME", "Modify2");
        }
        this.Dataset6.set_enableevent(true);
};
반응형

'Frontend > Nexacro' 카테고리의 다른 글

[넥사크로] PopupDiv  (0) 2023.07.07
[넥사크로] Grid  (0) 2023.07.07
[넥사크로] 넥사크로 플랫폼 이용 개발 시 주의사항  (0) 2023.07.07
[넥사크로] 다시 해보기  (0) 2023.07.07
[넥사크로] 메인 화면 구성  (0) 2023.07.07