본문 바로가기

대외활동/TNS Internship

100222 TNS Korea Internship (49/53)

1. 

정규식쪽으로 가닥을 잡았다.
문항번호는 AQ1, AQ2, AQ3, AQ4 ... 이렇게 나간다.
그리고 만약 AQ33번이 3DGrid문항이라면,
내부의 문항Object들은
AQ33_1st
AQ33_2nd
AQ33_3rd
AQ33_4th
...
이렇게 나가게된다.
( ※ 순위를 묻는 문항에만 해당)
그렇다면 내부문항들을 참조할 수 있는 이름들은
3DGridQuestionName + _ + num + st,nd,rd,th,th,th,th...
이렇게 나가게 되는데, 저 조합을 일반화 하면 되겠다.

우선 맨 앞의 3DGridQuestionName.
CurrentForm()을 사용하기로 했다.
(아래는 CurrentForm()에 대한 자세한 설명)

CurrentForm is used in validation code (or in functions called from validation code) and returns the
question ID (string) of the question currently being validated. From Confirmit 9.0 this is also true for
questions inside 3D grids: Used inside the validation code field of one of the questions inside the 3D
grid, it will give the question id of that question instead of the id of the 3D grid itself.
You can use this to write generic code that can be reused without having to change the question ID.

자, 우선 3DGrid 문항의 경우 validation code는 맨 마지막 Object에 넣는다는 규칙에서 힌트를 얻었다.
(그리고 내가 아는 한 이 방법이 아니면 이 문제는 해결할 수 없다.)

사용자 삽입 이미지


위의 경우, AQ34_6th에 validation code를 넣고, CurrentForm()을 사용하면,

사용자 삽입 이미지

짜잔. 이렇게 성공적으로 받아옴을 알 수 있다.
이제 저 패턴을 분석하기로 하자.
...

앞에는 문자 및 숫자가 나오고 underbar 이후에 기수가 나온다.
이걸 정규식으로 표현하면,
/^([A-Za-z0-9]*\_)([0-9]+)([A-Za-z]*)/
이렇게 된다.

이렇게 만든 새로운 코드

function check3d()                                                 // 3DGrid의 각 column값이 중복되는지 validation해 주는 function
{

   var temp = CurrentForm();                                  // 현재 question의 ID가 들어온다.
   var obj = /^([A-Za-z0-9]*\_)([0-9]+)([A-Za-z]*)/; // 토큰별로 분리해주는 정규식

   var preqid = temp.replace(obj, '$1');                     // 앞부분을 preqid에 저장
   var insnum = temp.replace(obj, '$2');                  // 숫자부분을 insnum에 저장
   var postfix;                                                       // 서수를 저장하는 변수
   var currentValue;                                               // 해당 행에서 프리코드 값을 저장하는 변수
   var currentValues = new Array();                          // 프리코드 값들을 저장하는 변수

   insnum = parseInt(insnum, 10);                         // 숫자부분을 10진수로 변환

   var allQIDArr= new Array();                                 // 3DGrid 내부의 qid들을 저장할 배열 선언
       
   for (var i=insnum; i>=1; i--)                               // 마지막 문항에서부터 첫문항까지 (내부 문항의 개수만큼)
   {
      if (i%10 == 3)                                                // 10으로 나눈 나머지가 3이면
           postfix = "rd";                                             // third를 붙인다.
      else if (i%10 == 2)                                         // 10으로 나눈 나머지가 3이면
           postfix = "nd";                                            // second를 붙인다.
      else if (i%10 == 1)                                         // 10으로 나눈 나머지가 3이면
           postfix = "st";                                             // first를 붙인다.
      else                                                              // 그밖엔
           postfix = "th";                                             // th를 붙인다.
     
      allQIDArr[i] = preqid+i+postfix;                        // qid를 조합, 배열에 넣는다.
     
      ShowAlert(allQIDArr[i]);


      currentValue = f(allQIDArr[i])                         // 우선 하나씩 precode값을 currentvalue에 넣는다.
      currentValue = parseInt(currentValue, 10);     
      currentValues[i] = currentValue;                     // 그리고 그걸 배열에 차례대로 넣는다.

   }


   for (var j=0;j<currentValues.length;j++)              // 그 배열의 길이동안
    {
        for (var k=(j+1);k<currentValues.length;k++) // 바로 다음의 항들과 
        {
               if (currentValues[j] == currentValues[k])  // 값을 비교해서 같으면,
               {
                    RaiseError();                                   // 에러메시지 출력
                    SetErrorMessage(LangIDs.ko,ErrorTemplate("각 순위에는 다른 값을 선택해 주세요."));
               }    
        }
   }
}


사용법.

사용자 삽입 이미지

이렇게 Script Object를 하나 만들고,
그 안에 코드를 넣고

사용자 삽입 이미지

마지막으로,

사용자 삽입 이미지
< 다시 아까의 구조.  >

3DGrid를 구성하는 맨 마지막 항목 (여기서는 AQ34_6th) 의
validation code 에,

사용자 삽입 이미지

이렇게 간단하게(!) 한줄만 넣으면 준비 끝.
예전처럼 Set 선언하고 그 안에 QID를 일일이 넣어줄 필요가 없게 됐다.

처음에 JH대리님이 말씀하셨을 때는 안 될 것 같았는데,
역시 세상에 안되는 일은 없다는 말이 꼭 맞는 듯!
실행시켜보면,

사용자 삽입 이미지

기존 버전처럼 여전히 잘 동작하는 것을 알 수 있다.

여기서 드는 성능에 대한 의문.
그럼, 몇개까지 가능할까?
나는 우선 이렇게 만들어 보았다.

사용자 삽입 이미지

24순위다.
설마 24순위 이상 물어보는 경우가 있을까.
마찬가지로 맨 마지막의 'AQ34_24th'의 val에,
check3d();
라고 넣고 실행하면.

사용자 삽입 이미지

이렇게 잘 동작하는 것을 알 수 있다.
정규식의 강력한 성능으로 볼때, 24개뿐만 아니라
Javascript의 배열이 허용하는 만큼까지 가능할 듯.

그렇다면 자바스크립트는 어디까지 허용할까?


3DGrid Validation 완료!!