Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Hỏi] Between fied đã convert bằng hàm datevalue
#21
(17-03-18, 09:26 PM)ongke0711 Đã viết: Phải nói cho rõ thêm là điểm mạnh, yếu của cách dùng Form.Filter so với Form.Recordset (dùng câu lệnh SQL để filter - WHERE…).
Thực ra tôi cũng chưa trải nghiệm so sánh 2 cách này đối với CSDL lớn nhưng đối với CSDL nhỏ thì bạn chẳng thấy được sự khác biệt về tốc độ xử lý.
Tôi thường dựa trên nguyên tắc là “dữ liệu trả về” càng nhỏ thì tốc độ xử lý càng nhanh. Bạn sẽ thấy rõ điều này khi truy xuất dữ liệu của table trong file BE lưu trên máy chủ. Nếu bạn dùng câu lệnh SQL “Select… Where…” dữ liệu sẽ được lọc ít lại rồi mới đưa vào làm RecordSource cho Form. Nếu dùng Form.Filter thì RecordSource của Form sẽ load toàn bộ records rồi mới Filter theo điều kiện đưa vào sau đó. Từ đó ta thấy tốc độ load Form theo cách sau sẽ bị ảnh hưởng nhiều hơn cách đầu tiên. Hơn nữa nếu dùng “Select…Where..” thì bộ máy của Access sẽ tận dụng các chỉ mục (index) đã thiết lập sẵn của table để truy tìm, lọc dữ liệu nhanh hơn dò từng dòng trong Form.Filter.
Về điểm mạnh thì việc viết code vba của Form.Filter sẽ gọn hơn chút so với dùng “Select….Where…” thay thế Form.RecordSource.
Vd: khi bạn muốn hiển thị toàn bộ records
- Form.Filter: bạn chỉ cần dùng Form.FilterOn = False
- Form.RecordSource: bạn phải viết lại câu lệnh “Select * From…” rồi thay thế RecordSource của Form.
Nói tóm lại dùng câu lệnh “Select…Where..” sẽ nhanh hơn.

Hay quá, cho mình hỏi cái index, cái mà mình thắc mắc lâu rồi. Thường mình dùng định danh cho 1 record nào đấy bằng khóa chính, ví dụ mahd chằng hạn. Nhưng có cách nào tìm ra định danh cứng của record đó không, kiểu như không cần biết mahd là gì chỉ cần chỉ ra cái định danh cứng đó thì tự động tìm đến record tương ứng. Ví dụ như combobox ấy, dù cho record source có lấy từ bảng nào, nhưng trên vba chỉ cần dùng combobox.listindex là ra dòng thứ mấy trong combo đó. Tương tự không biết có cách nào tìm ra định danh cứng của record trên table hay không. Mục đích của việc tìm định danh cứng này của mình là để áp dụng vào việc tìm ra record nào đang bị khóa khi sử dụng form record lock.

Trên sqlserver thì có cái index cho từng record trên table, giúp cho truy vấn nhanh hơn. Không biết là trên access có cái index này không.
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#22
(18-03-18, 10:23 AM)mrsiro Đã viết: Hay quá, cho mình hỏi cái index, cái mà mình thắc mắc lâu rồi. Thường mình dùng định danh cho 1 record nào đấy bằng khóa chính, ví dụ mahd chằng hạn. Nhưng có cách nào tìm ra định danh cứng của record đó không, kiểu như không cần biết mahd là gì chỉ cần chỉ ra cái định danh cứng đó thì tự động tìm đến record tương ứng. Ví dụ như combobox ấy, dù cho record source có lấy từ bảng nào, nhưng trên vba chỉ cần dùng combobox.listindex là ra dòng thứ mấy trong combo đó. Tương tự không biết có cách nào tìm ra định danh cứng của record trên table hay không. Mục đích của việc tìm định danh cứng này của mình là để áp dụng vào việc tìm ra record nào đang bị khóa khi sử dụng form record lock.

Trên sqlserver thì có cái index cho từng record trên table, giúp cho truy vấn nhanh hơn. Không biết là trên access có cái index này không.

Về index thì bạn xem bài này tôi mới post.
http://thuthuataccess.com/forum/thread-10443.html

Về định danh cứng thì từ này tôi không biết nhưng nếu nói về Table của Access thì nó gọi là Khóa chính (Primary key - PK), Khóa phụ hay khóa ngoại (Foreign Key - FK). Cái PK chính là định dạnh cứng cho record đó rồi còn gì. PK nó dùng phân biệt record này với record khác và không được trùng nhau. Trong ví dụ của bạn là [mahd], nếu bạn không dùng [mahd] làm PK thì dùng một trường khác dạng Auto Number là PK cũng được, lúc đó không cần quan tâm [mahd] là gì.
Còn về Combobox thì bắt buộc cột đầu tiên trong Record Source phải là Khóa chính (PK) của nguồn dữ liệu đó để tham chiếu trong bảng. Khi dùng Combobox.ListIndex thì nó đã chỉ ra vị trí thứ mấy của dòng được chọn (selected) trong cái combobox đó rồi. Nếu bạn muốn lấy giá trị của Record tại cái ListIndex =i vừa tìm được thì bạn dùng: ComboBox.Value = ComboBox.ItemData(i). 
Về việc tìm ra Record nào bị khóa thì có liên quan gì đến định danh cứng, bạn chỉ cần dùng code thư viện DAO là xác định Record nào đang bị lock rồi.
Mặc định trong Form của Access nếu record nào bị lock sẽ có ký hiệu hình tròn gạch chéo ở đầu record đó. Còn nếu bạn muốn tìm thì dùng code như sau: code giả định thôi.
---------------------------------------------------------
On Error Go To KhoaRecord_Error
Dim rs As DAO. Recordset
rs.Edit
rs.MoveNext

KhoaRecord_Error:
If Err.Number = 3218 Then  ---> Khi record bị khóa sẽ báo lỗi này
   Msgbox "Record đang bị khóa"
Else
   Msgbox Err.Number & vbNewLine & Err.Description
End If
----------------------------------------------------------

Bạn muốn biết ai đang khóa record đó thì tham khảo code trong bài này:
http://etutorials.org/Microsoft+Products...d+by+Whom/
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (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
  [Help] Hỏi về phương pháp lọc dữ liệu sau khi joins từ bảng khác sang HoangManh 2 722 20-06-17, 08:19 PM
Bài mới nhất: tranthanhan1962
  [Help] Edit record từ from vào bảng thông qua query. HoangManh 5 911 02-06-17, 11:35 AM
Bài mới nhất: tranthanhan1962
  Xóa dữ liệu ở các bảng ChiMai 6 1,539 17-11-16, 05:12 PM
Bài mới nhất: Trần Linh
Photo CHUYỂN BẢNG Che_Guevara 4 794 25-07-16, 12:47 AM
Bài mới nhất: tt1212
  Hướng Dẫn Tạo bảng tổng hợp công từ bảng chấm công PhucKK 1 745 02-01-16, 11:04 AM
Bài mới nhất: ongke0711

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ơ| PMA Nha Trang| Gỗ Acrylic Không Đường Line