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
Vâng, để có thời gian em thử ạ

Ý 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 ạ

Vâng, có thời gian em sẽ thử ạ

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 ạ.

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.

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á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 ạ

:) Qua các câu trả lời của bạn là biết bạn chẳng biết gì về CSDL và cách xây dựng CSDL rồi. Nó chẳng có quan điểm cá nhân gì ở đây mà là các nguyên tắc khi xây dựng, thiết kế Table trong câc loại database cũng như các giải thuật xử lý nó. Thôi thì bạn cứ làm theo suy nghĩ mà bạn cho là đúng theo quan điểm của bạn thôi. Đường ngắn, đường dài, đường nào cũng đến La Mã, chỉ là chi phí bỏ ra nhiều hay ít 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ạ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 ạ
Ở 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.
Access em cũng có chút kiến thức để có thể làm chủ được những gì em cần ạ. Hệ thống lập trình của em đã ý tưởng thực hiện như sau:
1. Nhập liệu/Chỉnh sửa dữ liệu bằng file Excel để cho thân thuộc, vì người nhập liệu chỉ quen thao tác trên Excel (Access không biết)
2. Access sẽ lưu trữ toàn bộ dữ liệu, là một File Database tổng
3. Trong File Access, em đã làm một Query từ một Table Database. Query này sẽ điều kiện theo em mong muốn (Ví dụ, hiện tại năm 2024 thì sẽ trích xuất dữ liệu từ 1/1/2024 đến thời điểm trích xuất, loại bỏ những trường không cần thiết), và sẽ trích xuất dữ liệu ra file Excel. Thao tác để trích xuất dữ liệu từ Query này là thao tác bấm nút trong file Excel)
4. Dữ liệu File Excel trích xuất em coi là một Database bản sao. Từ đây dữ liệu được lấy và tính toán báo cáo sẽ lấy từ file excel trích xuất mới nhất (Coding để tìm thời gian tạo file cho các file)

1704984855226.png
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 ạ.
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 ạ
Ở 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.
Access em cũng có chút kiến thức để có thể làm chủ được những gì em cần ạ. Hệ thống lập trình của em đã ý tưởng thực hiện như sau:
1. Nhập liệu/Chỉnh sửa dữ liệu bằng file Excel để cho thân thuộc, vì người nhập liệu chỉ quen thao tác trên Excel (Access không biết)
2. Access sẽ lưu trữ toàn bộ dữ liệu, là một File Database tổng
3. Trong File Access, em đã làm một Query từ một Table Database. Query này sẽ điều kiện theo em mong muốn (Ví dụ, hiện tại năm 2024 thì sẽ trích xuất dữ liệu từ 1/1/2024 đến thời điểm trích xuất, loại bỏ những trường không cần thiết), và sẽ trích xuất dữ liệu ra file Excel. Thao tác để trích xuất dữ liệu từ Query này là thao tác bấm nút trong file Excel)
4. Dữ liệu File Excel trích xuất em coi là một Database bản sao. Từ đây dữ liệu được lấy và tính toán báo cáo sẽ lấy từ file excel trích xuất mới nhất (Coding để tìm thời gian tạo file cho các file)
:) Qua các câu trả lời của bạn là biết bạn chẳng biết gì về CSDL và cách xây dựng CSDL rồi. Nó chẳng có quan điểm cá nhân gì ở đây mà là các nguyên tắc khi xây dựng, thiết kế Table trong câc loại database cũng như các giải thuật xử lý nó. Thôi thì bạn cứ làm theo suy nghĩ mà bạn cho là đúng theo quan điểm của bạn thôi. Đường ngắn, đường dài, đường nào cũng đến La Mã, chỉ là chi phí bỏ ra nhiều hay ít thôi.
Vâng, em cảm ơn anh góp ý, em sẽ va vấp đúc rút và học hỏi dần dần anh ạ
 
Thôi ngứa miệng lần cuối để càm-men vì thấy nhiều điểm hiểu sai quá.
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 có nói ở trên là việc nhập mã (khóa chính không trùng) là do code tạo ra tự động, chứ có phải để người dùng nhập thủ công đâu mà có sai sót do tâm trạng...Cách làm này là cơ bản và phổ biến đối với dân viết ứng dụng chứ không phải đặc thù gì.
- Với việc tạo mã tự động thì không cần phải làm cái bước khoa học chuyên nghiệp là check trước khi đưa vào CSDL. Table Access có sẳn công cụ tạo mã tự động đó là [Autonumber] cũng đã nói ở trên (cơ bản của Access), tạo cả triệu dòng cũng 1.000% là không trùng :D.
- Đối với CSDL Access, nếu nắm vững cơ bản rồi thì chẳng cần gì tới giải pháp kiểm tra trùng phức tạp, rườm rà như bạn đưa ra.

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 ạ.
Mạng kết nối ở đây là việc rớt mạng, không liên quan gì đến số lượng người dùng kết nối đồng thời. Dữ liệu đang truyền đi thì rớt mạng --> hư dữ liệu v.v..

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 ạ,
- Trường khóa chính (Primary key) và khóa ngoại (Foreign Key) là cơ bản khi thiết kế Table trong bất kỳ CSDL nào (Access, mySQL, SQL Server...). Tạo khóa như thế nào phải có sự phân tích tổng thể chứ không phải tạo đại, không phải dựa vào chuyện không muốn mà là để dữ liệu được chuẩn hóa. Tin học bằng B có Access cơ bản là đã học món này rồi.

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 ạ)
- Như ý đầu tiên. Đã tạo CSDL chuẩn, giải thuật tạo khóa chính tự động chuẩn rồi thì chẳng cần phải kiểm tra trùng.
- Khi thiết kế Table chuẩn rồi thì đâu phải muốn đưa dữ liệu có khóa trùng vào là được đâu. Nó đã chặn ngay cửa kiểm tra primary key rồi, lấy gì mà lưu được. Chỉ có thiết kế lơ tơ mơ, không chuẩn hóa thì dữ liệu nó lưu vào các kiểu rồi thành đống rác, sau này phải đập bỏ xây lại. Cái vụ chặn băt trùng khóa cũng đã nói ở bài trước, chỉ là bạn không chịu tìm hiểu.

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 ạ
- Cái này thì chỉ có xây dựng CSDL sai mới không làm được thôi. Nó là chuẩn hóa CSDL.
- Khi tôi xây dựng xong CSDL được chuẩn hóa là coi như đi được 50% đoạn đường viết một ứng dụng rồi đó bạn. Code kiết theo sau đó sẽ nhẹ nhàng, gọn gàng hơn nhiều với CSDL chuẩn hóa.

1. Nhập liệu/Chỉnh sửa dữ liệu bằng file Excel để cho thân thuộc, vì người nhập liệu chỉ quen thao tác trên Excel (Access không biết)
Cái này thì lại do bạn chưa biết gì về Access nói riêng và lập trình ứng dụng nói chung nên mới phán vậy. Viết một Form nhập liệu, Form báo cáo là tạo một giao diện người dùng sao cho một người dùng không biết gì về Excel, Access v.v.. vẫn có thể thao tác dữ liệu (nhập thêm, sửa, xóa, truy vấn v.v...). Nếu vẫn còn phải phụ thuộc vào sự hiểu biết Excel mới nhập liệu được thì phải xem lại khâu thiết kế rồi.

À một cảnh báo cuối là dùng Access database qua các Cloud như: One drive, Google Drive...sẽ không an toàn và có thể hư database vào một ngày nào đó, không thể phục hồi nhé.

Ví dụ vài cái Form nhập và thao tác dữ liệu, chẳng cần biết Excel hay Access.

Thôi không nhiều chuyện nữa, tôi ngưng với đề tài này.


nsxtVt9.png


8zOSi9l.png
 
Lần chỉnh sửa cuối:
Xây dựng cơ sở dữ liệu đúng chuẩn và phù hợp với yêu cầu quản lý rất phức tạp, chỉ những chuyên gia mới làm tốt. Bạn tự xây dựng và tự xử lý là việc tốt nên làm, có thể ban đầu chưa hợp lý nhưng bạn sẽ tích lũy được kiến thức và kinh nghiệm.
Với tình huống liệu cơm gắp mắm nầy có thể theo cách:
_ Dùng ADO gán dữ liệu file Access vào mảng
_ Từ mảng xử lý nạp dữ liệu vào Dic, và có thể gán vào sheets nếu cần
_ Khi nhập liệu mới dùng Dic kiểm tra trùng
Nếu có nhiều Sub, khai báo Dic dùng chung các sub
 
Xây dựng cơ sở dữ liệu đúng chuẩn và phù hợp với yêu cầu quản lý rất phức tạp, chỉ những chuyên gia mới làm tốt. Bạn tự xây dựng và tự xử lý là việc tốt nên làm, có thể ban đầu chưa hợp lý nhưng bạn sẽ tích lũy được kiến thức và kinh nghiệm.
1. Kiến thức của thớt không đủ để làm công việc này. Tại thớt nghĩ có thể nhờ GPE làm giùm cho nên mới có cả đống yêu cầu sâu xa vậy.
2. Tính nhẫn nại của thớt không đủ để "làm thử rồi tích lũy kinh nghiệm". Bạn để ý thấy đề nghị lạ một chút là "không được".
3. Thớt có tính chủ quan, cứ nói chuyện "quan điểm" mà không cần lý đến cách thức hoạt động của phần mềm, và cách mà hơn 90% dân CSDL tuân theo. Vì vậy, kiến thức tích lũy sẽ được một đống chủ quan và thành kiến.

Với tình huống liệu cơm gắp mắm nầy có thể theo cách:

_ Dùng ADO gán dữ liệu file Access vào mảng
_ Từ mảng xử lý nạp dữ liệu vào Dic, và có thể gán vào sheets nếu cần
_ Khi nhập liệu mới dùng Dic kiểm tra trùng
Nếu có nhiều Sub, khai báo Dic dùng chung các sub
Theo tôi hiểu bài #1 thì thớt đòi dự kiến tương lai. Không thể "liệu cơm gắp mắm" được.

Chú thích: cái mà thớt muốn có thể thực hiện bằng cách
- Đặt mã.
- Xét xem mã đã có trong DB chưa. Nếu có thì đặt mã khác.
- Nếu chưa có thì ghi một record trống với mã đã chọn.
- Gõ các dữ liệu khác.
- Update record.
 
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 ạ
Ở 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.
Access em cũng có chút kiến thức để có thể làm chủ được những gì em cần ạ. Hệ thống lập trình của em đã ý tưởng thực hiện như sau:
1. Nhập liệu/Chỉnh sửa dữ liệu bằng file Excel để cho thân thuộc, vì người nhập liệu chỉ quen thao tác trên Excel (Access không biết)
2. Access sẽ lưu trữ toàn bộ dữ liệu, là một File Database tổng
3. Trong File Access, em đã làm một Query từ một Table Database. Query này sẽ điều kiện theo em mong muốn (Ví dụ, hiện tại năm 2024 thì sẽ trích xuất dữ liệu từ 1/1/2024 đến thời điểm trích xuất, loại bỏ những trường không cần thiết), và sẽ trích xuất dữ liệu ra file Excel. Thao tác để trích xuất dữ liệu từ Query này là thao tác bấm nút trong file Excel)
4. Dữ liệu File Excel trích xuất em coi là một Database bản sao. Từ đây dữ liệu được lấy và tính toán báo cáo sẽ lấy từ file excel trích xuất mới nhất (Coding để tìm thời gian tạo file cho các file)
:) Qua các câu trả lời của bạn là biết bạn chẳng biết gì về CSDL và cách xây dựng CSDL rồi. Nó chẳng có quan điểm cá nhân gì ở đây mà là các nguyên tắc khi xây dựng, thiết kế Table trong câc loại database cũng như các giải thuật xử lý nó. Thôi thì bạn cứ làm theo suy nghĩ mà bạn cho là đúng theo quan điểm của bạn thôi. Đường ngắn, đường dài, đường nào cũng đến La Mã, chỉ là chi phí bỏ ra nhiều hay ít thôi.
Vâng, em cảm ơn anh góp ý, em sẽ va vấp đúc rút và học hỏi dần dần anh ạ
1. Kiến thức của thớt không đủ để làm công việc này. Tại thớt nghĩ có thể nhờ GPE làm giùm cho nên mới có cả đống yêu cầu sâu xa vậy.
2. Tính nhẫn nại của thớt không đủ để "làm thử rồi tích lũy kinh nghiệm". Bạn để ý thấy đề nghị lạ một chút là "không được".
3. Thớt có tính chủ quan, cứ nói chuyện "quan điểm" mà không cần lý đến cách thức hoạt động của phần mềm, và cách mà hơn 90% dân CSDL tuân theo. Vì vậy, kiến thức tích lũy sẽ được một đống chủ quan và thành kiến.


Theo tôi hiểu bài #1 thì thớt đòi dự kiến tương lai. Không thể "liệu cơm gắp mắm" được.

Chú thích: cái mà thớt muốn có thể thực hiện bằng cách
- Đặt mã.
- Xét xem mã đã có trong DB chưa. Nếu có thì đặt mã khác.
- Nếu chưa có thì ghi một record trống với mã đã chọn.
- Gõ các dữ liệu khác.
- Update record.
em làm gì có đống yêu cầu đâu ạ, em chỉ muốn hỏi là làm cách nào để kiểm tra dữ liệu nhập vào excel có trùng dữ liệu của “Trường A” tại một table Access với hơn triệu dòng thôi ạ
 
với tình hình này và cách lý giải lòng vòng , cách hiểu và xử lý nó sẽ còn dài hơn cả đạn ?! --=0--=0--=0
 
Vâng, để có thời gian em thử ạ

Ý 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 ạ

Vâng, có thời gian em sẽ thử ạ

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 ạ.

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 ạ

Access em cũng có chút kiến thức để có thể làm chủ được những gì em cần ạ. Hệ thống lập trình của em đã ý tưởng thực hiện như sau:
1. Nhập liệu/Chỉnh sửa dữ liệu bằng file Excel để cho thân thuộc, vì người nhập liệu chỉ quen thao tác trên Excel (Access không biết)
2. Access sẽ lưu trữ toàn bộ dữ liệu, là một File Database tổng
3. Trong File Access, em đã làm một Query từ một Table Database. Query này sẽ điều kiện theo em mong muốn (Ví dụ, hiện tại năm 2024 thì sẽ trích xuất dữ liệu từ 1/1/2024 đến thời điểm trích xuất, loại bỏ những trường không cần thiết), và sẽ trích xuất dữ liệu ra file Excel. Thao tác để trích xuất dữ liệu từ Query này là thao tác bấm nút trong file Excel)
4. Dữ liệu File Excel trích xuất em coi là một Database bản sao. Từ đây dữ liệu được lấy và tính toán báo cáo sẽ lấy từ file excel trích xuất mới nhất (Coding để tìm thời gian tạo file cho các file)

Vâng, em cảm ơn anh góp ý, em sẽ va vấp đúc rút và học hỏi dần dần anh ạ

em làm gì có đống yêu cầu đâu ạ, em chỉ muốn hỏi là làm cách nào để kiểm tra dữ liệu nhập vào excel có trùng dữ liệu của “Trường A” tại một table Access với hơn triệu dòng thôi ạ
Đăng bài thì bạn nên xem lại trước khi Đăng, diễn đàn đang lỗi, thừa thì xóa đi, có vẻ như nhấn reply xong gõ chữ và gửi ngay và luôn.

Nhìn ... ấy.

Về dự án thì cứ bắt đầu và tích lũy dần, nguyên tắc "sai sửa, chửa đẻ". Lưu hành nội bộ mà.

Nhập liệu thì trước giờ tớ cứ tưởng nhập trên excel cho dễ, nhưng nếu cột nhiều thì kéo qua kéo lại - lại là cực hình. 2, 3, 5, 70 cột nếu gom lại trong 1 form màn hình để nhập thì mới gọi là dễ cho bất cứ ai. Khi đó phím tab vô địch. Excel chỉ có nhập 10 cột là dễ thôi. Vậy nên đã viết thì tạo form cho anh em nhập đi.
Hehe, form đẹp. Cái quản lý công việc không thấy link tải bác nhỉ. --=0 --=0 --=0
 
Lần chỉnh sửa cuối:
_ Dùng ADO gán dữ liệu file Access vào mảng
_ Từ mảng xử lý nạp dữ liệu vào Dic, và có thể gán vào sheets nếu cần
Vấn đề của bạn này là từ Access lấy ra đã là 1 triệu record không trùng, nghĩa là Dict ban đầu đã lớn hơn sức chứa của excel không gán xuống sheet được. Sau đó nhập liệu vào excel chán chê thêm vài trăm dòng nữa, Lúc đó muốn append 500 dòng này mà lại sợ trùng với 1 triệu dòng kia.
Tôi chỉ thắc mắc là cái gì không trùng lên đến cả triệu rồi mà cứ tăng mãi? Cứ nói lọc trùng mà không biết trùng cái gì (trường khóa nào) thì dẫu 10 triệu cũng vẫn cứ phải lọc trùng.
Nếu biết trường nào cần lọc thì chi bằng:
- cách 1: kiểm soát trùng ngay khi nhập từng dòng của excel, thông qua 1 hàm kiểm tra (Dict.Exists chẳng hạn)
- cách 2: Trường khóa của access có quy tắc tạo, luôn luôn. Vậy dùng quy tắc này tạo dữ liệu cho từng dòng của excel, không cho gõ tay.
- cách 3: Nếu không có trường khóa thì tạo trường khóa, quay lại cách 1 hoặc 2.
 
Lần chỉnh sửa cuối:
Cái quản lý công việc không thấy link tải bác nhỉ.
Học lý thuyết và tự ứng dụng làm theo công việc của mình. Chứ lấy form mẫu về mà không nắm lý thuyết thì chỉ có copy code mà xài, 99% là lỗi, không xài được ngay do dữ liệu khác, yêu cầu khác.
 
thử dò xem sao xong tính tiếp ... dùng SQL "SELECT" bài 13 tìm kiếm trường XX xem có dữ liệu chưa

1/ Nếu chưa có thêm vào ...
2/ Nếu có rồi bỏ qua hay Update ...
...
nếu dữ liệu lớn lấy hết vào Array xong dùng Dic xem key của nó lọc trùng là thua
Nếu ít dữ liệu còn tạm chút
 
Kinh nghiệm về CSDL của em không có nên em cũng xin chia sẻ cách này.
1. Thiết kế các Field trong bảng của CSDL Access sang Indexed (No Duplicate) cho các Field như Production Bags, Transport Production Bags
2. Nạp/chỉnh sữa dữ liệu từng Record, dùng bẫy lỗi để ghi lại các Record bị trùng.
--
Trước em cũng dùng Dictionary để lọc nhưng khi bảng có hơn 600 nghìn record thì tốc độ bị xuống nhiều quá.
 
Lần chỉnh sửa cuối:
Theo như tôi hiểu thì nào giờ thớt vẫn làm ngược. Lý do làm ngược là vì thớt nghĩ rằng mình biết Access, và tự khẳng định rằng nhập liệu bằng Excel dễ hơn Access.
Rốt cuộc, quy trình của thớt sẽ dùng Excel nhập liệu, chuyển dữ liệu qua chứa ở Access. Và giữ file Excel như backup.

Một người chuyên nghiệp chắc chắn sẽ làm ngược lại, tạo một giao diện (userform) trong Access để nhập liệu. Sau khi đã nhập xong đống ấy thì dùng timestamp để trích xuất dữ liệu mới nhập vào một file Excel hay csv.

Nhưng nếu thớt chịu khó chỉ dẫn người dùng một chút rằng thực ra nhập liệu theo hàng thì Access dễ hơn Excel nhiều. Và nếu nhập trực tiếp thì Access làm luôn cái công việc xét trùng, khỏe ru.
 
Web KT
Back
Top Bottom