본문 바로가기

Frontend/Nexacro

[넥사크로] 화면 CRUD 처리

반응형

1 - 1. 화면 조회 이벤트 스크립트

// Retrieve Event
this.fn_retrieve = function(obj:nexacro.Button, e:nexacro.ClickEventInfo){
var sDeptCd = this.div_search.form.edt_dept_cd.value;
this.transaction("svcSelect"
,"SvcURL::select_emp.jsp?sDept="+sDeptCd
,""
,"ds_emp = out_emp"
,""
,"fn_callback");
};

 

// Async Result callback
this.fn_callback = function(scvId, errCD, errMSG){
if(errDC < 0){
this.alert("Error : " + errMSG);
return;
}
if(svcID == "svcSelect"){
this.alart("Retrieve Success!");
}
}

 

cf) 트랜젝션 처리

1 - 2. 조회 서비스 페이지(JSP) 작성

...
// package import
<%@ page import = "com.nexacro17.xapi.data.*" %>
<%@ page import="com.nexacro17.xapi.tx.*" %>
...
// get으로 온 변수 받음
String sDept = request.getParameter("sDept");
...
// 조회 결과 보낼 PlatformData(데이터 송수신 기본 단위)생성
PlatformData out_pData = new PlatformData();
...

--------------------------------------------------------------------

// DB설정 정보 작성
Class.forName("org.sqlite.JDBC");
conn = DriverManager.getConnection("jdbc:sqlite:...."); 

--------------------------------------------------------------------

...
// SQL문 작성
String SQL;
SQL = "SELECT EMPL_ID        \n" +
        "         , FULL_NAME    \n" +
        "         , DEPT_CD        \n" +
        "         , POS_CD          \n" +
        "         , GENDER         \n" +
        "         , HIRE_DATE      \n" +
        "         , MARRIED        \n" +
        "         , SALARY          \n" +
        "         , MEMO           \n" +
        "    FROM TB_EMP        \n" +
        "    WHERE 1=1           \n" ;
if(sDept != null && sDept.length() != 0 && !sDept.equals("undefined")){
    SQL += "AND DEPT_CD = '" + sDept + "'";
}
SQL += " ORDER BY DEPT_CD, EMPL_NAME";
// 결과를 ResultSet 객체로 반환
rs = stmt.executeQuery(SQL);
...
// ResultSet데이터 Dataset 형태로 변환
DataSet ds = new DataSet("out_emp");
ds.addColumn("EMPL_ID" ,DataTypes.STRING ,(short)10 );
ds.addColumn("FULL_NAME" ,DataTypes.STRING ,(short)50 );
ds.addColumn("DEPT_CD" ,DataTypes.STRING ,(short)10 );
ds.addColumn("POS_CD" ,DataTypes.STRING ,(short)10 );
ds.addColumn("GENDER" ,DataTypes.STRING ,(short)10 );
ds.addColumn("HIRE_DATE" ,DataTypes.DATE ,(short)10 );
ds.addColumn("MARRIED" ,DataTypes.STRING ,(short)10 );
ds.addColumn("SALARY" ,DataTypes.INT ,(short)10 );
ds.addColumn("MEMO" ,DataTypes.STRING ,(short)10 );
while(rs.next())
{
    int row = ds.newRow();
    ds.set(row ,"EMPL_ID" ,rs.getString("EMPL_ID") );
    ds.set(row ,"FULL_NAME" ,rs.getString("FULL_NAME"));
    ds.set(row ,"DEPT_CD" ,rs.getString("DEPT_CD") );
    ds.set(row ,"POS_CD" ,rs.getString("POS_CD") );
    ds.set(row ,"GENDER" ,rs.getString("GENDER") );
    ds.set(row ,"HIRE_DATE" ,rs.getString("HIRE_DATE"));
    ds.set(row ,"MARRIED" ,rs.getString("MARRIED") );
    ds.set(row ,"SALARY" ,rs.getString("SALARY") );
    ds.set(row ,"MEMO" ,rs.getString("MEMO") );
}
...
// Dataset을 PlatformData에 추가
out_pData.addDataSet(ds);
...
// PlatformData에 에러를 체크할 변수 추가
VariableList varList = out_pData.getVariableList();
varList.add("ErrorCode", nErrorCode);
varList.add("ErrorMsg" , strErrorMsg);
...
// PlatformData 클라이언트 화면으로 전송
HttpPlatformResponse pRes = new HttpPlatformResponse(response
                                                                        , PlatformType.CONTENT_TYPE_XML
                                                                        , "UTF-8");
pRes.setData(out_pData);
pRes.sendData();
...

주의사항 : 동일 출처 정책(Same Origin Policy 주의)

 

2. 화면 입력 이벤트 스크립트

this.fn_add = function(obj:nexacro.Button,e:nexacro.ClickEventInfo){
    // Dataset의 마지막 row에 새로운 row를 추가
    this.ds_emp.addRow();
    // Dataset의 원하는 위치에 새로운 row를 추가
    // insertRow();
 
    // 추가한 row의 입사일자 컬럼에 오늘 일자를 초기값으로 설정
    this.ds_emp.setColumn(this.ds_emp.rowposition, "HIRE_DATE", this.fn_today());
};
// 자바스크립트를 이용하여 오늘 일자 계산
this.fn_today = function(){
    var objDate = new Date();
    var sToday = objDate.getFullYear().toString();
    sToday += (objDate.getMonth()+1).toString().padLeft(2, "0")
    sToday += objDate.getDate().toString().padLeft(2, "0");
    return sToday;
};
 

3. 화면 삭제 이벤트 스크립트

this.fn_delete = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
    // 선택되어 있는 row를 삭제
    this.ds_emp.deleteRow(this.ds_emp.rowposition);
};
 

4 - 1. 화면 저장 이벤트 스크립트

this.fn_save = function(obj:nexacro.Button,e:nexacro.ClickEventInfo){
    var sTitle = nexacro.wrapQuote(this.titletext);
    this.transaction("svcSave"
                    ,"SvcURL::save_emp.jsp"
                    ,"in_emp=ds_emp:u"
                    ,""
                    ,"in_var1="+sTitle
                    ,"fn_callback");
};
// callback 메서드 수정
this.fn_callback = function(svcID, errCD, errMSG)
{
    if(errCD < 0){
    this.alert("Error: " + errMSG);
    return;
    }
    if(svcID == "svcSelect"){
        this.alert("Retrieve Success!!!");
    }else if(svcID == "svcSave"){
        this.alert("Save Success!!!");
    }
}
 

4 - 2. 저장 서비스 페이지(JSP) 작성

// package import
<%@ page import="com.nexacro17.xapi.data.*" %>
<%@ page import="com.nexacro17.xapi.tx.*" %>
// 전송된 Dataset에서 컬럼에 해당하는 값을 추출
public String dsGet(DataSet ds, int rowno, String colid) throws Exception{
    String value;
    value = ds.getString(rowno,colid);
    if( value == null ){
        return "";
    }else{
        return value;
    }
}
//HttpServletRequest를 이용하여 HttpPlatformRequest 생성하고 전송된 XML 데이터를 분석
HttpPlatformRequest pReq = new HttpPlatformRequest(request);
pReq.receiveData();
// 데이터를 PlatformData 형태로 저장하고 변수와 Dataset을 할당 받음
PlatformData in_pData = pReq.getData();
VariableList in_varList = in_pData.getVariableList();
String sVar1 = in_varList.getString("in_var1");
DataSet ds = in_pData.getDataSet("in_emp");
// 전송된 데이터를 쿼리를 이용하여 DB 테이블에 적용
// 먼저 삭제한 레코드에 대해서 Delete 쿼리를 실행
/******** DELETE ********/
for( i = 0; i < ds.getRemovedRowCount(); i++ ){
    String sEmpID = ds.getRemovedData(i, "EMPL_ID").toString();
    SQL = "DELETE FROM TB_EMP WHERE EMPL_ID = '" + sEmpID + "'";
    stmt.executeUpdate(SQL);
}
// 입력 수정된 레코드에 대해서 쿼리를 실행
/******** INSERT, UPDATE ********/
for( i = 0; i < ds.getRowCount(); i++ ){
    int rowType = ds.getRowType(i);
    if( rowType == DataSet.ROW_TYPE_INSERTED ){
        SQL = "INSERT INTO TB_EMP( EMPL_ID, \n" +    
                 " FULL_NAME, \n" +
                 " DEPT_CD, \n" +
                 " POS_CD, \n" +
                 " GENDER, \n" +
                 " HIRE_DATE, \n" +
                 " MARRIED, \n" +
                 " SALARY, \n" +
                 " MEMO) \n" +
                 " VALUES('" + dsGet(ds, i, "EMPL_ID") + "',\n" +
                 " '" + dsGet(ds, i, "FULL_NAME") + "',\n" +
                 " '" + dsGet(ds, i, "DEPT_CD") + "',\n" +
                 " '" + dsGet(ds, i, "POS_CD") + "',\n" +
                 " '" + dsGet(ds, i, "GENDER") + "',\n" +
                 " '" + dsGet(ds, i, "HIRE_DATE") + "',\n" +
                 " '" + dsGet(ds, i, "MARRIED") + "',\n" +
                 " '" + dsGet(ds, i, "SALARY") + "',\n" +
                 " '" + dsGet(ds, i, "MEMO") + "') ";
    }else if( rowType == DataSet.ROW_TYPE_UPDATED ){
        String sOrgEmpID = ds.getSavedData(i, "EMPL_ID").toString();
        SQL = "UPDATE TB_EMP \n" +
                 " SET EMPL_ID = '" + dsGet(ds, i, "EMPL_ID") + "',\n" +
                 " FULL_NAME = '" + dsGet(ds, i, "FULL_NAME") + "',\n" +
                 " DEPT_CD = '" + dsGet(ds, i, "DEPT_CD") + "',\n" +
                 " POS_CD = '" + dsGet(ds, i, "POS_CD") + "',\n" +
                 " GENDER = '" + dsGet(ds, i, "GENDER") + "',\n" +
                 " HIRE_DATE = '" + dsGet(ds, i, "HIRE_DATE") + "',\n" +
                 " MARRIED = '" + dsGet(ds, i, "MARRIED") + "',\n" +
                 " SALARY = '" + dsGet(ds, i, "SALARY") + "',\n" +
                 " MEMO = '" + dsGet(ds, i, "MEMO") + "' \n" +
                 " WHERE EMPL_ID = '" + sOrgEmpID + "'";
    }
    stmt.executeUpdate(SQL);
}
// 저장 처리 결과를 전송할 PlatformData 생성
PlatformData out_pData = new PlatformData();
// PlatformData에 에러 체크를 할 변수와 화면으로 전송 할 변수를 추가
VariableList out_varList = out_pData.getVariableList();
out_varList.add("ErrorCode", nErrorCode);
out_varList.add("ErrorMsg" , strErrorMsg);
out_varList.add("out_var" , sVar1);
// "ErrorCode"와 "ErrorMsg"는 화면에 작성한 콜백함수의 2번째, 3번째 인자에서 받습니다.
// 필수로 지정하고 전송하셔야 합니다.
// 추가로 지정한 변수는 화면에 동일한 변수명으로 폼변수를 선언하여 받을 수 있습니다.
// PlatformData를 클라이언트 화면으로 전송
HttpPlatformResponse pRes = new HttpPlatformResponse(response
                                                                            , PlatformType.CONTENT_TYPE_XML
                                                                            , "UTF-8");
pRes.setData(out_pData);
pRes.sendData();
 
 

5 - 1 화면 코드조회 이벤트 스크립트

this.Form_onload = function(obj:nexacro.Form,e:nexacro.LoadEventInfo){
    this.transaction("svcCode"
                        ,"SvcURL::select_code.jsp"
                        ,""
                        ,"ds_dept=out_dept ds_pos=out_pos"
                        ,""
                        ,"fn_callback");
};

cf ) 트랜잭션의 3번째(서버로 보내는 데이터셋), 4번째(서버에서 받을 데이터셋) 인자에 빈칸으로 구분을 하여 여러개의 데이터셋을 보내거나 받을 수 있음

 

5 - 2 코드조회 서비스 페이지(JSP) 작성

 
...
// package import
<%@ page import="com.nexacro17.xapi.data.*" %>
<%@ page import="com.nexacro17.xapi.tx.*" %>
...
// JSP 조회 결과 ResultSet을 메타데이터를 이용해 Dataset으로 변환하는 클래스 생성
<%!
// ResultSet ==> Dataset
public DataSet RsToDs(ResultSet rs, String dsID) throws Exception{
    int i;
    int iColCnt;
    String sColName;
    String sColType;;
    int ColType = 0;
    int ColSize = 255;
    DataSet ds = new DataSet(dsID);
    ResultSetMetaData rsmd = rs.getMetaData();
    iColCnt = rsmd.getColumnCount();
    for( i = 1 ; i <= iColCnt ; i++ ){
        sColName = rsmd.getColumnName(i).toUpperCase();
        sColType = rsmd.getColumnTypeName(i);
        ColType = DataTypes.STRING;
        if(sColType.equals("INTEGER")) ColType = DataTypes.INT;
        if(sColType.equals("DECIMAL")) ColType = DataTypes.DECIMAL;
        ds.addColumn(sColName, ColType, ColSize);
    }
    while(rs.next()){
        int row = ds.newRow();
        for( i = 1 ; i <= iColCnt ; i++ ){
            sColName = rsmd.getColumnName(i).toUpperCase();
            ds.set(row, sColName, rsGet(rs, sColName));
        }
    }
    return ds;
}
public String rsGet(ResultSet rs, String id) throws Exception{
    if( rs.getString(id) == null ){
    return "";
    } else {
    return rs.getString(id);
    }
}
%>
...
// 조회 결과를 보낼 PlatformData생성
PlatformData out_pData = new PlatformData();
...
// 쿼리 작성, 실행 후 RsToDs메서드 호출하여 PlatformData에 추가
String SQL;
SQL = " SELECT DEPT_CD, DEPT_NAME FROM TB_DEPT";
rs = stmt.executeQuery(SQL);
out_pData.addDataSet(RsToDs(rs,"out_dept"));
SQL = " SELECT POS_CD, POS_NAME FROM TB_POS";
rs = stmt.executeQuery(SQL);
out_pData.addDataSet(RsToDs(rs,"out_pos"));
...
// PlatformData에 에러 체크할 변수 추가
VariableList varList = out_pData.getVariableList();
varList.add("ErrorCode", nErrorCode);
varList.add("ErrorMsg" , strErrorMsg);
...
// PlatformData를 클라이언트 화면으로 전송
HttpPlatformResponse pRes = new HttpPlatformResponse(response
                                                                            , PlatformType.CONTENT_TYPE_XML
                                                                            , "UTF-8");
pRes.setData(out_pData);
pRes.sendData();
...
 
 
반응형