배움터  
  HOME > 배움터 > 무료강좌
무료강좌
 
액세스 2000, 김규경님의 데이터베이스 기초 다지기 - 5강. 필드 속성을 이용한 신뢰성 있는 자료 구축 (1) #2, Access 2000
  


5강. 필드 속성을 이용한 신뢰성 있는 자료 구축 (1) #2

필드의 데이터 형식 속성의 설정이 부적절할 때

1) 숫자를 텍스트 형식으로 설정하면…
예를 들어 < 1, 2, 3, 11, 12, 13, 101 > 와 같은 자료가 있을 때 이것이 숫자 형식이면 오름차순으로 정렬하면 < 1, 2, 3, 11, 12, 13, 101 > 입니다. 그런데 자료가 텍스트 형식이라면 < 1, 101, 11, 12, 13, 2, 3 > 순서로 정렬이 됩니다. 
따라서, 숫자로만 된 텍스트 형식의 자료가 원하는 순서로 정렬되기를 바란다면 <001, 002, 003, 011, 012, 013, 101>과 같이 문자의 길이를 동일하게 해주어야 합니다. 
숫자를 문자형식으로 사용하면서 비교할 때 초보자 분들이 가장 혼돈을 하는 부분입니다.

참고] 
문자열 비교 : 문자열의 비교는 왼쪽에서부터 오른쪽으로 한 글자씩 비교해 나갑니다. 

2) 날짜를 텍스트 형식으로 설정하면…
날짜 2000-8-4일을 날짜/시간 데이터 형식으로 저장한다면 8바이트의 크기가 됩니다. 이것을 문자열로 저장시 2001-08-04 면 10글자 크기, 20010804 또는 01-08-04 로 필드에 저장한다면 8글자, 010804 형식으로 저장한다면 6바이트가 될 겁니다. 

따라서 8바이트 크기의 날짜/시간 형식을 텍스트 형식으로 만들 때 잘못하면 2바이트를 손해보기기도 하고 2바이트를 이득보기도 합니다. 그러나 2바이트의 득을 보더라도 입력된 값이 올바른 날짜인가를 확인하는 과정이 추가되어야 합니다. 또 날짜필드의 경우 필드의 형식(Format)속성을 이용하여 그 날짜 값을 여러 가지 형식으로 보이도록 쉽게 조작할 수 있는데 그 장점도 없어지는 것입니다.

3) 날짜를 숫자로 설정한다면…
2000년 8월 4일을 숫자로 저장한다면 20000804(2천 8백4)가 될 겁니다. 이 숫자는 4바이트 크기인 long 값으로 표현할 수 있는 숫자 범위에 들어 있습니다. 따라서 4바이트 크기로 날짜에 대한 정보를 저장할 수 있어 4바이트의 이득을 보게 됩니다. 텍스트형식으로 지정한 경우보다 훨씬 이득입니다. 크기도 이득이지만 속도적인 측면에서도 이득입니다. 

그러나 역시 위에서 설명한 날짜필드의 장점을 포기해야 합니다. 따라서 날짜의 의미를 가진 경우는 가능하면 날짜 필드로 데이터 형식을 지정하도록 합니다.

그리고 많은 분들이 숫자형식의 필드에서 010804 과 같이 0으로 시작되는 값을 입력하기를 원합니다. 그러나 숫자형식에서는 앞에 나온 0은 항상 무시되므로 10804 로 저장 됩니다. 따라서 날짜를 정확하게 알아낼 수는 없습니다. 설령 가능하더라도 어차피 크기는 4바이트 입니다. 따라서 20010804 인가 010804 인가를 고민하실 이유는 없습니다.

숫자로만 구성된 자료
특별한 이유가 없는 한 필드의 데이터 형식을 숫자형식으로 설정하는 것이 좋겠습니다. 크기도 줄이고 연산 속도도 빠르고…

예를 들어 8단위의 숫자로 구성된 텍스트 형식의 코드 필드가 있을 때 입력된 자료가 '00123456'과 같다면 이 필드를 숫자로 바꾸면 4바이트 정수크기면 충분하며 이 값은 '123456'으로 저장됩니다. 이렇게 저장된 값을 Format()함수를 사용하여 '00123456'과 같이 보여주면 됩니다. 

Ctrl-G 또는 Alt-F11을 눌러 직접 실행창을 불러낸 다음 다음과 같이 물음표(?)와 함께 함수에 값을 넣고 엔터키를 쳐봅시다.

대개 이런 경우는 보고서로 출력할 때 형식을 갖추는 경우일 겁니다. 이렇게 함으로써 4 바이트 이득을 보게 됩니다.

입력마스크(InputMask) 속성
입력 마스크는 텍스트(문자열) 필드에 사용됩니다. 숫자필드에도 사용할 수 있습니다. 그러나 숫자필드에 사용하면 액세스로부터 귀찮은 메시지를 받게 됩니다.

팁] 
텍스트 필드에 입력되는 값이 일정한 형식을 가지고 있다면 입력마스크 사용을 고려한다.

InputMask 속성은 구역을 세미콜론(;)으로 구분하여 세 개까지 포함할 수 있습니다.

구 역 설 명
첫째 !(999) 999-9999와 같이 입력 마스크 자체를 지정
둘째  데이터를 입력할 때 리터럴 표시 문자가 테이블에 저장되는지를 지정합니다. 
0 : 괄호나 대시와 같은 리터럴 표시 문자는 모두 값과 함께 저장
1 또는 공백: 리터럴 문자는 저장되지 않음.
세째 반드시 문자를 입력해야 하는 자리를 표시하기 위한 문자를 지정.
어떠한 문자라도 사용가능 공백은 큰따옴표로 묶어 사용

 다음 문자를 사용하여 입력 마스크를 정의할 수 있습니다. 자주 사용하므로 프린트하여 옆에 두고 보시는 것이 좋습니다. 입력마스크는 마법사가 지원되고, 마법사내에서 설정한 내용이 원하는 바대로 되었는가 확인을 할 수도 있습니다.

문 자  설 명
0 필수 입력: 0부터 9까지의 숫자만 입력. +/- 기호는 사용할 수 없음
9 선택 입력: 숫자나 공백을 입력. +/- 기호는 사용할 수 없음
# 선택 입력: 숫자나 공백을 입력. +/- 기호는 사용할 수 있음
공백은 편집중 일 때는 빈 칸으로 표시되지만, 데이터를 저장할 때는 제거됨. 
L 필수 요소로서, A부터 Z까지의 영문자를 입력합니다.
선택 요소로서, A부터 Z까지의 영문자를 입력합니다.
A 필수 요소로서, 영문자나 숫자를 입력합니다.
a 선택 요소로서, 영문자나 숫자를 입력합니다.
필수 요소로서, 모든 문자나 공백을 입력할 수 있습니다.
선택 요소로서, 모든 문자나 공백을 입력할 수 있습니다.
. , : ; - /  소수 자릿수와 1000 단위, 날짜, 시간 등의 구분 기호. 실제 사용되는 문자는 Windows 제어판의 국가별 설정 등록 정보 대화 상자의 설정에 따름.
< 입력되는 모든 문자를 소문자로 변환.
> 입력되는 모든 문자가 대문자로 변환.
입력한 문자는 항상 왼쪽에서 오른쪽으로 채워지면서 입력됨.
\ 뒤에 나오는 문자가 리터럴 문자로 표시됨. 예를 들어, \A는 A만 표시됨.

 

참고] 
암호 입력: 속성을 "Password"라는 단어로 설정합니다. 입력된 글자는 별표(*)로 표시됩니다.
입력 마스크를 정의한 필드에 데이터를 입력하면 데이터가 항상 겹쳐 쓰기 모드로 입력됩니다. 문자를 삭제할 때 백스페이스 키를 사용하면 문자가 공백으로 바뀝니다.

입력 마스크를 정의한 필드의 텍스트를 클립보드로 옮기면, 데이터와 함께 저장되지 않도록 지정했더라도 리터럴 표시 문자가 복사됩니다.
참고]
 컨트롤이나 콤보 상자에 직접 입력한 문자에만 입력 마스크가 적용됩니다. 데이터를 가져오거나 실행 쿼리를 실행하거나 Visual Basic에서 컨트롤의 Text 속성을 설정하거나 매크로에서 SetValue 매크로 함수를 사용해 컨트롤에 문자를 입력할 때 입력 마스크가 무시됩니다.

입력 마스크를 정의한 다음, 같은 필드에 형식(Format) 속성을 설정하면 데이터가 표시될 때 형식(Format) 속성이 우선하게 됩니다. 즉, 입력 마스크를 저장했어도 데이터의 서식을 설정하거나 표시할 때 입력 마스크가 무시됩니다. 형식(Format) 속성은 데이터가 표시되는 방법에만 영향을 주므로, 원본으로 사용하는 테이블 자체의 데이터는 변경되지 않습니다.

입력마스크의 세 번째 섹션(영역)에 대하여…

입력마스크의 세번째 섹션의 설정값이 중요한 역할을 하는데 다음과 같은 이유 때문입니다. 

1) 일정한 구조로 되어 있으면서 구분문자를 가지고 있는 경우…
구분 문자를 입력하지 않아도 자동으로 입력된 상태로 만들어 줍니다.
예를 들면 123456-1234567 와 같이 일정한 형태의 주민등록 번호를 입력할 때 대시(-)기호는 항상 동일한 위치에서 입력되므로 입력을 않더라도 자동으로 입력을 해준다면 편리할 겁니다. 
     입력마스크 : 000000\-0000000;0;_
     입력한 키 : 1234561234567
     화면에 보임: 123456-1234567
     실제 저장값: 123456-1234567

2) 또 하나는 구조는 일정한데 구분문자를 가지고 있지 않는 경우…
이런 경우에는 자료를 입력할 때 혼돈이 있을 수 있습니다. 
예를 들어 사번이 20010001로 앞의 네 글자는 입사연도 나머지 4글자는 입사순서를 의미하는 구조로 만들어졌다고 할 때 입력할 때 2001-0001과 같이 화면에 보이면 훨씬 입력오류를 줄일 수 있을 겁니다. 이와 같이 자료는 일정한 형식으로 구분이 되는데 그 구분문자가 실제 데이터로 저장될 필요가 없이 단순히 단위를 구분하여 입력을 받는 경우에 쓰입니다.
     입력마스크 : 0000\-\0000;;_
     입력한 키 : 20010001 
     화면에 보임: 2001-0001
     실제 저장값: 20010001 

참고]
사번을 2001-0001과 같이 처리하는 경우와 20010001로 처리하는 경우 단순히 구분문자를 하나를 생략함으로써 1바이트의 공간절약을 하는 결과만 있지는 않습니다. 
구분문자를 제거하지 않으면 텍스트 형식으로 처리해야 하며 총 9바이트 크기를 할당해야 하지만 구분문자를 제거하면 숫자로 처리할 수 있으며 이 경우 4바이트 크기의 Long 정수면 충분하게 되어 5바이트의 이득이 있게 됩니다.
참고] 
입력마스크를 쓸 때 초보자들에게 종종 혼동을 일으키는데 이유는 구분문자를 저장하는가 하지 않는가를 확실히 정하고 입력마스크를 사용하지 않기 때문에 발생합니다.
(입력마스크마법사가 만들어 주는 기본값은 구분문자를 저장하지 않는 겁니다.)

기본값(DefaultValue) 속성
자료를 입력한 날짜(즉, 레코드가 생성된 날짜)를 레코드에 기록해 두고자 할 때나, 또는 판매관리에서는 물건을 판 내역을 정리하는 경우 날짜는 대개 오늘이므로 그러한 자료를 추가할 때 오늘 날짜가 자동으로 입력된다면 잘못 입력할 일도 없고 편할 겁니다. 그런 경우 기본값 속성을 이용합니다. 날짜/시간과 관련하여 많이 사용하는 기본값은 Date(), Time(), Now() 등의 함수를 이용해서 값을 자동 입력합니다. 또 숫자 필드에서는 최소값을 미리 설정해 둔다는가, 예/아니오 필드에서는 False(아니오)로 기본값을 설정해 둔다는가, 남녀를 입력받는 경우 주로 여자를 대상으로 하는 자료는 미리 '여'를 기본 값으로 설정해 둔다면 편리하면서도 오타로 인한 오류가 있을 확률이 줄어듭니다. 
DefaultValue 속성은 새로운 레코드를 추가할 때만 적용됩니다.

참고] 시스템의 날짜와 시간
Date(), Now(), Time() 은 시스템에서 오늘날짜를 얻어오는 함수입니다.

날짜/시간 관련 함수가 과연 어떠한 값을 돌려주는가 확인을 한번 해봅시다.
Ctrl-G를 눌러 VBA 편집환경으로 들어가서 '직접 실행' 창에 물음표 다음에 함수를 입력하고 엔터키를 눌러 함수가 돌려주는 값을 확인한다.

 

 

  목차 | 이전 | 다음