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

제품:   Access 버전:   2003
검색어:   폼, 북마크
제목:   폼에서 특정 레코드 찾아가기
     
 

New Page 2
  STEP> 따라하기

※ 아래 Daily Tip은 염기웅님이 제공해주신 내용입니다

액세스의 경우 기본적인 데이터 검색 기능이 내장되어 있습니다. 폼 필터라는 것입니다. 폼 필터를 이용하면 여러분들이 원하는 데이터를 쉽게 검색할 수 있습니다. 액세스 도움말에서 폼 필터에 대하여 찾아 보기 바랍니다. 많은 분들이 사용하지 않고 있는데 VBA를 사용하지 않고 쉽게 데이터 검색을 할 수 있는 액세스 내장 도구입니다.

한편, 폼 필터의 단점은 사용자 인터페이스가 직관적이지 않다는 데 있습니다. 어떤 데이터를 검색하고 나면 검색 결과가 목록으로 나오지 않습니다. 따라서 우리가 원하는 데이터가 몇 건인지 직관적으로 알아보기 힘든 측면이 있습니다.

그래서 많은 경우에 VBA를 이용하여 데이터 검색 작업을 수행하게 됩니다. 오늘은 그러한 데이터 검색의 아주 초보적인 단계로서 폼의 Bookmark 속성을 이용하여 원하는 레코드로 찾아가는 방법에 대하여 알아보도록 하겠습니다.

오늘의 샘플 파일을 다운로드 받고 파일을 열어 보면 Products라는 이 있습니다.  

이 폼은 Northwind 데이터베이스의 제품 테이블을 폼으로 만든 것입니다. 제품의 개수가 77개나 되어 원하는 제품의 상세 정보를 보기가 여간 어려운 것이 아닙니다. 그래서 폼의 머리글에 데이터 찾기라는 부분을 만들어 놓았습니다. 이 부분에서 원하는 제품명을 선택하면 다음 그림과 같이 원하는 제품의 데이터를 쉽게 찾아 볼 수 있습니다.

데이터 찾기 콤보상자에서 원하는 데이터를 선택하면 선택한 데이터의 상세정보를 쉽게 찾아볼 수 있습니다.

 

이 폼의 VBA 코드는 다음과 같은 6줄로 구성되어 있습니다.

Private Sub cboFindProduct_AfterUpdate()

   Dim rst As DAO.Recordset      '레코드셋 변수를 선언한다.   

   Set rst = Me.RecordsetClone   '현재 폼의 레코드셋 사본을 rst에 할당한다.

   rst.FindFirst "ProductID = " & cboFindProduct   '레코드셋 사본에서 cboFindProduct 값의 ProductID를 검색한다.

   Me.Bookmark = rst.Bookmark    '현재 폼의 Bookmark 속성을 rst bookmark 속성과 동기화시킨다.(레코드 이동)

   Set rst = Nothing

End Sub

이제 이 코드의 의미를 찬찬히 알아보도록 하겠습니다. 여러분들은 이 코드를 잘 이해해서 여러분의 프로젝트에 적용하면 됩니다

이 코드는 콤보상자의 값이 변경되면 그 값을 읽어서 현재 레코드를 콤보상자의 레코드로 변경해 주는 코드입니다

이러한 기능이 수행되는 것을 이해하려면.. 우선 레코드셋(Recordset) 객체를 알아야 하고, 레코드셋 객체의 FindFirst 메서드를 이해해야 합니다. 그리고 Bookmark 속성을 이해해야 하지요. 지금 나열한 이 모든것에 대한 설명은 하지 않겠습니다. 여러분들이 액세스 도움말에서 찾아서 자세히 공부하기 바랍니다. 여기에서는 각 개체에 대한 개념적인 설명만 드리겠습니다

1. Recordset 객체

Record(레코드) + Set(집합) 의 합성어입니다. 아마 영어사전에서 아무리 찾아도 나오지 않을 것입니다. , 레코드의 집합이라는 말입니다. 관계형 데이터베이스는 집합론에서 출발한 것입니다. 엑셀은 모든 데이터를 행과 열로 구분해서 관리합니다. 그렇지만 관계형 데이터베이스는 모든 데이터를 집합의 하나로 관리합니다. 그래서 보다 유연해진 것이지요.

Record라는 것은 의미있는 데이터의 단위를 말합니다. Recordset '의미있는 데이터 단위의 모임'이라고 할 수 있습니다. 명함을 생각해 봅시다. 명함정보에는 여러가지가 있겠지만.. 이름, 주소, 이메일 등등이 있을 것입니다. 이러한 요소를 합친 하나의 명함의 데이터를 나타내면 다음과 같습니다.

이름

주소

이메일

홍길동

서울시

hong@dbabc.com

이 때 홍길동/서울시/hong@dbabc.com 을 레코드라고 합니다. 그리고 이러한 것들이 모인 것을 레코드셋이라고 하지요. 다시 앞의 예제로 돌아와서.. 폼의 레코드셋이라고 하면 현재 폼이 가지고 있는 모든 데이터의 집합을 의미하는 것입니다. , 모든 Product 폼의 데이터(눈에 보이는 것은 한개 뿐이지만 말이죠,)를 말하는 것입니다.

그래서 보통은 우리가 레코드셋 객체를 이용할 필요가 없지만, VBA 코드를 이용할 때에는 폼의 데이터를 VBA에서 제어하기 위해서 레코드셋 객체를 만들어 사용하게 됩니다. 그래서 우리가 레코드셋 객체를 공부하고 있는 것이기도 합니다.

2. FindFirst 메서드

VBA는 객체지향적인 프로그래밍 언어입니다. 비록 완벽하지는 않다고 해도 말입니다. 데이터라는 놈을 가지고 생각을 해 봅시다. 우리는 데이터를 추가할 수도 있고, 삭제할 수도 있고, 검색할 수도 있습니다마찬가지로 Recordset 객체에서는 추가할 수 있는 방법, 삭제하는 방법, 검색하는 방법 등을 제공합니다. 그 중의 한가지가 데이터를 검색할 수 있는 FindFirst 메서드 입니다.

따라서 우리는 VBA 코드를 이용하여 데이터를 검색할 때 Recordset 객체의 FindFirst 메서드를 이용하게 됩니다.

3. Bookmark 속성

Bookmark는 우리말로 하면 책갈피입니다. Bookmark 속성은 폼 개체의 속성이기도 하며 레코드셋 객체의 속성이기도 합니다. , 폼에서도 책갈피를 이용하기도 하고 레코드셋에서도 책갈피를 이용하기도 한다는 말입니다.

책갈피는 어느 때 쓰나요? 책을 보다가 책을 덮을 때 사용하지요? 그냥 책을 덮으면 되지만 왜 굳이 책갈피를 사용할까요? 다음에 책을 다시 볼 때 내가 보던 부분을 빨리 다시 찾기 위해서 사용합니다. 액세스 데이터베이스에서도 이것과 유사합니다. 액세스 데이터베이스에서는 Bookmark 속성을 현재 보고 있는 레코드를 표시하는데 사용합니다. 여기에 기록되는 값은 특정한 값의 정수로서 우리는 그 값을 알 필요는 없습니다. 물론, 그 값에 1을 더하면 다음 레코드로 이동한다든지 하는 일 역시 일어나지 않습니다.

그러면 폼에서 레코드간 이동을 하기 위해 어떻게 해야 하는지 한번 알아봅시다.

<1> 현재 폼에서 이동하고자 하는 레코드의 기본키 값을 알아냅니다.
<2>
현재 폼의 레코드 집합을 복사합니다.
<3>
복사한 레코드 집합에서 이동하고자 하는 레코드의 기본키 값을 검색합니다.
<4>
복사한 레코드 집합의 Bookmark 속성을 현재 폼의 Bookmark 속성에 할당함으로써 실제로 현재 폼의 레코드 이동이 이루어지게 합니다

먼저 1번 항목을 살펴보겠습니다. 레코드의 기본키 값을 알아내는 것은 콤보상자에서 이루어집니다. 콤보상자가 업데이트가 되면 앞에 기록해 놓은 프로시저(cboFindProduct_AfterUpdate)가 실행됩니다. cboFindProduct_AfterUpdate 프로시저가 실행되는 것이 바로 1번 항목입니다

이제 2번항목Set rst = Me.RecordsetClone로서 구체화됩니다. rst라는 레코드셋 변수에 현재폼의 레코드셋 사본을 할당하는 것이지요. 열려있는 폼 상에서 데이터 작업을 하게 되면 현재 사용중인 사용자에게 혼동을 줄 수 있기 때문에 사본을 만든 후 작업을 하는 것입니다

3번 항목 rst.FindFirst "ProductID = " & cboFindProduct로서 구체화됩니다. ProductID 라는 필드명을 검색해서 cboFindProduct 에 있는 값을 찾으라는 명령입니다.

그 다음 항목이 가장 중요합니다.
Me.Bookmark = rst.Bookmark  
이것은 말로 하면 rst 객체(폼의 데이터 집합 사본) Bookmark 속성을 현재 폼의 Bookmark 속성에 할당하라는 의미입니다. .. 레코드를 찾기 위해서 현재 폼의 레코드셋의 사본을 만들었습니다. 그리고 그 사본에서 데이터를 검색했지요? 그러니까 이제는 진짜 폼에서도 찾은 레코드로 이동해야 하겠죠? 그래서 이런 코드를 적은 것입니다. 일종의 동기화라고 이해하면 되겠습니다.

처음 이런 내용을 공부하는 분에게는 무척 어려운 내용일 것입니다. 하지만 앞에서 말씀 드린 각각의 객체에 대한 개념적 이해, 그리고 객체가 제공하는 메서드를 이해하면 앞으로의 적용 가능성은 무궁무진하다고 말씀드릴 수 있습니다. 아울러 데이터 검색에 대해서 보다 관심이 있는 분은 2004년 6월 11일에 있을 데이터 검색의 모든 것 오프라인 교육에 참석하시기를 권해 드립니다.