91
액액액 액액액액액 액액 액액 1. 액액액액액액 액액액 1) 액액액 액액액액액액액액 액액액액? 2) 액액액액액액 액액액액 액액액액액액 액액액 3) 액액액 액액 액액액액 액액액 4) 액액액 액액액액 5) 액액액 액액액액액액 액액액 액액액액 A 6) 액액액 액액액액액액 액액액 액액액액 B 7) 액액 액액액 액액 액액 2. 액액액 액액액 액액 1) 액액액 액액액액액 액액액액? 2) 액액액 액액액 액액액 액액액액 액액액 3) 액액액 액액액 액액 액액액 액액 3. 액액 액액 1) 액액액액 액액액액 액 액액 2) 액액액 액액액 액액액액 액 액액 3) 액액 액액액액 액액 4) 액액 액액액액/액액액액액 액액액 액액 5) 액액액액액 액액 액액액액액 액액 6) 액액액액액액 액액액액액 액액액 액액액 액액 7) 액액액액액 액액액 액 액액액액 8) 액액액액액 액액 9) TAB 액액액액 액액액액 액 액액 10) 액액 액액액액액액 액액 액액 4. 액액액 액 액액 1) 액액액액 액액액액 액액액: 4/7/2022 액액액: 1/91

액세스로 응용프로그램 만들기 · Web view스위치보드 관리자 추가 프로그램을 이용하면 응용프로그램의 스위치보드 폼의 아이템들의 추가,

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

액세스 프로그래밍 강좌

강좌 1. 응용프로그램 만들기

1) 액세스 응용프로그램이란 무엇인가? 2) 데이터베이스 마법사로 응용프로그램 만들기 3) 자신의 응용 프로그램 만들기 4) 시작폼 설계하기 5) 자신의 응용프로그램 개체로 연결하기 A 6) 자신의 응용프로그램 개체로 연결하기 B 7) 시작 옵션의 설정

강좌 2. 비주얼 베이직 소개

1) 비주얼 베이직이란 무엇인가? 2) 자신의 첫번째 이벤트 프로시저 만들기 3) 자신의 첫번째 함수 만들기

강좌 3. 폼의 사용

1) 마법사를 사용하여 폼 작성2) 디자인 보기를 사용하여 폼 작성3) 폼과 하위폼의 연결4) 폼에 콤보상자/리스트박스 컨트롤 사용5) 콤보상자의 값과 리스트박스 연결6) 리스트박스의 행데이타를 읽어서 다른폼 열기7) 언바운드를 활용한 폼 사용방법8) 명령버튼의 사용9) TAB 컨트롤을 사용하여 폼 작성

10) 폼에 하이퍼링크의 사용

강좌 4. 레코드 셋 사용

1) 개체변수 사용하기 2) 개체변수 찾아보기 3) 개체 참조 4) 개체탐색기 사용 5) 레코드셋 개체의 사용

작성일: 5/18/2023 페이지: 1/92

액세스 프로그래밍 강좌

강좌 5. 응용프로그램의 보안

1) 데이터베이스 암호설정2) 액세스 사용자수준 보안

강좌 6. 기타

강좌 1. 응용 프로그램 만들기

지금 우리나라에서는 엑셀이 아주 유명하지요. 물론 엑셀은 아주 훌륭한 프로그램입니다. 그렇지만, 자료가 몇천개만 되어도 엑셀은 힘들어 합니다. 일반 개인용으로는 엑셀이 프로그램도 훨씬 쉽고, 수정도 쉬우므로 엑셀을 사용해도 좋겠지만, 사무실이 되면 일은 달라집니다. 지금도 많은 사무실에서 엑셀과 전쟁을 하고 있을겁니다. 그러한 분들에게는 액세스가 훌륭한 해결방안이 될 수 있을 겁니다. 액세스 같은 쉬운 쿼리 작성기 는 없을겁니다. 레포트도 너무너무 쉽고 …엑셀과 함께, 20 세기 최고의 개인용 소프트웨어라고 감히 단언합니다.지금은, 엑셀과 액세스를 병행해서 사용하고 있습니다. 개인적으로 엑셀은 변화가 심할 때 쓰시면 좋고(1 회용), 액세스는 어느정도 정형화된 틀에 맞을 때 사용하는 것이 좋다고 생각합니다.

여러분들이 액세스의 화면에 친숙해지고, 테이블, 질의, 폼, 보고서 등을 잘 만드실 수 있게 된 다음에는 이러한 개체를 유기적으로 결합하여 여러분들의 데이터베이스를 훨씬 사용하기 쉽고 강력하게 만들 수 있습니다. 이렇게 유기적으로 결합하는데 없어서는 안 될 것이 바로 비주얼 베이직 입니다. 이번 강좌에서는 액세스 응용 프로그램이 무엇인지, 그리고 그것을 만드는 방법에 대한 개관을 설명하도록 하겠습니다. 이번 강좌를 끝내시면, 여러분은 자신의 첫번째 액세스 응용프로그램을 만드실 수 있게 될 겁니다. 아마..

1) 액세스 응용프로그램이란 무엇인가?

사람들은 물건의 주문, 고객 관리 등에 있어서 자료를 저장하고, 검색하고, 분석하는데 데이터베이스 프로그램을 사용합니다. 액세스 응용프로그램이란, 테이블, 질의, 폼, 보고서, 매크로, 모튤 등 액세스 개체로 구성된 새로운 프로그램입니다. 엑셀등은 파일 하나가 무슨 문서처럼 사용되지만, 액세스 응용프로그램은 파일 하나가 응용프로그램 하나가 됩니다. 아직은 잘 모르시겠더라도, 조금만 더 공부해보면, 액세스가 훌륭한 응용프로그램

작성일: 5/18/2023 페이지: 2/92

액세스 프로그래밍 강좌

개발툴임을 깨닫게 되실겁니다. 일반 데이터베이스와 이제 여러분들이 만들려고 하시는 응용프로그램의 차이는, 일반 데이터베이스는 자료를 보관해 놓은 겁니다. 그리고, 사용자는 데이터베이스가 어떻게 구축이 되어 있는지 알아야 하죠. 그러니까, 자료를 검색하고, 추출하고, 보관하는 일련의 작업들을 하기 위해서 사용자는 데이터베이스의 속을 다 알아야 하는 겁니다. 그러나, 데이터베이스 응용프로그램은 전혀 그럴 필요가 없습니다. 데이터 입력을 하는 폼, 검색을 하는 폼 등을 개발자가 미리 만들어 놓은 것이거든요. 예를들면, 아래한글 프로그램에서 글자를 꾸미고 하는 일련의 작업들은 일정한 형식의 대화상자에서 사용자가 무엇을 선택함으로써 이루어 집니다. 글자 속성의 값들을 직접 입력하는 것이 아니고요.

액세스 데이터베이스 응용프로그램의 주된 요소는 그것에 속해있는 개체와 속성 그리고 폼이나 보고서에서 발생하는 이벤트들입니다. 그러면, 액세스 응용프로그램의 주된 요소에 대해 한번 알아보도록 합니다.

MicroSoft Access 개체 모델

응용프로그램 : Application 개체는 현재 Microsoft Access 응용 프로그램을 나타냅니다. Application 개체는 Forms 컬렉션, Reports 컬렉션, Modules 컬렉션, Screen 개체, DoCmd 개체 등을 포함한 모든 Microsoft Access 개체와 컬렉션을 포함합니다.

개체 : 개체란 모든 열린폼과 리포트, 그 개체와 관련된 컨트롤, 모듈, Application, DoCmd, Screen 과 같은 응용 프로그램의 요소를 나타냅니다. 컬렉션이란 몇몇의 다른 개체들을 포함한 개체입니다. 예를 들면, Forms 컬렉션은 응용 프로그램 안에 있는 모든 Form 개체를 포함하고 있습니다. 개체에는 우리가 할당할 수 있는 속성들이 있습니다. 개체는 개발자가 혹은 사용자가 원하는 대로 행동하게 만들거나, 보여지게 하기 위해서 속성을 할당합니다. 속성을 적절히 할당하면, 개체는 보다 더 합리적으로 행동하고, 보여지게 됩니다.

폼 : 사실, 폼은 개체의 일부분이지만, 액세스 데이터베이스 응용프로그램에서 폼은 많은 역할을 담당합니다. 데이터를 입력하는 것도 폼에서 하고, 데이터를 검색하는 것도 폼에서 합니다. 그리고, 그 이면에는 이벤트가 있는 것입니다. 액세스는 이러한 이벤트에 대해

작성일: 5/18/2023 페이지: 3/92

액세스 프로그래밍 강좌

자동으로 반응합니다. 그러면, 사용자는 그 이벤트에 따라서 코드를 입력하기만 하면 되는 것입니다. 예를 들자면, 어떤 폼에서 '출력'이라는 명령단추가 있고, 사용자가 그것을 마우스로 클릭 했다면, 액세스는 자동적으로 'Click' 이라는 이벤트 를 발생시킵니다. 그래서 개발자는 단순히 그 이벤트에 대해서 ' 출력하라 ' 라는 코드 만 입력하면 되는 것입니다.

외부 라이브러리 : 여러분들은 코드를 직접 만들수도 있지만, 이미 잘 만들어진 코드를 여러분의 코드에서 호출할 수도 있습니다. 또한 동적 링크 라이브러리도 호출할 수 있습니다. 전자는 *.mda 의 확장자명을 갖고, 후자는 *.dll 이라는 확장자명을 갖습니다.

응용프로그램의 자료를 저장하고 보여주는 영역입니다. 테이블, 질의, 폼, 보고서

개체의 작동을 설정합니다. 속성의 할당과 식

기본적인 설정 외에 개발자가 원하는데로 응용프로그램을

작동시킵니다. 메크로와 비주얼 베이직

비주얼 베이직 이상의 기능을 제공합니다. MDA 와 DLL

Note: 데이터액세스개체(DAO) 모델데이터베이스의 구조와 그 데이터에 대한 액세스가 필요할 때, 또는 테이블의 스키마를 검색하거나

새 인덱스를 만들거나 쿼리가 리턴한 데이터를 한번에 한 행씩 조사하거나 폼에서 특정한 행을 찾는

등의 필요가 있을 때 Access 는 데이터액세스개체(DAO)를 사용함으로써 이 작업을 할 수 있습니다.

Note: 응용프로그램의 메인 프로그램은 어디있습니까?

작성일: 5/18/2023 페이지: 4/92

액세스 프로그래밍 강좌

만약, 여러분들이 과거에 액세스가 아닌, 다른 프로그램을 이용해서 데이터베이스 응용프로그램을 만들어 보았다면, 메인프로그램이 어디에 있는지 참 궁금할 것입니다. 한때 개인용 데이터베이스 시장에서 명성을 날렸던 dBase 나 Clipper 들은 프로그램을 구동시키기 위해서 메인프로그램이 필요합니다. 마치 C 나 기타 다른 프로그래밍 언어 처럼 말이죠.

그러나, 액세스에서는 메인프로그램이 필요 없습니다. 왜냐하면, 액세스는 이벤트를 중심으로 해서 구성된 프로그램이기 때문입니다. 이것의 장점은 써 보시면 아실 테지만, 간단히 예를 들어 보겠습니다. 사용자가 버튼을 눌렀을 때 여러분은 어떤 일이 발생하게 하고 싶다고 가정해 봅시다. 출력을 한다거나, 종료를 한다거나.. 이런 것을요. 다른 프로그램들은 사용자가 버튼을 클릭하는지의 여부를 프로그램 속에서 확인해야 합니다. 특정 버튼이 눌려지는지의 여부를 확인하는 코드를 만들어야 한다는 이야기지요. 그렇지만, 액세스에서는 그럴필요가 없습니다. 버튼이 눌려지면, 액세스는 자동으로 OnClick 이벤트를 발생시키고, 개발자는 OnClick 이벤트가 발생할때 적용되는 동작만 신경쓰면 됩니다. 잘 모르시겠다고요? 차차 아시게 될 겁니다. 하여튼, 이러한 구조로 말미암아, 개발자는 순서도(Flow Chart)를 획기적으로 줄일 수 있게 되었습니다. 마찬가지로, 액세스 데이터베이스가 열릴때의 이벤트에 무엇인가를 설정해 놓기만 하면 되는 것입니다. 그래서 액세스에서는 메인프로그램이 필요 없는 것입니다. 심지어, 파일이 열리자 마자 닫히게 하고 싶다면, 그렇게 하면 되는것입니다. 물론, 그럴필요는 없겠지만요.

작성일: 5/18/2023 페이지: 5/92

액세스 프로그래밍 강좌

2) 데이터베이스 마법사로 응용 프로그램 만들기

<마우스 몇 번의 클릭만으로 어떤 어려운 작업을 쉽게 해주는 도구>가 마법사라고 생각하시면 됩니다. 실제로 액세스에도 명령 단추 마법사, 옵션그룹 마법사, 콤보상자 마법사 그리고 데이터베이스 마법사 등 많은 마법사가 있습니다. 그러한 마법사 중에서 오늘은 데이터베이스 마법사에 대해서 한 번 공부해 보기로 하죠.

데이터베이스 마법사는 액셀이나, 아래 한글 같은 프로그램에서는 서식파일(Template File)로 생각하시면 되겠습니다. 그런데, 데이터베이스는 그 자체가 엑셀이나 워드프로세서처럼 파일 하나로 구성된 단순한 개체가 아니기 때문에 마법사라고 했는지도 모르겠습니다. 하여튼, 데이터베이스 마법사는 일상 생활과 업무상에 빈번하게 쓰이는 데이터베이스 프로그램을 쉽게, 말 그대로 마우스 몇 번의 클릭만으로 만들어 주게 됩니다. 아직 이 기능을 모르시는 분이 있다면, 일단 한 번 해 보세요. 데이터베이스 마법사에는 실생활에 필요한 많은 데이터베이스가 이미 있답니다. 액세스에 능숙하다면 처음부터 데이터베이스 설계(Design)를 하시는 편이 더 좋을테지만, 데이터베이스는 워드프로세서나 액셀처럼 수정하기가 쉬운 프로그램이 아니기 때문에, 액세스에 능숙하지 않다면 데이터베이스 마법사를 기반으로 새로운 응용프로그램을 만드시는 것이 좋을 것입니다.

대부분의 일상적인 응용프로그램을 만드는 가장 쉬운 방법은 데이터베이스 마법사를 이용하는 것입니다. 데이터베이스 마법사를 사용하면, 우리는 주문서를 입력하거나, 업무상 약속을 기록하고 찾는 일 그리고 개인적인 사항들의 입력 및 정리같은 작업들을 쉽게 해 주는 다양한 서식 데이터베이스 중에서 하나를 고르면 되는 것입니다. 데이터베이스 마법사는 우리가 만들고 싶어하는 응용프로그램에 대해서 물어보고, 그것에 따라 우리의 응용프로그램과 그것에 속하는 모든 개체를 만듭니다.

데이터베이스 마법사로 응용프로그램 만들기

1. <새 데이터베이스 만들기> 버튼을 클릭하세요.2. <데이터베이스> 탭을 클릭하세요.3. 원하시는 응용프로그램 서식 파일을 더블클릭 하세요. 그러면 <새 데이터베이스 파일>

이라는 대화상자를 볼 수 있습니다.4. <파일 이름> 문자열 상자에 원하는 데이터베이스 파일 이름을 입력하시고, <작성>

버튼을 클릭하세요.5. 그리고, 계속되는 화면의 지시를 따르시면 됩니다.

작성일: 5/18/2023 페이지: 6/92

액세스 프로그래밍 강좌

데이터베이스 마법사는 응용프로그램의 테이블과 폼, 보고서와 약간의 이벤트 프로시져를 만듭니다. 또, 데이터베이스 마법사는 스위치보드 폼을 만들게 되는데, 이것의 버튼을 클릭함으로써 사용자는 응용프로그램의 기능들을 이용할 수 있게 됩니다.

데이터베이스 마법사를 통해서 하나의 응용프로그램을 만든 후에는 우리가 원하는대로 그것을 최적화 할 수가 있습니다. 예를 들면, 응용프로그램의 폼에 비주얼베이직 이벤트 프로시져도 추가할 수가 있고 혹은 데이터베이스 마법사가 만든 응용프로그램을 더 강력하게 하기 위해서 폼이나 보고서를 더 만들 수도 있습니다. 이러한 작업들은 거의 필수라고 여겨집니다. 왜냐하면, 데이터베이스 마법사는 그야말로 데이터베이스의 구조와 그것에 따른 기본적인 폼과 보고서만을 만들어 주기 때문입니다. 좀 더 편하게 사용하기 위해서, 좀 더 멋있게 만들기 위해서 사용자의 수정은 필수입니다.

만약 폼이나 보고서를 응용프로그램에 추가시켰다면 그것을 스위치보드 폼에 포함시키고 싶으실 겁니다. 사용자가 그것을 쉽게 사용해야 되니까요. 새로 멋진 폼이나 보고서를 추가 시켰지만, 그것을 데이터베이스 창에서 실행 시켜야 한다면, 그것은 사용자에게는 너무 여려운 일이 될 테니까요. 스위치보드 관리자 추가 프로그램을 이용하면 응용프로그램의 스위치보드 폼의 아이템들의 추가, 이름 바꾸기, 삭제 등이 아주 쉬워집니다.

데이터베이스 마법사로 만든 스위치보드 폼 최적화하기

1. 응용프로그램의 스위치보드 폼에서 <스위치보드 항목 전환> 을 누릅니다. - 이것은

데이터베이스 마법사로 만든 응용프로그램에 한합니다. 여러분들이 직접 만든 응용프로그램의 스위치보드 폼에는 아마 이런 내용이 없을겁니다.

2. 그럴때는 메뉴의 <도구> - <추가기능> - <스위치보드 관리자> 를 선택하시면 됩니다. 그

다음에는 계속되는 화면의 지시를 따르시면 됩니다.

작성일: 5/18/2023 페이지: 7/92

액세스 프로그래밍 강좌

주의! : 데이터베이스 마법사로 만든 기본 스위치보드의 '스위치보드 항목전환' 버튼을 변경시키고 싶다면 '스위치보드 관리자' 추가기능을 실행 시키세요. 스위치보드의 항목을 수정할 때에는 스위치보드 폼의 디자인 모드에서 수정하지 마시고 항상 스위치보드 관리자 프로그램을 실행시키셔야 합니다. 스위치보드 관리자로 입력한 각종 정보는 스위치보드항목이라는 테이블에 저장이 되고, 그 테이블에 의해서 스위치보드가 작동이 되거든요. 그래서, 스위치보드의 디자인을 변화시킨다면, 스위치보드는 더이상 작동하지 않을 가능성이 큽니다. 물론, 액세스를 잘 다루시는 분은 디자인을 변화 시킬 수도 있지요. 사실, 스위치보드는 디자인모드에서 버튼 8 개만 건드리지 않으면 다른 것은 수정해도 잘 작동하거든요. 하지만, 초보자 여려분들게서는 조금 불편하시더라도 '스위치보드 관리자'를 사용하시기를 바랍니다.

그러면 꼭 스위치보드를 사용해야 되느냐? 그건 아닙니다. 만약에 여러분들이 스위치보드가 불편하다거나, 스위치보드의 한계를 느끼시는 분들은 여러분 자신의 시작 폼을 만드시면 되는 겁니다. 사실, 스위치보드는 편리하기는 하지만, 응용프로그램이 복잡해지면 그 한계를 드러냅니다. 한 페이지에 버튼이 8 개 밖에 없거든요. 그 때는 여러분의 새로운 시작 폼을 멋있게 만들면 되는 것입니다. 그렇다고 해서 스위치보드가 쓸모 없다는 이야기가 아닙니다. 상용 프로그램같은 완성도를 보이는 액세스 프로그램이 아닌 다음에는 대부분의 액세스 응용프로그램에서 스위치보드는 훌륭한 시작폼의 역할을 합니다. 그러니까, 여러분들은 염려하지 마시고 스위치보드를 먼저 사용해 보세요. 나중에 필요하시면 시작폼을 따로 만드시면 되지 않겠습니까?

.3) 자신의 응용프로그램 만들기

데이터베이스 마법사로 응용프로그램을 만들었거나, 아니면 여러분들이 직접 처음부터 만든 응용프로그램이든지 간에 보다 더 사용하기 편리하고, 쉽게 하기 위해서 여러분 스스로 프로그램을 개발하는 것에 대해 한번 배워보겠습니다.

데이터베이스 마법사에서 원하는 형식의 응용프로그램이 없거나, 이미 응용프로그램을 만들었다면 자신의 응용프로그램을 만들기 위한 동기는 충분한 셈입니다. 아마도, 여러분은 응용프로그램을 제작하는 순서에 있어서 테이블을 만들고 나서 다른 개체들을 만드는 순서가 가장 자연스럽다고 느끼실 겁니다. 그럼, 좋은 예를 하나 소개 하도록 하겠습니다.

1 단계 : 테이블과 관계설정의 계획

실제적인 응용프로그램 개체들을 만들기 전에 테이블과 관계설정을 하는데에 많은 시간을 투자하세요. 아주 중요합니다. 다른 사무용 프로그램들과는 달리, 데이터베이스는 테이블과 관계설정이 잘못 되어 있으면 나중에 수정하기가 거의 불가능해지기에 이를 수도 있습니다.

작성일: 5/18/2023 페이지: 8/92

액세스 프로그래밍 강좌

저는 데이터베이스 응용프로그램을 만드는 시간을 100 이라고 가정한다면 적어도 30 정도는 계획하는데 시간을 써야 한다고 생각합니다. 폼이나 보고서가 잘못 되어 있으면 수정을 하는 것이 상대적으로 쉽지만, 테이블과 관계설정이 잘 못 되어져 있으면, 그에 따른 폼이나 보고서도 모두 수정을 가해야 하기 때문에 응용프로그램이 복잡해지면 수정이 아주 힘들어집니다. 무작정 데이터베이스를 응용프로그램을 만드는 것은 아주 나쁜 습관입니다. 주의하세요. 아무리 강조해도 지나치지 않습니다. 제가 그랬었거든요. 일단, 데이터를 분석하고, 그에 따라서 개별의 테이블로 넣을지, 아니면 하나의 테이블로 넣을 지를 결정 하셔야 합니다. 테이블과 관계설정에 대한 좋은 예는 Northwind Trader 샘플과 데이터베이스 마법사로 만든 응용프로그램이라고 할 수가 있겠습니다. 결국, 액세스를 잘 한다 못 한다는 여기 1 단계에서 결정이 납니다. 물론, 테이블과 관계를 잘 설정하기 위해서는 많은 경험이 있어야 하지만, 훈련에 의해서 그 과정을 많이 줄일 수가 있습니다. 응용프로그램을 만들기 전에, 모든 가능성을 생각해 보세요. 물론, 쉽지는 않겠지만요.

2 단계 : 테이블 제작과 각각의 테이블에 약간의 샘플 자료의 추가

테이블은 테이블 마법사나 혹은 사용자가 직접 디자인 모드나 데이터시트 보기에서 만들 수가 있습니다. 데이터 입력을 쉽게 하기 위해서 테이블을 만들 때, 일대 다 관계에서 '다'쪽의 테이블에 Lookup 필드(조회열)를 만드세요. 이것도 사실은 1 단계에 속하는 과정입니다. Lookup 필드(조회열)를 만드는 것은 쉽지 않을지 모르지만, 폼이며 보고서며 그리고, 데이터베이스의 핵심이라고 할 수 있는 질의도 모두 테이블에서 비롯되기 때문에, Lookup필드를 테이블에서 만들어 놓는다면 이후의 작업 - 질의, 폼, 보고서 만들기 - 가 아주 손쉬울 것입니다. 그 후에 테이블 구조를 완성하고 폼이나 보고서에서 개발자가 원하는대로 자료가 구성되는 지를 확인하기 위해서 샘플 자료를 입력합니다.

3 단계 : 응용프로그램에 하나의 폼 추가하기

응용프로그램에서 가장 빈번하게 입력하는 자료에 대한 폼을 만드세요. 폼을 만들때는 처음부터 직접 만드는 방법도 있지만, - 이거 중노동입니다. 노가다예요. - 저는 폼 마법사를 사용해서 폼을 만든 후에 약간의 수정을 가하는 방법을 추천해 드리겠습니다. 예? 이미 다 알고 있는거라고요? 아마 그러시겠죠. 폼 마법사가 없어서 처음부터 폼을 하나부터 열까지 다 만들어야 했다면, 액세스 작업 시간은 무한정으로 늘어났을 것입니다.

4 단계 : 폼의 올바른 작동을 위해 필요한 요소의 추가

폼에서 필요한 매크로나, 이벤트 프로시져 혹은 함수들을 폼에 추가하면 되겠습니다. 아직까지는 하나의 폼으로만 작업 한다는 사실을 잊지 마세요. 폼에서 사용자의 행동에 응답하기 위해서는 폼이나 그것의 컨트롤에 속한 이벤트 프로시져를 작성하면 됩니다.

작성일: 5/18/2023 페이지: 9/92

액세스 프로그래밍 강좌

5 단계 : 본격적인 폼과 보고서의 추가

첫번재 폼이 개발자가 원하는 바대로 데이터를 저장하고 보여주는 것을 확인한 후에 다른 폼과 보고서를 추가하세요. 다음 과정으로 건너 뛰지 마시고 한번에 한 폼이나 보고서씩, 그 개체의 구성요소가 잘 작동하는지 확신이 설 때까지 테스트를 해 보세요. 그리고, 다른 개체로 넘어가시는 겁니다.

6 단계 : 버튼, 하이퍼링크, 메뉴, 툴바를 이용한 개체들끼리의 상호 연결

사용자들이 응용프로그램을 쉽게 이용하게 하기 위해서 개발자는 응용프로그램 안에서 연결고리를 제공해야 합니다. 예를 들면, 주문표를 작성하는데 상품목록을 보거나 수정하기 위해서 메뉴를 새로 클릭해야 한다는 건 상당히 짜증나는 일이거든요. 주문표 폼에 상품목록 폼을 열어주는 버튼이나 하이퍼링크를 추가하면 멋지게 해결이 되겠지요. 상황에 따라서 명령 단추, 하이퍼링크, 사용자 정의 메뉴, 사용자 정의 도구 메뉴, 매크로, 비주얼 베이직 코드를 적절하게 응용프로그램에 추가하세요. 때때로 개발자들은 사용자로부터 프로그램 실행에 관한 옵션이나 정보를 얻기 위해서 대화상가 같은 팝업 폼을 만들고 싶을 때가 있을 겁니다. 물론, 가능하지요. 이 부분이 1 단계 다음으로 시간을 많이 소비해야 될 단계입니다.

7 단계 : 시작폼의 설계와 응용프로그램의 마지막 손질

자.. 여기까지 오셨으면, 상당히 완성도가 높은 응용프로그램을 만드셨을 것입니다. 응용프로그램을 실행시켰을 때 처음으로 나타날 시작 폼을 만들고, 타이틀 바에 표시될 캡션 같은 세세한 부분을 살펴보는 과정이 7 단계 입니다. 7 단계를 다 끝내셨다면, 대망의 응용프로그램 완성의 고지에 여러분은 도착한 것입니다!

액세스 데이터베이스 응용프로그램에서 폼의 주요 역할

액세스 응용프로그램에서 폼이 단순히 자료를 입력하고, 보여주는 역할만 갖고 있는 것은 아닙니다. 폼은 응용프로그램의 얼굴이 될 수 있습니다. 사용자에게는 폼이 곧 응용프로그램인 것입니다. 응용프로그램에 폼을 사용함으로써 개발자는 폼에서 발생하는 이벤트를 통해서 응용프로그램의 흐름을 제어할 수 있는 것입니다.

폼은 개발자가 개체들을 보다 밀접하게 연관시키기 위해서 매크로나 이벤트 프로시저를 사용했을 때 화면의 뒤에서 작용하는 역할을 제공합니다. 폼을 응용프로그램의 인터페이스로 사용하는 것 이외에도 개발자는 감춰진 폼에서 다른 폼으로 값을 저장하거나 보내는 기능을 사용할 수 있습니다. 예를 들어서 사용자에게 대화상자에서 날짜의 범위를

작성일: 5/18/2023 페이지: 10/92

액세스 프로그래밍 강좌

정할 수있게 하고, 그 날짜에 따라서 일련의 보고서를 출력하는 기능을 제공한다고 가정해 봅시다. 여기서 대화상자는 개발자가 만든 것입니다. 사용자가 대화상자의 <확인> 버튼을 클릭했을 때 개발자는 대화상자를 닫지 말고 숨겨야 합니다. 왜냐하면 대화상자를 닫고 보고서를 연다면, 사용자가 입력한 날짜는 사라져 버리기 때문입니다. 그래서 이때는 폼을 숨겨서 - 단순히 사용자가 폼이 닫혀진 것처럼 속이는 겁니다. 나중에 사용자 몰래 폼은 닫아야 되겠죠. - 사용자가 입력한 날짜를 보고서, 매크로, 비주얼 베이직 코드에서 참조해야 하는 것입니다. 무슨 말인지 잘 모르시겠다고요? 앞으로 천천히 배울 겁니다. 4) 시작폼 설계하기

자, 오늘은 응용프로그램의 시작폼을 설계하는 요령에 대해서 한 번 공부해 보겠습니다. 시작폼을 설계하는 방법을 설명하기 보다는, 시작폼의 성격과 종류들에 대해서 알아보겠습니다. 여러분께서는 여러분의 응용프로그램의 성격에 따라 시작폼의 성격을 결정해야 하는 것입니다.

응용프로그램에서 작업들을 체계있게 조직화하고, 사용자에게 보여주는 가장 효과적인 방법은 응용프로그램의 제어판인 시작폼을 사용하는 것입니다. 시작폼이란 말 그대로 응용프로그램이 처음 실행 되었을때 화면에 나타나는 폼으로써 사용자를 응용프로그램이 제공하는 모든 작업에 연결시켜주는 폼이 되겠습니다. 시작폼의 종류에는 다음의 3 가지가 있습니다.

1. 특정 작업을 위한 시작 폼

예를 들자면, 응용프로그램이 한가지의 작업만을 위한 것일 때는 그 작업을 위한 특별한 폼을 시작폼으로 설정하면 되겠습니다. Orders 샘플 응용프로그램은 그러한 응용프로그램의 좋은 예입니다. Orders 응용프로그램의 시작폼은 Orders 폼이 되는 것이죠. Orders 폼의 주요 기능은 그날 그날의 주문내역을 입력하는 것입니다. 판매자는 주요 작업 (주문표 입력)을 Orders 폼에서 끝마칠 수 있고, 다른 구성요소에의 접근도 이 폼에서 시작할 수가 있기 때문에 이것이 바로 이 응용프로그램의 시작폼이 되는 것입니다. Orders 응용프로그램을 실행시키면 자료 입력을 위한 Orders 폼이 자동으로 열립니다. 이 폼을 보려면 \Microsoft Office\Office\Samples 폴더의 Orders 응용프로그램을 실행시키세요. 이렇게 특정작업을 위한 시작폼은 비교적 간단한 응용프로그램에 적용하는 것이 좋겠습니다. Orders 응용프로그램은 주문표 입력이 가장 주가 되는 프로그램이므로, 이러한 형식의 시작폼을 적용하는 것이 가장 좋은 방법입니다.

2. 스위치보드형의 시작 폼

작성일: 5/18/2023 페이지: 11/92

액세스 프로그래밍 강좌

앞의 경우와는 반대로, 응용프로그램이 많은 폼과 보고서를 포함하고 있고, 응용프로그램을 실행시켰을 때 사용자가 어떤 폼이나 보고서를 실행시킬지 개발자가 예상을 할 수 없다면, 스위치보드형의 시작 폼을 사용하세요. 이러한 형태의 시작폼은 어떤 개체를 실행시키는데 명령 단추를 주로 사용합니다. 스위치보드 형태의 폼은 사용자가 자주 사용하는 폼과 보고서를 사용하기 쉽게 해 줍니다. 이 폼을 보려면 \Microsoft Office\Office\Samples 폴더의 Northwind 응용프로그램을 실행시키세요.

스위치보드형의 시작폼의 좋은 예는 데이터베이스 마법사가 만드는 스위치보드입니다. 데이터베이스 마법사가 만드는 스위치보드는 한 페이지당 선택할 수 있는 버튼이 8 개로 제한이 되어 있어서 응용프로그램이 복잡해지면 사용에 한계가 있습니다. 반면에, 사용자가 직접 만든 스위치보드는 제한이 없다는 장점은 있지만, 기능의 추가나 삭제시 상당히 어렵습니다. 물론, 데이터베이스 마법사가 만드는 스위치보드는 기능의 추가나 삭제가 아주 쉽지요. 두 가지 형태가 다 장단점이 있습니다. 그러므로, 여러분들이 판단해서 응용프로그램이 그리 복잡하지 않으면 데이터베이스 마법사가 만드는 스위치보드를 사용하시고, 응용프로그램이 복잡하다면 여러분이 직접 만든 시작폼을 사용하세요. 저같은 경우는 응용프로그램 개발 초기에는 데이터베이스 마법사가 만든 스위치보드를 사용하고, 개발이 거의 끝날 무렵에 시작폼을 다시 만듭니다. 처음부터 시작폼을 만들면, 프로그램 개발도중에 새로운 기능을 추가할 경우에 시작폼의 수정이 어렵거든요.

3. 목록상자 형의 시작 폼

Developer Solutions 응용프로그램에서 여러분은 또다른 형식의 시작 폼을 보실 수가 있습니다. Developer Solutions 응용프로그램에는 개발자를 위한 많은 팁들이 있습니다. 그리고, 이것의 시작 폼은 여러분이 원하는 주제를 찾아가기 쉽게 해 주는 도구의 역할을 합니다. 사용자는 Developer Solutions 응용프로그램 시작폼의 대 주제부터 시작해서, 소 주제를 선택함으로써, 응용프로그램의 기능을 이용할 수 있습니다. 이 폼을 보려면 \Microsoft Office\Office\Samples 폴더의 solutions 응용프로그램을 실행시키세요.이러한 형태의 시작폼은 스위치보드 형태의 시작폼에서 약간 변형된 것으로써, 응용프로그램이 커다란 몇 개의 기능으로 이루어져 있고, 그 큰 기능 안에 많은 세부기능이 있을때 적합한 시작폼 형태입니다. Developer Solutions 에서는 Category 라는 대주제를 선택하면, 그에따른 Examples 라는 소주제가 나오게 됩니다. 이러한 소주제를 스위치보드 형태의 시작폼에 그룹화해서 모두 다 집어넣는다는 것은 상당히 힘든 작업입니다. 너무 많거든요. 그래서, 응용프로그램의 기능이 아주 많을 때는 목록상자 형태의 시작폼을 사용하는 것이 좋을 것입니다.

작성일: 5/18/2023 페이지: 12/92

액세스 프로그래밍 강좌

4. 기타

지금까지 말씀드린 것은 수많은 시작폼의 형태중에 큰 분류만 나눈 것입니다. 여러분들이 새로운 것을 고안해 내실 수도 있는 것입니다. 저는 액세스 응용프로그램에서 탭컨트롤을 사용한 시작폼을 사용하고 있습니다. 대주제가 하나의 페이지가 되는 것이고, 하나의 페이지 안에는 많은 소주제가 있는 것이지요. 이렇게, 위의 방법을 사용하지 않더라도, 여러분 자신의 시작폼을 창조할 수도 있습니다. 가장 중요한 것은, 응용프로그램을 일반 사용자가 어떻게하면 가장 쉽게 사용할 수 있을 것인가에 촛점을 맞춘다는 것입니다.

Note: Orders 샘플 응용프로그램과, Developer Solutions 샘플 응용프로그램은 오피스 설치시 ' 전부설치 ' 옵션 을 사용하셔야 해당 폴더에 설치가 됩니다. 만약 Orders 샘플 응용프로그램과, Developer Solutions 샘플 응용프로그램이 \Microsoft Office\Office\Samples 폴더에 없다면, 오피스나 액세스를 '전부설치' 옵션으로 다시 설치하셔야 합니다.

5) 자신의 응용프로그램 개체로 연결하기 A

오늘은 표현식이나 비주얼 베이직 코드에서 각 데이터베이스 응용프로그램의 요소(개체)를 참조하는 방법에 대해서 공부해 보겠습니다.

단순히 응용프로그램 각각의 개체를 만들고, 실행시키는 것으로는 훌륭한 응용프로그램이 나오지 않습니다. 여러분은 응용프로그램의 개체를 유기적으로 엮어서 사용자가 어떤 특별한 작업을 완벽하게 마칠수 있게 설계된 상호 연동적인 체계를 만드는 연결점을 만들어야 합니다. 그 연결점은 폼이나 보고서에서 발생하는 이벤트에 응답하는 이벤트 프로시져나 매크로를 이용해 만들게 됩니다.

다음의 <그림>은 주문표를 입력하기 위한 특별한 작업에 맞게 최적화된 체계로 만드는 방법에 대한 예제입니다. <그림>에서 Orders 폼은 시작 폼입니다. 응용프로그램을 실행시키면, Orders 폼을 볼 수가 있습니다. 주문표를 작성하는 사람은 모든 작업을 이 하나의 폼에서 할 수가 있는 것입니다.

작성일: 5/18/2023 페이지: 13/92

액세스 프로그래밍 강좌

이 경우에는 비주얼베이직의 이벤트 프로시저가 정의되어 있으므로 비주얼베이직 코 드에 의해 Product 폼이 별개의 폼으로 열립니다.

대량의 레코드 수정은 비주얼 베이직 코드를 사용하지 마시고, 액션 질의를 사용하세요.

예를 들면, 사용되지 않는 고객에 관한 기록을 삭제하거나 다른 파일에 보관하기 위해서, 여러분들은 종종 대량의 레코드를 자동적으로 수정할 때가 있습니다. 여러분들이 액세스 프로그래밍 경험이 많다면, 이러한 작업들은 많은 코드를 필요로 한다는 것을 알고 있을 것입니다. 액세스 응용프로그램에서는 코드보다는 액션 질의를 통해 다량의 레코드를 쉽게 조작할 수 있습니다. 대부분의 경우에 '테이블작성 질의' (Make Table Query), '새로고침 질의' (Update Query), '추가 질의' (Append Query), '삭제 질의' (Delete Query) 같은 액션 질의는 자료를 변경하는 가장 효과적인 방법이 됩니다. 예를 들면 삭제 질의는 비주얼베이직 코드를 사용한 루프를 이용해서 자료를 삭제하는 것 보다 훨씬 쉽고 빠르게 다량의 자료를 삭제할 수 있습니다. 여러분들은 디자인 모드에서 이러한 질의를 눈으로 보면서 쉽게 정의하고, 데이터베이스 창에서 실행 할수 있습니다. 또한, SetWarning 과 OpenQuery 의 단지 두 개의 액션으로 구성된 매크로를 작성할 수 있습니다. 그 다음에 이

작성일: 5/18/2023 페이지: 14/92

여러분이 < 제품명세 > 명령 단추를 클릭하면 ...

... Button's Click 이벤트가 발생하고 , 액세스는 명령 단추의 OnClick 속성에 정의되어 있는 매크로나 이벤트 프로시져를 실행합니다

액세스 프로그래밍 강좌

매크로를 메뉴바나 도구상자에 등록시키거나, 폼에서 발생하는 특정 이벤트에 이것을 연결 시켜 놓으면 쉽게 이 질의를 실행 시킬수 있습니다.

개체와 그 값의 참조

여러분들은 이제 다른 개체를 열어서 응용프로그램 개체를 유기적으로 연결하는 방법과, 자료를 하나의 개체에서 다른 개체로 전달함으로써 응용프로그램 개체를 유기적으로 연결하는 방법에 대해서 배웠습니다. 예를 들자면, 사용자가 Orders 예제 응용프로그램의 'PrintInvoice' 명령단추를 클릭하면, Orders 폼의 현재 주문 내역이 'PrintInvoiceDialog' 폼에 표시가 되어야 할 것입니다.

어떻게 이렇게 하겠습니까? 지금까지는 그저 그렇게 하는 방법도 있다, 라는 것을 알았다면 이제는 어떻게 그렇게 하는지를 배워 봐야 겠죠. 정답은 매크로나 이벤트 프로시져를 사용해서 현재의 개체에서 다른 개체로 전달하고자 하는 그 값을 정의하는 겁니다. 보통, 폼의 컨트롤 값이 되겠죠. 보통의 데이터베이스 응용프로그램에서는 많은 폼들이 열려 있는 경우가 많으므로 여러분은 그 폼들을 구별하기 위해서 특별한 구문을 사용해야 합니다.

Tip: 여러분들이 응용프로그램의 테이블, 필드 그리고 다른 많은 개체를 만들고, 이름을 정해주면

그것을 잘 기억해 놓아야 합니다. 여러분들은 응용프로그램 어디에서든지 이 개체를 참조하기

위해서 그 이름을 사용할 것이기 때문입니다. 비록, 빈 공간을 포함한 상세한 이름이 축약형의

이름보다는 기억하기 쉬울지는 모르겠습니다만, 그러한 빈공간을 포함한 상세한 이름은 표현식이나

SQL 문, 비주얼 베이직 코드에서 사용하기가 상당히 번거롭습니다. 만약 여러분들이 이러한 고급

기능을 사용하는 데이터베이스 응용프로그램을 만들었다면 기억하기 쉽고, 빈 공간이 없는 축약형의

이름을 사용하시는 것이 프로그래밍 하는 것에 훨씬 도움이 됩니다. 그 이유는 더 공부하시면

아시게 됩니다.

개체나 개체의 값을 참조하기 위해서는 최상위의 개체나 컬렉션으로부터 시작해서 최하위의 개체로 순서대로 정의를 해 주어야 합니다. 컬렉션이란 폼들의 집합, 컨트롤의 집합 같은 동일한 속성을 가지는 개체의 집합입니다. 어려우시면, 그냥 '집합' 이라고 생각해 주시면 되겠습니다. 다음의 <그림>은 이러한 개체와 컬렉션에 대한 내용을 보여 줍니다.

작성일: 5/18/2023 페이지: 15/92

액세스 프로그래밍 강좌

폼 컬렉션

폼 컬렉션은 현재 Microsoft Access 데이터베이스에 열려진 폼만을 포함합니다.각각의 폼에는 여러분들이 설정할 수 있는 속성이 있습니다.

컨트롤 컬렉션

각각의 폼은 컨트롤의 컬렉션을 갖습니다.각각의 컨트롤 또한 여러분들이 설정할 수 있는 속성이 있습니다.

Controls 컬렉션에는 다른 컨트롤 내에 있거나 첨부되어 있는 폼, 보고서, 영역상의 모든 컨트롤이 포함되어 있습니다, Controls 컬렉션은 Form, Report, Section, Control 개체 요소입니다. 다음 그림은 Controls 컬렉션과 Form 개체 또는 Report 개체 사이의 관계를 보여줍니다.

컬렉션의 한 구성요소를 참조하기 위해서는 < ! 연산자 >를 사용하세요. 예를 들면 Orders 폼을 참조하기 위해서는 다음의 표현식을 사용하시면 됩니다.

Forms!Orders

각각의 폼은 컨트롤의 컬렉션을 가지고 있습니다. 예를 들면, Orders 폼의 OrderID 컨트롤을 참조하려면 다음의 표현식을 사용하세요.

Forms!Orders!OrderID

이렇게 함으로써 여러분들은 컨트롤의 값을 취하고, 설정하고, 다른 개체로 보낼 수 있는 겁니다.

작성일: 5/18/2023 페이지: 16/92

액세스 프로그래밍 강좌

이 경우에는 Forms!Orders!OrderID 의 값은 11105 가 됩니다.

속성을 참조하기 위해서는 속성 이름 앞에 < . 연산자 >를 사용하세요. 이 연산자를 속성,

방법, 액션, 컬렉션의 앞에 사용하시면 됩니다. 예를 들자면, Orders 폼의 Visible 속성을 참조하기 위해서는 다음의 표현식을 사용하시면 됩니다.

Forms!Orders.Visible

Orders 폼의 OrderID 컨트롤의 Visible 속성을 참조하기 위해서는 다음의 표현식을 사용하세요.

Forms!Orders!OrderID.Visible

Tip 개체나 속성을 참조 할 때, 그 이름이 잘 기억나지 않으면 표현식 작성기를 이용하세요. 표현식 작성기를

사용하면, 이름을 모르더라도 단순히 개체 목록에서 선택만 하면, 표현식 작성기가 자동적으로 상황에 맞는

연산자를 집어 넣어 줍니다. 여러분이 식을 입력하고자 하는 곳에서 마우스 오른쪽 클릭을 하시고, 단축

메뉴에서 <작성...> 을 선택하시면 표현식 작성기가 나타납니다.

작성일: 5/18/2023 페이지: 17/92

액세스 프로그래밍 강좌

6) 자신의 응용프로그램 개체로 연결하기 B

응용프로그램 탐색 기능 제공

응용프로그램의 여러 가지 개체(폼, 보고서 등)를 실행시키는 방법은 여러 가지가 있습니다. 가장 기본적인 방법은 데이터베이스 창에서 실행을 시키는 것이겠지만, 사용자에게 이것은 굉장히 어려운 일이기도 합니다. 그래서, 개발자는 시작폼을 만들기도 하고, 메뉴를 만들기도 하는 것입니다. 이렇게 사용자가 데이터베이스 응용프로그램의 여러 개체를 열고 닫는 행동을 '탐색'이라고 합니다. 응용프로그램 개발자로서의 여러분들은 사용자가 모든 기능을 쉽게 사용할 수 있는 응용프로그램을 개발해야 합니다. 그러기 위해서는 응용프로그램의 '탐색' 기능이 필수적입니다.

사용자가 응용프로그램을 탐색하게 하기 위한 방법은 여러 가지가 있습니다.

폼 안에서의 탐색

폼 안에서, 컨트롤과 컨트롤 사이의 탐색은 작업의 자연스러운 흐름에 따라 이루어져야 합니다. 폼에서 입력을 할 때, 한 컨트롤의 입력을 끝내면 보통 탭 키를 눌러서 다음 컨트롤로 이동을 하게 됩니다. 그런데, 처음에는 폼의 맨 처음 그 다음에는 폼의 맨 마지막으로 커서가 이동을 한다면 굉장히 불편한 일이 될 것입니다. 사용자가 한 번에 한 부분만을 집중할 수 있도록 논리적으로 컨트롤을 묶어야 합니다. '자동 탭(AutoTab)', '탭스톱(TabStop)', '탭색인(TabIndex)' 속성을 설정해서 사용자가 컨트롤 사이를 부드럽게 이동할 수 있도록 '경로'를 정의해야 합니다. 예를 들면, 자료를 필터하기 위한 컨트롤은 자료와 함께 위치하기보다는 폼의 머릿글이나 꼬리글에 위치하는 것이 좋습니다.

하나의 폼에서 다른 폼으로의 탐색

여러분의 응용프로그램에 하나의 폼에서 다른 폼으로 탐색하는 방법을 정의해 두어야 한다는 것은 말할 것도 없습니다. 예를 들어서, 여러분이 주문표를 작성하고 있다고 가정해 봅시다. 주문표에 들어가는 상품은 다른 테이블에 마련되어 있습니다. 주문표를 작성하다가 상품을 새로 추가해야 할 때는, 어떻게 하시겠습니까? 자. 이제부터 여기서 논의할 내용이 바로 이것입니다. 새로운 상품을 추가해야 될 때, 즉 주문표 폼을 닫지 않고, 상품 폼을 새롭게 열고 싶다면 어떻게 해야 될까요? 기존의 폼에서 새로운 폼으로의 탐색기능을 제공하기 전에 여러분들이 생각해야 할 것은, 그 방법에 있어서 다른 윈도우 기반의 응용프로그램의 방법들을 따라 하는 것이 좋다는 것과 여러분의 응용프로그램 전체에서 비슷한 방법을 지속적으로 제공해야 한다는 것입니다. 윈도우 기반의 방법을 따르지 않고, 여러분만의 특별한 방법을 사용했다면, 물론 그 방법이 아주 뛰어나다면 그렇지 않겠지만,

작성일: 5/18/2023 페이지: 18/92

액세스 프로그래밍 강좌

사용자는 또 다른 방법을 배워야 하는 것입니다. 번거로운 일이죠. 또, 주문표를 작성하다가 상품 폼을 열 때에는 명령 단추를 사용하고, 반면에 고객 폼을 열 때에는 하이퍼링크를 사용하는 등 방법이 일관적이지 않으면 사용자는 혼동을 하게 됩니다. 상품 폼을 열 때 명령단추를 사용했다면, 그 응용프로그램에서는 다른 폼을 열 때 항상 명령단추를 사용하게 해야 하는 것입니다. 그럼, 이 두 가지 사항을 잘 기억해 놓고, 다음의 여러 가지 방법들을 한 번 알아보도록 하겠습니다.

명령단추

명령단추는 현재 레코드를 저장하는 것과 같은 특별한 다른 작업을 시킬 때 아주 유용합니다. 물론, 다른 폼을 열게 하는 것에도 아주 그만이지요. 명령단추는 무엇보다도 눈에 잘 띈다는 것이 가장 큰 장점입니다. 폼을 열고, 닫고 하는 기본적인 작업을 위한 명령단추는 명령단추 마법사를 이용해 만들면 이벤트 프로시저까지 같이 만들어 주기 때문에 아주 편합니다. 만약 여러분들이 명령단추의 동작을 바꾸고 싶다면, 마법사가 만든 이벤트 프로시저를 수정하면 됩니다.

Orders 폼의 <제품명세> 명령단추는 선택된 Product 의 상세 항목을 보여주는 팝업 폼을 엽니다.

하이퍼링크

명령단추를 대체하는 아주 강력하고, 단순한 수단으로서 하이퍼링크를 추천합니다. 명령단추가 다른 개체를 탐색하는 것 외에도 다른 많은 작업을 수행할 수는 있지만, 이벤트 프로시저를 작성해야 한다는 번거로움이 있습니다. 단순히 다른 개체를 탐색하기 위해서는 하이퍼링크가 단연 으뜸입니다. 이벤트 프로시저를 작성하지 않아도 되기 때문이지요. 하이퍼링크를 설정하시려면, 컨트롤의 '하이퍼링크 주소(HyperlinkAddress)', '하이퍼링크 부주소(HyperlinkSubAddress)' 속성을 설정하시면 됩니다. 하이퍼링크는 '이름표', '이미지', '명령단추' 컨트롤에 설정을 할 수 있습니다. 일단 설정을 해 놓기만 하면, 사용자는 다른 개체로 탐색을 하기 위해서 이름표, 이미지, 명령단추 등을 클릭하면 되는 것입니다. 하이퍼링크를 사용하면, 데이터베이스 개체뿐만이 아니라 하드디스크, LAN, 인트라넷, 인터넷의 파일도 열 수가 있습니다. 단 한 줄의 프로그램도 없이 가능하죠.

사용자가 Northwind 데이터베이스의 'Products' 폼의 <제품목록 미리보기> 명령단추를 누르면, 그것에 연결된 하이퍼링크가 작동하고, <Alphabetical List of Products> 보고서가 열립니다.

작성일: 5/18/2023 페이지: 19/92

하이퍼링크 하위주소 : Report Alphabetical List of Products

액세스 프로그래밍 강좌

현재 데이터베이스에서 Access 개체를 가리키면 이동할 개체 이름만 지정할 수 있습니다. 특정 개체 형식을 지정하려면 개체 형식 개체 이름 을 입력합니다. 예를 들어, Orders 폼 대신 Orders 테이블을 참조하려면 하위 주소로 Table Orders 를 입력합니다.

Note: 하이퍼링크 하위주소HyperlinkSubAddress(하이퍼링크 하위 주소) 속성을 사용하여 HyperlinkAddress 속성으로 지정된 대상 문서 내의 위치를 지정하거나 결정할 수 있습니다. HyperlinkSubAddress(하이퍼링크 하위 주소) 속성은 Microsoft Access 데이터베이스 내의 개체, Microsoft Word 문서 내의 책갈피, Microsoft Excel 스프레드시트 내의 명명된 범위, Microsoft PowerPoint 프리젠테이션 내의 슬라이드, HTML 문서 내의 위치 등이 될 수 있습니다.

HyperlinkAddress HyperlinkSubAddress 설명

http://www.microsoft.com/

korea

웹에서 Microsoft 홈 페이지입니다.

C:\Program Files\Microsoft

Office\Office\Samples\

Cajun.htm

Access 예제 응용 프로그램

하위디렉토리의 Cajun Delights 쪽입니다

C:\Program Files\Microsoft

Office\Office\Samples\

Cajun.htm

NewProducts Cajun Delights 쪽의 "NewProducts"

이름표입니다

C:\Personal\MyResume.doc References Microsoft Word 문서 "MyResume.doc"의

책갈피 이름 "References"입니다.

C:\Finance\First Quarter.xls Sheet1!TotalSales Microsoft Excel 스프레드시트 "First

Quarter.xls"의 명명된 범위 "TotalSales"

입니다.

작성일: 5/18/2023 페이지: 20/92

액세스 프로그래밍 강좌

C:\Presentation\

NewPlans.ppt

10 Microsoft PowerPoint

문서"NewPlans.ppt"의 열번째 슬라이드

입니다..

메뉴바

여러분은 사용자 정의 메뉴와 명령을 메뉴바에 등록시킬 수가 있습니다. 메뉴바의 메뉴는 명령단추보다 공간을 덜 차지한다는 장점은 있지만, 역시 눈에 잘 띄지 않는다는 단점 또한 가지고 있습니다. 사용자는 메뉴를 보기 위해서 반드시 메뉴바를 클릭 해야 합니다. 여러분들은 메뉴바 외에도 마우스 오른쪽 버튼을 클릭하면 나타나는 단축메뉴에도 사용자 정의 메뉴와 명령을 등록시킬 수가 있습니다.

도구모음

다음 그림과 같이 여러분은 사용자 정의 도구모음을 추가할 수가 있습니다. 이것은, 폼 상의 공간도 차지하지 않고, 눈에도 잘 띄는 장점을 가지고 있지요.

키보드 할당

키의 조합을 정의해 놓고 그것을 매크로나 이벤트 프로시저에 연결해 놓으면, 특정한 작업을 키보드의 조합으로 할 수가 있습니다. 키 조합은 절대로 폼이나 보고서 상에 보이지 않지만, 이것을 매크로로 정의했다면, 특별한 작업을 여러분의 응용프로그램 전체에서 사용할 수 있다는 장점을 가지고 있습니다. 이벤트 프로시저로 정의를 했다면, 물론 해당하는 폼이나 보고서에서 사용할 수밖에 없겠죠. 또, 다른 도구들보다 빠르다는 장점이 있습니다. 예를 들자면, 윈도우 기반 응용프로그램에서 선택영역을 복사하기 위해서 '편집' 메뉴로 가서 '복사'를 선택하는 것과, 도구모음의 '복사'버튼을 클릭 하는 것, 단축메뉴의 '복사'를 클릭 하는 것 그리고 Ctrl-C 를 누르는 것 중에 어느 것이 가장 빠르겠습니까? 또, 복사를 여러 번 할 때, 어느 것이 가장 편할까요? 당연히 키보드의 조합입니다.

오늘 배운 내용은 상당히 중요한 내용입니다. 여러분들이 응용프로그램을 개발 할 때, 탐색의 용이성은 응용프로그램 전체의 기능을 좌우하는 요소 중의 하나입니다. 응용프로그램이 아무리 뛰어난 기능을 갖고 있다고 해도, 사용자가 그 기능을 사용하기가 어렵다면 그것은 좋은 응용프로그램이 아닙니다. 액세스 개발자로서 여러분들은 액세스의 전문가입니다. 물론, 데이터베이스의 특성도 잘 아시겠지요. 그러나 가장 어려운 것은, 액세스를 모르는 사람들이나 데이터베이스의 개념이 없는 사람들도 여러분의

작성일: 5/18/2023 페이지: 21/92

액세스 프로그래밍 강좌

응용프로그램을 잘 사용할 수 있게 응용프로그램을 개발하는 것입니다.

7) 시작 옵션 설정하기

응용프로그램을 위해 만든 시작 폼을 액세스 응용프로그램이 시작 될 때 처음으로 화면이 나타나게 하는 방법에 관한 것과, <시작 옵션>에 대한 것을 공부해 보겠습니다.

개발자는 응용프로그램이 시작되었을 때 초기 화면에 관한 다양한 옵션을 설정할 수 있습니다. 그러기 위해서는 < 도구 >-< 시작 ...> 메뉴를 사용하시면 됩니다. 이 메뉴를 이용해서, 응용 프로그램의 시작 폼을 설정할 수도 있고, 응용프로그램 시작 시에 사용자가 여러분이 만든 액세스 개체인 테이블, 질의, 매크로, 모듈 등을 볼 수 없게 하기 위해서 데이터베이스 창을 감출 수도 있고, 사용자 정의 메뉴 바를 보이게 할 수도 있습니다. 여러분은 또한 메뉴와 도구모음을 사용자가 변경하는 것을 방지할 수도 있고, 데이터베이스 창이나 디버그 창를 여는 데 쓰이는 특별한 키보드의 조합(F11, Alt+F1, Ctrl+G)을 사용 불능 상태로 만들 수도 있습니다.

여기서, 시작 폼을 보여주는 것 이외의 데이터베이스 창을 감춘다든지 디버그 창을 볼 수 없게 설정하는 이유는 무엇일까요?

첫 번째로 데이터의 보안 때문입니다. 이것은 주로 테이블에 해당하는 내용으로서 어떤 비밀스런 내용이 있을 경우에, 폼 상에서는 패스워드를 묻는다던가 하는 방법으로 감출 수 있기는 하지만, 만약 사용자가 직접 테이블의 자료를 검색하게 된다면 그러한 보안 절차는 사실상 무용지물이 됩니다. 데이터베이스 창을 감춘다는 것은 일단 사용자가 테이블로 접근하는 것을 방지하는 기초적인 방법이 될 수 있습니다.(완전한 방법은 아닙니다. 완전한 방법은 '사용자 수준 보안'을 이용하는 것입니다.)

두 번째로 여러분의 함수를 공개하기 싫을 때 이 방법을 사용합니다. 여러분이 오랜 시간동안 만든 함수나 기타 비주얼 베이직 코드를 공개하지 않고, 사용자에게 응용프로그램을 배포하고 싶다면 역시 이런 방법을 사용할 수 있습니다.(역시 완전한 방법은 아닙니다. 완전한 방법은 데이터베이스 파일을 MDE 파일로 변환하는 겁니다.)

세 번째로, 이것이 가장 중요한 이유인데요, 액세스를 모르는 사용자가 응용프로그램을 수정하여 사용불능 상태로 만드는 것을 방지하기 위한 것입니다. 예를 들어서, 액세스를 잘 모르는 사용자가 테이블의 이름이나, 테이블의 필드 명을 바꾸었다면, 혹은 어떤 중요한 테이블을 지웠다면, 그 응용프로그램은 어떤 부분에 있어서 혹은 응용프로그램의 전체 부분에 있어서 사용 불능의 상태로 빠지게 됩니다. 이렇게 개체의 일부분의 이름이 바뀐 데이터베이스를 원래대로 복구한다는 것은, 아주 힘든 일이 됩니다.(때로는 불가능한

작성일: 5/18/2023 페이지: 22/92

액세스 프로그래밍 강좌

일이기도 하지요.) 이것은, 액세스의 개체가 서로 유기적으로 연결되어 있기 때문인데요, 능숙한 액세스 사용자라도 다른 사람이 만들어 놓은 응용프로그램을 수정하기는 아주 어려운 일이랍니다. 이런 방법으로 여러분의 응용프로그램의 시작 옵션을 최적화해서 그야말로 사용하기 쉽고 편한 응용프로그램을 만드는 것입니다.

응용프로그램의 시작 옵션 설정하기

1. <도구> - <시작...> 메뉴를 선택합니다. 2. <폼 표시> 콤보 상자에서 시작폼을 선택하세요. 3. 다른 시작 옵션을 설정한 후 <확인> 버튼을 누르세요.

응용프로그램이 시작 될 때, 사용자가 쉬프트 키를 누르고 있으면, 여러분이 설정한 시작 옵션을 건너 뛰게 됩니다. 이같은 것을 방지하기 위해서는 비주얼 베이직에서 AllowBypassKey 속성을 False 로 설정하시면 됩니다. 다른 방법으로는 사용자 수준 보안을 설정해서, 허가받은 사람만이 데이터베이스의 수정을 가할 수 있게 하는 방법도 있습니다. 완벽한 다중 사용자 응용프로그램을 위해서는 사용자 수준 보안을 설정하는 것이 좋습니다.

응용프로그램의 시작 방법 설정하기

Northwind Traders 샘플 응용프로그램을 예로 들어 보겠습니다. Northwind 의 판매 관리자가 하루중 가장 먼저 하는 일은 그날의 주문표를 데이터베이스에 입력하는 것이라고 가정해 봅시다. Northwind 의 판매 관리자는 Orders 폼으로 Orders 응용프로그램을 시작하게 됩니다. 게다가 여러분들은 판매 관리자가 테이블, 질의, 매크로, 모듈 같은 것의 내부를 들여다보는 것을 원하지 않을 터이므로 데이터베이스 창을 감추는 옵션을 설정할 것입니다.

<도구> - <시작...> 메뉴를 선택하고, 다음의 그림과 같은 대화상자가 나오면, 거기서 시작 옵션을 설정하시면 됩니다.

작성일: 5/18/2023 페이지: 23/92

액세스 프로그래밍 강좌

응용프로그램 제목: 이곳에 입력한 글자는 응용프로그램의 제목표시줄에 나타납니다. 폼 표시: 응용프로그램 시작시 나타날 폼을 선택합니다. 메뉴 표시줄: 사용자 정의 메뉴 바를 표시합니다. 데이터베이스 창 표시: 데이터베이스 창을 숨기거나 보여줍니다.

응용프로그램 실행을 위한 '바로 가기' 만들기

액세스 응용프로그램을 실행시키기 위해서는 어떻게 할까요? 워드프로세서나 엑셀 같은 프로그램에서는 가장 초보적인 방법은 해당 프로그램을 먼저 실행시키고 그 프로그램에서 원하는 파일을 여는 과정을 거치는 것입니다. 이 방법은 예전 도스 기반 응용프로그램에서 주로 쓰던 방법이었습니다. 윈도우 환경에서 또다른 실행 방법은, 탐색기나, 바탕화면 등에서 해당 파일을 열면, 자동적으로 해당하는 프로그램이 구동이 되어서 원하는 파일을 열 수 있게 되는 방법이 있겠습니다.

그러면, 액세스 응용프로그램은 어떻게 열어야 될까요? 첫 번째 방법은 절대로 사용하지 마시기 바랍니다. 가장 많이 사용하는 방법은 역시 두 번째 방법입니다. 그렇지만, 액세스 응용프로그램의 특성상 앞으로 설명할 '바로 가기'를 만들어 놓으면, 각각의 응용프로그램의 특성에 맞는 최적화된 옵션으로 프로그램을 실행시킬 수 있는 겁니다. 그러면, 액세스 응용프로그램의 특성은 무엇일까요? 액세스 응용프로그램은 워드프로세서 파일이나 엑셀 파일과는 달리, 그 파일 자체가 이미 훌륭한 실행파일 입니다. 또, 사용자의 옵션도 데이터베이스 파일에 따라 달라질 수 있는 것입니다.(예를 들면, 시작 폼이 모든 데이터베이스 응용프로그램에서 같을 수는 없겠죠?) 여러분들이 액세스 응용프로그램을 엑셀 파일과 같은 데이터 파일로 보지 마시고, 하나의 실행파일로 보신다면 이해가 빠르실 겁니다. 그래서 각각의 응용프로그램에 맞는 설정으로 '바로 가기'를 만드는 것입니다. 응용프로그램을 쉽게 실행하기 위해서, 또 응용프로그램을 사용목적에 맞게 최적화 하여 사용하기 위해서, 여러분은 윈도우 '바로 가기'를 만들 수가 있습니다.

여러분이 '바로 가기'을 만들었을 때, 여러분은 액세스와 여러분의 응용프로그램을 위한 추가적인 시작 옵션을 설정할 수가 있습니다. 여러분은 이것을 윈도우 '바로 가기'의 '명령줄' 옵션을 설정함으로써 할 수가 있습니다. 예를 들면, 여러분은 응용프로그램을 다중 사용자 모드(Shared)가 아닌, 단일 사용자 모드(Exclusive)로 열기 위해서 /Excl 옵션을 사용할 수가 있습니다.

응용프로그램 실행을 위한 '바로 가기' 만들기

1. 마이크로 소프트 액세스가 설치된 폴더를 여세요. 2. 'MSAccess.exe' 라고 되어 있는 프로그램 아이콘을 마우스 오른쪽 버튼으로 클릭합니다.

작성일: 5/18/2023 페이지: 24/92

액세스 프로그래밍 강좌

그리고, <바로 가기> 를 선택합니다. 3. 여러분이 방금 만든 단축아이콘을 마우스 오른쪽 버튼으로 클릭하고, <등록정보>를

선택합니다. 그리고 <바로가기> 탭을 선택합니다. 4. <대상> 란에, 마이크로소프트 액세스 시작 명령의 오른쪽에 마우스를 클릭하고,

여러분의 응용프로그램의 경로와 파일 이름을 입력하시고, 만약 원하신다면 명령줄 시작 옵션을 입력하세요.

예를 들자면, 마이크로소프트 액세스를 실행하고, Orders 데이터베이스를 단일 사용자용 모드로 열게 하기 위해서는 다음의 명령줄 시작 옵션을 사용하시면 됩니다.

"C:\Program Files\Microsoft Office\Office\MSAccess.exe" "C:\Program Files\Microsoft Office\Office\Samples\Orders.mdb" /Excl

여러분이 '바로 가기'를 만든 후에, 이름을 적절하게 바꾸어서 바탕화면이나 특정 폴더에 복사하거나 시작 메뉴에 추가하여 사용할 수도 있습니다.

Tip 액세스가 실행되면 처음 나타나는 액세스 기본 화면(제품 번호와 사용자 이름 등이 나타납니다.) 외에

여러분의 응용프로그램에 맞는 화면을 보고 싶다면, 비트맵 이미지 파일(.bmp) 파일을 여러분의

응용프로그램과 같은 이름으로, 같은 폴더에 만드시면 됩니다.

예를 들어, 응용프로그램이 "C:\Program Files\Microsoft Office\Office\Samples\Orders.mdb"라는 이름으로 되어

있다면, "C:\Program Files\Microsoft Office\Office\Samples\Orders.bmp" 라는 파일을 만들면, 다음부터는 액세스

기본 시작 화면이 아니고, 여러분 고유의 시작 화면을 볼 수 있게 됩니다.

작성일: 5/18/2023 페이지: 25/92

액세스 프로그래밍 강좌

강좌 2. 비주얼 베이직 소개

오늘부터는 드디어 액세스의 또 다른 모습인 비주얼 베이직에 대해서 한 번 알아보겠습니다. 마이크로소프트 엑셀도 마찬가지이지만, 보통 처음에 엑셀이나 액세스의 기본기능을 보고도 사람들은 참 많이 놀랍니다. 그래서, 호기심을 갖고 공부를 시작하지요. 그렇게 공부를 하다가, 비주얼 베이직이란 놈을 한 번 접해보면 그때부터 헷갈리기 시작하는 것입니다. 뭐가 헷갈리냐고요? 엑셀에 비주얼 베이직이 붙어 있는지, 아니면 비주얼 베이직에 엑셀이 붙어 있는지가 무척 헷갈리기 때문입니다. 엑셀 및 액세스를 좀 안다고 하는 저로서도, 귀에 걸면 귀걸이 코에 걸면 코걸이 식으로, 액세스에 비주얼 베이직이 붙어 있는지 비주얼 베이직에 액세스가 붙어 있는 건지 참 헷갈립니다. 액세스로 할 수 있는 모든 사용자의 명령은, 비주얼 베이직으로도 가능합니다. 심지어 <도구>-<옵션> 메뉴의 옵션의 설정까지도 할 수 있으니 대단하지요. 바로 그래서, 액세스가 주프로그램인지, 비주얼 베이직이 주프로그램인지 말하기가 참 곤란하다는 겁니다. 실제로, 오피스에 포함된 비주얼 베이직은 마이크로소프트 비주얼 베이직 5.0 의 주요 기능을 포함하고 있습니다. 단, 실행파일은 만들 수 없지요. 자, 오늘은 그 막강한 비주얼 베이직 첫 번째 시간으로, 액세스에서 비주얼 베이직을 사용하는 이유와 그 개념에 대해서 한 번 살펴보겠습니다.

여러분들이 액세스의 기본 기능보다 더 강력한 것을 원한다면, 비주얼 베이직을 사용하는 것을 고려해 보세요. 비주얼 베이직으로 여러분들은 보다 사용하기 편한 응용프로그램을 만들 수 있습니다. 오늘의 강좌에서는 폼과 보고서에서 이벤트에 응답하는 비주얼 베이직 코드와 사용자 정의 함수를 만드는 것에 대해서 간단한 설명을 하겠습니다.

비주얼 베이직이란 무엇인가?

비주얼 베이직은 액세스를 위한 프로그래밍 언어입니다. 물론, 마이크로소프트의 비주얼 베이직과도 정확히 같은 프로그래밍 언어이지요. 이 이야기를 하자면, 한없이 길어집니다.. 단순히 말하면, 마이크로소프트에서 비주얼 베이직을 액세스에다가 얹어 놓은 겁니다. 이렇게 알아두시면, 이해가 빠르실 겁니다. 그래서, 액세스의 비주얼 베이직을 잘 다루시면, 마이크로소프트 비주얼 베이직도 잘 다루실 수가 있습니다. 또한, 엑셀의 비주얼 베이직이나, 워드 및 파워포인트에서 제공하는 비주얼 베이직도 잘 다루실 수가 있습니다. 사실은 이렇게 오피스에 제공되는 비주얼 베이직을 특별히 VBA(Visual Basic for Applications) : 응용프로그램용 비주얼 베이직) 이라고 부릅니다. 어때요, 하나만 알면, 이 많은 것이 따라 옵니다.

비주얼 베이직은 왜 쓸까요? 비주얼 베이직이 사용하기 쉬운 언어에 속하는 것은

작성일: 5/18/2023 페이지: 26/92

액세스 프로그래밍 강좌

사실입니다만, 일반 사용자들에게는 프로그래밍 언어라는 것 자체가 그리 쉬운 것은 아니죠. 매크로는 어떻습니까? 비주얼 베이직보다는 쉽죠? 매크로를 사용하는 이유와 비주얼 베이직을 사용하는 이유는 같습니다. 궁극적으로, 각 데이터베이스의 개체를 서로 유기적으로 묶어서 더 강력한 기능을 발휘하는 응용프로그램으로 만들기 위함입니다. 매크로와 비주얼 베이직의 차이는 매크로보다 비주얼 베이직이 사용하기는 더 어렵지만, 비주얼 베이직이 더 많은 기능과 높은 융통성을 발휘할 수 있게 해 준다는 점에 있겠습니다.

숙련 프로그래머를 위한 비주얼 베이직의 유사점

비주얼 베이직은 대부분의 유명한 구조적 프로그래밍 언어와 대단히 많이 닮은 최신의 프로그래밍 언어입니다. 여러분이 파스칼(Pascal) 이나 씨(C)의 프로그래머라면, 비주얼 베이직 구문에서 loop 구문, If ... Then ... Else 구문, Select Case 구문, 내장 함수, 기타 서브루틴 등과 같이 여러분들이 사용했던 프로그램 구조가 약간의 수정만으로 그대로 사용되고 있는 것을 발견하실 수 있을 겁니다. 기존 버전의 베이직과 마찬가지로, 비주얼 베이직은 영어를 말하는 것과 같은 방법으로 쉬운 프로그래밍 환경을 제공합니다.

매크로 대신 비주얼 베이직을 사용하는 시기

마이크로소프트 액세스에서, 여러분들은 매크로나 액세스 사용자 인터페이스를 사용하여 많은 작업들을 끝마치게 됩니다. 그렇다면, 언제 비주얼 베이직으로 방향 전환을 해야 할까요? 그것은, 여러분들이 액세스의 기본 기능 외에 어떤 기능을 추가로 원하는지에 따라 달라집니다.

비주얼 베이직을 사용하는 이유

1. 응용프로그램의 관리를 편하게 하기 위해서

만약 응용프로그램에 매크로만을 사용한다면, 매크로는 폼이나 보고서와는 별개의 개체이기 때문에, 하나의 응용프로그램에는 폼이나 보고서의 이벤트에 응답하는 도구로서의 대단히 많은 수의 매크로가 있을 수밖에 없게 됩니다. 이것은 응용프로그램의 유지 / 보수를 대단히 어렵게 합니다. 반대로, 여러분이 이벤트에 응답하는 도구로서 비주얼 베이직 코드를 사용한다면 그 코드는 폼이나 보고서와 같이 정의가 되어서, 때로는 여러분은 응용프로그램에 단 하나의 모듈(데이터베이스 창에서 볼 수 있는) 도 없이 유지할 수가 있는 것입니다. 또, 폼이나 보고서를 하나의 데이터베이스에서 다른 데이터베이스로 복사하거나, 이동하게 되면 그에 관련된 모든 코드들도 같이 이동하게 됩니다. 당연히 응용프로그램이 무척 관리하기가 쉽게 되겠지요.

2. 사용자 정의 함수를 만들 때

작성일: 5/18/2023 페이지: 27/92

액세스 프로그래밍 강좌

액세스에는 IPmt 라는 지급 이자를 계산하는 것과 같은 많은 내장 함수가 있습니다. 여러분은 복잡한 계산식이 필요 없이(이자 계산 같은 것은 엄청난 계산식을 필요로 합니다...) 어떤 계산을 수행하기 위해서 이러한 내장 함수를 사용 할 수 있습니다. 비주얼 베이직을 이용하면, 이러한 내장함수와 같은 사용자 정의 함수를 만들 수 있습니다. 물론, 그 사용도 내장 함수와 완전히 동일하게 사용할 수 있는 것이죠. 여러분이 여러분만의 내장함수를 만들 수 있다는 겁니다.

3. 에러 메시지 숨기기

응용프로그램에서 무언가 예상치 못한 문제가 발생해서 출력된 에러 메시지는 사용자에게 있어서 상당히 이해하기가 어려운 것입니다. 특히, 사용자가 액세스를 잘 모를 경우에는 상당히 곤혹스런 일이 될 수밖에 없습니다. 비주얼 베이직을 사용해서, 여러분은 에러가 발생했을 때 그 상황에 맞는 에러 메시지를 사용자에게 제공하거나, 응용프로그램이 그 상황에 맞는 다른 행동을 취하게 할 수가 있습니다. 이것을 에러 처리라고 하지요. 여러분이 상황에 따라 만든 에러 메시지는 기본적인 액세스 에러 메시지보다 사용자가 에러가 발생한 상황을 훨씬 더 잘 이해할 수 있게 합니다. 다양한 사람들이 사용하는 응용프로그램은 에러를 처리하기 위해서, 비주얼 베이직 코드를 반드시 삽입해야 합니다. 에러처리는 후에 자세히 다루기로 하겠습니다. 아주 중요한 부분이죠.

4. 개체의 생성과 조작

대부분의 경우에, 디자인 보기에서 개체를 만들거나 수정하는 것이 가장 쉽고도 효과적인 방법입니다. 그러나, 어떤 경우에는 개체의 여러 속성들을 비주얼 베이직 코드로 제어해야 할 때도 있을 것입니다. 비주얼 베이직을 이용하면 여러분들은 데이터베이스 안의 모든 개체를 마음대로 조작 할 수가 있습니다. 물론, 쉽지는 않지요. 여러분들이 쉽게 보는 콤보 상자 마법사, 폼 마법사 같은 것들은 이러한 개체를 생성하고, 조작하는 아주 좋은 예입니다. 예를 들자면, 폼 마법사는 사용자가 설정한 옵션에 따라서 폼을 만드는 함수들을 모아놓은 집합이라고 할 수 있겠습니다. 실제로, 폼 마법사는 비주얼 베이직으로 만들어 졌습니다. 폼 마법사의 원본 소스를 보시려면, 본 홈페이지의 "추천 사이트" 게시판에 가셔도 되고, 마이크로소프트 액세스 다운로드 페이지로 직접 가셔도 됩니다. 그곳에는 기타 다른 마법사의 소스 코드가 공개되어 있습니다. 여러분은 비주얼 베이직 코드를 이용해서 여러분만의 마법사를 만들 수도 있는 것입니다.

5. 운영체제 수준의 명령 실행

액세스 응용프로그램에서 매크로의 RunApp 액션을 이용해서 윈도우 기반의 다른 응용프로그램이나 도스 기반의 다른 응용프로그램을 실행시킬 수 있습니다. 그러나,

작성일: 5/18/2023 페이지: 28/92

액세스 프로그래밍 강좌

매크로에서는 많은 제한이 있습니다. 비주얼 베이직을 사용하면 파일이 하드디스크 상에 존재하는 지의 여부 같은 것도 조사할 수가 있고, 자동화 개체(Automation), DDE(Dynamic Data Exchange : 동적 자료 교환) 같은 것을 이용해서 마이크로소프트 액셀과 같은 다른 윈도우 기반의 응용프로그램과 데이터를 공유할 수도 있습니다. 또한, DLL(Dynamic Link Library : 동적 링크 라이브러리)를 연결하여, 그것과 관련된 기능을 사용할 수도 있습니다. 그 확장성이 어마어마하지요?

6. 다량의 레코드 동시에 제어하기

매크로를 사용하면, 전체 레코드만을 동시에 조작 할 수가 있지만, 비주얼 베이직을 이용하면, 전체 레코드뿐만이 아니고, 각각의 레코드를 동시에 조작 할 수가 있습니다.

7. 코드로 인수 보내기

인수(Argument)란 어떤 액션(Action)에 필요한 추가 정보를 제공하는 값입니다. 설명이 어려운가요? 다음을 계속 보시면 아실 겁니다. 매크로를 만들 때, 여러분들은 매크로 창의 아랫부분에 매크로 액션을 위한 인수를 설정하게 됩니다. 그러나, 여러분들은 이 인수를 자동으로 바꿀 수가 없습니다. 예를 들어, 어떤 테이블을 텍스트 파일로 출력하는 매크로를 만들었다면, 그 매크로는 항상 같은 테이블을 같은 파일로 출력하게 됩니다. 그런데, 만약 오늘 출력한 파일은 Data19990605.txt, 내일 출력할 파일은 Data19990607.txt 와 같이 날짜를 변경하고 싶다면, 매크로를 매일 수정해야 합니다. 매우 귀찮은 작업이 되겠지요. 그러나, 비주얼 베이직에서는 코드가 실행 될 때(이것을 보고 실행 시간(Run-time)이라고 합니다.) 인수를 전달할 수가 있습니다. 위와 같은 예에서는, 파일 이름이 코드에서 전달할 인수가 되겠습니다. 이렇게 사용하는 것을 변수를 인수로 사용한다 라고 합니다. 대부분 매크로에서는 이러한 작업이 불가능하고, 비주얼 베이직에서만 가능하지요. 이러한 점은 여러분들에게 무한한 응용력을 가져다줍니다. 예를 들어, 비주얼 베이직을 이용하면 위의 예에서 사용자로부터 파일 이름을 제공받아서 그 파일로 출력을 하는 것도 가능합니다.

TIP 혹시 여러분들이 응용프로그램에서 이미 매크로와 비주얼 베이직을 같이 사용하고 있을 지도

모르겠습니다. 그러나, 일단 응용프로그램에서 프로그램을 사용하게 된다면, 비주얼 베이직만을 사용하는

것이 훨씬 더 도움이 된다는 사실을 곧 알게 되실 겁니다. 여러분들이 응용프로그램에 매크로를 사용하고

있다면, 액세스의 도구를 이용해서 매크로를 비주얼 베이직 코드로 변환하실 수가 있습니다. 매크로로 할 수

있는 모든 일은 비주얼 베이직으로 할 수 있습니다. 저 같은 경우도 매크로는 전혀 쓰지 않고 있습니다.

매크로는 사실 불편한 점도 많이 있습니다. 매크로의 유일한 장점은 사용하기가 쉽다는 것입니다. 그렇지만,

처음 시작하실 때부터 비주얼 베이직을 사용하시는 것이 더 좋습니다.

작성일: 5/18/2023 페이지: 29/92

액세스 프로그래밍 강좌

매크로를 비주얼 베이직 코드로 변환하기 위해서는 폼이나 보고서의 디자인 보기에서 <도구> - <매크로> - <매크로 비주얼베이직으로 변환> 메뉴를 사용하세요. 특정한 폼이나 보고서에서 사용되는 것이 아닌, 응용프로그램 전체에서 사용되는 매크로라면 <파일> - <저장 / 내보내기> 명령을 사용해서 모듈로 저장하시면 됩니다.

이벤트 중심 응용프로그램의 작동

이벤트라고 하는 것은 폼, 보고서 또는 컨트롤에서 사용자나 코드에 의해 발생되는 액션입니다. 예를 들면, 사용자가 어떤 폼을 열면 , Open 이벤트가 발생합니다 . 사용자가 액세스 상에서 어떤 조작을 하게 되면, 그에 맞는 어떤 액션이 발생하고, 그것에 따라 미리 정의된 이벤트가 각각의 액세스 개체에서 발생하게 됩니다. 이렇게 발생한 폼이나 보고서, 컨트롤의 이벤트에 응답하기 위해서는 그 해당하는 이벤트에 대한 이벤트 프로시저를 작성하면 됩니다. 위의 예에서는 Form_Open(Cancel as Integer) 라는 이벤트 프로시저를 작성해야 합니다 .

이벤트 프로시저의 실행 과정

1. 사용자가 응용프로그램을 실행시키면, 액세스는 자동적으로 시작 옵션 대화상자에서 설정된 시작 폼을 엽니다.

2. 시작 폼이나, 시작 폼의 컨트롤에서는 이벤트가 발생합니다. 이벤트는 사용자가 발생시킬 수도 있고(예를 들자면, 폼을 여는 명령 단추를 클릭), 코드에 의해서 발생할 수도 있습니다.

3. 만약, 적절한 이벤트에 응답하는 이벤트 프로시저가 있으면, 그것을 실행시킵니다.

4. 응용프로그램은 다음 이벤트가 발생할 때까지 대기 상태가 됩니다.

Note : 몇몇 이벤트는 다른 이벤트를 동반합니다. 예를 들면, MouseDown 이벤트가 발생하면, Click 과 MoustUp 이벤트가 뒤따릅니다. 폼의 경우에는 Open 이벤트 다음에는 Load 이벤트가 뒤따르고요.

이벤트 중심 프로그래밍과 전통적인 프로그래밍 방식의 차이점

전통적인 프로그램에서는 이벤트보다는 응용프로그램 자체가 코드의 실행 영역을

작성일: 5/18/2023 페이지: 30/92

액세스 프로그래밍 강좌

제어합니다. 전통적인 프로그래밍 방식은 프로그램의 첫 줄부터 시작되고, 응용프로그램은 정의된 길을 따라서, 필요할 때는 다른 프로시저를 호출하면서 실행이 됩니다. 이벤트 중심 응용프로그램에서는 사용자의 액션이나 시스템에서 발생하는 액션에 따라 이벤트가 발생됩니다. 그러므로, 응용프로그램이 실행되는 순서는 어느 이벤트가 먼저 일어나느냐에 따라 달라집니다. 그리고, 그 이벤트의 발생 순서는 당연히 사용자의 조작에 의해서 결정이 되는 것이지요. 이것은 그래픽 사용자 인터페이스와 이벤트 중심 프로그래밍 방식의 아주 중요한 요소가 되는 것입니다. 사용자의 요구(조작)에 따라 적절한 코드가 실행됩니다. 이벤트 중심의 프로그래밍은 그 융통성에 있어서 아주 많은 경우의 수를 가능하게 해 주고, 개발자가 프로그램 개발에 드는 시간을 단축시켜 줍니다.

여러분은 사용자가 무슨 일을 먼저 할지 예측할 수가 없기 때문에, 코드를 응용프로그램의 상황에 맞게 몇 가지의 전제를 세우고 작성해야 합니다. 코드를 실행하기 전에 그 전제가 올바른지 시험해보거나, 전제가 항상 올바르게 되도록 응용프로그램의 구조를 제작하는 것은 아주 중요한 일입니다. 예를 들자면, 어떤 문자열 상자가 있고, 그 상자에 값을 입력하고 명령단추를 클릭 하면 그 값이 화면에 출력이 되는 프로시저를 만든다고 가정해 봅시다. 그 문자열 상자에 아무런 값도 없다면 화면에 출력할 값이 없겠지요. 이 때의 프로그래머의 전제는 '사용자가 문자열 상자에 값을 입력했다' 라는 것이 되겠습니다. 그러면 어떻게 해야 이 전제를 항상 옳게 만들 수 있을까요? 정답은 명령단추를 평상시에는 누르지 못하게 하다가, 문자열 상자에 값이 입력이 되면, 그 후로 명령단추를 사용 가능하게 하면 되지 않을까요? 그렇게 되면, '사용자가 문자열 상자에 값을 입력했다.'라는 전제는 항상 옳게 되는 것입니다. 그렇게 하려면, 그 명령단추의 Enabled 속성을 평시에는 False 로 놓고, 문자열 상자에 값이 채워질 경우에만 Enabled 속성을 True 로 바꾸어 주는 코드를 문자열 상자의 Change 이벤트에 삽입하면 잘 작동이 될 것입니다.

1) 이벤트 프로시저 만들기

오늘은 비주얼 베이직으로 이벤트 프로시저를 한 번 만들어 볼까 합니다. 비주얼 베이직 코드는 프로시저라는 단위로 작성을 하게 됩니다. 즉, 비주얼 베이직 코드는 하나 하나 뜯어 보면, 프로시저라는 각각의 단위로 나뉜다는 말씀입니다. 지구라는 커다란 하나의 개체에는 한국, 미국, 요즘 시끄러운 북한 등등 많은 나라들로 구성되어 있습니다. 비주얼 베이직 코드라는 커다란 개체도 역시 프로시저 1, 프로시저 2 같은 프로시저로 이루어져 있습니다. 또, 하나의 프로시저는 어떤 작업을 수행하거나, 어떤 값을 계산하는 일련의 비주얼 베이직 문의 집합으로 구성됩니다.

프로시저는 그 실행 방법에 의해 크게 두 가지로 나뉘어 질 수 있습니다. 이벤트 프로시저와 일반 프로시저가 바로 그것입니다. 이벤트 프로시저는 이벤트에 응답하여 실행되는 프로시저를 말합니다. 즉, 이벤트 프로시저는 일반적으로 그 해당하는 이벤트가 일어나지

작성일: 5/18/2023 페이지: 31/92

액세스 프로그래밍 강좌

않으면 실행이 되지 않는다고 생각하시면 되겠습니다. (사실은 그렇지도 않습니다만.) 일반 프로시저는 이벤트와는 관련이 없는, 전통적인 프로그래밍 방법에 의한 프로시저와 완전히 동일한 개념입니다.

아이구, 시작부터 비주얼 베이직 코드, 프로시저, 일반 프로시저, 이벤트 프로시저 등등 어려운 말만 많이 나온다고요? 처음부터 어떻게 다 알 수 있겠습니까? 그저, 그런 것도 있나보다 하고 다음으로 넘어가 봅시다.

자, 그럼 지금부터는 폼의 명령 단추와 문자열 상자를 작동시키는 이벤트 프로시저를 만드는 방법에 대하여 배워 봅시다. 다음의 그림을 참조하세요.

<명령 단추를 눌렀을 때의 작용>

Note : 이 예는 디자인 보기에서 도구모음의 컨트롤 마법사(명령 단추 마법사, 입력란 마법사 등 컨트롤을 만들 때 쓰이는 마법사)를 선택하지 않았다고 전제합니다. 컨트롤 마법사의

작동을 원하지 않으시면 도구모음의 컨트롤 마법사 버튼 을 눌려져 있지 않게 하시면

됩니다.

이벤트 프로시저를 만들기 위해서는 우선 폼을 만들고, 그 폼에 이벤트에 응답할 컨트롤을 추가해야 합니다. 이 예제에서는 테이블이나 질의에 기초하지 않는 폼을 하나 만들고, 문자열 상자와 명령 단추를 추가하도록 하겠습니다. 비주얼 베이직에서는 이렇게 추가한 명령 단추와 문자열 상자를 어떻게 불러 쓸수 있을까요? 이름이 있어야 불러 쓰겠죠? 그렇습니다. 비주얼 베이직 코드에서는 컨트롤의 이름으로 참조를 하기 때문에, 각각의 이름

작성일: 5/18/2023 페이지: 32/92

액세스 프로그래밍 강좌

(Name)속성을 마이크로소프트 액세스가 작성하는 기본적인 이름이 아닌, 그 컨트롤의 특성을 더 잘 반영하는 구체적인 이름으로 설정하는 것이 중요합니다. 예를 들자면, 액세스는 문자열 상자의 이름을 Text0 와 같은 형식으로, 명령 단추는 Command1 과 같은 형식으로 설정합니다. 그렇지만, 각 컨트롤의 기능과 특성을 보다 더 명확히 하기 위해서 문자열 상자는 '메세지'로 명령단추는 'cmd확인' 같은 보다 더 구체적인 이름을 설정하는 것이 좋습니다.

Note : 액세스의 컨트롤이나 비주얼 베이직의 변수의 이름을 짓는 규칙이 있습니다. 이 규칙의 목적은 물론, 액세스 응용프로그램을 개발함에 있어서 이름을 짓는 규칙을 사용함으로써 간단 명료하지만 구체적인 개체 이름을 사용하여, 비주얼 베이직 코드나 표현식에서 사용을 쉽게 하자는 데에 있습니다.

< 개체 이름 짓기 >

Tip : 테이블, 필드 및 기타 액세스 응용프로그램의 다른 개체의 이름을 지으면, 액세스는 개체를 이름으로

참조하기 때문에, 그 이름을 잘 기억해 놓아야 합니다. 비록 공백을 포함한 개체의 이름이 축약된 이름보다

훨씬 이해하기는 쉽지만 그것은 표현식, SQL 문, 비주얼 베이직 코드 등을 작성하기가 매우 불편할 때가 많이

있습니다. 짧고, 공백이 없으면서 형태를 기억하기 쉬운 이름을 사용하는 것을 고려하시기 바랍니다.

폼과 컨트롤을 만들고, 컨트롤의 속성을 적절하게 설정했다면, 이제는 모듈 창에 여러분의 첫 번째 이벤트 프로시저를 쓸 차례입니다.

'확인' 명령단추를 위한 이벤트 프로시저 작성하기

1. 디자인보기에서, 이벤트 프로시저를 작성하고 싶은 개체(폼, 보고서, 컨트롤, 섹션 등)를 마우스 오른쪽 클릭하고, 단축메뉴에서 '이벤트 작성'을 클릭합니다. (이 경우에는 '확인' 명령단추입니다.)

2. '작성기 선택' 대화상자가 나옵니다.

작성일: 5/18/2023 페이지: 33/92

액세스 프로그래밍 강좌

3. 대화상자에서 '코드 작성기'를 선택하세요.

모듈 창이 열리고, 선택한 개체에 따라 기본 이벤트 프로시저가 작성됩니다.(이 경우에는 Click 이벤트 프로시저가 작성됩니다.) '확인' 명령단추의 기본 이벤트 프로시저는 다음의 그림에서 볼 수 있습니다.

< '확인' 버튼의 기본 이벤트 프로시저 >

4. Sub 와 End Sub 문 사이에 이벤트 프로시저 코드를 작성합니다. '확인' 명령단추의 이벤트 프로시저로는 다음의 코드를 삽입하세요. 이 코드는 '메세지' 문자열 상자에 "첫번째 이벤트 프로시저 만들기" 라는 문자열을 표시합니다. 메세지 = "첫번째 이벤트 프로시저 만들기"

5. 모듈을 저장하고 모듈 창을 닫습니다.모듈을 저장하고, 닫으면 액세스는 다음 그림과 같이 명령단추의 OnClick 이벤트 속성을 [이벤트 프로시저]로 설정합니다.

< 이벤트 속성 보기 >

자.. 이제 이벤트 프로시저를 만들었으니, 실행해 봐야 할 차례이죠? 이벤트 프로시저를 실행하기 위해서는 다음의 과정을 따르시면 됩니다.

'확인_Click' 이벤트 프로시저 실행하기

1. 폼 보기 버튼을 눌러서 디자인 보기상태의 폼을 폼보기 상태로 전환하세요.

작성일: 5/18/2023 페이지: 34/92

액세스 프로그래밍 강좌

2. '확인'을 클릭하세요. 이벤트 프로시저가 실행되어 문자열 상자에 "첫번째 이벤트 프로시저 만들기" 라는 문자열이 표시됩니다.

폼, 보고서 모듈로 작업

이전의 "첫번째 이벤트 프로시저 만들기" 예제에서는 각 개체의 단축메뉴에서 <이벤트 작성> 명령을 사용하여 이벤트 프로시저를 만드는 법을 배웠습니다. 이 방법 이외에도, 액세스는 폼이나 보고서의 모듈 창을 열고 편집하는 많은 다른 방법을 제공합니다.

폼(보고서)과 그 모듈을 동시에 열기

데이터베이스 창에서 폼(보고서)을 선택하고, 도구모음의 <코드> 버튼을 누릅니다. 폼

(보고서)과 그에 속하는 모듈이 동시에 열릴 것입니다. 마찬가지로 폼(보고서)의 디자인보기에서도 <코드> 버튼을 누르면 그에 해당하는 모듈을 볼 수 있습니다.

이벤트 프로시저 열거나 만들기

1. 디자인 보기로 폼(보고서)을 여세요.2. 폼, 보고서, 섹션, 컨트롤에서 마우스 오른쪽 버튼을 클릭하여 나타난 단축메뉴에서 '

속성'을 클릭하여 속성창을 여세요.3. 속성 창에서 '이벤트' 탭을 클릭하세요.4. 만들고 싶은 이벤트를 선택하세요.5. 속성창의 해당속성 오른편에 있는 <만들기> 버튼을 클릭하세요. 만약, 이벤트 속

성에 관련된 이벤트 프로시저가 존재한다면 해당 이벤트 프로시저가 나타날 것이고, 이벤트 속성이 설정되어 있지 않다면, <작성기 선택> 대화상자가 나타납니다. 이 대화상자에서 <코드 작성기>를 선택합니다. 그러면, 모듈창이 열리고 이벤트 프로시저가 만들어집니다.

2) 사용자정의 함수 만들기

오늘은 비주얼 베이직으로 사용자 정의 함수를 한 번 만들어 볼까 합니다. 이벤트에 응답하여 Visual Basic 코드를 실행할 때 이벤트프로시저를 이용하는 것이 바람직하지만, 사용자 정의함수를 실행할 수도 있습니다. Function 프로시저(간단히 함수라고도 함)는 산술 연산 결과 등의 값을 되돌리는 프로시저입니다. Visual Basic 에는 현재 시간과 날짜를 출력하는 Now 함수를 비롯, 내장 함수가 많이 있지만 그 외에 사용자 정의 함수 를 만들 수도 있습니다.

함수 사용 범위

작성일: 5/18/2023 페이지: 35/92

액세스 프로그래밍 강좌

함수는 값을 되돌리므로 식에서 주로 사용합니다. 함수를 사용하는 범위는 Visual Basic 문이나 메서드, 속성 설정, 필터나 질의에서 조건식에 이르기까지 다양합니다.

사용자 정의 함수 작성

1. 데이터베이스 창의 [모듈] 탭을 열고, [새로 만들기]를 누릅니다.2. 'Function' 문장을 입력하여 함수를 선언합니다.3. 함수 이름을 입력하고, 괄호를 입력하고 엔터키를 누릅니다.

Function 프로시저는 호출 프로시저에 의해 전달될 상수, 변수, 식과 같은 인수를 가질 수 있습니다. 만일 Function 프로시저가 인수를 갖지 않는다면 Function 문은 공백을 갖는 괄호가 있어야 합니다. 다음 선언문은 IsLoaded 함수에 strFormName 인수를 지정한 것입니다.

Function IsLoaded( strFormName As String )

4. 함수의 해당 명령이나 계산을 하는 VBA 코드를 추가합니다. 함수는 프로시저의 한 개 이상의 문에서 함수 이름에 값을 할당함으로써 반환될 값을 전달합니다.

FirstOfNextMonth = DateSerial(Year(Now), Month(Now) + 1, 1)

이 사용자 정의 함수는 식의 값(등호[=]의 오른쪽 부분)을 함수 이름 FirstOfNextMonth(등호 왼쪽 부분)에 할당하는 하나의 할당문으로 구성되는데 내장된 DateSerial, Year, Now, Month 등의 Visual Basic 함수를 사용하여 결과를 계산합니다.

5. 함수가 만들어지면 Microsoft Access 의 식에서 사용할 수 있습니다. 예를 들어, 속성 시트에서 입력란 컨트롤의 기본 값 속성을 다음 식으로 설정하면 '입력란'에 기본 값으로 다음 달의 첫째날이 표시됩니다.

=FirstOfNextMonth()

Tip: 새로운 표준 모듈을 열려면 데이터베이스 창의 [모듈] 탭을 열고, [새로 만들기]를 누릅니다. 기존 표준

모듈을 열려면 [모듈] 탭을 누르고, 열고자 하는 모듈을 선택한 후 [디자인]을 누릅니다. 폼 모듈, 보고서 모듈을

작성일: 5/18/2023 페이지: 36/92

액세스 프로그래밍 강좌

열려면 폼이나 보고서를 디자인 보기로 열고 도구 모음에서 [코드] 를 누릅니다. 폼이나 보고서와 관련없는

클래스 모듈을 열려면, 데이터베이스 창에 있는 [삽입] 메뉴에서 [클래스 모듈]을 누릅니다. 기존 클래스 모듈을

열려면 데이터베이스 창에 있는 [모듈] 탭을 누르고, 열고자 하는 모듈을 고른 뒤 [디자인]을 누릅니다.

Note: 이 함수를 속성 설정으로 사용하려면, 함수가 폼이나 보고서의 모듈, 또는 표준 모듈에 있어야 합니다. 함수가 폼이나 보고서 속성 설정된 폼이나 보고서와 관련이 없으면 클래스 모듈에 있는 함수는 사용할 수 없습니다.

작성일: 5/18/2023 페이지: 37/92

액세스 프로그래밍 강좌

강좌 3. 폼의 사용

대부분의 액세스에 관련된 교재에서 제공하는 샘플프로그램이나 인터넷또는 PC통신에 올라와있는 프로그램들을 보면 대다수의 기능이 폼에 집중되어있는 것을 볼 수 있습니다. 사용자의 관점에서, 여러분의 애플리케이션은 단지 폼의 집합이라고 할 수 있습니다. 이 강좌에서는 프로그램 작성과정에서 볼 수 있는 여러가지 형태의 폼의 예로 설명과 실습을 하면서 진행하겠습니다.

1) 마법사를 사용하여 폼 작성1. 데이터베이스창에서 폼을 선택하고 '새로만들기' 버튼을 누릅니다.2. 폼 마법사 또는 자동폼을 선택한후, 콤보박스에서 테이블 또는 질의를 선택합니다. 3. 마법사의 질문에 답을 하면서 , 폼이름을 입력한후 '완료' 버튼을 누릅니다.

Note: '디자인보기'를 제외하고 '자동폼' 과 '마법사'는 폼의 데이터원본으로 사용할 테이블이나 질의만 선택하는등의 마우스 몇번의 클릭으로 폼디자인을 끝냅니다. 물론, '폼' 탭에 있는 작성된 폼을 선택한 후 '디자인’버튼을 사용하여 사용자가 디자인을 수정할 수 있으며, 자동폼과 마법사를 사용한후 수정하는 방법으로 프로그램작성 시간을 상당히 줄일수있습니다.

실습) '자동폼: 탭 형식' 을 사용하여 '개인관계'폼 과 '일정관리하위폼'을 작성합니다.

작성일: 5/18/2023 페이지: 38/92

액세스 프로그래밍 강좌

2) 디자인보기를 사용한 폼 작성1. 데이터베이스창에서 폼을 선택하고 '새로만들기' 버튼을 누릅니다.2. '디자인보기'를 선택한후, 테이블또는 질의를 선택한 후 '확인'버튼을 누릅니다.3. '도구상자'의 컨트롤과 '폼' 속성창의 속성값을 설정함으로써 폼을 작성합니다.

실습) 폼 새로만들기의 '디자인보기'를 사용하여 ' START'폼 작성합니다.ㅇ 폼의 바탕그림을 PD_바탕. Bmp 로 설정하고, 이미지 컨트롤을 추가할 때 그림은 Menu.bmp 로 설정하여 5 개 만듭니다.

작성일: 5/18/2023 페이지: 39/92

액세스 프로그래밍 강좌

ㅇ 이미지 컨트롤 옆에 각각 이름표를 입력합니다.Note: 속성창의 '그림'속성의 값은 '그림파일의 위치와 파일명' 이며, '그림유형' 속성의 값은

그림파일을 데이터베이스화일에 포함시킬경우 '포함' , 연결할 경우 '연결' 을 선택하며, 연결선택시

그림화일이 별도로 데이터베이스와 함께 필요합니다.

ㅇ 'IMAGE19_Click' 이벤트 프로시저를 작성합니다.

아래의 Private Sub 와 End Sub 사이 내용을 입력합니다.

Private Sub Image19_Click()

DoCmd.OpenForm "개인관리"End Sub

Note : 속성

디자인보기에서 속성을 입력할 개체(폼, 보고서, 컨트롤 등)를 마우스 오른쪽 클릭하고,

작성일: 5/18/2023 페이지: 40/92

폼 속성그림 : PD_ 바탕 .BMP그림유형 = 포함표제 = Power Diary

이미지 컨트롤이름 = Image19 ( ~ Image23 까지 5 개의 컨트롤 작성 )그림 = Menu.bmp그림유형 = 포함

Image19 이미지 컨트롤을 마우스 오른쪽 클릭하고 , 단 축메뉴에 서 ' 이 벤 튼 작 성 ' 을 클릭한후 '작 성 기 대 화 상 자 ' 가 나오면 , ' 코 드 작 성 기 ' 를 선택합니다……

액세스 프로그래밍 강좌

단축메뉴에서 '속성'을 클릭하면 속성창이 화면에 나타납니다. 아래는 속성창의 각위치가 말하는 내용으로 개체마다 보여주는 속성변수 List 와 입력가능한 속성값은 다릅니다.

3) 폼과 하위폼의 연결 방법

하위폼은 폼안의 폼을 말하며, 도구상자에 있는 '하위폼' 아이콘을 사용합니다.

실습) 위에서 작성한 '일정관리하위폼'을 하위폼으로 하는 '일정관리' 폼을 작성합니다.

1. 데이터베이스창에서 폼을 선택하고 '새로만들기' 버튼을 누릅니다.2. '디자인보기'를 선택합니다.

3. 도구상자에서 입력란 아이콘을 선택하여 폼에 추가합니다.

4. 도구상자에서 하위폼 아이콘을 선택하여 폼에 추가합니다.

작성일: 5/18/2023 페이지: 41/92

개체의 종류 : 이름예 )폼보고서이미지 :Image19명령단추 :Command0콤보상자 :SIH입력란 : 자택우편번호이름표 : Label37

상단좌측에 표시된 이름의 개체종류 ( 폼 , 컨트롤등 ) 에 설정할 수 있는 변수 List개체별로 다름

속성변수에 설정한 값

액세스 프로그래밍 강좌

Note: 입력란 text0 에 날짜값 99-03-03 을 입력한 후 하위폼을 클릭하면, 일정관리 테이블에서 '언제'의 값이 99-03-03 인 자료가 검색되고, 추가 작업시 자동으로 '언제' 필드의 값이 입력되는 것을 볼 수 있습니다.

5. 달력을 보면서 마우스 클릭으로 날짜 선택을 할수있도록 아래의 작업을 합니다.

메뉴에서 [삽입]-[Active X 컨트롤(C)…] 메뉴에서, 'Calendar Control8.0'을 선택한후, '확인' 버튼을 눌러 Active X 컨트롤을 삽입합니다.

6. Active X 컨트롤의 이름을 'CL' 로 입력합니다.

작성일: 5/18/2023 페이지: 42/92

이름 :text0기본값 : =Format(Now(),"yy-mm-dd")

이름 : 일정관리 하위 폼 기본폼에서 하위폼을 부르는 이름

원본개체 : 일정관리 하위 폼 . 하위폼에 포함될 폼이름

하위필드연결 : 언제 하위폼안의 필드 이름

기본필드연결 : text0.. 기본폼의 컨트롤 이름

액세스 프로그래밍 강좌

컨트롤 'CL' 을 마우스 오른쪽 클릭하고, 단축메뉴에서 '이벤트 작성'을 클릭합니다.

코드작성기 화면의 ⓑ 위치에 아래의 코딩을 합니다.

Me![일정관리 하위 폼].Form![언제].DefaultValue = " =Format( forms![일정관리]!CL, ""yy-mm-dd"" ) "Me.text0 = Me.CL

7.폼의 이름을 '일정관리'로 저장하고, 폼 폼보기 하여 달력의 날짜를 마우스로 클릭하면서

실행해봅니다.

Tip: 입력란'text0'의 화면표시 속성을 '아니오'로 하면, 달력과 일정관리하위폼만으로 구성된것으로 작업할 수

있습니다.

4) 폼에 콤보상자/리스트박스 컨트롤 사용1. 데이터베이스창에서 폼을 선택하고 '새로만들기' 버튼을 누릅니다.2. '디자인보기'를 선택합니다.

3. 도구상자에서 콤보상자 아이콘을 선택하여 폼에 추가합니다.

ⓒ : SELECT 개인관계.개인관계 FROM 개인관계 ORDER BY 개인관계.개인관계;

4. '전화번호부찾기' 로 폼을 저장합니다.

5. 도구상자에서 리스트박스 아이콘을 선택하여 폼에 추가합니다.

작성일: 5/18/2023 페이지: 43/92

Private Sub CL_Click() ⓑ End Sub

이름 : 관계컨트롤의 원본형식 : 테이블 / 질의행데이터 .: ⓒ기본값 .: "*"

액세스 프로그래밍 강좌

5) 콤보상자의 값과 리스트박스 연결실습) '전화번호부찾기' 폼에서 콤보상자에서 선택한 개인관계에 해당하는 전화번호데이타를 리스트박스에 검색되도록 작성합니다.

1. 폼탭에서 '전화번호부찾기' 폼을 선택한후, '디자인' 버튼을 클릭합니다.2. '전화번호부찾기질의' 에 '개인관계' 필드값이 콤보상자의 값에 해당하는 데이터만

검색하도록 아래의 조건을 설정합니다.

개인관계 = Like [Forms]![ 전화번호부찾기 ]![ 관계 ]

ㅇ 질의 탭에서 '전화번호부찾기질의'를 선택한후, '디자인'버튼을 클릭합니다.

3. 콤보박스 '관계' 값에 따라 질의를 재실행하도록, 콤보박스를 마우스 오른쪽 클릭한후

단축메뉴에서 '이벤트작성'-'코드작성기'를 눌러 아래의 AfterUpdate 이벤트프로시저를 작성합니다.

Private Sub 관계_AfterUpdate() Me.전화번호부 ID.Requery End Sub

작성일: 5/18/2023 페이지: 44/92

이름 : 전화번호부 ID컨트롤의 원본형식 : 테이블 / 질의행데이터 .: 전화번호부찾기질의기본값 .: "*"열개수 : 19

질의 재실행 Me.전화번호부 ID.Requery 전화번호부찾기질의 개인관계= Like [Forms]![전화번호부찾기]![관계]

변경

액세스 프로그래밍 강좌

6) 리스트박스의 행데이타를 읽어서 다른 폼 열기 실습) '전화번호부찾기' 폼에있는 리스트박스의 전화번호부인덱스 데이터중 한 레코드에서 더블클릭하면, '전화번호부'폼을 열고 그 레코드의 '전화번호부 ID'에 해당하는 사람의 데이터를 가져오도록 작업합니다.

1. 폼탭에서 '전화번호부찾기' 폼을 선택한후, '디자인' 버튼을 클릭합니다.2. 리스트박스를 마우스 오른쪽 클릭한후 단축메뉴에서 '이벤트작성'-'코드작성기'를 눌러

아래의 DblClick 이벤트프로시저를 작성합니다.

Private Sub 전화번호부 ID_DblClick(Cancel As Integer)DoCmd.OpenForm " 전화번호부 " , , , "[ 전화번호부 ID]=forms![ 전화번호부찾기 ]![ 전화번호부 ID]"

End Sub

7) 언바운드를 활용한 폼 사용방법폼에서 입력필드들의 데이터 원본속성 즉 테이블의 필드와 연결되어있는 상태에는 필드가 바운드 되어있다고 합니다. 이와는 반대로 계산에 의한 값들을 잠시 보여주기 위한 테이블 필드와 연결되어있지 않은 상태를 언바운드 되어있다고 합니다. 바운드 되어있는 방식으로 입력화면을 만든 보통 폼은 필드들을 입력란이나 콤보상자의 컨트롤 원본으로 전체 필드들이 바운드 되어있어서 사용자가 액세스 화면에 경험이 없거나 데이터베이스를 다루어 보지 않았더라면 대부분 데이터를 쉽게 삭제하거나 수정하게 됩니다. 현재 액세스에서 취하고 있는 바운드 형식의 폼에서는 한번의 수정으로도 아무런 경고 메시지나 확인 메시지를 취하지 않고, 프로그래머가 알아서 경고 메시지와 취소에 대한 키 값을

작성일: 5/18/2023 페이지: 45/92

결과

Note: DoCmd 개체의 메서드을 사용하면 Visual Basic에서 Microsoft Access 의 매크로 함수을 실행할 수 있습니다. 하나의 매크로 함수는 윈도우 닫기, 폼 열기, 컨트롤의 값 설정 등과 같은 작업을 수행합니다. 예를 들어, DoCmd 개체의 OpenForm 메서드를 사용하여 폼을 열고 Hourglass 메서드를 사용하여 마우스 포인터를 모래 시계 아이콘으로 바꿉니다. OpenForm 폼이름 , , , 필터조건

①②

액세스 프로그래밍 강좌

액세스에게 알려주지 않는한 쉽게 자료들은 수정됩니다. 이 바운드된 형식은 이렇게 프로그래머에게는 쉽게 프로그램을 만들수있게 하지만 사용자의 요구에 충족시키기란 쉽지 않습니다. 또한 개인정보를 관리하는 차원이라면 바운드된 형식을 따르는 것이 바람직하겠지만 재무나 회계, 인사와 같은 중요한 자료들의 관리를 위한 프로그램 방식으로는 적당하지 않을때가 많습니다. 그래서 액세스의 탁월한 질의 기능을 활용한 언바운드를 이용하면서도 간단하고 안전하게 자료를 수정,삭제,등록할 수 있는 언바운드방법을 사용합니다.

실습) 콤보박스의 값을 리스트박스의 행데이터에 사용된 질의의 조건으로 사용하고, 리스트박스의 결과값들중 하나를 선택하면 리스트박스 행의 값을 언바운드 컨트롤에 나타내는 것을 실습합니다.

1. 데이터베이스창에서 폼을 선택하고 '새로만들기' 버튼을 누릅니다.2. '디자인보기'를 선택한후, '비자금' 으로 저장 합니다.

3. 도구상자에서 입력란 아이콘을 선택한 후, 입력란 5 개, 콤보상자 1 개, 리스트박스 1

개를 만듭니다. 입력란의 이름을 입력하고, 콤보상자와 리스트박스의 속성을 입력합니다.

Wdate Naeyong TJBID InMoney OutMoney

4. 폼보기하여 콤보상자 'YM'의 값의 변화에 따른 리스트박스 'JBID'의 결과를 확인해

봅니다.

5. 리스트박스 'JBID'의 선택된 레코드의 값을 언바운드 컨트롤 Wdate, Naeyong, InMoney,

OutMoney 에 뿌려주는 JBID_AfterUpdate 이벤트 프로시저를 작성합니다.

ㅇ리스트박스를 마우스 오른쪽 클리한후, 단축메뉴에서 '이벤트작성'을 클릭합니다. '작성기선택' 화면에서 '코드작성기'를 선택한후, '개체'에서 JBID 를 '프로시저'에서 AfterUpdate 를 선택합니다.

작성일: 5/18/2023 페이지: 46/92

이름 : YM행데이타 : YYYYMM 질의기본값 : =Format(Now(),"yyyy-mm")AfterUpdate 이벤트 : Private Sub YM_AfterUpdate() Me.JBID.Requery End Sub

이름 : JBID행 데이터 : 비자금질의

액세스 프로그래밍 강좌

ㅇ Private Sub 와 End Sub 사이에 아래의 코딩을 합니다. Me.TJBID . = Me.JBID 비자금 ID 수정,삭제시 비자금테이블의 ID

Me.WDate .= Me.JBID.Column(1) 입력일자

Me.NaeYong = Me.JBID.Column(2) 내용

Me.InMoney .= Me.JBID.Column(3) 수입

Me.OutMoney = Me.JBID.Column(4) 지출

변수 = 리스트 ( 테이블 / 질의 ) 의 필드 값

6. 폼보기로 리스트박스의 선택에 따라 언바운드 컨트롤의 값이 바뀌는 것을 확인합니다.

8) 명령버튼의 사용'추가', '수정', '삭제' 이름의 명령단추버튼 3 개를 마법사를 사용하지 않고 만들고 , '종료' 버튼은 마법사를 사용하여 만들어봅니다. 마법사를 사용하지 않고 명령단추를 만들려면

도구상자의 개체선택 아이콘 옆에있는 컨트롤마법사 아이콘이 선택되어 있지

않도록 해야합니다.

실습) '비자금' 폼에 입력란의 값을 리스트박스에 추가하는 '추가'버튼과, 수정사항을 저장하는 '수정'버튼, 삭제하는 '삭제'버튼, 폼 닫기하는 '종료' 버튼을 만듭니다.

1. 도구상자에서 명령단추 아이콘을 선택한 후, '비자금'폼에 추가하는 작업을 3 번하여

명령단추 3 개를 추가합니다.2. 메뉴표시줄의 [서식] 의 '크기', '맞춤', '수평간격' 등의 메뉴를 사용하여 크기와 간격을

조정합니다.

Tip : Shift키가 눌려진 상태에서 컨트롤을 마우스 왼쪽클릭할 때 하나 이상의 컨트롤을 선택할수있습니다.

선택된 컨트롤의 크기를 미세하게 조절할때는 Shift키를 누른 상태에서 화살표키를 움직여 조절하고, 미세한

이동의경우 Control 를 누른상태에서 화살표키를 움직여 이동합니다.

3. 컨트롤마법사 아이콘이 눌려져 있는 상태에서, 명령단추 아이콘을 클릭하여

작성일: 5/18/2023 페이지: 47/92

개체프로시저

액세스 프로그래밍 강좌

'비자금'폼에 추가하면, 명령단추마법사가 나타납니다.

4. 나머지 3 개의 명령단추에 이름과 단추에 넣을 그림과 이벤트 프로시저를 작성합니다.

CmdInsert

CmdDelete CmdUpdate CmdClose

ㅇ 이벤트 프로시저

Private Sub CmdInsert_Click()

If MsgBox("정말루 저장할꺼여유?", vbOKCancel, "저장확인") = vbOK Then

DoCmd.SetWarnings False

DoCmd.OpenQuery "비자금추가질의"

DoCmd.SetWarnings True

Forms![비자금].Refresh

Me.NaeYong = Null

Me.InMoney = CCur(0)

Me.OutMoney = CCur(0)

Me.NaeYong.SetFocus

End If

End Sub

Private Sub CmdDelete_Click()

If IsNull(Me.JBID) Then

작성일: 5/18/2023 페이지: 48/92

단추를 누르면 실행될 함수의 ㅇ 종류 : 폼작업 매크로함수 : 폼닫기 를 선택하고나서,단추에 넣을 문자열 또는 그림중에서 ㅇ 그림 : 멈춤표시 를 선택하고, 단추의 이름을 CmdClose 로 입력하고, 완료를 누르면 명령단추가 하나 만들어 집니다.

액세스 프로그래밍 강좌

MsgBox "삭제하려는 레코드를 선택하세요", vbOKOnly, "주의"

Else

If MsgBox("정말루 삭제할꺼여유?", vbOKCancel, "정말루 주의!") = vbOK Then

DoCmd.SetWarnings False

DoCmd.OpenQuery "비자금삭제질의"

DoCmd.SetWarnings True

End If

Forms![비자금].Refresh

End If

End Sub

Private Sub CmdUpdate_Click()

If MsgBox("정말루 수정할꺼여유?", vbOKCancel, "수정확인") = vbOK Then

DoCmd.SetWarnings False

DoCmd.OpenQuery "비자금수정질의"

DoCmd.SetWarnings True

End If

Forms![비자금].Refresh

End Sub

ㅇ 명령단추 이름/ 그림

5. 콤보상자에 선택된 월의 수입/지출계와 전체 수입/지출계를 폼 바닥글에 보여줌으로써,

작성일: 5/18/2023 페이지: 49/92

CmdInsert : 레코드저장CmdDelete : 레코드삭제CmdUpdate ..: 문서편집CmdClose :멈춤표시

액세스 프로그래밍 강좌

매일의 수입/지출내역의 입력과 동시에 잔액을 확인할 수 있도록 '계산컨트롤'(입력란)을 6개 추가하고 속성을 입력합니다.

이름: IT (월수입)

컨트롤원본: =DSum("[수입]","비자금질의")이름: OT (월지출)

컨트롤원본: =DSum("[지출]","비자금질의")

이름: TIT (누계수입)

컨트롤원본: =DSum("[수입]","비자금")이름: TOT (누계지출)

컨트롤원본: =DSum("[지출]","비자금")

Note: 계산컨트롤이란 주로 입력란을 사용하며 데이터 원본이 '식'인 컨트롤을 말합니다. '계산

컨트롤' 에서는 모든 식 앞에 = 연산자를 사용하며, 컨트롤 원본 속성 상자에서 식을 입력할 공간이 더

많이 필요할 경우 Shift+F2키를 누르면 확대 상자가 열립니다.

6. '비자금' 에서 사용되는 '비자금추가질의' , '비자금삭제질의' , '비자금수정질의'중에서 '비자금 추가질의' 를 작성합니다.

ㅇ 데이터베이스창에서 '질의'탭을 선택한후, '새로만들기'를 클릭합니다.ㅇ '디자인보기'를 선택한 후, '테이블표시'창에서 테이블을 선택하지 않고 '닫기'합니다.ㅇ 메뉴표시줄에서 '질의'를 선택한후, '추가질의'를 클릭합니다. '테이블이름' 항목에 '비자금'테이블을 선택합니다.

ㅇ'입력란' Wdate, NaeYong, InMoney, OutMoney 에 입력된 값을 '비자금'테이블의 입력일자, 내용, 수입, 지출 필드에 추가하도록 '필드' 에는 입력될 대상 값을 '추가'에는 값이 넣어질 필드명을 지정합니다.

작성일: 5/18/2023 페이지: 50/92

액세스 프로그래밍 강좌

7. 폼보기 하여 추가, 수정, 삭제, 종료등의 명령단추를 실행해 봅니다.

9) TAB 컨트롤을 사용하여 폼 작성기본폼과 한 화면에서 작업해야할 하위폼이 2 개 이상이 되면 화면 구성이 복잡해지거나, 하위폼 각각의 크기가 작아질 수 밖에 없습니다. 이럴때 사용할 수 있는 컨트롤이 TAB입니다.

실습) '개인정보' 폼에 순서대로 나열되어있는 하위폼을, 탭 컨트롤을 사용하여 깔끔하게 정리해

봅니다.

1. 데이터베이스창에서 폼을 선택하고 '새로만들기' 버튼을 누릅니다.2. '디자인보기'를 선택합니다.

3. 도구상자에서 탭컨트롤 아이콘을 선택한 후, 폼을 클릭한 상태에서 Drag(끌기)

하여 적당한 사각형 크기로 만듭니다.

4. 도구상자에서 입력란 아이콘을 선택하여 폼에 입력란 2 개를 만듭니

5. 탭컨트롤의 '용지 1'을 선택한후, 하위폼 아이콘을 선택하여 탭페이지 '용지 1'에

적당한 크기로 사각형을 만듭니다. 탭페이지 '용지 2'에도 하위폼을 만듭니다. 폼의 레코드원본속성과 입력란의 이름과 컨트롤원본속성을 입력합니다.

작성일: 5/18/2023 페이지: 51/92

필드 추가Expr1: [Forms]![ 비자금 ]![WDate] 입력일자 Expr2: [Forms]![ 비자금 ]![NaeYong] 내용Expr3: [Forms]![ 비자금 ]![InMoney] 수입Expr4: [Forms]![ 비자금 ]![OutMoney] 지출

이름 : 주민번호컨트롤원본 : 주민번호

이름 : 이름컨트롤원본 : 이름

폼레코드원본 = ' 개인정보 '

액세스 프로그래밍 강좌

6. 폼의 이름을 'frm_탭컨트롤'으로 저장합니다.

…탭페이지 '용지 2' 에는 '예금통장하위폼'을 연결합니다.

7. 탭컨트롤의 '용지 1' 글씨부분을 마우스오른쪽 클릭한 후, 이름과 표제를 입력합니다.

10) 폼에 하이퍼 링크의 사용 A인터넷 브라우저를 사용하지 않고 이름표 컨트롤과 하이퍼링크 속성을 사용해서 Access 의 폼에서 마우스로 클릭으로 HTML 파일을 읽을 수 있습니다.

실습) 이름표 컨트롤을 마우스 클릭함으로써 전화번호부.HTML 을 파일읽을 수 있도록 폼을 작성합니다.

1. 데이터베이스창에서 폼을 선택하고 '새로만들기' 버튼을 누릅니다.2. '디자인보기'를 선택합니다.3. 도구상자에서 이름표와 명령단추 각 1 개씩을 폼에 추가합니다. 이름표의 '이름'속성과

Command1 의 'Click'이벤트프로시저를 작성합니다.

작성일: 5/18/2023 페이지: 52/92

탭페이지 ' 용지 1' 을 선택한후 포함된 하위폼 박스를 선택하고 속성아이콘을 클릭합니다 .원본개 체 를 ' 신 용카드 하 위 폼 ' 을 선택하면 자동으로 하위필드연결과 기 본 필 드 연 결 에 기 본 키 값 이 입력됩니다 .

이름 = 신용카드표제 = 신용카드

액세스 프로그래밍 강좌

이름: lblHyperlink

4. '폼보기'한 후 'Command1' 명령단추를 누르면, 이름표에 HTML 화일명이 씌어집니다..

이름표를 마우스왼쪽 클릭하여 HTML 화일읽기를 실습합니다.

5. 보통 MDB 파일이 있는 디렉토리에 관련된 파일을 저장하므로 MDB 화일이 있는

디렉토리를 구하는 함수를 사용하고 파일이름만 설정하도록 'Command1_Click'이벤트프로시저를 수정합니다.

strLocalPath = CurrentDb.NamestrLocalPath = left( strLocalPath, Len( strLocalPath ) - Len( Dir( CurrentDb.Name ) ) )strLocalPath = strLocalPath & "전화번호부.html"

6. 데이터베이스에 있는 테이블을 HTML 화일로 만들고 만들어진 HTML 화일을

보기하도록 'Command1_Click'이벤트프로시저에 DoCmd.OutputTo 매크로함수를 추가합니다

Private Sub Command1_Click() strLocalPath = CurrentDb.Name strLocalPath = left(strLocalPath, Len(strLocalPath) - Len(Dir(CurrentDb.Name))) strLocalPath = strLocalPath & "전화번호부.html" DoCmd.OutputTo acOutputTable, "전화번호부", acFormatHTML, strLocalPath Me!lblHyperlink.Caption = strLocalPath Me!lblHyperlink.HyperlinkAddress = strLocalPath

작성일: 5/18/2023 페이지: 53/92

Private Sub Command1_Click() Dim strLocalPathMe!lblHyperlink.Caption = "D:\EDU_BOOK\sample\ 전화번호부 .HTML"Me!lblHyperlink.HyperlinkAddress="D:\EDU_BOOK\sample\ 전화번호부 .HTML"

End Sub

액세스 프로그래밍 강좌

End Sub

Note: DoCmd.OutPut 의 인수

acOutputTable, "전화번호부" , acFormatHTML, strLocalPath

Source 화일의 Type 파일명 Source 화일의 출력화일 Type 만든화일이저장될 PATH

acOutputTable acFormatHTML

acOutputQuery acFormatTXT

acOutputForm acFormatXLS

acOutputReport acFormatRTF

11) 폼에 하이퍼 링크의 사용 B

현재 열려있는 데이터베이스 창의 테이블/질의/폼/레포트 탭에 있는 개체를 읽어와서 10)에서 실습한 작업을 하고자할 때, 아래의 코딩을 응용하시면됩니다.

1. 리스트 박스를 추가한 후, 속성을 입력합니다.

작성일: 5/18/2023 페이지: 54/92

이름 lstTables컨트롤원본형식 : FillTableOrQueryList

옵 션 그 룹 이 름grpChooseGroup

리스트박스 이름 lstTables

액세스 프로그래밍 강좌

2. 옵션그룹 컨트롤을 도구상자에서 클릭한후, 폼에 적당한 크기로 만듭니다.

3. 옵션 컨트롤을 클릭한후, 옵션그룹 안에 추가하는 작업을 4 번 반복합니다.

3. 옵션의 선택이 폼에서 테이블로, 테이블에서 레포트로 바뀔 때 AfterUpdate 이벤트가 발생하도록 코드합니다. Private Sub grpChooseGroup_AfterUpdate() Me!lstTables.Requery -> 목록상자에 값을 다시 뿌리도록 실행

End Sub

리스트박스의 컨트롤원본형식이 FillTableOrQueryList 함수이므로, 함수가 실행되는 것입니다.

함수안에는 리스트박스에 값을 채우는 프로그램이 되어있습니다.

Option Explicit

Const adhcShowTables = 1

Const adhcShowQueries = 2

Const adhcShowBoth = 3

Const adhcShowForms = 4

Const adhcShowReports = 5

Private Sub chkShowSystem_AfterUpdate()

Me!lstTables.Requery

End Sub

Private Sub Form_Open(Cancel As Integer)

Me!grpChooseGroup.SetFocus

Me!grpChooseGroup = 1

Me!chkShowSystem = False

Me!lstTables.Requery

End Sub

Private Sub grpChooseGroup_AfterUpdate()

Me!lstTables.Requery

End Sub

작성일: 5/18/2023 페이지: 55/92

액세스 프로그래밍 강좌

Function FillTableOrQueryList(ctl As Control, varID As Variant, lngRow As Long, _

lngCol As Long, intCode As Integer) As Variant

Static sastrNames() As String

Static sintItems As Integer

Dim db As Database

Dim intCount As Integer

Dim varRetval As Variant

Dim intLoop As Integer

Dim intItems As Integer

Dim tdf As TableDef

Dim qdf As QueryDef

Dim ctr As Container

Dim doc As Document

varRetval = Null

Select Case intCode

' Initialize

Case acLBInitialize

Set db = CurrentDb()

db.TableDefs.Refresh

db.QueryDefs.Refresh

intItems = db.TableDefs.Count + db.QueryDefs.Count

If intItems = 0 Then

varRetval = False

Else

ReDim sastrNames(0 To intItems - 1)

sintItems = 0

If ShowTables() Then

For Each tdf In db.TableDefs

작성일: 5/18/2023 페이지: 56/92

액세스 프로그래밍 강좌

If Not IsTemp(tdf) Then

If isSystem(tdf) Imp ShowSys() Then

sastrNames(sintItems) = tdf.Name

sintItems = sintItems + 1

End If

End If

Next tdf

End If

If ShowQueries() Then

For Each qdf In db.QueryDefs

If Not IsTemp(qdf) Then

sastrNames(sintItems) = qdf.Name

sintItems = sintItems + 1

End If

Next qdf

End If

Set ctr = db.Containers!Forms

If ShowForms() Then

For Each doc In ctr.Documents

If Not IsTemp(doc) Then

sastrNames(sintItems) = doc.Name

sintItems = sintItems + 1

End If

Next doc

End If

Set ctr = db.Containers!Reports

If ShowReports() Then

For Each doc In ctr.Documents

If Not IsTemp(doc) Then

sastrNames(sintItems) = doc.Name

sintItems = sintItems + 1

End If

Next doc

작성일: 5/18/2023 페이지: 57/92

액세스 프로그래밍 강좌

End If

varRetval = True

End If

Case acLBOpen

' Get a unique ID number for control.

varRetval = Timer

Case acLBGetRowCount

' Get the number of rows.

varRetval = sintItems

Case acLBGetValue

' Get the actual data for the row.

varRetval = sastrNames(lngRow)

Case acLBEnd

' Clean up (release memory)

Erase sastrNames

End Select

FillTableOrQueryList = varRetval

End Function

Function isSystem(tdf As TableDef)

isSystem = ((tdf.Attributes And dbSystemObject) <> 0) Or _

left(tdf.Name, 4) = "USys"

End Function

Function ShowQueries() As Boolean

With Me!grpChooseGroup

ShowQueries = (.Value = adhcShowQueries Or .Value = adhcShowBoth)

End With

End Function

Function ShowSys() As Boolean

ShowSys = Nz(Me!chkShowSystem, False)

End Function

Function ShowTables() As Boolean

With Me!grpChooseGroup

작성일: 5/18/2023 페이지: 58/92

액세스 프로그래밍 강좌

ShowTables = (.Value = adhcShowTables Or .Value = adhcShowBoth)

End With

End Function

Function ShowForms() As Boolean

With Me!grpChooseGroup

ShowForms = (.Value = adhcShowForms)

End With

End Function

Function ShowReports() As Boolean

With Me!grpChooseGroup

ShowReports = (.Value = adhcShowReports)

End With

End Function

Function IsTemp(obj As Object) As Boolean

IsTemp = (left(obj.Name, 7) = "~TMPCLP") Or _

(left(obj.Name, 3) = "~sq")

End Function

Private Sub Export_Click()

Dim strLocalPath, MyPos, objecttype

strLocalPath = CurrentDb.Name

strLocalPath = left(strLocalPath, Len(strLocalPath) - Len(Dir(CurrentDb.Name)))

strLocalPath = strLocalPath & Me!lstTables & ".html"

If ShowTables() Then

DoCmd.OutputTo acOutputTable, Me!lstTables, acFormatHTML, strLocalPath

End If

If ShowQueries() Then

DoCmd.OutputTo acOutputQuery, Me!lstTables, acFormatHTML, strLocalPath

End If

작성일: 5/18/2023 페이지: 59/92

액세스 프로그래밍 강좌

If ShowForms() Then

DoCmd.OutputTo acOutputForm, Me!lstTables, acFormatHTML, strLocalPath

End If

If ShowReports() Then

DoCmd.OutputTo acOutputReport, Me!lstTables, acFormatHTML, strLocalPath

End If

Me!lblHyperlink.Caption = strLocalPath

Me!lblHyperlink.HyperlinkAddress = strLocalPath

End Sub

작성일: 5/18/2023 페이지: 60/92

액세스 프로그래밍 강좌

강좌 4. 레코드셋 사용

프로그램을 하다보면 프로그램에서 데이터베이스의 구조와 테이블 탭내의 테이블명( 테이블내의 필드명등..), 폼탭내의 폼들의 이름등과같은 데이터에 대한 액세스가 필요하게 됩니다. 이런 작업은 Access 의 데이터액세스(DAO)개체를 사용하기 때문에 가능합니다.이 강좌에서는 프로그램코드로 데이터를 액세스하고 조작할 수있게 해주는 개체들의 집합인 데이터액세스개체(DAO)에 관련한 개요와 그 중에서도 RecordSet 개체에 대해서 중점적으로 알아보겠습니다.

DAO 모델의 RecordSet

1) 개체변수 사용하기개체 변수를 만들려면 개체 변수를 '선언'하고, 변수를 개체에 '할당'해야 합니다. 다른 일반표준 변수의 선언의 예를 먼저 살펴 보겠습니다. 표준 변수의 선언은 아래와 같습니다. Dim 변수명 AS 데이터 Type

Dim AnyValue, MyValueAnyValue 와 MyValue 가 Empty 로 지정된 기본값에 의해 Variant 로 선언됩니다.

Dim Number As Integer 변수 형식을 명확하게 정수로 선언합니다.

Dim strString As String 변수 형식을 명확하게 문자열로 선언합니다.

Dim Choice As Boolean, BirthDate As Date 단일한 라인에 대한 다중 선언입니다.

Dim Matrix(3, 4) As Integer Matrix 는 정수의 2 차원 배열입니다.

Dim MyArray() MyArray 는 variant 의 동적 배열입니다.

작성일: 5/18/2023 페이지: 61/92

액세스 프로그래밍 강좌

Note: 모든 변수는 어떤 크기를 가지며, Data Type 을 갖습니다.

Byte (n) : 1 Byte : 0 ∼ 255Boolean (b) : 2 Byte : True, FalseInteger (i) : 2 Byte : -32,768 ∼ 32,767long (l) : 4 Byte : -2,147,483,648 ∼ 2,147,483,647Single (sf) : 4 Byte : -3.402823E38 ∼ -1.401298E-45 (음수) 1.401298E-45 ∼ 3.402823E38 (양수)Double (bf) : 8 Byte : -1.79769313486232E308 ∼ -4.94065645841247E-324 (음수) 4.94065645841247E-324 ∼ 1.79769313486232E308 (양수)Currency (c) : 8 Byte : -922,337,203,685,477.5808 ∼ 922,337,203,685,477.5807 (정수형)Date (d) : 8 Byte : 100/1/1 ∼ 9999/12/31 (-647,434 ∼ 2,958,465) (1899/12/30 = 정수값 0)Object (o) : 4 Byte : Object를 참조하기 위해 사용된다.String (s) : 11 Byte 이상 : 20억 문자까지 (가변길이 String)

65400 문자까지 (고정길이 String)Variant (v) : Data Type을 지정하지 않고 변수를 선언하는 경우, 위의 모든 Type을 한다.

Variant Type을 사용할 경우 22Byte가 추가로 Memory영역이 낭비된다.

2. 개체변수 선언 데이터 베이스 응용프로그램에서는 개체를 반복하여 참조하는 것보다 ( 긴 이름을 계속 입력해야 하는 불편…) 개체를 지칭하는 변수를 사용하는 것이 더 효율적입니다. 개체변수도 다른 표준 변수처럼 Dim , Private, Static 문 등으로 선언할 수 있습니다.

Dim db As Database 데이터베이스 개체Dim rst As Recordset .레코드 셋 개체Dim frm .As .Form .폼 개체Dim ctl As .Control 컨트롤 개체

New키워드를 사용하여 현재 개체의 인스턴스를 작성 3. 개체변수 지정

Set 문을 사용하여 개체를 선언된 개체 변수에 할당합니다. Set 변수명 = objectexpr

작성일: 5/18/2023 페이지: 62/92

액세스 프로그래밍 강좌

Set db = Currentdb()Set rst = db.OpenRecordset("tblCustomers")Set frm = . Forms!frmCustomersSet ctl = frm.Controls!txtCompanyName

실습) Access 개체중 Form 개체를 사용하는 방법을 실습합니다.

' 열려있는 폼의 표제를 변경하는 프로시저.

Sub ChangeCaption () Dim frmTemp as From Set frmTemp = Forms![전화번호부] FrmTemp.Caption = Now ' 폼의 표제를 현재 날짜와 시간으로 변경End Sub

실습) DAO 개체중 Tabledef 개체를 사용하는 방법을 실습합니다.

Note: TableDef 개체는 기초 테이블 또는 연결된 테이블의 저장된 정의를 나타냅니다.

1. 폼 탭에서 [새로만들기]-[디자인보기]를 선택하여 새 폼을 준비합니다.2. [보기]-[코드] 메뉴를 선택하고, [보기]-[디버그창]을 선택합니다.3. 아래의 명령을 실습합니다.

테이블 이름 읽어오기 Currentdb.Tabledefs("전화번호부").name테이블내의 레코드 수 Currentdb.Tabledefs("전화번호부").recordcount

2) 개체변수 찾아보기'개체찾아보기'를 열려면 모듈이 열린 상태에서 '보기'메뉴의 '개체찾아보기'를 누릅니다. '개체찾아보기'를 사용하면, 열려있는 데이터베이스화일(.mdb)의 개체들과 개체안에 있는 프로시져를 한눈에 볼수있습니다. 그중 하나의 폼을 선택하고 프로시저를

작성일: 5/18/2023 페이지: 63/92

액세스 프로그래밍 강좌

선택하면 폼이 '디자인'모드로 열리고 프로시저 코드작성상태가 됩니다. '개체찾아보

기'는 닫기 전까지는 화면에 계속 있어서 개체와 프로시저 사이를 빠르게 이동하면서 작업할 수 있습니다. '개체찾아보기'는 사용자가 많이 사용했던 ‘ NC ’,’ M ’,’윈도우 탐색’ 처럼 사용되는 것입니다.

3) 개체 참조 강좌 1 의 개체와 그값의 참조 (P12)의 내용을 좀더 보충해 보겠습니다. Miscrosoft Access 에서는 일부개체에 다른 개체가 포함됩니다. 예를들어, 폼에 컨트롤이 포함됩니다.( 명령단추, 옵션, 하위폼, 이미지 등…) 모음(컬렉션)은 해당 종류의 모든 개체로 이루어진 그룹입니다. 예로, Forms 모음은 데이터베이스에서 열려있는 모든 폼으로 구성되며, 각 폼에는 그 컨트롤 전체에 대한 모음이 들어있습니다. 식에서 식별자( !, . )를 사용하여 속성을 참조할수있다고 강좌 1에서 언급되었지요? 예를 들어서 설명을 해보겠습니다.

1. 식에서 식별자( !, . )를 사용하여 속성을 참조합니다.

전체 식별자를 사용하여 개체나 속성을 참조하는 것이 좋을 때가 있습니다. 어떤 경우에는 전체 식별자를 사용해야만 합니다. 예를 들어, 현재 폼이나 현재 보고서가 아닌 폼이나 보고서의 컨트롤을 참조할 때 전체 식별자를 입력해야 합니다. 다음 식은

작성일: 5/18/2023 페이지: 64/92

액세스 프로그래밍 강좌

다른 폼의 컨트롤에서 Orders 폼에 대한 Subtotal 컨트롤과 Freight 컨트롤 값의 합을 나타냅니다.

= Forms![Orders]![Subtotal] + Forms![Orders]![Freight]

하지만, 어떠한 경우에는 전체 식별자를 지정하지 않고 컨트롤이나 그 속성을 참조할 수 있습니다.

현재 폼이나 현재 보고서의 컨트롤을 참조할 때는 폼이나 보고서를 지정할 필요가 없습니다. 예를 들어, 같은 폼의 다른 컨트롤에 Subtotal 컨트롤과 Freight 컨트롤 값의 합을 나타내려면 그 컨트롤의 ControlSource 속성을 다음과 같이 설정합니다.

= [Subtotal] + [Freight]

하위 폼이나 하위 보고서의 컨트롤을 참조할 때는 Form 이나 Report 속성을 사용하여 폼이나 보고서에 대한 전체 식별자를 지정할 필요가 없습니다. 예를 들어, 다음 식별자를 사용하여 Orders Subform 하위 폼에 있는 Quantity 컨트롤을 참조할 수 있습니다.

Forms![Orders]![Orders Subform]![Quantity]

Quantity 컨트롤에 대한 전체 식별자는 다음과 같습니다.

Forms![Orders]![Orders Subform].Form![Quantity]

응용 프로그램의 Visual Basic 에서 전체 식별자 대신 Me 키워드를 사용하여 현재 폼이나 보고서의 컨트롤을 참조할 수 있습니다. 예를 들어, 폼의 이벤트 프로시저의 OrderTotal 변수에 폼의 Subtotal 컨트롤과 Freight 컨트롤 값의 합을 할당하려면 다음 문을 이벤트 프로시저에 추가합니다.OrderTotal = Me![Subtotal] + Me![Freight]

2. ME 속성

Me 속성을 사용하여 Visual Basic 코드가 현재 시행 중인 폼, 보고서(하위폼, 하위보고서와 연관된 폼이나 보고서)나 Visual Basic 코드가 현재 실행중인 클래스모듈을

작성일: 5/18/2023 페이지: 65/92

액세스 프로그래밍 강좌

참조합니다.

Note: Me 속성은 현재 폼이나 보고서의 개체 참조를 가지며 모든 적합한 개체 참조보다 속도가 빠릅니다.

예를 들어 다음의 두 코드는 Employees 폼에서 현재 레코드의 LastName 컨트롤의 값을 참조합니다.

StrLastName = Forms!Emploees.LastNameStrLastName = Me!LastName

Me 속성은 코드가 실행중인 폼이나 보고서를 항상 참조합니다.

3. Controls 컬렉션

Controls컬렉션에는 다른 컨트롤내에 있거나 첨부되어있는 폼,보고서,영역상의 모든 컨트롤이 포함되어있습니다. Controls컬렉션은 Form, Report, Section, Control개체요소입니다.

Controls 컬렉션을 암시적으로 참조하는 것이 더 빠릅니다. 이 예제는 OrderForm 폼에 NewData 컨트롤을 참조하는 예제입니다. 아래의 예제 구문 중에서, Me!NewData 가 컨트롤을 가장 빠르게 참조합니다.

Me!NewData '또는 Forms!OrderForm!NewData. Me![New Data] '컨트롤 이름에 공백이 있으면 사용합니다. Me("NewData") '실행 속도가 다소 느려집니다.

Controls 컬렉션을 명시적으로 참조해서 각 컨트롤을 참조할 수 있습니다.

Me.Controls!NewData '또는 Forms!OrderForm.Controls!NewData. Me.Controls![New Data] Me.Controls("NewData")

또한 컬렉션에서 인덱스로 컨트롤을 참조할 수 있습니다. Controls 컬렉션은 0 부터 인덱스를 시작합니다.

Me(0) '컬렉션에서 첫째 항목을 참조합니다. Me.Controls(0)

작성일: 5/18/2023 페이지: 66/92

액세스 프로그래밍 강좌

4. 하위폼에서 계산된 합계 기본폼에 표시

NorthWind 예제의 [Quarterly Orders]폼에는 하위폼이 포함되어있으며, 기본폼에는 년단위의 합계를 표시하며, 그 합계는 하위 폼에 표시된 각 분기별 제품별 수주현황 데이터의 합계입니다.

1) 하위폼의 분기별 합계를 기본폼에 표시하려면, 먼저 하위폼에 입력란을 추가한 다음 그 입력란의 '컨트롤 원본 속성' 상자에 합계식을 지정합니다.

2) 기본폼의 하단에 하위폼에서 읽어온 결과값을 표시할 입력란을 추가한후, 컨트롤원본속성 상자에 하위폼의 새로만든 입력란 Total 의 값을 표시합니다.

3) 폼보기하면 아래와 같이 결과가 나타납니다.

4) 표현식작성기 사용개체나 속성을 참조할 때, 그 이름이 기억나지 않으면 표현식 작성기를 사용합니다. 표현식 작성기를 사용하면, 이름을 몰라도 개체목록에서 선택만 하면 자동으로 상황에 맞는 연산자

작성일: 5/18/2023 페이지: 67/92

하위폼의 결과값들하 위 폼 의 결 과 값 을 기본폼에 표시

=[TotalQ1]+[TotalQ2]+[TotalQ3]+[TotalQ4]

입력란 : Total=[TotalQ1]+[TotalQ2]+[TotalQ3]+[TotalQ4]

=[Quarterly Orders Subform]![Total]

액세스 프로그래밍 강좌

(식별자 !, . )를 집어넣어 줍니다. 식을 입력하고자하는 곳( 코드 작성 화면 )에서 마우스 오른쪽 클릭을하고 단축메뉴에서 <작성…>을 선택하면 표현식 작성기가 나타납니다.

5) 레코드 셋 사용

Recordset 개체는 기초 테이블에 있는 레코드 또는 질의의 일부 또는 전체 데이터로 만들어지는 레코드집합으로 새로운 형태의 테이블/질의와 같은 개념에서 데이터를 가지는 파일이라고 생각하시면 됩니다. Recordset 개체를 사용하여 레코드 수준에서 데이터베이스에 있는 데이터를 조작할 수 있으며, Recordset 개체로 거의 모든 데이터를 조작합니다. 모든 Recordset 개체는 레코드(행)와 필드(열)로 이루어집니다.

OpenRecordset메서드를 사용하여 새 Recordset 개체를 작성하여 Recordsets 컬렉션에 추가합니다. 아래는 데이터베이스변수 DB 에 의해 참조된 데이터베이스의 테이블을 사용하여 레코드셋을 만든 예입니다.

Dim db as Database , rstCustomers as Recordset Set db = CurrentDB()Set rstCustomers = db.OpenRecordset("tblCustomers", dbOpenTable)

레코드 셋에서의 이동

rstCustomers.Movenext

레코드 셋에서의 레코드 수정

작성일: 5/18/2023 페이지: 68/92

액세스 프로그래밍 강좌

rstCustomers.EditrstCustomers![LastName] =”홍길동”rstCustomers.Update

레코드 셋에서의 레코드 추가

rstCustomers.AddNewrstCustomers![LastName] =”홍길동”rstCustomers.Update

레코드 셋에서의 레코드 삭제

rstCustomers.Delete

실습) DAO 개체 ( RecordSet )를 사용하여 입력프로그램을 작성해 봅니다 .

Customers 테이블로 RecordSet 을 작성하고 입력란 4 개와, 데이터조작에 관련된 입력,수정 등의 명령단추 6 개와 레코드 이동에 관련된 4 개의 명령단추, 찾기와 관련된 3 개의 명령단추를 폼에 추가하고, 아래의 코드를 작성합니다.

작성일: 5/18/2023 페이지: 69/92

액세스 프로그래밍 강좌

Option Compare Database

Option Explicit

Dim db As Database , rst As Recordset

/* 추가 버튼 */

Private Sub cmdAdd_Click()

rst.AddNew

txtNO = rst.Fields("NO")

txtCustomerID = ""

txtCompanyName = ""

txtContactName = ""

txtCustomerID.SetFocus

buttoneditmode

End Sub

/* 마지막레코드로 이동 버튼*/

Private Sub cmdBottom_Click()

rst.MoveLast

If rst.EOF Then rst.MoveLast

FillFields

End Sub

/* 수정 또는 추가 작업의 취소 버튼 */

Private Sub cmdCancel_Click()

rst.CancelUpdate

fillFields

buttonNoneditmode

End Sub

/* 폼 닫기 종료 버튼 */

Private Sub cmdClose_Click()

DoCmd.Close

End Sub

/* 레코드 삭제 버튼 */

Private Sub cmdDel_Click()

rst.Delete

cmdNext_Click

fillFields

작성일: 5/18/2023 페이지: 70/92

액세스 프로그래밍 강좌

End Sub

/* 수정 버튼 */

Private Sub cmdEdit_Click()

rst.Edit

buttoneditmode

End Sub

/* 찾기 버튼 */

Private Sub cmdFind_Click()

Dim varBookMark As String

Dim strAnswer As String

strAnswer = InputBox("고객번호를 입력하세요.", "Find Records")

If strAnswer = "" Then Exit Sub

VarBookMark = rst.Bookmark

rst.FindFirst "[CustomerId]= '" & strAnswer & "'"

If rst.NoMatch Then

rst.Bookmark = varBookMark

End If

FillFields

End Sub

/* 찾기 기능을 SQL 문장을 사용한 Recordset 을 이용해서 실행하도록… */

Private Sub cmdFindSql_Click()

Dim strSQL As String

Dim strAnswer As String

strAnswer = InputBox("고객번호를 입력하세요.", "Find Records")

If strAnswer = "" Then Exit Sub

strSQL = " select * from customers where customerid = '" & strAnswer & "'"

Set rst = db.OpenRecordset(strSQL, dbOpenDynaset)

If rst.RecordCount = 0 Then

txtNO = ""

txtCustomerID = ""

txtCompanyName = ""

txtContactName = ""

Exit Sub

End If

작성일: 5/18/2023 페이지: 71/92

액세스 프로그래밍 강좌

FillFields

End Sub

/* 다음 레코드 이동 버튼 */

Private Sub cmdNext_Click()

rst.MoveNext

If rst.EOF Then rst.MoveLast

FillFields

End Sub

/* 이전 레코드 이동 버튼 */

Private Sub cmdPre_Click()

rst.MovePrevious

If rst.BOF Then rst.MoveFirst

FillFields

End Sub

/* 저장 버튼 */

Private Sub cmdSave_Click()

rst.Fields("CustomerId") = txtCustomerID

rst.Fields("CompanyName") = txtCompanyName

rst.Fields("contactName") = txtContactName

rst.Update

rst.Bookmark = rst.LastModified

buttonNoneditmode

End Sub

/* 처음 레코드로 이동 버튼 */

Private Sub cmdTop_Click()

rst.MoveFirst

If rst.BOF Then rst.MoveFirst

FillFields

End Sub

/* Seek 기능을 이용한 찾기 버튼 */

Private Sub cmdSeek_Click()

' Dim varBookMark As String

작성일: 5/18/2023 페이지: 72/92

액세스 프로그래밍 강좌

' Dim strAnswer As String

' strAnswer = InputBox("고객번호를 입력하세요.", "Find Records")

' If strAnswer = "" Then Exit Sub

' varBookMark = rst.Bookmark

' rst.Index = "PrimaryKey"

' rst.Seek "=", strAnswer

' If rst.NoMatch Then

' rst.Bookmark = varBookMark

' End If

' fillFields

End Sub

/* 폼이 처음 열릴 때 */

Private Sub Form_Load()

Set db = OpenDatabase("c:\temp\northwind.mdb")' Find 사용시

Set rst = db.OpenRecordset("Customers", dbOpenTable)

' seek 를 사용시

' Set rst = db.OpenRecordset("Customers", dbOpenDynaset)

rst.MoveLast

rst.MoveFirst

fillFields

buttonNoneditmode

End Sub

/* 테이블/질의 의 내용을 화면의 입력란에 뿌리기 */

Private Sub fillFields()

txtCustomerID = rst("Customerid")

txtCompanyName = rst("CompanyName")

txtContactName = rst("ContactName")

txtNO = rst("No")

txtRcnt = rst.AbsolutePosition + 1 & "/" & rst.RecordCount

txtCustomerID.SetFocus

End Sub

/* 데이터 추가/수정중일때는 추가버튼, 이동버튼은 사용불가로 만들고, 저장,취소버튼을

사용가능하게… */

작성일: 5/18/2023 페이지: 73/92

액세스 프로그래밍 강좌

Private Sub buttoneditmode()

TxtCustomerID.SetFocus

CmdSave.Enabled = True

CmdCancel.Enabled = True

cmdAdd.Enabled = False

cmdEdit.Enabled = False

cmdDel.Enabled = False

cmdFind.Enabled = False

cmdNext.Enabled = False

cmdClose.Enabled = False

cmdPre.Enabled = False

End Sub

/* 데이터 입력중이 아닐때는 추가버튼, 이동버튼은 사용가능하게 , 저장/취소버튼은

사용불가능하게… */

Private Sub buttonNoneditmode()

txtCustomerID.SetFocus

cmdSave.Enabled = False

cmdCancel.Enabled = False

cmdAdd.Enabled = True

cmdEdit.Enabled = True

cmdDel.Enabled = True

cmdFind.Enabled = True

cmdNext.Enabled = True

cmdClose.Enabled = True

cmdPre.Enabled = True

End Sub

작성일: 5/18/2023 페이지: 74/92

액세스 프로그래밍 강좌

강좌 5. 응용프로그램의 보안

강좌 6 을 시작하는 여러분은 이미 응용프로그램을 작성하셨습니다. 온갖 사연속에 탄생한 프로그램을 누군가 쉽게(꽁으로, 몰래) 쓰게 하고 싶지 않을 수 있습니다. 고생이 클수록 더하겠지요. 또는 데이터의 성격상 관련자외에는 봐서는 안될수도 있고, 보는 것 까지는 문제가 안되는데 입력은 제한된 사용자만이 가능해야하는 (책임문제…)제한이 필요할 수도 있겠지요. 어떻게 하면 좋을까요? Microsoft Access 에서는 데이터베이스 보안 유지 방법으로 데이터베이스 열기에 대한 암호나 사용자 수준 보안을 설정하는 두 가지 방법을 제공합니다. 이 방법으로 데이터베이스에서 사용자가 액세스하거나 변경할 수 있는 부분을 제한할 수 있습니다. 이 방법 외에도, 데이터베이스에서 편집 가능한 Visual Basic 코드를 삭제해 데이터베이스를 MDE 파일로 저장하여 폼, 보고서 및 모듈의 디자인을 수정하지 못하게 할수있습니다.

1) 데이터베이스 암호 설정

가장 간단한 방법은 데이터베이스 열기 암호를 설정하는 것입니다. 암호를 설정하면 데이터베이스를 열 때마다 암호 입력 대화 상자가 나타나 올바른 암호를 입력해야 데이터베이스를 열 수 있습니다. 이 방법은 직접 데이터베이스 파일을 읽어서 사용할 수 있도록 암호를 코드화하므로 안전하지만 데이터베이스 열기에만 적용될 수 있습니다. 일단 데이터베이스가 열리면 모든 사용자가 데이터베이스의 모든 개체를 사용할 수 있습니다. (물론 사용자 수준 보안이 정의되어 있지 않은 경우입니다. 사용자 수준 보안에 대해서는 뒤에서 설명합니다.) 소규모의 사용자 그룹에서 공유하는 데이터베이스나 개인 컴퓨터에서 쓰이는 데이터베이스에 대해서는 보통 암호 설정만으로도 충분합니다.

주의! 데이터베이스를 복제하려면 암호를 사용하지 않도록 합니다. 암호를 지정하고 나면 복제된

데이터베이스를 동기화할 수 없습니다.

암호설정/해제

1. 메뉴의 [파일]-[열기]를 실행합니다.2. 데이터베이스 파일을 선택한후, '단독' 기능을 선택한후 '열기'합니다.

작성일: 5/18/2023 페이지: 75/92

액세스 프로그래밍 강좌

3. [도구]-[보안]-[데이터베이스 암호 설정(D)…]을 클릭합니다.4. '암호'를 입력하고, 동일하게 '확인'란에도 입력합니다.

5. 열려있는 데이터베이스를 닫은후, 다시 열고자 할때는 데이터베이스를 만든

사용자인지 복사해서 사용하는 사용자인지 구분하지 않고 무조건 암호가 일치해야만 데이터베이스가 열립니다. 단, 데이탐베이스가 열리면 모든 개체에 대한 작업은 제한없이 모든 권한을 갖습니다.

6. 데이터베이스의 암호를 삭제하려면, 일단은 데이터베이스에 암호를 입력할때와 동일하게 '단독' 모드로 열기하고 '암호'를 입력하여 데이터베이스를 연후, [도구]-[보안]-[데이터베이스 암호삭제(D)…]을 클릭한후, 설정한 암호를 입력하면 삭제됩니다.

2) 액세스 사용자수준 보안

사용자수준 보안은 데이터베이스를 보안하는 가장 포괄적인 방법으로, 사용자는 Microsoft Access 를 시작할 때 사용자 ID 를 입력하고 암호를 입력해야 합니다. 작업 그룹 정보 파일에서 사용자들은 그룹의 회원으로 인식됩니다. Microsoft Access 는 관리자(Admins 그룹)와 사용자(Users 그룹)의 두 그룹을 기본으로 제공하며 추가 그룹을 정의할 수도 있습니다.그룹 및 사용자는 데이터베이스 개체 사용 조절에 대한 권한을 가집니다. 예를 들어, Users

작성일: 5/18/2023 페이지: 76/92

액세스 프로그래밍 강좌

그룹 회원은 Customers 테이블에서 데이터를 보거나 입력하거나 수정할 수 있지만 테이블의 디자인을 바꾸지는 못할 수 있습니다. Users 그룹은 주문 데이터가 들어있는 테이블에서는 데이터 보기만 할 수 있고 Payroll 테이블은 전혀 사용할 수 없을 수도 있습니다. Admins 그룹의 회원들은 데이터베이스의 모든 개체에 대해 모든 권한을 갖습니다. 고유의 그룹 계정을 만들고 각 그룹에 적절한 권한을 할당한 다음 사용자를 추가하여 컨트롤을 더 정교하게 설정할 수 있습니다.

사용자 수준 보안을 사용하는 3 가지 중요한 이유는 다음과 같습니다.

사용자 코드의 지적 재산권을 보호합니다. 사용자가 자기도 모르게 코드나 개체를 변경하여 응용 프로그램이 중단되는 것을

방지합니다. 데이터베이스에서 손상되기 쉬운 데이터를 보호합니다.

실습) 교육생이 만든 데이터 베이스 파일 PD_SAMP 파일을 교육생이름으로 저장합니다. 사용자는 '교육생 본인'과 '홍길동' 두 사용자로만 제한하며, '홍길동' 사용자에게는 '전화번호부' 폼만을 읽을 수만 있도록(추가/수정/삭제 제한) 제한합니다.

사용자수준 보안 설정

1. [도구]-[보안]-[사용자 및 그룹 계정(A)…]을 선택합니다. Access 를 설치한 후 새로운

사용자나 그룹을 추가하지 않았다면, 기본으로 Access 의 사용자는 'Admin' 으로 설정되며 'Admin' 이라는 이름의 사용자는 Access 에 등록된 그룹탭에 있는 'Admins', 'Users' 그룹중에서 '회원'탭에 있는 'Admins', 'Users' 그룹의 회원임을 나타내는 화면이 나옵니다.

작성일: 5/18/2023 페이지: 77/92

사용자 이름

Access 에 등록된 그룹들

사 용 자 Admin 이 속해있는 그룹들

액세스 프로그래밍 강좌

2. Access 를 사용하는 사용자는 무조건 모든 권한을 가지는 'Admin'이란 이름의 사용자로

자동 로그인 되므로, '교육생 본인' 이 Access 프로그램의 모든 권한을 가질수있도록 사용자 등록을 합니다. 사용자탭에서 '새 사용자' 버튼을 누르면 새 사용자의 '이름'과 '개인 ID'를 입력하는 화면이 나타납니다. 로그인 할 때 사용할 이름을 입력하시고, 개인 ID 는 작업그룹의 사용자나 그룹을 식별하기위해 사용하는 4~20 까지의 문자길이의 대소문자구분 영문 및 숫자를 조합한 문자열을 입력할 수 있습니다. 저는 여기에 제이름 '한윤희'를 사용자 이름으로 '관리자_100'을 개인 ID 로 입력했습니다. 여러분은 여러분의 이름으로 사용자이름을 작성하시면 됩니다.

3. 그룹탭에서 'Admins'를 선택한 후 '추가(D) >>' 버튼을 눌러 사용자 '한윤희'를 'Admins'

그룹에 추가시켜 모든 권한을 가지게 했습니다.

4. 새로운 데이터베이스 관리자 '한윤희'로 로그온 하기위해 로그온 화면이

나타나게하려면, '로그온 암호변경'탭에 'Admin' 사용자에게 로그온 암호를 입력해야 합니다. 처음사용시 이전 암호는 없으므로 탭키로 지나가고, '새암호'를 입력한 후 동일하게 '확인'란에 입력한 암호를 반복합니다. 그리고, 사용자 등록을 변경하지 않은경우 누구나 Admins 그룹의 모든 권한을 가지는 'Admin' 사용자 이름으로 Access 를 사용하게되므로, 새로운 데이터베이스 사용자로 등록된

작성일: 5/18/2023 페이지: 78/92

액세스 프로그래밍 강좌

(제 경우로) '한윤희' 사용자만 Admins 그룹권한을 주고, 'Admin' 사용자에게서 Admins 그룹권한을 제거합니다.

5. Access 를 종료한 후, 다시 Access 를 실행합니다. 'Admin' 사용자의 이름을 지우고 새로운

데이터베이스 관리자 '한윤희'로 로그온합니다.

6. 교육생이름의 파일을 연후, [도구]-[보안]-[사용자 및 그룹계정] 을 선택한 후, '로그온

암호변경' 탭을 보면 Access 의 로그온이 새로운 사용자로 되어있게됩니다.

7. 현재 데이터베이스 관리자는 새로등록한 사용자 '한윤희' 입니다. 새로운 사용자 '

홍길동'을 새 사용자 등록합니다. 새로 등록된 사용자는 기본으로 'Users'그룹의 회원이 됩니다.

작성일: 5/18/2023 페이지: 79/92

액세스 프로그래밍 강좌

8. 사용자의 추가 등록은 동일한 방법으로 하면 됩니다. 이제 공유해서 사용할 대상 데이터베이스의 공유할 수 있는 '보안 데이터베이스'를 작성해야합니다. [도구]-[보안]-[사용자수준 보안마법사(W)…]를 실행합니다. 보안을 설정할 개체를 선택한 후, '확인'버튼을 누릅니다.

9. 새로 작성될 '보안 데이터베이스'의 이름이 기존 데이터베이스의 이름 앞에 자동으로 '보안'을 붙여 만듭니다. 원래의 데이터베이스 '한윤희.mdb'는 잘 보관하고 있고, '보안한윤희' 데이터베이스는 공유해서 사용하면 되겠지요. '저장'버튼을 누릅니다.

9. 기본정렬순서로 작성된다는 메시지박스가 나타나고 '확인'을 선택하면, 새로운 보안 데이터베이스가 저장되고 보안이 되었다는 메시지와 누구에게 권한이 있는지를 설명하는 메시지박스가 나타납니다.

작성일: 5/18/2023 페이지: 80/92

액세스 프로그래밍 강좌

10. 기존의 비보안 데이터베이스화일은 닫기하고, 보안데이타베이스 파일을 열기합니다.

[도구]-[보안]-[사용자 및 그룹권한] 을 선택한후 관리자 권한을 부여받은 새로운 사용자 ( 여기서는 교육생 본인…)의 이름을 선택한후, '개체형식' 콤보박스에서 '데이터베이스'를 선택하면 '권한'탭에 '열기/실행'과 '관리' 권한이 있는 것을 볼 수 있습니다. '단독으로 열기'하면 공유할 수 없겠지요? . '개체형식'의 다른 개체들 폼, 테이블등을 봐도 관리권한 사용자에게는 모든 권한이있는 것을 확인할 수 있습니다.

11. 이제 우리는 사용자 '홍길동' 에게 보안데이타베이스의 개체중 딱! 하나. '전화번호부'

폼을 열어서 읽을수있게 해야겠지요 먼저 '홍길동' 사용자를 선택한후, 개체형식 탭에서 '데이터베이스'를 선택한 후, '열기/실행' 권한을 부여한 후 '적용' 을 누릅니다.다시 이번엔, '개체형식' 에서 '폼'을 선택한 후, '개체이름' 리스트 박스에서 '전화번호부' 폼을 선택한 후 '적용'을 누릅니다.이젠 마지막으로, 폼에 사용된 테이블인 '전화번호부'와 '개인관계' 의 사용권한을 부여해야죠. '개체이름'탭에서 '테이블'을 선택합니다. '개체이름' 리스트박스에 나열된 테이블을 여러 개 선택하려면 컨트롤(CTRL)키를 누른상태에서 마우스왼쪽클릭하면 됩니다. '전화번호부'와 '개인관계'를 선택한후, '데이터읽기' 권한을 선택하면 함께 지정되어야할 ' 디자인읽기'가 자동 지정됩니다. 끝.

<데이터베이스 권한 적용 > < 폼 권한 적용 >

작성일: 5/18/2023 페이지: 81/92

액세스 프로그래밍 강좌

< 테이블 권한 적용 >

12. 자. 함께 쓸 사용자가 네트워크 상의 어디에 있는 사용자 인지 알 필요는 없겠죠.보안데이타베이스 파일이 있는 디렉토리를 공유(읽기/쓰기)시켜 놓고, '쓰세요' 하시면 되겠지요? ( 같은 레코드를 동시에 함께 고치려고 할 경우는 어떻게 해야죠? 이것도 보안인가요? 이문제는 Locking 의 문제이겠지요. 다음 강좌에서 봐요……)

작성일: 5/18/2023 페이지: 82/92

액세스 프로그래밍 강좌

강좌 6. 기타

1) 사용빈도 높은 함수

[메뉴]-[도움말]-[목차와색인]을 선택한후, '색인'탭에서 찾고자하는 명령기능 또는 함수명등을 입력하면 관련한 내용들이 나타나고 설명과 예제의 도움을 받을 수 있습니다.

DateDiff

DateDiff("y", [OrderDate], [ShippedDate])

yyyy 연도

q 분기

m 월

y 연중 일자

지정된 두 날짜 간의 시간 간격(차이)을 의미하는 값을 반환

DateAdd DateAdd("d", 30, [OrderDate])특정 시간 간격을 포함(더한)한 Variant (Date) 값을 반환

Dsum DSum("[Freight]", "Orders", "[ShipCity] = '춘천시'")DSum 함수는 특정 레코드 집합(도메인)의 합계를 계산

Dcount DCount("[OrderID]", "Orders", "[ShipRegion] = 'CA'")

DCount 함수는 지정된 레코드 집합(도메인)에 있는 레코드의 개수를 셉니다

DmaxDmin

DMax("[Freight]", "Orders", "[ShipCity] = '부천시'")테이블이나 질의등의 필드의 최대값,최소값을 구할때

FormatFormat(Date, "Long Date")

Format(5459.4, "##,##0.00") "5,459.40"을 반환

Format(Now, “yyyy.mm.dd”)

다음은 Format 이라는 함수를 사용하여 주어진 값을 사용자들이 원하는 나름대로의 형식으로 변환

CdblCintCstrAsc

MyDouble = 2345.5678

MyInt = CInt(MyDouble) ' MyInt = 2346

필드값의 TYPE 을 변환할때 많이 사용

IsEmptyIsNullIsType IsNumeric

Isnull() 은 식이 유효한 데이터를 전혀 포함하지

않는지를 (Null) 나타내는 Boolean 값을 반환

필드의 TYPE 및 NULL 이냐 비워있냐등을 체크할 때사용

Len Dim MyString 문자열 내 문자 수 또는 변수를

작성일: 5/18/2023 페이지: 83/92

액세스 프로그래밍 강좌

MyString = "Hello World" ' 변수 초기화.

MyLen = Len(MyString) ' 11 을 반환합니다.

저장하는 데 필요한 바이트 수를 Long 값으로 반환

LeftRightMid

BA-7893-R12 Left([PartID],2) BA

BA-7893-R12 Right([PartID],3) R12

BA-7893-R12 Mid([PartID],4,4) 7893

문자열 좌측부터 지정된 수 만큼의 문자를 Variant (String)값으로 반환

작성일: 5/18/2023 페이지: 84/92

액세스 프로그래밍 강좌

2) Oracle 데이터를 ACCESS 에 가져오려면…1. 사용자 DSN 추가

Widow95 의 화면 하단 메뉴표시줄의 [시작]-[설정]-[제어판]을 선택한후, 아이콘을

클릭하면 위의 화면이 나옵니다. DataSourceName 은 사용자가 입력하며, SQL*Net Connect String 은 접속하려는 서버의 이름을, UserID 는 서버를 사용할 권한이 있는 UserID 를 입력합니다.

2. 액세스를 실행하여 데이터베이스화일을 연후, 데이터베이스창의 테이블탭을 선택한후,

'새로만들기' 를 누릅니다. '테이블 가져오기' 를 선택한후, ' 파일형식' 에서 ' ODBC데이타베이스' 를 선택합니다. '데이터원본선택창'에서 '시스템데이터원본'탭을 선택한 후,

1 에서 만든 'hyh'를 선택합니다.

작성일: 5/18/2023 페이지: 85/92

사용자가 만든 이름 : HYH

서버 이름 : CPMIS

사용자 ID : KOPEC

액세스 프로그래밍 강좌

4. Oracle 서버 CPMIS 에 UserID 'kopec'으로 Logon 합니다.이때, Password 를 입력합니다.

5. Login 이 되었다면, 테이블 목록이 나타나며 가져올 테이블을 선택합니다.

6. '데이터베이스창'의 '테이블'탭에 추가된 테이블을 확인합니다.

작성일: 5/18/2023 페이지: 86/92

액세스 프로그래밍 강좌

3) 외부화일 사용하기

SQL 문에서 Access 데이터베이스 외부에 물리적으로 위치한 데이터 소스를 참조하기 위한 세가지 방법이 있습니다.

1. 링크 테이블을 사용합니다.

Dim dbMydb as Database, tdbLink as TableDefSet dbMydb = OpenDatabase("Mydb.mdb")Set tbdLink = dbMydb.createtabledef("Linked Foxpro Table")TdbLink.Connect ="FoxPro 2.6; DATABASE =\\Foxpro Table")TdbLink.SourceTableName ="Accounts"DbMydb.TableDefs.Append tdbLink

2. 외부테이블에 대한 직접 참조를 사용합니다.

Public sub openfoxprotable()Dim dbFox as Database, recAccounts as recordsetSet dbFox = OpenDatabase("\\Foxpro\Data\Ap", False ,False, "Foxpro 2.6;" )Set recAccounts = dbFox.openrecordset("Accounts")End sub

Oracle Server 에 있는 데이터 액세스

Private Sub cmdOK_Click()

Dim SQLstr As String

Dim CONstr As String

Dim dbsODBC As DATABASE

Dim rstODBC As Recordset

CONstr = "ODBC; DSN=dsn_cpmis;database=cpmis;UID=scott;PWD=tiger"

SQLstr = "select pa_sabun,pa_name from PY_MASTER where pa_sabun > '40000' "

작성일: 5/18/2023 페이지: 87/92

액세스 프로그래밍 강좌

Set dbsODBC = OpenDatabase("", False, False, CONstr)Set rstODBC = dbsODBC.OpenRecordset(SQLstr, dbOpenDynaset)

… txtsabun.Text = rstODBC.Fields("pa_sabun") …End Sub

3. IN 절 사용하기

ㅇ Access 데이터베이스

Select OrderId, OrderDate From tblOrder IN "c:\ch04\ch04.mdb" ;

ㅇ 외부 ISA M 데이터베이스

Select OrderId, OrderDateFrom tblOrder IN "" [FoxPro 3.0; DATABASE=c:\ch04\ch05;] ;

ㅇ ODBC 데이터베이스

Select OrderId, OrderDateFrom tblOrder IN "" [ODBC ; DSN = SQLPizza ; UID = Bob; ] ;

3) 디버깅 Visual Basic 에는 응용프로그램의 실행내용을 분석하는 디버깅 도구가 있습니다. 이 도구들은 오류 즉, 버그의 원인을 찾아내는데 유용하게 쓰입니다. 디버깅 도구의 사용법을 배워 보겠습니다. 버그(오류/에러)를 방지하거나 해결하는 첫째 단계는 발생할 수 있는 세가지 오류를 이해하는 것입니다.

작성일: 5/18/2023 페이지: 88/92

액세스 프로그래밍 강좌

ㅇ 컴파일 오류문장을 제대로 작성하지 않았을 경우 발생합니다. 키워드를 잘못입력하거나 문장부호를 빠뜨리거나 If 와 End if 또는 For 와 Next 같은 문장의 짝을 맞추지 않는 경우입니다. 컴파일 하는 동안이나 코드를 실행할 때 이 오류가 발생합니다.

ㅇ 실행시간 오류코드를 실행하는 동안 작업이 불가능한 문장이 나타나면 발생합니다. 불가능한 작업에대한 예로는 '0(zero) '으로 나누는 것을 들수있습니다.

ㅇ 프로그램 논리 오류프로그램 논리 오류가 있는 코드는 구문이 맞고 전체적으로 작업할 수는 있으나 실행결과가 잘못될수있습니다. Visual Basic 은 프로그램 논리오류를 감지하지 못하므로 직접 코드를 검사하고 그 결과를 분석하여 코드가 제대로 실행되었는지 확인해야 합니다.

Tip: 쉽게 디버깅할 수 있도록 코드작성 방법

ㅇ 코드를 Sub 프로시저와 Function 프로시저로 명확히 구분합니다.

ㅇ 설명을 추가합니다.(코드 분석시 도움이 됨)

ㅇ 각 모듈에 Option Explicit 문을 넣는다. 그러면 선언하지 않은 변수가 나타나면 오류메시지를 나타낸다. 가장

일반적인 오류는 변수이름을 잘못입력하기 때문에 발생합니다.

ㅇ 코드에 일관성있는 이름을 지정합니다.

Visual Basic 으로 작업시 디버그 창에서 직접 실행 창 사용

VBA 코드 행의 결과를 알려면 디버그 창에서 직접 실행 창을 사용합니다. 직접 실행 창을 사용하면 컨트롤 값, 필드 값, 속성 값을 검토할 수 있으며 식의 결과를 화면에 표시할 수 있고 변수, 필드, 속성에 새로운 값을 할당할 수 있습니다. 직접 실행 창은 문장, 메서드, Sub 프로시저, 함수프로시저를 바로 검토해 볼 수 있는 일종의 임시 저장용 기억장소 창입니다.

사용자가 작성한 함수의 실행결과 또는 수식의 결과를 보기위해

코드작성화면에서 도구 모음에서 [디버그 창] 을 눌러, 직접실행창을 사용합니다.

Debug 개체의 Print 메서드나 단축문자 물음표(?)를 사용해야 합니다. 예를 들어, 직접 실행 창에서 다음 두 행중 하나를 입력하면 FirstOfNextMonth 라는 사용자 정의 함수에 의해 되돌려지는 값을 화면에서 볼 수 있습니다.

작성일: 5/18/2023 페이지: 89/92

액세스 프로그래밍 강좌

Debug.Print FirstOfNextMonth() ? FirstOfNextMonth()

Note: 모듈창에 만들어져있는 사용자정의함수 의 내용

Function FirstofNextMonth() FirstofNextMonth = DateSerial( Year( Now) , Month( Now ) +1, 1 ) End Function

중단점을 사용하여 Visual Basic 코드의 실행을 일시 중지시키고

직접실행창을 사용합니다.

Note: 코드 실행 중에도 Debug 개체의 Print 메서드를 Visual Basic 코드에 추가하여 직접 실행 창에서 식의 결과 값을 화면에 나타나게 할 수 있습니다. 코드 실행이 완료되면 결과를 볼 수 있습니다.Microsoft Access 의 어느 창에서든지 Ctrl+G 를 누르면 직접 실행 창이 나타납니다.

1. 오류가 발생하거나, 중간결과를 보고자 하는 폼또는 프로시져를 선택합니다. 폼의경우

'디자인 보기'하여 를 선택하고, 모듈탭에 모듈의 경우 '디자인'을 선택하여 코드입력

작업 상태로 준비합니다.

2. 코드에서 Visual Basic 이 실행을 일시 멈추게 하려면 중단점을 설정합니다.

가. 먼저 모듈 창에서 삽입 포인터를 움직여 코드에서 아직 중단점으로 설정되지 않은 행을 가리킵니다.

나. 도구 모음에서 [중단점 전환] 를 누릅니다.

작성일: 5/18/2023 페이지: 90/92

액세스 프로그래밍 강좌

Note: 중단점을 해제하려면 삽입 포인터를 움직여 코드에서 중단점으로 설정된 행을 가리킨 다음 도구

모음에서 [중단점 전환] 를 누릅니다.

3. 메뉴의 [실행]-[이동/계속]을 누릅니다. 작업이 실행되다가 중단점을 설정한 코드에

이르면 실행이 일시중지됩니다. (예)에서는, 비자금폼이 실행되고 사용자가 입력란에 자료를 입력하고 추가명령버튼을 누르면 [비자금]폼을 Refresh 하는 작업까지 실행한 후, 중단점이 설정된 입력란 NaeYong 에 Null 값을 입력하는 작업에서 중단됩니다.

4. 코드의 실행결과를 확인하면서 실행하기위해 메뉴의 [디버그]메뉴옵션을 사용합니다.

(예)에서 '명령문 단위 실행 F8'를 실행하면, 중단점실행줄 다음으로 화살표가 이동되어

나타나고, 디버그창 아이콘을 누르면 코드작성화면위에 '디버그창'이 나타납니다.

실제로 NaeYong 입력란에 Null 값이 들어갔는지를 확인하려면, '조사창'탭을 선택한후, ? me.NaeYong 을 입력하고 Enter키를 누릅니다. 바로 다음줄에 결과가 나타납니다.계속해서, 한줄단위 또는 프로시저 단위로 실행하면서 결과를 확인하며, 오류의 원인을 찾습니다.

작성일: 5/18/2023 페이지: 91/92

액세스 프로그래밍 강좌

작성일: 5/18/2023 페이지: 92/92