>>validation check
Editbox에 OnChanged 이벤트를 줬을 때 직접 변경하면 이벤트가 뜨지만
바인딩이 되어있더라도 Dataset을 강제로 바꾸면 해당 컴포넌트의 OnChanged 이벤트 뜨지않아.
이렇기 때문에 주로 Dataset에 이벤트(OnColumnChanged)를 걸어야돼.
validation check 줄 때도 주로 Dataset에 이벤트를 줘.
CanColumnChanged : 바꿀 수 있나요.. 물어보는거지.
바뀌전에 뜨고 바뀌고 나서 OnColumnChanged가 떠.
바꾸기 전에 CanColumnChanged이 뜨고 바꾸고 나서 OnColumnChanged이벤트가 떠.
그러니까
CanColumnChanged는 바꿀 수 있나요.. 물어보는거지.
여기에 return true;를 주면 값이 바뀌고 return false;를 주면 값이 바뀌지 않아.
이걸 어디다 쓸까.. 예
-. Grid에서 필수입력항목을 지우고 넘어갔을 때 메세지뿌려주고 원래값 복구할때.
-. validation check해서 유효하지 않을 경우 이전값으로 다시 보여줄 때 쓰지.
function ds_sawon_CanColumnChange(obj,nRow,strColumnID,varOldValue,varNewValue,nPivotIndex)
{
if( strColumnID == "email" )
{
if( length(varNewValue) > 0 &&
indexOf(varNewValue, "@") < 0 )
{
alert("email에는 @가 반드시 입력되어야 합니다.");
return false;
}
else
return true;
}
else if( strColumnID == "name" )
{
if( length(varNewValue) == 0 )
{
alert("성명은 반드시 입력하세요");
return false;
}
else
return true;
}
}
CanRowPosChange : Dataset의 Record Position이 변경되기 전에 발생하는 Event
>>debuging
-. alert 사용
-. TRACE 디버깅 전용함수. Output화면에만 보여줘.
-. line debuging 지원
break point : F9
디버깅 모드 실행 : F6 (menu: Design->Debug Form)
다음라인 : F10
다음 커서로 jump : ctrl+F10
다음 break point로 : F5
값확인 : 마우스로 긁어서 Watch창에 넣거나, 직접 써넣어.
함수 안으로 진입 : F11
디버그 종료 : shift+F5
>>서버에서 데이터 가져오기
Load : 서버에서 데이터를 가져나올 때 쓰는 Method.
function Button0_OnClick(obj)
{
ds_sawon.Load("SvcJsp::base_sawon_sel.jsp?name=");
}
서버쪽 처리할때 첫번째 주의사항.
그룹명에 반드시 Data Group을 사용해야해.
MiPlatform에는 그룹이 두개가 있어.
Application Group
Data Group
직접 Explorer로 보면 http://demo.miplatform.com:8080/edu/service_jsp_U/base_sawon_sel.jsp?name=
jsp로 DB에서 가져온걸 xml로 만들어보내주는거지.
이걸 파싱해서 ds_sawon Dataset을 뭉게고 여기 집어넣어.
여기서 두번째 주의사항.
보낸 column명과 받는 column명이 같아야해. 안그러면 binding에러가 발생.
Xml안에는 쓸 수있는 종류가 변수와 Dataset뿐이야. 하나의 jsp에서 여러개의 변수와 Dataset을 쓸 수 있어.
화면에 쓸 수 있는 종류는 세개
-. Dataset.Load() : 서버로 Dataset을 보낼 수 없고, 받을 때는 하나의 Dataset 밖에 못받아. 기존 Dataset의 Column을 비롯한 Record들은 모두 삭제해.
-. Dataset.Append() : 서버로 Dataset을 쏠 수 없고, 받을 때는 하나의 Dataset밖에 못받아. 기존 Dataset의 마지막 레코드 다음에 추가돼.
-. Transaction() : 여러개의 Dataset을 주고받을 수 있어.
요약하면 Load나 Append는 되도록 쓰지말고, Transaction을 써.
하나의 jsp에서 여러개의 변수와 Dataset을 주고받을 수 있어.
jsp는 샘플설명만.
base_sawon_sel.jsp
>>입력, 삭제
3Tier 코딩. 입력,삭제가 디비에 바로 입력, 삭제되는 것이 아니라 Dataset(화면)에서 한 레코드 추가,삭제지.
입력, 수정, 삭제 각각 한건했다면 저장할 때 한 레코드씩 서버로 보내는 것이 아니야. 이건 최악의 코딩. 3개를 한꺼번에 보내는거지.
저장
function Button3_OnClick(obj)
{
Transaction("save", "SvcJsp::base_sawon_tr.jsp?in_var1=1", "input=ds_sawon:u", "out_ds=output", "in_var2=2", "callback");
alert("TR시작"); // Async통신 여부 확인용
}
Transaction 함수
Transaction(strSvcID,strURL,strInDatasets,strOutDatasets,strArgument,strCallbackFunc);
-. strSvcID : Transaction 이름
-. strURL : URL
-. strInDatasets : 서버에 보낼 Dataset
뒤에가 쏘는쪽, 앞에가 받는쪽.
"input=ds_sawon:u" 받는쪽=쏘는쪽 (화면의 ds_sawon을 쏘는데 서버에서는 이름이 input으로 받는다고. 서버와 화면의 Dataset이름이 달라도 되게 만든거야.)
Option
:u - 건드린 레코드만 추려서 보내라.
:a - 모두 보내라
:n -
여러개의 Dataset을 보낼 경우
"input=ds_sawon:u input1=ds_sawon1:u" 이런식으로 한칸띄고 붙여.
조회할때는 날라가는게 없으니까 "" 하면 되겠지.
-. strOutDatasets : 서버에서 날라오는 Dataset
역시 뒤에가 쏘는쪽, 앞에가 받는쪽.
"out_ds=output" 받는쪽=쏘는쪽 (서버에서 output Dataset을 던진것을 화면의 out_ds으로 쏙 들어가라 )
-. strArgument : 서버로 보내는 변수
"in_var2=2" "변수명=변수값"
날라온 변수처리는 따로있어.
-. strCallbackFunc : callback 함수명을 준다. Transaction의 결과를 돌려줄 Function의 이름.
에러코드 에러메시지 반드시 코딩해야해. 어디다 하지?
바로 밑에다 하면 안기다리니까 안되지.
-. Load의 경우를 먼저 보자.
Test) 조회버튼 클릭
function Button0_OnClick(obj)
{
ds_sawon.Load("SvcJsp::base_sawon_sel.jsp?name="+Edit0.Text);
alert("조회");
}
alert먼저 뜨고 데이터 나중에 나와. Load요청하고 바로 아래로 내려오는것같지.
이렇게 달라고 요청하고 안기다리는 통신방식 : Async통신방식(비동기통신)
MiPlatform은 Async, Sync 둘 다 지원하는데 default는 Async.
Load는 Dataset의 method야.
Dataset은 컴포넌트지. 컴포넌트는 Property,Method,Event가 있잖아.
Dataset의 이벤트(OnLoadCompleted)에 에러코드처리해줘야해.
서버에서 데이터가 날라올때 nReason는 값은 0이야.
function ds_sawon_OnLoadCompleted(obj,nErrorCode,strErrorMsg,nReason)
{
if( nReason == 0) //서버에서 날라온거면
{
if( nErrorCode < 0 )
alert(strErrorMsg);
}
}
-. Transaction의 경우는 어떻게 하지?
Trainsaction은 함수야. 함수에 Event가 있을 수 없잖아. 에러처리를 어디다 하지?
이때 Callback함수를 사용하는거야.
서버에 요청을 보내고 진짜로 안기다리는게 아니라 내부에서 기다리고 있다가
서버에서 응답이 오면 strCallbackFunc에 써놓은 callback함수를 호출하는 거지.
// CallBack함수 처리
var out_var;
function callback( trid, ErrorCode, ErrorMsg )
{
if( trid == "save" )
{
if( ErrorCode < 0 )
alert("저장 실패 : " + ErrorMsg); // 실패시 Messasge처리
else
alert("저장 완료!!!" + "out_var=" + out_var ); // 성공시 Message 처리
alert(global.http.SendHttpStr);
}
else if( trid == "code_sel" )
{
if( ErrorCode < 0 )
alert("코드조회 실패 : " + ErrorMsg);
}
}
위에서 보듯 Tracsaction에 걸려있는 callback함수의 argument는 세개로 고정되있어(순서도).
trid : transaction의 이름,
ErrorCode : 에러코드
ErrorMsg : 에러메세지
하나의 요청이 처리된 후 다음 처리해야할 경우 Async로 처리하면 Callback함수에 다음꺼 처리하고.. 복잡해져. 이럴경우에는 Sync방식으로 처리해.
서버에서 오는건 explorer에서 url쳐서 볼수 있지만 날라가는건 어떻게 생겼을까?
실제 서버로 날라가는 http통신 프로토콜을 한번 볼까?
alert(global.http.SendHttpStr);
Transaction밑에 쓰면 안되고 callback함수에 써야해.
global : 화면에서 startXml에 있는것들에 접근할때 사용하는 Object
>>서버쪽 처리
base_sawon_tr.jsp
추가,수정,삭제한거에 대한 눈에 안보이는 flag컬럼(rowtype)이 기본적으로 Dataset에 있어. 구분할 필요없어.
Dataset외에 OrgBuffer가 있어 update의 경우 이전 데이터도 이전 데이터도 보낼 수 있다.
사용자의 요구에 의해 업데이트한 항목, 새로 입력한 항목을 각각 다른색으로 표시하게 할 수 있어.
Dataset에서 눈에 안보이는 영역에 접근하는 Method가 있어.
GetDel.. : Delete Buffer의 내용을 꺼내려 할 때.
GetOrg.. : 수정한 셀의 원래 내용을 꺼내려 할 때.
GetRowType: 레코드 상태정보를 꺼내려 할때
날라오는 변수 처리방법.
함수밖에 out_var라고 똑같은 이름의 변수를 선언만 해놓으면 자동으로 담겨.
var out_var;
보통 유저ID등 공통변수들은 변수데이터셋을 만들어 Transaction 할 때마다 무조건 쐈다 받았다 해.
여러변수가 날라오는 경우는 아주 특이한 케이스야.
ErrorCode, ErrorMsg는 반드시 이 변수명으로 보내야 우리가 지정한 callback함수에서 받아. 예약변수야.
0이상이면 성공이고, 음수는 실패야. 에러코드 테이블은 없어.
Dataset의 OnError이벤트 : ErrorCode가 음수값이 넘어왔을때 발생.
>>서버단 속도문제
조회 전에 아래항목의 부서,직급 가져오기.
이벤트를 form에 걸어줬어. OnLoadCompleted (화면 로딩이 완료되면 발생하는 이벤트)
function form_OnLoadCompleted(obj)
{
Transaction( "code_sel", "SvcJsp::base_code_sel.jsp", "", "ds_dept=ds_dept ds_jikgup=ds_jikgup", "", "callback");
/*
ds_dept.Load("....");
ds_jikgup.Load("....");
*/
}
Transaction으로 두개 한번에 가져오는게 빠를까 Load두번에 각각 가져오는게 빠를까? 당연히 한방에 두개 가져오는게 빠르겠지.
간단하니까 코드성조회는 Load로 가자고 했을때. 보통 한화면에 코드성이 한두개가 아니야. 그럼 화면 치명적으로 느려.
Load는 그냥 잊어버려.
>>생산성문제
Dataset생성시 column 주구장창 만들건가..
base_code_sel.jsp Rs2Ds같은 함수만들어 쓰면 편하겠지.
더 줄여볼까.
실전에서 jsp안짜는 프로젝트도 많아.
공통서블릿하나를 잘 만들어놓으면 거의 안짜도 된다고..
즉, 쿼리문 같은 거 직접 넣지말고 비지니스로직 분리하고 공통서블릿을 만들어 처리해라..
'MiPlatform' 카테고리의 다른 글
MiPlatform - Chapter6. Component별 주요기능(2-1) (0) | 2012.08.07 |
---|---|
MiPlatform - Chapter6. Component별 주요기능(1) (0) | 2012.08.07 |
MiPlatform - Chapter5. 상세환경설정(StartXML) (0) | 2012.08.03 |
MiPlatform - Chapter3. 기본 화면개발 (0) | 2012.08.02 |
MiPlatform - Chapter2. 기본 개발환경 설정 (0) | 2012.08.01 |