본문으로 바로가기
바코2://#26. 아이템, 재고 관련 (5) 공급주문 폼 - 폼 구성 - 바보처럼코딩하기

바코2://#26. 아이템, 재고 관련 (5) 공급주문 폼 - 폼 구성

반응형

공급주문장 테이블과 공급주문 테이블에 맞춰서 오브젝트들을 생성해보겠습니다.

 

우선 간단하게 엑셀로 예상 발주서를 만들어 보면 원하는 방향에 필요한 것과 불필요한 것을 직관적으로 볼수 있어 이 방법을 추천드립니다.

발주서에 들어갈 내용을 엑셀로 정리해보니 필요한 것과 불필요한것이 눈에 보이는군요.

이제 테이블 필드를 이에 맞춰서 조금 수정해보겠습니다.

 

음...발주관련된 두개의 테이블을 삭제하시고 새로 만들어보겠습니다. 수정부분 설명하는게 오히려 시간이 더 걸릴것 같네요 ㅎㅎ. 빈 테이블이니 마음편하게 삭제!

 

이름이 '발주' 그리고 '발주상세' 라는 테이블을 만들겠습니다.

테이블을 필드를 작성하실때, 알아두실 점!

위의 나열된 필드보다 더 간단히 또는 더 많은 필드를 만들어서 코딩이 가능합니다만, 본 튜토리얼은 순전히 제 기준에서 적당한 정도를 찾아서 진행하고 있습니다. 테이블 구성은 개발자의 선택 여부에 따라 모습을 달리합니, 발주서 양식을 작성해보시고 정보를 어떻게 가지고 올 것인가에 대해서 고민해보시기 바랍니다. 

(최대로 축약해서 코드를 작성한다면 적은 숫자의 필드로도 구현이 가능합니다.)

 

덩달아 '공급주문'폼의 이름을 '발주'로 변경해줬습니다.

작동을 하면서 노란색 필드만 기입하면 되게 정리를 해줬습니다.

 

대략 발주폼의 형식을 위와 같이 정리했습니다. (반복해서 말씀드리지만, 위의 오브젝트는 필수요소만 모아 놓은 것이 아닙니다. 코딩 실력이 있으신분은 가급적 필요한 정보만 볼 수 있게 만드시는게 정보 전달에 더 잇점이 있습니다. 튜토리얼 진행을 위해서 제 기준에서는 생략하지만 육안으로 과정을 보이기 위해서 오브젝트를 만들어 진행하는 것들이 있으니 그 점을 염두하시면서 봐주시면, 본인 프로그램의 개발 방향을 더 넓게 보실수 있지 않을까 생각합니다.)

 

코딩을 시작하기 전에 어떠한 시나리오로 이 폼이 작동하는지 한번 점검을 해봅니다. 

 


시나리오 만들기

오브젝트와 데이터를 구분하면서 봐주세요.

0. 폼이 오픈된다.

1.

- 오늘의 날짜를 구한다. "발주일"에 넣는다.

- 발주일과 오늘의 발주갯수를 정리해서 발주번호를 생성해서 "발주번호"에 넣는다.

2. 공급자 명을 선택한다. (콤보상자 구성) 선택시 공급자 ID와 공급자명, 이 두가지의 데이터가 준비된다.

3. 2를 업데이트하면 3은 그 회사에 소속된 담당자를 출력한다. (리쿼리)

4. 모델코드를 선택하면, 아이템명과 색상명 그리고 5번중 공급가가 각각의 오브젝트 안에 채워진다.

5. 수량을 기입하면 (AfterUpdate), 소계가 구해진다. 그리고 부가세와 합계액은 코드상에서 구해서 폼에는 표출안되고 테이블에 저장된다. *폼에서 안보이고 테이블에 저장되는 예시 - 이런방법으로 오브젝트 갯수를 줄일 수 있음

6. 배송지와 배송지 담당자는 2를 선택하면 자동으로 본사주소로 불러와지고, 다른 주소로 가야할 경우를 대비해서 텍스트 상자로 비워뒀음.

7. 저장 버튼을 누르면 7번리스트가 리쿼리되고

8. 발주리스트도 업데이트가 된다.( 날짜, 업체명, 수량)


0. 발주 번호 생성

위 0번의 코드에 필요한 이벤트가 있습니다. On Load, 그리고 On Close도 코드 넣을 준비를 해주겠습니다. 우선은 아래와 같은 코드 삽입 준비를 해줬습니다. 

Option Compare Database

Private Sub Form_Close()

End Sub

Private Sub Form_Load()

End Sub


Private Sub 리스트_AfterUpdate()

End Sub

Private Sub 발주리스트_AfterUpdate()

End Sub

Private Sub 버복제_Click()

End Sub

Private Sub 버삭제_Click()

End Sub

Private Sub 버저장_Click()

End Sub

Private Sub 버초기화_Click()

End Sub

 

이제 일련번호 만들기를 써먹을 타이밍이 됐군요. 샘플 폼에서 만들어 놨던 코드를 카피해서 수정을 해보겠습니다.

(아래는 샘플폼의 코드입니다.)

'----[변환 파트]

Dim 앞자리 As String, 뒷자리 As String, 합치기 As Long

앞자리 = Format(Date, "yymmdd")

If DCount("ID", "샘플", "날짜 = #" & Date & "#") = 0 Then

뒷자리 = Format(DCount("ID", "샘플", "날짜 = #" & Date & "#") + 1, "00")

Else

뒷자리 = Format(DMax("right(시리얼,2)", "샘플", "날짜 = #" & Date & "#") + 1, "00")

End If

합치기 = CLng(앞자리 & 뒷자리)

결과 = 합치기


'----[저장 파트]

CurrentDb.Execute "insert into 샘플 (날짜,시리얼) values(#" & 입력 & "#," & 합치기 & ")", dbseechanages

아래와 같이 코드를 수정하고 폼을 열어보겠습니다. (코드를 복사해서 사용할 때 어떤 부분을 살펴봐야하는지 찾아보시면 나중에도 코드 수정하실때 필요한 부분만 보실수 있게되서 속도가 빨라집니다. 테이블명, 오브젝트명, 필드명 위주로 봐주세요. 잘 모르시겠으면 복붙 신공!)

Private Sub Form_Load()
'----[변환 파트]
발주일 = Date
Dim 앞자리 As String, 뒷자리 As String, 합치기 As Long

앞자리 = Format(Date, "yymmdd")

If DCount("ID", "발주", "발주일 = #" & Date & "#") = 0 Then

뒷자리 = Format(DCount("ID", "발주", "발주일 = #" & Date & "#") + 1, "00")

Else

뒷자리 = Format(DMax("right(발주번호,2)", "발주", "발주일 = #" & Date & "#") + 1, "00")

End If

합치기 = CLng(앞자리 & 뒷자리)

발주번호 = 합치기


'----[저장 파트]

CurrentDb.Execute "insert into 발주 (발주일,발주번호) values(#" & 발주일 & "#," & 합치기 & ")", dbseechanages
End Sub

발주번호가 정상적으로 쌓이네요.

 

이제 고민되는 부분은 폼만 열고 입력을 안하고 다시 닫는 경우, 발주번호는 이미 생성되어 있는데 이걸 어떻게 처리 할까? 입니다.

 

발주 내용이 들어가는 테이블이 2개가 있습니다. 발주 상세에는 아무것도 안적혀 있지요?

발주 상세에 발주번호가 없는 ID는 삭제를 하게끔 만들어주면 됩니다.

 

폼을 닫는 이벤트에 넣어주면, 위와 같이 내용없는 발주번호가 쌓이는 일은 없게 만들 수 있습니다.


0-1. 발주번호 자동 정리

Private Sub Form_Close()
Dim RS As DAO.Recordset
'거래입력(발주상세 내용)이 없는 발주ID를 추출해서 발주테이블에서 삭제한다.
Set RS = CurrentDb.OpenRecordset("select 발주번호 from 발주 where (발주번호 not in (select 발주번호 from 발주상세))", dbOpenDynaset, dbSeeChanges)

If RS.RecordCount Then
RS.MoveFirst
    While Not RS.EOF
    CurrentDb.Execute "Delete * from 발주 where 발주번호 = " & RS!발주번호 & "", dbSeeChanges
    RS.MoveNext
Wend

End If

RS.Close
Set RS = Nothing

End Sub

코드를 먼저 올려드렸단 이야기는...설명할게 많다는 얘기지요 ㅎㅎㅎ

위의 코드를 넣고 폼을 닫으면 발주상세에 발주내용이 없는 발주테이블의 ID들은 삭제가 됩니다.


Private Sub Form_Close()
Dim RS As DAO.Recordset '레코드셋 선언
'거래입력(발주상세 내용)이 없는 발주ID를 추출해서 발주테이블에서 삭제한다.
Set RS = CurrentDb.OpenRecordset("select 발주번호 from 발주 where (발주번호 not in (select 발주번호 from 발주상세))", dbOpenDynaset, dbSeeChanges)

 

' 레코드 셋의 select 문만 띄워 놓고 데이터를 대입하면서 설명을 드리겠습니다.

'"select 발주번호 from 발주 where (발주번호 not in (select 발주번호 from 발주상세))"

'위의 select 문은 3부분으로 나뉘며, 나뉘는 모양새는 녹색파란색을 포함하고, 노란색녹색을 포함합니다.

'A= A(B(C))

'B= B(C)

'C= C

'이런 형태입니다.

'설명의 데이터 대입을 위해서 표를 작성하겠습니다.

 

발주 테이블

ID 발주번호
1 22011201
2 22011202
3 22011203

발주상세 테이블

ID 발주번호
1 22011201

' * 코드 주석은 설명을 원활하게 하고, 이해를 돕기위해 의역 했습니다.

'C  = select 발주번호 from 발주상세 : 22011201

'B = 발주번호 not in ( C ) : 22011201이 아닌 발주번호

'A = select 발주번호 from 발주 where B : 발주테이블에서 22011201이 아닌 발주번호

'A = 22011202, 22011203

'RS에 22011202, 22011203이 담김.



If RS.RecordCount Then '만약 RS의 레코드가 있다면


RS.MoveFirst  '첫번째 레코드로 가서 
    While Not RS.EOF '레코드가 비기전까지 아래의 코드를 진행하고
    CurrentDb.Execute "Delete * from 발주 where 발주번호 = " & RS!발주번호 & "", dbSeeChanges
    RS.MoveNext '그 다음 레코드로 넘어가라
Wend  'End While loop

 

'발주테이블의 22011202 가서 지우고, 22011203 지우고, 어라? 없네 하고 끝냅니다.
End If

RS.Close
Set RS = Nothing

End Sub

'* 개인적으로 이 코드를 처음 보고 익힐 때 멋져 보였던, 여전히 지금도 멋져 보이는 코드입니다.

'ㅎㅎㅎ 이제 코드에서도 취향이 생기네요 ㅎㅎ

 


이번 포스트 처럼 이론을 곁들여 설명 하는 포스트를 지났으니,

다음 포스트는 조금 기계적이었으면 하는 바램이 입니다 ㅎㅎㅎ. 아무래도 기계적이면 좀 쉽지요 ㅎㅎ

 

이 포스트의 끝편을 따라 하실 때 즈음엔, 하나의 완성된 프로그램과 코딩의 구성이나 맥락이 머릿속에 남겨지길 바라면서 더 열심히 작성해 보겠습니다.

 

 

 

 

 

[이전 글]: 바코2://#25. 아이템, 재고 관련 (4) 공급주문 폼 - 주문 번호 생성하기

[다음 글]: 바코2://#27. 아이템, 재고 관련 (6) 공급주문 폼 - 폼 구성

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유