안녕하세요 오랜만입니다.~
저번 포스트에서 (1)번 리스트에 해당하는 부분들과 하단 상세 입력부분을 정리했습니다.
오늘은 (2)번 리스트에 해당하는 부분부터 진행해보겠습니다. 코딩에 앞서 뭘 할지 잠시 생각해보겠습니다.
(2)리스트가 작동에 필요한 이벤트를 먼저 정리해야합니다.
ㄱ. (3) 공급자명 콤보상자와 연결을 해야겠군요.
ㄴ. (4) 전체 최근 기록을 볼 버튼도 필요하고
ㄷ. (2) 리스트를 클릭하면 거래 상세가 뿌려지게 해야하고
ㄹ. (3) 처음 폼을 열면 리스트를 비워서 리소스를 아끼는 것도 생각해보겠습니다.
위의 네가지를 해야하는데, 발주 폼을 열면 최근 리스트가 보이게 하는게 일하는데 조금 편하긴 합니다만, 단점으로는 폼 로딩시 데이터 규모나 이벤트 가짓수 때문에 부하가 걸릴 수도 있습니다. 오늘은 그걸 로드시 부하를 덜어서 빨리 빨리 움직이는 폼으로 가는 기능을 덜어주는 방식도 고민하면서 작성해보겠습니다.
1. 리스트를 비운채로 로딩하게 만들기
발주폼에는 이미 On Load()와 On Close()에 코드가 있습니다. 이제 이곳에 코드를 추가할 예정입니다. 저는 On load() 밑에 코드 하나를 추가하겠습니다.
Private Sub 리스트비우기()
발주리스트.RowSource = ""
발주리스트.Requery
End Sub
그리고 Form_Load()와 Form_Close()에 리스트비우기() 코드를 추가해줍니다.
*Form_Load() = On_Load() 같은 말 입니다.
Private Sub Form_Load()
발주번호만들기
리스트비우기
End Sub
Private Sub Form_Close()
없는발주서정리
리스트비우기
End Sub
폼을 열고 닫을때 리스트의 rowsource를 비워주면, 폼을 열때 빈 상태로 열게 됩니다.
보통 닫을때만 넣기도 하는데, 뭐 때문인지 가끔 인식을 못할때도 있습니다. 둘중에 하나를 지우싶다면 load()에 있는 코드를 지우시면 됩니다. 하지만 저는 둘다 넣고 하겠습니다. 전 잘 돼는걸 보여드려야 하니까요~ ㅎㅎ
중간에 아래 그림과 같은 오류가 뜨면 디버그를 누르시면(종료를 눌러도 됩니다.)
아래와 같이 나올텐데 무시하시고,
멈춤 버튼을 누르시면 됩니다.
그리고 에러처리 하나 알아보겠습니다.
On Error Resume Next
에러 나면 다음으로 이어가라; 정도입니다.
에러처리 문구는 아무때나 쓰시면 정작 중요한 에러발생시 문제가 생깁니다.
잘 알고 계시는 로직이나, 에러가 나도 별일 없을 부분에 사용해주시면 귀찮은 상황을 방지해줍니다.
Private Sub 리스트비우기()
'에러처리
On Error Resume Next
발주리스트.RowSource = ""
발주리스트.Requery
End Sub
2. 콤보상자 선택시 해당업체 발주기록 보이기
요놈을 선택하면 해당내용을 리스트에 출력하도록 코딩하겠습니다.
공급자명(콤보상자)의 After_Update()를 이용할 예정입니다.
우선 먼저 공급자명(콤보상자)의 데이터가 어떻게 들어있는지 확인해보겠습니다.
이 조합의 데이터가 공급자 ID와 업체명이 콤보 상자에 들어와있고,
우리가 작성했던 코드중 공급자 당담자 코드가 있었습니다.
'--[공급자담당자]
공급자담당자 = Null
공급자담당자.RowSource = "select ID, 담당자명, 담당자전화 from 공급담당자 where 공급자ID = " & 공급자명 & ""
공급담당자의 ID, 담당자명, 담당자전화 이렇게 3가지가 들어있네요.
이제 리스트에 집어 넣을 데이터를 살펴보겠습니다.
우선 눈으로 보고 싶은 데이터를 먼저 고르고, 그 다음 같이 따라와야하는 데이터를 골라주면 됩니다. (테이블 행의 내용을 전부 가져와서 불러 쓰는 경우는 전체를 가져오는데, 보일것만 보이면 됩니다.)
눈으로 보고 싶은 데이터는, 발주일, 공급자명 이 두가지면 될것 같네요.
그리고 나머지 데이터는 리스트에서 바로 불러오게끔 뒤에 삽입해주겠습니다.
아래의 코드중 회색은 지나치시고 아래 주황색 부분은 코드를 추가했다는 걸 보여드립니다.
Private Sub 공급자명_AfterUpdate()
'--[공급자명(ID) 변경확인]
'기존에 공급자가 있는지 확인, 수정이 (x)안되고, 새로 발행하게 유도함.
If DLookup("공급자ID", "발주", "발주번호 = " & 발주번호 & "") <> 0 Then
'같은 발주번호에 공급자ID가 있다면, 공급자ID의 기본값은 항상 0
MsgBox "이미 등록되어 있는 공급자 ID가 있습니다. 발주서를 취소하시고 새로 발행하세요"
'수정이 가능하게 하는 방법도 많습니다만, 다양한 기능을 가능하게 하다가 전산이 엉망이 되기도 합니다.
'튜토리얼 진행상 깔끔하게 기록을 유지하도록, 공급자 변경은 불가능하게 만들겠습니다.
Exit Sub
Else
'--[공급자담당자]
공급자담당자 = Null
공급자담당자.RowSource = "select ID, 담당자명, 담당자전화 from 공급담당자 where 공급자ID = " & 공급자명 & ""
'--[모델명]
모델코드 = Null
모델코드.RowSource = "select ID, 모델코드, 아이템명, 색상명, 공급단가 from 아이템 where 공급자ID = " & 공급자명 & ""
End If
Dim strSQL As String
strSQL = "select top 10 * from 발주 where 공급자ID = " & 공급자명 & " order by 발주번호 desc"
발주리스트.RowSource = strSQL
Dim strSQL As String
strSQL = "select top 10 * from 발주 where 공급자ID = " & 공급자명 & " order by 발주번호 desc"
발주리스트.RowSource = strSQL
그리고 발주리스트의 속성을 아래와 같이 변경해줍니다.
0cm;3cm;3cm;0cm;0cm;0cm;0cm;0cm;0cm;0cm;0cm;0cm;0cm
3. 예시에 사용된 Select 문의 개념설명
Dim strSQL As String
strSQL = "select top 10 * from 발주 where 공급자ID = " & 공급자명 & " order by 발주번호 desc"
발주리스트.RowSource = strSQL
1) 덩어리로 나누기
Dim strSQL As String ; strSQL이 String 형식임을 선언하고
strSQL = "select top 10 * from 발주 where 공급자ID = " & 공급자명 & " order by 발주번호 desc" ; strSQL = " " ; strSQL이 어떤 SQL문인지 내용을 적어주고
발주리스트.RowSource = strSQL ; 대상.rowsource = strSQL ; 대상의 로우소스에 strSQL을 대입한다. 라는 코드입니다.
2) 사용된 Select 문
select top 10 * from 발주 where 공급자ID = " & 공급자명 & " order by 발주번호 desc
이것도 덩어리로 나누면
Select 필요한필드 from 테이블명 where 조건 = 조건해당사항 까지가 가장 큰 틀이고,
top 10 * <---요부분은 다시 top 10 + * 로 나뉘는데,
top 10 은 해당조건중에 가장 위의 10개
* 는 아시다시피 모든 필드 입니다. 대강 이렇게 까지 알아두시고, 아래의 select 문을 어떻게 사용하는지 설명을 보시죠. (초보가 아니신분은 패스하셔도 무방합니다.)
아래와 같이 테이블이 있고, 조건을 통해 가져올때, select 문과 결과를 비교하면서 가보겠습니다.
설명을 위해서 먼저 테이블 구조와 필드명을 한번 다시 짚고 가겠습니다.
테이블은 '테이블명','필드명','데이터'로 이루어집니다.
위의 표에서
- 테이블명은 '테이블1' 이라고 가정하고,
- 필드명은 'ID','이름','점수'
- 데이터는 그 외의 부분입니다. (아래 그림 부분)
Dim strSQL as String
strSQL = "select * from ..."
리스트이름.rowsource = strSQL
select 문은 여러상황에서 사용되는데 위에서 사용했던 예를 가져와서 안의 하이라이트 부분만 변경해서 사용할 수 있음을 알려드리고, 코드가 다르면 도출되는 결과가 어떻게 달라지는 비교하면서 진행하겠습니다.
1. Select * from 테이블1 : 전체 필드를 선택했을때 ; 전체 필드를 선택하고 싶은 경우는 * 를 써줍니다.
2. select 이름 from 테이블1 : 특정 필드를 선택했을때 ; 이름 필드를 선택한 경우
3. select * from 테이블1 where 이름 = '강호동' : (where 조건절사용) 이름이 강호동인 모든 필드
4. select 이름, 점수 from 테이블1 where 이름 = '강호동' : (where 조건절사용) 이름이 강호동인 이름과 점수 필드
5. select * from 테이블1 where 점수 > 50 :(where 조건절사용) 점수가 50 이상인 모든 필드
6. select * from 테이블 where 점수 > 50 order by 점수 :(where 조건절사용) 점수가 50점 이상인 모든 필드를 오름차순으로 정렬
7. select * from 테이블 where 점수 > 50 order by 점수 desc :(where 조건절사용) 점수가 50점 이상인 모든 필드를 내림차순으로 정렬
8. select top 1 * from 테이블 where 점수 > 50 order by 점수 desc :(where 조건절사용) 점수가 50점 이상인 모든 필드를 내림차순으로 정렬 한것중에서 제일 위의것 한개
아래의 select 문에 대한 설명은 위의 차이를 비교해보시면 이해 하시리라 생각됩니다.
select top 10 * from 발주 where 공급자ID = " & 공급자명 & " order by 발주번호 desc
해석은 "발주 테이블에서 공급자ID가 공급자오브젝트에 있는 것과 같은 모든 필드를 골라내는데, 정렬은 발주번호의 내림차순으로 하고 그렇게 된 상황에서 제일 위에 1번째 부터 10개까지만 출력한다." 입니다.
이렇게 한다면 가장 최근의 발주건을 10건씩만 확인하니 시간도 적게 들고 금방 확인 할수 있겠지요?
공급자명을 선택하면 아래와 같이 10개만 나옵니다.
이제 전체 거래 기록을 보고 싶을때 필요한 버튼을 하나 만들겠습니다.
"최근기록보기" 버튼 이렇게 이름을 지어서 하나를 만들게요.
버최근기록보기_Click()에 코드를 심어주겠습니다. 이전에 사용했던 코드중에서 필요하지 않은 부분을 걷어내서 사용해보겠습니다.
[공급자명에 사용한 코드]
Dim strSQL As String
strSQL = "select top 10 * from 발주 where 공급자ID = " & 공급자명 & " order by 발주번호 desc"
발주리스트.RowSource = strSQL
[최근기록보기에 사용한 코드] : 전체 기록이니 한 20개 정도로 수정했습니다.
Dim strSQL As String
strSQL = "select top 20 * from 발주 order by 발주번호 desc"
발주리스트.RowSource = strSQL
Private Sub 버최근기록보기_Click()
Dim strSQL As String
strSQL = "select top 20 * from 발주 order by 발주번호 desc"
발주리스트.RowSource = strSQL
End Sub
작동을 시켜봤습니다.
아! 이런! 어떤 기록이 어디것인지 알수가 없네요. 그러면 리스트 사이즈를 좀 늘리고, 업체명이 보이도록 수정을 하겠습니다. 그리고 금액이 얼마 짜리 인지도 알면 좋겠군요.
필드 순서를 세어보니, 10번째와 13번째가 합계액과 수량계네요.
위에서 설정해줬던 발주리스트의 열너비를 바꾸겠습니다. 대략 9cm로 전체 폭은 바꿨고, 1.5cm를 두개 추가하면 되겠네요.
0cm;3cm;3cm;0cm;0cm;0cm;0cm;0cm;0cm;1.501cm;0cm;0cm;1.501cm
위와 같이 바꿔주고 버튼을 실행시켜주면, 아래 그림과 같이 내가 보고 싶은 것들이 나옵니다.
* 리스트의 사이즈 조정은 각자 알아서 알맞게 해주시면 될것 같습니다. (숫자만 적당히 보시면서 바꾸시면 됩니다.)
[이전 글]: 바코2://#31. 아이템, 재고 관련 (10) 공급주문 폼 - 폼 구성
[다음 글]: 바코2://#33. 아이템, 재고 관련 (12) 공급주문 폼 - 폼 구성
'바보처럼 코딩하기 > 바보처럼 코딩하기 ver.2' 카테고리의 다른 글
바코2://#33. 아이템, 재고 관련 (12) 공급주문 폼 - 폼 구성 (0) | 2022.02.24 |
---|---|
바코2://#31. 아이템, 재고 관련 (10) 공급주문 폼 - 폼 구성 (0) | 2022.02.11 |
바코2://#30. 아이템, 재고 관련 (9) 공급주문 폼 - 폼 구성 (0) | 2022.02.10 |
바코2://#29. 아이템, 재고 관련 (8) 공급주문 폼 - 폼 구성 (0) | 2022.02.07 |
바코2://#28. 아이템, 재고 관련 (7) 공급주문 폼 - 폼 구성 (0) | 2022.01.19 |