드로우홀릭 더베이직

예제 파일 다운로드: examples_20130508.zip
 
이 내용은 '액세스 2010 무작정 따라하기' 책에서 지면 관계로 다루지 못한 내용을 확장하여 기록한 것입니다. 이 내용만 보면 갑자기 이해가 안 될지도 모르겠습니다. 혹시 이 내용의 앞 부분이 궁금하다면,  '액세스 2010 무작정 따라하기'  책을 참고하기 바랍니다.

개요

<액세스 2010 무작정 따라하기> 227페이지에 보면, '작성자', '작성일시', '수정자', '수정일시'에 대한 설명이 나옵니다. 이 책을 보면  '작성자', '작성일시', '수정자', '수정일시' 필드에 대한 사용 방법이 나와 있으니 참고 바랍니다.

'작성자', '작성일시', '수정자', '수정일시'  필드를 적용한 화면은 다음 그림과 같습니다.

상위 폼인 '코드북ID', '코드북', '비고' 필드에 값이 편집되면 편집된 사람의 ID와 편집 시각이 '수정자'와 '수정일시'에 표시되므로 매우 좋습니다.

그러나 이것이 전부는 아니지요. '수정자'와 '수정일시'의 경우, 마지막 수정한 것에 대한 값만 가지고 있습니다. 만약 이 데이터가 3번 고쳐졌다면, 마지막 고쳐진 정보만 가지고 있는 셈이지요.


아주 중요한 데이터라면, 모든 수정 사항에 대한 이력을 가지고 있도록 설정하고 싶을 수도 있습니다. 그리고 그런 데이터라면, 다음 그림과 같이 표시될 것입니다.

CapPic20130507-20.jpg


앞의 그림에서, 오른쪽 위에 보면 '변경이력' 이라는 영역이 있습니다. '염기웅'이 2013-05-07 오후 9:52:58 에 처음 데이터를 추가했군요. 그리고 박판매 부장이 편집을 했고, 그 뒤로 염기웅이 두 번 더 변경한 이력을 볼 수 있습니다.


일반적인 데이터는 이렇게까지 하지 않습니다. 그러나, 아주 중요한 데이터라면 이렇게 할 필요가 있습니다. 혹은, 어떤 사원의 부서 발령 이력을 보관한다던지, 진급 사항을 보관할 때 이런 기능을 이용합니다.


이런 기능을 만들기 위해서는, 다음과 같은 기준이 필요합니다.

  1. 데이터가 추가될 때, 별도의 테이블(코드북_이력)에 데이터가 추가되었다고 기록합니다.
  2. 데이터가 변경될 때, 별도의 테이블에 데이터가 변경되었다고 기록합니다.
  3. 데이터가 삭제될 때, 별도의 테이블에 데이터가 삭제되었다고 기록합니다.
  4. 그리고 이런 작업은 모두 '자동'으로 이루어 져야 합니다.


자, 그러면 어떻게 하면 이런 기능을 만들 수 있을까요? 지금부터 한 번 알아 봅시다.

구현 개념

데이터가 추가 / 변경 / 삭제될 때, 자동으로 '코드북_이력' 테이블에 기록되어야 합니다.
'코드북_이력' 테이블은 다음 그림과 같습니다.
CapPic20130508-110.jpg

실제로 저장된 데이터는 다음과 같습니다.

CapPic20130508-130.jpg

  • 코드북ID: 어떤 코드북의 데이터인지 명시하는 필드입니다.
  • 작업: 추가 / 변경 / 삭제 중 하나입니다.
  • 변경자: 변경한 ID를 지정합니다.
  • 변경일시: 변경한 시각을 저장합니다.

이런 테이블을 만드는 작업은 그리 어려운 일이 아닙니다. 그러나 '어떻게' 이 테이블에 자동으로 기록되도록 할 수 있을까요?

다음과 같은 다양한 방법이 있을 수 있습니다.

  1. 코드북 폼에서 처리
    1. 코드북 입력폼에서 BeforeUpdate 같은 이벤트에 적절한 매크로를 부여하여 처리할 수 있습니다.
    2. 가장 간단한 방법이지만, '근본적인' 해결책은 되지 않습니다.
    3. 코드북을 엑셀로 업로드 한다거나, 다른 코드북 편집 화면에서 데이터를 처리한다거나, 테이블을 직접 열어서 편집할 때에는 이러한 사항이 자동으로 처리되지 않기 때문입니다.
  2. 테이블에서 처리
    1. 테이블 데이터 매크로를 이용하면 됩니다. (전문 용어로는 '트리거(trigger)' 라고 합니다.
    2. '삽입 후', '업데이트 후', '삭제 후' 등의 이벤트를 정의할 수 있습니다.
    3. 다소 어려운 방법이지만, '근본적인' 해결책입니다.
    4. 테이블 수준에서 정의하는 것이기 때문에, 테이블을 직접 열어서 편집하더라도 이러한 사항이 자동으로 처리됩니다.

 

여기에서는 '테이블에서 처리'하는 방법을 익혀보도록 하겠습니다.

 

만들기

1. 코드북_이력 테이블 만들기

다음 그림과 같이 '코드북_이력' 테이블을 만듭니다.

CapPic20130508-110.jpg

 

2. '변경자'를 처리하기 위해 로그온 기능 변경하기

현재 로그온한 사용자는 [TempVars]![담당자ID] 라는 수식으로 알아낼 수 있도록 되어 있습니다. 그런데, 테이블 데이터 매크로에서는 이 수식을 인식하지 못합니다. 테이블 데이터 매크로에서는 테이블에 저장된 데이터만 참조할 수 있습니다.

따라서, 로그온시 임시 변수에 로그온 정보를 기록해 놓는 것도 필요하지만, 특정 테이블에 현재 로그온한 사용자의 정보를 기록해 놓는 것이 필요합니다.

1) 로그온 테이블 만들기

로그온 테이블은 필드 하나짜리 테이블입니다. 레코드도 하나입니다. 현재 로그온한 사용자 ID를 보관하고 있는 테이블이지요.

다음 그림과 같이 테이블을 만듭니다.

CapPic20130508-140.jpg

그리고 다음 그림과 같이 데이터를 입력해 놓습니다. ('담당자ID' 필드에는 아무 값이나 입력해 놓아도 됩니다.)

CapPic20130508-160.jpg

 

2) 로그온할 때 어떤 로직을 변경해야 할까?

이제는 로그온을 할 때의 로직을 조금 변경해 보겠습니다.

다음 그림은 로그온을 할 때의 매크로입니다. (로그온 폼의 '확인' 버튼을 클릭할 때의 매크로입니다.)

CapPic20130508-180.jpg

 

이 매크로를 다음과 같이 수정해야 합니다.

CapPic20130508-170.jpg

 

물론, 지금 당장 이 작업을 할 수는 없습니다. '로그온.담당자_업데이트'라는 데이터 매크로를 아직 만들지 않았기 때문이지요.

지금은 개념을 설명하기 위한 것이라고 보면 됩니다.

 

지금 무엇을 하기 위해 이런 작업을 하고 있지요? 네. 로그온할 때, '로그온' 테이블이 현재 로그온한 사용자 ID 정보를 저장하는 작업을 하는 것입니다. 그래서 지금까지 알아본 것은 '로그온 버튼을 클릭할 때, '로그온' 테이블에 담당자ID값을 저장하는 기능을 집어 넣어야 하겠다' 라는 생각을 하면 되는 것입니다.

 

3) 로그온 로직 변경하기

자, 그러면 담당자를 업데이트 해 주는 데이터 매크로를 만들어 봅시다.

로그온 테이블의 값을 변경하는 기능을 만들어야 합니다. 테이블의 데이터를 변경하는 것은 일반 매크로로는 할 수 없습니다. 이 때 사용하는 것이 바로 데이터 매크로 입니다.

일반 매크로는 매크로만 단독으로 만들 수 있습니다. (그래서 탐색 창에서 볼 수 있죠.)

하지만, 데이터 매크로는 관련된 테이블에 만들어야 합니다. 따라서 지금과 같은 경우, 로그온 테이블에 매크로를 만들어야 합니다.

다음 그림과 같이, 로그온 테이블을 엽니다. 그리고 메뉴에서 <테이블 도구> - <테이블> - <명명된 매크로> - <명명된 매크로 만들기>를 클릭합니다.

CapPic20130508-190.jpg

 

매크로 편집창에서 다음과 같이 입력합니다. 매크로 이름은 '담당자_업데이트'으로 저장합니다.

CapPic20130508-200.jpg

이 매크로의 의미는 다음과 같습니다.

  1. 로그온 테이블을 엽니다.
  2. 현재 행의 데이터를 수정합니다. '담당자ID' 필드의 값을 매개변수인 'prm담당자' 값으로 설정합니다.

 

다음은 로그온 폼의 매크로를 수정합니다.

로그온 폼을 열고 '확인 버튼(cmdOK)'의 이벤트 중, 'On Click' 이벤트에 정의되어 있는 매크로를 다음 그림과 같이 변경합니다. (빨강색 테두리에 있는 내용만 추가하면 됩니다.)

CapPic20130508-170.jpg

 

 

잘 수정되었는지 확인해 봅니다.

  1. 파일을 닫고 다시 엽니다.
  2. 임의의 사용자로 로그온합니다.
  3. 로그온한 후 '로그온' 테이블에 제대로 값이 들어가 있는지 확인합니다.

4. '코드북_이력' 테이블 만들기

1) '코드북_이력' 테이블 만들기

다음 그림과 같이 '코드북_이력' 테이블을 만듭니다.

CapPic20130508-110.jpg

 

2) '코드북' 변경시 자동으로 '코드북_이력' 테이블에 변경 내용이 들어가도록 하기

다음 그림과 같이 '코드북' 폼을 데이터시트 보기로 엽니다.

메뉴에서 <테이블 도구> - <테이블> - <이벤트 이후> - <삽입 후>를 클릭합니다.

CapPic20130508-220.jpg

 

그리면 다음 그림과 같이 매크로 편집기가 표시됩니다. 다음 그림과 같이 매크로를 입력합니다.

CapPic20130508-210.jpg

 

이 매크로의 의미는 다음과 같습니다.

  1. '로그온' 테이블에 기록된 로그온 정보를 가져옵니다.
  2. 'var담당자ID' 라는 변수에, 1번 항목에서 가져온 정보를 기록합니다.
  3. '코드북_이력' 테이블에 새 레코드를 기록합니다.
    1. '코드북ID' 필드에는 입력된 '코드북ID' 값을 기록합니다.
      1. '삽입 후' 이벤트에서, 실제로 삽입된 값을 참조하기 위해서는 '[테이블_이름].[필드_이름]' 형식의 수식을 이용합니다.
    2. '작업' 필드에는 '추가'로 입력합니다.
    3. 이 때, '변경자' 필드는 'var담당자ID' 변수의 값을 이용합니다.

 

 

마찬가지 방법으로 '업데이트 후' 이벤트에 대해서도 다음 그림과 같이 매크로를 만듭니다.

CapPic20130508-230.jpg

  1. '업데이트 후' 이벤트에서, 변경 전 값을 참조하기 위해서는 '[Old].[필드_이름]' 형식의 수식을 이용합니다.
  2. '작업' 필드에는 '변경'으로 입력합니다.

 

마찬가지 방법으로 '삭제 후' 이벤트에 대해서도 다음 그림과 같이 매크로를 만듭니다.

CapPic20130508-240.jpg

  1. '삭제 후' 이벤트에서, 삭제된 값을 참조하기 위해서는 '[Old].[필드_이름]' 형식의 수식을 이용합니다.
  2. '작업' 필드에는 '삭제'로 입력합니다.

 

3) 기능 테스트 하기

코드북 테이블을 데이터시트 보기로 엽니다. 그리고 다음 작업을 수행하십시오.

  1. 테스트 코드북을 입력하십시오.
  2. 입력한 테스트 코드북 중, 일부 값을 변경해 보십시오.
  3. 입력한 테스트 코드북을 삭제해 보십시오.
  4. '코드북_이력' 테이블을 열어서, 이러한 작업이 기록되어 있는지 확인합니다.

정상적이라면, 다음 그림과 비슷하게 표시되어야 합니다.

CapPic20130508-260.jpg

 

4) 유의 사항

만약, '코드북_이력' 테이블에 데이터가 없거나, 특정 '작업'에 대해서 기록된 값이 없다면, 앞의 따라하기를 잘못 한 것일 수 있습니다. 이 때에는 오류 메시지를 살펴보고 문제를 해결해야 합니다.

하지만 데이터 매크로 작업은, 오류 메시지가 명시적으로 표시되지 않습니다.

데이터 매크로 작업의 오류 메시지는 다음 그림과 같이 확인할 수 있습니다.

메뉴에서 <파일> 탭을 클릭한 후, '응용 프로그램 로그 테이블 보기'를 클릭합니다.

CapPic20130508-270.jpg

 

그러면 다음 그림과 같이 로그 테이블이 표시됩니다.

CapPic20130508-280.jpg

이 로그를 보면, 어디에서 무슨 오류가 발생되었는지 확인할 수 있고, 그에 따른 처리를 할 수 있습니다.

하지만, 그 작업이 쉽지는 않겠지요?

 

5. '코드북' 폼에 변경 이력 표시하기

이제 모든 준비가 끝났습니다. 다음 그림과 같이 '코드북' 폼에 변경 이력을 표시하기만 하면 됩니다.

CapPic20130507-20.jpg

 

이것은 구체적으로 따라하기 식으로 표현하지 않아도 되겠지요?

다음과 같은 과정을 통해 만들어 보기 바랍니다.

  1. '코드북_이력' 테이블을 선택한 후 '데이터시트' 형식의 폼을 만듭니다.
  2. '코드북' 폼에 만든 데이터시트 폼을 붙입니다.

 

6. 요약

어떤 데이터가 변경이 되었을 때, 누가 언제 어떤 작업을 했는지 기록하는 것은 매우 유용한 정보입니다. 모든 데이터에 대해서 이렇게 처리하지는 않습니다만, 아주 민감한 데이터의 경우 이렇게 해 놓으면 매우 유용할 때가 있습니다.

전체적인 로직은 다음과 같습니다.

  1. 로그온 처리를 할 때, 로그온 한 사용자ID를 특수한 테이블에 기록해 놓습니다.
    1. 임시 변수를 사용하면 가장 간단하긴 합니다.
    2. 그러나, 데이터 매크로에서는 임시 변수를 인식할 수 없으므로, 테이블에 값을 저장해 놓습니다.
  2. 데이터가 변경(삽입 / 업데이트 / 삭제)될 때, '코드북_이력' 테이블에 값이 자동으로 기록되도록 합니다.
    1. 데이터 매크로를 이용하여 자동으로 기록되도록 하였습니다.

분명히, 쉬운 내용은 아닐 것입니다.

그러나 찬찬히 살펴보시고, 잘 이해한다면, 나중에 아주 좋은 테크닉이 될 것입니다.

정 어렵다면 튜터링 서비스를 이용해서 설명 요청하시기 바랍니다. 20~30분의 설명이면 완벽히 이해할 수 있을 것입니다.

 

 

추가로 한가지 더 언급하자면, 이런 방식의 로그온 처리는 다중 사용자 환경에서는 불가능합니다. 만약 데이터베이스를 공유할 때에는, '로그온' 테이블을 공유하지 마시고, 각 프로그램 파일에 존재하는 로컬 테이블로 만들어야 합니다.

 

ADP에서는 완전히 다른 방식으로 구현해야 하는데, 이는 범위가 너무 넓어지므로 다음 기회로 넘기겠습니다.

List of Articles
번호 제목 글쓴이 날짜 조회 수sort
공지 액세스-일반 길벗출판사 / 실무액세스 예제파일(64비트용) [4] 돌직구 2021-01-13 32619
공지 액세스-일반 길벗출판사 / 액세스 2013 무작정 따라하기 정오표 돌직구 2014-10-09 82383
공지 액세스-일반 길벗출판사 / 액세스 2010 무작정 따라하기 정오표 file 돌직구 2012-10-26 127549
49 MS액세스 블로그 번역 액세스(Access) 2013으로 업무용 앱을 만드는 4가지 방법 file 윈드님 2013-07-13 48784
48 SQL Server SQL Server Express 버전별 DB 용량 1 돌직구 2013-05-30 47100
47 액세스-일반 한/영 자동 전환 (IME 모드 속성) file 돌직구 2013-04-12 44198
» 액세스-일반 작성자, 작성일시, 수정자, 수정일시 이력 관리 file 돌직구 2012-05-16 43861
45 MS액세스 블로그 번역 액세스(Access) 2013 웹 앱 만들기 file 윈드님 2013-04-18 41246
44 액세스-일반 액세스에서 자주 사용하는 함수 file 돌직구 2015-07-13 39292
43 MS액세스 블로그 번역 액세스(Access) 2013 과 SQL 서버(SQL Server) file 윈드님 2013-05-13 37059
42 ADP 대용량 해결하기 및 ADP 알아보기 file 돌직구 2014-09-14 34173
41 IT일반 Windows 8에서 드래그 & 드롭이 되지 않을 때 file 윈드님 2013-09-12 33859
40 ADP ADP(Access Data Projects)란 무엇인가? file 돌직구 2012-03-29 33785
39 액세스-일반 액세스 제대로 배우기 돌직구 2021-07-21 32947
38 MS액세스 블로그 번역 쉬운 데이터 입력 file 윈드님 2013-06-18 30914
37 IT일반 우편번호 DB 2014-03-07, 도로명 주소 포함 돌직구 2014-03-12 29876
36 액세스-일반 테이블에 계산 필드 만들기 file 돌직구 2012-03-30 26007
35 IT일반 Dropbox 동기화 vs. SkyDrive Pro 동기화 돌직구 2013-06-06 25093
34 IT일반 맥북을 업무용으로 구입하고 싶으세요? 돌직구 2013-09-04 24288
33 액세스-DB 관리 시작 옵션 무시하지 못하도록 설정하기 file 돌직구 2012-03-31 23591
32 MS액세스 블로그 번역 액세스(Access) 테이블, 자동으로 재연결하기 file 1 윈드님 2013-05-02 22806
31 액세스-일반 '필수' 속성과 '빈 문자열 허용' 속성 알아보기 file 돌직구 2014-11-21 21053
30 MS액세스 블로그 번역 액세스(Access) 2013 소개 file 윈드님 2013-04-15 21007


  주소  12925 경기도 하남시 미사대로 540, B동 917호 (현대지식산업센터 한강미사2차) ㈜팀데이터이십일  |  고객센터 전화번호  02-467-2998  |  대표이사  염기웅
개인정보관리책임자  염기웅 (ml_privacy@td21.com)  |  사업자등록번호  120-86-79260  |  통신판매업신고번호  제 2021-경기하남-1166 호  [사업자 정보 확인]
  TD21의 사전 서면 동의 없이 TD21 사이트 일체의 정보, 콘텐츠 및 UI 등을 상업적 목적으로 전시, 전송, 스크래핑 등 무단 사용할 수 없습니다.