Chuyên đề ứng dụng : Thiết kế chương trình Sổ Quỹ Tiền Mặt(Phần 1 - Table và Form)

Thảo luận trong 'Access và VBA' bắt đầu bởi xuanthanh, 8/10/10.

  1. xuanthanh

    xuanthanh Member Hội viên mới

    Dear All!
    Hôm trước đã giới thiệu với các bạn chuyên đề về thiết kế Form trong Access. Hôm nay bằng một chương trình cụ thể này, tôi sẽ cùng các bạn áp dụng vào thực tế xem cách thức thiết kế một chương trình cụ thể như thế nào nhé. Bây giờ chúng ta lần lượt đi từng bước một

    Bài 1 : Thiết kế cơ sở dữ liệu - Các Table​


    Cơ sở dữ liệu của chúng ta gồm có 4 table chính : tblKhach, tblTaiKhoan, tblPhieuThuChi, tblPhieuChiTiet

    1/ Bảng tblKhach
    Bảng này gồm các trường sau :
    MaKhach Text 10 PrimaryKey, Yes (No Duplicates)
    TenKhach Text 50
    DiaChi Text 70

    2/ Bảng tblTaiKhoan
    Bảng này gồm các trường sau :
    MaTK Text 10 PrimaryKey, Yes (No Duplicates)
    TenTK Text 50

    3/ Bảng tblPhieuThuChi
    Bảng này gồm các trường sau :
    RecKey Text 20 PrimaryKey, Yes (No Duplicates)
    NgayCT Date
    SoCT Text 4
    LoaiCT Text 1
    MaKhach Text 10
    LyDo Text 70
    SoCTGoc Text 2

    4/ Bảng tblPhieuChiTiêt
    Bảng này gồm các trường sau :
    RecKey Text 20 Yes (Duplicates OK)
    TKDU Text 10
    SoTien Number Format : Standard, Decimal : 0
    Các bạn chú ý hai trường RecKey của hai bảng tblphieuThuChi và tblPhieuChiTiet hai trường này sẽ quan hệ theo dạng 1-n, mẹ nào con nấy, một mẹ có nhiều con. Điều này lý giải tại sao ở tblPhieuThuChi thì Index Yes (No Duplicates) còn ở tblPhieuChiTiet thì lại là Yes (Duplicates OK)

    5/ Tạo mối quan hệ ràng buộc

    [​IMG]

    Trong lưới Relationships, các bạn kéo field RecKey từ tblPhieuThuChi thả vào tblPhieuChiTiet, field MaKhach từ tblKhach thả vào tblPhieuThuChi, field MaTK từ tblTaiKhoan thả vào tblPhieuChiTiet. Sau khi kéo xuất hiện bảng sau

    [​IMG]

    Trong 3 dấu checkbox, các bạn chỉ nên chọn 2 checkbox trên để tham chiếu toàn vẹn giữa các bảng, khi thay đổi ở bảng mẹ thì bảng con thay đổi theo. Riêng checkbox cuối cùng, nếu các bạn chọn nó thì khi xóa ở bảng mẹ, bảng con cũng bị xóa theo, điều này rất nguy hiểm vì liên quan tới các mục chi tiết
     
                   
  2. xuanthanh

    xuanthanh Member Hội viên mới

    Ðề: Chuyên đề ứng dụng : Thiết kế chương trình Sổ Quỹ Tiền Mặt(Phần 1 - Table và Form)

    Bài 2 : Thiết kế Form

    Với hai form frmKhach và frmTaiKhoan, công việc kế đơn giản rất nhiều, các bạn tự tìm hiểu và thiết kế nhé. Hướng dẫn cơ bản thế này, dùng Wizad để làm cho nhanh, sau đó chỉnh sửa lại
    1/ Thiết kế Form frmKhach
    Vào trang Form, nhấn nút New để tạo mới
    [​IMG]
    Khi đó xuất hiện bảng New Form như sau :
    [​IMG]
    Các bạn chọn như hình trên rồi nhấn nút OK để tạo form. Access sẽ tạo cho bạn một form ở chế độ View Form như sau :
    [​IMG]
    Các bạn nhấn nút Design trên thanh công cụ, ta được màn hình thiết kế form frmKhach như thế này :
    [​IMG]
    Kích phải chuột vào Form, chọn Properties, chúng ta thiết kế form này như sau :
    [​IMG]
    1/ Các bạn rê chuột để thiết kế phần Form Hearder như hình trên là được
    2/ Trong Properties của Form, các bạn chú ý mấy điểm sau :
    [​IMG]
    Trên phần Form Hearder có một ComandButon. Bạn chọn ComandButon trong hộp ToolBox, vẽ một hình nút Comand như hình vẽ, nhấn phải chuột vào nút ComandButon chọn Properties của nó và thiết kế như sau
    Caption : Thoát
    Name : Thoat
    On Click Event : DoCmd.Close
    Như vậy ta đã thiết kế xong Form frmKhach. Nhấn nút ViewForm ta được kết quả như sau :
    [​IMG]
    Nhập danh sách khách hàng vào Form, Xong thì bấm nút Thoát. Thật là dễ như ta cho tay vào túi móc kẹo ăn phải không các bạn

    2/ Thiết kế Form frmTaiKhoan

    Các bạn làm tương tự như trên để tạo form frmTaiKhoan
     
  3. xuanthanh

    xuanthanh Member Hội viên mới

    Ðề: Chuyên đề ứng dụng : Thiết kế chương trình Sổ Quỹ Tiền Mặt(Phần 1 - Table và Form)

    Bài 2 : Thiết kế form(tiếp theo)​


    3/ Thiết kế Form frmPhieuThuChi

    Ở đây tôi đặc biệt chú ý các bạn khi thiết kế form này. Form này thuộc dạng MainForm – SubForm
    3.1 Thiết kế SubForm
    Các bạn làm tương tự như trên để thiết kế SubForm : frmPhieuChiTiet. Kết quả như sau :

    [​IMG]

    Các bạn lưu ý một số điểm như sau :
    Trong phần Detail của Form còn một textbox RecKey nữa nhưng ta gán thuộc tính Visible của nó bằng No để khi view form ta không nhìn thấy Textbox này nhưng không thể thiếu nó vì nó sẽ là nguồn để link lên MainForm sau này
    TKDU nên sử dụng combobox để chọn TK cho dễ khi nhập liệu.

    [​IMG]

    [​IMG]

    Row Source của combo này như sau
    SELECT tblTaiKhoan.MaTK, tblTaiKhoan.TenTK
    FROM tblTaiKhoan;

    Phần Form Footer vẽ thêm một Label và một textbox có tên là txtTong, Control Source = Sum([SoTien]) nhằm để lấy tổng số tiền của một phiếu bất kỳ nào đó và ghi số tiền bằng chữ
    Toàn bộ các Event của form này chỉ duy nhất một event như sau (nhằm mục đich xòe danh sách tài khoản ra cho ta chọn khi combo TKDU nhận focus)

    Private Sub TKDU_GotFocus()
    SendKeys "%{DOWN}"
    End Sub

    Như vậy là chúng ta đã thiết kế xong SubForm frmPhieuChiTiet

    3.2 / Thiết kế MainForm và nhúng SubForm
    Vào Form – New

    [​IMG]

    Các bạn chọn như trong hình trên rồi nhấn nút OK để tạo form

    [​IMG]

    Nhấn nút Design và dung chuột vẽ sao được như hình dưới đây

    [​IMG]

    Các control trong form các bạn làm như trong hình. Ở đây chỉ lưu ý hai combobox LoaiCT, MaKhach và hai textbox thể hiện Tên Khách và Địa Chỉ khi chọn Mã khách trong hộp com bo

    [​IMG]

    [​IMG]

    [​IMG]

    [​IMG]
     
    Chỉnh sửa cuối: 9/10/10
  4. xuanthanh

    xuanthanh Member Hội viên mới

    Ðề: Chuyên đề ứng dụng : Thiết kế chương trình Sổ Quỹ Tiền Mặt(Phần 1 - Table và Form)

    Bài 2 (Tiếp theo )


    [​IMG]

    [​IMG]

    Row Source của combo này như sau
    SELECT tblKhach.MaKhach, tblKhach.TenKhach, tblKhach.DiaChi
    FROM tblKhach;


    Hai textbox phía sau combobox MaKhach lần lượt có Control Source là
    =[MaKhachX].[Column(1)]
    =[MaKhachX].[Column(2)]

    Để nhúng SubForm vào MainForm, các bạn chọn Subform/SubReport và vẽ lên phần dưới của form main và điều chỉnh trong Properties của nó như sau

    [​IMG]

    [​IMG]

    Kết quả cuối cùng :

    [​IMG]

    Để hoàn thiện form này, chúng ta thêm mắm muối như sau. Vẽ thêm hai textbox như trong hình

    [​IMG]

    Textbox thứ nhất nằm bên phải SubForm
    Visible = No
    Control Source = frmChiTiet.Form!txtTong
    Name : TongTien
    Textbox thứ hai nằm dưới SubForm
    Enable = No
    Control Source = DocSo([TongTien])
    Hai textbox này nhằm mục đích đọc số tiền của phiếu hiện hành ra chữ
    Phía trên phần Form Hearder có hai Command Buton, Nút Thoát giống như trên. Nút In Phiếu nhằm xuất phiếu hiện hành ra Report (Sẽ xét ở phần sau)
    Toàn bộ các Event của Form này như sau :
    Option Compare Database
    Private Sub CmdIn_Click()
    If Right(Me.RecKey, 1) = "T" Then
    DoCmd.OpenReport "rptPhieuThu", acViewPreview
    Else
    DoCmd.OpenReport "rptPhieuChi", acViewPreview
    End If
    End Sub

    Private Sub CmdThoat_Click()
    DoCmd.Close
    End Sub

    Private Sub LoaiCT_AfterUpdate()
    Call TaoMa
    End Sub

    Private Sub LoaiCT_GotFocus()
    SendKeys "%{DOWN}"
    End Sub

    Private Sub MaKhachX_GotFocus()
    SendKeys "%{DOWN}"
    End Sub

    Private Sub NgayCT_AfterUpdate()
    Call TaoMa
    End Sub

    Private Sub SoCT_AfterUpdate()
    Me.SoCT = Right("000" & Me.SoCT, 4)
    Call TaoMa
    End Sub

    Private Sub TaoMa()
    Me.RecKey = Year(Me.NgayCT) & Right("0" & Month(Me.NgayCT), 2) & Right("0" & Day(Me.NgayCT), 2) & "-" & Me.SoCT & "-" & Me.LoaiCT
    End Sub

    Lưu ý các bạn 2 điểm sau :
    - Sub TaoMa() nhằm tạo ra khóa RecKey bằng cách ghép Năm Tháng Ngày-Số CT-LoạiCT
    - Hàm DocSo(Number) được viết trong Modul để đọc số thành chữ
     
  5. xuanthanh

    xuanthanh Member Hội viên mới

    Ðề: Chuyên đề ứng dụng : Thiết kế chương trình Sổ Quỹ Tiền Mặt(Phần 1 - Table và Form)

    Bài 2 : Tiếp theo


    4/ Tạo form frmMeNu để điều khiển chương trình
    Cũng vào Form – New, chọn Design View, hộp com bo phía dưới ta không chọn bảng nào cả. Ở đây ta không dung Wizad để tạo form mà ta tự thiết kế lấy form. Sau khi chọn như trên, ta được form hình thù như sau ở dạng thiết kế

    [​IMG]

    Dùng chuột vẽ các control lên form và điều chỉnh để được như hình sau :

    [​IMG]

    Các Control trên form bao gồm : 3 Label, 6 Command Button, 1 ComboBox, 3 TextBox. Kích phải chuột lên từng Control và điều chỉnh trong Properties như sau :

    [​IMG]

    [​IMG]

    [​IMG]

    [​IMG]

    Row Source
    SELECT tblPhieuThuChi.RecKey
    FROM tblPhieuThuChi;

    [​IMG]

    [​IMG]

    Tương tự như textbox txtNgayCuoi
    Ở đây đặc biệt giới thiệu textbox màu đỏ để lấy thởi gian hiện hành của máy tính : txtClock

    [​IMG]

    [​IMG]

    Toàn bộ các Event của form này như sau :

    Option Compare Database

    Private Sub CmdInPhieu_Click()
    If Not IsNull(Me.cboSo) Then
    DoCmd.OpenForm "frmPhieuThuChi", acNormal, , "[RecKey] = [Forms]![frmMeNu]![cboSo]"
    Else
    MsgBox "Ban chua chon so phieu", , "Thong Bao"
    Exit Sub
    End If
    End Sub

    Private Sub CmdInSoQuy_Click()
    If Not IsNull(Me.txtNgayDau) And Not IsNull(Me.txtNgayCuoi) Then
    DoCmd.OpenReport "rptSoQuy", acViewPreview
    Else
    MsgBox "Ban chua chon thoi gian bao cao", , "Thong Bao"
    Exit Sub
    End If
    End Sub

    Private Sub CmdKhachHang_Click()
    DoCmd.OpenForm "frmKhach", acNormal
    End Sub

    Private Sub CmdPhieuThuChi_Click()
    DoCmd.OpenForm "frmPhieuThuChi", acNormal
    End Sub

    Private Sub CmdTaiKhoan_Click()
    DoCmd.OpenForm "frmTaiKhoan", acNormal
    End Sub

    Private Sub CmdThoat_Click()
    If MsgBox("Ban thuc su muon thoat ?", vbDefaultButton2 + vbQuestion + vbYesNo, "Thong Bao") = vbYes Then
    DoCmd.Close
    DoCmd.Quit
    End If
    End Sub

    Private Sub Form_Timer()
    Me.txtClock = Now()
    End Sub

    Phần 3 : Viết hàm đọc số ra chữ trong modul

    Vào ngăn Modul, nhấp nút New để tạo modul mới đặt tên là mdlDocSo
    Viết hàm sau
    Function DocSo(Number As Double)
    Dim MyArray
    Dim Str As String
    If Number >= 1E+18 Then DocSo = "#NUM!": Exit Function
    Str = Format(Fix(Abs(Number)), "000000000000000000")
    MyArray = Array("không ", "m" & ChrW(7897) & "t ", "hai ", "ba ", "b" & ChrW(7889) & "n ", "n" & ChrW(259) & "m ", "sáu ", "b" & ChrW(7843) & "y ", "tám ", "chín ", "tri" & ChrW(7879) & "u, ", "ngàn, ", "t" & ChrW(7927) & ", ", "tri" & ChrW(7879) & "u, ", "ngàn, ", "", "tr" & ChrW(259) & "m ", "m" & ChrW(432) & ChrW(417) & "i ", "không " & "m" & ChrW(432) & ChrW(417) & "i" & " không ", "không " & "m" & ChrW(432) & ChrW(417) & "i", "l" & ChrW(7867), "m" & ChrW(432) & ChrW(417) & "i" & " không", "m" & ChrW(432) & ChrW(417) & "i", "m" & ChrW(432) & ChrW(417) & "i" & " n" & ChrW(259) & "m", "m" & ChrW(432) & ChrW(417) & "i" & " l" & ChrW(259) & "m", "m" & ChrW(7897) & "t " & "m" & ChrW(432) & ChrW(417) & "i", "m" & ChrW(432) & ChrW(7901) & "i", "m" & ChrW(432) & ChrW(417) & "i" & " m" & ChrW(7897) & "t", "m" & ChrW(432) & ChrW(417) & "i" & " m" & ChrW(7889) & "t", "Âm ", ChrW(273) & ChrW(7891) & "ng ", "và ", "xu ")
    For i = 1 To Len(Str)
    If Left(Str, i) <> 0 And Mid(Str, (Int((i + 2) / 3) - 1) * 3 + 1, 3) <> 0 Then
    DocSo = DocSo & MyArray(Mid(Str, i, 1)) & MyArray(-(9 + i / 3) * (i Mod 3 = 0) - (15 + i Mod 3) * (i Mod 3 <> 0))
    ElseIf i = 9 And Mid(Str, 7, 3) = 0 And Left(Str, 6) <> 0 Then
    DocSo = DocSo & MyArray(12)
    End If
    Next
    DocSo = IIf(Number = 0, MyArray(0) & MyArray(30), "") & IIf(Fix(Number) <> 0, DocSo & MyArray(30), "") & IIf(Fix(Number) <> 0 And Fix(Number) <> Number, MyArray(31), "") & IIf(Fix(Number) <> Number, IIf(Abs(Number - Fix(Number)) < 0.1, "", MyArray(Left(Right(Format(Abs(Number), "#.00"), 2), 1)) & MyArray(17)) & MyArray(Right(Format(Number, "#.00"), 1)) & MyArray(32), "")
    DocSo = Replace(Trim(Replace(Replace(Replace(Replace(Replace(Replace(Replace(DocSo, MyArray(18-), MyArray(15)), MyArray(19), MyArray(20)), MyArray(21), MyArray(22)), MyArray(23), MyArray(24)), MyArray(25), MyArray(26)), MyArray(27), MyArray(28-)), ", " & MyArray(30), " " & MyArray(30))), MyArray(30) & MyArray(31), Split(MyArray(30), " ")(0) & " " & MyArray(31))
    If Number < 0 Then DocSo = MyArray(29) & DocSo
    DocSo = UCase(Left(DocSo, 1)) & Mid(DocSo, 2) & "."
    End Function

    Lưu ý :
    1/ Hàm đọc số trên viết cho font Unicode
    2/ Tất cả các form và report (xem phần sau) đều dùng font Unicode

    Như vậy chúng ta đã hoàn thành phần thứ nhất : Thiết kế các bảng dữ liệu của CSDL và thiết kế các form để nhập liệu vào các bảng và điều khiển chương trình

    Mời các bạn theo dõi tiếp phần thứ hai : Thiết kế các query để lấy dữ liệu tạo nguồn cho report và cách thiết kế các Report
     
  6. ttm20062008

    ttm20062008 Member Hội viên mới

    Ðề: Chuyên đề ứng dụng : Thiết kế chương trình Sổ Quỹ Tiền Mặt(Phần 1 - Table và Form)

    đánh dấu để nhớ:tinhtuong:
     
  7. quanit

    quanit New Member Hội viên mới

    Ðề: Chuyên đề ứng dụng : Thiết kế chương trình Sổ Quỹ Tiền Mặt(Phần 1 - Table và Form)

    bài viết hay và hữu ích.
     
  8. anmatra_hn

    anmatra_hn New Member Hội viên mới

    Rat hay. mong anh co nhieu vi du hon nua
     
  9. Agito1993

    Agito1993 New Member Hội viên mới

    Bạn XuanThanh ơi, cho mình hỏi những cái code bạn dùng là VBA hay ngôn ngữ lập trình khác? Mình mù về code nhưng muốn tạo ứng dụng dựa trên Access mà ko biết đi đâu học mấy cái code mã này?
     
  10. hoamaivang_Van

    hoamaivang_Van New Member Hội viên mới

    Chào anh!
    Bài viết của anh rất hay, tuy nhiên mấy cái hình ảnh thì lại không nhìn thấy được
    Anh có thể cho em demo của bài này được không?
    Để dễ hiểu hơn
    Cảm ơn
     

Chia sẻ trang này

XenForo Add-ons by Brivium ™ © 2012-2013 Brivium LLC.