Làm sao để phát hiện Duplicate trong CSDL

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

syquyen1987

Thành viên hoạt động
Tham gia
8/7/18
Bài viết
188
Được thích
43
Kính gửi các Anh,

Em có một thắc mắc có thể tương lai gặp phải vấn đề như sau:

Hiện nay, em đang sử dụng File Excel để kết nối tới file Database Access, File Excel sẽ tạo thêm/chỉnh sửa dữ liệu từ Database Access (Người sử dụng chỉ thao tác trên file Excel).

Sau khi hoàn thành bước nhập dữ liệu trong file Excel, thì trước khi tạo thêm dữ liệu vào file Database Access, em có làm điều kiện để xem dữ liệu ở file excel đang nhập có trùng dữ liệu với file Database Access hay không, nếu trùng thì sẽ hiển thị thông báo cho người sử dụng.

Cách để xem dữ liệu trùng nhau hay không thì bước làm em đang thực hiện như sau: Sẽ copy toàn bộ data ở "Trường A" từ Database Access tới một cột Excel, và điền thêm dữ liệu từ file excel đang nhập vào. Sử dụng Object Dictionary để phát hiện.

Tuy nhiên, tương lai tới thì Data ở "Trường A" từ Database Access sẽ lên tới hơn 1 triệu dòng, và lúc này cách ở trên không thể thực hiện được (Vượt quá số dòng Excel cho phép). Em đang nghĩ tới Data Model trong Power Query của Excel, nhưng em chưa biết cách làm. Kính nhờ các Anh biết cách làm hướng dẫn giúp em. Em xin cảm ơn ạ
 
Vấn đề này thuộc về Data Integration và Data Integrity. Chỉ viết code thực hiện thì rất dễ. Hầu hết các người biết code ở đây đều viết được. Nhưng code như vậy chỉ là chữa cháy, bởi vì chúng không đi sâu vào mầm mống chính của vấn đề.

Cái từ đầu bạn muốn là giải pháp lâu dài, không phải chữa cháy.
Cách duy nhất là bạn tự làm, tự viết code, chỉ hỏi những chỗ gút mắc (bí). Nhờ người khác viết code thì chỉ phí công người ta thôi. Code chạy cứ ba bữa lại phải chỉnh sửa. Trừ phi người viết đã nghiên cứu và thấu hiểu cái điểm Data Integration trong hệ thống của bạn.

Chú: Data Integration là công việc của hàng cao cấp. Trong một đồ án phần mềm, người phụ trách khâu này thường có địa vị cao hơn Senior/Chief Developer (tức là Trưởng nhóm lập trình).
 
Vấn đề này thuộc về Data Integration và Data Integrity. Chỉ viết code thực hiện thì rất dễ. Hầu hết các người biết code ở đây đều viết được. Nhưng code như vậy chỉ là chữa cháy, bởi vì chúng không đi sâu vào mầm mống chính của vấn đề.

Cái từ đầu bạn muốn là giải pháp lâu dài, không phải chữa cháy.
Cách duy nhất là bạn tự làm, tự viết code, chỉ hỏi những chỗ gút mắc (bí). Nhờ người khác viết code thì chỉ phí công người ta thôi. Code chạy cứ ba bữa lại phải chỉnh sửa. Trừ phi người viết đã nghiên cứu và thấu hiểu cái điểm Data Integration trong hệ thống của bạn.

Chú: Data Integration là công việc của hàng cao cấp. Trong một đồ án phần mềm, người phụ trách khâu này thường có địa vị cao hơn Senior/Chief Developer (tức là Trưởng nhóm lập trình).
A ngủ muộn thế ạ?
 
Cách để xem dữ liệu trùng nhau hay không thì bước làm em đang thực hiện như sau: Sẽ copy toàn bộ data ở "Trường A" từ Database Access tới một cột Excel, và điền thêm dữ liệu từ file excel đang nhập vào. Sử dụng Object Dictionary để phát hiện.
Copy bằng cách gì ?
 
Bạn dùng chính ADODB mà tìm giữ liệu trùng là được, ADODB nhanh, không cần đến thư viện nào bên ngoài
 
rảnh thử dò xem nó ra cái gì xong tính tiếp ... giải pháp tốt nhất là tự thân dò xong bí khúc nào hỏi khúc đó xong lại dò tiếp

Tôi dò trên Delphi Em ChatGPT gợi ý cho như sau ... xong đúng hay sai thì ta phải thử xong mới biết :D

SQL là chuẩn chung rồi thì sử dụng trên VBA,VB6 hay Delphi cũng vậy thôi

Mã:
 Query.SQL.Text := 'SELECT COUNT(*) FROM TableName WHERE UniqueField = :UniqueFieldValue';
 
Lần chỉnh sửa cuối:
rảnh thử dò xem nó ra cái gì xong tính tiếp ... giải pháp tốt nhất là tự thân dò xong bí khúc nào hỏi khúc đó xong lại dò tiếp

Tôi dò trên Delphi Em ChatGPT gợi ý cho như sau ... xong đúng hay sai thì ta phải thử xong mới biết :D

SQL là chuẩn chung rồi thì sử dụng trên VBA,VB6 hay Delphi cũng vậy thôi

Mã:
 Query.SQL.Text := 'SELECT COUNT(*) FROM TableName WHERE UniqueField = :UniqueFieldValue';
Đúng là cứ SQL mà làm, vì đã liên quan database
nên chuẩn hóa dữ liệu từ giai đoạn nhập thì sẽ không trùng, và nhanh hơn là để đến lúc nhập vào mới kiểm tra
Bài đã được tự động gộp:

rảnh thử dò xem nó ra cái gì xong tính tiếp ... giải pháp tốt nhất là tự thân dò xong bí khúc nào hỏi khúc đó xong lại dò tiếp

Tôi dò trên Delphi Em ChatGPT gợi ý cho như sau ... xong đúng hay sai thì ta phải thử xong mới biết :D

SQL là chuẩn chung rồi thì sử dụng trên VBA,VB6 hay Delphi cũng vậy thôi

Mã:
 Query.SQL.Text := 'SELECT COUNT(*) FROM TableName WHERE UniqueField = :UniqueFieldValue';
Đúng là cứ SQL mà làm, vì đã liên quan database
nên chuẩn hóa dữ liệu từ giai đoạn nhập thì sẽ không trùng, và nhanh hơn là để đến lúc nhập vào mới kiểm tra
Bài đã được tự động gộp:

rảnh thử dò xem nó ra cái gì xong tính tiếp ... giải pháp tốt nhất là tự thân dò xong bí khúc nào hỏi khúc đó xong lại dò tiếp

Tôi dò trên Delphi Em ChatGPT gợi ý cho như sau ... xong đúng hay sai thì ta phải thử xong mới biết :D

SQL là chuẩn chung rồi thì sử dụng trên VBA,VB6 hay Delphi cũng vậy thôi

Mã:
 Query.SQL.Text := 'SELECT COUNT(*) FROM TableName WHERE UniqueField = :UniqueFieldValue';
Đúng là cứ SQL mà làm, vì đã liên quan database
nên chuẩn hóa dữ liệu từ giai đoạn nhập thì sẽ không trùng, và nhanh hơn là để đến lúc nhập vào mới kiểm tra
 
Lần chỉnh sửa cuối:
Sau khi hoàn thành bước nhập dữ liệu trong file Excel, thì trước khi tạo thêm dữ liệu vào file Database Access, em có làm điều kiện để xem dữ liệu ở file excel đang nhập có trùng dữ liệu với file Database Access hay không, nếu trùng thì sẽ hiển thị thông báo cho người sử dụng.

Cách để xem dữ liệu trùng nhau hay không thì bước làm em đang thực hiện như sau: Sẽ copy toàn bộ data ở "Trường A" từ Database Access tới một cột Excel, và điền thêm dữ liệu từ file excel đang nhập vào. Sử dụng Object Dictionary để phát hiện.
Tôi nói thật, có thể chủ quan nhưng chắc chắn không ai làm như cách của bạn cả và chẳng cần đao to búa lớn Data model, Power Query gì cả. Bạn sai ngay ở giai đoạn phân tích qui trình xử lý dữ liệu.
Như bác @tigertiger đã nói ở trên: Chuẩn hóa ngay ở giai đoạn nhập (từng dòng) chứ không phải chờ nhập một loạt rồi mới kiểm tra hàng loạt.
- Cách bạn đang làm là nhập hàng loạt xong cập nhật hàng loạt vào cơ sở dữ liệu (CSDL). Bạn có gì đảm bảo trong quá trình đẩy dữ liệu vào database, có lỗi gì đó phát sinh (điện, mạng...) nó gãy gánh giữa chừng và bạn không biết nó đã nạp nhưng gì vào database? mấy dòng? dòng đó có cập nhật đủ toàn bộ trường (field) chưa??? Hay phải tốn thêm công đoạn code một đống để kiểm tra...
- Rồi để kiếm tra hàng loạt rồi tìm ra dòng trùng, đánh dấu trong Excel nó cũng tốn thêm một đống code và thời gian xử lý...rồi sau đó lại phàn nàn là việc cập nhật dữ liệu mới chậm quá.

CSDL quan hệ nó đã có thuộc tính chống trùng ngay khi bạn xây dựng CSDL. Khi bạn nhập liệu 1 dòng -> nạp vào Table -> nếu trùng, CSDL sẽ la làng, báo lỗi ngay (Error 3022) -> code bắt ngay lỗi đó để cảnh báo trùng, bắt nhập liệu lại ngay và luôn.
Nhưng nguyên tắc là không để "báo lỗi trùng dữ liệu" phát sinh, ngay khi nhập liệu, phải tạo khóa chính (Primary Key) không trùng. Để tạo khóa không trùng (hoặc mã định danh) thì phải có đoạn code , kết nối CSDL, tự động tạo mã không trùng (mã theo ý muốn) (*), khi đã có mã không trùng thì cứ nhập liệu cho các trường còn lại rồi cập nhật vào database mà không bị báo lỗi.
(*): cách tạo mã tự động không trùng nhanh nhất, đơn giản nhất là dùng Field kiểu "Autonumber". Chỉ có cái là mã này nó không cố định số ký tự, không có những ký tự tùy ý như: PN_0001, PX_0001, HD_0001...
(bổ sung: lấy mã không trùng thì Table dù có mấy triệu dòn cũng chỉ cần lấy dòng cuối đối chiếu thôi chứ không cần nạp vào recordset cả triệu dòng nhé --> rồi lại phát sinh tới giải pháp Data model :)...)

Túm lại: giải pháp là
1. Nạp dữ liệu từng dòng: kết nối CSDL, lấy mã không trùng - nhập liệu từng record - nạp vào Table.
2. Nạp dữ liệu hàng loạt: vẫn phải đảm bảo lấy được mã không trùng - nhập liệu nhiều record (mỗi record mới vẫn đảm bảo có mã không trùng) - nạp hàng loạt (update batch).
Cách 1 thường dùng nhất và đảm bảo an toàn nhất. Nếu có sự cố phát sinh cũng chỉ ảnh hưởng 1 record.
 
Lần chỉnh sửa cuối:
...
Túm lại: giải pháp là
1. Nạp dữ liệu từng dòng: kết nối CSLD, lấy mã không trùng - nhập liệu từng record - nạp vào Table.
2. Nạp dữ liệu hàng loạt: vẫn phải đảm bảo lấy được mã không trùng - nhập liệu nhiều record (mỗi record mới vẫn đảm bảo có mã không trùng) - nạp hàng loạt (update batch).
Cách 1 thường dùng nhất và đảm bảo an toàn nhất. Nếu có sự cố phát sinh cũng chỉ ảnh hưởng 1 record.
Ở trên, thớt nói là "sẽ tạo thêm/chỉnh sửa dữ liệu từ Database Access". Tức là theo lập trình quản lý phát sinh (Transactions) và file chủ (Master Files), công việc gồm Add (thêm mới) và Amend (chỉnh sửa hàng có sẵn); và thường thì có luôn Delete (xóa).
Access có sẵn công cụ để làm việc này. Nhưng muốn làm trên Excel rồi đồng bộ qua Access cũng được. Vấn đề của thớt là:
1. Thứ nhất, không biết cách hoạt dộng của Access và CSDL LH.
2. Thứ hai, không biết đồng bộ dữ liệu là gì.

Kết nối Access qua ADODB không có gì khó khăn. Vấn đề là chỉ bảo đảm với vài ba lượt update một lần. Office có một cái bug là kết nối nhiều lần sẽ crash Excel.

Bởi vậy, công việc này phải do người rành code và hệ thống dữ liệu hiện tại làm. Chính thớt phải tự biết thực hiện code, chỉ hỏi những chỗ bí thôi.
 
Recordset thì chắc chắn là không trùng rồi ạ, vì data này đã điều kiện thì mới cho phép nhập vào database access. Em chưa biết recordset gán vào dic ạ
Vâng, để có thời gian em thử ạ
Bài đã được tự động gộp:

Recordset thì chắc chắn là không trùng rồi ạ, vì data này đã điều kiện thì mới cho phép nhập vào database access. Em chưa biết recordset gán vào dic ạ
Vâng, để có thời gian em thử ạ
 
...
SQL là chuẩn chung rồi thì sử dụng trên VBA,VB6 hay Delphi cũng vậy thôi

Mã:
 Query.SQL.Text := 'SELECT COUNT(*) FROM TableName WHERE UniqueField = :UniqueFieldValue';
Câu này không hoàn toàn đúng. SQL là chuẩn chung, nhưng mỗi phần mềm CSDL LH có một số hàm, ngữ pháp riêng, và một số trường hợp khi SQL chuẩn không xác định thì mỗi phần mềm có quyền tự diễn giải và có cách ra kết quả khác nhau. Oracle, mySQL, SQL Server,... là phần mềm CSDL; VBA, VB,... là ngôn ngữ lập trình.
Điển hình là dấu ":" trong câu SQL string trên không nằm trong tiêu chuẩn. Tuy hầu hết dân biết SQL thì cũng biết nó có nghĩa gì, nhưng nếu không biết nó thì cũng không thể gọi không biết SQL.
Lúc kết nối, câu string để kết nối có nêu rõ là loại DBase nào. Sau khi kết nối, mỗi lần truy vấn thì câu SQL string phải tuân theo chuẩn của DBase ấy.

Đặc biệt, ở đây thớt nói về Access. Access sử dụng nhiều hàm không có trong tiêu chuẩn SQL. Và Access là CSDL nhỏ cho nên MS không update các tiêu chuẩn về partitioned database.
 
Recordset thì chắc chắn là không trùng rồi ạ, vì data này đã điều kiện thì mới cho phép nhập vào database access. Em chưa biết recordset gán vào dic ạ
Vâng, để có thời gian em thử ạ
Bạn dùng chính ADODB mà tìm giữ liệu trùng là được, ADODB nhanh, không cần đến thư viện nào bên ngoài
Ý em là tìm dữ liệu đang nhập ở file Excel có dữ liệu nào trùng với Database Access không ạ
Bài đã được tự động gộp:

Recordset thì chắc chắn là không trùng rồi ạ, vì data này đã điều kiện thì mới cho phép nhập vào database access. Em chưa biết recordset gán vào dic ạ
Vâng, để có thời gian em thử ạ
Bạn dùng chính ADODB mà tìm giữ liệu trùng là được, ADODB nhanh, không cần đến thư viện nào bên ngoài
Ý em là tìm dữ liệu đang nhập ở file Excel có dữ liệu nào trùng với Database Access không ạ
rảnh thử dò xem nó ra cái gì xong tính tiếp ... giải pháp tốt nhất là tự thân dò xong bí khúc nào hỏi khúc đó xong lại dò tiếp

Tôi dò trên Delphi Em ChatGPT gợi ý cho như sau ... xong đúng hay sai thì ta phải thử xong mới biết :D

SQL là chuẩn chung rồi thì sử dụng trên VBA,VB6 hay Delphi cũng vậy thôi

Mã:
 Query.SQL.Text := 'SELECT COUNT(*) FROM TableName WHERE UniqueField = :UniqueFieldValue';
Vâng, có thời gian em sẽ thử ạ
Bài đã được tự động gộp:

Recordset thì chắc chắn là không trùng rồi ạ, vì data này đã điều kiện thì mới cho phép nhập vào database access. Em chưa biết recordset gán vào dic ạ
Vâng, để có thời gian em thử ạ
Bạn dùng chính ADODB mà tìm giữ liệu trùng là được, ADODB nhanh, không cần đến thư viện nào bên ngoài
Ý em là tìm dữ liệu đang nhập ở file Excel có dữ liệu nào trùng với Database Access không ạ
rảnh thử dò xem nó ra cái gì xong tính tiếp ... giải pháp tốt nhất là tự thân dò xong bí khúc nào hỏi khúc đó xong lại dò tiếp

Tôi dò trên Delphi Em ChatGPT gợi ý cho như sau ... xong đúng hay sai thì ta phải thử xong mới biết :D

SQL là chuẩn chung rồi thì sử dụng trên VBA,VB6 hay Delphi cũng vậy thôi

Mã:
 Query.SQL.Text := 'SELECT COUNT(*) FROM TableName WHERE UniqueField = :UniqueFieldValue';
Vâng, có thời gian em sẽ thử ạ
Đúng là cứ SQL mà làm, vì đã liên quan database
nên chuẩn hóa dữ liệu từ giai đoạn nhập thì sẽ không trùng, và nhanh hơn là để đến lúc nhập vào mới kiểm tra
Bài đã được tự động gộp:


Đúng là cứ SQL mà làm, vì đã liên quan database
nên chuẩn hóa dữ liệu từ giai đoạn nhập thì sẽ không trùng, và nhanh hơn là để đến lúc nhập vào mới kiểm tra
Bài đã được tự động gộp:


Đúng là cứ SQL mà làm, vì đã liên quan database
nên chuẩn hóa dữ liệu từ giai đoạn nhập thì sẽ không trùng, và nhanh hơn là để đến lúc nhập vào mới kiểm tra
Em cũng biết là như vậy ạ. Nếu em vừa là tác giả vừa là sử dụng file nhập liệu và vừa là quản lý data thì em sẽ không cần phải phức tạp hóa vấn đề đâu ạ. Thật ra mã code nhập liệu đều có quy tắc nhập liệu riêng của nó, nên khó mà trùng mã code được, nhưng thật sự em không đảm bảo được hàng nghìn lần nhập liệu mà không có bất cứ sai sót nào của con người cả ạ (cảm xúc, tâm trạng... ). Với lại quan điểm chủ quan của em là nên check dữ liệu trước khi đưa vào CSDL thì sẽ khoa học và chuyên nghiệp hơn ạ.
 
Lần chỉnh sửa cuối:
Recordset thì chắc chắn là không trùng rồi ạ, vì data này đã điều kiện thì mới cho phép nhập vào database access. Em chưa biết recordset gán vào dic ạ
Vâng, để có thời gian em thử ạ
Bạn dùng chính ADODB mà tìm giữ liệu trùng là được, ADODB nhanh, không cần đến thư viện nào bên ngoài
Ý em là tìm dữ liệu đang nhập ở file Excel có dữ liệu nào trùng với Database Access không ạ
rảnh thử dò xem nó ra cái gì xong tính tiếp ... giải pháp tốt nhất là tự thân dò xong bí khúc nào hỏi khúc đó xong lại dò tiếp

Tôi dò trên Delphi Em ChatGPT gợi ý cho như sau ... xong đúng hay sai thì ta phải thử xong mới biết :D

SQL là chuẩn chung rồi thì sử dụng trên VBA,VB6 hay Delphi cũng vậy thôi

Mã:
 Query.SQL.Text := 'SELECT COUNT(*) FROM TableName WHERE UniqueField = :UniqueFieldValue';
Vâng, có thời gian em sẽ thử ạ
Đúng là cứ SQL mà làm, vì đã liên quan database
nên chuẩn hóa dữ liệu từ giai đoạn nhập thì sẽ không trùng, và nhanh hơn là để đến lúc nhập vào mới kiểm tra
Bài đã được tự động gộp:


Đúng là cứ SQL mà làm, vì đã liên quan database
nên chuẩn hóa dữ liệu từ giai đoạn nhập thì sẽ không trùng, và nhanh hơn là để đến lúc nhập vào mới kiểm tra
Bài đã được tự động gộp:


Đúng là cứ SQL mà làm, vì đã liên quan database
nên chuẩn hóa dữ liệu từ giai đoạn nhập thì sẽ không trùng, và nhanh hơn là để đến lúc nhập vào mới kiểm tra
Em cũng biết là như vậy ạ. Nếu em vừa là tác giả vừa là sử dụng file nhập liệu và vừa là quản lý data thì em sẽ không cần phải phức tạp hóa vấn đề đâu ạ. Thật ra mã code nhập liệu đều có quy tắc nhập liệu riêng của nó, nên khó mà trùng mã code được, nhưng thật sự em không đảm bảo được hàng nghìn lần nhập liệu mà không có bất cứ sai sót nào của con người cả ạ (cảm xúc, tâm trạng... ). Với lại quan điểm chủ quan của em là nên check dữ liệu trước khi đưa vào CSDL thì sẽ khoa học và chuyên nghiệp hơn ạ.
Tôi nói thật, có thể chủ quan nhưng chắc chắn không ai làm như cách của bạn cả và chẳng cần đao to búa lớn Data model, Power Query gì cả. Bạn sai ngay ở giai đoạn phân tích qui trình xử lý dữ liệu.
Như bác @tigertiger đã nói ở trên: Chuẩn hóa ngay ở giai đoạn nhập (từng dòng) chứ không phải chờ nhập một loạt rồi mới kiểm tra hàng loạt.
- Cách bạn đang làm là nhập hàng loạt xong cập nhật hàng loạt vào cơ sở dữ liệu (CSDL). Bạn có gì đảm bảo trong quá trình đẩy dữ liệu vào database, có lỗi gì đó phát sinh (điện, mạng...) nó gãy gánh giữa chừng và bạn không biết nó đã nạp nhưng gì vào database? mấy dòng? dòng đó có cập nhật đủ toàn bộ trường (field) chưa??? Hay phải tốn thêm công đoạn code một đống để kiểm tra...
- Rồi để kiếm tra hàng loạt rồi tìm ra dòng trùng, đánh dấu trong Excel nó cũng tốn thêm một đống code và thời gian xử lý...rồi sau đó lại phàn nàn là việc cập nhật dữ liệu mới chậm quá.

CSDL quan hệ nó đã có thuộc tính chống trùng ngay khi bạn xây dựng CSDL. Khi bạn nhập liệu 1 dòng -> nạp vào Table -> nếu trùng, CSDL sẽ la làng, báo lỗi ngay (Error 3022) -> code bắt ngay lỗi đó để cảnh báo trùng, bắt nhập liệu lại ngay và luôn.
Nhưng nguyên tắc là không để "báo lỗi trùng dữ liệu" phát sinh, ngay khi nhập liệu, phải tạo khóa chính (Primary Key) không trùng. Để tạo khóa không trùng (hoặc mã định danh) thì phải có đoạn code , kết nối CSDL, tự động tạo mã không trùng (mã theo ý muốn) (*), khi đã có mã không trùng thì cứ nhập liệu cho các trường còn lại rồi cập nhật vào database mà không bị báo lỗi.
(*): cách tạo mã tự động không trùng nhanh nhất, đơn giản nhất là dùng Field kiểu "Autonumber". Chỉ có cái là mã này nó không cố định số ký tự, không có những ký tự tùy ý như: PN_0001, PX_0001, HD_0001...
(bổ sung: lấy mã không trùng thì Table dù có mấy triệu dòn cũng chỉ cần lấy dòng cuối đối chiếu thôi chứ không cần nạp vào recordset cả triệu dòng nhé --> rồi lại phát sinh tới giải pháp Data model :)...)

Túm lại: giải pháp là
1. Nạp dữ liệu từng dòng: kết nối CSDL, lấy mã không trùng - nhập liệu từng record - nạp vào Table.
2. Nạp dữ liệu hàng loạt: vẫn phải đảm bảo lấy được mã không trùng - nhập liệu nhiều record (mỗi record mới vẫn đảm bảo có mã không trùng) - nạp hàng loạt (update batch).
Cách 1 thường dùng nhất và đảm bảo an toàn nhất. Nếu có sự cố phát sinh cũng chỉ ảnh hưởng 1 record.
Em cảm ơn anh đã thông tin.
"Tôi nói thật, có thể chủ quan nhưng chắc chắn không ai làm như cách của bạn cả và chẳng cần đao to búa lớn Data model, Power Query gì cả. Bạn sai ngay ở giai đoạn phân tích qui trình xử lý dữ liệu."
Cái này em mới nghĩ đến phương pháp này thôi, vì thời điểm này em chưa có giải pháp nào tốt hơn. Theo như tham khảo các anh cho thông tin thì có thể gán Recordset vào Dic để kiểm tra được ạ.

"Như bác @tigertiger đã nói ở trên: Chuẩn hóa ngay ở giai đoạn nhập (từng dòng) chứ không phải chờ nhập một loạt rồi mới kiểm tra hàng loạt.
- Cách bạn đang làm là nhập hàng loạt xong cập nhật hàng loạt vào cơ sở dữ liệu (CSDL). Bạn có gì đảm bảo trong quá trình đẩy dữ liệu vào database, có lỗi gì đó phát sinh (điện, mạng...) nó gãy gánh giữa chừng và bạn không biết nó đã nạp nhưng gì vào database? mấy dòng? dòng đó có cập nhật đủ toàn bộ trường (field) chưa??? Hay phải tốn thêm công đoạn code một đống để kiểm tra...
- Rồi để kiếm tra hàng loạt rồi tìm ra dòng trùng, đánh dấu trong Excel nó cũng tốn thêm một đống code và thời gian xử lý...rồi sau đó lại phàn nàn là việc cập nhật dữ liệu mới chậm quá."
Như em đã thưa với bác @tigertiger tư vấn rồi ạ.
Công ty em nhỏ, hiện đang sử dụng OneDrive để quản lý Data, file excel này em đã khóa chỉ cho 1 User sử dụng nên em nghĩ sẽ không gặp vấn đề gì về mạng kết nối đâu ạ.
Sau khi thao tác xong vào cửa sổ Database, thì em có thêm dòng code là "có muốn trích xuất dữ liệu luôn không" (hoặc có thể trích xuất tùy ý bằng cách click nút đã tạo sẵn trên menu Ribbon), và lúc này người sử dụng sẽ xem file excel trích xuất để biết xem data cập nhật. Em coi là File Access là một Database gốc, còn file Excel trích xuất sẽ là một Database bản sao ạ. Tất cả tính toán, báo cáo... sẽ lấy dữ liệu từ Database bản sao mới nhất (File excel trích xuất mới nhất) bằng coding FileDateTime(MyPath & MyFile) của một vòng lặp cho các file trong một thư mục.

"CSDL quan hệ nó đã có thuộc tính chống trùng ngay khi bạn xây dựng CSDL. Khi bạn nhập liệu 1 dòng -> nạp vào Table -> nếu trùng, CSDL sẽ la làng, báo lỗi ngay (Error 3022) -> code bắt ngay lỗi đó để cảnh báo trùng, bắt nhập liệu lại ngay và luôn."
Nếu như anh tư vấn trên thì Database sẽ thêm trường khóa chính, và Database sẽ thêm được một số dữ liệu nào đó, và đến khi thêm dữ liệu tiếp thì sẽ báo lỗi vì trùng, với quan điểm cá nhân em thì em không muốn như vậy ạ, em đã làm là thấy trùng thì phải kiểm tra lại trước khi đưa bất kì dữ liệu nào vào Database ạ (Ý em là mỗi người một quan điểm ạ)

"(*): cách tạo mã tự động không trùng nhanh nhất, đơn giản nhất là dùng Field kiểu "Autonumber". Chỉ có cái là mã này nó không cố định số ký tự, không có những ký tự tùy ý như: PN_0001, PX_0001, HD_0001...
(bổ sung: lấy mã không trùng thì Table dù có mấy triệu dòn cũng chỉ cần lấy dòng cuối đối chiếu thôi chứ không cần nạp vào recordset cả triệu dòng nhé --> rồi lại phát sinh tới giải pháp Data model :)...)"
Cái này tùy vào ứng dụng cho mục đích sử dụng cụ thể anh ạ. Với đặc thù của Công ty em thì không làm như vậy được ạ
 
Web KT
Back
Top Bottom