ongke0711 > 17-03-20, 02:02 PM
 ).
 .![[Hình: 49667897188_511586ff14_o.png]](https://live.staticflickr.com/65535/49667897188_511586ff14_o.png)
Option Compare Database
Option Explicit
Dim arrArgs() As String
Private Sub cmdClose_Click()
    Set WS = Nothing    'Phai dóng WS, neu không Access không thoát hoan toàn.
    DoCmd.Close
End Sub
Private Sub cmdHuy_Click()
    WS.Rollback
    WS.BeginTrans
    Me.Refresh  'Tránh báo lõi #name khi click nhieu lan.
End Sub
Private Sub cmdLuu_Click()
    WS.CommitTrans
    SetFormState False
    Me.Recalc  'De AllowEdit có tác dung
    'Requery các form liên quan
    Select Case arrArgs(2)
    Case "frmDSPhieuNhapXuat"
        Forms!frmDSPhieuNhapXuat!sfmDSPhieuNX.Requery
    Case Else
        'do nothing
    End Select
End Sub
Private Sub cmdThem_Click()
    'Xu ly WS de tranh loi khi them moi.
    If Me.cmdLuu.Enabled = True Then
        If msgBoxUni("B" & ChrW(7841) & "n có mu" & ChrW(7889) & "n L" & ChrW(432) & "u d" & ChrW(7919) & " li" & ChrW(7879) & "u hi" & ChrW(7879) & "n t" & ChrW(7841) & "i tr" & ChrW(432) & ChrW(7899) & "c khi m" & ChrW(7903) & " phi" & ChrW(7871) & "u m" & ChrW(7899) & "i?", vbQuestion + vbYesNo, "Thông báo") = vbYes Then
            WS.CommitTrans  'Phai ket thuc phiên Transaction cu, moi gan rs cho subF duoc.
        Else
            WS.Rollback
        End If
    End If
    arrArgs(0) = "Add"
    NapPhieuNhap
    
    SetFormState True
End Sub
Private Sub Form_Load()
    Set WS = DBEngine.Workspaces(0)
    If Len(Nz(Me.OpenArgs, "")) > 0 Then
        arrArgs = Split(Me.OpenArgs, "|")
    Else    'Mo tu Menu
        ReDim arrArgs(0 To 2) As String
        arrArgs(0) = "Add"
        arrArgs(1) = ""
        arrArgs(2) = ""
    End If
    NapPhieuNhap
End Sub
Sub NapPhieuNhap()
    Dim db As DAO.Database
    'Dim rs As DAO.Recordset, rs2 As DAO.Recordset  '-->Khai báo toàn cuc
    Dim strSQL As String, strSQL2 As String
    Set db = CurrentDb
    Select Case arrArgs(0)
    Case "Add"
        strSQL = "SELECT * FROM tblNhapXuat WHERE 1=2"
        strSQL2 = "SELECT 'Xóa' As Xoa,* FROM tblNhapXuat_CT WHERE 1=2"
    Case "Edit"
        strSQL = "SELECT * FROM tblNhapXuat WHERE ID=" & arrArgs(1)
        strSQL2 = "SELECT 'Xóa' As Xoa, * FROM tblNhapXuat_CT WHERE IDPhieu=" & arrArgs(1)
    End Select
    Set rs = Nothing    'Tránh lõi khi gán rs moi, khi chon dòng khác - Sua
    Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
    Set Me.Recordset = rs
    Set rs2 = Nothing
    Set rs2 = db.OpenRecordset(strSQL2, dbOpenDynaset)
    If rs2.BOF And rs2.EOF Then
        'Bãy lôi khi mo recordset thêm moi. Chua có du lieu de MoveLast.
    Else
        rs2.MoveLast  'Phai activate rs2 de lay toàn bo record gán vào SubF, neu không se treo ung dung.
    End If
    Set Me.sfmNhapXuatCT.Form.Recordset = rs2
    WS.BeginTrans
End Sub
Sub SetFormState(blnState As Boolean)
    Me.cmdClose.SetFocus
    Me.cmdLuu.Enabled = blnState
    Me.cmdHuy.Enabled = blnState
    Me.cmdThem.Enabled = blnState
    Me.AllowEdits = blnState
    Me.cmdThem.Enabled = Not blnState
    Me.sfmNhapXuatCT.Locked = Not blnState
End Sub 
dotrung > 23-03-20, 06:37 PM
ongke0711 > 01-04-20, 01:35 AM
![[Hình: 49720911836_5093b6a335_o.png]](https://live.staticflickr.com/65535/49720911836_5093b6a335_o.png)
Option Compare Database
Option Explicit
Function GetRecord(rs As DAO.Recordset, frm As Form)
On Error GoTo ErrHandler
    Dim fld As Field
    Dim ctl As control
    For Each fld In rs.Fields
        For Each ctl In frm.Controls
            If ctl.Name = "txt" & fld.Name Or ctl.Name = "cbo" & fld.Name Or ctl.Name = "chk" & fld.Name Or ctl.Name = "fra" & fld.Name Then
                ctl = rs.Fields("" & fld.Name & "").Value
            ElseIf ctl.Name = "img" & fld.Name Then
                If Not IsNull(rs.Fields("" & fld.Name & "").Value) Then
                    On Error Resume Next
                    ctl.Picture = CStr(rs.Fields("" & fld.Name & "").Value)
                End If
            End If
        Next
    Next
    'rs.Close  '-> Không close, de tái su dung cho hàm Update/Add trong form
    'Set rs = Nothing'
    Exit Function
Exit_ErrHandler:
    On Error Resume Next
    rs.Close
    Set rs = Nothing
    Exit Function
ErrHandler:
    msgBoxUni "Mã l" & ChrW(7895) & "i: " & Err.Number & vbCrLf _
              & "N" & ChrW(7897) & "i dung l" & ChrW(7895) & "i: " & Err.Description, vbCritical, "Get Record Error"
    Resume Exit_ErrHandler
End Function
Function AddRecord(rs As DAO.Recordset, frm As Form)
    On Error GoTo ErrHandler
    Dim fld As Field
    Dim ctl As control
    rs.AddNew
    For Each fld In rs.Fields
        For Each ctl In frm.Controls
            If ctl.Name = "txt" & fld.Name Or ctl.Name = "cbo" & fld.Name Or ctl.Name = "chk" & fld.Name Then
                rs.Fields("" & fld.Name & "").Value = ctl
            End If
        Next
    Next
    rs.Update
    'rs.Close
    'Set rs = Nothing
    Exit Function
Exit_ErrHandler:
    On Error Resume Next
    rs.Close
    Set rs = Nothing
    Exit Function
ErrHandler:
    msgBoxUni "L" & ChrW(432) & "u d" & ChrW(7919) & " li" & ChrW(7879) & "u th" & ChrW(7845) & "t b" & ChrW(7841) & "i." & vbCrLf & vbCrLf _
              & "Mã l" & ChrW(7895) & "i: " & Err.Number & vbCrLf _
              & "N" & ChrW(7897) & "i dung l" & ChrW(7895) & "i: " & Err.Description, vbCritical, "Add Record Error"
    Resume Exit_ErrHandler
End Function
Function UpdateRecord(rs As DAO.Recordset, frm As Form)
    On Error GoTo ErrHandler
    Dim fld As Field
    Dim ctl As control
    rs.Edit
    For Each fld In rs.Fields
        For Each ctl In frm.Controls
            If ctl.Tag Like "no" Then
                'do nothing'
            Else
                If ctl.Name = "txt" & fld.Name Or ctl.Name = "cbo" & fld.Name Or ctl.Name = "chk" & fld.Name Then
                    rs.Fields("" & fld.Name & "").Value = ctl
                End If
            End If
        Next ctl
    Next fld
    rs.Update
    'fMsgBox getMes(26), vbInformation, getTit(1)'
    'rs.Close
    'Set rs = Nothing
    Exit Function
Exit_ErrHandler:
    On Error Resume Next
    rs.Close
    Set rs = Nothing
    Exit Function
ErrHandler:
    msgBoxUni "L" & ChrW(432) & "u d" & ChrW(7919) & " li" & ChrW(7879) & "u th" & ChrW(7845) & "t b" & ChrW(7841) & "i." & vbCrLf & vbCrLf _
              & "Mã l" & ChrW(7895) & "i: " & Err.Number & vbCrLf _
              & "N" & ChrW(7897) & "i dung l" & ChrW(7895) & "i: " & Err.Description, vbCritical, "Update Record Error"
    Resume Exit_ErrHandler
End Function
Public Sub ClearRecord(frm As Form)
    Dim ctl As control
    For Each ctl In frm.Controls
        If ctl.Tag Like "no" Then
            'do nothing'
        Else
            Select Case ctl.ControlType
            Case acTextBox, acComboBox
                ctl.Value = ""
            Case acCheckBox
                ctl.Value = False
            Case acImage
                ctl.Picture = ""
            Case Else
                'do nothing'
            End Select
        End If
    Next
End Sub 
![[Hình: 49720985936_d8372e000b_o.png]](https://live.staticflickr.com/65535/49720985936_d8372e000b_o.png)
dotrung > 01-04-20, 10:29 PM
huuduy.duy > 16-04-20, 04:10 PM
(01-04-20, 01:35 AM)ongke0711 Đã viết: -----------------------------------------------------------------------------------------
Phần 2: Unbound Form với thiết kế kiểu Main - Subform
Do yêu cầu công việc phải chọn nhiều nhân viên từ Danh sách nhân viên chung, nên em thay Subform thành Listbox để chọn nhân viên qua lại giữ 2 Listbox.
Phần Form Phiếu Yêu cầu đào tạo: sẽ cập nhật thông tin như:
1/ Người yêu cầu, nội dung yêu cầu, Thời gian đào tạo, Nơi đào tạo, .. cập nhật vào bảng tblPhieuYeuCau
2/ Mỗi phiếu Yêu cầu như vậy sẽ chọn ra danh sách nhân viên từ 1 danh sách nhân viên chung của Cty cần đào tạo theo nội dung đó và ghi bảng tblNhanVienDaDaoTao.
Em lầm đến đoạn gọi Phiếu Yêu cầu lên để bổ sung thêm nhân viên cần đào tạo thì bị lỗi. Nhờ anh xem giúp
Trân trọng cảm ơn
Link
** Ngoài cách sử dụng Listbox, thì mình có thể sủ dụng Subform có checkbox để check những nhân viên cần chọn được không anh
[img]http://[/img]
Xuân Thanh > 16-04-20, 10:15 PM
huuduy.duy > 16-04-20, 11:27 PM
(16-04-20, 10:15 PM)Xuân Thanh Đã viết: 1/ Gọi hết danh sách nhân viên đưa vào list bên phảiCái này được rồi anh.
2/ Cái list bên trái chỉ làm list tạm. Sau khi đưa hết danh sách đã chọn từ list bên phải qua thì mới cập nhật vào tblPhieuYeuCau
huuduy.duy > 16-04-20, 11:39 PM
(16-04-20, 11:30 PM)Xuân Thanh Đã viết:(16-04-20, 11:27 PM)huuduy.duy Đã viết: Cái này được rồi anh.
Chỉ còn 1 cái là gọi lại cái đã nhập để bổ sung thêm nhân viên từ bên phải vào bên trái ạ
Thì lôi ngược cái table PYC đó ra dễ ẹc mà
ongke0711 > 17-04-20, 12:31 AM
(16-04-20, 04:10 PM)huuduy.duy Đã viết: Do yêu cầu công việc phải chọn nhiều nhân viên từ Danh sách nhân viên chung, nên em thay Subform thành Listbox để chọn nhân viên qua lại giữ 2 Listbox.
Phần Form Phiếu Yêu cầu đào tạo: sẽ cập nhật thông tin như:
1/ Người yêu cầu, nội dung yêu cầu, Thời gian đào tạo, Nơi đào tạo, .. cập nhật vào bảng tblPhieuYeuCau
2/ Mỗi phiếu Yêu cầu như vậy sẽ chọn ra danh sách nhân viên từ 1 danh sách nhân viên chung của Cty cần đào tạo theo nội dung đó và ghi bảng tblNhanVienDaDaoTao.
Em lầm đến đoạn gọi Phiếu Yêu cầu lên để bổ sung thêm nhân viên cần đào tạo thì bị lỗi. Nhờ anh xem giúp
Trân trọng cảm ơn
Link
** Ngoài cách sử dụng Listbox, thì mình có thể sủ dụng Subform có checkbox để check những nhân viên cần chọn được không anh