Khắc phục chế độ tự động lưu và tính tự động của access
muaphonui_2010 > 20-12-11, 04:13 PM
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.