2011년 6월 1일 수요일

JAVASCRIPT 주민등록번호 체크 로직

/*
   주민등록번호 체크 로직
   1. 주민등록번호의 앞 6자리의 수에 처음부터 차례대로 2,3,4,5,6,7 을 곱한다. 그 다음, 뒤 7자리의 수에 마지막 자리만 제외하고 차례대로 8,9,2,3,4,5 를 곱한다.
   2. 이렇게 곱한 각 자리의 수들을 모두 더한다.
   3. 모두 더한 수를 11로 나눈 나머지를 구한다.
   4. 이 나머지를 11에서 뺀다.
   5. 이렇게 뺀 수가 두 자릿수이면, 즉 10보다 크면 다시 11로 나누어 나머지 값을 구한다.
   6. 이렇게 해서 나온 최종 값을 주민등록번호의 마지막 자리 수와 비교해서 같으면 유효한 번호이고 다르면 잘못된 값이다.
*/
   
   // 주민등록번호의 유효성을 체크
   function isValidJuminNo() {
    var tmpFrm = document.frm_OnlineEdu;
    var jumin1 = tmpFrm.txt_Jumin_1.value;
    var jumin2 = tmpFrm.txt_Jumin_2.value;
    var yy     = jumin1.substr(0,2);        // 년도
    var mm     = jumin1.substr(2,2);        // 월
    var dd     = jumin1.substr(4,2);        // 일
    var genda  = jumin2.substr(0,1);        // 성별
    var msg, ss, cc;
     // 숫자가 아닌 것을 입력한 경우
     if (!isNumeric(jumin1)) {
    alert("주민등록번호 앞자리를 숫자로 입력하세요.");
    tmpFrm.txt_Jumin_1.focus();
    return false;
     }
   
     // 길이가 6이 아닌 경우
     if (jumin1.length != 6) {
    alert("주민등록번호 앞자리를 다시 입력하세요.");
    tmpFrm.txt_Jumin_1.focus();
    return false;
     }
   
     // 첫번째 자료에서 연월일(YYMMDD) 형식 중 기본 구성 검사
     if (yy < "00"
      || yy > "99"
      || mm < "01"
      || mm > "12"
      || dd < "01"
      || dd > "31") {
    alert("주민등록번호 앞자리를 다시 입력하세요.");
    tmpFrm.txt_Jumin_1.focus();
    return false;
     }
   
     // 숫자가 아닌 것을 입력한 경우
     if (!isNumeric(jumin2)) {
    alert("주민등록번호 뒷자리를 숫자로 입력하세요.");
    tmpFrm.txt_Jumin_2.focus();
    return false;
     }
     // 길이가 7이 아닌 경우
     if (jumin2.length != 7) {
    alert("주민등록번호 뒷자리를 다시 입력하세요.");
    tmpFrm.txt_Jumin_2.focus();
    return false;
     }
   
     // 성별부분이 1 ~ 4 가 아닌 경우
     if (genda < "1" || genda > "4") {
    alert("주민등록번호 뒷자리를 다시 입력하세요.");
    tmpFrm.txt_Jumin_2.focus();
    return false;
     }
   
     // 연도 계산 - 1 또는 2: 1900년대, 3 또는 4: 2000년대
     cc = (genda == "1" || genda == "2") ? "19" : "20";
     // 첫번째 자료에서 연월일(YYMMDD) 형식 중 날짜 형식 검사
     if (isValidDate(cc+yy+mm+dd) == false) {
    alert("주민등록번호 앞자리를 다시1 입력하세요.");
    tmpFrm.txt_Jumin_1.focus();
    return false;
     }
   
     // Check Digit 검사
     if (!isSSN(jumin1, jumin2)) {
    alert("입력한 주민등록번호를 검토한 후, 다시 입력하세요.");
    tmpFrm.txt_Jumin_1.focus();
    return false;
     }
     return true;
   }
   function isValidDate(iDate) {
     if( iDate.length != 8 ) {
    return false;
     }
    
     oDate = new Date();
     oDate.setFullYear(iDate.substring(0, 4));
     oDate.setMonth(Number(iDate.substring(4, 6)) - 1);
     oDate.setDate(iDate.substring(6));
     if( Number(oDate.getFullYear())  != Number(iDate.substring(0, 4))
      || Number(oDate.getMonth() + 1) != Number(iDate.substring(4, 6))
      || Number(oDate.getDate())  != Number(iDate.substring(6)) ){
   
    return false;
     }
     
     return true;
   }
   
   function isNumeric(s) {
     for (i=0; i<s.length; i++) {
    c = s.substr(i, 1);
    if (c < "0" || c > "9") return false;
     }
     return true;
   }
   
   function isSSN(s1, s2) {
     n = 2;
     sum = 0;
     for (i=0; i<s1.length; i++)
    sum += Number(s1.substr(i, 1)) * n++;
     for (i=0; i<s2.length-1; i++) {
    sum += Number(s2.substr(i, 1)) * n++;
    if (n == 10) n = 2;
     }
   
     c = 11 - sum % 11;
     if (c == 11) c = 1;
     if (c == 10) c = 0;
     if (c != Number(s2.substr(6, 1))) return false;
     else return true;
   }

ASP 문자열 관련 함수

* Val(문자열 또는 숫자문자가 들어있는 문자(수로된)를 숫자로 변환)
Val("10") -> 10
Val("10a") -> 10
Sum = 10
Val(Sum) -> 10

* Str(숫자) 숫자를 문자로 변환
Str(12.34) -> "12.34"
Str(-12.34) -> "-12.34"

* Len(문자열) 문자길이 숫자로 바꾼 값
Len("ABC") -> 3
Len("AB C") -> 4

* Left(문자열 , 개수), Right(문자열 , 개수) 문자열의 왼쪽, 오른쪽에서부터 개수 만큼 추출
Left("ABCDE" , 3 ) -> "ABC"
Right("ABCDE" , 2) -> "DE"

* Mid(문자열 , 시작위치 ,( 개수)) 문자열 시작위치에서 개수만큼 추출
Mid("ABCDE" , 2 , 3 ) -> "BCD"
Mid("ABCDE" , 2 )  -> "BCDE"  [개수생략]

* Lcase(문자열) 문자열의 영어 대문자를 모두 소문자로 바꾼값
   Ucase(문자열) 문자열의 영어 소문자를 모두 대문자로 바꾼값
Lcase("ABCDE" )  -> "abcde"
Ucase("abcde" ) -> "ABCDE"

* Asc(문자열) 문자를 내부 아스키코드값으로 바꿈
   Chr(숫자) 숫자(내부아스키코드값)을 문자로 바꿈
Asc("A") -> 65
Chr(65) -> "A"

* Trim(문자열) , LTrim(문자열) , RTrim(문자열) 문자열에서 양측, 좌측, 우측 공백제거
Trim(" A B ") -> "A B" 
LTrim(" A B ") -> "A B "
RTrim(" A B ") -> " A B"

* Instr(문자열 , 찾고자하는 문자열) 문자열에서 찾을 문자열 위치값
Instr("ABCDE", "C") -> 3

* Format(문자 or 숫자 , 형식) 문자나 숫자를 형식에 맞게 문자열로 출력
Format ("ABCDE", "@@@@@@@") -> "  ABCDE" [@는 없으면 공백으로 출력]
Format ("ABCDE", "#######") -> "ABCDE" [#은 있는것만 출력]

JAVASCRIPT window.print와 div 를 이용한 화면 부분 인쇄법

///////////////  Source(html) ///////////////
<html>
<head>
   <title>화면 부분 인쇄</title>
   <SCRIPT LANGUAGE=JScript src="../js/div_print.js"></SCRIPT>
</head>
<body>
    <h2> Top </h2>
   <!--------------부분인쇄 Div 시작------------------>
    <div id="pDiv" align="center">
        <h2> Middle </h2>
    </div>
   <!--------------부분인쇄 Div 끝------------------>
   <h2> Bottom </h2>
</body>
</html>


///////////////  Source(div_print.js) ///////////////

var tempHtmlContent;

function printDiv () {
   if (document.all && window.print) {
       window.onbeforeprint = beforeDivs;
       window.onafterprint = afterDivs;
       window.print();
   }
}
function beforeDivs () {
   if (document.all) {
       var rng = document.body.createTextRange( );
       if (rng!=null) {
           //alert(rng.htmlText);
           tempHtmlContent = rng.htmlText;
           rng.pasteHTML("<table border=0 align=center><tr><td align=center>"
                                       + document.all("pDiv").innerHTML + "</td></tr></table>");
       }
   }
}
function afterDivs () {
   if (document.all) {
       var rng = document.body.createTextRange( );
           if (rng!=null) {
                       rng.pasteHTML(tempHtmlContent);
           }
   }
}


 특별히 설명이 필요 없는 소스 인줄 압니다만, 여기저기 뒤져서 알아낸 것들과 조금의 제 짱구의
굴러가는 노력이 있어서, 몇자 적습니다. ㅎㅎ
  우선 window.print  수행전과 수행후에 각각 onbeforeprint 와 onafterprint 이벤트가 발생하게 됨에 착안하여서 onbeforeprint 가 발생하면 페이지 body 에 있는 모든 html 소스를 임시 저장한후  출력을 원하는 부분(pDiv 부분)의 html 소스와 바꿉니다.
  그 후 원하는 부분의 출력이 끝나면, onafterprint 이벤트가 발생하게 되는 데 이때, 임시 저장해두었던 원래 body 소스를 다시 설정해 주면 됩니다.

ASP ADODB 의 Paramter 데이터 형식

MSSQL데이터형식
PARAMTER데이터형식
bigintadBigint
binaryadBinary
bitadBoolean
charadChar
datetimeadDate
decimaladDecimal
floatadSingle
intadInteger
moneyadCurrency
ncharadWChar
ntextadLongVarWChar
numericadNumeric
nvarcharadVarWChar
realadSingle
smalldatetimeadDate
smallintadSmallInt
smallmoneyadCurrency
sql_variantadVariant
textadLongVarChar 
timestampadDBTimeStamp
tinyintadTinyInt
varbinaryadVarBinary
varcharadVarChar

ASP Tip

1.변수선언은 Dim 사용하며 타입을 밝히지 않아도 컴파일러의 의해서 암묵적으로 결정된다.

2.변수선언과 동시에 초기화 작업을 할수가 없다.

3.세미콜론 (;)을 사용하지 않는다.

4.개체를 생성할때는 Set연산자를 사용하고 Server.CreateObject 메소드를 사용하여 생성한다

5.조건문 If는 Then 사용한다. 또한 프로시저의 시작을 알리는 ()를 사용하지 않는다.
그리고 If문의 끝을 알리는 End If를 사용한다.
IF 조건 Then
ElseIf
Else
End If

6.For시작과 To 끝을 명시하고 스텝을 작성하고 next로 끝난다. 프로시저의 시작을 알리는 ()을
사용하지 않는다.
For 시작 To 끝 Step 스텝
Next

7.함수를 호출할경우 (....)사용하여 매계변수를 전달하지않고 ()없이도 매계변수를 전달할수있다
Test (...) Test "...."

8.Asp의 Switch문은 Select Case 조건 구절을 사용한다. 구문의 끝을 알리는
End Select를 항상사용한다.
SELECT CASE intNumber
CASE 1
    Response.Write "intNumber 에 들어있는 수는 1입니다!"
CASE 2
    Response.Write "intNumber 에 들어있는 수는 2입니다!"
CASE 3
    Response.Write "intNumber 에 들어있는 수는 3입니다!"
CASE ELSE
    Response.Write "intNumber 에 들어있는 수는 1부터 10 사이의 정수가 아닙니다."
END SELECT

9.Asp의 While문은 Do While로 시작하고 구문의 끝을 알리는 Loop를 사용한다.
DO WHILE intLoop <= 10000
    Response.write intLoop & "<BR>"
    intLoop = intLoop + 1
LOOP

10.논리연산자인 같지않다는 <>을 사용한다. 논리연산자는 And와 Or을 사용한다

11.반환값이 존재할경우는 프로시저를 사용하고 반환값이 존재할경우 함수를 사용한다.
물론 프로시저 실행단위를 알리는()를 사용할 필요가 없다. 매계변수의 타입을 밝힐필요도 없다.
함수의 리턴값은 함수명에 값을 대입해주면 그것이바로 함수의 리턴값이 된다.
프로시저 선언부분
Sub Temp[(argument)]
Exit Sub
End Sub
함수 선언부분
Function Temp[(argument)]
Exit Function
End Function
콜부분 (함수, 프로시저)
Call Temp, Temp("..."), Temp "...."

12.배열은 Dim으로 변수를 선언후 ReDim으로 배열의 크기를 결정한다.
Dim temp => ReDim temp(10)
Sub을 호출할때는 ()을 사용할수 없다.

13.Asp의 파일을 인클루드 하기위해 이러한 구문을 사용한다.
<!--#include file="include/config.asp"-->

14.Asp의 With ~ End With 구문을 사용하여. 컴파일러에 의해서 해당개체의 메서드를 사용할수있다.
With구문은 VBSCRIPT 5부터 지원되는 문법이다.
<%
Dim Rs
Set Rs= Server.CreateObject("ADODB.Recordset")
with Rs
   .Open "guest", strconnect, adOpenDynamic, adLockOptimistic 
   .AddNew
     .Fields("name") = "soulhyr"
     .Fields("Email") = "soulhyr@gmail.com"
     .Fields("title") = "제목이다"
     .Fields("memo") = "본문내용이다"
   .Update
End with
%>

ASP RecordSet 객체

recordset 객체

Set DBreco = Server.CreateObject("ADODB.Recordset")

DBreco.Open "테이블이름or쿼리문or저장프로시저",DNS[,커서타입,Lock타입,옵션]

1. 커서타입(ADO상수)
 0. <adOpenForwardOnly> : 레코드를 앞으로 순차적으로 한번만 이동
 1. <adOpenKeyset> : 레코드 자유이동,레코드갱신,다른사용자가추가한 내용 열람불가
 2. <adOpenDynamic> : 레코드 자유이동,레코드갱신,다른사용자가 추가한 내용 열람가능
 3. <adOpenStatic> : 레코드 자요이동,레코드갱신불가,단지데이터를 가져오는데유용

2. Lock 타입
 1. adLockReadOnly : 읽기
 2. adLockRessimistic : 동시갱신 불가.
 3. adLockOptimistic : 동시갱신가능하나 update메서드를 실행하면 갱신안됨.
 4. adLockBatchOptimistic : 갱신모드로 들어가면 작업가능.

3. 옵션
 1. adCmdText : 쿼리문
 2. adCmdStoredProc : 저장프로시저
 3. adCmdTable : 테이블

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

조회 : rs.open "select * from sales",dns,2,1,1
         rs.close
삽입 : rs.open "member",dns,2,2,2
         rs.addnew
         rs("id") = "d500"
         rs.update
         rs.close
수정 : rs.open "select * from member where id='d500'",dns,2,2,1
         rs("tel") = "444-5555"
         rs.update
         rs.close
삭제 : rs.open "select * from member where id='d500'",dns,2,2,1
         rs.delete
         rs.update
         rs.clode

JAVASCRIPT 즐겨찾기

window.external.AddFavorite

<a href="javascript:window.external.AddFavorite('https://www.spris.com/eshop/', '톡톡튀는 쇼핑몰!! 스프리스');">즐겨찾기 추가 </a>