13.Script

13.1nexacro 에서 변수와 함수 사용시 Scope에 대한 정의

그림 13-1var9

nexacro의 스크립트는 JavaScript 스펙을 표준으로 사용하게 됨에 따라, 다양한 사용자 및 사용자 소스의 수용 등을 위해 JavaScript를 이용하여 구현 할 수 있다.
변수 Scope 란 현재 위치에서 접근이 가능한 변수를 결정하는 방법이다.
자신의 Scope 안에 있다면 접근이 가능하여 변수를 읽거나 쓸 수 있는 것이고, 
Scope 밖이라면 해당하는 변수는 접근이 불가능하게 된다.
변수의 종류는 크게 두가지로 구분 할 수 있다.

전역변수(Global Variable) : Function밖에서 선언한 변수로 현재 화면의 어디에서나 접근가능 지역변후(Local Variable) : Function안에서 선언한 변수, Function안에서만 접근가능

폼에서 this.getName = function(){…}형태로 함수를 정의할 때 해당 함수 블록 내에서 var를 이용해 
변수를 선언하면 이 변수는 this.getName함수 내에서만 참조가 가능한 로컬 스코프를 갖는 
변수가 된다. 

이 변수는 해당 함수가 실행, 즉 실행 컨텍스트 내에 들어왔을 때에만 유효하고 해당 함수가 종료되면 
가비지 컬렉션 처리가 된다.

nexacro의 폼에서는 모든 변수와 함수가 해당 폼의 인스턴스에 속하도록 “this”키워드를 사용하기 
때문에 함수나 블록({과})내에서 변수 선언시 오히려 실수할 가능성이 적다. nexacro에서는 현재 
실행 폼 내에서만 참조할 수 있도록 하기 위해서는 “this”키워드를 이용해서 해당 변수나 함수의 
컨텍스트를 지정해야 한다.


전 역변수는 프로그램 전역에서 사용하는 변수이므로 메모리에 항상 로드가 되어 있고, 지역변수는 
해당 지역에서만 사용되기 때문에 사용이 끝나면 소멸하게 된다. 자바스크립트는 함수형 언어 
이므로 , 대부분의 지역변수는 함수 내부에서만 사용되고, 함수가 종료되면 해당 지역변수는 자동으로 
소멸 된다.

이러한 이유로 Scope 미지정시 생성된 전역변수(최상위 Global에 생성)는 메모리상에 계속 누적이 
되게 되어 많아 질 경우 성능에 영향을 주게 된다.

Scope미지정시 Global로 처리가 되므로 Variant사용시 반드시 Scope를 명시하여야 한다.

HTML5의 Scope와 동일한 구성을 사용하게 됨에 따라, ADL/FDL/XJS Script내에서 Scope를

명시하지 않는 Variant에 대해서 모두 최상위 Global의 member로 처리된다.

Scope를 반드시 명시하여 사용한다. (this/this.parent/application) Property/Function/Variant등은 this나 parent나 application을 명시하여 사용한다.

사용 예)

그림 13-2var1

Function외에서 Scope, Var를 모두 명시하지 않을 때에는 global의 member로 처리되나
사용하지 않는 것을 권장한다.

Function외에서 Scope없이 Var만 명시할 때에는 form의 member가 아닌 형태로 처리됨으로
사용하지 않는 것을 권장한다. (폼 스크립트 상의 변수)

그림 13-3var2

Method도 this나 parent나 application을 명시하여 사용
(명시하지 않을 때에는 기존 Form의 method가 아닌 global member method가 실행됨)

그림 13-4var3

FDL의 Global Variant도 this나 parent나 application을 명시하여 사용
(명시하지 않을 때에는 기존 Form의 member가 아닌 script상의 variant로 처리됨)

그림 13-5var6

Scope를 명시하기 어려운 상황을 위해 LookUp Method가 제공이 되나 성능저하의 원인이 된다.
(Object LookUp지원, Method LookUp지원)

그림 13-6var7

실제로 각 변수 스코프에 따라 처리 성능이 얼마나 달라지는지 측정한 결과입니다.

그림 13-7var8

표 13-1Firefox 26.0 버전 기준

조건

로컬변수 j를 증가

this.j 증가

application.j증가

5회 평균치(ms)

33.75

100.75

220

물론 이 수치는 아주 비정상적이고 과도한 방법

(실제로 3천만번을 돌려야 이런 결과를 얻을 수 있음)으로 테스트 한 것이기 때문에

이런 결과가 시스템 개발을 할 때 동일하게 적용이 될 수 있다고 말하기는 어렵다.

13.2eval

eval 함수를 사용하게 되면 스크립트 원본코드를 동적으로 실행할 수 있습니다.
var dataset = eval("this." + obj.binddataset);

스크립트를 동적으로 실행할 수 있나요?

13.3줄바꿈문자(개행문자) 처리

13.3.1Script를 통한 개행문자 처리방법

개행문자는 \n을 사용하여 표현할 수 있습니다.

그림 13-8np_Script_Newline_0

this.Button00_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
 this.stNewLine.set_text('aple' +  String.fromCharCode(10) + 'Strawberries');
}
this.Button01_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
 this.taNewLine.set_value('aple' +  String.fromCharCode(10) + 'Strawberries');
}
this.Button02_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
 this.ds_data.setColumn(0,"Column0",'aple' +  String.fromCharCode(10) + 'Strawberries'); 
}

String.fromCharCode(10) : 개행문자를 의미합니다.

개행문자 처리방법을 알고 싶습니다.

소스 위치

Sample_Script\np_Script_Newline.xfdl

13.4Number & Math

스크립트를 이용하여 숫자의 변환 및 연산관련 기능을 구현하는 방법을 제시합니다.

13.4.1아스키 코드를 HEX값으로 변경하기

charCodeAt , fromCharCode 메소드를 이용하여 아스키 코드를 HEX값으로, HEX값을 아스키 코드로 
변경하는 스크립트를 작성한다.

그림 13-9Script_Number_AsciiToHex_0

참고사항

charCodeAt

지정한 인덱스에 해당하는 문자의 유니코드 인코딩 값에 해당하는 정수를 반환하는 메소드

fromCharCode

유니코드 문자 값을 문자열로 반환하는 메소드

주요 소스 코드

this.fn_doAsciiHex = function(sValue, sType)
{
    var sHex   = "0123456789ABCDEF";
    var sAscii = ' !"#$%&'+"'"+'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ['+'\\'+']^_`abcdefghijklmnopqrstuvwxyz{|}';
    var sRtn   = "";
    if (sType == "A2H")
    {
        var sLet, nPos, h16, h1;
        for (var i = 0; i < sValue.length; i++)
        {
            sLet  = sValue.charAt(i);
            nPos  = sAscii.indexOf(sLet) + 32;
            h16   = Math.floor(nPos / 16);
            h1    = nPos % 16;
            
            sRtn += sHex.charAt(h16) + sHex.charAt(h1);
        }
    }
    if (sType == "H2A")
    {
        for (var i = 0; i < sValue.length; i++)
        {
            var sLet1 = sValue.charAt(2 * i);
            var sLet2 = sValue.charAt(2 * i + 1);
            var sVal  = sHex.indexOf(sLet1) * 16 + sHex.indexOf(sLet2);
            
            sRtn += sAscii.charAt(sVal - 32);
        }
    }
    return sRtn;
}

Ascill, HEX

소스 위치

Sample\Sample_Script\np_Script_Number_AsciiToHex.xfdl

13.4.2숫자형식 여부 체크하기

charAt 메소드를 이용하여 입력한 문자열이 숫자 형식이 맞는지 여부를 체크 합니다.

그림 13-10Script_Number_CheckNumber_0

참고사항

charAt

지정한 인덱스에 해당하는 문자를 반환하는 메소드

숫자형식, charAt

소스 위치

Sample\Sample_Script\np_Script_Number_CheckNumber.xfdl

13.4.3RGB 색상 코드 변경하기

parseInt 메소드를 이용하여 색상 RGB 값을 HEX코드로 HEX코드를 RGB 값으로 변경하는 스크립트입니다.

그림 13-11Script_Number_HexToRGB_0

참고사항

parseInt

문자열에서 변환된 정수를 반환하는 메소드

charAt

지정한 인덱스에 해당하는 문자를 반환하는 메소드

execute버튼 클릭시 화면의 background색상이 변경됩니다.

RGB, HEX

소스 위치

Sample\Sample_Script\np_Script_Number_HexToRGB.xfdl

13.4.4진수 변환하기

toString 메소드를 이용하여 10진수, 16진수, 2진수를 변환하는 스크립트를 작성합니다.

그림 13-12Script_Number_NumberFormat_0

참고사항

toString

문자열을 반환하는 메소드이며, 문자열로 변환할 진수 값을 인자로 사용할 수 있다.

진수, toString

소스 위치

Sample\Sample_Script\np_Script_Number_NumberFormat.xfdl

13.4.5숫자 범위 체크하기

toNumber 메소드를 이용하여 입력한 숫자가 지정한 범위 사이에 있으면 true, 없으면 false를  반환하는 스크립트입니다.

그림 13-13Script_Number_NumberRange_0

input0의 입력 값이 inpup1과 input2 사이에 존재하는지를 체크합니다.

참고사항

toNumber

입력된 값을 숫자로 변환하는 메소드

범위 체크, toNumber

소스 위치

Sample\Sample_Script\np_Script_Number_NumberRange.xfdl

13.4.6백분율 구하기

Math 객체를 이용하여 입력된 값 기준으로 백분율을 구합니다.

그림 13-14Script_Number_Percentage_0

참고사항

Math

수학 함수와 관련 상수가 정의된 오브젝트

round

주어진 수식을 반올림하여 정수 값을 반환한다.

백분율, percentage, round

소스 위치

Sample\Sample_Script\np_Script_Number_Percentage.xfdl

13.4.7숫자 값에 반올림 처리하기

그림 13-15Script_Number_Round_0

참고자료

round

주어진 수식을 반올림하여 정수 값을 반환한다.

round, 반올림

소스 위치

Sample\Sample_Script\np_Script_Number_Round.xfdl

13.4.8문자열로 입력된 숫자를 정수형 타입으로 변환하기

parseInt 메소드를 이용하여 숫자 형의 문자열을 정수로 변환하는 스크립트를 작성합니다.

그림 13-16Script_Number_StringToInteger_0

parseInt ,정수

소스 위치

Sample\Sample_Script\np_Script_Number_StringToInteger.xfdl

13.5String

텍스트 문자열을 조작하고 서식을 지정하거나 문자열 안에서 부분 문자열을 결정하고 위치를 지정하는 Method 입니다.

13.5.1문자열 내에서 원하는 만큼의 문자열 얻기

substr 메소드를 이용하여 입력된 문자열에서 위치를 정하고 해당 위치로 부터 주어진 길이만큼 원하는 문자열을 얻을 수 있습니다.

그림 13-17Script_String_CharIndex_0

참고사항

substr

문자열의 특정 부분을 지정된 길이만큼 반환하는 메소드입니다.

mid, substr

소스 위치

Sample\Sample_Script\np_Script_String_CharIndex.xfdl

13.5.2문자열의 길이 반환하기

length 메소드를 이용하여 문자열의 길이를 반환합니다.

그림 13-18Script_String_CharLength_1

주요 소스 내용

function fn_charLength(sString) 
{
  var sString = sString.toString();
  var nCnt    = 0;
  for (var i = 0; i < sString.length; i++)
  {
    if (sString.charCodeAt(i) > 127)
    {
      nCnt += 2;
    } 
    else 
    {
      nCnt += 1;
    }
  }
  return nCnt;
}

2바이트 문자인 한글을 처리하기 위해서 유니코드로 판단합니다.

참고사항

charCodeAt

지정한 인덱스에 해당하는 문자의 유니코드 인코딩 값에 해당하는 정수를 반환하는 메소드

Length

소스 위치

Sample\Sample_Script\np_Script_String_CharLength.xfdl

13.5.3영문과 숫자 체크하기

charCodeAt 메소드를 이용하여 영문과 숫자 여부를 확인합니다.

그림 13-19Script_String_CheckAlpaNum_0

참고사항

charCodeAt

지정한 인덱스에 해당하는 문자의 유니코드 인코딩 값에 해당하는 정수를 반환하는 메소드

charCodeAt

소스 위치

Sample\Sample_Script\np_Script_String_CheckAlpaNum.xfdl

13.5.4한글과 특수문자 체크하기

charAt 메소드를 이용하여 한글과 특수문자 여부를 확인합니다.

그림 13-20Script_String_CheckChar_0

참고사항

indexOf

첫번째로 일치하는 부분 문자열의 위치를 반환하는 메소드이다. lastIndexOf()의 경우 문자 오른쪽에서 왼쪽 방향으로 검색합니다.

charCodeAt

지정한 인덱스에 해당하는 문자의 유니코드 인코딩 값에 해당하는 정수를 반환하는 메소드

charAt

지정한 인덱스에 해당하는 문자를 반환하는 메소드

indexOf, charCodeAt

소스 위치

Sample\Sample_Script\np_Script_String_CheckChar.xfdl

13.5.5배열 내에 중복되는 데이터 제거하기

split 메소드를 이용하여 배열 내에 중복되는 데이터를 제거하는 스크립트를 구현합니다.

그림 13-21Script_String_Distinct_0

참고사항

split

구분자로 분리되어있는 문자열 데이터를 배열로 반환하는 메소드

배열, 중복제거

소스 위치

Sample\Sample_Script\np_Script_String_Distinct.xfdl

13.5.6전각문자를 반각문자로 변환하기

charCodeAt  메소드를 이용하여 전각문자를 반각문자로 변경합니다.

그림 13-22Script_String_FullToHalf_0

참고사항

unescape

strChar의 내용을 포함한 새 문자열 값을 변환한다.

주요 소스 내용

function fn_fullToHalf(sFull)
{
   …중략
  for (var i = 0; i < sFull.length; i++)
  {
    sChar = sFull.charCodeAt(i);
    if (sChar == 12288)
    {
      sHalf += unescape("%20");
    }
    else if ((sChar >= 65281) && (sChar <= 65374))
    {
      sHalf += unescape("%" + (sChar-65248).toString(16));
    }
    else
    {
      sHalf += sFull.charAt(i);
    }
  return sHalf;
}

charCodeAt, unescape

소스 위치

Sample\Sample_Script\np_Script_String_FullToHalf.xfdl

13.5.7반각문자를 전각문자로 변환하기

charCodeAt  메소드를 이용하여 반각문자를 전각문자로 변경합니다.

그림 13-23Script_String_HalfToFull_0

참고사항

fromCharCode

fromCharCode(유니코드 문자 값)은 유니코드 문자 값 중에서 문자열을 반환합니다.

주요 소스 내용

function fn_halfToFull(sHalf)
{
   …중략
  for (var i = 0; i < sHalf.length; i++) 
  {
    if ((sHalf.charCodeAt(i) >= 32) && (sHalf.charCodeAt(i) <= 126)) 
    {
    … 중략
      {
        sChar = sHalf.charCodeAt(i) + 65248;
      }
    }
    … 중략
    sFull = sFull + String.fromCharCode(sChar);
  }
  return sFull;
}

charCodeAt, unescape

소스 위치

Sample\Sample_Script\np_Script_String_HalfToFull.xfdl

13.5.8한글 ↔ 유니코드 변환기 만들기

자바스크립트 정규식을 이용하여 한글을 유니코드로, 유니코드를 한글로 변환하는 변환기를 만들 수 있습니다.

그림 13-24Script_String_HanGulToUnicode_0

참고사항

escape

유니코드로 변환하는 메소드

unescape

escape로 변환된 문자열을 디코딩하는 메소드

주요 소스 내용

… 중략 …
function fn_hanUni(sHan)
{
  var sUni = escape(sHan);
  return sUni;
}
… 중략 …
function fn_uniHan(sUni)
{
  var sHan = unescape(sUni); 
  return sHan;
}
… 중략 …

escape, unescape

소스 위치

Sample\Sample_Script\np_Script_String_HanGulToUnicode.xfdl

13.5.9문자열이 지정된 길이로 되도록 다른 문자로 채우기

padLeft, padRight 메소드를 이용하여 문자열을 지정된 길이가 되도록 채워줍니다.

그림 13-25Script_String_LpadRpad_0

주요 소스 내용

this.fn_lpad = function(sString, nSize, sPadChar)
{
    var sRtn = "";
 if (sPadChar != null)
 {
  sRtn = sString.padLeft(nSize, sPadChar);
 }
 else if (sPadChar == null)
 {
  sRtn = sString.padLeft(nSize, " ");
 }
    return sRtn;
}

this.fn_rpad = function(sString, nSize, sPadChar)
{
    var sRtn = "";
 if (sPadChar != null)
 {
  sRtn = sString.padRight(nSize, sPadChar);
 }
 else if (sPadChar == null)
 {
  sRtn = sString.padRight(nSize, " ");
 }
    return sRtn;    
}

padLeft, padRight

소스 위치

Sample\Sample_Script\np_Script_String_LpadRpad.xfdl

13.5.10널 값을 체크하여 공백으로 반환하기

입력 데이터가 널이거나 undefined를 체크하여 공백으로 반환하는 스크립트

그림 13-26Script_String_NullToEmpty_0

참고사항

isNaN

어떤 값이 NaN인지 여부를 나타내는 메소드

null, undefined, NaN

소스 위치

Sample\Sample_Script\np_Script_String_NullToEmpty.xfdl

13.5.11숫자를 한글로 변환하기

charAt 메소드를 이용하여 정수를 한글이나 한자로 표현합니다.

그림 13-27Script_String_NumberToString_0

charAt

소스 위치

Sample\Sample_Script\np_Script_String_NumberToString.xfdl

13.5.12문자열에 홀따옴(‘)표 붙이기

substr 메소드를 이용하여 문자열에 홀따옴(‘)표를 좌우에 붙일 수 있습니다.

그림 13-28Script_String_Quote_0

Single quotation, 홀따옴표

소스 위치

Sample\Sample_Script\np_Script_String_Quote.xfdl

13.5.13문자열에 있는 하이픈(-) 제거하기

replace 메소드를 이용하여 문자열에 하이픈(-)을 제거할 수 있습니다.

그림 13-29Script_String_RemoveHyphen_0

참고사항

replace

정규식 또는 검색 문자열을 사용하여 텍스트를 바꾸고 해당 문자열을 반환하는 메소드

하이픈, hyphen, replace

소스 위치

Sample\Sample_Script\np_Script_String_RemoveHyphen.xfdl

13.5.14문자열을 분리하여 배열로 만들기

그림 13-30Script_String_StringToAarray_0

소스 위치

Sample\Sample_Script\np_Script_String_StringToAarray.xfdl

13.5.15공백 제거한 값을 리턴하는 함수

공백을 제거한 값을 리턴 한다.

그림 13-31Script_String_Trim_0

소스 위치

Sample\Sample_Script\np_Script_String_Trim.xfdl

13.6Date

스크립트를 이용하여 Date 관련한 처리방법을 제시합니다.

13.6.1날짜 차이계산

Date 객체를 이용하여 날짜 차이를 계산합니다.

그림 13-32Script_Date_CalculateDate_0

두 날짜의 차이를 확인할 수 있나요?

Date

소스 위치

Sample\Sample_Script\np_Script_Date_CalculateDate.xfdl

13.6.2시간 차이 계산

Date 객체를 이용하여 날짜와 시간 차이를 계산합니다.

그림 13-33Script_Date_CalculateTime_0

주요 소스 내용

this.fn_calculateDate = function(sDateS, sDateE, sGbn) 
{
    var nMonth = 0; //계산된 개월수
    var nYear  = 0; //계산된 년도
    var nRtn   = 0; //반환할 개월수        
        
    if (sGbn == "M")
    {
        if (parseInt(sDateS) <= parseInt(sDateE))
        {
            nYear  = parseInt(sDateE.substr(0,4))- parseInt(sDateS.substr(0,4)) ;
            nMonth = parseInt(sDateE.substr(4,2))- parseInt(sDateS.substr(4,2));
            nRtn   = (12 * nYear) + nMonth;
        }
    }
    else
    {    
        var dFrom = new Date(sDateE.substring(0,4),  sDateE.substring(4,6)-1, sDateE.substring(6,8)
                            ,sDateE.substring(8,10), sDateE.substring(10,12), sDateE.substring(12,14));
        var dTo   = new Date(sDateS.substring(0,4),  sDateS.substring(4,6)-1, sDateS.substring(6,8)
                            ,sDateS.substring(8,10), sDateS.substring(10,12), sDateS.substring(12,14));      
        nRtn = parseInt((dFrom - dTo)/(1000*60*60*24));
    }
    return nRtn;
}

Date, getTime

소스 위치

Sample\Sample_Script\np_Script_Date_CalculateTime.xfdl

13.6.3입력된 날짜에 대한 유효성 체크

toNumber 메소드를 이용하여 날짜의 정합성을 체크합니다.

그림 13-34Script_Date_HanGulWeek_0

주요 소스 내용

function fn_checkDate(sDate) 
{
  var nYear  = toNumber(sDate.toString().substr(0,4));
  var nMonth = toNumber(sDate.toString().substr(4,2));
  var nDate  = toNumber(sDate.toString().substr(6,2));
  if ( nMonth > 12 || nMonth < 1)
  {
      return false;
  }

  switch (nMonth) 
  {
     case 1:
    …중략…            
       break;
  }    

  return true;
}

toNumber, 윤년

소스 위치

Sample\Sample_Script\np_Script_Date_CheckDate.xfdl

13.6.4윤년 여부 확인하기

윤년계산법을 이용하여 2월 29일이 있는 윤년 여부를 확인합니다.

그림 13-35Script_Date_CheckLeapYear_0

주요 소스 내용

this.fn_checkLeapYear = function(sDate) 
{
    var bRtn = false;
    var nY   = parseInt(sDate.substring(0,4));
    if ((nY % 4) == 0) 
    {
        if ((nY % 100) != 0 || (nY % 400) == 0) 
        {
            bRtn = true;
        }
    } 
    return bRtn;
}

윤년

소스 위치

Sample\Sample_Script\np_Script_Date_CheckLeapYear.xfdl

13.6.5시간 유효성 체크

Number 메소드를 이용하여 시간의 적합성을 체크합니다.

그림 13-36Script_Date_CheckTime_0

주요 소스 내용

this.fn_checkTime = function(sTime) 
{
    var nHH = Number(sTime.toString().substr(0,2));
    var nMM = Number(sTime.toString().substr(2,2));
    var nSS = Number(sTime.toString().substr(4,2));
    if (nHH > 24 || nHH < 0)
    {
      return false;
    }    
    
    if (nMM > 59 || nMM < 0)
    {
      return false;
    }
    
    if (nSS > 59 || nSS < 0)
    {
      return false;
    }  
    
    return true;
}

Number

소스 위치

Sample\Sample_Script\np_Script_Date_CheckTime.xfdl

13.6.6날짜를 문자로 변환하기

Date 객체를 이용하여 날짜를 문자로 변경합니다.

그림 13-37Script_Date_DateToString_0

주요 소스 내용

this.fn_dateToString = function(dDate) 
{
    var sRtn =  (new Date(dDate)).getFullYear()
             + ((new Date(dDate)).getMonth()+1).toString().padLeft(2, "0")
             + ((new Date(dDate)).getDate()).toString().padLeft(2, "0");  
              
    return sRtn;
}

Date

소스 위치

Sample\Sample_Script\np_Script_Date_DateToString.xfdl

13.6.7년월 유효성 체크

Number 메소드를 이용하여 날짜 년 월의 적합성을 체크합니다.

그림 13-38Script_Date_CheckYearMonth_0

주요 소스 내용

this.fn_checkYearMonth = function(sDate) 
{
    var nYear  = Number(sDate.toString().substr(0,4));
    var nMonth = Number(sDate.toString().substr(4,2));
    if ( nMonth > 12 || nMonth < 1)
    {
      return false;
    }    
      return true;
}

Number

소스 위치

Sample\Sample_Script\np_Script_Date_CheckYearMonth.xfdl

13.6.8오늘 날짜와 현재 시간 구하기

Date 객체를 이용하여 오늘 날짜와 시간을 구합니다.

그림 13-39Script_Date_DateTime_0

주요 소스 내용

this.fn_dateTime = function() 
{
    var dDate = new Date();     
    var sRtn =  dDate.getFullYear()
          + (dDate.getMonth()+1).toString().padLeft(2, "0")
          +  dDate.getDate().toString().padLeft(2, "0")
          +  dDate.getHours().toString().padLeft(2, "0")
          +  dDate.getMinutes().toString().padLeft(2, "0")
          +  dDate.getSeconds().toString().padLeft(2, "0");
    return sRtn;
}

Date

소스 위치

Sample\Sample_Script\np_Script_Date_DateTime.xfdl

13.6.9입력된 날짜의 요일 구하기

Date 객체를 이용하여 날짜의 요일을 구합니다.

그림 13-40Script_Date_HanGulWeek_0

주요 소스 내용

this.fn_hanGulWeek = function(sDate) 
{
    var dDate    = new Date(parseInt(sDate.substr(0,4))
        , parseInt(sDate.substr(4,2))-1
        , parseInt(sDate.substr(6,2)));
    var sDay     = dDate.getDay();
    var arrweek  = new Array("일", "월", "화", "수", "목", "금", "토");  
    var sRtn     = arrweek[sDay];
    return sRtn;
}

Date

소스 위치

Sample\Sample_Script\np_Script_Date_HanGulWeek.xfdl

13.6.10입력한 날짜의 마지막 날짜 구하기

Date 객체를 이용하여 입력 받은 날짜나 이번 달 마지막 일자를 반환합니다.

그림 13-41Script_Date_LastDay_0

주요 소스 내용

this.fn_lastDay = function(sDate) 
{
  var dDate = "";
  sDate = sDate.trim();
  if (sDate == null || sDate == "" || sDate == "undefined")  
  {
     //오늘 날짜의 한달후 값을 가져와서 오늘 일 만큼 빼줌
     dDate = (new Date()).addMonth(1);
     dDate = (new Date(dDate)).addDate((new Date(dDate)).getDate()*-1);
  } else {
     //입력받은 날짜의 다음달 1일은 가져옴
     dDate = new Date(parseInt(sDate.substr(0,4)), parseInt(sDate.substr(4,2)), 1);
     dDate = dDate.addDate(-1); 
  }
  var sRtn =  (new Date(dDate)).getFullYear()
           + ((new Date(dDate)).getMonth()+1).toString().padLeft(2, "0")
           + ((new Date(dDate)).getDate()).toString().padLeft(2, "0");  
  return sRtn;
}

Date

소스 위치

Sample\Sample_Script\np_Script_Date_LastDay.xfdl

13.6.11음력을 양력으로 변환하기

입력 받은 음력을 양력으로 변경합니다.

그림 13-42Script_Date_LunarToSolar_0

입력한 날짜에 대해 양력으로 변환할 수 있습니다.
소스 위치

Sample\Sample_Script\np_Script_Date_LunarToSolar.xfdl

13.6.12양력을 음력으로 변환하기

입력 받은 양력을 음력으로 변경합니다.

그림 13-43Script_Date_SolarToLunar_3

parseInt

소스 위치

Sample\Sample_Script\np_Script_Date_SolarToLunar.xfdl

13.6.13날짜의 주에 해당하는 날짜 구하기

Date 객체를 이용하여 주를 계산합니다.

그림 13-44Script_Date_WeekOfYear_0

주요 소스 내용

/*
 * File Name   : Script_Date_WeekOfYear
 * Description : Finding the date interval corresponding to input week
 */
/*  Button Click  */
this.btn_execute_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
 var sRtn = this.fn_weekOfYear(this.edt_input0.value, this.edt_input1.value);
 this.edt_output.set_value(sRtn);
}
/*
 * Function Name : fn_weekOfYear
 * Description   : Finding the date interval corresponding to input week
 * Parameter     : Year, Week
 * Return        : Applying(from ~ to)
 * Example       : fn_weekOfYear(2012, 52);
 */
this.fn_weekOfYear = function(sYYYY, sWeek)
{
    var dDate = new Date(parseInt(sYYYY), 0, 1);
    var nDay  = dDate.getDay();     //0 = Sunday ~ 6 = Saturday    
    
 if (nDay != 0)
 {
  dDate = new Date(dDate.addDate(-nDay));
 } 
 var nWeekS = dDate.addDate(7 * (sWeek-1));
    var nWeekE = dDate.addDate(6); 
    
    var sRtn  =  (new Date(nWeekS)).getFullYear()
              + ((new Date(nWeekS)).getMonth()+1).toString().padLeft(2, "0")
              + ((new Date(nWeekS)).getDate()).toString().padLeft(2, "0")  
              + " ~ "    
              +  (new Date(nWeekE)).getFullYear()
              + ((new Date(nWeekE)).getMonth()+1).toString().padLeft(2, "0")
              + ((new Date(nWeekE)).getDate()).toString().padLeft(2, "0");
 return sRtn;
}

Date

소스 위치

Sample\Sample_Script\np_Script_Date_WeekOfYear.xfdl

13.6.14Date 객체 사용시 주의사항

Date 객체를 사용하여 날짜를 생성할때, 월과 일을 설정하려면 아래와 같이 처리해주시기 바랍니다.

방법1. Date를 먼저 설정하고 Month를 설정한다.

예)
var date = new Date();
date.setYear(2016);
date.setDate(1);   
date.setMonth(3);

방법2. setMonth 메소드에서 date와 month를 한번에 설정한다.

예)
var date = new Date();
date.setYear(2016);
date.setMonth(3, 1);

방법3. Date 객체에 바로 설정하여 생성한다.

예) 
var date = new Date(2016, 3, 1);

위의 방법대로 설정하지 않으면, 날짜 오류가 발생합니다.


예를 들어, 금일 날짜가 3월 31일 경우, 아래의 순서대로 스크립트를 처리하면 생성되는 날짜는 2016년 5월 1일이 됩니다.

var date = new Date();

date.setYear(2016);

date.setMonth(3);

이러한 문제를 없애기 위해서는 항상 변수를 선언할 땐 초기화를 해주시기 바랍니다.

13.7System

13.7.1화면의 함수 유무 확인하기

typeof 함수를 이용하여 화면에 특정 함수가 있는지를 확인할 수 있습니다.

그림 13-45System_0

주요 소스 내용

/*
 * File Name   : Script_System_ExistFunction
 * Discription : Verifying the function on the screen
 */
this.btn_execute_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
    var sRtn = this.fn_existFunction(this.edt_input.value);
 this.edt_output.set_value(sRtn);
}
/*
 * Function Name : fn_checkTelNo
 * Discription   : Verifying the function on the screen
 * Parameter     : Function
 * Return        : true, false
 * Example       : fn_existFunction("fn_test");
 */
this.fn_existFunction = function(sValue)
{
 //Check the function if input value is undefined
 if (this[sValue] == undefined) 
 {
   return false;
 } 
 else 
 {
  // "fn_test" Checking the type of  function
  this.alert("function checking is             "+typeof(this[sValue]));
  if (typeof(this[sValue]) == "function")
  {
   return true;
  }
  else
  {
   return false;
  }
 }
}
/*
 * Function Name   : fn_test
 * Discription : Checking function if it exists on screen or not
 */
this.fn_test1 = function()
{ 
}

typeof, 함수

소스 위치

Sample\Sample_Script\np_Script_System_ExistFunction.xfdl

13.7.2Form의 컴포넌트 목록 구하기

Form의 components속성과 배열을 이용하여 화면이 가지고 있는 컴포넌트 목록을 구할 수 있습니다.

그림 13-46Script_System_FormComponentList_0

참고사항

components

Form 객체에 있는 컴포넌트 리스트에 접근하는 속성이다.

주요 소스 내용

this.fn_getFormComponentList = function()
{
 var arrCompList = this.components;
 for(var i=0; i<arrCompList.length;i++)
 {
  this.ds_data.addRow();
  this.ds_data.setColumn(i, "DATA" ,arrCompList[i].name);
 } 
}

components, 컴포넌트리스트

소스 위치

Sample\Sample_Script\np_Script_System_FormComponentList.xfdl

13.7.3현재 화면 아이디 값을 확인

formurl 속성을 이용하여 현재 화면의 파일명을 구합니다.

그림 13-47Script_System_FormID_0

주요 소스 내용

/*
 * File Name   : Script_System_FormID
 * Description : Finding current screen file name
 */
 
/*  Button Click  */
this.btn_execute_onclick = function(obj:Button,  e:nexacro.ClickEventInfo)
{
 var sRtn = this.fn_formID(); 
 this.edt_output.set_value(sRtn);
}
/*
 * Function Name : fn_formID
 * Description   : Finding current screen file name
 * Parameter     : 
 * Return        : Form ID
 * Example       : fn_formID();
 */
this.fn_formID = function() 
{
 var sUrl   = this.getOwnerFrame().formurl;
 var nStart = 0;
 var nIndex = sUrl.indexOf("::");
 if ( nIndex > - 1)
 {
    nStart = nIndex + 2;
 }
 
 var nEnd    = sUrl.indexOf(".xfdl");
 var sFromId = sUrl.substring(nStart, nEnd); 
    
 //In case if you have sub folder
 if (sFromId.indexOf("\\") > -1)
 {
  var arPath = sFromId.split("\\"); 
  sFromId    = arPath[arPath.length - 1];
 }
 return sFromId;
}

formurl, getOwnerFrame

소스 위치

Sample\Sample_Script\np_Script_System_FormID.xfdl

13.8User Function

특정 API를 사용하기 보다는 스크립트의 기능을 주로 하여 기능을 구현하는 샘플을 제공합니다.

User Function은 고객사의 상황에 따라 값이 달라질 수 있으므로 반드시 체크 후

사용을 하시기 바랍니다.

13.8.1배열 정렬하기

sort 메소드를 이용하여 배열을 정렬한다.

그림 13-48Script_User_ArraySort_0

Sort

소스 위치

Sample\Sample_Script\np_Script_User_ArraySort.xfdl

13.8.22차원 배열 사용하기

그림 13-49Script_User_TwoDemensionArray_0

소스 위치

Sample\Sample_Script\np_Script_User_TwoDemensionArray.xfdl

13.8.3사업자번호 체크하기

그림 13-50Script_User_CheckBRN

소스 위치

Sample\Sample_Script\np_Script_User_CheckBRN.xfdl

13.8.4법인등록번호 체크하기

그림 13-51Script_User_CheckCRN_0

소스 위치

Sample\Sample_Script\np_Script_User_CheckCRN.xfdl

13.8.5전자메일(e-mail) 유효성 체크하기

그림 13-52Script_User_CheckEmail_0

소스 위치

Sample\Sample_Script\np_Script_User_CheckEmail.xfdl

13.8.6입력값 널 판단하기

그림 13-53Script_User_CheckNull_0

소스 위치

Sample\Sample_Script\np_Script_User_CheckNull.xfdl

13.8.7주민번호 체크하기

그림 13-54Script_User_CheckSSN_0

소스 위치

Sample\Sample_Script\np_Script_User_CheckSSN.xfdl

13.8.8주민등록번호로 성별 가져오기

그림 13-55Script_User_SSNToGender_0

소스 위치

Sample\Sample_Script\np_Script_User_SSNToGender.xfdl

13.8.9decode 함수 구현하기

그림 13-56Script_User_Decode_0

소스 위치

Sample\Sample_Script\np_Script_User_Decode.xfdl

13.8.10삼항연산자 구현하기

그림 13-57Script_User_Iif_0

소스 위치

Sample\Sample_Script\np_Script_User_Iif.xfdl

13.8.11공통 스크립트 include하기

그림 13-58Script_User_IncludeScript_0

소스 위치

Sample\Sample_Script\np_Script_User_IncludeScript.xfdl

13.8.12undefined을 ""로 반환하기

그림 13-59Script_User_UndefineToNull_0

소스 위치

Sample\Sample_Script\np_Script_User_UndefineToNull.xfdl

13.8.13만(서양 나이)으로 나이(연령)구하기

그림 13-60Script_User_WestenAge_0

소스 위치

Sample\Sample_Script\np_Script_User_WestenAge.xfdl