Đối với các form nhập liệu cho nhà cung cấp và khách hàng, các bạn có thể dựa theo cách thiết lập form DMHH để tạo. Xem như bây là bài tập nâng cao dành cho các bạn.
PHIẾU NHẬP HÀNG nhìn chung cũng không có gì "ghê gớm" lắm, nhưng nó có một số điều thú vị mà chúng ta sẽ khám phá.
Trước tiên chúng ta sẽ tiếnhành thiết kế giao diện cho form nhập hàng.
Form nhập hàng là một dạng Master/Detail form do đó bạn phải thiết kế 2 form, một là master form và một là detail form. Như chúng ta đã biết qua frmDMHH ở bài trước, detail form sẽ được nhúng vào master form thông qua một control có tên là Sub Form/Report.
Master form sẽ chứa dữ liệu của table phiếu nhập lý lịch và detail form sẽ chứa dữ liệu của table phiếu nhập chi tiết.
Do trong các table này, chúng ta chỉ lưu mã chứ không lưu tên (mã số nhà cung cấp, mã số hàng hóa) nên khi thiết kế chúng ta phải làm sao đó để người sử dụng có thể thấy luôn cả tên tương ứng với các mã số.
Có nhiều cách thiết kế, trong đó cách thiết kế thông dụng nhất là tạo các query select rồi sau đó lấy query này làm record source cho form.
Hoặc có thể thay đổi control textbox chứa mã sang dạng combo box, sau đó add thêm một số textbox cần thiết, để khi chọn một mã trong combo box thì trong các textbox thêm vào sẽ xuất hiện các tên tương ứng.
Cái lựa chọn thiết kế ra sao tùy theo ý thích, không có một chuẩn nào cả. Tuy nhiên ở trong bài này, tôi sẽ dùng phương pháp thiết lập các query.
Để các bạn tiện theo dõi, hãy down load các hình đính kèm.
Bước 1: Thiết lập query cho phiếu nhập lý lịch
Bước 2: Thiết lập query cho phiếu nhập chi tiết
Bước 3: Thiết kế giao diện cho phiếu nhập chi tiết
Bước 4: Thiết kế giao diện cho phiếu nhập lý lịch
THIẾT LẬP QUERY NHẬP HÀNG LÝ LỊCH:
Ở cửa sổ Database Window, bạn chọn thẻ Queries, nhắp kép Create Query in Design View. Xuất hiện cửa sổ Show Table nằm trước cửa sổ Query Design View.
Trong cửa sổ này bạn chọn hai table tblNhap_Lylich và tblDMNCC. Nhấn nút Add, sau đó Close để tắt cửa sổ Show Table.
Từ hai cửa sổ con Field List ở trên, bạn sẽ kéo biểu tượng dấu sao (*) ở tblNhap_Lylich xuống một cột phía dưới. Điềunày có nghĩa là bạn chỉ định cho Access biết rằng bạn chọn toàn bộ các field có trong table. Tiếp theo bạn kéo field tenncc ở tblDMNCC xuống cột kế bên.
Lưu query lại với tên: qrNhap_Lylich
THIẾT LẬP QUERY NHẬP HÀNG CHI TIẾT:
Ở cửa sổ Database Window, bạn chọn thẻ Queries, nhắp kép Create Query in Design View. Xuất hiện cửa sổ Show Table nằm trước cửa sổ Query Design View.
Trong cửa sổ này bạn chọn hai table tblNhap_Chitiet và tblDMHH. Nhấn nút Add, sau đó Close để tắt cửa sổ Show Table.
Từ hai cửa sổ con Field List ở trên, bạn sẽ kéo biểu tượng dấu sao (*) ở tblNhap_Chitiet xuống một cột phía dưới. Tiếp theo bạn kéo field tenhh và dvt ở tblDMHH xuống các cột kế bên.
Lưu query lại với tên: qrNhap_Chitiet
THIẾT KẾ GIAO DIỆN CHO NHẬP HÀNG CHI TIẾT:
THIẾT KẾ GIAO DIỆN CHO NHẬP HÀNG LÝ LỊCH:
Các bạn có thể down cái file word này về để xem chi tiết hơn nhé.
(Download file)
:sifone:
THIẾT LẬP CÁC ĐOẠN MÃ XỬ LÝ:
Các bạn hãy tham khảo đoạn code sau đây trước, còn một số đoạn code khác, "tinh tế" hơn sẽ được cung cấp sau:
Private Sub cmdNew_Click()
sopn.SetFocus ' Nhay den control sopn
' Neu co ton tai mot record hien hanh thi cho den record moi
If Not IsNull(sopn) Then
DoCmd.RunCommand acCmdRecordsGoToNew
End If
' Unlock detail, disable formfooter
ChangeStatus True
End Sub
[/CODE]
:sifone:
Xin sửa lại một chút, tôi có viết sai ở hai chỗ:
' Thu tuc cho thay doi trang thai cua cac control
Private Sub ChangeStatus(stat As Boolean)
Dim ctrl As Control
' Cac control detail
For Each ctrl In Detail.Controls
If TypeOf ctrl Is TextBox Or TypeOf ctrl Is SubForm Or TypeOf ctrl Is ComboBox Then
ctrl.Locked = Not stat
ElseIf TypeOf ctrl Is CommandButton Then
ctrl.Enabled = stat
End If
Next
' Cac control form footer
For Each ctrl In FormFooter.Controls
If TypeOf ctrl Is CommandButton Then
ctrl.Enabled = Not stat
End If
Next
End Sub
Private Sub cmdUndo_Click()
On Error Resume Next
DoCmd.RunCommand acCmdUndo
sopn.SetFocus
ChangeStatus False
On Error GoTo 0
End Sub
Thành thật xin lỗi.
PHIẾU NHẬP HÀNG nhìn chung cũng không có gì "ghê gớm" lắm, nhưng nó có một số điều thú vị mà chúng ta sẽ khám phá.
Trước tiên chúng ta sẽ tiếnhành thiết kế giao diện cho form nhập hàng.
Form nhập hàng là một dạng Master/Detail form do đó bạn phải thiết kế 2 form, một là master form và một là detail form. Như chúng ta đã biết qua frmDMHH ở bài trước, detail form sẽ được nhúng vào master form thông qua một control có tên là Sub Form/Report.
Master form sẽ chứa dữ liệu của table phiếu nhập lý lịch và detail form sẽ chứa dữ liệu của table phiếu nhập chi tiết.
Do trong các table này, chúng ta chỉ lưu mã chứ không lưu tên (mã số nhà cung cấp, mã số hàng hóa) nên khi thiết kế chúng ta phải làm sao đó để người sử dụng có thể thấy luôn cả tên tương ứng với các mã số.
Có nhiều cách thiết kế, trong đó cách thiết kế thông dụng nhất là tạo các query select rồi sau đó lấy query này làm record source cho form.
Hoặc có thể thay đổi control textbox chứa mã sang dạng combo box, sau đó add thêm một số textbox cần thiết, để khi chọn một mã trong combo box thì trong các textbox thêm vào sẽ xuất hiện các tên tương ứng.
Cái lựa chọn thiết kế ra sao tùy theo ý thích, không có một chuẩn nào cả. Tuy nhiên ở trong bài này, tôi sẽ dùng phương pháp thiết lập các query.
Để các bạn tiện theo dõi, hãy down load các hình đính kèm.
Bước 1: Thiết lập query cho phiếu nhập lý lịch
Bước 2: Thiết lập query cho phiếu nhập chi tiết
Bước 3: Thiết kế giao diện cho phiếu nhập chi tiết
Bước 4: Thiết kế giao diện cho phiếu nhập lý lịch
THIẾT LẬP QUERY NHẬP HÀNG LÝ LỊCH:
Ở cửa sổ Database Window, bạn chọn thẻ Queries, nhắp kép Create Query in Design View. Xuất hiện cửa sổ Show Table nằm trước cửa sổ Query Design View.
Trong cửa sổ này bạn chọn hai table tblNhap_Lylich và tblDMNCC. Nhấn nút Add, sau đó Close để tắt cửa sổ Show Table.
Từ hai cửa sổ con Field List ở trên, bạn sẽ kéo biểu tượng dấu sao (*) ở tblNhap_Lylich xuống một cột phía dưới. Điềunày có nghĩa là bạn chỉ định cho Access biết rằng bạn chọn toàn bộ các field có trong table. Tiếp theo bạn kéo field tenncc ở tblDMNCC xuống cột kế bên.
Lưu query lại với tên: qrNhap_Lylich
THIẾT LẬP QUERY NHẬP HÀNG CHI TIẾT:
Ở cửa sổ Database Window, bạn chọn thẻ Queries, nhắp kép Create Query in Design View. Xuất hiện cửa sổ Show Table nằm trước cửa sổ Query Design View.
Trong cửa sổ này bạn chọn hai table tblNhap_Chitiet và tblDMHH. Nhấn nút Add, sau đó Close để tắt cửa sổ Show Table.
Từ hai cửa sổ con Field List ở trên, bạn sẽ kéo biểu tượng dấu sao (*) ở tblNhap_Chitiet xuống một cột phía dưới. Tiếp theo bạn kéo field tenhh và dvt ở tblDMHH xuống các cột kế bên.
Lưu query lại với tên: qrNhap_Chitiet
THIẾT KẾ GIAO DIỆN CHO NHẬP HÀNG CHI TIẾT:
THIẾT KẾ GIAO DIỆN CHO NHẬP HÀNG LÝ LỊCH:
Các bạn có thể down cái file word này về để xem chi tiết hơn nhé.
(Download file)
:sifone:
THIẾT LẬP CÁC ĐOẠN MÃ XỬ LÝ:
Các bạn hãy tham khảo đoạn code sau đây trước, còn một số đoạn code khác, "tinh tế" hơn sẽ được cung cấp sau:
Mã:
[CODE]' Thu tuc cho thay doi trang thai cua cac control
Private Sub ChangeStatus(stat As Boolean)
Dim ctrl As Control
' Cac control detail
For Each ctrl In Detail.Controls
If TypeOf ctrl Is TextBox Or TypeOf ctrl Is SubForm Then
ctrl.Locked = stat
ElseIf TypeOf ctrl Is CommandButton Then
ctrl.Enabled = stat
End If
Next
' Cac control form footer
For Each ctrl In FormFooter.Controls
If TypeOf ctrl Is CommandButton Then
ctrl.Enabled = Not stat
End If
Next
End Sub
Mã:
Private Sub cmdClose_Click()
DoCmd.Close acForm, Me.Name
End Sub
Mã:
Private Sub cmdDelete_Click()
' Neu khong co record nao hien hanh thi thoat
If IsNull(sopn) Then
MsgBox "Co phieu nao dau ma xoa.", vbCritical, "Thong Bao"
Exit Sub
End If
If MsgBox("Co chac chan xoa khong vay? Xoa roi khoi lay lai nghen?", vbQuestion + vbYesNo + vbDefaultButton2, "Xac nhan xoa") = vbYes Then
sopn.SetFocus ' Nhay den control sopn
DoCmd.RunCommand acCmdDeleteRecord
End If
cmdDelete.SetFocus
End Sub
Mã:
Private Sub cmdFind_Click()
' Neu nguoi su dung khong nhap so phieu nhap thi thoi
Dim so As String
so = InputBox("Xin cho biet so phieu nhap can tim:", "Tim phieu nhap")
If so = "" Then Exit Sub
' Khai bao mot recordset
Dim rs As DAO.Recordset
Set rs = Me.RecordsetClone ' gan recordset nay = recordset cua form Nhap ly lich
' Tim xem co phieu nhap co so nhu the nay khong
rs.FindFirst "sopn = '" & so & "'"
If Not rs.NoMatch Then
' Neu tim thay thi cho hien len form
Me.Bookmark = rs.Bookmark
Else
' Neu khong thi thong bao cho nguoi ta biet
MsgBox "Khong tim thay phieu nhap co so phieu nhu tren.", vbInformation
End If
Set rs = Nothing
End Sub
Mã:
Private Sub cmdPrint_Click()
If IsNull(sopn) Then
MsgBox "Co phieu nao dau ma in.", vbCritical, "Thong Bao"
Exit Sub
End If
On Error Resume Next
DoCmd.OpenReport "rptNhap", acViewPreview, , "sopn = '" & sopn & "'"
On Error GoTo 0
End Sub
Mã:
Private Sub cmdSave_Click()
If IsNull(mancc) Then
MsgBox "Chua co nha cung cap.", vbCritical, "Thong Bao"
Exit Sub
End If
sopn.SetFocus
On Error GoTo err_cmdSave_Click
DoCmd.RunCommand acCmdSaveRecord
ChangeStatus False
exit_cmdSave_Click:
Exit Sub
err_cmdSave_Click:
Select Case Err.Number
Case 3022
MsgBox "Trung so phieu."
Case 3058
MsgBox "So Phieu de trong."
Case Else
MsgBox "Loi: " & Err.Number & Chr(13) & Err.Description
End Select
Resume exit_cmdSave_Click
End Sub
Mã:
Private Sub cmdUndo_Click()
If Not IsNull(sopn) Then
DoCmd.RunCommand acCmdUndo
End If
sopn.SetFocus
ChangeStatus False
End Sub
HTML:
' Khi xoa thi khong the thieu thu tuc su kien nay
Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer)
Response = acDataErrContinue
End Sub
Mã:
Private Sub cmdEdit_Click()
' Neu khong co record nao hien hanh thi thoat
If IsNull(sopn) Then
MsgBox "Co phieu nao dau ma sua.", vbCritical, "Thong Bao"
Exit Sub
End If
sopn.SetFocus ' Nhay den control sopn
' Unlock detail, disable formfooter
ChangeStatus True
End Sub
Private Sub cmdNew_Click()
sopn.SetFocus ' Nhay den control sopn
' Neu co ton tai mot record hien hanh thi cho den record moi
If Not IsNull(sopn) Then
DoCmd.RunCommand acCmdRecordsGoToNew
End If
' Unlock detail, disable formfooter
ChangeStatus True
End Sub
[/CODE]
:sifone:
Xin sửa lại một chút, tôi có viết sai ở hai chỗ:
' Thu tuc cho thay doi trang thai cua cac control
Private Sub ChangeStatus(stat As Boolean)
Dim ctrl As Control
' Cac control detail
For Each ctrl In Detail.Controls
If TypeOf ctrl Is TextBox Or TypeOf ctrl Is SubForm Or TypeOf ctrl Is ComboBox Then
ctrl.Locked = Not stat
ElseIf TypeOf ctrl Is CommandButton Then
ctrl.Enabled = stat
End If
Next
' Cac control form footer
For Each ctrl In FormFooter.Controls
If TypeOf ctrl Is CommandButton Then
ctrl.Enabled = Not stat
End If
Next
End Sub
Private Sub cmdUndo_Click()
On Error Resume Next
DoCmd.RunCommand acCmdUndo
sopn.SetFocus
ChangeStatus False
On Error GoTo 0
End Sub
Thành thật xin lỗi.
Sửa lần cuối: