pherotao > 31-12-17, 12:58 AM
tranthanhan1962 > 31-12-17, 10:01 AM
pherotao > 31-12-17, 05:45 PM
(31-12-17, 10:01 AM)tranthanhan1962 Đã viết: Phải có CSDL cụ thể mới biết được lỗi của nó
ongke0711 > 02-01-18, 04:21 PM
(31-12-17, 12:58 AM)pherotao Đã viết: Chào mọi người!
Nhờ mọi người hướng dẫn lại cách thao tác trên Unbound Form của Access được không ạ.
Cụ thể là tôi có làm 1 UnboundForm (F_Hàng Hóa) với các textbox là MaHH (khóa chính), TenHH, QuiCach, DVT.
Tôi có vẽ 1 Listbox, để khi bấm vào Listbox này, các thông tin về hàng hóa sẽ hiện lên trên các textbox tương ứng.
Tôi cũng vẽ các nút lệnh: "Xóa, Sửa, Ghi, Thêm, Không" để phục vụ cho việc nhập liệu. Đặc biệt nút Ghi dùng chung cho cả trường hợp Thêm mới và Sửa chữa.
Tôi nhận ra rằng, nút Sửa không thi hành được vì vướng báo lỗi khóa chính, cụ thể là ở dòng Update.
- Nếu "Thêm" là:
rs.Addnew
...
rs.Update
- Thì "Sửa" sẽ là:
rs.Edit
...
rs.Update ' Và nó bị lỗi ở đây
Một lần nữa, tôi đã làm phiền đến các anh/chị trên diễn đàn.
pherotao > 02-01-18, 06:14 PM
(02-01-18, 04:21 PM)ongke0711 Đã viết:(31-12-17, 12:58 AM)pherotao Đã viết: Chào mọi người!
Nhờ mọi người hướng dẫn lại cách thao tác trên Unbound Form của Access được không ạ.
Cụ thể là tôi có làm 1 UnboundForm (F_Hàng Hóa) với các textbox là MaHH (khóa chính), TenHH, QuiCach, DVT.
Tôi có vẽ 1 Listbox, để khi bấm vào Listbox này, các thông tin về hàng hóa sẽ hiện lên trên các textbox tương ứng.
Tôi cũng vẽ các nút lệnh: "Xóa, Sửa, Ghi, Thêm, Không" để phục vụ cho việc nhập liệu. Đặc biệt nút Ghi dùng chung cho cả trường hợp Thêm mới và Sửa chữa.
Tôi nhận ra rằng, nút Sửa không thi hành được vì vướng báo lỗi khóa chính, cụ thể là ở dòng Update.
- Nếu "Thêm" là:
rs.Addnew
...
rs.Update
- Thì "Sửa" sẽ là:
rs.Edit
...
rs.Update ' Và nó bị lỗi ở đây
Một lần nữa, tôi đã làm phiền đến các anh/chị trên diễn đàn.
Trường hợp này của bạn cũng đơn giản thôi.
- Tạo 1 cái biến tạm. Ví dụ: Public strEdiAddStatus As String
- Khi bấm nút [Sửa] thì gán biến strEditAddStatus = "Sua". Khi bấm nút [Them] thì gán biến strEditAddStatus = "Them".
- Khi đó code cho nút [Ghi] sẽ dùng Select Case strEditAddStatus
Vd:
Select Case strEditAddStatus
Case "Sua"
rs.Edit
Case "Them"
rs.AddNew
End Select
Một góp ý là rất hạn chế sử dụng "On Error Resume Next" nếu bạn chưa bẫy được lỗi lập trình. Như code của bạn đang dùng, nó sẽ bỏ qua lỗi để xử lý tiếp mà bạn không biết cái lỗi đó nghiêm trọng cỡ nào.
Private Sub Ghi_Click()
'On Error Resume Next
Dim DB As Database
Dim rs As Recordset
Set DB = CurrentDb
Set rs = DB.OpenRecordset("SELECT * FROM T_HangHoa")
Select Case strEditAddStatus
Case "Sua"
rs.Edit
Case "Them"
rs.AddNew
End Select
rs("MaHH") = Me.txtMaHH.Value
rs("TenHH") = Me.txtTenHH.Value
rs("QuiCach") = Me.txtQuiCach.Value
rs("DVT") = Me.txtDVT.Value
rs.Update
Me.txtMaHH = Null
Me.txtTenHH = Null
Me.txtQuiCach = Null
Me.txtDVT = Null
Me.txtMaHH.Locked = True
Me.txtTenHH.Locked = True
Me.txtQuiCach.Locked = True
Me.txtDVT.Locked = True
Me.txtMaHH.SetFocus
rs.Close
Me.List.Requery
Ghi.Visible = False
Khong.Visible = False
Xoa.Visible = True
Sua.Visible = True
Them.Visible = True
End Sub
ongke0711 > 02-01-18, 10:59 PM
Private Sub Ghi_Click()
Dim DB As DAO.Database
Dim rs As DAO.Recordset
Set DB = CurrentDb
Set rs = DB.OpenRecordset("SELECT * FROM T_HangHoa")
Select Case strEditAddStatus
Case "Sua"
rs.FindFirst "[MaHH] = '" & Me.txtMaHH.Value & "'"
If Not rs.NoMatch Then
rs.Edit
rs("TenHH") = Me.txtTenHH.Value
rs("QuiCach") = Me.txtQuiCach.Value
rs("DVT") = Me.txtDVT.Value
End If
Case "Them"
rs.AddNew
rs("MaHH") = Me.txtMaHH.Value
rs("TenHH") = Me.txtTenHH.Value
rs("QuiCach") = Me.txtQuiCach.Value
rs("DVT") = Me.txtDVT.Value
End Select
rs.Update
Me.txtMaHH = Null
Me.txtTenHH = Null
Me.txtQuiCach = Null
Me.txtDVT = Null
Me.txtMaHH.Locked = True
Me.txtTenHH.Locked = True
Me.txtQuiCach.Locked = True
Me.txtDVT.Locked = True
Me.txtMaHH.SetFocus
rs.Close
Me.List.Requery
Ghi.Visible = False
Khong.Visible = False
Xoa.Visible = True
Sua.Visible = True
Them.Visible = True
End Sub
pherotao > 02-01-18, 11:12 PM
(02-01-18, 10:59 PM)ongke0711 Đã viết: - Theo như code của bạn, thì khi vào chế độ [Sửa] thì rs có biết record nào để sửa không? -> Không. Code Edit bạn cũng chọn nguyên cái rs = DB.OpenRecordset("SELECT * FROM T_HangHoa") và vô rs.Edit -> chương trình biết sửa cái record nào? Nó chọn đại cái record đầu tiên rồi Edit -> dẫn đến trùng MaHH.
- Sửa lại: Bạn nên dùng thư viện DAO. Nó mạnh vậy mà bạn không ngâm cứu sử dụng.
Mã PHP:Private Sub Ghi_Click()
Dim DB As DAO.Database
Dim rs As DAO.Recordset
Set DB = CurrentDb
Set rs = DB.OpenRecordset("SELECT * FROM T_HangHoa")
Select Case strEditAddStatus
Case "Sua"
rs.FindFirst "[MaHH] = '" & Me.txtMaHH.Value & "'"
If Not rs.NoMatch Then
rs.Edit
rs("TenHH") = Me.txtTenHH.Value
rs("QuiCach") = Me.txtQuiCach.Value
rs("DVT") = Me.txtDVT.Value
End If
Case "Them"
rs.AddNew
rs("MaHH") = Me.txtMaHH.Value
rs("TenHH") = Me.txtTenHH.Value
rs("QuiCach") = Me.txtQuiCach.Value
rs("DVT") = Me.txtDVT.Value
End Select
rs.Update
Me.txtMaHH = Null
Me.txtTenHH = Null
Me.txtQuiCach = Null
Me.txtDVT = Null
Me.txtMaHH.Locked = True
Me.txtTenHH.Locked = True
Me.txtQuiCach.Locked = True
Me.txtDVT.Locked = True
Me.txtMaHH.SetFocus
rs.Close
Me.List.Requery
Ghi.Visible = False
Khong.Visible = False
Xoa.Visible = True
Sua.Visible = True
Them.Visible = True
End Sub
- Ở chế độ rs.Edit, bạn không thể sửa field chứa Primary Key [MaHH] vì nó liên quan đến các table khác. Nếu muốn sửa Primary Key thì xóa record đó luôn rồi tạo lại.
ongke0711 > 02-01-18, 11:53 PM