I. PhầnTạo Cơ Sở Dữ Liệu Thiết lập mối quan hệ + Dùng chuột chọn các khóa từ table có quan hệ 1 kéo sang table có quan hệ nhiều. + Nếu giữa 2 table có liên kết chung từ 2 khóa trở lên thì chọn tất cả các khóa đó luôn 1 lần rồi drag chuột kéo từ table có quan hệ 1 sang table có quan hệ nhiều. Nhập dữ liệu: + Table có quan hệ 1 nhập dữ liệu trước, table có quan hệ nhiều nhập dữ liệu sau. + Nhập 2 biên trái + phải từ ngoài vào trong theo mô hình sắp xếp sau đây: II. PhầnThiết kế Form FORM NHẬP DỮ LIỆU I. Phần Thiết kế giao diện Thiết kế Form Main-Sub A. Thiết kế cơ bản bằng chức năng form Wizard : 1. Form Main: chọn Table có quan hệ 1 và Form Sub: chọn Table có quan hệ nhiều 2. Giữa Form Main và Form Sub phải có trường chung. 3. Xem thuộc tính liên kết của SubForm/SubReport có trường liên kết chung là: Sodonhang + Link Child Fields: Sodonhang + Link Master Fields: Sodonhang B1: Chọn thành phần Forms\ New\ Form Wizard B2: Chọn Table làm nguồn cho Form Main (chọn Table có quan hệ 1) Chọn các trường hiển thị trên Form Main. B3: Chọn Table làm nguồn cho Form Sub (chọn Table có quan hệ nhiều) Chọn các trường hiển thị trên Form Sub. B4: Chọn dạng thể hiện (Để mặc định, nhấn Next) Chọn kiểu trình bày cho Form-Sub (Để mặc định là DataSheet) Chọn dạng hiển thị cho Form Main-Sub (mỗi lệnh thể hiện 1 dạng) B5: Đặt tên: Form (Tên của form Main), Subform (Tên của form Sub) B. Thiết kế hoàn chỉnh Form Main-Sub . B1: Chọn Form Main-Sub ở chế độ Design B2: Bổ sung thêm các trường khác cho Form Main, chọn thuộc tính Record Source B3: Bổ sung thêm các trường khác cho Form Sub: + Chọn Form Sub + Chọn lệnh View\ SubForm In New Window + Chọn thuộc tính Record Source B4: Tạo các Text Box tính toán ở vùng Form Footer của Form Sub, Name: Đặt tên cho TextBox, Control Source: Nhập công thức tính toán. 1. Thiết kế bảng 2. Thiết lập mối quan hệ giữa các bảng 3. Nhập dữ liệu vào bảng B5: Thực hiện truyền các kết quả tính toán từ Text Box tính toán ở vùng Form Footer của Form Sub sang Form Main. Công thức tham chiếu: =Tên của SubForm/SubReport. Form!Tên của Text Box chứa kết quả đã tính toán B6: Chuyển các TextBox ở Form Main và Form Sub sang Combo Box. + Click phải chuột vào TextBox cần chuyển, chọn lệnh Change to\ Combo Box + Chọn nguồn cho Combo Box, chọn thuộc tính Row Source, chọn Table làm nguồn (chọn Table có quan hệ 1) B7: Tạo các nút di chuyển và nút điều khiển: Tới, Lui, Thêm, Sửa, Xóa, In, Ghi, Không ghi : + Tắt chức năng Control Wizard, dùng chuột drag tạo trên vùng của Form Main + Đặt tên cho từng nút tại thuộc tính Name: CmdToi, CmdLui, CmdThem, CmdSua, CmdXoa, CmdIn, CmdGhi, CmdKhongGhi. Thiết kế Form Tab-Control B1: Thiết kế cơ bản và hoàn chỉnh Form Main-Sub (Xem lại phần thiết kế Form Main-Sub) B2: Tạo Tab Control: + Click chuột vào công cụ Tab-Control, drag chuột tạo các Tab-Control trên vùng Detail của Form Main-Sub + Đặt tên hiển thị cho các Tab-Control, Gõ tên vào thuộc tính Caption + Thêm các Tab-Control, click phải chuột vào Tab-Control, chọn lệnh Insert Page. + Xóa các Tab-Control, click phải chuột vào Tab-Control, chọn lệnh Delete Page. B3: Cắt dữ liệu trên phần Form Main vào 1 Tab-Control Dữ liệuphần Form Sub để ngoài Tab-Control hoặc cắt vào Tab-Control khác tùy theo yêu cầu bài. Các bước tiếp theo: Bổ sung thêm các trường khác cho Form Main, Form Sub - Tạo các Text Box tính toán ở vùng Form Footer của Form Sub - Truyền các kết quả tính toán từ Text Box tính toán ở vùng Form Footer của Form Sub sang Form Main … : đều thực hiện giống ở phần Thiết kế Form Main-Sub Tạo liên kết Tạo liên kết giữa List Box với Form-Sub và giữa 2 Tab Control (List Box với Form-Main) 1. Viết Code vào biến cố On Current của Form Tab-Control ListDH = Sodonhang 2. Viết Code vào biến cố On Click của List Box Sodonhang.SetFocus DoCmd.FindRecord ListDH ListDH.SetFocus Thiết kế Report A. Thiết kế cơ bản bằng chức năng Report Wizard: B1: Chọn thành phần Reports\ New\ Report Wizard B2: Chọn Table làm nguồn cho Phân nhóm chính (chọn Table có quan hệ 1) Chọn các trường hiển thị trên Phân nhóm chính. B3: Chọn Table làm nguồn cho Phân nhóm phụ (chọn Table có quan hệ nhiều) Chọn các trường hiển thị trên Phân nhóm phụ. B4: Chọn dạng thể hiện (Để mặc định, nhấn Next) Chọn trường làm phân nhóm (Để mặc định, nhấn Next) Chọn trường cần sắp xếp (Để mặc định, nhấn Next) Chọn dạng trình bày cho bản báo cáo, chọn dạng OutLine B5: Đặt tên cho Report. B. Thiết kế hoàn chỉnh Report. B1: Chọn Report ở chế độ Design. B2: Bổ sung thêm các trường khác cho Report, chọn thuộc tính Record Source (Chú ý: Trong Report: Nguồn dữ liệu cho Phân nhóm chính và Phân nhóm phụ chung. Ngược lại trong Form Main – Sub, nguồn dữ liệu Form Main riêng và Form Sub riêng.) B3: Tạo TextBox Số thứ tự, chọn thuộc tính Control Source: = 1, Running Sum: Over Group B4: Tạo các Text Box thống kê + Ở cuối của mỗi phân nhóm: Hiện vùng Footer của phân nhóm: click chuột vào biểu tượng Sorting and Grouping hoặc click phải chuột vào Report chọn lệnh Sorting and Grouping, chọn Group Footer: Yes. Tạo text Box và lập công thức + Ở cuối của bản báo cáo: Tạo text Box và lập công thức ở vùng Report Footer. II, Phần Lập trình: 1. Khóa dữ liệu khi mở Form: Viết Code vào biến cố On Load của Form Main-Sub hoặc Form Tab-Control + Gọi tên của tất cả Text Box chứa các trường hiển thị trên Form Main và Tên của SubForm/SubReport + Làm mờ 2 nút Lưu và Không Private Sub Form_Load() Sodonhang.Locked = True 'Khoa du lieu lai,Sodonhang' Ngay.Locked = True 'Khoa du lieu lai, Ngay' KhachhangID.Locked = True 'Khoa du lieu lai:' Tenkhachhang.Locked = True 'Khoa du lieu lai' FrmDonhangchitiet.Locked = True 'Khoa du lieu lai' CmdLuuFrmNhap.Enabled = False 'Nut Luu mo di' CmdKhongFrmNhap.Enabled = False 'Nut Khong Luu mo di' End Sub 2. Các nút di chuyển (hiện thông báo và mờ đi khi đang ở đầu và cuối bảng): Viết Code vào biến cố On Click của Các nút di chuyển Private Sub cmdfirst_Click() If CurrentRecord = 1 Then MsgBox "Ban dang o mau tin dau.Khong di chuyen duoc nua", vbCritical + vbOKOnly, "thong bao" Sodonhang.SetFocus cmdtruoc.Enabled = False cmdfirst.Enabled = False Else DoCmd.GoToRecord , , acFirst Sodonhang.SetFocus cmdnext.Enabled = True cmdlast.Enabled = True End If End Sub Private Sub cmdtruoc_Click() If CurrentRecord = 1 Then 'Kiem tra xem con tro co dang o mau tin dau hay khong' MsgBox "Ban dang o mau tin dau.Khong di chuyen duoc nua", vbCritical + vbOKOnly, "thong bao" Sodonhang.SetFocus 'Truoc khi cho nut CmdTruoc mo di phai tra con tro ve Sodonhang' cmdtruoc.Enabled = False 'Cho nut Lui ve truoc mo di' cmdfirst.Enabled = False 'Cho nut CmdVe dau mo di' Else DoCmd.GoToRecord , , acPrevious 'Thuc hien lui con tro ve dong truoc' Sodonhang.SetFocus cmdnext.Enabled = True 'Cho nut toi dong ke tiep sang len' cmdlast.Enabled = True 'Cho nut Ve cuoi sang len' End If End Sub Private Sub cmdlast_Click() If CurrentRecord = DCount("*", "donhang") Then MsgBox "Ban dang o mau tin cuoi.khong di chuyen duoc nua", vbCritical + vbOKOnly, "thong bao" Sodonhang.SetFocus cmdnext.Enabled = False cmdlast.Enabled = False Else DoCmd.GoToRecord , , acLast Sodonhang.SetFocus cmdtruoc.Enabled = True cmdfirst.Enabled = True End If End Sub Private Sub cmdnext_Click() If CurrentRecord = DCount("*", "donhang") Then MsgBox "Ban dang o mau tin cuoi.khong di chuyen duoc nua", vbCritical + vbOKOnly, "thong bao" Sodonhang.SetFocus cmdnext.Enabled = False cmdlast.Enabled = False Else DoCmd.GoToRecord , , acNext Sodonhang.SetFocus cmdtruoc.Enabled = True cmdfirst.Enabled = True End If End Sub 3. Nút thêm: Cập nhật dữ liệu trên cả 2 form Main và Sub. Các nút Lưu và Không lưu sáng lên. Các nút thêm, sửa, xóa, in và di chuyển mờ đi: Viết Code vào biến cố On Click của nút thêm Private Sub cmdThem_Click() If MsgBox("Ban co muon them mau tin moi?", vbInformation + vbYesNo, "Chu y") = vbNo Then Cancel = True Else DoCmd.GoToRecord , , acNewRec Sodonhang.SetFocus Sodonhang.Locked = False 'Mo khoa du lieu: Sodonhang' Ngay.Locked = False 'Mo khoa du lieu: Ngay' Ngay.Value = Date 'Cap nhat Ngay = Ngay hien hanh' KhachhangID.Locked = False 'Mo khoa du lieu: KhachhangID' Tenkhachhang.Locked = False 'Mo khoa du lieu: Tenkhachhang' FrmDonhangchitiet.Locked = False 'Mo khoa du lieu cua SubForm/SubReport ten la: FrmDonhangchitiet' CmdLuuFrmNhap.Enabled = True 'Nut Luu sang len' CmdKhongFrmNhap.Enabled = True 'Nut KhongLuu sang len' cmdfirst.Enabled = False 'Nut VeDau mo di' cmdlast.Enabled = False 'Nut Ve Cuoi mo di' cmdnext.Enabled = False 'Nut Toi mo di' cmdtruoc.Enabled = False 'Nut Nut Lui mo di' CmdInFrmNhap.Enabled = False 'Nut In mo di' cmddelete.Enabled = False 'Nut Xoa mo di' CmdSuaFrmNhap.Enabled = False 'Nut Sua mo di' cmdexit.Enabled = False 'Nut Thoay mo di' Sodonhang.SetFocus 'Tra con tro ve Sodonhang' cmdThem.Enabled = False 'Nut Them mo di' End If End Sub 4. Nút Sửa: Sửa dữ liệu trên cả 2 form Main và Sub. Các nút Lưu và Không lưu sáng lên. Các nút thêm, sửa, xóa, in và di chuyển mờ đi: Viết Code vào biến cố On Click của nút Sửa Private Sub CmdSua_Click() If MsgBox("Ban co muon sua du lieu khong", vbInformation + vbYesNo, "Chu y") = vbNo Then Cancel = True Else Sodonhang.SetFocus Sodonhang.Locked = False 'Mo khoa du lieu: Sodonhang' Ngay.Locked = False 'Mo khoa du lieu: Ngay' Ngay.Value = Date 'Cap nhat Ngay = Ngay hien hanh' KhachhangID.Locked = False 'Mo khoa du lieu: KhachhangID' Tenkhachhang.Locked = False 'Mo khoa du lieu: Tenkhachhang' FrmDonhangchitiet.Locked = False 'Mo khoa du lieu cua SubForm/SubReport ten la: FrmDonhangchitiet' CmdLuu.Enabled = True 'Nut Luu sang len' Cmdkhong.Enabled = True 'Nut KhongLuu sang len' cmdfirst.Enabled = False 'Nut VeDau mo di' cmdlast.Enabled = False 'Nut Ve Cuoi mo di' cmdnext.Enabled = False 'Nut Toi mo di' cmdtruoc.Enabled = False 'Nut Nut Lui mo di' CmdIn.Enabled = False 'Nut In mo di' cmddelete.Enabled = False 'Nut Xoa mo di' cmdaddnew.Enabled = False 'Nut Them mo di' cmdexit.Enabled = False 'Nut Thoay mo di' Sodonhang.SetFocus 'Tra con tro ve Sodonhang' CmdSua.Enabled = False 'Nut Sua mo di' End If End Sub 5. Nút In Báo Cáo: In dữ liệu đúng Số đơn hàng hiện hành trên Form Main: Viết Code vào biến cố On Click của nút In Private Sub CmdIn_Click() DoCmd.OpenReport "RptDonhangchitiet", acViewPreview, [Sodonhang], "Sodonhang=forms! FrmNhapdonhang!Sodonhang" End Sub 6. Kiểm tra lỗi khi nhập dữ liệu vào bằng nút thêm a. Kiểm tra lỗi dữ liệu nhập vào Số đơn hàng có”trùng” và “rỗng” hay không: Viết Code vào biến cố BeforeUpdate của TextBox Số đơn hàng trên Form Main Private Sub Sodonhang_BeforeUpdate(Cancel As Integer) If DCount("*", "Donhang", "Sodonhang = Forms!FrmNhapdonhang!Sodonhang") > 0 Then MsgBox "Trung So Don Hang, nhaplai", vbCritical Cancel = True Exit Sub End If If IsNull(Sodonhang) Then 'kiem tra rong khoa chinh MsgBox "Khong duoc de trong So don hang,nhaplai", vbCritical Cancel = True End If End Sub b. Kiểm tra lỗi dữ liệu nhập vào Combo Mã khách hàng trên Form Main (Combo Box chỉ cho phép chọn các giá trị trong Combo này. Nếu nhập vào các giá trị không có trong Combo thì sẽ hiện thông báo lỗi) Private Sub KhachhangID_AfterUpdate() If IsNull(DLookup("[KhachhangID]", "[DMKhachhang]", "[KhachhangID]=khachhangid.Value")) Then Response = MsgBox("Khach hang chua dang ky, Chon lai", vbOKOnly, "Chu y") KhachhangID.SetFocus Tenkhachhang.Locked = True End If End Sub c. Kiểm tra lỗi dữ liệu nhập vào Combo Mã hàng hóa trên Form Sub (Combo Box chỉ cho phép chọn các giá trị trong Combo này. Nếu nhập vào các giá trị không có trong Combo thì sẽ hiện thông báo lỗi) Private Sub HanghoaID_AfterUpdate() If IsNull(DLookup("[HanghoaID]", "[DMHanghoa]", "[HanghoaID]=Hanghoaid.Value")) Then Response = MsgBox("Hang hoa chua dang ky, Chon lai", vbOKOnly, "Chu y") HanghoaID.SetFocus Tenhanghoa.Locked = True End If End Sub 7. Nút Lưu: Lưu dữ liệu nhập vào. Trả Form trở về trạng thái ban đầu: Khóa dữ liệu lại. 2 nút Lưu và không lưu mờ đi. Các nút di chuyển, thêm, sửa, xóa, in sáng lên Private Sub CmdLuu_Click() DoCmd.RunCommand acCmdSaveRecord 'Thuc hien luu du lieu' Sodonhang.Locked = True 'Khoa du lieu lai' Ngay.Locked = True 'Khoa du lieu lai' KhachhangID.Locked = True 'Khoa du lieu lai' Tenkhachhang.Locked = True 'Khoa du lieu lai' FrmDonhangchitiet.Locked = True 'Khoa du lieu lai' cmdfirst.Enabled = True 'Nut Ve dau sang len' cmdlast.Enabled = True 'Nut Ve cuoi sang len' cmdnext.Enabled = True 'Nut Toi sang len' cmdtruoc.Enabled = True 'Nut Lui sang len' CmdIn.Enabled = True 'Nut In sang len' cmddelete.Enabled = True 'Nut Xoa sang len' CmdSua.Enabled = True 'Nut Sua sang len' cmdexit.Enabled = True 'Nut Thoat sang len' cmdaddnew.Enabled = True 'Nut Them sang len' Sodonhang.SetFocus 'Tra con tro ve Sodonhang' CmdLuu.Enabled = False 'Nut Luu mo di' Cmdkhong.Enabled = False 'Nut Khong Luu mo di' End Sub 8. Nút Không: Không Lưu dữ liệu nhập vào. Trả Form trở về trạng thái ban đầu: Khóa dữ liệu lại. 2 nút Lưu và không lưu mờ đi. Các nút di chuyển, thêm, sửa, xóa, in sáng lên Private Sub Cmdkhong_Click() If Me.Dirty = True Then Me.Undo Else SendKeys "{ESC}", True End If Sodonhang.Locked = True 'Khoa du lieu lai' Ngay.Locked = True 'Khoa du lieu lai' KhachhangID.Locked = True 'Khoa du lieu lai' Tenkhachhang.Locked = True 'Khoa du lieu lai' FrmDonhangchitiet.Locked = True 'Khoa du lieu lai' cmdfirst.Enabled = True 'Nut Ve dau sang len' cmdlast.Enabled = True 'Nut Ve cuoi sang len' cmdnext.Enabled = True 'Nut Toi sang len' cmdtruoc.Enabled = True 'Nut Lui sang len' CmdIn.Enabled = True 'Nut In sang len' cmddelete.Enabled = True 'Nut Xoa sang len' CmdSua.Enabled = True 'Nut Sua sang len' cmdexit.Enabled = True 'Nut Thoat sang len' cmdaddnew.Enabled = True 'Nut Them sang len' Sodonhang.SetFocus 'Tra con tro ve Sodonhang' CmdLuu.Enabled = False 'Nut Luu mo di' Cmdkhong.Enabled = False 'Nut Khong Luu mo di' End Sub 9. Nút Xóa: Xóa dữ liệu, hiện thông báo lỗi khi form Sub có dữ liệu, không xóa được. Viết Code trên 3 biến cố: On Click của nút Xóa và 2 biến cố BeforeDelConfirm, On Delete của Form Main Private Sub cmddelete_Click() On Error GoTo LOI DoCmd.SetWarnings (False) DoCmd.RunCommand acCmdDeleteRecord If Me.Recordset.RecordCount > 0 Then Me.Recordset.MovePrevious End If Exit Sub LOI: MsgBox "Khong the xoa mau tin" End Sub Private Sub Form_BeforeDelConfirm(Cancel As Integer, Response As Integer) If MsgBox("Ban co muon xoa mau tin nay khong?", vbQuestion + vbYesNo, "Thong bao xoa") = vbNo Then Cancel = True 'Huy bien co Else Response = acDataErrContinue 'Tat thong bao cua Access End If End Sub Private Sub Form_Delete(Cancel As Integer) If DCount("*", "Donhangchitiet", "Sodonhang=forms!FrmNhapdonhang!Sodonhang") > 0 Then MsgBox "Khong the xoa So don hang nay vi da co nhap hang hoa ", vbCritical + vbOKOnly, "Khong the xoa" Cancel = True End If End Sub 10. Nút Thoát: Đóng Form Private Sub cmdexit_Click() If MsgBox("Ban co muon thoat khoi form khong", vbInformation + vbYesNo, "Chu y") = vbNo Then Cancel = True Else DoCmd.Close , , acSaveYes End If End Sub . vào Tab-Control, chọn lệnh Delete Page. B3: Cắt dữ liệu trên phần Form Main vào 1 Tab-Control Dữ liệu phần Form Sub để ngoài Tab-Control hoặc cắt vào Tab-Control. Footer: Yes. Tạo text Box và lập công thức + Ở cuối của bản báo cáo: Tạo text Box và lập công thức ở vùng Report Footer. II, Phần Lập trình: 1. Khóa dữ liệu khi