※ 오늘의 Daily Tip은 Crocii(최천군)님이 제공해주신 내용입니다.
콤보상자나 목록상자는 아주 똑똑하고 기특한 녀석들 입니다.
행원본에서 쿼리를 이용하여 필요한 정보를 쏙쏙 뽑아내 주니 쿼리를 잘 사용하시는 분들은 아주 이 녀석들이
아주 대견스러울 것입니다. 반면 텍스트박스는 소박하고
우직한 녀석입니다. 오로지 주는 정보만을 보여줄 뿐이지요.
그것도 욕심 없이 오직 하나의 데이터 값 만을 가질 뿐입니다.
콤보상자나 목록상자처럼 주는 대로 받아 넣는 녀석들과는 다르지요.
역설적인 표현이었습니다. 직설적으로 이야기
하자면 답답하고 요령 없는 녀석이지요. 써 먹기는
해야겠는데 할 줄 아는 것은 더하기 빼기 뿐이니…
오늘은 텍스트
박스를 교육시켜서 쓸만한 인재(?)로 거듭나게 만드는
방법을 소개 하겠습니다.
간혹 질문용 샘플 프로그램을
받아 보면 텍스트 박스가 있어야 할 자리에 목록상자가 자리를 차지하고 있는 것을 보게 됩니다.
위에 언급했듯 텍스트박스는 쿼리를 사용할 수 없어서 개발자가 원하는 정보를 찾아 주지 못하기
때문에 목록상자를 교묘히 텍스트상자로 위장 시키는 방법이지요.
하지만 이제는 그렇게 안 하셔도 됩니다.
결론부터 말씀 드리자면 텍스트박스에서도 쿼리를 사용할 수 있습니다.
먼저 도메인 함수를
소개 하겠습니다. 엑셀에서는 데이터베이스 함수라고 부르며
일반함수와 구분한 함수들이 있습니다. 앞에
D가 붙는 것이 특징이지요. 엑셀에서
데이터베이스 함수라고 부르는 것을 액세스에서는 도메인 함수라고 부릅니다.
도메인(Domain)이란 레코드의 집합,
즉 데이터 집합을 의미하며 이는 테이블 뿐 아니라 쿼리도 포함 됩니다.
쿼리도 레코드 집합이니까요.
도메인 함수의 종류를
살펴보면 다음과 같습니다.
DAvg 함수 |
DCount 함수 |
DLookup 함수 |
DFirst, DLast 함수 |
DMin, DMax 함수 |
DStDev, DStDevP 함수 |
DSum 함수 |
DVar, DVarP 함수 |
|
위에 있는 것이 전부 입니다. 또한 쾌재인 것이
쓰는 방법이 다 똑같습니다.가장 많이 쓰이는 합계 함수를
예로 들어 사용법을 설명 하겠습니다.
DSum(expr, domain[, criteria])
DSum은 더하라는 표시일 것이고 괄호 안의 내용이
수상합니다.
세 번째 단어는 대괄호로 쌓여 있군요. 이렇게 표현 식에서
대괄호로 쌓여 있는 부분은 옵션이라는 의미입니다. 즉,
해당하는 인수가 있을 수도 있고 없어도 된다는 것이지요.
차례로 보겠습니다.
Expr은 레코드 집합에서 값을 구하려고 하는,
필드 부분입니다. 필드명을 기입하시면 됩니다.
Domain은 위에서 설명한 바와 같이 레코드 집합 즉,
테이블이나 쿼리명을 써주시면 됩니다. Criteria는
조건이 들어가는 부분으로 생략하면 도메인에서 선택한 필드의 전체 합계를 구합니다.
예를 들어서 수식을
구해보겠습니다.
'판매'라는
이름의 테이블에 '고객'이라는
필드와 , '판매일'
이라는 필드와 '금액'이라는
필드가 있습니다.
이 때,
'홍길동'이라는 고객에게 판매한 총합을
구하려면?
값을 구할 필드부분은 '금액'이고
테이블의 이름은 '판매'이고,
조건은 고객이름이 홍길동인 사람 이군요.
각각의 인수는 모두 텍스트타입 이어야 합니다. 즉,
각각의 인수는 모두 큰따옴표("")로
묶어줘야 한다는 것이지요. 작은 따옴표로('')
묶어도 됩니다만 용도가 따로 있으니 되도록 큰따옴표로 묶어 주십시오.
수식으로 표현하면 이렇게 됩니다.
Dsum("금액",
"판매",
"고객
= '홍길동'")
그런데 큰따옴표,
작은따옴표 막 나오는데 정신 없군요. 큰
따옴표는 설명 드린 바와 같이 각 인수의 전체를 묶어서 문자열로 만들어 줍니다.
‘홍길동’을 감싸고 있는 작은 따옴표의 정체는
무엇일까요? 이것의 의미는
“작은 따옴표내의 문자가 변수가 아니고
‘홍길동’이라는 문자 자체이다”
라는 의미 입니다.
엑셀의
예를 잠시 들겠습니다.
엑셀에서 셀(A1)과 셀(B1)의
숫자를 더하기 위해서 다음과 같이 수식을 작성할 수 있습니다.
=A1+B1
이
때 A1과 B1이
각각의 주소에 있는 값을 담는 변수명인 것입니다. 이
수식을 이렇게 바꿔 보면 어떨까요?
="A1"+"B1"
값은
A1B1 이렇게 나오게 됩니다. 즉 따옴표
안의 문자는 변수명이 아니라 문자 그 자체라는 의미에서 따옴표를 붙여주는 것이지요.
이제 엑셀의 비쥬얼베이직 창에서 첫 번째 수식을 C1에
넣어 주려고 합니다. 아래와 같이 할 수 있습니다.
Range("C1").Fomula= "=A1+B1"
이렇게 작성하면
C1에 수식이 입력되고 두 셀을 합한 값이 나올 것입니다.
이번에는 두 번째 수식 즉, ="A1"+"B1"을
수식으로 넣어 주려면 어떻게 해야 할까요?
"="A1"+"B1"" 단순히 이와 같이
하면 에러가 납니다.
왜냐면 "="
따옴표가 앞뒤에 있어서 = 을(를)
한 문자로 인식합니다. 그리고 다음을 연결해
주는 부분이(&) 없습니다.
"+" 이것 역시 한 문자로 인식합니다.
"" 빈 문자로 인식합니다.
A1, B1은 변수부분이 되어 버렸습니다.
이럴 때 작은 따옴표가 큰따옴표 형님을 도와 줍니다.
"='A1'+'B1'"
이처럼 작성하면
"큰 따옴표 안의 작은 따옴표 부분은 다른 수식으로
들어갔을 때 변수가 되지 말고 그대로 문자로 인식해라"
라는 의미가 되는 것 입니다.
정리하면
"='A1'+'B1'"이
어느 수식의 변수로 들어가면 가장 바깥쪽의 큰 따옴표가 벗겨집니다.
그 때 ='A1'+'B1' 이부분만 남습니다.
이렇게 바깥쪽 따옴표가 벗겨질 때 작은 따옴표가
="A1"+"B1" 이렇게 새로운 따옴표의 역할을 하는 것입니다.
"고객
= '홍길동'"
이것 역시 큰 따옴표 내의
문자열이 어느 수식으로 들어갈 때, ‘홍길동’을
변수로 인식하지 말고 문자 자체로 인식하라는 의미인 것 입니다.
작은 따옴표는 큰 따옴표 두 개와 대치될 수 있습니다.
즉,
"고객
= ""홍길동"""
이와 같이 작성해도 됩니다.
A1, B1 부분을 숫자로 대체 시키면 어떻게 작성해야
할까요?
"=10+20"
숫자는 문자가 아니기 때문에 따옴표가
필요 없습니다. 마찬가지로 "금액
>= 300000" 이런 식으로
따옴표 없이 작성합니다. 날짜타입은
"판매일
>= #2002-1-1#" 이와
같이 날짜를 '#'으로
묶어 줍니다.
엑셀의
Dsum 함수와는 무엇이 다른가요? 필드부분과
데이터베이스(도메인)
부분이 서로 위치가 바뀌었습니다.
엑셀에서의 Dsum함수는
DSUM(database,field,criteria)이지요.
이제 작성한 수식을 어디가
넣어야 할까요? 텍스트상자의 컨트롤원본에 기입하시면 됩니다.
엑셀의 수식을 작성하듯 앞에 '='를 넣고
=Dsum("금액",
"판매",
"고객
= '홍길동'")
이렇게 작성하시면 됩니다.
수식을 작성할
‘컨트롤 원본’
입력란이 짧아 불편할 때는 해당 입력란에 커서를 위치시키고
Shift+F2 키를 눌러 아래와 같이 확대 창을
열어 사용 하시면 됩니다.
이제 레코드가 변할 때,
즉 주어지는 변수가 바뀔 때마다 값을 계산하여 보여주는 방법을 소개합니다.
위 그림에서 고객의 이름이
나오는 텍스트 박스의 이름이 "고객"
입니다. 고객 텍스트 박의 이름이 바뀔 때마다
해당하는 사람의 판매 총액을 구해 보지요.
=Dsum("금액",
"판매",
"고객
= '" & [고객]
& "'")
[고객] 이
부분은 현재의 폼에 있는 컨트롤(텍스트상자,
콤보상자, 목록상자등)의
이름입니다.
정식으로 표현하자면
[고객].value 입니다.
컨트롤 명 뒤에 속성 생략시 value속성이
디폴트 입니다. 즉 [고객]이라는
이름의 컨트롤의 값(value)을 받는 변수라는 것이지요.
큰 따옴표 안으로 들어가면
변수라도 문자화 되어 버리니까 &로 구분해서
잘라 줍니다.
그리고
"고객
= '" & [고객]
& "'" 이 문자열이 수식으로
들어가면 바깥쪽의 큰 따옴표 두 세트가 벗겨지고 변수에서는 실제 값,
즉 '홍길동'
나오게 됩니다. 이 때 홍길동을 변수가 아닌
문자 자체로 인식하라는 의미에서 작은 따옴표를 양쪽에 배치 해 둡니다.
작은 따옴표가 큰 따옴표 작용을 해서 홍길동이 문자로 인식됩니다.
변수안에 숫자가 있다면?
"금액
>= " &
금액
이렇게 됩니다.
어떻게 하지요?
반도 못했는데…^^ 다음 팁에 계속
이어서 하도록 하겠습니다. |