반응형
일단 코드 전체를 함 보자.
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 수정 사항
기존에 복사해온 문장에서 탭이 들어가 있으면 드럽게 길어져서 보기가 불편한 사항이 있었다.
그래서 탭을 스페이스로 치환하는거 추가.
그리고 창을 옆으로 늘릴 경우 텍스트영역이 고정이었었는데 늘어나게 수정했음.ㅋ
<html>
<head>
<title>쿼리 파라메터 매칭 Ver 1.0 </title>
<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
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 수정 사항
기존에 복사해온 문장에서 탭이 들어가 있으면 드럽게 길어져서 보기가 불편한 사항이 있었다.
그래서 탭을 스페이스로 치환하는거 추가.
그리고 창을 옆으로 늘릴 경우 텍스트영역이 고정이었었는데 늘어나게 수정했음.ㅋ
반응형
댓글