Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Khắc phục chế độ tự động lưu và tính tự động của access
#1
Hôm nay rảnh rảnh mình viết cho vui và chia sẽ với mọi người 1 ý tưởng nho nhỏ.
Mình sẽ hướng dẫn cho các bạn tập sự 1 vài thủ thuật tự chế để khắc phục chế độ tự lưu và 1 số vấn đề khác liên quan đến tự lưu trong acces.
- Thứ nhất :
+ Access luôn tự động lưu dữ liệu khi ta không nhấn nút lưu.
+ Có khi nào các bạn muốn phần mềm của mình không tự động lưu không, giống như các PM viết trên VB đó.
+ Tuy cách của mình nó không triệt để, nhưng nó cũng có tác dụng nho nhỏ

1 : Trước khi thiết kế Pm các bạn thiết kế thêm trong Table 1 trường tên là "Đã Lưu"
VD : Table "T_phieuthu" gồm : ngaythang,makhach.tenkhach,diengiai,sotien,daluu,....
2: Qua bên Forms ta thiết kế 1 Forms "F_phieuthu" để nhập dữ liệu cho Table "T_phieuthu"
- Thiết kế trên Forms ta ẩn trường "đã thu" đi, bằng thuộc tính Visible chọn No, thì khi Forms chạy nó sẽ ẩn đi, người dùng không thấy được.
- Ta tắt nút Close của Forns đi , bằng cách chọn thuộc tính Close button = no, mục đích là để cho người dùng không thể tắt Forms bằng nút Close mà phải nhấn vào Button nút "Thoát" do ta thiết kế, nhằm thực hiện 1 code sau này mình viết bên dưới .( Với sự kiện Form_Close() mình đã thử nghiệm rồi không được, nên mình chỉ làm trên nút thoát thôi.)
3. Tiếp theo ta viết thêm cho nút "Lưu" của ta để khi người dùng nhấn nút "lưu" nếu thỏa các điều kiện như : mã khách không được bỏ trống, số tiền khác 0..... thì lưu lại và chex đánh dấu vào chexbox ("đã lưu" = true)
=> khi người dùng nhấn vào nút lưu thì dữ liệu sẽ lưu lại và đồng thời chex vào ô "đã lưu", code chex ta viết sau.
Code cho nút lưu
Private Sub luu_Click()
.......................
đã lưu.value= true ' với code này thì nó sẽ đánh dấu chọn vào ô "Đã Lưu"
......................
End Sub

Tương tự ta viết cho nút Mới (thêm) ( nên nhớ là để code đã "lưu.value= true " trước khi tạo mới bảng ghi nhé, để cho bảng ghi mới sẽ chưa được chọn thì ok, chỉ chọn vào bảng gi củ thôi)
Tương tự ta để vào các nút duyệt bảng ghi <<, <, >, >>, kiểm tra xem có được lưu chưa, nếu chưa thì xóa đi trước khi di chuyển sang dòng khác.
Đến đây như vậy dù lưu hay mới liên tiếp bảng ghi ta đều được đánh đấu chọn vào ô "Đã Lưu"
Các bạn thử suy luận đi có đúng vậy không nhé.

4. Làm code cho nút "Thoát"
Như vậy ta chỉ có 1 trường hợp là khi tạo mới bảng ghi lần cuối cùng thì ô "đã lưu" sẽ chưa được chọn.
Và ta viết code cho nút "Thoát" trước khi thoát kiểm tra xem ô "đã lưu" được chọn chưa, nếu chưa thì xóa dòng đó đi.
với code sau:

If đã lưu = False Then
DoCmd.SetWarnings False
DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70
DoCmd.SetWarnings True
Else
End If

On Error GoTo Err_thoat_Click


DoCmd.Close acForm, "F_phieuthu", acSaveYes


Exit_thoat_Click:
Exit Sub

Err_thoat_Click:
MsgBox Err.Description
Resume Exit_thoat_Click

=>xong
- với các làm trên còn có thể sẩy ra các trường hợp không khắc phục được như sau:
+ người dùng tạo mới bảng ghi xong, nhập 1 ít dữ liệu và tắt Forms bằng nút Close của chương trình
+ và người dùng lăn con chột để duyệt các bảng ghi thì không khi nhấn nút thoát thì dòng hiện tại đã thay đổi, nên khi thoát không xóa được dòng chưa lưu.
Còn 1 cách nữa là ta tạo 1 query xóa : với điều kiện là "đã lưu" = False
như vậy trước khi hành động gì thì ta chạy query này thì ok.
Không biết mình viết như vậy các bạn có hiểu không, nhưng mình đã cố gắng hết sức, mong các bạn thông cảm
chủ yếu là ý tưởng của các bạn như thế nào thôi.





Chữ ký của muaphonui_2010 "Cần cù bù thông minh"
Reply
Những người đã cảm ơn Noname
#2
Tiếp theo mình sẽ hướng đẫn cho các bạn cách tự động nhập đơn giá, thành tiền ...khi ta chọn mã hàng, hay tự động nhập tên khách, địa chỉ...khi ta chọn mã khách
Và tối ưu hóa nút sửa .
Ý tưởng là : hạn chế sửa dữ liệu , vì access tự lưu dữ liệu thì thật nguy hiểm khi người dùng vô tình làm sai dữ liệu so với dữ liệu ban đầu, khi người dùng không có ý định sửa nó.
Chủ yếu ta đựa vào thuộc tính .Locked , thuộc tính này dùng để khóa các texbox....
(nếu các bạn kết hợp với phân quyền cho người dùng thì tối ưu hóa là cao nhất, như vậy nếu người nào được quyền sửa thì mới được sửa (các bạn có thể xem các phần quyần người dùng trong access, mình viết trong chủ đề trước)).
- Thứ nhất:
Giả sử ta đã tạo 1 Forms để nhập dữ liệu rồi
tiếp theo ta chọn tất các thuộc tính Locked = yes của textbox và supform ( = yes là để khóa các các đối tượng này lại, không cho người dùng thao tác , thay đổi nó). như vậy các bạn sẽ nghĩ rằng vậy làm sao ta nhập dữ liệu ? " đùng vội hjhjhhj"

Và giả sử ta thiết kế thêm 5 nút : Mới, Lưu, sửa , Xóa, thoát . và các nút di chuyển lên Forms

Với nút Mới: thì trước khi tạo bảng ghi mới ta mở khóa cho các textbox và supform . như vậy khi người dùng nhấn nút Mới thì các textbox và supform đã cho thao tác
VD minh họa :
Mã:
Private Sub moi_Click()
sp.Locked = False
ngaythang.Locked = False
makhach.Locked = False
noidung.Locked = False
sotien.Locked = False
tenkhach.Locked = False
diachi.Locked = False
thucuathang.Locked = False
nam.Locked = False
nguoinoptien.Locked = False

DoCmd.GoToRecord , , acLast
If makhach <> "" And thucuathang <> "" And sotien <> "0" Then
makhach.SetFocus
On Error GoTo Err_moi_Click
   DoCmd.GoToRecord , , acLast
   txtsp.Value = Val(Mid([sp], 7, 5))
    DoCmd.GoToRecord , , acNewRec

sp.Value = "PT/" & Month(Date) & "/" & txtsp + 1
  
Exit_moi_Click:
Else
MsgBox "Chu' y':Ban chua cap nhat day du du lieu," & vbCrLf & "yeu cau ban phai cap nhat day du du~ lieu truoc' khi tao bang moi'"
Exit Sub
Err_moi_Click:
    MsgBox "Chu' y' So' Phieu' nay` da ton` tai ( da trung`)." & vbCrLf & " Bay gio` ban hay sua~ so' phieu' [" & sp & "] nay` thanh` so' phieu' khac' " & vbCrLf & " va sau do' luu lai,roi` moi' tiep' tuc lam` tiep' duoc! "

    Resume Exit_moi_Click
    End If  
End Sub

Và đến nút Lưu ta cũng làm tương tự, nhưng lại là khóa các textbox và supform này lại, khô cho thao tác.
VD minh họa :
Mã:
Private Sub luu_Click()
On Error GoTo Err_luu_Click
If makhach <> "" And thucuathang <> "" And sotien <> "0" Then
sp.Locked = True
ngaythang.Locked = True
makhach.Locked = True
noidung.Locked = True
sotien.Locked = True
tenkhach.Locked = True
diachi.Locked = True
thucuathang.Locked = True
nam.Locked = True
nguoinoptien.Locked = True

Else
ngaythang.SetFocus
MsgBox "Chu' y': ban chua cap nhat day du du lieu", vbOKOnly + vbExclamation, "THONG BAO"

End If

    DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70

Exit_luu_Click:
    Exit Sub

Err_luu_Click:
    MsgBox " Chu' y': so' phieu' [" & sp & "]nay` da ton` tai, xin vui long` kiem~ tra lai", vbOKOnly + vbExclamation, "THONG BAO"
    
    Resume Exit_luu_Click
End Sub
Còn đối với nút sửa thì mở khóa ra để sửa ;
VD minh họa
Mã:
Private Sub sua_Click()
sp.Locked = False
ngaythang.Locked = False
makhach.Locked = False
noidung.Locked = False
sotien.Locked = False
tenkhach.Locked = False
diachi.Locked = False
thucuathang.Locked = False
nam.Locked = False
nguoinoptien.Locked = False
    
End Sub

Tương tự ta làm cho các nút di chuyển khóa các textbox và supform lại : với mục đích là khi người dùng vừa tạo mới bảng ghi mà chưa lưu lại mà di chuyển thì khóa các textbox và supform lại, để trách người dùng tạo mới để mở khóa các textbox và supform rồi di chuyển đến dòng khác để sửa.

Tiếp theo mình tạo tự động điền đơn giá, thành tiền tự tính, tương tự chọn mã khách thi tên khách tự nhập vào....
- Mình chủ yếu dùng hàm Vlookup kế hợp với query và thuộc tính Value trong Vb
cú pháp như sau:
tenkhach.Value = DLookup("tenkhach", "Q_dotenkhachphieuthu")
với "Q_dotenkhachphieuthu" là 1 query và điều kiện lọc là Forms.F_phieuthu.makhach, và nguồn của query là T_danhmuckhachhang
VD minh họa khi ta chọn mã khách thì tên khách, địa chỉ tự nhập lên như sau;
Mã:
Private Sub makhach_Click()
tenkhach.Value = DLookup("tenkhach", "Q_dotenkhachphieuthu")
diachi.Value = DLookup("diachi", "Q_dotenkhachphieuthu")
End Sub

Như vậy tương tự ta làm cho các "Phiếu bán hàng chi tiết" để tự dò lấy đơn giá để bán hàng....
- ta có thể dùng các sự khiện sau để gài người dùng để lấy giá bán: Sự kiện CLick chọn mã hàng hoặc sự kiện GotFocus().....
VD minh họa:
Mã:
Private Sub dongia_GotFocus()
'If mahang <> "" Then ' nếu mã hàng khác rổng thì mới thực hiện
'If (DLookup("nhomkhach", "Q_dokhachhangsuachua")) = "Khach le" Then
'dongia.Value = DLookup("giabanle", "Q_domahangsuachua")

'Else
'dongia.Value = DLookup("giabansi", "Q_domahangsuachua")
'End If
Else
End If
End Sub

Phân tích:
Với code trên thì dù có 1 trường hợp là người dùng nhập giá khác so với giá tự động lấy lên để bán hàng. xong. đến 1 ngày nào đó người dùng mở lại số phiếu này và vô tình click chột vào thì giá nó sẽ thay đổi vì mình gài ở sự kiện khi con trỏ nhãy vào textbox thì tự động lấy giá lên trong khi đó các textbox và supform đang còn khóa ( locked như bài viết ở trên)=> như vậy là không đạt yêu cầu.

vậy ta thêm 1 điều kiện nữa là : nếu mã "Mã hàng" khác rổng và "Supform.locked = False" thì mới thực hiện tự động...
VD minh họa ( lấy từ code trên):

Mã:
Private Sub dongia_GotFocus()
'If mahang <> "" and [b]Forms!F_banhang!supform.Locked = false [/b]Then  ' nếu mã hàng khác rổng và chưa khóa thì mới thực hiện
'If (DLookup("nhomkhach", "Q_dokhachhangsuachua")) = "Khach le" Then
'dongia.Value = DLookup("giabanle", "Q_domahangsuachua")

'Else
'dongia.Value = DLookup("giabansi", "Q_domahangsuachua")
'End If
Else
End If
End Sub

Tương tự các bạn mở rộng cho các phần khác
Xong!
Mình viết bài này với mục đích chính là ý tưởng của mình, chứ mình viết như vậy thì các bạn cở mức trung bình mới có thể làm được, vì nó liên quan đến code .
các bạn cứ thử đi có gì không đồng ý hay không hiểu thì liên lạc vơi mình.
Chữ ký của muaphonui_2010 "Cần cù bù thông minh"
Reply
Những người đã cảm ơn Noname
#3
Mình vẫn ko hiểu lắm bạn có file code nút Lưu, Thêm, Xóa ko cho mình với
Chữ ký của nhokkungfubmt Xin chào, mình là nhokkungfubmt, Tham gia http://thuthuataccess.com/forum từ ngày 24-03 -13.
Reply
Những người đã cảm ơn
#4
(24-03-13, 04:06 PM)nhokkungfubmt Đã viết: Mình vẫn ko hiểu lắm bạn có file code nút Lưu, Thêm, Xóa ko cho mình với

Để mỉnh nói tóm tắc lại cho dễ hiểu 1 chút nhé.
-Access nó tự động lưu dữ liệu
-Ta thiết kế Tables bình thường nhưng thêm 1 cột "Đã Lưu" (VD : Tables_Phiếu Thu: sophieu, makhach, ngaythang, noidung, sotien... daluu)
Giờ mình nói qua thiết kế Form vẫn thiết kế bình thường.
==> Mình suy luận về các bước người dùng sẽ thao tác trên Form:
- Người dùng mở Form lên và nhập dữ liệu vào, Lúc này sãy ra 2 trường hợp:
+ trường hợp 1 : Người dùng nhập hết, và nhấn nút lưu
+ trường hợp 2 : Người dùng nhập lỡ dỡ ( nhập chưa hết ) và không nhấn nút lưu mà tắt ngang. ( cái này access tự lưu ==> ta khắc phụ chế độ tự lưu này)
===> Cách làm: Ta viết code cho nút Lưu / khi người dùng nhấn vào nút Lưu thì tự động check vào CheckBox_ĐãLưu = true ==> như vậy ta hiểu là người dùng đã chấp nhận lưu rồi ( vì Check_ĐãLưu = true
Tiếp ta Viết code cho nút Thoát : trước khi thoát thì kiểm tra xem Check_ĐãLưu = true hay Check_ĐãLưu = False ===> như vậy Nếu Check_ĐãLưu = False thì xóa ngay trước khi thoát
Code bạn xem bên trên.
Bạn kết hợp với code khóa (.Locked = False, .Locked = True) để cho nó hoàn hảo hơn
Mong giúp dc bạn
Thân chào!
Chữ ký của muaphonui_2010 "Cần cù bù thông minh"
Reply
Những người đã cảm ơn Noname
#5
Tham khảo thêm cái này
http://thuthuataccess.com/forum/thread-5350.html
Thân mến
Chữ ký của Xuân Thanh Trăm năm trước thì ta chưa gặp
Trăm năm sau biết gặp được không?
Cuộc đời sắc sắc không không
Thì thôi ta cứ hết lòng vì nhau
ღღღღღTài sản của Xuân Thanh (View All Items) ღღღღღ
Reply
Những người đã cảm ơn


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  Sựa khác nhau giữa Module và Class Module, phạm vi áp dụng của từng loại. MinhnHang 6 302 29-11-16, 09:11 PM
Bài mới nhất: ongke0711
  Tránh xung đột dữ liệu trong access quocdung9999 16 1,689 23-11-16, 11:13 AM
Bài mới nhất: quocdung9999
  Summary bằng VBA trong MS Access. MinhnHang 6 317 08-11-16, 08:36 AM
Bài mới nhất: MinhnHang
  [Hỏi] Số Thứ Tự Theo Nhóm Hàng Hóa Trong Access pherotao 2 145 02-11-16, 03:05 PM
Bài mới nhất: pherotao
  [Hỏi] Viết code có điều kiện " lệnh Chạy tiếp khi đóng tbl cho sẵn" Trần Linh 3 140 21-10-16, 11:11 AM
Bài mới nhất: Minh Tiên

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ