본문 바로가기
TechNical/WMI

HTA] 특정 문자를 찾아서 배열에서 차례대로 매칭 시키기

by 강멍멍이 2010. 6. 11.
반응형
일단 코드 전체를 함 보자.

<html>
 <head>
  <title>쿼리 파라메터 매칭 Ver 1.0 </title>
  <HTA:APPLICATION
       ID="HelpBuildAll"
       APPLICATIONNAME="쿼리 파라메터 매칭 Ver 1.0"
       SCROLL="no"
       SINGLEINSTANCE="yes"
       WINDOWSTATE="normal"
  >
 
  <style>
   BODY
   {
      background-color: buttonface;
      font-family: Helvetica;
      font-size: 10pt;
      margin-top: 5px;
      margin-left: 5px;
      margin-right: 5px;
      margin-bottom: 5px;
   }
   
   
   .button
   {
      font-family: Helvetica;
      font-size: 8pt;
      width: 92px;
   
   }
   
   textarea
   {
      font-family: arial;
      font-size: 10pt;
   }
   
   select
   {
      font-family: arial;
      font-size: 10pt;
      width: 200px;
      margin-left: 0px;
   }
   
   
  </style>
 
  <script language="VBScript">  
   
    Sub Window_Onload
         
          window.resizeTo 640,800
          window.moveTo 100, 100
      End Sub
   
      Sub Run     
     
          targetChar = "?"
         
          resultStr = ""         
                 
        tempStr = sourceTA.Value
       
        arrLines = Split(tempStr, vbCrLf)
       
        paramStr = paramTA.Value
       
        arrParam = Split(replace(paramStr, " ", ""), ",")
       
        cnt = 0
       
        For Each strLine in arrLines
         
          Do While (InStr(strLine, targetChar) > 0)             
               savePos = InStr(strLine, targetChar) + 1
                rpStr = replace(Mid(strLine, 1, InStr(strLine, targetChar)), targetChar, "'" & arrParam(cnt) & "'")
                strLine = rpStr & Mid(strLine, savePos, Len(strLine))
                cnt = cnt + 1             
          Loop
         
          resultStr = resultStr & replace(strLine, vbTab , " " ) & VbCrLf
         
        Next       
       
       resultTA.Value = resultStr
         
      End Sub
 
  </script>
 
 </head>
 
 <body>
 <center><font color="blue"><b>☆ 첫번째 박스에 파라메터 넣고, 두번째 박스에 쿼리 넣고 밑에 버튼 클릭 ☆</b></font></center>
 
  <textarea name="paramTA" rows="1" style="width:100%"></textarea>
  <textarea name="sourceTA" style="width:100%;height:20%"></textarea>
 
  <p>
   
  <textarea name="resultTA" rows="30" style="width:100%;height:100%"></textarea>
 
  </p>
  <center>
  <button onclick="Run">맹글어 주면 감사ㅋ</button>
  </center>
 
 </body>
 
</html>


설명..
이 프로그램의 목적은 동적쿼리와 파라메터를 좀 쉽게 매칭시켜 보자는 취지에서 비롯 되었다.
무슨 말인고 하니..
파라메터로 1, 2, 3, 4 가 넘어 갔고
쿼리는 아래와 같이 나왔다고 하자.

SELECT *
   FROM TABLE
 WHERE a = ?
     AND b IN (?, ?)
     AND c = ?

이렇게 있을 경우 파라메터와 쿼리를 매칭해서 실행가능한 쿼리를 뽑아내는데 목적이 있다.    
그러면 이렇게 결과가 나와야 한다.


SELECT *
   FROM TABLE
 WHERE a = '1'
     AND b IN ('2', '3')
     AND c = '4'

심플하다. ㅋ

간단하게 코드 설명. 핵심은 몇 줄 안 된다 ;;

For Each strLine in arrLines
         
          Do While (InStr(strLine, targetChar) > 0)             
               savePos = InStr(strLine, targetChar) + 1
                rpStr = replace(Mid(strLine, 1, InStr(strLine, targetChar)), targetChar, "'" & arrParam(cnt) & "'")
                strLine = rpStr & Mid(strLine, savePos, Len(strLine))
                cnt = cnt + 1             
          Loop
         
          resultStr = resultStr & strLine & VbCrLf
Next

한 라인씩 읽어들여서
For Each strLine in arrLines

문장에서 ?가 있으면 루프를 돌아서
Do While (InStr(strLine, targetChar) > 0)

일단 ?가 나타난 위치를 저장해 뒀다가
savePos = InStr(strLine, targetChar) + 1

?가 처음 나타난 위치까지만 지정해서 파라메터를 배열에 저장해둔 순서대로 매칭을 시켜서 바꾼다.
이렇게 하는 이유는 한 라인에서 ?가 여러번 나타날 경우 replace 함수가 몽땅 바꿔버리기 때문이다.
그래서 ?를 나타난 순서대로 파라메터 배열에서 꺼내서 매치하기 위해 중간씩 잘라서 replace하는
방식을 선택했다.
rpStr = replace(Mid(strLine, 1, InStr(strLine, targetChar)), targetChar, "'" & arrParam(cnt) & "'")

?를 파라메터로 변경한 구간과 그 이후의 구간을 합쳐서 다시 한 문장으로 만든다.
strLine = rpStr & Mid(strLine, savePos, Len(strLine))

파라메터 배열에서 다음 값을 가져오게 1을 증가 시킨다.
cnt = cnt + 1  


프로그램 설명은 여기까지고 이하 여담.....
HTA는 HTML Application이라고 하는데 간단한 프로그램을 제작할 수 있는 상당히 유용한 어플이다.
별도의 툴도 필요 없고 컴파일러도 필요 없고 윈도우 환경이라면 메모장으로 만들고 바로 실행 시킬 수 있다.
HTML기반에 VB로 코딩을 할 수 있으니 다양한 처리가 가능하다.
그래서 단순노가다 작업을 요렇게 프로그램으로 만들어서 쉽게 처리 할 수 있다.
그지깽꺵이 같은 거 많이 만들어 놨지만 특정 환경에서만 쓸 수 있기 때문에 포스팅 하지는 않는다. ㅋ
이번의 경우는 글쎄.. 이거 왜 올린겨 -_- 그냥 이렇게 처리 할 수 도 있다라고 나불거리는거.... =_=???


---- 2010.06.11 수정 사항
기존에 복사해온 문장에서 탭이 들어가 있으면 드럽게 길어져서 보기가 불편한 사항이 있었다.
그래서 탭을 스페이스로 치환하는거 추가.
그리고 창을 옆으로 늘릴 경우 텍스트영역이 고정이었었는데 늘어나게 수정했음.ㅋ
반응형

댓글