[엑세스] 문제2. 입력 및 수정 기능 구현
하위폼
1-1. 하위폼으로 추가하기
· 하위폼과 상위폼의 사이를 클릭하여 오렌지 색이 나오도록 한 후 우클릭
> 속성시트 > 데이터 > 원본개체 및 기본 필드 연결(하위 필드 연결)
즉 두 테이블의 원본을 열어 동시에 가지는 필드를 확인함
1-2. 하위폼의 속성 설정
· 구분 선, 탐색 단추, 레코드 선택기가 표시되지 않도록 관련 속성을 설정하시오
→ 하위폼의 빈 공간(회색지대) 우클릭 > 형식에서 바꾸기
1-3. 본문 영역에서 탭이 다음 순서대로 정지하도록 관련 속성을 설정하시오
- 탭 순서 설정 방법: 본문 클릭 > 우클릭 > 탭 순서 > 드래그 해서 직접 바꾸기
속성 시트
2-1. 폼 속성
· 폼이 가동되면 커서가 Txt금액 컨트롤에 나타나 있도록 탭 정지를 위해 탭 순서를 변경하시오: 탭 인덱스 > 0부터 적기
· 폼이 열려있을 경우 다른 작업을 수행할 수 없도록 설정하시오: 모달 > (예)
· 포커스가 이동되지 않도록(=탭이 전환되지 않도록) 설정하시오: 탭 정지 > (아니오)
· Txt금액과 바운드된 값을 폼에서 수정하지 못하지만 해당 컨트롤로 포커스가 이동하시오: 잠금
· Txt금액은 활성화되지 않도록 설정하시오: 사용가능 > 아니오
· 팝업창이 보이도록 설정하시오: 팝업 > 예
· 숫자값 기준으로 소수점을 나타낼때: 형식 > 표준, 소수 자릿수 설정
· 교차 배경색 = 다른 배경색
2-2. 컨트롤 원본
· 개수를 구하는 함수: =Count(*)
· 필드가 비어있다 (빈 값(null)이 있는 경우): =isnull([필드명])
· 필드가 비어있지 않은 (빈 값(null)이 없는 경우): =not(isnull([필드명]))
· Txt강의시작시간이 오후 12시 이전이라면: [Txt강의시작시간] >= #12:00#
이벤트 프로시저
Me | 나는.명령 한다(=) "어떤 조건" | |
기준으로 정렬 | Me.OrderBy = "피자 asc(desc)" Me.OrderByOn = True |
파자를 기준으로 오름차순 조회하라 |
조건 만족 자료 추출 | Me.Filter = "조건" Me.FilterOn = True (예)나는.필터 한다(=) |
피자가 txt조회에 입력된 값과 같은 레코드만 표시하도록 설정 Me.Filter = "피자 = '" & txt조회 &"'" Me.FilterOn = True |
Me.recordsource = "Select * From 테이블명 Where 조건식(필드명=컨트롤명)" | ||
Docmd | 명령한다. | |
컨트롤로 포커스 이동 | Docmd.GoToControl “컨트롤명" | 명령한다.가라 "무엇이" |
열기 | Docmd.OpenForm "이름",보기형식,,조건식 명령한다.폼을열어라 "이름",보기형식,조건 |
보고서를 인쇄 미리보기로 여시오 Docmd.OpenReport "보고서명", acViewPreview, , " 피자 = ' " & cmb조회 & " ' " ← 문자 일 때 |
폼을 폼 보기 형태로 여시오 Docmd.OpenForm “폼이름”, , , “고객번호=” & txt고객번호 ← 숫자 일 때 |
||
닫기 | Docmd.Close | 명령한다.닫아라 |
표시 | Docmd.ApplyFilter, | 명령한다.필터를적용하라고, |
(문제) Txt프렌차이즈명 컨트롤 내에 프렌차이즈명을 입력하고 cmd검색 버튼을 클릭하면 다음 기능을 수행하도록 하시오
▶ Txt프렌차이즈명 컨트롤에 입력된 글자를 포함하는 자료들의 모든 항목을 가져오되 수량의 내림차순으로 표시하시오
ⓐ 모든 항목이므로 select 다음에는 *
ⓑ from 다음에 적을 항목은 원본테이블이므로, '치킨판매'라는 것을 직접 찾아서 확인
ⓒ where 다음에는 조건이 나와야 하는데 프렌차이즈명 = Txt프렌차이즈명에서 더 나아가 '입력된 글자를 포함하는 자료'라는 조건이 있으므로 프렌차이즈명 like "*" & Txt프렌차이즈명 & "*" > 이런 경우 강약강 강약강 공식을 사용 (큰따옴표=강, 작은따옴표=약)
ⓓ 수량의 내림차순이므로 order by 수량 desc
(정답) Me.RecordSource = "select * from 치킨판매 where 프렌차이즈명 like '*" & Txt프렌차이즈명 & "*' order by 수량 desc"
▶ 만약 프렌차이즈수 = cmb프렌차이즈명처럼 숫자=숫자였다면? (24-3)
Me.RecordSource = "select * from 치킨판매 where 프렌차이즈수 = " & Cmb프렌차이즈수
▶ Isnull(cmb조회): cmb조회 컨트롤에 조회가 선택되지 않은 경우
▶ 만약 Txt조회가 비어 있다면~ If IsNull(Txt조회) = True Then
▶ 만약 Txt조회가 비어있지 않다면~ If IsNull(Txt조회) = False Then
▶ '성적' 필드를 기준으로 내림차순인 경우
Me.OrderBy ="기준필드 desc"
Me.OrderByOn = True
(24_02_3번) 학생관리 폼의 Txt검색 컨트롤 내 학과명 을 입력하고, Cmd조회 버튼을 클릭하면 다음과 같은 기능을 수행하도록 구현하시오. Txt검색 컨트롤에 입력된 글자를 포함하는 자료들의 모든 항목을 표시하시오. <학생>, <학과> 테이블과 RECORDSOURCE, INNERJOIN을 이용하시오
Txt검색에 학과명을 입력해야 하는데 학생관리폼에는 학과명이라는 개체가 없다. 그러므로 다른 테이블에서 가져와야 한다.
원본레코드인 '학생'에는 없지만 문제에서 참고하라고 한 '학과' 테이블에는 '학과명'이 있다는 것을 확인할 수 있다.
그럼 둘을 연결해서 가져와야 한다.
▷ 힌트: INNERJOIN을 이용하라는 말은? 곧 쿼리 구문을 만들어서 복사 + 붙여넣기를 하라는 뜻
① 학생, 학과 테이블을 열어서 INNERJOIN 할 만한 "겹치는 개체"가 있는 지 확인한다. "학과코드"가 겹친다
② 쿼리만들기 > 학과코드를 INNERJOIN, 즉 연결해준다(1번 방식)
③ '학생관리' 폼의 원본은 '학생' 테이블이다. '학생관리' 폼에서 필요한 개체는 '학생'의 모든 개체와 '학과'에 있는 '학과코드'가 필요하다. (더블클릭)
④ SQL 보기에서 SELECT 학생.*, 학과.학과명 FROM 학생 INNER JOIN 학과 ON 학생.학과코드 = 학과.학과코드 (맨끝의 세미콜론 지우기)를 복사한다
⑤ 매크로를 만들어준다. 이렇게 Select문을 복붙할 때는 Me.RecordSource 구문을 사용한다.
Me.RecordSource = "Select 필드명 From 테이블 Where 조건"
Private Sub Cmd조회_Click()
Me.RecordSource = "SELECT 학생.*, 학과.학과명 FROM 학생 INNER JOIN 학과 ON 학생.학과코드 = 학과.학과코드 where 학과명 like '*" & Txt검색 & "*'"
End Sub
(문제) '도서관현황관리'폼의 Txt도서관코드를 클릭하면 다음과 같이 도서관내역관리 폼이 열리면서 '도서관현황관리' 폼을 닫히도록 프로시저를 구현하시오
> 도서관 현황관리에 클릭한 레코드의 도서관코드와 동일한 자료만이 도서관내역관리 폼에 표시되도록 지정하시오
> 도서관현황관리폼이 닫힐 때 자동으로 저장되도록 설정하시오
> Docmd.OpenForm, Close 이용
DoCmd.OpenForm "도서관내역관리", acNormal, , "도서관코드 = '" & Txt도서관코드 & "'"
DoCmd.Close acForm, "도서관현황관리", acSaveYes
(24_03) 시행일정 폼의 T시도코드를 더블클릭 시 아래와 같은 메시지 상자가 나오도록 설정하시오. 시도코드 끝자리가 1이면 특별시, 2이면 광역시, 3이면 특별자치시, 4이면 도, 5이면 특별자치도.(SELECT CASE, RIGHT 이용)
< 틀린 부분을 수정하시오 >
Private Sub T시도코드_DblClick(Cancel As Integer) Select Case Right(시도코드, 1) Case Is = 1 > T시도코드의 형식은 일반텍스트이므로 숫자라 Case "1" MsgBox 시도명 & "특별시", vbOKOnly Case Is = 2 MsgBox 시도명 & "광역시", vbOKOnly Case Is = 3 MsgBox 시도명 & "특별자치시", vbOKOnly Case Is = 4 MsgBox 시도명 & "도", vbOKOnly Case Is = 5 MsgBox 시도명 & "특별자치도", vbOKOnly End Select End Sub |
D함수
(예제) 보카로현황 폼의 'Txt개수'에는 보카로회사별 개수가 표시되도록 구현하시오. 각 레코드에는 표시된 보카로회사에 해당하는 자료의 수를 아래 예처럼 표시하시오. Dcount와 iif를 이용하되 '보카로회사자료' 테이블을 활용할 것
[표시 예 : 보카로회사 개수가 0개라면 > 보카로회사 없음, 보카로회사 개수가 2개라면 > 총 개수 : 2개]
원본자료를 확인했는데 쓸 만한 게 없다면 문제에서 참고하라고 한 테이블(보카로회사자료)을 확인한다.
한편 Dcount, 즉 개수를 구하므로 계산할 필드는 참조테이블인 보카로회사자료의 '어떠한' 개체라도 상관이 없다
(그냥 칸 자체를 세기만 하면 되니까) 보통 순번/번호처럼 순서가 바뀔 수록 1씩 커지는 자연수로 많이 한다.
'번호'라는 개체로 계산한다고 가정하자.
① "번호"
② 참고한 테이블인 "보카로회사자료"
③ 조건인데, 조건의 경우 겹치는 개체를 쓰므로 보카로현황폼과 보카로회사자료에서 겹치는 개체를 찾아본다. '보카로회사'
=Dcount("번호", "보카로회사자료", "보카로회사=Txt보카로회사")
(24_02) 총 휴가가능일은 휴가 가능일은 휴가가능일 - 휴가시작일과 휴가종료일의 차이값이다. (datediff) (예) 36 (단위:일)
(답) datediff("d", 휴가시작일, 휴가종료일)
(24_02) 제품관리 폼의 하위폼에 있는 Txt만족도평균에는 다음과 같은 평균이 나오도록 설정하시오
▶ '제품명'에 따른 '만족도점수'평균이 나오도록 하시오. DAVG
① 비교할 두 개체 제품명과 만족도 평균이 원본 레코드(제품판매리스트)에 있는 지 확인한다
② 없다면 기본폼의 원본 레코드(제품)에 두 개체가 있는 지 확인한다
③ 두 개체를 모두 가진 레코드를 찾을 수 없는 경우 두 개체를 가진 요소 혹은 "쿼리"를 직접 클릭해서 찾아야 한다
④ 상위/하위 폼에 있는 요소의 경우 콤보상자로 첫 행이 0이라서 SELECT문에 숨겨져 있는 경우가 있고
그렇지 않은 경우 "쿼리"에 있다
=DAvg("만족도점수","제품내역","제품명 = [forms]![제품관리]![txt제품명]")
(24_01) 교수담당일정 폼의 Txt교수명에는 다음 지시에 따라 교수명이 나오도록 설정하시오. 교수 테이블의 교수코드 를 참조해 그에 맞는 교수명 을 가져오시오. 단, Cmb과목코드의 행원본에는 'SELECT 과목별교수.과목코드, 과목별교수.과목명, 과목별교수.교수코드 FROM 과목별교수' 라고 적혀있는 것을 확인했다. 형식의 열너비에는 1cm;1cm;0cm이다.
실제 문제에서는 Cmb과목코드에 교수코드가 있는 것을 알려주지 않고 직접 찾아야 한다. 즉 콤보상자에 숨어있는 형태이다.
열번호, 즉 Column값은 0번지부터 시작한다. 그러므로 과목별교수.교수코드는 2번지에 있다.
=Dlookup("교수명", "교수", "교수코드 = '" & cmb과목코드.column(2)"'")
(24_03) 학생관리 폼에 Txt교육청명에는 다음 지시에 따라 교육청명이 나오도록 설정하시오
▶ 폼의 교육청코드를 교육청정보 테이블과 매칭해 관련 교육청명을 추출하시오(DLOOKUP사용) 폼 화면에는 교육청코드가 없음
학생관리 폼의 원본은 교육청별학생관리 테이블임을 확인했고, 해당 테이블에는 교육청코드가 있다.
교육청정보 테이블에는 교육청코드가 있다.
=DLookUp("교육청명","교육청정보","교육청코드 = [forms]![학생관리]![교육청코드]")
① 왜 작은따옴표로 구분하여 "교육청코드 = '" & [Forms]![학생관리]![교육청코드] & "'")로 쓰지 않는가?
작은 따옴표로 구분하는 경우는 컨트롤과 비교 할 때이다. [Forms]![학생관리]![교육청코드] 이 식은 컨트롤이 아닌 레코드 원본에 있는 필드를 끌어와 비교하기 때문에 구분기호를 사용하지 않고 전체 큰 따옴표로 묶어 줘야 한다.
② 왜 원본인 "교육청코드 = [forms]![교육청별학생관리]![교육청코드]"가 아닌가?
[forms]![폼이름]![개체명]이기 때문에 원본레코드는 들어갈 수 없다.
조건 구문
▶ 조건: 기본적으로 <예> 단추가 선택되어 있도록 설정
▶ 조건: <예>단추 클릭했을 때 저장 여부 묻지 않고 저장하고 폼 종료
a= MsgBox("내용",vbYesNo + vbDefaultButton1, "제목")
If a = vbYes Then
Docmd.Close acForm,“폼이름”,acSaveYes
End If
※ Select Case
Selet Case 식
↘ Case is = 숫자
↘ Case is < 숫자
★ Case 숫자 To 숫자
↘ Case "문자"
fn함수 = ""
Case else
fn함수 = ""
End Select
이름 있는 매크로 (메뉴 바 > 만들기 > 매크로)
매크로 이름이 지정되어있다면? 상단의 만들기탭-매크로 및 코드-매크로를 눌러 제작
매크로 이름이 없는 매크로 제작은? 매크로 작성기
(예문) '치킨관리'폼의 cmb보고서 단추를 클릭하면 다음 기능을 수행하도록 '출력' 매크로를 구현하시오
▶ '치킨현황보고서'를 인쇄미리보기 형태로 여시오
▶ 메시지상자로 "2025-01-01 오전 12:00:00 보고서를 엽니다"와 같이 현재 날짜와 시간이 출력되고
확인을 누르면 '치킨관리'폼의 txt검색에 입력된 '후라이드'에 해당하는 레코드만 보고서에 표시하도록 설정하시오
※ 메시지상자가 열리고 > 보고서가 열리는 형태
MessageBox : =Now() & " 보고서를 엽니다."
OpenReport
보고서 이름: 치킨현황보고서
보기 형식: 인쇄 미리보기
Where 조건문: [기관코드] = [forms]![봉사기관관리]![txt검색]
(24_02) '종목조회' 폼의 cmd조회를 클릭하면 다음과 기능이 적용되도록 매크로를 구현하시오
▶ 'Txt조회' 컨트롤에 입력된 글자를 포함하는 '종목명' 자료들을 표시하고 'Txt이름'으로 포커스를 이동하시오
▶ Gotocontrol, Applyfilter 이용
우클릭 > 프로시저 > 매크로 만들기
Applyfilter
Where 조건: 종목명 like "*" & [forms]![종목조회]![Txt조회] & "*"
GotoControl
컨트롤 이름: Txt이름
(예제) 학교현황의 cmb조회월 변경 시 다음과 같은 기능을 수행하도록 프로시저
- 설립일자가 cmb조회월에 입력된 월과 일치하는 항목들을 표시하고 txt관할교육청으로 포커스를 이동하시오
- recordsource, month, setfocus
Private Sub Cmb조회월_Change()
Me.RecordSource = "select * from 학교정보 where month(설립일자) = " & Cmb조회월
→ Me.RecordSource = "selct 나타나는 항목 from 원본 where 조건
나타나는 항목은 모든 항목이므로 *, 조건은 month(설립일자) = Cmb조회월
그런데 조회월은 숫자이므로 "select from where 설립일자 = " & 조회월 이렇게한다.
Txt관할교육청.SetFocus