Trong kế toán quy định 1 tháng phải tổng kết và lập báo cáo, vậy tại sao chúng ta không tạo ra các bảng dữ liệu riêng cho từng tháng. Việc này cho ta tha hồ cất đi (backup) và restore (nạp trả) thông tin từng tháng khi cần thiết để dữ liệu luôn ít và gọn nhẹ giúp cho đảm bảo tốc độ tính toán nhanh. Tôi muốn chia sẻ ơới các bạn một số dòng sourcode để thực hiện ý đồ này.
a. Giả sử dữ liệu của chúng ta chứa trong file Data.mdb và chương trình chứa trong Prg.mdb (để hệ thống có thể chạy được trên LAN ta nên tổ chức dữ liệu riêng 1 file và phầ chương trình ở riêng 1 file)
b. Tổ chức 2 bảng lưu trữ thông tin mẫu cho chứng từ phát sinh nhập kho được tổ chức trong file PRG.MDB:
1. Tabname: Nhap (Soct, Ngayct, Makho, Makhach....)
2. Tabname: NhapCT (SoCT, Mahang, Soluong, Dongia,...)
c. Bây giờ muốn PRG tự phát sinh cho phiếu nhập kho của tháng 12 năm 2007, nghĩa là phải ra 2 tabs mới là:
1. Nhap2007 (có cấu trúc gống hệt như Tab Nhap)
2. NhapCT122007 (có cấu trúc gống hệt như Tab NhapCT)
và chúng cũng tự tạo quan hệ thông qua trơờng SoCT.
d. Lời giải:
- Khi khởi động chương trình bạn cần xóa bỏ tất cả các tabs link từ Data.mdb vào PRG.mdb bằng đoạn code sau:
Dim mydb as dao.datbase, i as byte, Filedata as string, tenbang as string
DoCmd.Hourglass True
For i = 0 To Mydb.TableDefs.Count - 1
If Mydb.TableDefs(i).Connect <> "" Then
DoCmd.DeleteObject acTable, Mydb.TableDefs(i).Name
End If
Next i
- Tạo lại các links cho từng tabs từ data.mdb sang PRG.mdb
' Biến dưới đây chứa tên file và đường dẫn của dữ liệu
Filedata="CKetoan\Data.mdb"
Set Mydb = OpenDatabase(Filedata)
For i = 0 To Mydb.TableDefs.Count - 1
tenbang = Mydb.TableDefs(i).Name
If (Left(tenbang, 2) <> "ms") then
DoCmd.TransferDatabase acLink, "Microsoft Access", Mydb.Name, acTable, tenbang, tenbang
End If
Next i
- Giả sử có 2 biến là THANG (tháng 12) và NAM (năm 2007), tạo tên 2 tabs nhập kho mới như sau:
Dim thnam as string, Nhp as string Nhpct as string
thnam=Right(100 + Thang,2) & Nam
Nhp="Nhap" & thnam
Nhpct="NhapCt" & thnam
- Kiểm tra xem tabs nhap122007 và nhapct122007 đã được tạo chưa:
Trước tiên lập hàm Tablist để kiểm tra sự tồn tại của 1 tab nào đó trên 1 file mdb chỉ định, hàm như sau
Function Listtab(Fdata As String, Bang As Variant) As Boolean
'--------------------------------
' Kiem tra su ton tai cua table
' Fdata là tên và đường dẫn đầy đủ của file data.mdb
' Bang : ten table can kiem tra có tồn tại hay không
' Ket qua: True - co / False - khong co
'--------------------------------
Dim I As Integer
Dim mdb As DAO.Database
If Fdata = "" Then
Set mdb = CurrentDb
Else
Set mdb = DBEngine.Workspaces(0).OpenDatabase(Fdata)
End If
Listtab = False
For I = 0 To mdb.TableDefs.Count - 1
If mdb.TableDefs(I).Name = Bang Then
Listtab = True
Exit Function
End If
Next I
Set mdb = Nothing
End Function
Vậy ta gọi hàm kiểm tra sự tồn tại của tab Nhap122007 có tồn tại trong Cketoan\Data.mdb như sau:
IF TabList("CKetoan\Data.mdb",Nhp)=true then
' Đã tồn tại thì thông báo
msgbox "Da co du lieu nhap kho thang nay!"
Else
' Nếu chưa có thì
' Tạo ra 2 tabs phát sinh vào Data.mdb
DoCmd.RunSQL "DELETE * FROM Nhap;"
DoCmd.RunSQL "DELETE * FROM NhapCT;"
DoCmd.CopyObject Filedata, Nhp, acTable, "Nhap"
DoCmd.CopyObject Filedata, Nhpct, acTable, "NhapCT"
' Tạo quan hệ cho 2 tabs vừa phát sinh
Dim MyRelation As DAO.Relation, RelName as string
Dim MyField As DAO.Field
' Đặt tên cho quan hệ giữa 2 tabs thông qua biến RelName
RelName = "N" & thnam
If Filedata = "" Then
Set MyDatabase = CurrentDb
Else
Set MyDB = OpenDatabase(Filedata)
End If
Set MyRelation = MyDB.CreateRelation(RelName, Nhp, NhpCt)
MyRelation.Attributes = dbRelationUpdateCascade + dbRelationDeleteCascade
Set MyField = MyRelation.CreateField("SoCT")
MyField.ForeignName = "SoCT"
MyRelation.Fields.Append MyField
MyDatabase.Relations.Append MyRelation
MyDatabase.Relations.Refresh
If Filedata <> "" Then
DoCmd.TransferDatabase acLink, "Microsoft Access", Filedata, acTable, Nhp, Nhp
DoCmd.TransferDatabase acLink, "Microsoft Access", Filedata, acTable, NhpCt, NhpCt
End If
Set MyDB = Nothing
End if
- Tất cả yêu cầu đã hoàn thành, chúc các bạn thành công và mong được chia sẻ với các bạn những ý tưởng quý giá.
a. Giả sử dữ liệu của chúng ta chứa trong file Data.mdb và chương trình chứa trong Prg.mdb (để hệ thống có thể chạy được trên LAN ta nên tổ chức dữ liệu riêng 1 file và phầ chương trình ở riêng 1 file)
b. Tổ chức 2 bảng lưu trữ thông tin mẫu cho chứng từ phát sinh nhập kho được tổ chức trong file PRG.MDB:
1. Tabname: Nhap (Soct, Ngayct, Makho, Makhach....)
2. Tabname: NhapCT (SoCT, Mahang, Soluong, Dongia,...)
c. Bây giờ muốn PRG tự phát sinh cho phiếu nhập kho của tháng 12 năm 2007, nghĩa là phải ra 2 tabs mới là:
1. Nhap2007 (có cấu trúc gống hệt như Tab Nhap)
2. NhapCT122007 (có cấu trúc gống hệt như Tab NhapCT)
và chúng cũng tự tạo quan hệ thông qua trơờng SoCT.
d. Lời giải:
- Khi khởi động chương trình bạn cần xóa bỏ tất cả các tabs link từ Data.mdb vào PRG.mdb bằng đoạn code sau:
Dim mydb as dao.datbase, i as byte, Filedata as string, tenbang as string
DoCmd.Hourglass True
For i = 0 To Mydb.TableDefs.Count - 1
If Mydb.TableDefs(i).Connect <> "" Then
DoCmd.DeleteObject acTable, Mydb.TableDefs(i).Name
End If
Next i
- Tạo lại các links cho từng tabs từ data.mdb sang PRG.mdb
' Biến dưới đây chứa tên file và đường dẫn của dữ liệu
Filedata="CKetoan\Data.mdb"
Set Mydb = OpenDatabase(Filedata)
For i = 0 To Mydb.TableDefs.Count - 1
tenbang = Mydb.TableDefs(i).Name
If (Left(tenbang, 2) <> "ms") then
DoCmd.TransferDatabase acLink, "Microsoft Access", Mydb.Name, acTable, tenbang, tenbang
End If
Next i
- Giả sử có 2 biến là THANG (tháng 12) và NAM (năm 2007), tạo tên 2 tabs nhập kho mới như sau:
Dim thnam as string, Nhp as string Nhpct as string
thnam=Right(100 + Thang,2) & Nam
Nhp="Nhap" & thnam
Nhpct="NhapCt" & thnam
- Kiểm tra xem tabs nhap122007 và nhapct122007 đã được tạo chưa:
Trước tiên lập hàm Tablist để kiểm tra sự tồn tại của 1 tab nào đó trên 1 file mdb chỉ định, hàm như sau
Function Listtab(Fdata As String, Bang As Variant) As Boolean
'--------------------------------
' Kiem tra su ton tai cua table
' Fdata là tên và đường dẫn đầy đủ của file data.mdb
' Bang : ten table can kiem tra có tồn tại hay không
' Ket qua: True - co / False - khong co
'--------------------------------
Dim I As Integer
Dim mdb As DAO.Database
If Fdata = "" Then
Set mdb = CurrentDb
Else
Set mdb = DBEngine.Workspaces(0).OpenDatabase(Fdata)
End If
Listtab = False
For I = 0 To mdb.TableDefs.Count - 1
If mdb.TableDefs(I).Name = Bang Then
Listtab = True
Exit Function
End If
Next I
Set mdb = Nothing
End Function
Vậy ta gọi hàm kiểm tra sự tồn tại của tab Nhap122007 có tồn tại trong Cketoan\Data.mdb như sau:
IF TabList("CKetoan\Data.mdb",Nhp)=true then
' Đã tồn tại thì thông báo
msgbox "Da co du lieu nhap kho thang nay!"
Else
' Nếu chưa có thì
' Tạo ra 2 tabs phát sinh vào Data.mdb
DoCmd.RunSQL "DELETE * FROM Nhap;"
DoCmd.RunSQL "DELETE * FROM NhapCT;"
DoCmd.CopyObject Filedata, Nhp, acTable, "Nhap"
DoCmd.CopyObject Filedata, Nhpct, acTable, "NhapCT"
' Tạo quan hệ cho 2 tabs vừa phát sinh
Dim MyRelation As DAO.Relation, RelName as string
Dim MyField As DAO.Field
' Đặt tên cho quan hệ giữa 2 tabs thông qua biến RelName
RelName = "N" & thnam
If Filedata = "" Then
Set MyDatabase = CurrentDb
Else
Set MyDB = OpenDatabase(Filedata)
End If
Set MyRelation = MyDB.CreateRelation(RelName, Nhp, NhpCt)
MyRelation.Attributes = dbRelationUpdateCascade + dbRelationDeleteCascade
Set MyField = MyRelation.CreateField("SoCT")
MyField.ForeignName = "SoCT"
MyRelation.Fields.Append MyField
MyDatabase.Relations.Append MyRelation
MyDatabase.Relations.Refresh
If Filedata <> "" Then
DoCmd.TransferDatabase acLink, "Microsoft Access", Filedata, acTable, Nhp, Nhp
DoCmd.TransferDatabase acLink, "Microsoft Access", Filedata, acTable, NhpCt, NhpCt
End If
Set MyDB = Nothing
End if
- Tất cả yêu cầu đã hoàn thành, chúc các bạn thành công và mong được chia sẻ với các bạn những ý tưởng quý giá.
Sửa lần cuối: