Cải thiện tốc độ xử lý code trong MS access

Liên hệ QC

tuannvdshl

Thành viên mới
Tham gia
28/6/11
Bài viết
13
Được thích
3
Kính chào các Anh/Chị trong diễn đàn Giaiphapexcel.

Tôi tự mày mò tạo một ứng dụng Quản lý văn bản trên MS Access. Toàn bộ Code trong ứng dụng đều xin trên Giaiphapexcel, chắp nối lại để sử dụng (không nhớ đã lấy code của những ai). Xin cảm ơn các tác giả đã chia sẻ code.

Ứng dụng của tôi có 02 files. Một file là giao diện, một file chứa dữ liệu được link vào file giao diện.

Các file văn bản cần quản lý được lưu trong một thư mục, bao gồm 02 thư mục con là "Vanban_di" và "Vanban_den". Trong mỗi thư mục con đó lại chứa các thư mục con theo năm ban hành văn bản. Mỗi khi có văn bản mới thì copy các file vào các thư mục con theo năm ban hành tương ứng.

Tại file giao diện, tôi tạo một nút "Cập nhật files". Khi nhấn chuột vào nó, ứng dụng sẽ tự động cập nhật đường dẫn của file mới copy đó vào cột "Đường dẫn" xuống dòng dưới cùng chưa có dữ liệu và giữ nguyên các dữ liệu đã có trong cột. Người dùng nhấn chuột vào đường link để mở file và điền các thông tin như số, ngày, trích yếu văn bản vào các cột khác tương ứng.

Đối với tôi, ứng dụng nhỏ này đã đáp ứng được nhu cầu sử dụng của bản thân mình. Tuy nhiên có một vấn đề: Khi số lượng văn bản đi hoặc đến chưa nhiều (dưới 1.000 văn bản) thì tốc độ cập nhật đường link các file mới chấp nhận được. Nhưng khi số lượng văn bản lớn hơn (trên 1.000 văn bản) thì tốc độ cập nhật đường link tương đối chậm (tuỳ lúc), có khi mất 5 đến 10 phút. Vậy xin các Anh/Chị trên diễn đàn giúp đỡ: Sửa code để tăng tốc độ cập nhật đường link các file văn bản hoặc đưa ra giải pháp khác (bao gồm cả sửa code, sửa các query...) để cải thiện tốc độ cập nhật đường link các file văn bản.

Xin trân trọng cảm ơn các Anh/Chị.

Do file có dung lượng lớn hơn 1MB nên tôi đưa lên Google Driver (đường dẫn để tải file ở phía dưới), mong các Anh/Chị thông cảm.

FrontEnd:


BackEnd:

 
Đối với tôi, ứng dụng nhỏ này đã đáp ứng được nhu cầu sử dụng của bản thân mình. Tuy nhiên có một vấn đề: Khi số lượng văn bản đi hoặc đến chưa nhiều (dưới 1.000 văn bản) thì tốc độ cập nhật đường link các file mới chấp nhận được. Nhưng khi số lượng văn bản lớn hơn (trên 1.000 văn bản) thì tốc độ cập nhật đường link tương đối chậm (tuỳ lúc), có khi mất 5 đến 10 phút. Vậy xin các Anh/Chị trên diễn đàn giúp đỡ: Sửa code để tăng tốc độ cập nhật đường link các file văn bản hoặc đưa ra giải pháp khác (bao gồm cả sửa code, sửa các query...) để cải thiện tốc độ cập nhật đường link các file văn bản.

Theo tôi thì bạn nên làm ngược lại với cách cập nhật hiện tại.
- Nhập thông tin văn bản vào table trước.
- Quét các tập tin trong thư mục Văn bản đến/đi, nếu tìm thấy tên File đúng nội dung yêu cầu thì mới cập nhật cái link đó vào table.
Cách làm của bạn hiện tại là cứ có văn bản mới là xóa toàn bộ table, lưu lại toàn bộ đường link tới file mới, nó phải xử lý toàn bộ link. Cách này không có gì đảm bảo mỗi dòng thông tin văn bản của bạn (dựa vào ID) được lưu đúng với Hyperlink của file văn bản đó.
Nói thêm là có một kỹ thuật rất đơn giản giúp tăng tốc kết nối giữa 2 file giao diện (Font end) và file CSDL (back end) của bạn bằng cách tạo kết nối liên tục. Cái này nói sau.
 
Theo tôi thì bạn nên làm ngược lại với cách cập nhật hiện tại.
- Nhập thông tin văn bản vào table trước.
- Quét các tập tin trong thư mục Văn bản đến/đi, nếu tìm thấy tên File đúng nội dung yêu cầu thì mới cập nhật cái link đó vào table.
Cách làm của bạn hiện tại là cứ có văn bản mới là xóa toàn bộ table, lưu lại toàn bộ đường link tới file mới, nó phải xử lý toàn bộ link. Cách này không có gì đảm bảo mỗi dòng thông tin văn bản của bạn (dựa vào ID) được lưu đúng với Hyperlink của file văn bản đó.
Nói thêm là có một kỹ thuật rất đơn giản giúp tăng tốc kết nối giữa 2 file giao diện (Font end) và file CSDL (back end) của bạn bằng cách tạo kết nối liên tục. Cái này nói sau.
Cảm ơn Anh đã phản hồi sớm. Tôi không biết nhiều về lập trình, chỉ cóp nhặt cái người khác có vận dụng cho mình thôi. Xin Anh bớt chút thời gian hướng dẫn chi tiết hơn.
 
Cảm ơn Anh đã phản hồi sớm. Tôi không biết nhiều về lập trình, chỉ cóp nhặt cái người khác có vận dụng cho mình thôi. Xin Anh bớt chút thời gian hướng dẫn chi tiết hơn.
À còn một cái nữa thực hiện đơn giản hơn là chia nhỏ Folder lưu văn bản xuống thêm mấy cấp nữa thì việc quét các file trong folder con sẽ nhẹ nhàng hơn nhiều.
Ví dụ: Bạn chia nhỏ Folder đến cấp [Năm], nếu một năm nhiều văn bản quá thì chia thêm cấp [Tháng].
[Van Ban Den] - [Nam] - [Thang]
Hoặc
[Van Ban Den] -[Loai Van Ban]- [Nam] - [Thang]
...
Qui trình thao tác là khi muốn cập nhật, chỉ chọn Năm, Tháng phát sinh văn bản mới mà quét chọn, khi đó sẽ giảm thiểu nhiều thời gian xử lý hơn.
Nói thêm là đối với tôi, khi viết ứng dụng đâu nhất thiết phải tự mình phải viết code riêng toàn bộ, cái nào người ta đã viết hay, tốt, phù hợp rồi thì xài thôi chứ hơi đâu viết lại, tốn thời gian. Kỹ năng cần là làm sao tìm được code đúng yêu cầu.:D
Chi tiết xử lý như thế nào thì để chiều, tối rảnh tôi đọc kỹ thêm rồi trao đổi tiếp được nhé.
 
À còn một cái nữa thực hiện đơn giản hơn là chia nhỏ Folder lưu văn bản xuống thêm mấy cấp nữa thì việc quét các file trong folder con sẽ nhẹ nhàng hơn nhiều.
Ví dụ: Bạn chia nhỏ Folder đến cấp [Năm], nếu một năm nhiều văn bản quá thì chia thêm cấp [Tháng].
[Van Ban Den] - [Nam] - [Thang]
Hoặc
[Van Ban Den] -[Loai Van Ban]- [Nam] - [Thang]
...
Qui trình thao tác là khi muốn cập nhật, chỉ chọn Năm, Tháng phát sinh văn bản mới mà quét chọn, khi đó sẽ giảm thiểu nhiều thời gian xử lý hơn.
Nói thêm là đối với tôi, khi viết ứng dụng đâu nhất thiết phải tự mình phải viết code riêng toàn bộ, cái nào người ta đã viết hay, tốt, phù hợp rồi thì xài thôi chứ hơi đâu viết lại, tốn thời gian. Kỹ năng cần là làm sao tìm được code đúng yêu cầu.:D
Chi tiết xử lý như thế nào thì để chiều, tối rảnh tôi đọc kỹ thêm rồi trao đổi tiếp được nhé.
Cảm ơn Anh nhiều. Rất mong tiếp tục nhận được hướng dẫn của anh để tôi có thể hoàn thiện được ứng dụng.
 
Cảm ơn Anh nhiều. Rất mong tiếp tục nhận được hướng dẫn của anh để tôi có thể hoàn thiện được ứng dụng.

Trước mắt tôi chỉ sửa tạm chút xíu code ghi tên file vào table Access cho nhanh hơn chút (hơn ~ 5 lần - do dùng Recordset chứ không phải Insert into..). Bỏ code dư thừa, trùng lập không cần thiết. Tôi có thêm cái Form chạy ẩn, tạo kết nối liên tục, khi đó file FE của bạn kết nối với BE qua Linked Table sẽ chạy nhanh cũng như Local Table.

Link: https://www.mediafire.com/file/cte55l6rl1qwncz/QLVB_%28chinh_thuc%29.zip/file

Ý kiến thêm:
- Nếu tên file, folder như hiện tại, không có dùng tiếng Việt có dấu thì code lấy tên file (Dir) chạy rất nhanh. Giữ qui tắc đặt tên như vậy luôn là tốt nhất.
- Nếu thư mục lưu các văn bản đến/ đi bạn chỉ lưu trên máy tính cá nhân, không có dùng để chia sẽ kết nối qua mạng thì hàm Dir() lấy tên file còn chạy được, nếu nó là ổ đĩa mạng (ví dụ: có đường dẫn như: \\NHANSU\Data...") thì hàm Dir() sẽ không chạy được. Trường hợp này bạn phải dùng Map Drive.

Nếu nói về xây dựng CSDL thì có nhiều cái nói:
- Bạn xem lại cơ bản cách đặt tên các đối tượng trong Access: các tiếp đầu ngữ cho việc đặt tên Table, Query....để dễ phân biệt trong code. Bạn đặt tên như hiện tại, trong code tôi không biết bạn đang tham chiếu tới cái Table, Query hay Form..
- Về CSDL: hiện tại không có sự kết nối nào giữa các dòng lưu thông tin file văn bản đến/đi với cái file (tên file) thực tế trong thư mục lưu văn bản.
Ví dụ: tôi muốn kiếm thủ công VB có [ID] là "1249" hoặc [Số ký hiệu] : 2611/ĐS - CDĐS thì qua thư mục chứa file văn bản tìm như thế nào? Người tìm bằng mắt còn chưa ra thì làm sao code cho máy tìm và gán đúng được.
Bạn xây dựng lại CSDL cho chuẩn rồi thì query, code đi theo nó cũng dễ dàng, nhẹ nhàng hơn.

(PS: @Kiều Mạnh sẵn muốn test cái hàm Hàm tìm kiếm File duyệt folder đệ quy nhanh nhất GPE cho tới thời điểm hiện tại nhưng cả 32 và 64 bit đều báo lỗi không Auto Open, đăng ký qua Regsv32 cũng không được )
 
Trước mắt tôi chỉ sửa tạm chút xíu code ghi tên file vào table Access cho nhanh hơn chút (hơn ~ 5 lần - do dùng Recordset chứ không phải Insert into..). Bỏ code dư thừa, trùng lập không cần thiết. Tôi có thêm cái Form chạy ẩn, tạo kết nối liên tục, khi đó file FE của bạn kết nối với BE qua Linked Table sẽ chạy nhanh cũng như Local Table.

Link: https://www.mediafire.com/file/cte55l6rl1qwncz/QLVB_%28chinh_thuc%29.zip/file

Ý kiến thêm:
- Nếu tên file, folder như hiện tại, không có dùng tiếng Việt có dấu thì code lấy tên file (Dir) chạy rất nhanh. Giữ qui tắc đặt tên như vậy luôn là tốt nhất.
- Nếu thư mục lưu các văn bản đến/ đi bạn chỉ lưu trên máy tính cá nhân, không có dùng để chia sẽ kết nối qua mạng thì hàm Dir() lấy tên file còn chạy được, nếu nó là ổ đĩa mạng (ví dụ: có đường dẫn như: \\NHANSU\Data...") thì hàm Dir() sẽ không chạy được. Trường hợp này bạn phải dùng Map Drive.

Nếu nói về xây dựng CSDL thì có nhiều cái nói:
- Bạn xem lại cơ bản cách đặt tên các đối tượng trong Access: các tiếp đầu ngữ cho việc đặt tên Table, Query....để dễ phân biệt trong code. Bạn đặt tên như hiện tại, trong code tôi không biết bạn đang tham chiếu tới cái Table, Query hay Form..
- Về CSDL: hiện tại không có sự kết nối nào giữa các dòng lưu thông tin file văn bản đến/đi với cái file (tên file) thực tế trong thư mục lưu văn bản.
Ví dụ: tôi muốn kiếm thủ công VB có [ID] là "1249" hoặc [Số ký hiệu] : 2611/ĐS - CDĐS thì qua thư mục chứa file văn bản tìm như thế nào? Người tìm bằng mắt còn chưa ra thì làm sao code cho máy tìm và gán đúng được.
Bạn xây dựng lại CSDL cho chuẩn rồi thì query, code đi theo nó cũng dễ dàng, nhẹ nhàng hơn.

(PS: @Kiều Mạnh sẵn muốn test cái hàm Hàm tìm kiếm File duyệt folder đệ quy nhanh nhất GPE cho tới thời điểm hiện tại nhưng cả 32 và 64 bit đều báo lỗi không Auto Open, đăng ký qua Regsv32 cũng không được )
Cảm ơn Anh rất nhiều vì đã dành thời gian quý báu của mình để giúp đỡ. Những hướng dẫn của Anh làm cho tôi học hỏi được rất nhiều. Tôi thực sự rất ngưỡng mộ tài năng và tâm huyết của Anh đối với các thành viên trong nhóm.
 
Trước mắt tôi chỉ sửa tạm chút xíu code ghi tên file vào table Access cho nhanh hơn chút (hơn ~ 5 lần - do dùng Recordset chứ không phải Insert into..). Bỏ code dư thừa, trùng lập không cần thiết. Tôi có thêm cái Form chạy ẩn, tạo kết nối liên tục, khi đó file FE của bạn kết nối với BE qua Linked Table sẽ chạy nhanh cũng như Local Table.

Link: https://www.mediafire.com/file/cte55l6rl1qwncz/QLVB_%28chinh_thuc%29.zip/file

Ý kiến thêm:
- Nếu tên file, folder như hiện tại, không có dùng tiếng Việt có dấu thì code lấy tên file (Dir) chạy rất nhanh. Giữ qui tắc đặt tên như vậy luôn là tốt nhất.
- Nếu thư mục lưu các văn bản đến/ đi bạn chỉ lưu trên máy tính cá nhân, không có dùng để chia sẽ kết nối qua mạng thì hàm Dir() lấy tên file còn chạy được, nếu nó là ổ đĩa mạng (ví dụ: có đường dẫn như: \\NHANSU\Data...") thì hàm Dir() sẽ không chạy được. Trường hợp này bạn phải dùng Map Drive.

Nếu nói về xây dựng CSDL thì có nhiều cái nói:
- Bạn xem lại cơ bản cách đặt tên các đối tượng trong Access: các tiếp đầu ngữ cho việc đặt tên Table, Query....để dễ phân biệt trong code. Bạn đặt tên như hiện tại, trong code tôi không biết bạn đang tham chiếu tới cái Table, Query hay Form..
- Về CSDL: hiện tại không có sự kết nối nào giữa các dòng lưu thông tin file văn bản đến/đi với cái file (tên file) thực tế trong thư mục lưu văn bản.
Ví dụ: tôi muốn kiếm thủ công VB có [ID] là "1249" hoặc [Số ký hiệu] : 2611/ĐS - CDĐS thì qua thư mục chứa file văn bản tìm như thế nào? Người tìm bằng mắt còn chưa ra thì làm sao code cho máy tìm và gán đúng được.
Bạn xây dựng lại CSDL cho chuẩn rồi thì query, code đi theo nó cũng dễ dàng, nhẹ nhàng hơn.

(PS: @Kiều Mạnh sẵn muốn test cái hàm Hàm tìm kiếm File duyệt folder đệ quy nhanh nhất GPE cho tới thời điểm hiện tại nhưng cả 32 và 64 bit đều báo lỗi không Auto Open, đăng ký qua Regsv32 cũng không được )
cái đó là sao tôi ko có hiểu chi tiết lắm ... hôm rồi thấy keo chạy tốt rồi Mà ???
 
cái đó là sao tôi ko có hiểu chi tiết lắm ... hôm rồi thấy keo chạy tốt rồi Mà ???
Xin lỗi bạn. Mấy hôm trước chạy test trên Win7, 10, office 32... mà cứ báo lỗi không LoadLibrayA() được. Sau đó tôi có xử lý một số code khác (không liên quan) phải xử lý quyền chạy Excel, Windows User các kiểu. Thời gian sau chạy test lại file của bạn thì chạy được. Giờ tôi cũng không nhớ rõ đã xử lý các gì, có thể là phân quyền hệ thống nên nó chạy không lỗi.
 
Web KT

Bài viết mới nhất

Back
Top Bottom