I. Phần Tạo Cơ Sở Dữ Liệu
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
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.
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ệu phầ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