관계도
Application 실행환경에서 각 Application, frame, child, form 등의 접근방법에 대해 기술합니다.
해당 내용에 대해서는 실제 동작방법을 실행해 보시면 설명에 대한 이해를 도와 줄 수 있습니다.
간략설명
Top Frame 설명
TopFrame영역에서 ChildFrame의 폼을 접근할 수 있습니다. function 및 값 접근이 가능합니다.
Left Frame 설명
LeftFrame영역에서 TopFrame, ChildFrame영역의 폼 접근이 가능합니다. function 및 값 접근이 가능합니다.
ChildFrame
form 1, 2
TopFrame, LeftFrame 및 다른 폼의 function, 값 접근이 가능합니다.
각 폼간의 함수 및 값 참조가 가능한가요?
Sample Application 실행
http://www.xplatform.co.kr/Next_JSP/nexacro/Application_Etc/Application_sample/index.jsp
소스 위치
- Sample\Application_Etc\Application_sample
테이터 통신
통신 관련한 내용의 확인 및 제어하는 방법을 제시합니다.
관련 메소드
transaction
Dataset의 값을 갱신하기 위한 서비스를 호출하고, 작업이 완료되면 콜백함수을 수행하는 메소드입니다.
Transaction은 기본적으로 비동기 형태로 동작합니다.
동기방식 : 스크립트 호출 후 결과가 끝날때 까지 기다린 후 다음 스크립트를 실행합니다 .
비동기 방식 : 스크립트 호출 후 리턴 결과가 오지 않아도 다음 라인의 스크립트를 실행합니다.
서비스 작성시 URL주소는 PreFix를 사용
ex) application.transaction( "MyService01" ,"DataSrv::samplexml.jsp","input1=Dataset02","Dataset03=output1","a=b","callbackFunction");
transaction시 사용하는 DataSrv(Prefix)는 서버이전 및 Cache기능을 사용하기 위해 반드시
사용을 권장하며 DataSrv(Prefix)를 사용하지 않고 서비스 URL를 직접 기술하는 경우
유지보수에 어려움이 발생하므로 반드시 Prefix를 사용합니다.
DataSrv(Prefix) : 개발자 임의 정의하여 사용하며 해당 설정파일은 TypeDefinition에서 정의가
가능합니다.
서버환경정보가 변경이 될 예정입니다. (도메인 정보, IP 등)
이런 경우 어떠한 작업이 필요합니까?
HTTP 에러코드 확인하기
ADL의 onerror이벤트에서 확인방법
Project의 ADL 이벤트 중 onerror 이벤트를 이용하여 서버와 통신시 HTTP 에러를 확인 할 수 있습니다.
function application_onerror(obj:Object, e:ErrorEventInfo) { trace("application_onerror" + "\n errorcode=" + e.errorcode + "\n errormsg=" + e.errormsg + "\n requesturi=" + e.requesturi + "\n statuscode=" + e.statuscode); ...중략... }
참고사항
- e.errorcode
오류코드를 반환한다.
- e.errormsg
오류메시지를 반환한다.
- e.requesturi
오류가 발생한 URI를 나타낸다.
- e.statuscode
HTTP통신 중 에러 발생시 상태 코드를 나타낸다.
에러코드, HTTP 에러
Transaction의 Callback 함수에서 확인방법
폼에서 서비스를 통해 데이타를 받는 방법으로 Transaction메소드를 사용하게 됩니다. 이때 서비스를 호출 후 정상적으로 처리가 되었는지를 체크하기 위해 callback함수를 호출합니다. 호출된 callback함수에서 파라미터를 이용하여 오류처리를 할 수 있습니다.
this.fn_callback = function(serviceID, errCD, errMSG) { if(errCD < 0) { this.alert("Error MSG" + errCD + "==" + errMSG); } }
ErrorCode의 의미는 아래와 같습니다.
0 : 정상
0보다 작은 경우 : 오류
0보다 큰 경우 경고
에러코드, HTTP 에러
참고사항
Transaction호출 후 기본변수 이외에 추가로 변수를 받는 방법
Transaction시 기본 ErrorCode, ErrorMsg변수 이외에 개발자 정의한 변수를 받을 수 있습니다.
넥사크로플랫폼 소스)
this.parm1 = ""; this.parm2 = null; this.parm3; this.Button00_onclick = function(obj:Button, e:nexacro.ClickEventInfo) { this.transaction("test","http://IP//say_test.jsp","","Dataset00=Dataset00","","fn_search_after"); } this.fn_search_after = function(obj:Button, e:nexacro.ClickEventInfo) { trace(this.parm1); trace(this.parm2); trace(this.parm3); }
this.parm1 = “”; 을 선언 하신뒤 서비스(java/jsp)단 에서 VariableList에 값을 넣어 보내 주면 콜백단에서 받을 수 있습니다.
주의사항은 변수 선언시 this.parm1 = "“; 이와 같이 하지 않고
null 이나 변수만 선언 한 경우에는 받지 못하게 됩니다.
이미지 와 같이 처음 쌍따옴표로 초기화한 변수는 트랜젝션 콜백에서 받을 수 있지만.
선언만 해놓고나 null 로 초기화 한 변수는 받지 못하는 걸 볼 수 있습니다
서비스 소스)
... 중략 VariableList varList = o_xpData.getVariableList(); // VariableList에 값을 직접 추가 varList.add("ErrorCode", "200"); varList.add("ErrorMsg", ""); varList.add("parm1", "test1"); varList.add("parm2", "test2"); varList.add("parm3", "test3"); out.clear();
데이타 조회
조회건수 설정
서비스(JSP/JAVA 등)를 통해 조회할 건수를 설정합니다.
통신타입(Response Type)
서비스(JSP/JAVA 등)를 전송 받을 데이터의 통신타입을 설정합니다. 기본적으로 XML, SSV, 바이너리 통신이 지원됩니다. (제품버전에 따라 달라질 수 있음)
HTML5버전의 경우 XML, SSV가 기본 통신방식으로 지원됩니다.
compress 설정
서비스(JSP/JAVA 등)를 전송 받을 데이타에 대해 압축여부를 설정합니다. 압축을 하게 되면 SSV 데이터를 gzip형태로 압축하여 전송이 가능합니다.
전송할 데이타를 압축하게 되면 통신구간의 데이타 사이즈는 줄어들 수 있으나
서비스를 제공하는 서비스는 압축을 위한 리소스가 필요합니다.
주요 소스 내용
var sStartTime; var serviceURL = "Svc::Service_Default.jsp"; this.Button00_onclick = function(obj:Button, e:nexacro.ClickEventInfo) { this.ds_data.clearData(); var objDate = new Date(); sStartTime = objDate.getTime(); this.mk_time.set_value(0); this.mk_cnt.set_value(0); var arg = "row_cnt=" + this.rdCount.value + " type=" + this.comType.value + " compress=" + this.ckCompress.value; this.transaction("select",serviceURL,"","ds_data=output",arg,"fn_callback"); } this.fn_callback = function(serviceID, errCD, errMSG) { if(errCD < 0) { this.alert(serviceID + "==" + errCD + "==" + errMSG); }else{ var objDate = new Date(); this.mk_time.set_value(Math.floor((objDate.getTime()-sStartTime)/1000,1) ); this.mk_cnt.set_value(this.ds_data.rowcount); } } this.form01_onload = function(obj:Form, e:nexacro.LoadEventInfo) { this.comType.set_value("XML"); this.ckCompress.set_enable(false); } this.comType_onitemchanged = function(obj:Combo, e:nexacro.ItemChangeEventInfo) { if(e.postvalue == 'SSV') { this.ckCompress.set_enable(true); } else { this.ckCompress.set_enable(false); } }
서비스 호출시 사용하는 Svc::는 TypeDefinition에서 정의한 prefix입니다.
서비스 샘플소스 (Service_Default.jsp)
<%@ page contentType="text/html; charset=euc-kr" %><%@ page language="java"%><%@ page import = "java.io.*" %><%@ page import = "java.util.*" %><%@ page import = "java.util.zip.*" %><%@ page import="com.nexacro.xapi.tx.*" %><%@ page import="com.nexacro.xapi.data.*" %><%@ page import="com.nexacro.xapi.data.datatype.*" %><% out.clear(); String strCharset = "euc-kr"; PlatformRequest platformRequest = new PlatformRequest(request.getInputStream(), PlatformType.CONTENT_TYPE_XML, strCharset); platformRequest.receiveData(); PlatformData inPD = platformRequest.getData(); VariableList inVariableList = inPD.getVariableList(); DataSetList inDataSetList = inPD.getDataSetList(); String row_cnt = inVariableList.getString("row_cnt"); String type = inVariableList.getString("type"); String compress = inVariableList.getString("compress"); if(row_cnt==null || row_cnt.equals("")) row_cnt = "3"; if(type==null || row_cnt.equals("")) type = "XML"; if(compress==null || compress.equals("")) compress = "false"; PlatformData outPD = platformRequest.getData(); VariableList outVariableList = new VariableList(); DataSetList outDataSetList = new DataSetList(); GZIPOutputStream gzipOut = null; DataSet outDataSet = null; try { outDataSet = new DataSet("output"); outDataSet.addColumn("SEQ", DataTypes.STRING, 5); outDataSet.addColumn("ADDRESS", DataTypes.STRING, 100); outDataSet.addColumn("NAME", DataTypes.STRING, 100); outDataSet.addColumn("HOMEPAGE", DataTypes.STRING, 100); outDataSet.addColumn("TECHHOMEPAGE",DataTypes.STRING, 100); int nRow; for(int i = 1; i <= Integer.parseInt(row_cnt); i++) { nRow = outDataSet.newRow(); outDataSet.set(nRow, "SEQ", i); outDataSet.set(nRow, "ADDRESS", "5F INTOPS Building, 108-7 Samsung-Dong, Gangnam-Gu"); outDataSet.set(nRow, "NAME", "TOBESOFT Col,Ltd"); outDataSet.set(nRow, "HOMEPAGE", "www.tobesoft.com"); outDataSet.set(nRow, "TECHHOMEPAGE", "www.xplatform.com"); } outDataSetList.add(outDataSet); outVariableList.add("ErrorCode", 0); outVariableList.add("ErrorMsg", "SUCCESS"); outVariableList.add("strOutputData", "※ Output Vairable을 받으려면, 화면의 전역변수로 선언하면 됩니다."); } catch(Exception e) { outVariableList.add("ErrorCode", -1); outVariableList.add("ErrorMsg", e.toString()); } finally { outPD.setDataSetList(outDataSetList); outPD.setVariableList(outVariableList); String Contents_type; if(type.equals("SSV")) { Contents_type = PlatformType.CONTENT_TYPE_SSV; } else if(type.equals("XML")) { Contents_type = PlatformType.CONTENT_TYPE_XML; } else { Contents_type = PlatformType.CONTENT_TYPE_XML; } if(compress.equals("true")) { response.setHeader("Accept-Encoding", "gzip, deflate"); response.setHeader("X-Compression", "gzip"); response.setHeader("Content-Encoding", "gzip"); response.setHeader("Content-Type", "text/xml"); String RS = String.valueOf((char) 0x1e); //rs(record seperator) String US = String.valueOf((char) 0x1f); //us(unit seperator) StringBuffer sb = new StringBuffer(); sb.append("SSV:").append("euc-kr").append(RS); //헤더의 처음 4바이트는 "SSV"로 시작(53 53 56) VariableList varLstOut = new VariableList(); varLstOut.add("ErrorCode", 0); varLstOut.add("ErrorMsg", "Success!!!!"); if(varLstOut != null) { int size = varLstOut.size(); for(int i=0; i<size; i++) { //Type 생략시 STRING 으로 고정 Variable var = varLstOut.get(i); sb.append(var.getName()).append("=").append(var.getString()); //각 Variable 은 US 로 구분 if(i<size-1) { sb.append(US); } } sb.append(RS); } sb.append("Dataset:").append("output").append(RS); //데이터셋 생성 sb.append("_RowType_"+US); for(int i=0; i<outDataSet.getColumnCount(); i++) { sb.append(outDataSet.getColumn(i).getName()); sb.append(":String(255)"); if(i<outDataSet.getColumnCount()-1) { sb.append(US); } } sb.append(RS); for(int totCnt=0; totCnt<outDataSet.getRowCount(); totCnt++) { sb.append("N"+US); //"N" is RowType. (N : Normal Record) for(int i=0; i<outDataSet.getColumnCount(); i++) { sb.append(outDataSet.getString(totCnt, i)); //Row Value if(i<outDataSet.getColumnCount()-1) { sb.append(US); } } sb.append(RS); } gzipOut = getGZipOut(new BufferedOutputStream(response.getOutputStream())); try{ flushBuffer(gzipOut, sb); } catch(Exception e) { } if(gzipOut != null) { try { gzipOut.close(); } catch (IOException e) { e.printStackTrace(); } } } else { HttpPlatformResponse res = new HttpPlatformResponse(response, Contents_type, "UTF-8"); res.setData(outPD); res.sendData(); } } %><%! //Respond to Client private void flushBuffer(GZIPOutputStream gzipOut, StringBuffer buff) { try { byte[] arrByteRslt = buff.toString().getBytes(); gzipOut.write(arrByteRslt, 0, arrByteRslt.length); gzipOut.flush(); } catch(Throwable th) { System.out.println("flushBuffer() Exception : "+th.getMessage()); } } private GZIPOutputStream getGZipOut(BufferedOutputStream bous) throws IOException { GZIPOutputStream gzip = new GZIPOutputStream(bous); return gzip; } public PrintWriter getZipWriter(HttpServletResponse response) throws IOException{ short TOBE_COMPRESS_MARK = (short)0xFFAD; response.resetBuffer(); response.setContentType("application/octet-stream"); DataOutputStream ostream = new DataOutputStream(response.getOutputStream()); ostream.writeShort(TOBE_COMPRESS_MARK); DeflaterOutputStream compress = new DeflaterOutputStream(ostream); return new PrintWriter(compress); } %>
- 소스 위치
Sample\Application\np_Transaction_Basic.xfdl
마우스 오른쪽 기능 막는방법
넥사크로플랫폼(nexacro platform)을 웹 브라우저를 통해 실행하는 경우 브라우저 기본기능에서 마우스 오른쪽 클릭을 지원합니다. 이때 기본으로 제공하는 브라우저의 오른쪽 기능을 막는 방법에 대해 설명합니다.
Html페이지의 Body영역에 아래 스크립트를 추가합니다.
해당 HTML페이지는 자동으로 생성 및 변경이 될 수 있으므로 반드시 백업 및 해당 값이 존재하는지 확인을 하시기 바랍니다.
웹 브라우저에서 기본으로 제공하는 마우스 오른쪽 클릭 기능을 막을 수 있나요?
httptimeout / httpretry설정
httptimeout
Http통신시 Wait Time(초)를 설정하는 Property입니다.
httptimeout 속성값의 기본값은 30초 입니다.
통신시 결과값을 받을 동안 대기하는 시간을 의미 합니다.
0 보다 큰수를 지원하며, 0 을 입력한 경우 무한대기 입니다.
HTML5의 경우 동기 모드 통신을 할 때에는 오류발생으로 인해 httptimeout이 적용되지 않습니다
usehttpkeepalive Property가 true로 설정된 경우에는 KeepAlive시 Wait Time으로 사용됩니다. usehttpkeepalive Property가 false인경우에는 Http 통신시 Wait Time으로 사용됩니다.
서비스 호출 후 timeout시간 동안 결과를 받지 못하는 경우 에러처리
지정한 timeout 시간내에 서버에서 결과를 받지 못할 경우 화면단에서는 에러가 발생이 되게 됩니다.
httptimeout 우선순위
timeout값은 아래와 같은 우선 순위에 따라 적용이 됩니다. 1) 스크립트상에서 변경 하였을경우 2) ADL에서 속성값 지정
넥사크로플랫폼에서 timeout값을 충분히 셋팅한 경우에도 에러가 발생이 된다면
방화벽, DB, WAS에 설정된 timeout값을 확인하여야 합니다.
참고사항
데이터 조회, 저장시 데이터 건수가 많을 경우 시간이 오래 걸리게 됩니다. 이 경우 httptimeout값을 충분히 설정을 하여 주어야 합니다. httpretry 값은 0 으로 지정합니다.
httptimeout 설정값이 조호/저장 시간보다 작은경우 오류가 발생하게 됩니다.
httpretry
통신(transaction)시 지정한 httptimeout 시간안에 결과를 받지 못하였을때 재시도 횟수를 지정하는 속성입니다.
httpretry 속성값의 기본값은 3 입니다.
통신시 지정한 httptimeout 시간안에 결과를받지 못하였을때
재시도 횟수를 지정하는 속성입니다.
httpretry값이 지정되어 있을 경우(0보다 큰 경우) 지정한 횟수만큼 재호출을 시도하게 됩니다.
세션처리
넥사크로플랫폼(nexacro platform)에서 세션(쿠키)처리 방법에 대해 설명합니다.
넥사크로플랫폼(nexacro platform)은 global 변수로 정의된 변수의 경우 usecookie 설정 옵션에 따라서 쿠키에 해당 변수를 추가하여 서버로 전송할 수 있습니다.
usecookie설정
서버로 데이터를 호출시 쿠키에 값을 설정하여 전달할 수 있는 방법으로는 GlobalVariables 설정에서 usecookie를 true로 설정해 주게 되면 해당 서비스 호출시 쿠키값으로 함께 전달이 가능합니다.
패킷 프로그램을 이용한 확인
Client와 Server간의 트래픽 상황을 모니터링 할 수 있는 프로그램으로 실제 쿠키에 값이 전달되는 것을 확인할 수 있습니다.
위의 모니터링 프로그램은 Fiddler이라는 프로그램을 사용하여 캡쳐하였습니다.
쿠키에 값을 설정할 수 있습니까?
Prefix 설정
넥사크로플랫폼(nexacro platform)을 개발시 화면 폼에 그룹핑과 서비스 호출을 위한 주소에 대한 Prefix를 설정할 수 있습니다.
Services의 Type에 따라 form, JSP등으로 구분할 수 있으며, form의 경우 화면 폼의 소스 위치를 의미합니다.
type이 JSP인 경우 데이터 조회/저장시 사용하게 되는 서비스 URL경로를 설정할 수 있습니다.
Prefixid 를 하게 되면 서버 환경변화에 따른 대응이 편리합니다.
예를 들어 서비스 URL경로가 IP주소에서 도메인으로 변경이 되는 경우 Prefixid를 사용하지 않는다면 모든 개발소스에서 IP정보를 도메인으로 변경하는 작업을 소스에서 고쳐야 할 것입니다.
그러나 Prefixid를 사용하게 되면 TypeDefinition의 환경파일만 변경해 주면 바로 적용이 가능합니다.
Cache
넥사크로플랫폼(nexacro platform)의 Cache 처리방식은 웹 브라우저의 Cache 설정을 따릅니다.
화면(Form), xjs, 이미지 등 웹을 통해 받아오는 파일에 대한 Cache설정은
웹 브라우저의 [인터넷옵션]-[설정]에 따라 달라질 수 있습니다.
Cookie
Cookie 값 확인하기
nexacro platform HTML5 14가 실행된 환경에서 웹 브라우저의 쿠키 값을 확인하는 방법을 기술합니다.
주요 소스 코드
this.Application_Cookie_onclick = function(obj:Button, e:nexacro.ClickEventInfo) { var arrCookie = window.document.cookie; arrCookie = arrCookie.split(";"); var arrCookie1; this.alert(arrCookie); for(var i=0; i<arrCookie.length; i++) { arrCookie1 = arrCookie[i].split("="); if( arrCookie1[0] == "MenuID" ){ gv_MainForm.set_visible(false); this.gv_Cookie = arrCookie1[1]; } } }
nexacro platform의 GlobalVariables의 usecookie 속성이 ture인 값과
WebBrowser의 cookie값에 담긴 내용을 확인할 수 있습니다.
Cookie값에 대한 테스트 페이지는 아래 URL를 사용하여 실행시 확인할 수 있습니다.
소스 위치
Sample\Application\np_Application_Cookie.xfdl
Cookie 값 설정 및 확인방법
nexacro platform Web browser (기존 html5) 가 실행된 환경에서 웹 브라우저의 쿠키 값을 확인하는 방법을 기술합니다.
주요 소스 코드
Cookie 값 설정
this.setCookie = function(cName, cValue, cDay){ var expire = new Date(); expire.setDate(expire.getDate() + cDay); cookies = cName + '=' + escape(cValue) + '; path=/ '; // 한글 깨짐을 막기위해 escape(cValue)를 합니다. if(typeof cDay != 'undefined') cookies += ';expires=' + expire.toGMTString() + ';'; window.document.cookie = cookies; }
설정된 값 확인
this.getCookie = function (cName) { cName = cName + '='; var cookieData = window.document.cookie; var start = cookieData.indexOf(cName); var cValue = ''; if(start != -1){ start += cName.length; var end = cookieData.indexOf(';', start); if(end == -1)end = cookieData.length; cValue = cookieData.substring(start, end); } return unescape(cValue); }
get방식 받기
get방식의 경우 호출된 URL주소 뒤에 파라메터값 name으로 넘긴 값을 확인 할 수 있으며, name의 명칭은 개발자시 변경할 수 있습니다.
예) support.tobesoft.co.kr/index.html?name=nexacro platform
this.Button04_onclick = function(obj:Button, e:nexacro.ClickEventInfo) { var address = unescape(location.href); var param = ""; if(address.indexOf("name", 0) != -1) { param = address.substring(address.indexOf("name", 0) + 5); } alert(param); }
해당 기능은 Web browser운영방식(기존 HTML5)에서 사용이 가능합니다.
- 소스 위치
Sample\Application\np_Application_Cookie2.xfdl
setPrivateProfile / getPrivateProfile 메소드를 이용한 개인화
setPrivateProfile, getPrivateProfile는 Application에서 개인화를 위해 저장하고, 저장된 데이타를 얻어오는 Method 입니다.
주요 소스 내용
this.Button00_onclick = function(obj:Button, e:nexacro.ClickEventInfo) { var bSucc; bSucc =application.setPrivateProfile("Data", this.Edit00.value); } this.Button01_onclick = function(obj:Button, e:nexacro.ClickEventInfo) { var strValue; strValue = application.getPrivateProfile("Data"); alert(strValue); }
참고사항
setPrivateProfile, getPrivateProfile 메소드는 브라우저에 있는 localStorage를 사용합니다.
Cookie는 유효시간이 존재하며, localStorage는 사용자가 임으로 삭제하지 않는 경우 지워지지 않습니다.
- 소스 위치
Sample\Application\np_PrivateProfile.xfdl
nexacro platform 실행환경
nexacro platform에 대한 실행환경에 대한 정보를 확인할 수 있습니다.
주요 소스 코드
this.Application_environment_onclick = function(obj:Button, e:nexacro.ClickEventInfo) { this.alert(system.navigatorname); }
참고사항
navigatorname
애플리케이션이 실행되는 환경 정보를 반환하는 속성입니다 예) 전용브라우저 : nexacro IE임베드 : nexacro ActiveX 기타 HTML5 : "IE", "Chrome", "Gecko" 등
- 소스 위치
Sample\Application\np_Application_Navigatorname.xfdl
nexacro platform이 실행된 환경정보를 얻을 수 있나요?
Image변경
Loading Image변경방법 (waitingimage )
nexacro platform에서 Data통신을 하기 위해 transaction메소드를 이용하여 서비스를 호출하게 됩니다. 이때 데이타가 조회되는 동안 loading이미지가 표현이 되는데 해당 이미지를 변경하는 방법입니다.
Loading속성을 설정하지 않으면 디폴트 이미지가 표현됩니다.
ADL의 속성 변경방법
변경하고자 하는 Project를 오픈한 후 ADL속성 중 loadingimage속성에 변경하고자 하는 이미지를 설정하시면 됩니다.
경로지정시 웹 경로를 지정해 주시기 바랍니다.
변경 후 이미지
데이타 통신시 디폴트 이미지를 변경하는 방법을 알고싶습니다.
waitingimage를 변경하고 싶습니다.
TypeDefinition
nexacro platform에서 사용하는 환경정보 즉 TypeDefinition에 대해 자주 묻는 내용을 토대로 정리하였습니다.
Services 정보
application.services속성을 통해 services정보를 확인할 수 있습니다.
application.services를 이용한 정보확인
주요 소스 내용
this.Application_Cookie_onclick = function(obj:Button, e:nexacro.ClickEventInfo) { this.dsServices.clearData(); for(var i=0;i<application.services.length;i++) { this.dsServices.addRow(); this.dsServices.setColumn(this.dsServices.rowposition,"prefixid",application.services[i].prefixid); this.dsServices.setColumn(this.dsServices.rowposition,"type",application.services[i].type); this.dsServices.setColumn(this.dsServices.rowposition,"url",application.services[i].url); this.dsServices.setColumn(this.dsServices.rowposition,"cachelevel",application.services[i].cachelevel); } }
참고사항
Services에 값을 변경하고자 하는 경우에는 아래와 같이 사용이 가능합니다.
application.services["Svc"].url= "./Next_JSP/nexacro/Service/";
- 소스 위치
Sample\Application\np_Application_TypeDefinition_Services.xfdl
스크립트에서는 콜렉션(Collection) 방식으로 접근합니다.
application.services[index], application.services["id"], application.services.length 등을 통해 각각의 오브젝트에 접근합니다.
넥사크로플랫폼에서 객체, 폼, 프레임간 접근방법 정리
업무 기능(화면간 데이터 전달 / 화면 제어등) 구현시에 많이 사용되는 팝업창, 폼, 프레임 등에 접근하는 방Way to access object, form, frame in nexacro platform.법에 대하여 넥사크로플랫폼에서 사용되는 실제 예제를 통하여 알아 보겠습니다. 이와 같은 방법은 간단한 내용이지만 실제 업무를 할 때 많은 고객들이 혼동하는 기능이기도 합니다. 프로젝트 구조에(프레임 설정) 따라 접근을 해야 하는 방법이 달라질 수 있기 때문에 미리 숙지를 하게 된다면 개발 시 편리하게 작업하실 수 있을 것입니다.
*샘플 구동 URL
http://www.xplatform.co.kr/Next_JSP/Sample_call/index.html
*소스 다운로드 URL
http://www.xplatform.co.kr/Next_JSP/Sample_call/Sample_call.zip
팝업창 호출시 Argument 전달방법
Argument 전달은 호출 메소드의 인자값에 넘겨줄 값을 설정합니다.
넘겨주는 Argument는 문자열, 데이타셋, 배열 등을 사용할 수 있습니다.
아래 예를 통해 사용방법을 확인하세요.
Open
application.open("modeless","Base::Form1_Pop.xfdl",this.getOwnerFrame(), {mode:'modeless',ds:this.Dataset01}, "showtitlebar=true", 400, 200);
showModal
popWin.showModal(this.getOwnerFrame(),{mode:'modal',ds:this.Dataset01},this, "fn_pop_callback");
showModalWindow
system.showModalWindow(popWin,"modeless2",this.getOwnerFrame(), {mode:'showModalWindow',ds:this.Dataset01}, this);
showModalSync
system.showModalSync(popWin,"modal2",this.getOwnerFrame(), {mode:'showModalSync',ds:this.Dataset01}, this);
팝업창에서 전달받은 값을 확인하는 방법
Argument 확인 Checking Argument
Ex) this.parent.변수명 this.parent.데이터셋명
넘겨받은 값이 Dataset객체인 경우
넘겨받은 값이 데이터셋 객체인 경우는 copydata로 복사하여 사용하여야 합니다.
Ex) this.Dataset01.copyData(this.parent.데이터셋명);
팝업폼의 컴포넌트에 바인드된 데이터셋이 폼에 없을 경우 상위 폼의 데이터셋이 바인드가 됩니다.
If there is not bound dataset which is bound to component on popup form, dataset of upper form will be bound.
팝업창에서 부모폼에 접근하는 방법
팝업창에서 부모폼에 접근하는 경우는 아래와 같이 opener 속성을 이용하여 접근합니다.
Ex) this.opener.객체
팝업창에서 부모폼으로 값을 전달하는 방법
팝업창에서 부모폼으로 값을 전달 할 경우는 아래와 같은 형식으로 전달 합니다.
- open, showModalSync
this.opener 로 부모폼의 함수나 객체에 접근하여 값을 셋팅 후 창을 닫습니다.
- showModal
창이 닫힐 때 close함수의 인자값으로 지정한 콜백함수로 값을 전달 받습니다. (String형태의 값만 전달이 가능합니다.)
- showModalWindow
close 메소드의 argument로 값을 넘깁니다
프레임간 접근 방법
전체 경로명을 이용하여 접근
application.mainframe.VFrameSet0.HFrameSet0.LeftFrame application.mainframe.VFrameSet0.HFrameSet0.WorkFrameSet.ChildFrame0
all 속성의 index를 이용하여 접근
application.all[0].all[0].all[1].all[0] → LeftFrame application.all[0].all[0].all[1].all[1].all[0] → ChildFrame0
all 속성의 id를 이용하여 접근
application.all["mainframe"].all["VFrameSet0"].all["HFrameSet0"].all["LeftFrame"]
프레임간 폼 접근
1) 경로명을 이용하여 접근 application.mainframe.VFrameSet0.HFrameSet0.LeftFrame.form 2) all 속성의 index를 이용하여 접근 application.all[0].all[0].all[1].all[0].form 3) all 속성의 id를 이용하여 접근 application.all["mainframe"].all["VFrameSet0"].all["HFrameSet0"].all["LeftFrame"].form
글로벌 데이터셋, 변수 접근 방법
Global 데이타셋
application.글로벌데이터셋명 Ex) application.gv_Ds
Global 변수
application.글로벌변수명 Ex) application.gv_var1
Application에 연결되어 있는 팝업창 접근방법
application.popupframes["팝업프레임ID"].form.객체 application.popupframes[0].form.객체
컴포넌트에서 부모폼 접근 방법
Form에 위치
obj.parent
Div에 위치
obj.parent.parent
Tab에 위치
obj.parent.parent.parent
그리드 컴포넌트에서 접근 방법
그리드의 expr를 이용하여 접근하는 방법은 아래 내용을 의미합니다. 1) comp : 그리드 2) comp.parent :부모폼 3) comp.parent.객체 : 폼의 컴포넌트
Nan, Infinity, null계산시 참고사항
Dataset에 데이터가 null값인 경우 넥사크로플랫폼은 해당 값을 undefined값으로 인식됩니다. 이때 숫자 계산을 하는 경우 null값과 연산이 되는 경우 비정상적으로 데이타가 출력됩니다. 이를 해결하기 위한 방법을 기술합니다.
NaN(undefined)
현상
해결방법
nexacro에서 제공하는 메소드 중 toNumber()을 사용하여 NaN, Infinity, null값에 대한 대체 숫자를 설정할 수 있습니다.
Syntax) nexacro.toNumber(varValue [, varNanVal [, varPinfVal [, nIfnVal]]])
- 소스 위치
Sample\Application_sample\np_Operation.xfdl
Infinity
현상
데이터셋에 Row 개수가 0이거나, 모든 Row의 Column값이 비어있거나, 컬럼 type이 문자형일 때 getAvg()를 하게 되면 Infinity로 표시됩니다.
해결방법
nexacro에서 제공하는 메소드 중 toNumber()을 사용하여 NaN, Infinity, null값에 대한 대체 숫자를 설정할 수 있습니다.
Syntax) nexacro.toNumber(varValue [, varNanVal [, varPinfVal [, nIfnVal]]])
- 소스 위치
Sample\Application_sample\np_Operation2.xfdl
참고사항
데이타셋의 컬럼 TYPE이 숫자형 인 경우에는 반드시 0또는 숫자 값으로 정의하시기 바랍니다.
만약 스크립트를 이용하여 숫자형 DataSet컬럼에 값을 추가해 주는 경우에도 반드시 숫자를 세팅해주세요.
for(var i=0;i<this.Dataset00.getRowCount();i++) { if((this.Dataset00.getColumn(i,"Column0") == null) || (this.Dataset00.getColumn(i,"Column0") == "")) { this.Dataset00.setColumn(i,"Column0",0); } }