• DeMo CommandButton
  • DeMo CommandButton

    Xuân Thanh > 25-07-18, 10:42 AM

    Đã có rất nhiều bài viết trên TTAC bàn về các Command Button treen Form Access nhưng vẫn có bạn thắc mắc về cách thiết kế và các lệnh thực thi của nó. Hôm nay tôi gửi các bạn bản Demo này để các bạn tham khảo
    Một số vấn đề cần chú ý trong Demo
    1/ Trong một Form của dự án Access luôn luôn có 9 Command : Đầu(cmdDau), Trước(cmdTruoc), Sau(cmdsau), Cuối(cmdCuoi), Thêm(cmdThem), Sửa(cmdSua), Lưu(cmdLuu), Xóa(cmdXoa) và Thoát(cmdThoat)
    2/ Toàn bộ các lệnh đều được viết trong modul của dự án để dùng chung cho tất cả các Form và trong Form sẽ gọi lệnh tù modul
    Ví dụ Hàm VeTruoc trong modul được viết thế này

    Mã PHP:
    Public Function VeTruoc()
        On Error GoTo Err_VeTruoc
        Application
    .DoCmd.GoToRecord , , acPrevious
    Exit_VeTruoc
    :
        Exit Function
    Err_VeTruoc:
        MsgBox "Day la mau tin dau"
        Resume Exit_VeTruoc
    End 
    Function 

    Thì trong Form nút lệnh cho cmdTruoc nhu sau
    Mã PHP:
    Private Sub cmdTruoc_Click()
        Call VeTruoc
    End Sub 

    3/ Khi Fỏm Active thì toàn bộ các TextBox se bị Locked bằng hàm Locktxt như sau
    Mã PHP:
    Public Function Locktxt(frmName As Form)
        Dim cnt As Control
        
    For Each cnt In frmName.Controls
            
    If TypeName(cnt) = "TextBox" Then
                cnt
    .Locked True
            End 
    If
        Next
    End 
    Function 

    Chỉ khi nào thêm mới hoặc chỉnh sửa mới cho UnLocked bằng hàm Unlocktxt
    Mã PHP:
    Public Function UnLocktxt(frmName As Form)
        Dim cnt As Control
        
    For Each cnt In frmName.Controls
            
    If TypeName(cnt) = "TextBox" Then
                cnt
    .Locked False
            End 
    If
        Next
    End 
    Function 

    (Nếu thêm combobox hoặc các control khác, các bạn viết thêm vào)

    4/ Có thể set ngay RecordSource cho form và ControlSource cho các textbox trên form ngay khi thiết kế hoặc set bằng VBA như trong Demo

    5/ Trong Demo sử dụng cmdLuu thay cho cả hai trường hợp là khi Thêm mới hoặc Chỉnh sửa băng tham số n ở đầu modul(n=1 thì thêm, n=2 thì sửa) và Lưu hoặc Không Lưu(Hủy) bằng lệnh MsgBox chứa 2 tham số Yes và No. Nếu người dùng nhấn Yes thì Lưu và nhấn No thì Hủy. Khi nhập mới có kiểm tra trùng mã khóa chính
    6/ Các vấn đè khác các bạn xem Demo đính kèm

    Toàn bộ code trong modul được viết như sau

    Mã PHP:
    Option Compare Database
    Option Explicit
    Dim n 
    As Integer

    Public Function VeDau()
        Application.DoCmd.GoToRecord , , acFirst
    End 
    Function

    Public Function 
    VeTruoc()
        On Error GoTo Err_VeTruoc
        Application
    .DoCmd.GoToRecord , , acPrevious
    Exit_VeTruoc
    :
        Exit Function
    Err_VeTruoc:
        MsgBox "Day la mau tin dau"
        Resume Exit_VeTruoc
    End 
    Function

    Public Function 
    VeSau()
        On Error GoTo Err_VeSau
        Application
    .DoCmd.GoToRecord , , acNext
    Exit_VeSau
    :
        Exit Function
    Err_VeSau:
        MsgBox "Day la mau tin cuoi"
        Call VeDau
        Resume Exit_VeSau
    End 
    Function

    Public Function 
    VeCuoi()
        Application.DoCmd.GoToRecord , , acLast
    End 
    Function

    Public Function 
    Locktxt(frmName As Form)
        Dim cnt As Control
        
    For Each cnt In frmName.Controls
            
    If TypeName(cnt) = "TextBox" Then
                cnt
    .Locked True
            End 
    If
        Next
    End 
    Function

    Public Function 
    UnLocktxt(frmName As Form)
        Dim cnt As Control
        
    For Each cnt In frmName.Controls
            
    If TypeName(cnt) = "TextBox" Then
                cnt
    .Locked False
            End 
    If
        Next
    End 
    Function

    Public Function 
    Them(frmName As Form)
        n 1
        Call UnLocktxt
    (frmName)
        Call ThemEn(frmName)
    End Function

    Public Function 
    Luu(frmName As FormTabName As StringMa As String)
        Dim Ans
        Ans 
    MsgBox("Ban muon luu mau tin nay?"vbYesNo"Luu hay khong")
        If Ans <> vbYes Then
            frmName
    .Undo
            Call LuuEn
    (frmName)
        Else
            If 1 Then
                Dim rs 
    As Recordset
                Set rs 
    CurrentDb.OpenRecordset(TabNamedbOpenTable)
                rs.Index "PrimaryKey"
                rs.Seek "="Ma
                
    If Not rs.NoMatch Then
                    MsgBox 
    "Trung Ma", , "Chu y"
                    Exit Function
                Else
                    Call LuuEn(frmName)
                End If
            Else
                Call LuuEn(frmName)
            End If
        End If
        frmName.Requery
        Call Locktxt
    (frmName)
    End Function

    Public Function 
    Sua(frmName As Form)
        n 2
        Call UnLocktxt
    (frmName)
        frmName.cmdThem.Enabled False
        frmName
    .cmdXoa.Enabled False
        frmName
    .cmdDau.Enabled False
        frmName
    .cmdTruoc.Enabled False
        frmName
    .cmdSau.Enabled False
        frmName
    .cmdCuoi.Enabled False
        frmName
    .cmdLuu.SetFocus
        frmName
    .cmdSua.Enabled False
    End 
    Function

    Public Function 
    LuuEn(frmName As Form)
        frmName.cmdSua.Enabled True
        frmName
    .cmdXoa.Enabled True
        frmName
    .cmdDau.Enabled True
        frmName
    .cmdTruoc.Enabled True
        frmName
    .cmdSau.Enabled True
        frmName
    .cmdCuoi.Enabled True
        frmName
    .cmdThem.Enabled True
    End 
    Function

    Public Function 
    ThemEn(frmName As Form)
        frmName.cmdSua.Enabled False
        frmName
    .cmdXoa.Enabled False
        frmName
    .cmdDau.Enabled False
        frmName
    .cmdTruoc.Enabled False
        frmName
    .cmdSau.Enabled False
        frmName
    .cmdCuoi.Enabled False
        frmName
    .cmdLuu.SetFocus
        frmName
    .cmdThem.Enabled False
    End 
    Function

    Public Function 
    LoadForm(frmName As FormTabName As String)
        frmName.RecordSource TabName
        Call Locktxt
    (frmName)
        Dim rs As Recordset
        Set rs 
    CurrentDb.OpenRecordset(TabNamedbOpenTable)
        If rs.RecordCount 0 Then
            frmName
    .cmdSua.Enabled False
            frmName
    .cmdXoa.Enabled False
            frmName
    .cmdDau.Enabled False
            frmName
    .cmdTruoc.Enabled False
            frmName
    .cmdSau.Enabled False
            frmName
    .cmdCuoi.Enabled False
        End 
    If
    End Function

    Public Function 
    Xoa(frmName As FormTabName As StringMa As String)
        Dim Ans
        Ans 
    MsgBox("That su muon xoa mau tin nay?"vbYesNo"Xoa Hay Khong")
        If Ans vbYes Then
            DoCmd
    .SetWarnings (False)
            Application.RunCommand acCmdDeleteRecord
            MsgBox 
    "Da xoa xong"
            DoCmd.SetWarnings (True)
            Dim rs As Recordset
            Set rs 
    CurrentDb.OpenRecordset(TabNamedbOpenTable)
            If rs.RecordCount 0 Then
                frmName
    .cmdSua.Enabled False
                frmName
    .cmdXoa.Enabled False
                frmName
    .cmdDau.Enabled False
                frmName
    .cmdTruoc.Enabled False
                frmName
    .cmdSau.Enabled False
                frmName
    .cmdCuoi.Enabled False
            
    Else
                frmName.Repaint
                Call VeDau
            End 
    If
        Else
            frmName.Repaint
            Call VeDau
        End 
    If
    End Function

    Public Function 
    ThoatForm(frmName As Form)
        Application.DoCmd.Close
    End 
    Function 


    Và code cho frmKhachHang(Ví dụ cho một form)

    Mã PHP:
    Option Compare Database
    Option Explicit

    Private Sub cmdCuoi_Click()
        Call VeCuoi
    End Sub

    Private Sub cmdDau_Click()
        Call VeDau
    End Sub

    Private Sub cmdLuu_Click()
        Call Luu(Me"tblKhachHang"Me.txtMa)
    End Sub

    Private Sub cmdSau_Click()
        Call VeSau
    End Sub

    Private Sub cmdSua_Click()
        Call Sua(Me)
    End Sub

    Private Sub cmdThem_Click()
        Call Them(Me)
        DoCmd.GoToRecord , , acNewRec
    End Sub

    Private Sub cmdThoat_Click()
        Call ThoatForm(Me)
    End Sub

    Private Sub cmdTruoc_Click()
        Call VeTruoc
    End Sub

    Private Sub cmdXoa_Click()
        Call Xoa(Me"tblKhachHang"Me.txtMa)
    End Sub

    Private Sub Form_Load()
        Call LoadForm(Me"tblKhachHang")
        Me.txtMa.ControlSource "MaKhach"
        Me.txtTen.ControlSource "TenKhach"
    End Sub 

    Bản Demo viết vội chưa test kỹ. các bạn nhớ kiểm tra lại
    Thân mến