※ 오늘 Daily Tip은 Crocii(최천군)님이 제공해주신
내용입니다.
오늘도 꿍수 하나 띄워 보렵니다. 얼마전 로또의 광풍이 불 때, 컴퓨터
좀 하신다는 분들은 컴퓨터를 통해 로또 분석, 예측, 행운숫자 뽑기등을 시도해 보지 않으신 분이
없을겁니다. 저처럼 시도해 보지 않은 분들이라도 적어도 생각은 해 보셨을 테지요. 일련의 레코드 집합에서
원하는 레코드를 뽑아내려면 쿼리를 이용하여 간단히 수행할 수 있습니다.
하지만 특별한 조건 없이 무작위로 몇 개의 레코드를 쿼리에서 뽑아내어 비교등에 사용하려면 쿼리만으로는
2%가 부족합니다.
액세스의 강점 중
하나라고 생각되는 점은 쿼리에서 모듈을 사용할 수 있다는 것입니다.
Crocii도 액세스 사용 초기에 혹시나 하여 사용자 함수를 쿼리에 적용했을 때, 당연하다는 듯이 결과를
보여주는 것을 보고 무척이나 놀랐던 기억이 떠오릅니다. 그 때 액세스로 못할 것이 없겠다는 생각을
들었습니다.
오늘은 이런 액세스 쿼리의 강점을 살짝만 이용하여 무작위로 필요한 수의
레코드를 뽑아내는 방법을 소개하겠습니다.
샘플로는 역시 로또의 숫자가
많이 와 닿을 듯 합니다. 테이블에서
1에서 45까지의 레코드를 생성했습니다. 테이블 이름 LottoBall
이고 필드이름은 Number 입니다.
액세스의 쿼리는
VB에서 사용되는 유용한 내장함수들을 거의 대부분 그대로 사용 가능 합니다. 이 때 사용하는 함수들은
액세스 VBA에 내장된 함수들 이겠지요.
예를 들면 모듈상에서
사용되는 Rnd() 라는 함수가 있습니다. 0부터 1사이의 실수를
컴퓨터가 임의로 생성해 내는 함수입니다. 이 함수를 쿼리에서 사용해 보면 어떤 결과가
나올까요?

위와 같이 작성하여 결과를
보면 아래와 같습니다.

아쉽게도 한번만
Rnd() 함수를 실행하여 같은 결과를 레코드마다 적용해 버렸습니다.

레코드 마다 Rnd()함수를 재 계산 하게 하기 위하여 아래와 같이 헛
계산을 한번씩 추가해도, 결과는 숫자만 바뀌었을 뿐 여전히 같은 결과를 적용해 버립니다.

레코드 마다 재 계산을 수행
시키기 위해 모듈에서 아래와 같은 사용자 정의 함수를 만듭니다.
Function rand(Num)
rand = Rnd()
End Function |

그리고 위와 같이 사용자
정의 함수를 적용시키고 결과를 보면 아래와 같이 레코드마다 재계산을 수행 했음을 알 수 있습니다.

쿼리의 디자인 보기에서
마우스 오른쪽 버튼을 클릭하고 맨 아래의 속성 항목을 클릭하면 아래와 같은 쿼리 속성창이 나타납니다.

위의 그림에 표시된 상위 값
항목에 추출하고 싶은 레코드의 숫자를 기입하십시오. 샘플에서는 6을
기입 하겠습니다. 그리고 아래 그림처럼 사용자 정의 함수에 의해 생성된 필드를 오름차순으로
정렬시키고 체크 박스를 지웠습니다.

아래와 같은 결과를
얻었습니다.

아래는 같은 쿼리를 재실행
시킨 결과 입니다.

역시나 꿍수 자체 보다는
사용한 방식들에 주목해 주시길 바랍니다. 이와 같은 방식을 응용하여
해결이 어려운 부분들을 아주 쉽게 풀어낼 수 있기 때문입니다.
|