XPLATFORM 101

- Dataset > Coding Event


데이터셋에서의 이벤트는 서로 연결된 관계를 가지기 때문에 순서와 역할을 정확하게 이해하는게 중요합니다.
제공되는 이벤트는 다음과 같습니다.

cancolumnchange
canrowposchange
oncolumnchanged
onload
onrowposchanged
onrowsetchanged
onvaluechanged

각 역할에 대해 자세하게 살펴보겠습니다.

(1) onload
- 데이터셋을 구성하는 데이터 로딩이 완료된 시점에 발생
- rowposition 의 초기값은 -1인데 데이터가 올라오고 나면 0으로 변경됩니다.
- 데이터가 로딩되는 과정은 여러가지 상태값을 가집니다.


예제에서는 사전에 정의된 데이터셋이 로드되기 때문에 상태값이 Dataset.REASON_LOADCONTENT 이 됩니다.
그러면서 rowposition 이 변경되어 OnRowPosChanged 이벤트가 발생합니다.


(2) onrowposchanged
- 데이터셋의 rowposition이 변경된 후에 발생
- 새로운 위치 정보와 이전 위치 정보를 제공합니다.
- onload 이벤트와 함께 row의 위치가 바뀌었으니 이벤트가 발생했겠죠.


(3) onvaluechanged
- 데이터셋의 표현값이 변경될때 발생하는 이벤트
- 데이터셋의 Row 추가, 삭제, 이동으로 선택된 Row가 변경될 경우 마지막에 이벤트가 발생


(4) onrowsetchanged
- 데이터셋의 레코드가 추가, 삭제, 변경되었을때 발생하는 이벤트


- reason 값에서 이벤트의 발생 원인을 확인할 수 있습니다.


그리고 예제 테스트를 통해 사용자의 행위에 따라 어떤 이벤트가 발생하는지 따라가보고 있습니다.
먼저 setColumn() 메소드가 실행되면
cancolumnchange > oncolumnchanged > onvaluechanged 이벤트가 발생합니다.

앞에서 onvaluechanged 이벤트가 가장 마지막에 발생한다고 했는데 이번에도 마찬가지입니다.

(5) cancolumnchange 
- 데이터셋의 컬럼 값이 변경되기 전에 발생하는 이벤트
- 값이 변경하려는 시도에 대해 값을 변경하기 전에 이벤트를 발생시킵니다.
- 정합성 체크등을 하고 문제가 있다면 false 를 리턴해서 변경을 무효화시킬 수 있습니다.


(6) oncolumnchanged 
- 데이터셋의 컬럼값이 변경된 후에 발생하는 이벤트
- setColumn 메소드 호출시 발생하게 됩니다. cancolumnchange 이벤트와 짝으로 동작하네요.
이벤트는 다르지만 동일하게 DSColChangeEventInfo를 사용하고 담겨진 내용도 다르지 않습니다.


데이터셋의 rowposition 를 바로 변경하게 되면 아래와 같이 이벤트가 발생합니다.
canrowposchange > onrowposchanged > onvaluechanged

(7) canrowposchange 
- 데이터셋의 Row 포지션이 변경되기 전에 발생
- addRow, appendData, filter, deleteRow, clear 과 같이 현재 Row 포지션이 변경되는 경우 이벤트가 발생합니다.
cancolumnchange 와 마찬가지로 false 를 리턴하면 더 이상 이벤트가 진행되지 않습니다.

데이터셋에서 deleteRow() 메소드를 실행하면 아래와 같이 이벤트가 발생합니다.
onrowsetchanged > onrowsetchanged > canrowposchange > onrowposchanged > onvaluechanged

흥미로운 것은 onrowsetchanged 이벤트가 2번 발생한다는 것인데
다른 값은 동일하고 reason이 다르네요.
첫 번째는 40 (데이터셋 Row 상태 변경)이고
두 번째는 20 (데이터셋 Row 삭제)가 처리됩니다.

데이터셋에서 addRow() 메소드를 실행하면 아래와 같이 이벤트가 발생합니다.
onrowsetchanged > canrowposchange > onrowposchanged > onvaluechanged

이때는 onrowsetchanged 이벤트에서 reason 값이 12가 됩니다.
상태 변경 없이 바로 추가로 처리되네요.

* 이전 마이플랫폼에서는 데이터셋에 FireEvent 라는 속성이 있었는데 엑스플랫폼에서는 enableevent가 동일한 기능을 제공합니다. 마지막 예제에서는 enableevent 가 true 가 되면서 onrowsetchanged 이벤트가 발생합니다.

http://cafe.naver.com/xplatform101/192 
XPLATFORM 101

- Dataset > Coding Control


제목은 Coding Control 이지만 메소드에 대한 설명입니다.

(1) getSum()
- 데이터셋의 요청된 범위에 지정된 값 또는 계산식의 합
- 컬럼 아이디, 시작 Row, 마지막 Row
- Int, Float, BigDecimal Type에서만 계산이 가능합니다. 그 외의 경우에는 0으로 처리

(2) getCaseSum()
- getSum()과 유사하지만 조건식이 첫번째 인자값에 추가된다는 점이 다름
ds.getSum("col1 > '4' ? col1 : 0")
이나
ds.getCaseSum("col1 > '4'", "col1")
는 같다는 이야기입니다.

(3) rowposition
- 현재의 Row를 지정하거나 반환하는 속성입니다.

(4) getRowCount()
- 데이터셋의 Row 수를 얻어오는 메소드입니다.
- 삭제, 필터링된 데이터는 제외합니다.

(5) getColumn()
- 지정된 Row의 컬럼 값을 구하는 메소드입니다.
- Row 위치, Column 인덱스 또는 Column 아이디로 찾을 수 있습니다.
- 지정된 컬럼이 없으면 undefined 를 반환합니다.

(6) setColumn()
- 지정된 Row의 컬럼 값을 지정하는 메소드입니다.
- getColumn()과 마찬가지로 Row 위치, Column 인덱스 또는 Column 아이디로 찾아서 값을 지정합니다.
- 이때 발생하는 이벤트는 cancolumnchange (return = true) → oncolumnchanged 순으로 진행되는데
데이터 처리 방식에 따라 어느 부분에서 처리를 할지 고민해야 하더군요.
- 이미 마이플랫폼 시절에도 해당 이벤트 처리에 대한 고민이 많았기 때문에
해당 내용을 참고하세요.

(7) findRowExpr()
- 주어진 조건식을 만족하는 첫번째 행의 index 를 반환합니다.
- 검색을 시작할 위치를 지정할 수 있기 때문에 약간만 손대면 다음,다음 검색위치를 찾을 수 있겠죠.

(8) findRow()
- 주어간 값과 일치하는 첫번째 index 를 반환합니다.
- findRowExpr()과 크게 다르지 않겠죠.

(9) appendData()
- 이름에서 알 수 있듯이 2개의 데이터셋이 합쳐지는 거네요.
- 추가하면서 몇가지 옵션이 있는데
bCheckCol 값이 true이면 같은 컬럼 ID만 추가됩니다.
Dataset00.appendData(Dataset01,true);
(10) clearData()
- 데이터셋에서 Column 정보를 제외한 모든 Row를 제거합니다.
- 실질적으로 제거하는 것이기 때문에 복구가 되지 않습니다.

(11) deleteAll()
- clearData()와 마찬가지로 Row를 삭제합니다.
- 데이터셋의 updatecontrol 속성이 true(기본값)일 경우에는 삭제는 되지만 삭제된 ROW 타입을 변경해 보관해둡니다.
- 가질 수 있는 RowType은 다음과 같습니다.
Dataset.ROWTYPE_EMPTY / 0 존재하지 않는 Row 상태 
Dataset.ROWTYPE_NORMAL / 1 초기 Row 상태 
Dataset.ROWTYPE_INSERT / 2 추가된 Row 상태 
Dataset.ROWTYPE_UPDATE / 4 수정된 Row 상태 
Dataset.ROWTYPE_DELETE / 8 삭제된 Row 상태 
Dataset.ROWTYPE_GROUP / 16 Group 정보 Row 상태 

(12) copyData()
- 데이터셋의 Row 데이터를 복사하는 것이라고 하는데...
덮어쓰기라고 표현해야 맞는게 아닌가 싶습니다.
- 대신 컬럼 ID가 일치하는 부분만 적용됩니다.

(13) mergeData()
- 지정된 데이터셋을 통합하는 메소드입니다.
- 그럼 앞에 있는 appendData()와 같은 것 같은데..
- 옵션이 없는 appendData() 정도라고 하면 될지 모르겠네요.

(14) applyChange()
- RowType을 초기 ROW 상태로 변환합니다.
- 해당 상수값을 보여줍니다.

(15) getDeletedRowCount()
- 삭제된 Row 수를 구하는 Method 입니다.

(16) getRowType()
- 지정된 Row의 타입을 구합니다.

(17) getOrgColumn()
- 지정된 Row, Column의 변경전 값을 구합니다.
- ROWTYPE이 NORMAL이면 현재값을 반환합니다.
- 새로운 컬럼을 추가한 경우에는 undefined가 됩니다.
- 업데이트를 몇번 하더라도 원래의 컬럼값은 apply 하기 전에는 변하지 않습니다.

(18) reset()
- 데이터셋의 Row 데이터를 마지막 상태로 복구합니다.
- 중간에 apply 가 되었다면 최초 데이터로 복구하는 것은 아닙니다.

http://cafe.naver.com/xplatform101/190 
XPLATFORM 101

- Dataset > Column Info


컬럼 정보를 가져오는 부분입니다.
소스를 먼저 보겠습니다.

for (var i = 0; i < Dataset00.getColCount(); i++) {
var objColInfo = Dataset00.getColumnInfo(i);
strText += "ID = " + objColInfo.name;
strText += " SIZE = " + objColInfo.size;
strText += " type = " + objColInfo.type;
strText += "\n";
}

getColumnInfo() 메소드는 ColumnInfo 객체를 반환해줍니다. 해당 객체에는 name, size, type 정보를 가지고 있습니다.
또 각각의 속성은 읽어오거나 지정할 수 있습니다.
그래서 해당 예제와 같이 동적으로 컬럼의 정보를 바꿀 수 있습니다.

* 데이터셋에 컬럼을 추가하는 경우에는 addColumn()이나 addColumnInfo() 메소드를 사용합니다.
전자는 id, type, size 를 지정하는 형식이고 후자는 columninfo 값을 활용하는 형식입니다.
중복된 id를 사용하게 되면 둘 다 실패하게 됩니다.

http://cafe.naver.com/xplatform101/189