블로그 이미지
baragi76

카테고리

분류 전체보기 (115)
생활 (10)
My Story (34)
My Album (1)
HomePage (0)
Hobbies (21)
Develop (42)
Utility (1)
Project (6)
Statistics Graph
Total234,719
Today4
Yesterday22

공지사항

달력

« » 2019.12
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
<!--

// radio 또는 checkbox가 배열또는 특정문자열의 반복으로 구성된 값을 넘길때 submit()

// 체크된 값은 "y", 그렇지 않은 값은 "n"을 넘긴다.

// ex) <input type='checkbox' name='chkVal_1'>

function fSubmit() {

var f=document.form;

for (var i=0; i<f.elements.length; i++) {

if (f.elements[i].name.substr(0,6) == 'chkVal') {

if (f.elements[i].checked == false) f.elements[i].value = 'n';

else f.elements[i].value = 'y';

}

}

f.submit();

}



// 팝업을 오픈한 동시에 부모창에서 팝업으로 submit

// <form name='fm'>에서 실행시켜 result.html로 넘긴다

function popSubmit(f) {

var pop=window.open("","pop_submit","top=10,left=10,toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=yes,width=200,height=200);

f.method = "post";

f.action = "result.html";

f.target = "pop_submit";

f.submit();

pop.focus();

}



// 부모창의 값을 특정스크립트(result.html)에 넘긴다(팝업이 parent를 조절)

function parentSubmit(f) {

f.method = "post";

f.action = "result.html";

f.target = "_self";

f.submit();

self.close();

}



// 한 페이지에 선택될 갯수를 저장할 전역변수

// 한 페이지에 최대 4개를 선택한다.

var Select_Count = 0;

// onClick 이벤트실행시 수행되며 onChange 이벤트에서 이전값을 저장하기위한 전역변수

var Click_Value;



// 노출 radio 버턴의 패턴을 바꿀때

function DisplayChange(card_id,val) {

var opt=eval("document.form.chkDisplay_"+card_id);

var sel=eval("document.form.chkSelect_"+card_id);

var ordText=eval("OrderText_"+card_id);



for (var i=0; i<opt.length; i++) {

if ((opt[i].checked == true) && (val == 1)) {

if (Select_Count >= 4) {

alert('Over !!!');

opt[i].checked = false;

opt[i].checked = true;

return;

}

sel.style.color='#c4018a';

sel.style.background.color='#f8f7f7';

sel.disabled = false;

if (sel.options[sel.selectedIndex].value > 0) {

ordText.style.display='';

Select_Count++;

} else ordText.style.display='none';

} else if ((opt[i].checked == false) && (val == 0)) {

sel.disabled = true;

ordText.style.display='none';

if (sel.options[sel.selectedIndex].value > 0) Select_Count--;

ordText.style.display='none';

}

break;

}

}



// select 값이 바뀌면 실행되는 루틴

function OrderChange(card_id) {

var sel=eval("document.form.chkSelect_"+card_id);

var ordText=eval("OrderText_"+card_id);

if (sel.value == 0) {

Select_Count--;

ordText.style.display='none';

return;

} else {

if (Select_Count < 4) {

if (Click_Value > 0) return;

else {

Select_Count++;

ordText.style.display='';

return;

}

} else {

if (Click_Value > 0) return;

else {

alert('Over !!!');

sel.value=Click_Value;

return;

}

}

}

}



// select 박스를 클릭하면 실행되는 루틴(전역변수에 현재 클릭된 값을 저장한다)

function OrderClick(card_id) {

var sel=eval("document.form.chkSelect_"+card_id);

Click_Value = sel.value;

}



// 파일 체크박스가 1개라도 체크되어 있으면 true 리턴
function check_confirm(){

objForm = document.frmFile;
var count = 0;
if (objForm.chk != undefined){
var length = objForm.chk.length;
if(length > 1){ //체크박스가 여러개 일경우
for(var i=0; i<length; i++){
if(frmFile.chk[i].checked)
count++;
}
}else{ //체크박스가 한개일경우
if(frmFile.chk.checked)
count++;
}
}
return count;
}


// 최상위 체크 로직(chars로 넘긴 값이 있다면 true)

function containsCharsOnly(input,chars) {

for (var inx = 0; inx < input.value.length; inx++) {

if (chars.indexOf(input.value.charAt(inx)) == -1)

return false;

}

return true;

}





// 최상위 체크 로직(chars로 넘긴 값이 있다면 false)

function containsChars(input,chars) {

for (var inx = 0; inx < input.value.length; inx++) {

if (chars.indexOf(input.value.charAt(inx)) != -1)

return true;

}

return false;

}







// 숫자 체크

function isNum(input) {

var chars = "0123456789";

return containsCharsOnly(input,chars);

}







// 이름체크

function nameCheck(input){

var chars = '0123456789~!@#$%^&*()_-+=|{}[]<>,./?';

return containsChars(input,chars);

}







// 전화 번호 Check

function isPhoneCheck(input) {

var chars = "0123456789( ).-,<>{}[]_~";

return containsCharsOnly(input,chars);

}







// 영문 판별

function isPhoneCheck(input) {

var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

return containsCharsOnly(input,chars);

}







// 영숫자 판별

function isPhoneCheck(input) {

var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

return containsCharsOnly(input,chars);

}







// 입력값이 숫자,대시(-)로 되어있는지 체크

function isNumDash(input) {

var chars = "-0123456789";

return containsCharsOnly(input,chars);

}







// 입력값이 숫자,콤마(,)로 되어있는지 체크

function isNumComma(input) {

var chars = ",0123456789";

return containsCharsOnly(input,chars);

}







// 입력값이 사용자가 정의한 포맷 형식인지 체크

// 자세한 format 형식은 자바스크립트의 ''regular expression''을 참조

function isValidFormat(input,format) {

if (input.value.search(format) != -1) {

return true; file://올바른 포맷 형식

}

return false;

}







/**

* 입력값이 이메일 형식인지 체크

* ex) if (!isValidEmail(form.email)) {

* alert("올바른 이메일 주소가 아닙니다.");

* }

*/

function isValidEmail(input) {

// var format = /^(\S+)@(\S+)\.([A-Za-z]+)$/;

var format = /^((\w|[\-\.])+)@((\w|[\-\.])+)\.([A-Za-z]+)$/;

return isValidFormat(input,format);

}







/**

* 입력값이 전화번호 형식(숫자-숫자-숫자)인지 체크

*/

function isValidPhone(input) {

var format = /^(\d+)-(\d+)-(\d+)$/;

return isValidFormat(input,format);

}







// 콤마 없애기

function removeComma(input) {

return input.value.replace(/,/gi,"");

}







// 문자 변환 함수

function alterString(str,before,after) {

var returnStr = "";

for(i = 0; i < str.length; i++) {

value = str.charAt(i);

index = before.indexOf(value);

if(index >= 0) value = after.charAt(index);

returnStr += value;

}

return returnStr;

}







// 소 --> 대문자 변환 함수

function ToUpper(arg) {

var str1 = "abcdefghijklmnopqrstuvwxyz";

var str2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

return alterString(arg,str1,str2);

}







// 대 --> 소문자 변환 함수

function ToLower(arg){

var str1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

var str2 = "abcdefghijklmnopqrstuvwxyz";

return alterString(arg,str1,str2);

}







// 반각 문자를 전각문자로

function convert2ByteChar(x_char) {

var x_2byteChar = ""; //컨버트된 문자

var c = x_char.charCodeAt(0);

if(32 <= c && c <= 126) { //전각으로 변환될수 있는 문자의 범위

if(c == 32) { //스페이스인경우 ascii 코드 32

x_2byteChar = unescape("%uFFFC");

} else {

x_2byteChar = unescape("%u"+gf_DecToHex(c+65248));

}

}

return x_2byteChar;

}







// 10진수를 16진수로

function gf_DecToHex(x_dec) {

var x_Hex = new Array();

var x_serial = 0;

var x_over16 = x_dec;

var x_tempNum = 0;

while(x_dec > 15) {

var x_h = x_dec % 16; //나머지

x_dec = parseInt(x_dec/16); //몫

x_Hex[x_serial++] = (x_h > 9 ? String.fromCharCode(x_h + 55) : x_h); //16진수코드변환

}







//마지막은 몫의 값을 가짐

x_Hex[x_serial++] = (x_dec > 9 ? String.fromCharCode(x_dec + 55) : x_dec); //16진수코드변환



//몫,나머지,나머지,.....

var retValue = "";

for(var i=x_Hex.length ; i>0 ;i--) {

retValue += x_Hex[i-1];

}

return retValue;

}







// input box에 space,  등 만으로 넣고 장난 칠때 이들 문자 뺀 길이를 통해 유효성 체크한다...

function CheckStr(strOriginal, strFind, strChange){

var position, strOri_Length;

position = strOriginal.indexOf(strFind);

while (position != -1){

strOriginal = strOriginal.replace(strFind, strChange);

position = strOriginal.indexOf(strFind);

}

strOri_Length = strOriginal.length;

return strOri_Length;

}







// 체크 박스에 체크가 되어 있으면 true

function checkValidator(str) {

if(str.checked) return true;

else return false;

}







// 비밀번호는 4자 등 최대 최소 길이를 파람으로 주고 처리...

function checkLength(str,minLng,maxLng){

var ckstr = str.value.length;

if (parseInt(ckstr) < parseInt(minLng) || parseInt(ckstr) > parseInt(maxLng)) return false;

return true;

}







// 숫자만 받아서 아니면 메세지 보여 주는

function onlyNumber(objEv) {

if(!isNum(objEv)){

alert("숫자만 입력가능합니다.");

objEv.value = "";

objEv.focus();

return;

}

}







// 숫자를 체크하다가 6자 등 원하는 만큼 이동후 다음 input 박스로 이동 시키는...

function goJump(fname, len, goname){

onlyNumber(fname);

if (document.all[fname].value.length == len) document.all[goname].focus();

}







// 주민등록번호 체크 로직

function check_ResidentNO(str_f_num,str_l_num){

var i3=0

for (var i=0;i<str_f_num.length;i++){

var ch1 = str_f_num.substring(i,i+1);

if (ch1<'0' || ch1>'9') i3=i3+1;

}

if ((str_f_num == '') || ( i3 != 0 )) return false;

var i4=0;

for (var i=0;i<str_l_num.length;i++){

var ch1 = str_l_num.substring(i,i+1);

if (ch1<'0' || ch1>'9') i4=i4+1;

}

if ((str_l_num == '') || ( i4 != 0 )) return false;

if(str_f_num.substring(0,1) < 4) return false;

if(str_l_num.substring(0,1) > 2) return false;

if((str_f_num.length > 7) || (str_l_num.length > 8)) return false;

if ((str_f_num == '72') || ( str_l_num == '18')) return false;



var f1=str_f_num.substring(0,1)

var f2=str_f_num.substring(1,2)

var f3=str_f_num.substring(2,3)

var f4=str_f_num.substring(3,4)

var f5=str_f_num.substring(4,5)

var f6=str_f_num.substring(5,6)

var hap=f1*2+f2*3+f3*4+f4*5+f5*6+f6*7

var l1=str_l_num.substring(0,1)

var l2=str_l_num.substring(1,2)

var l3=str_l_num.substring(2,3)

var l4=str_l_num.substring(3,4)

var l5=str_l_num.substring(4,5)

var l6=str_l_num.substring(5,6)

var l7=str_l_num.substring(6,7)

hap=hap+l1*8+l2*9+l3*2+l4*3+l5*4+l6*5

hap=hap%11

hap=11-hap

hap=hap%10

if (hap != l7) return false;

return true;

}







// 바이트 구하기

function getByteLen(str){

return(str.length+(escape(str)+"%u").match(/%u/g).length-1);

}







// url 가져오기

function getUrlAddress(){

var pageUrl = document.location;

pageUrl = new String(pageUrl);

return pageUrl.substring(0,pageUrl.lastIndexOf("/"));

}







// 오른마우스 금지, 나중에 해당 주석 풀고 사용

function rightbutton(e){

if (navigator.appName == 'Netscape' && (e.which == 3 || e.which == 2))

return false;

else if (navigator.appName == 'Microsoft Internet Explorer' && (event.button == 2 || event.button == 3))

{

alert("죄송합니다!! 정보무단복제를 막기 위하여 오른쪽 마우스 사용을 허용하지 않습니다.");

return false;

}

return true;

}







//document.onmousedown=rightbutton;



// 컨트롤 키 금지, 나중에 해당 주석 풀고 사용

function checkCtl(){

if (document.all){

if(event.keyCode==17) {

alert("죄송합니다!! 컨트롤키 사용을 허용하지 않습니다.");

return false;

}

}

}







//document.onkeydown = checkCtl;



function setCookie(name,value) {

document.cookie = name+"="+escape(value)+";path=/;domain=.kkaok.pe.kr;";

}



function setCookie(name,value, expires) {

document.cookie = name + "=" + escape(value) +

"; path=/; expires=" + expires.toGMTString();

}



function getCookie(Name) {

var search = Name + "="

if (document.cookie.length > 0) { // 쿠키가 설정되어 있다면

offset = document.cookie.indexOf(search)

if (offset != -1) { // 쿠키가 존재하면

offset += search.length

// set index of beginning of value

end = document.cookie.indexOf(";", offset)

// 쿠키 값의 마지막 위치 인덱스 번호 설정

if (end == -1)

end = document.cookie.length

return unescape(document.cookie.substring(offset, end));

}

}

}







String.prototype.trim = function(){

return this.replace(/(^\s*)|(\s*$)/gi, "");

}



//문자 바꾸기, 사용법 var str = 문자열.replaceAll("a", "1");

String.prototype.replaceAll = function(str1, str2) {

var temp_str = "";

if (this.trim() != "" && str1 != str2) {

temp_str = this.trim();

while (temp_str.indexOf(str1) > -1){

temp_str = temp_str.replace(str1, str2);

}

}

return temp_str;

}

//-->
Posted by baragi76

댓글을 달아 주세요

한 3일을 팠네요.
제목 깨지고 내용 깨지고...

먼저 환경입니다.
서버 : Lotus Domino R6.5.4
서버 OS : Windows 2003
사용자 브라우저 : IE 6.0 SP2
웹에디터: 태그프리 2,0,0,11

메일 및 일반 게시판에 중국어를 입력하였을때 제목과 내용이 깨지는 현상

* 메일
- 제목이 깨지지 않음.
- 내용에 중국어 입력시 내용 깨짐.

* 게시판
- 제목에 중국어 입력시 깨져서 저장됨.
- 내용에 중국어 입력시 내용 깨짐.

### 처리내용
- 내용처리
1. 태그프리 env.xml 파일의 encoding을 euc-kr에서 utf-8로 변경.
2. env.xml 파일의 Language Element의 apply속성을 true로 text는 default로 설정
3. env.xml 파일의 Charset Element의 apply속성을 false로 text는 utf-8로 설정
4. 한글로 입력된 주석부분을 지우지 않으면 웹에디터에 메뉴가 나타나지 않음.

- 제목처리
1. 도미노 양식의 Header에 <Meta HTTP-EQUIV=Content-Type CONTENT="text/html; charset=euc-kr">로 설정( 이유는 불분명. 메일은 제목이 깨지지 않아서 메일양식에 설정된 내용을 적용함.)

###기타 유의사항
데이터베이스 정보의 4번째 탭 하단부에 "다중 언어 선택사항"이라는 항목이 있으나, 이를 체크하면 모두 깨지는 현상이 발생. 절대 체크하지 말것.
Posted by baragi76

댓글을 달아 주세요

XML 태그중에 첫번째 Member 태그의 속성중 name 속성이 있는지 찾아서
없으면 name 속성을 추가하며 "담당"이라는 값으로 설정하는 코드 ( JS 코드 )

var memberElement = xmlDoc.getElementsByTagName("Member");
if( memberElement.item(0).getAttribute("name") == null )
{
        var attr = xmlDoc.createAttribute("name");
        attr.value = "담당";
        memberElement.item(0).setAttributeNode(attr);
}
Posted by baragi76

댓글을 달아 주세요

Notes Data To Excel I

Develop/Domino / 2010. 10. 8. 19:01
Notes 문서를 Excel 파일로 만드는 단순한 코드.

#첨부

Posted by baragi76

댓글을 달아 주세요

SameTime 설치시 JavaUserClasses 업데이트오류 발생시...


#1. notes.ini에 등록된 아래의 파라메터를 삭제처리.
SametimeServerConfig=OnDomino
CleanupScriptPath=\Trace\stdiagzip.bat



#2. notes.ini에 아래의 파라메터 추가처리.
DominoBypassFlag=-vnver6



--> STsetup.exe 실행 (반드시 Domino 서버를 내리고 처리해야함)
Posted by baragi76

댓글을 달아 주세요

# 첨부

ODBCConnection.txt



Update 쿼리를 호출할 수 있도록 기능이 추가되었습니다.

-> 다음과 같이 URL을 구성하면...
http://server_url/db.nsf/agent?openagent&order=update&set-i=2&setn-1=aaa&set-1=1111&setn-2=bbb&set-2=2222&where-i=2&wheren-1=ccc&where-1=123&wheren-2=ddd&where-2=456
결 과는 update SQL_TABLE(Declarations의 설정값) set aaa = '1111', bbb = '2222' where ccc = '123' and ddd = '456' 이렇게 RDB 서버로 Query를 전송합니다.

파라메터가 추가가 된것인데요~
set-i : 설정컬럼 수
setn-1 ~ n : 설정컬럼명( set-i로 지정한 값 만큼 설정해야 합니다.(클케하지 않으면 어떤 오류가 뜰지 모릅니다... ㅡ_ㅡ;; )
set-1 ~ n : 설정컬럼값 ( set-i로 지정한 값 만큼 설정해야 합니다.(클케하지 않으면 어떤 오류가 뜰지 모릅니다... ㅡ_ㅡ;; )
where-i : 조건컬럼 수
wheren-1 ~ n : 조건컬럼명 ( where-i로 지정한 값 만큼 설정해야 합니다.(클케하지 않으면 어떤 오류가 뜰지 모릅니다... ㅡ_ㅡ;; )
where-1 ~ n : 조건컬럼 값 ( where-i로 지정한 값 만큼 설정해야 합니다.(클케하지 않으면 어떤 오류가 뜰지 모릅니다... ㅡ_ㅡ;; )



자 아래부터는 Full 코드입니다.
이전 버전에서 변경된 부분은 파란색으로 표현하겠습니다.
----------------------------------------------------------------------------------------

****************************
(Options)
****************************

Option Public
Uselsx "*LSXODBC"


****************************
(Declarations)
****************************

Dim ss As NotesSession
Dim curDb As NotesDatabase
Dim curDoc As NotesDocument
Dim curAgent As NotesAgent                                '// 현재 Agent
Dim con As ODBCConnection
Dim query As ODBCQuery
Dim result As ODBCResultSet

Dim order As String

Const SQL_DNS                                 = "ODBC DNS"
Const SQL_ID                                         = "USER ID"
Const SQL_PASSWORD                 = "USER PASSWORD"
Const SQL_TABLE_SCHEMA        = "dbo"
Const SQL_TABLE                                = "TABLE NAME or PROCEDURE NAME"
'//★ 아래의 코드는 RDB Table과 같은 형식이어야 함. ( 코드마다 틀리게 구성해야 함. )
Const SQL_TABLE_FIELD                                        = |a,b,c,d,e,f|                        '// 결과 필드 목록
Const SQL_TABLE_FIELDTYPE                        = |STRING,STRING,STRING,INTEGER,INTEGER,STRING|                        '// 결과 필드 목록 타입
Const SQL_TABLE_FIELD_AROUND         = |^,^,^,^,^,|                                                                '// 결과 필드 둘러싸기 옵션
Dim TableDoc As NotesDocument
Dim fieldAround As Variant




****************************
Initialize
****************************

Sub Initialize
        On Error Goto ErrorHandle
        Dim qs As String
        Dim resultField As String                        '// 결과
        Set ss = New NotesSession
        Set curDb = ss.CurrentDatabase
        Set curAgent = ss.CurrentAgent
        Set curDoc = ss.DocumentContext
        qs                                                         = curDoc.Query_String_Decoded(0)
        Print |Content-type: text/xml|
        Print ||
        Call SetTableDoc( qs )        
        '// SYBASE Server 연결
        If( SQLConnection( SQL_DNS ) = False ) Then Exit Sub
        If( GetTableInfo(TableDoc.result(0)) = False ) Then Goto ProcessEnd
ProcessEnd:
        con.Disconnect
        Exit Sub
ErrorHandle:
        Print |
                                error
                                | + Error() + |
                                | + Cstr( Erl() ) + |
                        |
        Msgbox curDb.Filepath + "/" + curAgent.Name + "::initialize ERROR[" + Cstr( Erl() ) + "] : " + Error()
        Print ""
        Print curDb.Filepath + "/" + curAgent.Name + "::initialize ERROR[" + Cstr( Erl() ) + "] : " + Error()
        Print ""
        If( con.IsConnected ) Then
                con.Disconnect
        End If
        Exit Sub
End Sub



****************************
GetQueryType
****************************

Function GetQueryType( source As String ) As String
%REM
함수명 :         GetQueryType
인자        :        source                        - Query에 포함되는 필드명
반환        :        String                                - STRING, INTEGER
목적        :        Query를 구성할때 작은따옴표(')를 추가하여 Query를 구성할지에 대한 여부 체크를 위하여
작성정보        :         v1.0 / 바라기 / 2006-06-07
%END REM
        On Error Goto ErrorHandle
        GetQueryType = ""
        Dim FieldList As Variant
        Dim FieldType As Variant
        Dim index As Integer
        FieldList = Evaluate(|@Trim( @Explode("| & SQL_TABLE_FIELD & |";",") )|)
        FieldType = Evaluate(|@Trim( @Explode("| & SQL_TABLE_FIELDTYPE & |";",") )|)
        index = 0
        Forall ufl In FieldList
                If( source = Cstr( ufl ) ) Then
                        If( Ubound( FieldType ) >= index ) Then
                                GetQueryType = Cstr( FieldType(index) )
                        Else
                                GetQueryType = ""
                        End If
                End If
                index = index + 1
        End Forall
        Exit Function
ErrorHandle:
        Call WriteLog( Err(), curDb.Filepath + "/" + curAgent.Name + "::GetQueryType ERROR[" + Cstr( Erl() ) + "] : " + Error() )
        GetQueryType = ""
        Exit Function
End Function



****************************
GetTableInfo
****************************

Function GetTableInfo( res As String ) As Integer
%REM
함수명 :         GetTableInfo
인자        :        res                        - Query 결과
반환        :        Boolean                - Query 처리 결과
                                - True         : 정상처리
                                - False         : 비정상 종료
목적        :        테이블의 정보를 가져오기 위함
작성정보        :         v1.0 / 바라기 / 2006-05-25/2006-05-26
%END REM
        On Error Goto ErrorHandle
        Dim index As Integer
        Dim rowIndex As Integer
        Dim whereFlag As Boolean
        Dim writeData As String
        whereFlag = False
        query.SQL = MakeQuery( res )
'        Print || & query.SQL & ||
'        Exit Function
        If( query.SQL = "" ) Then
                Msgbox "Query를 조합하지 못하였습니다."
                GetTableInfo = False
                Exit Function
        End If
        If Not result.Execute Then
               
                If( order = "update" ) Then
                        Print |
                                        error
                                        정보 기록에 실패하였습니다.(update)
                                        | & Erl & |
                                |
                        Exit Function
                Else
               

                        Messagebox result.GetExtendedErrorMessage + "/" + result.GetErrorMessage
               
                End If
               

                GetTableInfo = False
                Exit Function
        End If

       
        '// 갱신 코드 처리완료
        If( order = "update" ) Then
                Print |갱신 처리가 완료되었습니다.|
                GetTableInfo = True
                Exit Function
        End If
       


        result.MaxRows = 14000
        If( result.NumRows = 0 ) Then
                Print "검색한 결과가 없습니다."
                GetTableInfo = False
                Exit Function
        End If
        Print ||
        index = 0
        Do
                result.NextRow
                Print ""
                If( result.CurrentRow <> 0 ) Then
                        If( res = "" Or Lcase( res ) = "all" ) Then
                                rowIndex = 1
                                Forall utdi In TableDoc.GetItemValue( "FieldList" )
                                        If( Trim( result.GetValue( rowIndex ) ) >< "" ) Then
                                                writeData = result.GetValue( rowIndex )
                                                While( Asc( Right( writeData, 1 ) ) = 0 Or ( Asc( Right( writeData, 1 ) ) > 126 And Asc( Right( writeData, 1 ) ) < 256 ))
                                                        writeData = Left( writeData, Len( writeData )-1 )
                                                Wend
                                                Print |<| & Cstr( utdi ) & |>|
                                                Print Strleft( fieldAround(rowIndex-1), "^" )
                                                Print Trim( writeData )
                                                Print Strright( fieldAround(rowIndex-1), "^" )
                                                Print ||
                                        Else
                                                Print "<" & Cstr( utdi ) & "/>"
                                        End If
                                        rowIndex = rowIndex + 1
                                End Forall
                        Else
                                If( Trim( Strrightback( res, " " ) ) <> "" ) Then
                                        Print "<" + Strrightback( res, " " ) + ">" + result.GetValue(1) + "                                 Elseif( Strleft( res, "(" ) <> "" ) Then
                                        Print "<" + Strleft( res, "(" ) + ">" + result.GetValue(1) + "                                 Else
                                        Print "<" + res + ">" + result.GetValue(1) + "                                 End If
                        End If
                Else
                        Print "Completed"
                End If
                Print ""
                index = index + 1
        Loop Until result.IsEndOfData
        Print ||
        GetTableInfo = True
        Exit Function
ErrorHandle:
        Call WriteLog( Err(), curDb.Filepath + "/" + curAgent.Name + "::GetTableInfo ERROR[" + Cstr( Erl() ) + "] : " + Error() )
        GetTableInfo = False
        Exit Function
End Function




****************************
MakeQuery
****************************

Function MakeQuery( res As String )As String
%REM
함수명 :         MakeQuery
인자        :        res                - Query 결과
반환        :        String                - Query 조합 결과
목적        :        테이블의 데이터를 가져오기위한 Query 조합
작성정보        :         v1.0 / 바라기 / 2006-05-24 / 2006-05-26
%END REM
        On Error Goto ErrorHandle
        Dim returnQuery As String                        '// Query
        Dim whereFlag As Boolean                        '// where절 추가상태 여부
        Dim curItemName As String                        '// Query 구성 Item명
        Dim separator As String                                '// 파라메터간 구분자
        If( Lcase( TableDoc.Order(0) ) = "select" Or Lcase( TableDoc.Order(0) ) = "" ) Then
                '// Select 구문인 경우
                If( res = "" Or Lcase( res ) = "all" ) Then
                        returnQuery = "Select * from " + SQL_TABLE
                Else
                        returnQuery = "Select " + res + " from " + SQL_TABLE
                End If
                Forall utdi In TableDoc.Items
                        curItemName = Lcase( utdi.Name )
                        '// result, fieldlist, order 필드는 Query에 포함되지 않음.
                        If( curItemName <> "result" And curItemName <> "fieldlist" And curItemName <> "fieldtype" And curItemName <> "order" And Left( curItemName, 6 ) <> "param-" ) Then
                                '// n_로 시작하는 필드는 n_ 다음 String으로 쿼리를 구성함.
                                If( Left( utdi.Name, 2 ) = "n_" ) Then
                                        returnQuery = returnQuery + MakeQueryElement( Rightbp( utdi.Name, Len(utdi.Name)-2 ), utdi.Values(0), False, whereFlag )
                                Else
                                        returnQuery = returnQuery + MakeQueryElement( utdi.Name, utdi.Values(0), True, whereFlag )
                                End If
                        End If        
                End Forall
       
        Elseif( Lcase( TableDoc.Order(0) ) = "update" ) Then
                '// Update 구문인 경우
                returnQuery = TableDoc.Order(0)+ " " + SQL_TABLE
                For i% = 1 To Cint( TableDoc.GetItemValue( "setItem-i" )(0) )
                        If( i% > 1 ) Then
                                separator = |, |
                        Else
                                separator = | set |
                        End If
                        returnQuery = returnQuery + separator + TableDoc.GetItemValue( "setItemName-" & Cstr(i%) )(0) + |='|
                        returnQuery = returnQuery + TableDoc.GetItemValue( "setitem-" & Cstr(i%) )(0) + |'|
                Next
                For i% = 1 To Cint( TableDoc.GetItemValue( "whereItem-i" )(0) )
                        If( i% > 1 ) Then
                                separator = | and |
                        Else
                                separator = | where |
                        End If
                        returnQuery = returnQuery + separator + TableDoc.GetItemValue( "whereItemName-" & Cstr(i%) )(0) + | = '|
                        returnQuery = returnQuery + TableDoc.GetItemValue( "whereItem-" & Cstr(i%) )(0) + |'|
                Next
       

        Else
                '// 프로시저 호출일 경우
                returnQuery = TableDoc.Order(0) + " " + SQL_TABLE
                For i%=1 To Cint( TableDoc.GetItemValue( "param-i" )(0) )
                        If( i% > 1 ) Then
                                separator = |,'|
                        Else
                                separator = | '|
                        End If
                        returnQuery = returnQuery + separator + TableDoc.GetItemValue( "param-" & Cstr(i%) )(0) + |'|
                Next
        End If
        MakeQuery = returnQuery
        Exit Function
ErrorHandle:
        Call WriteLog( Err(), curDb.Filepath + "/" + curAgent.Name + "::MakeQuery ERROR[" + Cstr( Erl() ) + "] : " + Error() )
        MakeQuery = ""
        Exit Function
End Function




****************************
MakeQueryElement
****************************

Function MakeQueryElement( itemName As String, source As String, equalOption As Boolean, whereFlag As Boolean )As String
%REM
함수명 :         MakeQueryElement
인자        :        itemName         - Query 필드
                        source                - Query 필드 값
                        equalOption        - 포함되는 값을 찾으려면 True, 포함되지 않는 값을 찾으려면 False
                        whereFlag         - where 구문 삽입 유무
반환        :        String                - Query 조합 결과
목적        :        Query 부분 조합
                        - 2006-06-07 : Integer를 Query에 포함시키기 위하여 기능 추가
작성정보        :         v1.0 / 바라기 / 2006-05-24 / 2006-06-07
%END REM
        On Error Goto ErrorHandle
        Dim pluralValue As Variant        '// source 값 복수시 Explode
        Dim returnQuery As String        '// 결과 반환값
        Const REF_CALCULATE_BLOCK = " AND "                '//조건 블럭간 조건
        Dim valueCompare As String                        '// 등호, 같음 또는 같지 않음 체크
        Dim bitCalculator As String                        '// 같음 일때는 OR, 다름 일때는 AND 여야 함.
        Dim itemType As String                                '// Query에 포함될 Item의 속성(STRING, INTEGER ... )
        Dim quotationValue As String                '// Query에 포함될 Item의 속성에 따른 인용부호
        If( equalOption ) Then
                valueCompare = " = "
                bitCalculator = " OR "
        Else
                valueCompare = " <> "
                bitCalculator = " AND "
        End If
        itemType = GetQueryType( itemName )
        If( Ucase( itemType ) = "STRING" Or Ucase( itemType ) = "" ) Then
                quotationValue = "'"
        Else
                quotationValue = ""
        End If
        If( Trim( source ) <> "" ) Then
                If( Strleft( source, "," ) <> "" ) Then
                        '// 복수
                        If( whereFlag ) Then
                                returnQuery = returnQuery + REF_CALCULATE_BLOCK
                        End If
                        pluralValue = Evaluate(|@Unique( @Trim( @Explode("| & source & |";",") ) )|)
                        Forall upv In pluralValue
                                If( whereFlag ) Then
                                        If( Cstr( upv ) = Cstr( pluralValue(0) ) ) Then
                                                '// 첫번째 조건값
                                                If( Left( Cstr( upv ), 1 ) = "[" And Strleft( Cstr( upv ), "]" ) <> "" ) Then
                                                        '// LIKE와 같은 구문이 있는 경우 (ex: [LIKE]AA%)
                                                        returnQuery = returnQuery + " ( " + itemName + " " + Strleft( Strright( Cstr( upv ) , "[" ), "]" ) + " " + quotationValue + Strright( Cstr( upv ), "]" ) + quotationValue
                                                Else
                                                        returnQuery = returnQuery + " ( " + itemName + valueCompare + quotationValue + Cstr( upv ) + quotationValue
                                                End If
                                        Else
                                                '// 두번째 이후 조건값
                                                If( Left( Cstr( upv ), 1 ) = "[" And Strleft( Cstr( upv ), "]" ) <> "" ) Then
                                                        '// LIKE와 같은 구문이 있는 경우 (ex: [LIKE]AA%)
                                                        returnQuery = returnQuery + bitCalculator + itemName + " " + Strleft( Strright( Cstr( upv ) , "[" ), "]" ) + " " + quotationValue + Strright( Cstr( upv ), "]" ) + quotationValue
                                                Else
                                                        returnQuery = returnQuery + bitCalculator + itemName + valueCompare + quotationValue + Cstr( upv ) + quotationValue
                                                End If
                                        End If
                                Else
                                        '// where절이 없는 경우 추가
                                        If( Left( Cstr( upv ), 1 ) = "[" And Strleft( Cstr( upv ), "]" ) <> "" ) Then
                                                '// LIKE와 같은 구문이 있는 경우 (ex: [LIKE]AA%)
                                                returnQuery = returnQuery + " where ( " + itemName + " " + Strleft( Strright( Cstr( upv ) , "[" ), "]" ) + " " + quotationValue + Strright( Cstr( upv ), "]" ) + quotationValue
                                        Else
                                                returnQuery = returnQuery + " where ( " + itemName + valueCompare + quotationValue + Cstr( upv ) + quotationValue
                                        End If
                                        whereFlag = True
                                End If
                        End Forall
                        returnQuery = returnQuery + ")"
                Else
                        '// 단수
                        If( whereFlag ) Then
                                '// where 절을 이미 삽입한 경우
                                If( Left( source, 1 ) = "[" And Strleft( source, "]" ) <> "") Then
                                        '// LIKE와 같은 구문이 있는 경우 (ex: [LIKE]AA%)
                                        returnQuery = returnQuery + REF_CALCULATE_BLOCK + itemName + " " + Strleft( Strright( source , "[" ), "]" ) + " " + quotationValue + Strright( source, "]" ) + quotationValue
                                Else
                                        returnQuery = returnQuery + REF_CALCULATE_BLOCK + itemName + valueCompare + quotationValue + source + quotationValue
                                End If
                        Else
                                '// where 절이 없는 경우 추가
                                If( Left( source, 1 ) = "[" And Strleft( source, "]" ) <> "" ) Then
                                        '// LIKE와 같은 구문이 있는 경우 (ex: [LIKE]AA%)
                                        returnQuery = returnQuery + " where " + itemName + " " + Strleft( Strright( source , "[" ), "]" ) + " " + quotationValue + Strright( source, "]" ) + quotationValue
                                Else
                                        returnQuery = returnQuery + " where " + itemName + valueCompare + quotationValue + source + quotationValue
                                End If
                        End If
                End If
                whereFlag = True
        End If
        MakeQueryElement = returnQuery
        Exit Function
ErrorHandle:
        Call WriteLog( Err(), curDb.Filepath + "/" + curAgent.Name + "::MakeQueryElement ERROR[" + Cstr( Erl() ) + "] : " + Error() )
        Print source
        MakeQueryElement = ""
        Exit Function
End Function




****************************
SetTableDoc
****************************

Sub SetTableDoc( source As String )
%REM
함수명 :         SetTableDoc
인자        :        source                        - Query_String_Decoded
반환        :        -
목적        :        Query_String_Decoded로 넘어온 값 중에서 원하는 Query를 잘라내어 TableDoc의 Item으로 생성함.
                        이를 MakeQuery, GetTableInfo 함수에서 사용함으로 각 코드에 Table 형식에 맞게끔 코딩하는 것을 방지할 수 있음.
작성정보        :         v1.0 / 바라기 / 2006-05-26
%END REM
        On Error Goto ErrorHandle
        Dim FieldList As Variant
        Dim FieldType As Variant
        Set TableDoc = New NotesDocument( curDb )
        FieldList = Evaluate(|@Trim( @Explode("| & SQL_TABLE_FIELD & |";",") )|)
        FieldType = Evaluate(|@Trim( @Explode("| & SQL_TABLE_FIELDTYPE & |";",") )|)
        fieldAround = Evaluate(|@Explode("| & SQL_TABLE_FIELD_AROUND & |";",")|)
        Forall ufl In FieldList
                Call TableDoc.ReplaceItemValue( Cstr( ufl ), GetArgumentValue( Cstr( ufl ) & "=", source ) )
                Call TableDoc.ReplaceItemValue( "n_" & Cstr( ufl ), GetArgumentValue( Cstr( ufl ) & "!=", source ) )
        End Forall
        Call TableDoc.ReplaceItemValue( "FieldList", FieldList        )                                                                                '// 결과 Field 목록
        Call TableDoc.ReplaceItemValue( "FieldType", FieldType )                                                                                '// 결과 Field 종류
        Call TableDoc.ReplaceItemValue( "result", GetArgumentValue( "result=", source ) )                        '// 결과
        Call TableDoc.ReplaceItemValue( "order", GetArgumentValue( "order=", source ) )                                '// 명령( select, exec ...
Posted by baragi76

댓글을 달아 주세요

업그레이드 1탄...
몇일만에 바로 업글이 되었네요~ 그만큼 초기 버전이 제약사항 및 오류가 있었다는 얘기겠죠~
기존껀 오로지 SELECT, LIKE 조건 등을 날리지 못했으며,
각 RDB Table에 맞춰주려면 여러 함수들을 돌아다니면서 수정해줘야하는 번거로움이 있었습니다.

이제 달라졌습니다~
1. Table의 형식이 달라져도 (Declarations)의 ODBC Connection 설정 사항과 2줄의 코드만 수정해주면 다른곳은 수정할 필요가 없습니다.
-> SQL_TABLE_FIELD, SQL_TABLE_AROUND 상수가 추가가 되었습니다.
* SQL_TABLE_FIELD 상수에는 받고자하는 필드를 순서대로 컴머(,)로 분류하여 입력하시면 됩니다. ( 공백은 날려버리니 상관 없구요...)
* SQL_TABLE_FIELD_AROUND 상수는 SQL_TABLE_FIELD상수와 같은 수만큼 컴머로 분리하서 꺽쇠(^)를 넣어주시면 됩니다. 이것을 넣은 이유는 XML을 반환시 특수문자 또는 공백이 들어가면 오류가 발생되므로 공백이 포함된 필드값을 받고자하는 경우엔 <![CDATA[~~~~~]]>로 감싸줘야 하기때문에 상수가 추가가 되었습니다.



2. SELECT 쿼리와 프로시져를 호출할 수 있도록 기능이 추가되었습니다.
-> 다음과 같이 URL을 구성하면...
http://server_url/db.nsf/agent?openagent&order=exec&param-i=2&param-1=1111&param-2=2222
결과는 exec SQL_TABLE(Declarations의 설정값) '1111','2222' 이렇게 RDB 서버로 Query를 전송합니다.

파라메터가 추가가 된것인데요~
order : 명령줄( select 생략가능 / 없으면 select로 인식 )
param-i : order를 exec와 같이 프로시저를 호출할 경우 파라메터를 넘겨주는데~ 그 파라메터의 수를 미리 지정해주는 옵션입니다.
param-1 ~ n : param-i로 지정한 값 만큼 설정해야 합니다. (글케하지 않으면 어떤 오류가 뜰지 모릅니다... ㅡ_ㅡ;; )



3. 오로지 A='b' 또는 A<>'b' 조건문 밖에 안되던것이... LIKE문을 넣을 수 있도록 추가가 되었습니다.
SQL을 마니 알지는 못하지만... LIKE문을 포함하여 쿼리를 구성할 수 있도록 수정하였습니다.
-> 기존엔 http://server_url/db.nsf/agent?openagent&aa=1111,2222&bb!=3333,4444 와 같이 호출하면...
SELECT * from table where ( aa = '1111' or aa = '2222' ) and ( bb <> '3333' and bb <> '4444' )라는 Query가 RDB 서버로 전송이됩니다. 이에 불만이 한가지 있었습니다.... LIKE 문이죠...

자 그럼~
http://server_url/db.nsf/agent?openagent&aaa=[LIKE]111%,[LIKE]222%&bb!=3333,4444 와 같이 호출하면~
SELECT * from table where ( aa LIKE '111%' or aa LIKE '222%' ) and ( bb <> '3333' and bb <> '4444' )라는 Query를 RDB 서버로 전송합니다.
조금더 확장된 기능을 제공한다라고 감히 말할수 있겠죠(?)


자 아래부터는 Full 코드입니다.
---------------------------------------------------------------------------------------------------


****************************
(Options)
****************************

Option Public
Uselsx "*LSXODBC"



****************************
  (Declarations)
****************************

Dim ss As NotesSession
Dim curDb As NotesDatabase
Dim curDoc As NotesDocument
Dim curAgent As NotesAgent                                '// 현재 Agent

Dim con As ODBCConnection
Dim query As ODBCQuery
Dim result As ODBCResultSet

Const SQL_DNS                 = "ODBC_DNS"
Const SQL_ID                 = "UserID"
Const SQL_PASSWORD         = "UserPassword"
Const SQL_TABLE_SCHEMA        = "dbo"
Const SQL_TABLE                = "table"


'//★ 아래의 코드는 RDB Table과 같은 형식이어야 함. ( 코드마다 틀리게 구성해야 함. )
Const SQL_TABLE_FIELD        = |a,b,c,d,e|        '// 결과 필드 목록
Const SQL_TABLE_FIELD_AROUND = |^,^,^,^,<![CDATA[^]]>|        '// 결과 필드 둘러싸기 옵션

Dim TableDoc As NotesDocument
Dim fieldAround As Variant



****************************
  Initialize
****************************

Sub Initialize
        On Error Goto ErrorHandle
        Dim qs As String
        Dim resultField As String                        '// 결과
       
        Set ss = New NotesSession
        Set curDb = ss.CurrentDatabase
        Set curAgent = ss.CurrentAgent
        Set curDoc = ss.DocumentContext
       
        qs                                                         = curDoc.Query_String_Decoded(0)
       
        Print |Content-type: text/xml|
        Print |<?xml version='1.0' encoding='KSC5601'?>|
       
        Call SetTableDoc( qs )        
       
        '// SYBASE Server 연결
        If( SQLConnection( SQL_DNS ) = False ) Then Exit Sub
       
        If( GetTableInfo(TableDoc.result(0)) = False ) Then Goto ProcessEnd
       
ProcessEnd:
        con.Disconnect
        Exit Sub
ErrorHandle:
        Print |<Result>
                                <msg>error</msg>
                                <ermsg>| + Error() + |</ermsg>
                                <erl>| + Cstr( Erl() ) + |</erl>
                        </Result>|
       
        Msgbox curDb.Filepath + "/" + curAgent.Name + "::initialize ERROR[" + Cstr( Erl() ) + "] : " + Error()
        Print "<error>"
        Print curDb.Filepath + "/" + curAgent.Name + "::initialize ERROR[" + Cstr( Erl() ) + "] : " + Error()
        Print "</error>"
       
        If( con.IsConnected ) Then
                con.Disconnect
        End If
        Exit Sub
End Sub



****************************
  GetTableInfo
****************************

Function GetTableInfo( res As String ) As Integer
%REM
함수명 :         GetTableInfo
인자        :        res                        - Query 결과
반환        :        Boolean                - Query 처리 결과
                                - True         : 정상처리
                                - False         : 비정상 종료
목적        :        테이블의 정보를 가져오기 위함
작성정보        :         v1.0 / 바라기 / 2006-05-25/2006-05-26
%END REM
        On Error Goto ErrorHandle
        Dim index As Integer
        Dim rowIndex As Integer
        Dim whereFlag As Boolean
        whereFlag = False
       
        query.SQL = MakeQuery( res )
       
        If( query.SQL = "" ) Then
                Msgbox "Query를 조합하지 못하였습니다."
                GetTableInfo = False
                Exit Function
        End If
       
        If Not result.Execute Then
                Messagebox result.GetExtendedErrorMessage + "/" + result.GetErrorMessage
                GetTableInfo = False
                Exit Function
        End If
       
        result.MaxRows = 14000
        If( result.NumRows = 0 ) Then
                Print "<Result>검색한 결과가 없습니다.</Result>"
                GetTableInfo = False
                Exit Function
        End If
       
        Print |<Result>|
        index = 0
        Do
                result.NextRow
               
                Print "<data index='" & index & "'>"
                If( res = "" Or Lcase( res ) = "all" ) Then
                        rowIndex = 1
                        Forall utdi In TableDoc.GetItemValue( "FieldList" )
                                Print "<" & Cstr( utdi ) & ">" & Strleft( fieldAround(rowIndex-1), "^" ) & result.GetValue( rowIndex ) & Strright( fieldAround(rowIndex-1), "^" ) & "</" & Cstr( utdi ) & ">"
                                rowIndex = rowIndex + 1
                        End Forall
                Else
                        Print "<" + Strrightback( res, " " ) + ">" + result.GetValue(1) + "</" + Strrightback( res, " " ) + ">"
                End If
               
                Print "</data>"
               
                index = index + 1
        Loop Until result.IsEndOfData
       
        Print |</Result>|
        GetTableInfo = True
        Exit Function
ErrorHandle:
        Call WriteLog( Err(), curDb.Filepath + "/" + curAgent.Name + "::GetTableInfo ERROR[" + Cstr( Erl() ) + "] : " + Error() )
        GetTableInfo = False
        Exit Function
End Function



****************************
  MakeQuery
****************************

Function MakeQuery( res As String )As String
%REM
함수명 :         MakeQuery
인자        :        res                - Query 결과
반환        :        String                - Query 조합 결과
목적        :        테이블의 데이터를 가져오기위한 Query 조합
작성정보        :         v1.0 / 바라기 / 2006-05-24 / 2006-05-26
%END REM
        On Error Goto ErrorHandle
        Dim returnQuery As String                        '// Query
        Dim whereFlag As Boolean                        '// where절 추가상태 여부
        Dim curItemName As String                        '// Query 구성 Item명
        Dim separator As String                                '// 파라메터간 구분자
       
        If( Lcase( TableDoc.Order(0) ) = "select" Or Lcase( TableDoc.Order(0) ) = "" ) Then
                '// Select 구문인 경우
                If( res = "" Or Lcase( res ) = "all" ) Then
                        returnQuery = "Select * from " + SQL_TABLE
                Else
                        returnQuery = "Select " + res + " from " + SQL_TABLE
                End If
               
                Forall utdi In TableDoc.Items
                        curItemName = Lcase( utdi.Name )
                        '// result, fieldlist, order 필드는 Query에 포함되지 않음.
                        If( curItemName <> "result" And curItemName <> "fieldlist" And curItemName <> "order" And Left( curItemName, 6 ) <> "param-" ) Then
                                '// n_로 시작하는 필드는 n_ 다음 String으로 쿼리를 구성함.
                                If( Left( utdi.Name, 2 ) = "n_" ) Then
                                        returnQuery = returnQuery + MakeQueryElement( Rightbp( utdi.Name, Len(utdi.Name)-2 ), utdi.Values(0), False, whereFlag )
                                Else
                                        returnQuery = returnQuery + MakeQueryElement( utdi.Name, utdi.Values(0), True, whereFlag )
                                End If
                        End If                
                End Forall
        Else
                '// 프로시저 호출일 경우
                returnQuery = TableDoc.Order(0) + " " + SQL_TABLE
               
                For i%=1 To Cint( TableDoc.GetItemValue( "param-i" )(0) )
                        If( i% > 1 ) Then
                                separator = |,'|
                        Else
                                separator = | '|
                        End If
                        returnQuery = returnQuery + separator + TableDoc.GetItemValue( "param-" & Cstr(i%) )(0) + |'|
                Next
        End If
       
        MakeQuery = returnQuery
        Exit Function
ErrorHandle:
        Call WriteLog( Err(), curDb.Filepath + "/" + curAgent.Name + "::MakeQuery ERROR[" + Cstr( Erl() ) + "] : " + Error() )
        MakeQuery = ""
        Exit Function
End Function



****************************
  MakeQueryElement
****************************

Function MakeQueryElement( itemName As String, source As String, equalOption As Boolean, whereFlag As Boolean )As String
%REM
함수명 :         MakeQueryElement
인자        :        itemName         - Query 필드
                        source                - Query 필드 값
                        equalOption        - 포함되는 값을 찾으려면 True, 포함되지 않는 값을 찾으려면 False
                        whereFlag         - where 구문 삽입 유무
반환        :        String                - Query 조합 결과
목적        :        Query 부분 조합
작성정보        :         v1.1 / 바라기 / 2006-05-24
%END REM
        On Error Goto ErrorHandle
        Dim pluralValue As Variant        '// source 값 복수시 Explode
        Dim returnQuery As String        '// 결과 반환값
       
        Const REF_CALCULATE_BLOCK = " AND "                '//조건 블럭간 조건
       
        Dim valueCompare As String                        '// 등호, 같음 또는 같지 않음 체크
        Dim bitCalculator As String                        '// 같음 일때는 OR, 다름 일때는 AND 여야 함.
        If( equalOption ) Then
                valueCompare = " = "
                bitCalculator = " OR "
        Else
                valueCompare = " <> "
                bitCalculator = " AND "
        End If
       
        If( Trim( source ) <> "" ) Then
                If( Strleft( source, "," ) <> "" ) Then
                        '// 복수
                        If( whereFlag ) Then
                                returnQuery = returnQuery + REF_CALCULATE_BLOCK
                        End If
                        pluralValue = Evaluate(|@Unique( @Trim( @Explode("| & source & |";",") ) )|)
                        Forall upv In pluralValue
                                If( whereFlag ) Then
                                        If( Cstr( upv ) = Cstr( pluralValue(0) ) ) Then
                                                '// 첫번째 조건값
                                                If( Left( Cstr( upv ), 1 ) = "[" And Strleft( Cstr( upv ), "]" ) <> "" ) Then
                                                        '// LIKE와 같은 구문이 있는 경우 (ex: [LIKE]AA%)
                                                        returnQuery = returnQuery + " ( " + itemName + " " + Strleft( Strright( Cstr( upv ) , "[" ), "]" ) + " '" + Strright( Cstr( upv ), "]" ) + "'"
                                                Else
                                                        returnQuery = returnQuery + " ( " + itemName + valueCompare + "'" + Cstr( upv ) + "'"
                                                End If
                                        Else
                                                '// 두번째 이후 조건값
                                                If( Left( Cstr( upv ), 1 ) = "[" And Strleft( Cstr( upv ), "]" ) <> "" ) Then
                                                        '// LIKE와 같은 구문이 있는 경우 (ex: [LIKE]AA%)
                                                        returnQuery = returnQuery + bitCalculator + itemName + " " + Strleft( Strright( Cstr( upv ) , "[" ), "]" ) + " '" + Strright( Cstr( upv ), "]" ) + "'"
                                                Else
                                                        returnQuery = returnQuery + bitCalculator + itemName + valueCompare + "'" + Cstr( upv ) + "'"
                                                End If
                                        End If
                                Else
                                        '// where절이 없는 경우 추가
                                        If( Left( Cstr( upv ), 1 ) = "[" And Strleft( Cstr( upv ), "]" ) <> "" ) Then
                                                '// LIKE와 같은 구문이 있는 경우 (ex: [LIKE]AA%)
                                                returnQuery = returnQuery + " where ( " + itemName + " " + Strleft( Strright( Cstr( upv ) , "[" ), "]" ) + " '" + Strright( Cstr( upv ), "]" ) + "'"
                                        Else
                                                returnQuery = returnQuery + " where ( " + itemName + valueCompare + "'" + Cstr( upv ) + "'"
                                        End If
                                       
                                        whereFlag = True
                                End If
                        End Forall
                       
                        returnQuery = returnQuery + ")"
                Else
                        '// 단수
                        If( whereFlag ) Then
                                '// where 절을 이미 삽입한 경우
                                If( Left( source, 1 ) = "[" And Strleft( source, "]" ) <> "") Then
                                        '// LIKE와 같은 구문이 있는 경우 (ex: [LIKE]AA%)
                                        returnQuery = returnQuery + REF_CALCULATE_BLOCK + itemName + " " + Strleft( Strright( source , "[" ), "]" ) + " '" + Strright( source, "]" ) + "'"
                                Else
                                        returnQuery = returnQuery + REF_CALCULATE_BLOCK + itemName + valueCompare + "'" + source + "'"
                                End If
                        Else
                                '// where 절이 없는 경우 추가
                                If( Left( source, 1 ) = "[" And Strleft( source, "]" ) <> "" ) Then
                                        '// LIKE와 같은 구문이 있는 경우 (ex: [LIKE]AA%)
                                        returnQuery = returnQuery + " where " + itemName + " " + Strleft( Strright( source , "[" ), "]" ) + " '" + Strright( source, "]" ) + "'"
                                Else
                                        returnQuery = returnQuery + " where " + itemName + valueCompare + "'" + source + "'"
                                End If
                               
                               
                        End If
                End If
                whereFlag = True
        End If
       
        MakeQueryElement = returnQuery
       
        Exit Function
ErrorHandle:
        Call WriteLog( Err(), curDb.Filepath + "/" + curAgent.Name + "::MakeQueryElement ERROR[" + Cstr( Erl() ) + "] : " + Error() )
        Print source
        MakeQueryElement = ""
        Exit Function
End Function



****************************
  SetTableDoc
****************************

Sub SetTableDoc( source As String )
%REM
함수명 :         SetTableDoc
인자        :        source                        - Query_String_Decoded
반환        :        -
목적        :        Query_String_Decoded로 넘어온 값 중에서 원하는 Query를 잘라내어 TableDoc의 Item으로 생성함.
                        이를 MakeQuery, GetTableInfo 함수에서 사용함으로 각 코드에 Table 형식에 맞게끔 코딩하는 것을 방지할 수 있음.
작성정보        :         v1.0 / 바라기 / 2006-05-26
%END REM
        On Error Goto ErrorHandle
        Dim FieldList As Variant
       
        Set TableDoc = New NotesDocument( curDb )
        FieldList = Evaluate(|@Trim( @Explode("| & SQL_TABLE_FIELD & |";",") )|)
        fieldAround = Evaluate(|@Explode("| & SQL_TABLE_FIELD_AROUND & |";",")|)
       
        Forall ufl In FieldList
                Call TableDoc.ReplaceItemValue( Cstr( ufl ), GetArgumentValue( Cstr( ufl ) & "=", source ) )
                Call TableDoc.ReplaceItemValue( "n_" & Cstr( ufl ), GetArgumentValue( Cstr( ufl ) & "!=", source ) )
        End Forall
       
        Call TableDoc.ReplaceItemValue( "FieldList", FieldList        )                                                                                '// 결과 Field 목록
        Call TableDoc.ReplaceItemValue( "result", GetArgumentValue( "result=", source ) )                '// 결과
        Call TableDoc.ReplaceItemValue( "order", GetArgumentValue( "order=", source ) )                '// 명령( select, exec ... )
        Call TableDoc.ReplaceItemValue( "param-i", GetArgumentValue( "param-i=", source ) )        '// 파라메터 수
       
        If( TableDoc.GetItemValue("param-i")(0) <> "" ) Then
                For i%=1 To Cint( TableDoc.GetItemValue( "param-i" )(0) )
                        Call TableDoc.ReplaceItemValue( "param-" & Cstr(i%), GetArgumentValue( "param-" & Cstr(i%) & "=", source ) )
                Next
        End If
       
        Exit Sub
ErrorHandle:
        Call WriteLog( Err(), curDb.Filepath + "/" + curAgent.Name + "::SetTableDoc ERROR[" + Cstr( Erl() ) + "] : " + Error() )
        Exit Sub
End Sub



****************************
  SQLConnection
****************************

Function SQLConnection( dns As String )As Integer
'===========================================================================================        
'                함  수  명 : SQLConnection
'                목       적 : SQL Server Connection
'                버       젼 : 1.0
'                매개 변수 : dns       : DNS (ex: "hits")
'===========================================================================================
        On Error Goto ErrorHandle
        Dim status As String
       
        Set con = New ODBCConnection
        Set query = New ODBCQuery
        Set result = New ODBCResultSet
       
        Set query.Connection = con
        Set result.Query = query
       
        status = con.ConnectTo( dns, SQL_ID, SQL_PASSWORD )
       
        If( Ucase( status ) <> "TRUE" ) Then
                Print |<Result>
                                        <msg>error</msg>
                                        <ermsg>조회정보 서버에 연결할 수 없습니다.( DNS : | + SQL_DNS + | ) 관리자에게 서버의 ODBC 설정을 확인 요청을 하시기 바랍니다.</ermsg>
                                        <erl>| & Erl & |</erl>
                                </Result>|
                SQLConnection = False
                Exit Function
        End If
       
        SQLConnection = True
        Exit Function
ErrorHandle:
        Call WriteLog( Err(), curDb.Filepath + "/" + curAgent.Name + "::SQLConnection ERROR[" + Cstr( Erl() ) + "] : " + Error() )
        SQLConnection = False
        Exit Function
End Function



****************************
  WriteLog
****************************

Function WriteLog( ErrorOption As Integer, LogMessage As String )
%REM
함수명 :         WriteLog
인자        :        ErrorOption        - 오류코드 ( 0 : 정상로그, 이외 오류코드 )
반환        :        -
목적        :        로그 DB에 결과 기록
작성정보        :         v1.0 / 바라기 / 2006-04-07
%END REM
        On Error Goto ErrorHandle
        Msgbox LogMessage
        Print LogMessage
%REM
        If( ErrorOption = 0 ) Then
                Call curLog.LogAction( |[| & curDb.FilePath & |] | & LogMessage )
        Else
                Call curLog.LogError( ErrorOption, |[| & curDb.FilePath & |] | & LogMessage )
        End If
%END REM
        Exit Function
ErrorHandle:
        Msgbox |[| & curDb.FilePath & |] | & curAgent.Name & |::WriteLog ERROR[| & Cstr( Erl() ) & |] : | & Error()
        Exit Function
End Function



****************************
  GetArgumentValue
****************************

Function GetArgumentValue(div As String, source As String )
'===========================================================================================        
'                함  수  명 : GetArgumentValue
'                목       적 : 웹 파라미터 값을  반환하는 함수
'                버       젼 : 1.0
'                매개 변수 : div       : 파라미터 (ex: "sv=")
'                         source :  전체문자열
'===========================================================================================
       
        GetArgumentValue = ""
       
        Dim pos As Integer
        Dim valueItem As String
       
        pos = Instr( source, div )
       
        If pos > 0 Then
                valueItem = Mid( source, pos )                
                If Instr( valueItem , "&" ) > 0Then
                        GetArgumentValue = Mid( valueItem, Instr( valueItem , "=") + 1, Instr( valueItem , "&") -  Instr( valueItem , "=")-1)
                Else
                        GetArgumentValue = Mid( valueItem, Instr( valueItem , "=") + 1)                
                End If                
        End If
       
End Function

Posted by baragi76

댓글을 달아 주세요

ODBC를 이용하여 RDB의 데이터를 쿼리해오는 경우가 빈번히 발생하고 있습니다.
아래의 코드는 반복적으로 Select 구문을 소모적으로 만들다 보니 시간도 비교적 많이 걸리게 되더군요.
앞으로 지속적으로 업데이트 해 나가야 겠지만...
1단계로 정리된 코드가 있어 기록해 둡니다.
---------------------------------------------------------------------------------------------
*********
(Options)
*********
Option Public
Uselsx "*LSXODBC"
*************
(Declarations)
*************
Dim ss As NotesSession
Dim curDb As NotesDatabase
Dim curDoc As NotesDocument
Dim curAgent As NotesAgent                                '// 현재 Agent
Dim con As ODBCConnection
Dim query As ODBCQuery
Dim result As ODBCResultSet
Const SQL_DNS                 = "Domino"                '// ODBC DNS 이름
Const SQL_ID                 = "UserID"                '// ODBC USER ID
Const SQL_PASSWORD         = "Password"        '//  ODBC USER PASSWORD
Const SQL_TABLE_SCHEMA        = "dbo"                '// Table 스키마명
Const SQL_TABLE                = "table"                '// TABLE 이름
'//★ 아래의 코드는 RDB Table과 같은 형식이어야 함. ( 코드마다 틀리게 구성해야 함. )
Public Type table
        r1 As String        '// 필드 1
        r2 As String        '// 필드 2
        r3 As String        '// 필드 3
        r4 As String        '// 필드 4
        r5 As String        '// 필드 5
        '// Query중 포함되지 않는 열을 지정하기 위한 멤버
        n_r1 As String        '// NOT 필드 1
        n_r2 As String        '// NOT 필드 2
        n_r3 As String        '// NOT 필드 3
        n_r4 As String        '// NOT 필드 4
        n_r5 As String        '// NOT 필드 5
End Type
'// 에이전트 Query_String으로 들어온 데이터를 정리하기 위한 객체
Dim sqlInfo As table
************
  Initialize
************
Sub Initialize
        On Error Goto ErrorHandle
        Dim qs As String
        Dim resultField As String                        '// 결과
        Set ss = New NotesSession
        Set curDb = ss.CurrentDatabase
        Set curAgent = ss.CurrentAgent
        Set curDoc = ss.DocumentContext
        qs                 = curDoc.Query_String_Decoded(0)
        '// 결과 코드 기본 *(값이 없으면), 특정 열만 가져오고자하면 해당 필드명, DISTINCT fieldname 하면 Domino 수식의 @Unique와 같은 동작을 하더군요... ^^
        resultField                = GetAgrumentValue( "result=", qs )
        '//★ 아래의 코드는 RDB Table과 동일해야 합니다. (Declarations)에 정의된 구조체 참조
        sqlInfo.r1                 = GetArgumentValue( "r1=", qs )
        sqlInfo.r2                = GetArgumentValue( "r2=", qs )
        sqlInfo.r3                = GetArgumentValue( "r3=", qs )
        sqlInfo.r4                = GetArgumentValue( "r4=", qs )
        sqlInfo.r5                = GetArgumentValue( "r5=", qs )
        sqlInfo.n_r1        = GetArgumentValue( "r1!=", qs )
        sqlInfo.n_r2        = GetArgumentValue( "r2!=", qs )
        sqlInfo.n_r3        = GetArgumentValue( "r3!=", qs )
        sqlInfo.n_r4        = GetArgumentValue( "r4!=", qs )
        sqlInfo.n_r5        = GetArgumentValue( "r5!=", qs )
        Print |Content-type: text/xml|
        Print |<?xml version='1.0' encoding='KSC5601'?>|
        '// Server 연결
        If( SQLConnection( SQL_DNS ) = False ) Then Exit Sub
        If( GetTableInfo(resultField) = False ) Then Goto ProcessEnd
ProcessEnd:
        con.Disconnect
        Exit Sub
ErrorHandle:
        Print |<Result>
                <msg>error</msg>
                <ermsg>| + curDb.Filepath + "/" + curAgent.Name + "::initialize ERROR[" + Cstr( Erl() ) + "] : " + Error() + |</ermsg>
                <erl>| + Cstr( Erl() ) + |</erl>
        </Result>|
        Msgbox curDb.Filepath + "/" + curAgent.Name + "::initialize ERROR[" + Cstr( Erl() ) + "] : " + Error()
        If( con.IsConnected ) Then
                con.Disconnect
        End If
        Exit Sub
End Sub
**************
  GetTableInfo
**************
Function GetTableInfo( res As String ) As Integer
%REM
함수명 :         GetTableInfo
인자        :        res                        - Query 결과
반환        :        Boolean                - Query 처리 결과
                                - True         : 정상처리
                                - False         : 비정상 종료
목적        :        테이블의 정보를 가져오기 위함
작성정보        :         v1.0 / 바라기 / 2006-05-23
%END REM
        On Error Goto ErrorHandle
        Dim index As Integer
        Dim whereFlag As Boolean
        whereFlag = False
        query.SQL = MakeQuery( res )
        If( query.SQL = "" ) Then
                Msgbox "Query를 조합하지 못하였습니다."
                GetEquipmentInfo = False
                Exit Function
        End If
        If Not result.Execute Then
                Messagebox result.GetExtendedErrorMessage + "/" + result.GetErrorMessage
                GetEquipmentInfo = False
                Exit Function
        End If
        '// 14000 라인 이상의 데이터를 쿼리해오면 오류가 뜨더군요... Out of memory 그래서...
        result.MaxRows = 14000
        If( result.NumRows = 0 ) Then
                Print "<Result>검색한 결과가 없습니다.</Result>"
                GetEquipmentInfo = False
                Exit Function
        End If
        Print |<Result>|
        index = 0
        Do
                result.NextRow
                Print "<data index='" & index & "'>"
                '//★ 아래의 If문 사이에 있는 코드는 RDB Table 구조와 동일해야 합니다. ( 코드마나 다르게 구성해야함. )
                If( res = "" Or Lcase( res ) = "all" ) Then
                        Print "<r1>" & result.GetValue(1) & "</r1>"
                        Print "<r2>" & result.GetValue(2) & "</r2>"
                        Print "<r3>" & result.GetValue(3) & "</r3>"
                        Print "<r4>" & result.GetValue(4) & "</r4>"
                        Print "<r5>" & result.GetValue(5) & "</r5>"
                Else
                        '// DISTINCT 와 같은 문자가 들어가는 것을 위해... ^^
                        Print "<" + Strrightback( res, " " ) + ">" + result.GetValue(1) + "</" + Strrightback( res, " " ) + ">"
                End If
                Print "</data>"
                index = index + 1
        Loop Until result.IsEndOfData
        Print |</Result>|
        GetTableInfo = True
        Exit Function
ErrorHandle:
        Call WriteLog( Err(), curDb.Filepath + "/" + curAgent.Name + "::GetTableInfo ERROR[" + Cstr( Erl() ) + "] : " + Error() )
        GetTableInfo = False
        Exit Function
End Function
***************
  MakeQuery
***************
Function MakeQuery( res As String )As String
%REM
함수명 :         MakeQuery
인자        :        res                - Query 결과
반환        :        String                - Query 조합 결과
목적        :        테이블의 데이터를 가져오기위한 Query 조합
작성정보        :         v1.0 / 바라기 / 2006-05-24
%END REM
        On Error Goto ErrorHandle
        Dim pluralValue As Variant
        Dim returnQuery As String
        Dim whereFlag As Boolean
        If( res = "" Or Lcase( res ) = "all" ) Then
                returnQuery = "Select * from " + SQL_TABLE
        Else
                returnQuery = "Select " + res + " from " + SQL_TABLE
        End If
        '//★ Query를 조합하는 구문으로 RDB Table 형식과 동일하게 처리해야 함. ( 코드마다 다르게 구성해야함.)
        returnQuery = returnQuery + MakeQueryElement( "r1", sqlInfo.r1, whereFlag )
        returnQuery = returnQuery + MakeQueryElement( "r2", sqlInfo.r2, whereFlag )
        returnQuery = returnQuery + MakeQueryElement( "r3", sqlInfo.r3, whereFlag )
        returnQuery = returnQuery + MakeQueryElement( "r4", sqlInfo.r4, whereFlag )
        returnQuery = returnQuery + MakeQueryElement( "r5", sqlInfo.r5, whereFlag )
        '// 특정 데이터가 들어가있지 않은 문서를 Query 해오기 위해서 사용
        returnQuery = returnQuery + MakeQueryNotElement( "r1", sqlInfo.n_r1, whereFlag )
        returnQuery = returnQuery + MakeQueryNotElement( "r2", sqlInfo.n_r2, whereFlag )
        returnQuery = returnQuery + MakeQueryNotElement( "r3", sqlInfo.n_r3, whereFlag )
        returnQuery = returnQuery + MakeQueryNotElement( "r4", sqlInfo.n_r4, whereFlag )
        returnQuery = returnQuery + MakeQueryNotElement( "r5", sqlInfo.n_r5, whereFlag )
        MakeQuery = returnQuery
        Exit Function
ErrorHandle:
        Call WriteLog( Err(), curDb.Filepath + "/" + curAgent.Name + "::MakeQuery ERROR[" + Cstr( Erl() ) + "] : " + Error() )
        MakeQuery = ""
        Exit Function
End Function
**********************
  MakeQueryElement
**********************
Function MakeQueryElement( itemName As String, source As String, whereFlag As Boolean )As String
%REM
함수명 :         MakeQueryElement
인자        :        itemName         - Query 필드
                        source                - Query 필드 값
                        whereFlag         - where 구문 삽입 유무
반환        :        String                - Query 조합 결과
목적        :        Query 부분 조합
작성정보        :         v1.0 / 바라기 / 2006-05-24
%END REM
        On Error Goto ErrorHandle
        Dim pluralValue As Variant
        Dim returnQuery As String
        If( Trim( source ) <> "" ) Then
                If( Strleft( source, "," ) <> "" ) Then
                        '// 복수
                        If( whereFlag ) Then
                                returnQuery = returnQuery + " AND "
                        End If
                        pluralValue = Evaluate(|@Unique( @Trim( @Explode("| & source & |";",") ) )|)
                        Forall upv In pluralValue
                                If( whereFlag ) Then
                                        If( Cstr( upv ) = Cstr( pluralValue(0) ) ) Then
                                                returnQuery = returnQuery + " ( " + itemName + "='" + Cstr( upv ) + "'"
                                        Else
                                                returnQuery = returnQuery + " OR " + itemName + "='" + Cstr( upv ) + "'"
                                        End If
                                Else
                                        returnQuery = returnQuery + " where ( " + itemName + "='" + Cstr( upv ) + "'"
                                        whereFlag = True
                                End If
                        End Forall
                        returnQuery = returnQuery + ")"
                Else
                        '// 단수
                        If( whereFlag ) Then
                                returnQuery = returnQuery + " AND " + itemName + "='" + source + "'"
                        Else
                                returnQuery = returnQuery + " where " + itemName + "='" + source + "'"
                        End If
                End If
                whereFlag = True
        End If
        MakeQueryElement = returnQuery
        Exit Function
ErrorHandle:
        Call WriteLog( Err(), curDb.Filepath + "/" + curAgent.Name + "::MakeQueryElement ERROR[" + Cstr( Erl() ) + "] : " + Error() )
        MakeQueryElement = ""
        Exit Function
End Function
*************************
  MakeQueryNotElement
*************************
Function MakeQueryNotElement( itemName As String, source As String, whereFlag As Boolean )As String
%REM
함수명 :         MakeQueryNotElement
인자        :        itemName         - Query 필드
                        source                - Query 필드 값
                        whereFlag         - where 구문 삽입 유무
반환        :        String                - Query 조합 결과
목적        :        Query 부분 (NOT) 조합
작성정보        :         v1.0 / 바라기 / 2006-05-25
%END REM
        On Error Goto ErrorHandle
        Dim pluralValue As Variant
        Dim returnQuery As String
        If( Trim( source ) <> "" ) Then
                If( Strleft( source, "," ) <> "" ) Then
                        '// 복수
                        If( whereFlag ) Then
                                returnQuery = returnQuery + " AND "
                        End If
                        pluralValue = Evaluate(|@Unique( @Trim( @Explode("| & source & |";",") ) )|)
                        Forall upv In pluralValue
                                If( whereFlag ) Then
                                        If( Cstr( upv ) = Cstr( pluralValue(0) ) ) Then
                                                returnQuery = returnQuery + " ( " + itemName + " <> '" + Cstr( upv ) + "'"
                                        Else
                                                returnQuery = returnQuery + " AND " + itemName + " <> '" + Cstr( upv ) + "'"
                                        End If
                                Else
                                        returnQuery = returnQuery + " where ( " + itemName + " <> '" + Cstr( upv ) + "'"
                                        whereFlag = True
                                End If
                        End Forall
                        returnQuery = returnQuery + ")"
                Else
                        '// 단수
                        If( whereFlag ) Then
                                returnQuery = returnQuery + " AND " + itemName + " <> '" + source + "'"
                        Else
                                returnQuery = returnQuery + " where " + itemName + " <> '" + source + "'"
                        End If
                End If
                whereFlag = True
        End If
        MakeQueryNotElement = returnQuery
        Exit Function
ErrorHandle:
        Call WriteLog( Err(), curDb.Filepath + "/" + curAgent.Name + "::MakeQueryNotElement ERROR[" + Cstr( Erl() ) + "] : " + Error() )
        MakeQueryNotElement = ""
        Exit Function
End Function
*********************
  SQLConnection
*********************
Function SQLConnection( dns As String )As Integer
'===========================================================================================        
'                함  수  명 : SQLConnection
'                목       적 : SQL Server Connection
'                버       젼 : 1.0
'                매개 변수 : dns       : DNS (ex: "hits")
'===========================================================================================
        On Error Goto ErrorHandle
        Dim status As String
        Set con = New ODBCConnection
        Set query = New ODBCQuery
        Set result = New ODBCResultSet
        Set query.Connection = con
        Set result.Query = query
        status = con.ConnectTo( dns, SQL_ID, SQL_PASSWORD )
        If( Ucase( status ) <> "TRUE" ) Then
                Print |<Result>
                                        <msg>error</msg>
                                        <ermsg>조회정보 서버에 연결할 수 없습니다.( DNS : | + SQL_DNS + | ) 관리자에게 서버의 ODBC 설정을 확인 요청을 하시기 바랍니다.</ermsg>
                                        <erl>| & Erl & |</erl>
                                </Result>|
                SQLConnection = False
                Exit Function
        End If
        SQLConnection = True
        Exit Function
ErrorHandle:
        Call WriteLog( Err(), curDb.Filepath + "/" + curAgent.Name + "::SQLConnection ERROR[" + Cstr( Erl() ) + "] : " + Error() )
        SQLConnection = False
        Exit Function
End Function
******************
  WriteLog
******************
Function WriteLog( ErrorOption As Integer, LogMessage As String )
%REM
함수명 :         WriteLog
인자        :        ErrorOption        - 오류코드 ( 0 : 정상로그, 이외 오류코드 )
반환        :        -
목적        :        로그 DB에 결과 기록
작성정보        :         v1.0 / 바라기 / 2006-04-07
%END REM
        On Error Goto ErrorHandle
        Msgbox LogMessage
%REM
        If( ErrorOption = 0 ) Then
                Call curLog.LogAction( |[| & curDb.FilePath & |] | & LogMessage )
        Else
                Call curLog.LogError( ErrorOption, |[| & curDb.FilePath & |] | & LogMessage )
        End If
%END REM
        Exit Function
ErrorHandle:
        Msgbox |[| & curDb.FilePath & |] | & curAgent.Name & |::WriteLog ERROR[| & Cstr( Erl() ) & |] : | & Error()
        Exit Function
End Function
**********************
  GetArgumentValue
**********************
Function GetArgumentValue(div As String, source As String )
'===========================================================================================        
'        함  수  명 : GetArgumentValue
'        목       적 : 웹 파라미터 값을  반환하는 함수
'        버       젼 : 1.0
'        매개 변수 : div       : 파라미터 (ex: "sv=")
'               source :  전체문자열
'===========================================================================================
        GetArgumentValue = ""
        Dim pos As Integer
        Dim valueItem As String
        pos = Instr( source, div )
        If pos > 0 Then
                valueItem = Mid( source, pos )                
                If Instr( valueItem , "&" ) > 0Then
                        GetArgumentValue = Mid( valueItem, Instr( valueItem , "=") + 1, Instr( valueItem , "&") -  Instr( valueItem , "=")-1)
                Else
                        GetArgumentValue = Mid( valueItem, Instr( valueItem , "=") + 1)                
                End If                
        End If
End Function

 

-----------------------------------------

에이전트 호출하는 방식...
1.
http://serverURL/db.nsf/agent?openagent&result=DISTINCTr1&r2=TEST&r3=1111,2222,3333,4444&r4!=AAAA,BBBB
--->
결과는...
r2 필드값이 TEST 이며, r3 필드값이 1111 또는 2222 또는 3333 또는 4444 이며, r4 필드값이 AAAA 가 아니며, r4 필드값이 BBBB가 아닌 레코드의 r1값 중... 중복값을 제외한 목록이 반환 됩니다.
2.
http://serverURL/db.nsf/agent?openagent&r2=TEST&r2=1111,2222,3333
---->
결과는...
r2 필드값이 TEST인 레코드의 모든 필드값을 반환합니다.
( r2라는 파라메터를 중복해서 넣어주면 두번째껀 무시해 버립니다... !! )
result 파라메타가 없는 경우 모든 필드값을 반환하져...
3.
http://serverURL/db.nsf/agent?openagent&r2=TEST&r2!=1111,2222,3333
----->
결과는...
r2 필드값이 TEST인 레코드의 모든 필드값을 반환합니다.
r2! 파라메터가 무의미해 집니다. ( Select 쿼리에는 들어 갑니다... )
결과는 XML 형식으로 화면에 뿌려집니다~~~!!
다른 형태를 원하시면~ 잘~~ 수정해야 합니다~

Posted by baragi76

댓글을 달아 주세요

  1. 2010.10.08 18:54 신고 Favicon of https://baragi.kr BlogIcon baragi76  댓글주소  수정/삭제  댓글쓰기

    (Declarations) 부분의 DNS 설정, SQL_TABLE_FIELD, SQL_TABLE_FIELD_AROUND 상수만 손을 보시고 Query를 날려보세요~
    아마도 될것이라 생각이 됩니다~~~


예를들어...
시스템 구성이 아래와 같이 되어있다고 가정을 할때.
----------------------------------------------------
어플리케이션(결재) 서버 : app.company.com
메일서버 : mail.company.com
----------------------------------------------------

시스템에서의 처리는 당연 결재서버 또는 메일서버를 Primary Server로 구성하고 나머지 서버는 Secondary Server로 구성하여 프로그램상으로 개발하는데는 문제점이 없도록 하고 있습니다.
하지만 웹브라우저상에서 처리되어야 하는 코드중에 이런것이 있습니다.

1) 결재 처리요청 메일 발송
2) 결재자 결재요청 메일 수신
3) 결재할 문서 목록에서 문서를 클릭 (app.company.com)
4) 승인버튼 클릭하여 결재처리 (app.company.com)
5) 결재자에게 발송된 결재요청메일 삭제 (mail.company.com)
6) 결재할 문서 목록 갱신 (app.company.com)

위와같은 순서로 처리되는 경우,
5) -> 6) 항목으로 넘어가는 과정에서 웹브라우저상 권한없음 오류가 발생할 수 있습니다.
이는 DB ACL 문제가 아니며 브라우저상 도메인이 다른 페이지에 대한 자바스크립트 접근권한이 없다는 경고입니다.

물론 5)번 항목 처리시 새창을 오픈해서 처리하고 닫아버리면 될수도 있는 문제겠지만, 창이 열리고 닫히고 그러면 싫어할 사람들이 많죠.
아니면 document.domain = "company.com"; 코드를 화면에 보여지는 모든 페이지에 추가하면 되는 문제일 수도 있습니다.  하지만 연동되는 타시스템이 있다면 이걸 맞춰주는것도 쉬운 문제는 아닐듯 합니다.

다른 방법에 대해서 설명을 하겠습니다.
5) 번 항목에서 결재 요청메일을 삭제하고 나서는 화면이 어떻게 되어야할지 보통적으로 에이전트에서 자바스크립트 형식으로 프린트를 합니다.

print |<script>
        try
        {
                opener.window.location.reload();
                window.close();
        }
        catch( e )
        {
                var actionURL = "http://app.company.com/refresh.nsf/Refresh?CreateDocument";
                var _form = document.createElement("form");
                _form.action = actionURL;
                _form.method = "post";
                // saveoptions 필드를 0으로 두어야 필요없는 문서가 DB에 저장되지 않습니다.
                var _saveoption = document.createElement( "<input type=hidden name='saveoptions'>" );
                _form.appendChild(_saveoption);
                document.body.appendChild(_form);
                _form.saveoptions.value = "0";
                _form.submit();
        }
</script>|

마지막에 처리될 코드이죠...

그럼 이것으로 끝나냐? 아니죠?
위의 코드에 보면 var actionURL = "http://app.company.com/refresh.nsf/Refresh?CreateDocument";
이라는 코드가 있습니다. 이는 refresh.nsf 라는 DB가 있어야 하며 그 DB에는 Refresh라는 양식이 있어야 합니다.
또한 var _saveoption = document.createElement( "<input type=hidden name='saveoptions'>" ); 이라는 부분이 있는데 이는 Refresh 양식에 saveoptions 필드가 있어야 존재해야 한다는 얘기가 됩니다.

그리고 또 중요한건...
Refresh 양식에 $$Return 필드를 두어 필요한 코드가 들어갈 수 있도록 합니다.
예를들어 "<script>opener.window.location.reload();window.close();</script>"라고 두면 상위 opener를 reload하고 창이 닫힙니다.


-------------------------------------
위와 같이 처리하는 이유는...
CreateDocument는 URL 호출이기 때문에 도메인과 상관없이 호출할 수 있으며, createdocument로 호출된 이후에는 opener와 같은 도메인인 app.company.com으로 변경되므로 opener를 자바스크립트로 접근하여 처리할 수 있게 됩니다.

다른 방법도 있겠지만, 여러가지로 응용하여 사용할 수 있는 코드입니다.
Posted by baragi76

댓글을 달아 주세요


function NumberOnly()
{
        var input_key = event.keyCode;
        if (!(IsNumber( input_key )))
        {       
                event.keyCode = '0';
                return false;
        }
}
function IsNumber( inputValue )
{
                if (inputValue >= '48' && inputValue <= '57') return true;
                else         return false;
}
function _Currency(num)
{        
        if(num == "" || num == 0)
        {
                return num;        
        }
        var dotPos = (num+"").split(".");
        var dotU = dotPos[0];
        var dotD = dotPos[1];
        if (Number(dotU) < 0)
        {
                dotU  = (Number(dotU) * -1) + "";
                var minus = true
        }
        else
        {
                var minus = false
        }
        var commaFlag = dotU.length%3
        if(commaFlag)
        {
                var out = dotU.substring(0, commaFlag)
                if (dotU.length > 3)
                {
                        out += ",";
                }
        }
        else
        {
                var out = "";
        }
        for (var i=commaFlag; i < dotU.length; i+=3)
        {
                out += dotU.substring(i, i+3);
               
                if( i < dotU.length-3)
                {
                        out += ",";
                }
        }
       
        if(minus)
        {
                out = "-" + out;
        }
       
        if(dotD)
        {
                out +=  "." + dotD ;
        }
       
        return out;
}
function _Reverse(str)
{
        if(str == null)
                return null;
        var s = str;
        var r = '';
        for(i=str.length; i>0; i--)
                r += s.charAt(i-1);
        return r;
}
function _CurrencyClear(s)
{
        var cntArray = new Array();
        for( var i = 0 ; i < s.length ; i++)
        {
                cntArray[i] = s.indexOf(",");
                s = s.replace(",","");
        }
        return s;
}
function setCurrency(objName)
{        
        var input = document.getElementById(objName);
        if ( input.value.length == 0 )
        {
                return;
        }
        var amt = 0;
        if(input.value.length != 0 )
        {
                amt = fillZero(input.value, input.format);
        }
        input.value =        _Currency(amt);
}
function focusCurrency(objName)
{
        var input = document.getElementById(objName);
        if ( input.value.length == 0 )
        {
                return;
        }
        input.value = Number(_CurrencyClear(input.value));
        input.select();
}
function fillZero(input, type)
{
        //input이 숫자타입으로 넘어올 때
        //에러가 남. 그래서 스트링 타입으로 변환해야 함
        if ( !type )
        {
                return input+"";
        }
        var format = type.split('.');
        var value = (input+"").split('.');
       
        if ( Number(format[1]) == 0 )
        {
                return input+"";
        }       
        if (!value[1])
        {       
                value[1] = "";
        }
       
        //소수점 이하가 포맷보다 클 경우는
        //그냥 반올림하여 리턴한다
        if (value[1].length > Number(format[1]))
        {
                 return (Number(input).toFixed(Number(format[1])));
        }
        //소수점 자리수에 맞게 '0'을 채워준다
        //예를 들면 데이타 형식이 5.2일 경우
        //입력값이 '50'이면 '50.00'으로 리턴한다
        while ( value[1].length < Number(format[1]) )
        {
                value[1] += "0";
        }               
       
        //value[0]을 Number 객체로 변환
        //000.000 같은 경우를 0.000으로 변환하기 위해서
        return (Number(value[0]) + "." + value[1]);
}
Posted by baragi76

댓글을 달아 주세요