0. 폼을 이용한 데이터베이스(이하 DB) 입력/조회
사실 엑세스는 기본적으로 DB 테이블을 생성하면 손쉽게 직접 테이블에 입력하거나 폼을 통해 입력과 조회가 가능하게끔 기능들을 구비해 놓았다. 테이블을 생성하고 입력하는 기능은 매우 직관적이기 때문에 굳이 여기서 언급을 할 필요는 없고 간단하게 폼을 이용하여 DB를 입력하고 조회하는 방법을 집고 넘어가보자.
아래 화면은 심사위원 예제를 만들기 위해 작성한 Members 테이블이다. 이번 예제에서는 이 테이블 하나만을 생성할 것이다. 생성하는 방법은 아주 간단하니(웹 검색을 해보거나, 센스 있는 분들은 직관적으로 깨달을 수 있다) 여기서 과정은 생략하겠다. 이 테이블에는 10개의 필드가 있다. 독자께서는 굳이 10개의 필드를 만들지 않으셔도 되며, 단지 2~3개의 필드로도 예제의 실습이 가능하다.
간단하게 필드에 대해 설명하자면, ID는 심의위원 고유번호이고, Name은 이름, Affiliation은 소속기관, Department는 부서, Position은 직위, Professional은 전문분야, Office는 사무실 연락처, Mobile은 휴대전화, email은 email 주소, Address는 주소를 나타낸다. 모두 속성은 보시는 바와 같이 텍스트이고, 데이터 크기는 15~70까지 다양하다. 어떤 기준이 있는 것은 아니니 독자께서 적당히 정해주시면 되겠다. 각 필드의 다른 속성들은 나중에 기회가 닿는 데로 설명을 드리겠다.
테이블을 만들었으면 입력과 조회를 할 수 있는 폼을 만들어 보자. 폼의 제목은 Registration이다. 이전 회에서 폼 만들기를 해 보았으니 과정은 생략하고, 폼이 만들어 졌으면 폼 속성 > 데이터 탭에서 레코드 원본을 아래와 같이 Members 테이블로 지정한다.
다음은 리본메뉴의 디자인 >> 기존필드 추가를 선택하면 아래 화면과 같이 속성창이 있던 자리에 Members 테이블의 필드들이 표시된다. Shift키를 이용하여 전체를 선택한 후 마우스로 드래그하여 폼에다 갖다 놓으면 폼위에 아래 화면과 같이 필드들이 배치된다. 필드 크기에 따라 입력박스의 크기를 조절한다.
이것으로 폼을 만드는 작업은 끝났다. 이제 실행만 시켜보면 된다. 실행방법은 전회를 참고바란다. 실행의 결과로 아래 화면이 나타난다. 매우 단순하지만 기본적으로 있을 건 다 있다. 먼저 테이블에서 정의한 필드들의 입력박스들이 모두 나타나있다. ID 입력항목이 (새항목)으로 표시되어 있는 것은 새 레코드 세트가 입력할 준비가 되어있다는 뜻이다. ID 입력창은 편집이 불가능하고 ID하단에 있는 어느 하나의 입력창이라도 입력이 되면 ID에 숫자가 등록된다.
Members 테이블을 설계할 때 필드속성에 '필수'를 '예'로 지정한 필드들이 있으면 그 필드들을 모두 입력하지 않으면 레크드 세트가 완성되지 않으므로 다음 레코드 세트를 입력할 수 없다. 아래 그림은 테이블을 설계할 때 화면 하단에 나타나는 필드 속성창이다. '필수'라는 필드 속성과 도움말이 나타나 있다.
레크드 이동은 폼 하단에 아래 화면과 같은 도구 바가 마련되어 있다. 적색 원 안의 아이콘을 클릭하면 다음 레코드로 이동하고 청색 원안의 아이콘을 클릭하면 이전 레코드로 이동한다. 두 아이콘 가운데 2/2로 표시된 것은 총 2개의 레코드 중 2번째 레코드를 폼이 나타내고 있음을 의미한다. 레코드 이동 아이콘 바깥에 있는 아이콘들을 클린하면 각각 레코드의 시작과 끝으로 이동할 수 있다. 바의 오른쪽에 검색은 레코드 중에 필드 데이터를 검색하는 기능을 수행한다.
아래 화면은 최종적으로 데이터가 입력된 폼이다. 기본적인 작업을 수행하는데 아무런 지장이 없다. 여기에 쿼리 테이블 기능이 추가되면 더욱 다양한 기능들을 수행할 수 있다. 사실 엑세스를 이용한 작업 중 VBA를 사용해야하는 부분은 어떻게 보면 아주 일부라고 할 수 있다. 특수한 작업이나 기능에 대해 VBA가 필요한 것이지 일반적인 작업에는 엑세스가 제공하는 기능만 잘 사용해도 다 커버가 된다.
1. VBA는 어떤 역할을 할 수 있는가
엑세스의 기본기능으로 구성된 폼을 살펴보자. 이 폼은 DB관리 시스템이 가져야하는 기본적인 기능들은 모두 제공한다. 그렇다면 추가기능을 생각해보자. 이 DB에 특정회사나 직위, 전문분야에 관련된 사람의 수를 파악해보고 싶다면 엑세스의 기본기능으로 곤란하다.
자 오늘은 VBA로 이 기능을 개발해보자. 개발순서는 다음과 같다. 먼저 버튼을 위에 만들어진 폼에 하나 만든다. 버튼을 누르면 폼이 추가로 하나 생성된다. 그 폼에는 소속기관을 입력할 수 있는 입력박스가 하나 있고, 버튼은 Search(탐색)과 Cancel(취소) 두 개가 있다. Search 버튼을 누르면 메세지 박스로 동일한 소속기관의 숫자를 보여준다. Cancel 버튼을 누르면 폼은 사라진다.
정리하면, 우리가 만들어야될 객체는 기본화면에 버튼 하나, 추가적인 폼 하나, 추가 폼위에 버튼 두개, 이렇게 네 개를 만들어야 한다. 제일 먼저 해야할 일은 추가 폼을 만드는 일이다. 추가 폼에는 레코드 관련 기능이 필요없다. 따라서 폼을 생성한 후 속성창에서 아래그림과 같이 '형식' 테에서 '레코드 선택기'와 '탐색단추'를 '아니오'로 설정한다.
* 폼을 만들때 '기타' 탭의 팝업 속성은 '예'로 설정한다.
추가된 폼의 이름은 Search로 하고 입력 텍스트박스를 추가하면 아래와 같은 화면이 나타난다. 일단 팝업된 설정 다이얼로그는 취소를 시킨다.
그리고 테스트 입력박스를 선택한 후 속성창의 '기타' 탭에서 이름을 txtAffiliation으로 고친다. 다시 레이블을 선택한 후 속성창 '형식' 탭에서 '캡션'을 Affiliation을 수정한다.
이제 두 개의 버튼을 추가하자. 버튼 추가방법은 생략한다. 아래 화면은 추가 폼의 완성된 형태다.
다음은 기본 폼에서 Search 폼을 나타나게 하는 버튼을 추가한 다음 코드작성기를 이용하여 코드를 작성한다. 버튼의 캡션은 Same Affiliation No. 로 하고 버튼의 이름은 cmdSameAffil로 하자.
코드작성기에 다음과 같은 코드를 추가한다.
이 간단한 코드가 Search 폼을 나타내게 하는 역할을 한다. 여기서 DoCmd에 대해 알아보고 가자. DoCmd는 엑세스에서 다양하게 쓰이는 객체로 주로 기본명령을 수행하는데 사용된다. 즉 폼을 열거나(OpenForm), 폼을 닫거나(Close), 보고서를 열거나 등등의 기능을 수행하는데 자세한 내용은 https://msdn.microsoft.com/en-us/library/office/ff192694.aspx를 참고하기 바란다. 아래 화면은 버튼을 눌러서 실행한 화면이다.
이제부터가 본격적인 VBA 과정이라 할 수 있다. 먼저 쉬운 Cancel 버튼 부터 시작하자. 폼을 닫는 코드는 DoCmd.Close 이다. 간단하게 이 코드를 Cancel 버튼에 연결해주면 추가 폼이 닫히게 된다. 문제는 Search 버튼이다. Search 버튼은 기본적으로 DB 테이블에 접속한 다음 쿼리명령어를 이용하여 원하는 값을 얻어오는 것이다. 먼저 DB접속부터 알아보자
DB에 접속하기 위해서는 DB 객체를 먼저 생성해야한다. 그리고 객체를 생성하는 첫번째 단계는 선언을 하는 것이다. 선언내용은 다음과 같다.
Dim db as DAO.Database
Dim rs as DAO.Recordset
DAO는 Database Access Object로 DB와 연결하기 위한 객체이다. 객체의 하위에는 Database와 Recordset등이 있다.
자세한 내용 https://en.wikipedia.org/wiki/Data_access_object에서 알아보기 바란다.
객체를 선언했으니 아래와 같이 DB와 접속을 한다.
Set db = CurrentDb
Set rs = db.OpenRecordset("select * from [Members] where [Affiliation]='" & strAffiliation & "'", dbOpenDynaset)
OpenRecordset(Neme, Type, Option, LockEdit)
위의 매개변수 중 Name은 String변수로 레코드세트를 가져올 Source를 나타내며, 테이블 이름이나 쿼리식 또는 SQL문이 될 수 있다. Type은 Variant변수로 접속하려고 하는 레코드세트를 나타낸다. 만약 MS Access DB 객체를 연다면 정의할 필요는 없다. Option도 Variant로 생성하는 레크드세트의 특성을 나타낸다. LockEdit는 Option을 보조해주는 기능을 수행하며 생성객체를 제한한다. 자세한 내용은 http://msaccess.tistory.com/46를 참고하시길...
위에서 Name은 SQL식으로 Members라는 테이블에 접속해서 Affiliation이 strAffiliation 스트링 변수와 같은 값을 갖는 레코드를 모두 찾아서 rs라는 레코드세트에 저장하는 명령어다. strAffiliation은 txtAffiliation 값을 가져오는 변수로 정의된다. 좀더 차근차근 설명하면
select * from [Members] : Members 테이블에서 모든 필드 값을 가져온다.
where [Affiliation]='" & strAffiliation & "'" : Affiliation 필드가 strAffiliation과 값이 같은
원래는 "where [Affiliation]='strAffiliation'" 인데 이렇게 쓰면 strAffiliation변수가 인식이 안되기 때문에 위와 같이 &로 문장을 이어주면서 strAffiliation을 " " 밖으로 빼내어 변수로 인식하겠금 하였다. dbOpenDynaset은 type을 나타내는 상수이다. 가장 무난하게 접속대상을 정의하는 상수라 할 수 있다. Option과 LockEdit는 생략하였다.
전체 코드는 아래와 같다.
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim strAffiliation As String
strAffiliation = txtAffiliation
Set db = CurrentDb
Set rs = db.OpenRecordset("select * from [Members] where [Affiliation]='" & strAffiliation & "'", dbOpenDynaset)
rs.MoveLast
MsgBox (rs.RecordCount)
rs.Close
db.Close
Set rs = Nothing
다음의 MsgBox는 이전 절에서 학습을 하였고, 눈치 빠른 분은 아셨을 테지만 rs.RecordCount는 레코드세트의 숫를 세는 멤버함수이다. 즉 메세지 박스에는 레코드세트의 숫자가 몇 개인지를 나타내게 된다.
레코드세트를 만들었으면 프로그램 모듈이 끝나기 전에 해제해주어야한다. 제일 하단의 3줄은 레코드세트를 해재해주는 절차이다. 아래 화면은 최종적으로 실행한 화면과 코드다.
[끝]
댓글 없음:
댓글 쓰기