Application

관계도

Application 실행환경에서 각 Application, frame, child, form 등의 접근방법에 대해 기술합니다.

application_path_0

해당 내용에 대해서는 실제 동작방법을 실행해 보시면 설명에 대한 이해를 도와 줄 수 있습니다.

간략설명

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에서 정의가

가능합니다.

application_datagroup

서버환경정보가 변경이 될 예정입니다. (도메인 정보, IP 등)

이런 경우 어떠한 작업이 필요합니까?

HTTP 에러코드 확인하기

ADL의 onerror이벤트에서 확인방법

Project의  ADL 이벤트 중 onerror  이벤트를 이용하여 서버와 통신시
HTTP 에러를 확인 할 수 있습니다.

Application_httperror_0

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 이나 변수만 선언 한 경우에는 받지 못하게 됩니다.

transaction

이미지 와 같이 처음 쌍따옴표로 초기화한 변수는 트랜젝션 콜백에서 받을 수 있지만.

선언만 해놓고나 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();

데이타 조회

Transaction_Basic_1

조회건수 설정

서비스(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)을 웹 브라우저를 통해 실행하는 경우 브라우저 기본기능에서 
마우스 오른쪽 클릭을 지원합니다. 
이때 기본으로 제공하는 브라우저의 오른쪽 기능을 막는 방법에 대해 설명합니다.

Form_rightMenu_0

Html페이지의 Body영역에 아래 스크립트를 추가합니다.

application_rightButton_0

해당 HTML페이지는 자동으로 생성 및 변경이 될 수 있으므로 반드시 백업 및 해당 값이 존재하는지 확인을 하시기 바랍니다.

웹 브라우저에서 기본으로 제공하는 마우스 오른쪽 클릭 기능을 막을 수 있나요?

httptimeout / httpretry설정

httptimeout

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 설정값이 조호/저장 시간보다 작은경우 오류가 발생하게 됩니다.

httptimeout1

httpretry

통신(transaction)시 지정한 httptimeout 시간안에 결과를 받지 못하였을때 재시도 횟수를 지정하는 속성입니다.

httpretry 속성값의 기본값은 3 입니다.

통신시 지정한 httptimeout 시간안에 결과를받지 못하였을때

재시도 횟수를 지정하는 속성입니다.

httpretry값이 지정되어 있을 경우(0보다 큰 경우) 지정한 횟수만큼 재호출을 시도하게 됩니다.

httptimeout

세션처리

넥사크로플랫폼(nexacro platform)에서 세션(쿠키)처리 방법에 대해 설명합니다.
넥사크로플랫폼(nexacro platform)은 global 변수로 정의된 변수의 경우 usecookie 설정 옵션에 
따라서 쿠키에 해당 변수를 추가하여 서버로 전송할 수 있습니다.

usecookie설정

Global_cookie_0

서버로 데이터를 호출시 쿠키에 값을 설정하여 전달할 수 있는 방법으로는
GlobalVariables 설정에서 usecookie를 true로 설정해 주게 되면 해당 서비스 호출시 쿠키값으로 함께 전달이 가능합니다.

패킷 프로그램을 이용한 확인

Client와 Server간의 트래픽 상황을 모니터링 할 수 있는 프로그램으로 실제 쿠키에 값이 전달되는 것을 확인할 수 있습니다.

Global_cookie_1

위의 모니터링 프로그램은 Fiddler이라는 프로그램을 사용하여 캡쳐하였습니다.

쿠키에 값을 설정할 수 있습니까?

Prefix 설정

넥사크로플랫폼(nexacro platform)을 개발시 화면 폼에 그룹핑과 서비스 호출을 위한 주소에 대한 Prefix를 설정할 수 있습니다.

application_prefix_0

Prefixid 를 하게 되면 서버 환경변화에 따른 대응이 편리합니다.

예를 들어 서비스 URL경로가 IP주소에서 도메인으로 변경이 되는 경우 Prefixid를 사용하지 않는다면 모든 개발소스에서 IP정보를 도메인으로 변경하는 작업을 소스에서 고쳐야 할 것입니다.

그러나 Prefixid를 사용하게 되면 TypeDefinition의 환경파일만 변경해 주면 바로 적용이 가능합니다.

Cache

넥사크로플랫폼(nexacro platform)의 Cache 처리방식은 웹 브라우저의 Cache 설정을 따릅니다.

Global_cache_0

화면(Form), xjs, 이미지 등 웹을 통해 받아오는 파일에 대한 Cache설정은

웹 브라우저의 [인터넷옵션]-[설정]에 따라 달라질 수 있습니다.

Cookie

Cookie 값 확인하기

nexacro platform HTML5 14가 실행된 환경에서 웹 브라우저의 쿠키 값을 확인하는 방법을 기술합니다.

Application_cookie_1

주요 소스 코드

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를 사용하여 실행시 확인할 수 있습니다.

http://www.xplatform.co.kr/Next_JSP/nexacro/index.jsp

소스 위치

Sample\Application\np_Application_Cookie.xfdl

Cookie 값 설정 및 확인방법

nexacro platform Web browser (기존 html5) 가 실행된 환경에서 웹 브라우저의 쿠키 값을 확인하는 방법을 기술합니다.

cookie2

주요 소스 코드

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 입니다.

Personalizing

주요 소스 내용

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에 대한 실행환경에 대한 정보를 확인할 수 있습니다.

Application_Navigatorname

주요 소스 코드

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_image_2

Loading속성을 설정하지 않으면 디폴트 이미지가 표현됩니다.

ADL의 속성 변경방법

loading_image

변경하고자 하는 Project를 오픈한 후 ADL속성 중 loadingimage속성에 변경하고자 하는
이미지를 설정하시면 됩니다.

경로지정시 웹 경로를 지정해 주시기 바랍니다.

변경 후 이미지

loading_image_2

데이타 통신시 디폴트 이미지를 변경하는 방법을 알고싶습니다.

waitingimage를 변경하고 싶습니다.

TypeDefinition

nexacro platform에서 사용하는 환경정보 즉 TypeDefinition에 대해 자주 묻는 내용을 토대로 정리하였습니다.

Services 정보

application.services속성을 통해 services정보를 확인할 수 있습니다.

Application_Typedefinition_services_0

application.services를 이용한 정보확인

Application_Typedefinition_services_1

주요 소스 내용

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 등을 통해 각각의 오브젝트에 접근합니다.

넥사크로플랫폼에서 객체, 폼, 프레임간 접근방법 정리

frame

업무 기능(화면간 데이터 전달 / 화면 제어등) 구현시에 많이 사용되는 
팝업창, 폼, 프레임 등에 접근하는 방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로 값을 넘깁니다

프레임간 접근 방법

frame2

전체 경로명을 이용하여 접근

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

글로벌 데이터셋, 변수 접근 방법

frame3

Global 데이타셋

application.글로벌데이터셋명 
Ex) application.gv_Ds

Global 변수

application.글로벌변수명 
Ex) application.gv_var1

Application에 연결되어 있는 팝업창 접근방법

application.popupframes["팝업프레임ID"].form.객체
application.popupframes[0].form.객체

컴포넌트에서 부모폼 접근 방법

frame4

Form에 위치

obj.parent

Div에 위치

obj.parent.parent

Tab에 위치

obj.parent.parent.parent

그리드 컴포넌트에서 접근 방법

frame5

그리드의 expr를 이용하여 접근하는 방법은 아래 내용을 의미합니다.
1) comp : 그리드
2) comp.parent :부모폼
3) comp.parent.객체 : 폼의 컴포넌트

Nan, Infinity, null계산시 참고사항

Dataset에 데이터가 null값인 경우 넥사크로플랫폼은 해당 값을 undefined값으로 인식됩니다.
이때 숫자 계산을 하는 경우 null값과 연산이 되는 경우 비정상적으로 데이타가 출력됩니다.
이를 해결하기 위한 방법을 기술합니다.

NaN(undefined)

nan3

현상

nan3

해결방법

nexacro에서 제공하는 메소드 중 toNumber()을 사용하여 NaN, Infinity, null값에 대한 
대체 숫자를 설정할 수 있습니다.
Syntax)
nexacro.toNumber(varValue [, varNanVal [, varPinfVal [, nIfnVal]]])

nan3

소스 위치

Sample\Application_sample\np_Operation.xfdl

Infinity

nan3

nan3

현상

데이터셋에 Row 개수가 0이거나, 모든 Row의 Column값이 비어있거나, 컬럼 type이 문자형일 때 
getAvg()를 하게 되면 Infinity로 표시됩니다.

nan3

해결방법

nexacro에서 제공하는 메소드 중 toNumber()을 사용하여 NaN, Infinity, null값에 대한 
대체 숫자를 설정할 수 있습니다.
Syntax)
nexacro.toNumber(varValue [, varNanVal [, varPinfVal [, nIfnVal]]])

nan3

소스 위치

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);
  }
 }