배움터  
  HOME > 배움터 > Daily Tip
Daily Tip

제품:   Access 버전:   공통
검색어:   도메인 함수
제목:   내 입맛 대로 도메인 함수(1)
     
 

새 페이지 1

  STEP> 따라하기

※ 오늘 Daily Tip은 Crocii(최천군)님이 제공해주신 내용입니다.

이제껏 도메인 함수에 대해서 여러 차례 언급을 해왔습니다.상당히 똑똑한 녀석이지 않습니까? 그저 필드이름, 테이블이름, 조건만 줄 뿐인데 알아서 척척 데이터를 가져다 주니 말입니다.

하지만 진짜로 똑똑한 것은 도메인 함수에게 원하는 세가지 조건을 적절히 줄 수 있는 여러분입니다. 도메인 함수의 실체는 단순한 심부름꾼일 뿐입니다. 그 실체를 파악한다면 액세스가 제공하는 도메인 함수 보다 더 똑똑한 함수를 만들 수도 있습니다. 도메인 함수를 웃어 줍시다.

도메인 함수의 구성이 SQL과 유사하다고 언급했었습니다. 도메인 함수의 대괄호로 묶인 세가지 또는 두 가지 인수가 어떻게 사용되는 것일 까요?

<1> Alt+F11 을 누르시면 VBE 창이 열립니다.

<2> 도구뉴의 참조를 클릭하여 Microsoft DAO 3.x를 찾아 체크해 줍니다.

<3> 삽입메뉴의 모듈을 클릭하여 모듈을 삽입하시고 함수 프로시져를 만들어 보겠습니다.

[함수]
함수란 도메인 함수처럼 인수를 주면 이를 통해 계산을 하여 나온 결과값을 반환하는 프로시져를 말하며 지금처럼 모듈에서 사용자에 의해 만들어 지는 함수를 사용자 정의 함수라고 합니다.

<4> 함수라는 것을 알리기 위해 아래와 같은 방식으로 입력 합니다.

Function 함수명(인수명 as 변수타입, 인수명 as 변수타입) as 함수값타입

지난 예제가 여러 레코드의 마지막 값을 구하는 것이었으므로 DLast() 함수를 만들어 보겠습니다.

[함수 선언 부분]
Function cDLast(Exp As String, Dmn As String, Crt As String)

각각의 인수는 쉼표로 구분하고 함수명과 인수명은 여러분 규칙 내에서 마음대로 작명하셔도 됩니다. 단 인수들의 데이터 형식과 개수가 중요합니다. 함수명에 값을 반환한 후 End Function으로 종료합니다.

Function cDLast()
cDlast=10 이와 같이 함수명에 값을 주면 이 값이 함수의 반환 값이 됩니다.
end function

즉 위의 함수는 어떤 경우에도 값이 항상 10 이됩니다. 이 함수는 세 개의 인수를 받고 인수의 데이터 타입은 String 즉 문자열 입니다. 각각의 이름은 순서대로 Exp, Dmn, Crt 입니다.

* Dim rs As DAO.Recordset - 변수 선언

Recordset은 레코드들의 집합으로 OpenRecordset() 함수를 통해 테이블명, 쿼리명, SQL을 인수로 사용하여 레코드 집합을 생성할 수 있습니다. 생성된 레코드집합은 테이블형태로 존재하지 않고 메모리에 임시적으로 존재하게 됩니다.

* Dim strSql As String - SQL 문장을 Stirng 즉 문자열로 보관할 변수 선언

* On Error Resume Next - 에러 발생시 무시하고 다음 라인으로 진행하게 하는 선언문 입니다.

strSql = "select" & Exp & "from" & Dmn & "where" & Crt & ";"

정의해둔 문자열 변수에 SQL 문장을 넣습니다. 파란색은 SQL의 일부이고 빨간색은 처음 함수 선언부에서 인수로서 받은 값들입니다.

예를 들어 이 함수를 아래와 같이 작성합니다.

=cDLast("전화번호","전화번호","전화구분='집팩스' And PplCode=1")

아래와 같이 변수에 저장 될 것입니다.

strSql 변수에 들어갈 값은 "select" & "전화번호" & " from " & "전화번호" & " where" & "전화구분='집팩스' And PplCode=1" & ";"

&와 따옴표를 빼고 실제로 저장 되는 값은 아래와 같이 완벽한 SQL 문장이 됩니다.

select 전화번호 from 전화번호 where 전화구분='집팩스' And PplCode=1;

전화번호라는 테이블에서 전화구분 필드가 문자열 집팩스 이고 PplCode가 1 인 사람의 전화번호를 모두 찾아내라는 구문입니다.

* Set rs = CurrentDb.OpenRecordset(strSql)
이렇게 저장 된 SQL 문장을 이용해 위와 같이 레코드 집합을 불러내서 rs 라는 변수에 담아 둡니다.

* rs.MoveLast - 레코드 집합의 마지막 레코드로 이동합니다.

* cDLast = rs(Exp) - 현재레코드의 필드명이 Exp 즉 "전화번호" 인 필드의 값을 함수값으로 반환 시키는 것입니다.

이와 같이 특정 필드의 값을 구할 수 있는 형식은 다음과 같습니다.

Rs!필드명
Rs.Fields("필드명)
Rs("필드명")
Rs.Fields(index) - index는 각 필수의 순서번호로 왼쪽부터 0,1,2… 순으로 매겨집니다.

필드명이 변수안에 있다면 위의 방식 중 필드명이 따옴표로 묶여 있는 방식에서 변수명만 대입하면 될 것입니다.

* End Function - 함수를 종료 합니다.

위의 그림과 같이 우 상단의 입력란의 컨트롤 원본에 DLast() 함수와 같은 형식으로 아래처럼 작성해 줍니다.

=cDLast("전화번호","전화번호","전화구분='집전화' And PplCode=" & Forms!사람과전화!txtPplCode)

Froms!사람과전화!txtPplCode는 사람과전화라는 이름의 폼에 있는txtPplCode라는 컨트롤의 값입니다. 같은 폼내에 있는 텍스트박스라면 단순히 txtPplCodef 라고만 써도 됩니다. 이와 같이 작성한 이유는 참조할 컨트롤이 상위폼에 있고 참조를 하는 입력란은 하위폼에 있기 때문입니다.

이와 같이 하위폼에 상위폼의 컨트롤 값을 참조할 때 아래와 같은 형식으로 값을 얻을 수 있습니다.

=Forms![상위폼의 실제 폼이름]!컨트롤이름

반대로 상위폼에서 하위폼의 값을 참조할 때는 하위폼의 실제이름이 아닌 상위폼에서 사용되는 하위폼의 이름을 사용합니다. 이는 실제 하위폼의 이름과 다를 수 있습니다. 상위폼에서 하위폼을 한 번 클릭하고 속성창의 기타탭에 이름항목을 보면 나오는 이름이 상위폼에서 하위폼을 찾는 이름입니다. 이 이름을 이용하여 다음과 같이 참조 할 수 있습니다.

[하위폼의 이름].form!컨크롤이름

이렇게 사용자 함수로 만들어진 도메인 함수는 원래의 도메인 함수보다 처리 속도가 빠릅니다. SQL을 사용하기 때문입니다.

복잡한가요? 곰곰히 생각하면 아주 간단한 것입니다. 이제 응용편! 은 일단 샘플로 올리겠습니다. 설명은 다음 기회에…