Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Access chạy sai sau khi split Database
#1
Chào các bạn,
Mình có file Access ví dụ mình gửi kèm gồm có 1 textbox chứa số recordcount trong bảng vật tư và 1 button để đưa số record vào. Khi chưa dùng chức năng Split database để tách dữ liệu và form ra thành Back-end và frond-end thì chạy đúng nhưng sau khi tách thì lại chạy sai(Số recordcount=1).
Mong các bạn giúp đỡ vì mình đang cần gấp
Mã:
Private sub demRecord()
    dim db as dao.database
    dim rs as dao.recordset
    
    Set db = currentdb
    set rs = db.openrecordset("VATTU")

    Text0.value = rs.recordcount
End sub

trong Table VATTU của mình có 24 record khi chưa split thì ok, split xong thì chỉ còn 1 030

p/s nhân tiện cho mình hỏi các table đã split rồi thì làm thế nào đưa nó vào như bình thường được, mình thấy có chỗ "Convert to local table" nhưng chẳng thấy tác dụng. Thank 015
Chữ ký của canhcfc Xin chào, mình là canhcfc, Tham gia http://thuthuataccess.com/forum từ ngày 24-09 -14.
Reply
Những người đã cảm ơn
#2
Không cần DAO to búa lớn vậy đâu 014

bạn chỉ cần như sau là được:
Mã:
Text0.value = DCount("*", "VATTU")
Chữ ký của MatTroiNguQuen Thời gian nước chảy... da mòn
Ngủ quên một chốc thấy còn bộ xương!
Reply
Những người đã cảm ơn
#3
Nếu vẫn thích DAO thì code như sau:

Mã:
Private Sub demRecord()
    Dim rs As dao.Recordset
    Set rs = CurrentDb.OpenRecordset("SELECT Count(*) as RCnt FROM "VATTU"", dbOpenSnapshot)
    Text0.Value = rs!RCnt
End Sub

Còn đưa các table đã split vào trở lại thì đơn giản là import nó trở lại thui (Trên menu chọn External Data > Access > ... )
Chữ ký của MatTroiNguQuen Thời gian nước chảy... da mòn
Ngủ quên một chốc thấy còn bộ xương!
Reply
Những người đã cảm ơn
#4
(09-11-14, 12:51 PM)MatTroiNguQuen Đã viết: Nếu vẫn thích DAO thì code như sau:

Mã:
Private Sub demRecord()
    Dim rs As dao.Recordset
    Set rs = CurrentDb.OpenRecordset("SELECT Count(*) as RCnt FROM "VATTU"", dbOpenSnapshot)
    Text0.Value = rs!RCnt
End Sub

Còn đưa các table đã split vào trở lại thì đơn giản là import nó trở lại thui (Trên menu chọn External Data > Access > ... )

Cảm ơn bạn đã giúp nhưng ý mình là vẫn dùng cấu trúc lênh trên nhưng câu lệnh chạy đúng như khi chưa split
Lý do vì mình viết chương trình quản lý vật tư cũng đã nhờ bạn giúp, trong đó có câu lệnh:
Mã:
db.openrecordset("VATTU")
Khi đó nếu split ra thì chương trình sẽ chạy sai, mình muốn khi split thì chương trình vẫn chạy như vậy
Theo mình nghĩ thì do mình set db=currentdb mà khí đó cái currentdb không phải là file back-end nên nó chạy sai. Phiền bạn giúp027
Chữ ký của canhcfc Xin chào, mình là canhcfc, Tham gia http://thuthuataccess.com/forum từ ngày 24-09 -14.
Reply
Những người đã cảm ơn
#5
Không phải nó chạy sai mà là thuộc tính RecordCount không trả về tổng số mẫu tin có trong Recordset mà nó trả về số mẫu tin có trong Recordset đã được truy cập. Vì vậy để đếm tất cả các mẫu tin có trong Recordset ta phải duyệt qua các mẫu tin với lệnh rs.MoveLast rồi mới rs.RecordCount.

Mã:
Private sub demRecord()
    dim db as dao.database
    dim rs as dao.recordset
    
    Set db = currentdb
    set rs = db.openrecordset("VATTU")
    rs.MoveLast
    Text0.value = rs.recordcount
End sub

Bạn tham khảo thêm ở đây:
http://msdn.microsoft.com/en-us/library/...e.15).aspx
Chữ ký của MatTroiNguQuen Thời gian nước chảy... da mòn
Ngủ quên một chốc thấy còn bộ xương!
Reply
Những người đã cảm ơn Noname
#6
Còn vấn đề bạn thắc mắc tại sao khi chưa Split thì trả về đúng?
vì khi đó câu lệnh set rs = db.openrecordset("VATTU") bạn không định kiểu cho recordset nên Access tự định kiểu dbOpenTable và trong trường hợp này thì không cần MoveLast

Sau khi Split thì sử dụng Linked Tables nên không thể định kiểu dbOpenTable, Access tự chuyển sang kiểu dbOpenDynaset, khi đó bắt buộc phải MoveLast trước khi sử dụng thuộc tính recordcount thì Access mới trả về đúng tổng số mẩu tin có trong Recordset

Tuy nhiên bạn nên đọc kỹ các dòng này (trong link mình giới thiệu trong bài trên):

Trích dẫn:Note
Using the MoveLast method to populate a newly opened Recordset negatively impacts performance. Unless it is necessary to have an accurate RecordCount as soon as you open a Recordset, it's better to wait until you populate the Recordset with other portions of code before checking the RecordCount property.
Chữ ký của MatTroiNguQuen Thời gian nước chảy... da mòn
Ngủ quên một chốc thấy còn bộ xương!
Reply
Những người đã cảm ơn Noname
#7
Cảm ơn bạn @MatTroinguQuen, bạn hiểu về VBA nhiều quá.
Do mình không biết về recordcount nên mình đã giải quyết bằng cách sau:
* Không gán db = currentdb mà thay bằng :
Mã:
db = opendatabase(Me.Application.Currentproject.path & "\DATA_QLVT.accdb")
Và nhờ bạn giải thích nên mình đã hiểu cách câu lệnh trên hoạt động
Thanks!015
Chữ ký của canhcfc Xin chào, mình là canhcfc, Tham gia http://thuthuataccess.com/forum từ ngày 24-09 -14.
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
  Tránh xung đột dữ liệu trong access quocdung9999 16 1,688 23-11-16, 11:13 AM
Bài mới nhất: quocdung9999
  Summary bằng VBA trong MS Access. MinhnHang 6 315 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 141 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 139 21-10-16, 11:11 AM
Bài mới nhất: Minh Tiên
  [Help] Truy vấn ngày phát sinh gần nhất trong access cuuvinh 4 225 21-09-16, 05:01 PM
Bài mới nhất: cuuvinh

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ơ