배움터  
  HOME > 배움터 > 무료강좌
무료강좌
 
액세스 연재 강좌 - 자재관리 프로젝트 , Access

● 업무 프로세스

01-04.gif(51624바이트)

자재상과 자재하 간의 연결이 되어 있습니다.

자재상의 거래처코드가 입고 및 판매과정에서 보이는 이유는 거래처에 대한 판매관리현황을 관리하기 위함이고 공정 및 완제품은 회사내부에서 결정되는 일이므로 거래처 선택을 하지 못하게 초기화면에서부터 제어하여 공정 및 완제품인 경우 거래처가 보이지 않도록 한 것입니다.

즉 입고자재는 입고처에 대한 입고품목현황을 관리하기 위함이고, 판매자재는 판매거래처에 대한 매출현황을 보기위해 거래처를 상위폼으로 연결하여 거래처별 관리가 될 수 있도록 만들었습니다. 먼저 입고관리를 설명하기 전에 검색 키에 대한 별도 폼을 주어 프로그램내에서 하나의 필드 내에서 전체를 관리될 수 있도록 SQL문을 이용하여 만들었습니다.

1. 발행일을 입력한다.
2. 발행자를 입력한다.
3. 부서코드를 입력한다.
4. 거래처코드를 입력한다.

만약 거래처코드를 모를 경우, 더블클릭하고 알고 있는 비슷한 회사명을 입력하면 관련 회사명이 나타나며 리스트 항목 중 한 회사를 클릭하면 자재상위폼에 거래처코드가 등록됩니다.

구분 : 발행일
설명 : 전표번호와 연결되어 있으며, 더블클릭시 내림차순으로 발행전표가 표시되며, 
             검색란에 날짜를 입력하면 전표검색이 가능토록 하였습니다.

● 변수를 지정하여 설명하여야 하나 변수객체지정 없이 풀어서 설명하도록 하겠습니다.

Private Sub 발행일_AfterUpdate()
Me.전표구분 = Me.전표구분1
전표구분은 초기화면에 설정된 코드값을 갖고 옵니다.
1->입고

2->공정
3->완제품
4->판매


Me.수정일 = Now()
입력폼에는 나타나지 않습니다. 화면보호를 실행시켜 차기 전산담당자가 최근에 변동된 전표를 찾아 관리할 수 있도록 만든 것입니다.

If IsNull(Me.전표번호) Or Me.전표번호 = "" Then
Me.전표번호 = Me.전표구분 & "-" & Format(Me.발행일, "yyyymmdd") & "-" & 1001 + Right(Me.일련번호, 3)
전표번호(FK) : 1- 20000101-0012 ; 전표구분 - 날짜-일련번호(4자리로변경)
즉 전표번호가 비어 있다면 위와 같은 결과 
ELSE 부문에 이외에 대한 결과값이 되도록 MSGBOX를 설정하면 좀더 완벽한 프로그램이 될 수 있습니다.

End If
End Sub

● 다음은 전표검색의 단계

Private Sub 발행일_DblClick(Cancel As Integer)
DoCmd.OpenForm "FIND", acNormal
-> FIND 폼을 열기
Forms!FIND!N = 11
FIND 폼의 필드 N에 11를 표기하시오
이것은 하나의 검색폼을 여러 항목검색이 가능토록하기 위한 구분자라고 할 수 있다.

Forms!FIND!LIST.RowSource = " SELECT 전표번호, 발행일, 전표구분 FROM 자재상위 WHERE (((자재상위.전표구분) = [Forms]![초기화면]![전표구분1])) ORDER BY 자재상위.발행일 DESC;"
위의 내역은 검색폼을 열면서 입고 과정과 같은 조건으로, 전표번호가 내림차순으로 정리되어 표기하시오
Forms!FIND!성명1.SetFocus
성명1로 이동하십시오. 아니면 DOCMD문을 이용하여 CONTROL문을 사용해도 됩니다.
End Sub

Private Sub 검색_Click()
DoCmd.ApplyFilter "", "[전표번호]= [Forms]![자재상위]![검색전표번호]"
즉, 필터의 조건식이라고 할 수 있습니다. ACFORMS간의 차이는 한번 작성한 후 속도를 측정해보면 이해하기 쉬울 것입니다.
필터를 많이 이용하는 곳은 고객관리에서 많이 이용되고 있다. 즉 ㄱ,ㄴ,ㄷ 등등에서 VBA로 작성된다.


End Sub

01-05.gif(12275바이트)

Private Sub 거래처코드_DblClick(Cancel As Integer)
DoCmd.OpenForm "FIND", acNormal
Forms!FIND!N = 12
여기서는 12로 지정
Forms!FIND!LIST.RowSource = "SELECT 거래처코드,회사이름,대표자이름,전화번호1 FROM 거래처"
거래처에 대한 거래처코드, 회사이름 등등표시
Forms!FIND!성명1.SetFocus
End Sub

Private Sub 초기화면_Click()
DoCmd.OpenForm "초기화면", acNormal
End Sub

Private Sub Command58_Click()
전부 보이기의 표기
DoCmd.ApplyFilter "", "[전표구분] = [Forms]![자재상위]![전표구분1]"
DoCmd.GoToRecord , , acLast
참조 DoCmd.ShowAllRecords-> 필터해지 하고 전제레코드를 표시합니다.
End Sub

Private Sub Form_Open(Cancel As Integer)
DoCmd.Maximize
Me.전표이름 = [Forms]![초기화면]![전표구분1] & " 자재전표"
전표이름은 전표구분1 자재전표로 표시되어 입고 자재전표,공정 자재전표 등과 같이 표시됨
End Sub

● 자재하위의 내용

Private Sub 단가_AfterUpdate()
Me.금액 = Me.단가 * Me.수량
생략
End Sub

 

Private Sub 비고_DblClick(Cancel As Integer)

03-03.gif(10979바이트)

전표구분이 1인 경우 메시지 창
If Forms!자재상위!전표구분 = 1 Then
MsgBox " 입고에선 재고를 파악할수 없도록 했습니다. 단 이유는 !!!", vbInformation, "변정한"
Else
DoCmd.OpenForm "FIND", acNormal

03-04.gif(10581바이트)

If Forms!자재상위!전표구분 = 2 Then
공정단계
Forms!FIND!N = 24
Forms!FIND!LIST.RowSource = " SELECT 자재하위.품목코드, 품목코드상위.품목상위명, Sum(IIf([전표구분]=1,[수량],0))-Sum(IIf([전표구분]=2,[수량],0)) AS [입고-공정재고수량]" _
& " FROM 품목코드상위 INNER JOIN (자재상위 INNER JOIN 자재하위 ON 자재상위.전표번호 = 자재하위.전표번호) ON 품목코드상위.품목코드 = 자재하위.품목코드" _
& " WHERE (((자재상위.발행일) <= [Forms]![자재상위]![발행일])) " _
& " GROUP BY 자재하위.품목코드, 품목코드상위.품목상위명 " _
& " HAVING (((Sum(IIf([전표구분]=1,[수량],0))-Sum(IIf([전표구분]=2,[수량],0)))>0)); "

% 필드는 품목코드, 품목명, 재고수량, 조건은 폼의 발행일 이전 전표만 표시하고, 입고-공정재고수량은 입고된 수량합계에서 공정투입합계를 차감한 수량을 표시
즉 재고 수량이 ㅇ 이상인 것만 표기하도록 하였으나 표기되기 전에 전체입고수량보다 전체 공정투입수량이 더 크지 않는 수량계산 vba를 만들면 더 효율적입니다.
중요성 : 그룹, 조건, 수식

다음은 완제품

ElseIf Forms!자재상위!전표구분 = 3 Then
Forms!FIND!N = 34
Forms!FIND!LIST.RowSource = "SELECT 자재하위.품목코드, 품목코드상위.품목상위명, Sum(IIf([전표구분]=2,[수량],0))-Sum(IIf([전표구분]=3,[수량],0)) AS [공정-완재재고수량]" _
& " FROM 품목코드상위 INNER JOIN (자재상위 INNER JOIN 자재하위 ON 자재상위.전표번호 = 자재하위.전표번호) ON 품목코드상위.품목코드 = 자재하위.품목코드" _
& " WHERE (((자재상위.발행일) <= [Forms]![자재상위]![발행일]))" _
& " GROUP BY 자재하위.품목코드, 품목코드상위.품목상위명" _
& " HAVING (((Sum(IIf([전표구분]=2,[수량],0))-Sum(IIf([전표구분]=3,[수량],0)))>0));"
% 그리고 다음줄로 변경시킬 때 실수 하는 것이 " 사용과 _ 구분자 사용 그리고 & 사용에 주의을 기울일 필요가 있습니다.

다음은 판매
ElseIf Forms!자재상위!전표구분 = 4 Then
Forms!FIND!N = 44
Forms!FIND!LIST.RowSource = "SELECT 자재하위.품목코드, 품목코드상위.품목상위명, Sum(IIf([전표구분]=3,[수량],0))-Sum(IIf([전표구분]=4,[수량],0)) AS [완재-판매재고수량]" _
& " FROM 품목코드상위 INNER JOIN (자재상위 INNER JOIN 자재하위 ON 자재상위.전표번호 = 자재하위.전표번호) ON 품목코드상위.품목코드 = 자재하위.품목코드" _
& " WHERE (((자재상위.발행일) <= [Forms]![자재상위]![발행일]))" _
& " GROUP BY 자재하위.품목코드, 품목코드상위.품목상위명" _
& " HAVING (((Sum(IIf([전표구분]=3,[수량],0))-Sum(IIf([전표구분]=4,[수량],0)))>0));"
End If
Forms!FIND!성명1.SetFocus
End If

End Sub

 

Private Sub 수량_AfterUpdate()
Me.금액 = Me.단가 * Me.수량
'ss
End Sub 

Private Sub 수량_DblClick(Cancel As Integer)
Dim aa As Integer
Dim bb As Integer
Dim cc As Integer
Dim dd As Integer
aa = Nz(DSum("수량", "자재총괄", "[전표구분]=1 and [품목코드]=Forms!자재상위!자재하위.Form!품목코드 and [발행일]<=Forms!자재상위!발행일"), 0)
nz함수는 도움말에서 참조하시기 바랍니다.
쿼리 자재총괄에서 전표구분이 입고며 폼의 발행일보다 이전 수량의 조건 합계
bb = Nz(DSum("수량", "자재총괄", "[전표구분]=2 and [품목코드]=Forms!자재상위!자재하위.Form!품목코드 and [발행일]<=Forms!자재상위!발행일"), 0)
cc = Nz(DSum("수량", "자재총괄", "[전표구분]=3 and [품목코드]=Forms!자재상위!자재하위.Form!품목코드 and [발행일]<=Forms!자재상위!발행일"), 0)
dd = Nz(DSum("수량", "자재총괄", "[전표구분]=4 and [품목코드]=Forms!자재상위!자재하위.Form!품목코드 and [발행일]<=Forms!자재상위!발행일"), 0)
MsgBox "현재 입고-공정;" & aa - bb & "개 재고, 공정-완제품;" & bb - cc & "개 재고, " _
& " 완재-판매;" & cc - dd & "개 재고", vbMsgBoxSetForeground, "변정한"
% 실은 위의 자료가 없을 시 else 를 사용하여 다른 내용을 추가 해보십시오
End Sub

Private Sub 창고코드_GotFocus()
Me.창고코드.Dropdown
End Sub

Private Sub 품목코드_DblClick(Cancel As Integer)
On Error GoTo Err_품목코드_DblClick
Me.단위.SetFocus
% 단위 필드로 포커스 이동
Dim FIND As String
FIND = "*" & [Forms]![자재상위]![자재하위].Form![품목코드] & "*"
자재상위의 자재하위폼 중 품목코드의 일부내용
DoCmd.OpenForm "FIND", acNormal
If IsNull(Me.품목코드) Or Me.품목코드 = "" Then
Forms!FIND!LIST.RowSource = " SELECT 품목코드, 품목상위명, 단가1, 단가2, 단가3, 단가4 FROM 품목코드상위 "
Else
Forms!FIND!LIST.RowSource = " SELECT 품목코드, 품목상위명, 단가1, 단가2, 단가3, 단가4 " _
& " FROM 품목코드상위 " _
& " WHERE (((품목코드) Like " & "'" & FIND & "'));"
End If

2가지의 품목코드 질의 폼으로 표시하도록 하였습니다. 
1. 품목코드에 null인 경우 전체품목코드가 표기
2. 품목코드에 일부코드를 알고 있는 경우 일부항목검색


If Forms!자재상위!전표구분 = 1 Then
Forms!FIND!N = 13
ElseIf Forms!자재상위!전표구분 = 2 Then
Forms!FIND!N = 23
ElseIf Forms!자재상위!전표구분 = 3 Then
Forms!FIND!N = 33
ElseIf Forms!자재상위!전표구분 = 4 Then
Forms!FIND!N = 43
End If
Forms!FIND.LIST.Requery
Forms!FIND!성명1.SetFocus
Exit_품목코드_DblClick:
Exit Sub
Err_품목코드_DblClick:

' MsgBox "자료이상으로 추가 이동할 수 없습니다.확인하십시요.다시 확인하세요", vbYes, "B&H DATABASE 변정한", vbOKOnly
MsgBox Err.Description
Resume Exit_품목코드_DblClick
[참조] 위 예제는 에러에 대한 생각을 하여 프로그램을 작성한 것이다.
End Sub

목차 | 이전 | 다음