15.Dataset

15.1DataSet 컬럼정보 확인

DataSet의 컬럼정보를 확인하는 방법과, 컬럼 Type를 변경하는 방법에 대한 설명입니다.

그림 15-1Dataset_column_information_0

DataSet은 getColumnInfo를 통해 name, size, type 정보를 얻을 수 있습니다.

15.1.1DataSet 정보확인

this.Button00_onclick = function (obj:Button, e:ClickEventInfo)
{
 var strText = new String();
 for (var i = 0; i < this.Dataset00.getColCount(); i++) 
 {
  var objColInfo = this.Dataset00.getColumnInfo(i);
  strText += "ID = " + objColInfo.name;
  strText += " SIZE = " + objColInfo.size;
  strText += " type = " + objColInfo.type;
  strText += "\n";
 }
 this.TextArea00.set_value(strText);
}

15.1.2DataSet 컬럼정보 변경

this.Button01_onclick = function (obj:Button, e:ClickEventInfo)
{
 var objColInfo = this.Dataset00.getColumnInfo(2);
 objColInfo.set_type("INT");
}

스크립트를 통한 컬럼정보 변경은 권장하지 않습니다.

넥사크로플랫폼(nexacro platform)의 경우 서비스를 이용하여 DataSet을 구성하는 것을 권장합니다.

15.1.3변경된 컬럼정보 확인

this.Button02_onclick = function (obj:Button, e:ClickEventInfo)
{
 var strText = new String();
 for (var i = 0; i < this.Dataset00.getColCount(); i++) 
 {
  var objColInfo = this.Dataset00.getColumnInfo(i);
  strText += "ID = " + objColInfo.name;
  strText += " SIZE = " + objColInfo.size;
  strText += " type = " + objColInfo.type;
  strText += "\n";
 }
 this.TextArea00.set_value(this.TextArea00.value + strText);
}

스크립트를 통한 DataSet 컬럼Type을 변경할 수 있나요?

소스 위치

Sample\DataSet\np_Dataset_ColumnInfo.xfdl

15.2Summary

DataSet 컬럼 Type별 Summary를 구현하는 방법에 대해 기술합니다.

그림 15-2Dataset_getSum_0

15.2.1Expr 구현방법

그림 15-3Dataset_getSum_1

그림 15-4Dataset_getSum_3

Int형과, Float형은 별도의 형 변환을 하지 않고 바로 getSum을 사용할 수 있습니다.

그림 15-5Dataset_getSum_2

그림 15-6Dataset_getSum_4

STRING형의 경우에는 Int, Float형으로 형 변환 후 getSum을 통해 값을 표현해야 정상적인
값 표현이 가능합니다.

15.2.2참고사항

그리드 속성 중 summarytype을 변경하여 SummaryBand위치를 상단으로 표현이 가능합니다.

default : SummaryBand는 하단에, RightBand는 우측에 표시됩니다.

top : SummaryBand는 상단에, RightBand는 우측에 표시됩니다.

소스 위치

Sample\DataSet\np_Dataset_getSum.xfdl

15.3Filter

15.3.1filter를 이용한 like 검색기능 구현

employ 입력 값을 이용하여 %Like%, Like%, = 형태의 검색기능을 구현할 수 있습니다.

그림 15-7findRowExpr

관련 메소드

filter

Dataset에서 조건식을 만족하는 레코드만 보이게 하는 메소드

%Like% 구현

employ 입력 값에 앞뒤 %로 검색을 하고자 하는 경우 구현방법입니다.
this.Button02_onclick = function (obj:Button, e:ClickEventInfo)
{
  this.ds_data.filter("String(employee).indexOf('" + this.ed_name.value.replace("'","\\'") + "') >= 0");
}

Like% 구현

employ 입력 값의 뒤%로 검색을 하고자 하는 경우 구현방법입니다.
this.Button00_onclick = function (obj:Button, e:ClickEventInfo)
{
 this.ds_data.filter("String(employ).substr(0," + this.ed_name.value.length + ").indexOf('" +  this.ed_name.value.replace("'","\\'") + "') >= 0");
}

= 구현

employ 입력 값과 동일한 경우에만 검색을 하고자 하는 경우 구현방법입니다.
this.btn_search_onclick = function (obj:Button, e:ClickEventInfo)
{
 this.ds_data.filter("employ=='" + this.ed_name.value.replace("'","\\'") + "'");
}

Like 검색을 구현하는 방법을 알고 싶습니다.

Dataset, filter, like

조건 Filed this.ed_department.value.replace("'","\\'")를 한 부분은 실 데이터에 싱글쿼터(')가 포함되어 있는 값을 처리하기 위해 필요합니다.

소스 위치

Sample\DataSet\Dataset_Filter.xfdl

15.3.2Filter를 이용한 중복데이타 제거

조회된 데이타값 중 조건에 해당하는 중복 Row를 제거하는 방법에 대해 기술합니다.

그림 15-8Dataset_Distinct_filter_0

주요 소스 내용

기본 Filter 내용

this.Button02_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
 var sExpr = "rowidx==dataset.findRowExpr(\"code=='\" + code + \"'\")"; 
 this.Dataset00.filter(sExpr);    
}

rowidx는 Dataset의 row index를 의미합니다.

사용자 함수를 만들어 여러컬럼에 대한 Filter 설정

this.Button00_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
 this.gf_distincDsFilter(this.Dataset00, "code,name"); 
}
this.gf_distincDsFilter = function(objDs, sColID)
{
 var arrArgs = this.gf_Trim(sColID).split(",");
 var sFilterExpr  = "";
 var sFindRowExpr = "";
 for (var i=0; i<arrArgs.length; i++)
 {
  if (objDs.getColumnInfo(arrArgs[i]) == null) continue;
  
  sFindRowExpr += (this.gf_IsNull(sFindRowExpr) == false) ? " && " : "";
  sFindRowExpr += "" + arrArgs[i] + "=='\" + " + arrArgs[i] + " + \"'";
 }
 
 if (this.gf_IsNull(sFindRowExpr) == false) {
  sFilterExpr = "rowidx==dataset.findRowExpr(\"" + sFindRowExpr + "\")";
 }
 objDs.filter(sFilterExpr);
}
소스 위치

Sample\DataSet\np_Dataset_Distinct_Filter.xfdl

15.4findRowExpr를 이용한 다중 컬럼 검색

Dataset에서 제공되는 findRowExpr메소드를 이용하여 다중 컬럼에 대한 검색을 할 수 있습니다.

그림 15-9findRowExpr

15.4.1주요 소스 내용

this.Button00_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
 var nRow = this.ds_data.findRowExpr("department.toString().indexOf('" + this.ed_department.value.replace("'","\\'") + "')>=0&&employee.toString().indexOf('" + this.ed_employee.value.replace("'","\\'") + "')>=0");
 
   
 if(nRow >= 0)
 {
  this.ds_data.set_rowposition(nRow);  
 } else {
  this.alert("There is no matched conditions.");
  return;
 } 
}

조건 Filed this.ed_department.value.replace("'","\\'")를 한 부분은 실 데이터에 싱글쿼터(')가 포함되어 있는 값을 처리하기 위해 필요합니다.

소스 위치

Sample\DataSet\np_Dataset_findRowExp.xfdl

15.5enableevent속성을 이용한 이벤트 제어하기

그림 15-10Dataset_Enableevent_0

Dataset에 많은 양의 작업을 하는 경우 이벤트가 발생하여 화면이 깜박이는 현상이 발생할 수 있습니다.
이런 현상을 막기 위해 enableevent 속성을 이용하여 이벤트 발생 여부를 제어할 수 있습니다.

15.5.1관련 메소드

enableevent

enableevent속성에 따라 DataSet에서 발생하는 이벤트를 중지/실행할 수 있습니다.

onrowposchanged

Dataset 의 rowposition 속성이 변경되면 발생하는 이벤트입니다.

enableevent를 faslse후 반드시 true로 설정을 해 주어야 합니다.

만약 false 후 true를 하지 않는 경우 이벤트가 정상 동작하지 않을 수 있습니다.

15.5.2주요 소스 내용

/*
 * File Name   : Dataset_Enableevent
 * Description : 이벤트 발생 여부 제어하기
 */
/*  버튼클릭  */
this.btn_execute0_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
 this.ds_data.set_enableevent(false);
 this.ds_data.addRow();
 this.ds_data.set_enableevent(true); 
}
소스 위치

Sample\DataSet\np_Dataset_EnableEvent.xfdl

15.6Dataset의 오리지널버퍼 내용 확인하기

그림 15-11Dataset_RowType_0

15.6.1관련 메소드

getRowType

Dataset에서 지정된 레코드의 상태를 구하는 메소드
1 : 초기 레코드 상태
2 : 추가된 레코드 상태
4 : 수정된 레코드 상태
8 : 삭제된 레코드 상태

getOrgColumn

Dataset에서 지정한 레코드의 변경 전 칼럼 값을 구하는 메소드

getDeletedRowCount

Dataset에서 삭제된 레코드 수를 구하는 메소드

getDeletedColumn

Dataset에서 삭제된 레코드 중에서 칼럼 값을 구하는 메소드

15.6.2주요 소스 내용

/*
 * Function Name : fn_orgDataset
 * Description   : OrginBuffer 기록 내용 확인
 * Parameter     : 
 * Return        : 
 * Example       : fn_orgDataset();
 */
this.fn_orgDataset = function()
{
 var sOrgCol = "";
 var sOrgVal = "";
 this.ds_org.clearData(); 
 
 // 수정된 내용
 for (var i = 0; i < this.ds_data.rowcount; i++) 
 {
  var nRowType = this.ds_data.getRowType(i);
  if (nRowType == 4)
  {
   this.ds_org.addRow();
   this.ds_org.setColumn(this.ds_org.rowposition, "COL_TYPE", nRowType);
   for (var j = 0; j < this.ds_data.colcount; j++) 
   {
    sOrgCol = this.ds_data.getColID(j);
    sOrgVal = this.ds_data.getOrgColumn(i, sOrgCol);
    this.ds_org.setColumn(this.ds_org.rowposition, sOrgCol, sOrgVal);
   }
  }
 }
 
 // 삭제된 내용
 for (var i = 0; i < this.ds_data.getDeletedRowCount(); i++) 
 {
  this.ds_org.addRow();
  this.ds_org.setColumn(this.ds_org.rowposition, "COL_TYPE", 8);
  for (var j = 0; j < this.ds_data.colcount; j++) 
  {
   sOrgCol = this.ds_data.getColID(j);
   sOrgVal = this.ds_data.getDeletedColumn(i, sOrgCol);
   this.ds_org.setColumn(this.ds_org.rowposition, sOrgCol, sOrgVal);
  }
 }
 
 this.grd_output.createFormat();
}

로우타입, 오리지널버퍼 정보를 확인할 수 있나요?

소스 위치

Sample\DataSet\np_Dataset_RowType.xfdl

15.7스크립트 이용 GlobalDataSet, LocalDataSet생성하기

그림 15-12Dataset_UseScript_0

new 연산자를 이용하여 전역 영역과 Form에 Dataset을 동적으로 생성이 가능합니다.

15.7.1주요 소스 내용

this.btn_execute_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
 var objGdS = new Dataset; 
 application.addVariable("gds_data", objGdS, "global");
 application.gds_data.set_name("gds_data");
 application.gds_data.addColumn("COL0","String");
 application.gds_data.addColumn("COL1","String");
 application.gds_data.addRow();
 application.gds_data.setColumn(application.gds_data.rowposition,"COL0","global COL0");
 application.gds_data.setColumn(application.gds_data.rowposition,"COL1","global COL1");
 this.grd_output0.set_binddataset("gds_data");
 this.grd_output0.createFormat();
      
 var objLdS = new Dataset;
 objLdS.set_name("ds_data");
 this.addChild("ds_data", objLdS);  
 this.ds_data.addColumn("COL0","String");
 this.ds_data.addColumn("COL1","String");
 this.ds_data.addRow();
 this.ds_data.setColumn(this.ds_data.rowposition,"COL0","1");
 this.ds_data.setColumn(this.ds_data.rowposition,"COL1","first");
 this.ds_data.addRow();
 this.ds_data.setColumn(this.ds_data.rowposition,"COL0","2");
 this.ds_data.setColumn(this.ds_data.rowposition,"COL1","second");
 this.grd_output1.set_binddataset("ds_data"); 
 this.grd_output1.createFormat();
 this.Edit00.set_value('global dataset count : ' + application.all["gds_data"].rowcount);
 this.Edit01.set_value('local  dataset count : ' + this.all["ds_data"].rowcount);
}

15.7.2참고사항

GlobalDataSet

전역 영역의 Dataset은 어플리케이션 어느 위치에서도 접근해서 사용이 가능하지만
어플리케이션 종료 되기 전까지 메모리에 상주하고 있기 때문에 용도에 따라 위치를 결정해야 합니다.

동적으로 DataSet을 Global에 생성할 수 있나요?

스크립트를 이용하여 DataSet을 생성하는 방법을 알고 싶습니다?

소스 위치

Sample\DataSet\np_Dataset_UseScript.xfdl

15.8변경된 컬럼정보를 원본 데이터로 되돌리기

데이터를 조회하여 수정 후 원본(처음 조회된) 값으로 되돌리는 기능을 구현할 수 있습니다.

그림 15-13Dataset_ChangeRowtype_0

15.8.1주요 소스 내용

/*
 * File Name   : Dataset_ChangeRowtype1
 * Description : Dataset에서 체크된 레코드를 원본 데이터로 되돌리기
 */
/* set rowtype */
this.btn_execute_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
 var iRowCount = this.ds_data.getRowCount();
 var iColCount = this.ds_data.getColCount();
 
 for (var i = 0; i < iRowCount; i++)
 {
   if (this.ds_data.getColumn(i, "COL0") == 1 && this.ds_data.getRowType(i) != "1")
   {
     for (var j = 0; j < iColCount; j++)
     {   
        if (this.ds_data.getColumn(i, j) != this.ds_data.getOrgColumn(i, j))
        {
            this.ds_data.setColumn(i, j, this.ds_data.getOrgColumn(i, j));
        }
     }
            
     this.ds_data.setColumn(i, "COL0", 1);            
     this.ds_data.set_updatecontrol(false);
     this.ds_data.setRowType(i,Dataset.ROWTYPE_NORMAL);
     this.ds_data.set_updatecontrol(true);
   }
 }
}

setRowType, updatecontrol, getRowType

소스 위치

Sample\DataSet\np_Dataset_ChangeRowtype1.xfdl

15.9변경된 로우타입을 normal로 변경하기

Grid에서 체크로 인해 변경된 로우타입을 normal로 변경할 수 있습니다.

그림 15-14Dataset_ChangeRowtype_1

그리드에 체크가 되어 로우타입이 변경되면 데이터 저장시 서버로 해당 레코드가 전송될 수 있는데 이를 막기 위해 사용합니다.

15.9.1주요 소스 내용

/*
 * File Name   : Dataset_ChangeRowtype2
 * Description : Dataset에서 체크로 인해 변경된 로우타입을 normal로 변경하기
 */ 
 /* set rowtype */
this.btn_execute_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
 중략...
   if (bChkFlag == true && nChkCnt == 1)
   {
    this.ds_data.setRowType(i, Dataset.ROWTYPE_NORMAL);
   }            
  }
 }
 this.ds_data.set_updatecontrol(true);
 this.ds_data.set_enableevent(true);
}

DataSet에 변경된 RowType을 스크립트를 통해 변경할 수 있습니까?

setRowType, updatecontrol

소스 위치

Sample\DataSet\np_Dataset_ChangeRowtype2.xfdl

15.10Datset의 업데이트 여부 판단하기

Dataset의 getRowType 메소드를 이용하여 업데이트 여부를 판단합니다.

그림 15-15Dataset_CheckUpdated_0

15.10.1관련 메소드

updatecontrol

로우타입을 자동으로 변경할 것인지 여부를 설정하는 속성입니다.
updatecontrol 속성이 'false'일 때 setRowType 메소드를 이용해 로우타입을 변경할 수 있습니다.

getDeletedRowCount

Dataset 에서 삭제된 행수를 구하는 메소드이다

getRowType

Dataset의 로우타입를 구한다. 로우타입의 종류는 nexacro studio의 Help(Appendix>Constant>Dataset>Row Type)를 참고

15.10.2주요 소스 내용

/*
 * Function Name : fn_isUpdate
 * Description   : 데이터셋의 갱신여부 확인
 * Parameter     : Dataset
 * Return        : 갱신된 경우  true, 갱신되지 않은 경우 false
 * Example       : fn_isUpdate(ds_data);
 */
this.fn_isUpdate = function(objDs)
{
 var bRtn = false;
 // 삭제건수 확인
 if (objDs.updatecontrol) 
 {
  if (objDs.getDeletedRowCount() > 0) 
  {
            bRtn = true
            return bRtn;
        }
 }
 var nRowType;
 for (var i = 0; i < objDs.getRowCount(); i++) 
 {
  nRowType = objDs.getRowType(i);
  if (nRowType == 2 || nRowType == 4 || nRowType == 8) 
  {
   bRtn = true;
   break;
  }
 }
 return bRtn;
}

업데이트, 로우타입, Updatecontrol

소스 위치

Sample\DataSet\np_Dataset_CheckUpdated.xfdl