Phát triển bài toán tổng hợp xuất nhập tồn hàng hóa bằng các ngôn ngữ lập trình khác

Liên hệ QC
Khi tính thời gian chúng ta nên tính cả lúc load data lên. Khi dùng các công cụ thì nó đã load data lên rồi và phần này mọi người quên không tính mà chỉ tính lúc “Run” chạy array trong RAM. Nếu viết VBA để tính sau khi đã có array (load datta lên RAM rồi) thí tốc độ cũng nhanh. Bài này có lẽ chủ ý của người hỏi là một click ra ngay và tính toàn bộ thời gian.
 
Lần chỉnh sửa cuối:
Tốc độ khủng thật. Chắc cũng là cơ chế đẩy hết lên Ram để xử lý.
Vâng anh, đúng là nó dùng Ram nhiều, 1 file Power Bi Nặng nó xài 4gb ram là bình thường, cho nên nếu mở vài file như vậy+ mở các file khác thì Ram cỡ 32Gb mới chạy tạm. Power Bi nó cũng dùng Power Querry để get data và dùng Dax giống như trong Excel nhưng nó chạy nhanh hơn nhiều so với khi chạy trên excel( Khoản này thì em cũng biết, có thể nó là một tool riêng nên nó có những điểm tối ưu riêng). Phần lâu nhất là nạp data vào Data model và thiết kế Model chuẩn, xong công đoạn này mà viết hàm nó chạy thì VBA hay mấy Tool kiểu vậy không có cửa so với nó.
À nếu tính cả thời gian Load Data từ ondrive về Power Bi thì mất 16s load+0,1s tính toán, sơ bộ Power Bi chạy cái này dưới 20s( Tùy vào cấu hình máy tính + tốc độ mạng nữa). Như em đã nói ở trên thì lâu nhất là công đoạn Get data.
 
Vâng anh, đúng là nó dùng Ram nhiều, 1 file Power Bi Nặng nó xài 4gb ram là bình thường, cho nên nếu mở vài file như vậy+ mở các file khác thì Ram cỡ 32Gb mới chạy tạm. Power Bi nó cũng dùng Power Querry để get data và dùng Dax giống như trong Excel nhưng nó chạy nhanh hơn nhiều so với khi chạy trên excel( Khoản này thì em cũng biết, có thể nó là một tool riêng nên nó có những điểm tối ưu riêng). Phần lâu nhất là nạp data vào Data model và thiết kế Model chuẩn, xong công đoạn này mà viết hàm nó chạy thì VBA hay mấy Tool kiểu vậy không có cửa so với nó.

Như vậy là bạn đã bỏ qua thời gian load và xử lý trung gian của công cụ rồi. VBA nó làm tự động từ A-Z và bị tính tất cả. Nếu trong VBA, load hết data vào array và không tính thời gian phần này, sau đó mới tính thời gian chạy kết quả cuối thì cũng rất nhanh, không khác gì chủ để cũ mà bài đầu tiên đưa link.
 
Khi tính thời gian chúng ta nên tính cả lúc load data lên. Khi dùng các công cụ thì nó đã load data lên rồi và phần này mọi người quên không tính mà chỉ tính lúc “Run” chạy array trong RAM. Nếu vjeets VBA để tính sau khi đã cí array (load datta lên RAM rồi) thí tốc độ cũng nhanh. Bài này có lẽ chủ ý của người hỏi là một click ra ngay và tính toàn bộ thời gian.
Tinh thần chạy online, tính hết cả thời gian load dữ liệu, tính toán, dán xuống sheet anh nhé.
 
Như vậy là bạn đã bỏ qua thời gian load và xử lý trung gian của công cụ rồi. VBA nó làm tự động từ A-Z và bị tính tất cả. Nếu trong VBA, load hết data vào array và không tính thời gian phần này, sau đó mới tính thời gian chạy kết quả cuối thì cũng rất nhanh, không khác gì chủ để cũ mà bài đầu tiên đưa link.
Em nghĩ dữ liệu nhỏ nhỏ như bảng tính excel thì cũng không có quá nhiều sự khác biệt, có lẽ chủ thớt nên mở rộng nó lên cỡ 100 triệu dòng trở lên khi đó đưa ra các giải pháp so sánh thì sẽ có nhiều thứ đáng bàn hơn, chứ chênh nhau một hay vài chục giây thì cũng không giải quyết vấn đề gì.
 
Tinh thần chạy online, tính hết cả thời gian load dữ liệu, tính toán, dán xuống sheet anh nhé.

Anh hiểu ý em mà. Nếu muốn so sánh chạy offline một cách công bằng với VBA thì sẽ làm như sau.
1. Chạy SQL để JOIN các bảng có quan hệ và liên quan đến kết quả, từ đây ta có Recortset - Đây tạm coi là Data Model. Nếu các bạn không tính trên Power BI, thì cũng không tính phần này trên VBA. Tương tự nếu có các dataset khác cũng không tính.
2. Từ Recordset chạy vòng lặp với giải thuật Dictionary hay array thuần tùy. Bước này hãy tính thời gian cùng nhau. Chưa chắc chênh lệch nhau nhiều đâu.
 
Đối với file và yêu cầu của chủ đề này, và làm với dữ liệu online bằng Power query trên excel hoặc Power BI, tôi có ý như sau:
- Thời gian tạo lập query, kiểm tra kết quả, ... không tính
- Thời gian nên tính là thời gian query đó liên kết lấy dữ liệu, tính toán và hiển thị ra kết quả. Nếu việc tính toán phải qua những query trung gian, thì khi hiển thị ra kết quả cuối cũng đã được tính rồi.
Vậy vấn đề là phương pháp test thời gian.
1. Nếu chỉ nhấn nút refresh thì cái action refresh của phần mềm có bao gồm việc load dữ liệu về hay không?
2. Nếu thay đổi tham số (ngày bắt đầu, ngày kết thúc) rồi nhấn nút refresh, thì có load lại dữ liệu không?

Tôi cho rằng query trong trường hợp này load lại dữ liệu, vì khi refresh, mặc định là dữ liệu nguồn có thể đã thay đổi, nên phải load dữ liệu mới về. Nếu không làm sao gọi là refresh?

Nếu so sánh với các ngôn ngữ lập trình khác như VBA, Python, Java, ... thì cứ so sánh thoải mái, vì công việc phải làm là như nhau.
1. Chạy SQL để JOIN các bảng có quan hệ và liên quan đến kết quả, từ đây ta có Recortset - Đây tạm coi là Data Model. Nếu các bạn không tính trên Power BI, thì cũng không tính phần này trên VBA. Tương tự nếu có các dataset khác cũng không tính.
2. Từ Recordset chạy vòng lặp với giải thuật Dictionary hay array thuần tùy. Bước này hãy tính thời gian cùng nhau. Chưa chắc chênh lệch nhau nhiều đâu.
Power query với dữ liệu ở bài 1 cũng phải merge 3 table (merge tương đương join của SQL *), và merge cả 1 hoặc 2 query trung gian (tùy thuật toán). Và khi refresh phải tính toán tuần tự như vậy chứ không phải thuần là lôi ra hiển thị.

(*) Bản chất của Merge là như vậy: cũng xác định trường khóa, trường liên kết, loại liên kết (left join, right join, full join, join)
 
Anh hiểu ý em mà. Nếu muốn so sánh chạy offline một cách công bằng với VBA thì sẽ làm như sau.
1. Chạy SQL để JOIN các bảng có quan hệ và liên quan đến kết quả, từ đây ta có Recortset - Đây tạm coi là Data Model. Nếu các bạn không tính trên Power BI, thì cũng không tính phần này trên VBA. Tương tự nếu có các dataset khác cũng không tính.
2. Từ Recordset chạy vòng lặp với giải thuật Dictionary hay array thuần tùy. Bước này hãy tính thời gian cùng nhau. Chưa chắc chênh lệch nhau nhiều đâu.
Hi anh,
Sau đề tài gốc của anh, em thấy rất happy với các code dùng Dictionary, nó nhanh, mạnh, chính xác.

Nếu làm offline, kể cả việc download file, dùng ADO import data về, rồi chạy VBA cũng sẽ rất nhanh thôi.

Tuy nhiên, giờ dữ liệu gốc đưa lên mạng, thay vì phải download file thì getdata trực tiếp, thì có giải pháp nào nhanh/mạnh hơn dùng PowerQuery không?
 
Ví dụ thế này: Tôi có 1 file B để trên drive, và file đó đồng bộ với 1 file A tại máy tính của tôi. Tôi tạo 1 file excel hoặc Power BI trên máy ông sếp, liên kết đến file B trên drive để tạo báo cáo.
Hiện tại tôi đã nhập liệu đến ngày 01/10/2021 trên file A, đã đồng bộ vào file B, ông sếp đã xem báo cáo nhập xuất tồn tháng 10/2021: Ngày bắt đầu là 01/10/2021, kết thúc là 31/10/2021
Hôm nay tôi nhập liệu vào file A tiếp đến ngày 05/10 theo chứng từ tôi có trong tay mới nhận được (50 chứng từ). Sau đó file A được đồng bộ với file B.
Vậy thì hôm nay ông sếp mở file báo cáo, để nguyên thông số tháng 10, nhấn refresh để xem báo cáo. Thì kết quả phải bao gồm 50 chứng từ mới nhập vào chứ? Nghĩa là Power query của Excel hoặc Power BI phải load lại data mới từ file B (!)
 
Ví dụ thế này: Tôi có 1 file B để trên drive, và file đó đồng bộ với 1 file A tại máy tính của tôi. Tôi tạo 1 file excel hoặc Power BI trên máy ông sếp, liên kết đến file B trên drive để tạo báo cáo.
Hiện tại tôi đã nhập liệu đến ngày 01/10/2021 trên file A, đã đồng bộ vào file B, ông sếp đã xem báo cáo nhập xuất tồn tháng 10/2021: Ngày bắt đầu là 01/10/2021, kết thúc là 31/10/2021
Hôm nay tôi nhập liệu vào file A tiếp đến ngày 05/10 theo chứng từ tôi có trong tay mới nhận được (50 chứng từ). Sau đó file A được đồng bộ với file B.
Vậy thì hôm nay ông sếp mở file báo cáo, để nguyên thông số tháng 10, nhấn refresh để xem báo cáo. Thì kết quả phải bao gồm 50 chứng từ mới nhập vào chứ? Nghĩa là Power query của Excel hoặc Power BI phải load lại data mới từ file B (!)
Vâng ạ
Việc load lại là cần thiết, biết đâu kể cả chứng từ cũ nhập sai xong sửa lại thì sao.
Ông Sếp chỉ cần refresh là có thể theo dõi được.
 
Vâng ạ
Việc load lại là cần thiết, biết đâu kể cả chứng từ cũ nhập sai xong sửa lại thì sao.
Ông Sếp chỉ cần refresh là có thể theo dõi được.
Cho nên tôi đang nghi ngờ con số 114ms giây ở bài 37, công cụ Perfomance analysis của Power BI không biết tính toán phân tích những gì và trong trường hợp nào. Phải tính thời gian của việc nhấn nút refresh mới chính xác.
 
Cho nên tôi đang nghi ngờ con số 114ms giây ở bài 37, công cụ Perfomance analysis của Power BI không biết tính toán phân tích những gì và trong trường hợp nào. Phải tính thời gian của việc nhấn nút refresh mới chính xác.
Ở trên em có nói là bao gồm 16s load data đó anh, nên nó là 16s+0,14s tính toán đó ah
 
Vâng ạ
Việc load lại là cần thiết, biết đâu kể cả chứng từ cũ nhập sai xong sửa lại thì sao.
Ông Sếp chỉ cần refresh là có thể theo dõi được.
Báo cáo hiện tại thì Sếp ko cần refresh gì đâu bạn, bạn gửi Báo cáo cho sếp thì cái báo cáo đấy bạn phải tự refresh, Sếp chỉ coi report thôi, Sếp cũng không cần cài phần mềm power bi hay tool tương tự để xem được Report. Vì nếu dữ liệu lớn và phân tích phức tạp thì Sếp không có thời gian chờ Refresh. Report sẽ dạng như Public mà bạn vẫn coi trên các trang web ý, vẫn bấm coi bình thường mà không cần tự cập cập nhật dữ liệu.
 
Tôi chưa thạo Power Bi lắm, cũng chưa từng đo khoảng thời gian như thế nào, khoản này anh @excel_lv1.5 chắc biết rõ hơn tôi.
Tôi lấy dữ liệu về viết hàm xong xuất thì báo 114 ms.
View attachment 267492
Thời gian này chưa bao gồm thời gian load số liệu và chỉ là thời gian của top danh sách (thời gian measure+ load visualize+others), tức là như cái hình bạn chụp no show khoảng 30 mã hàng nếu load full 13.000 con số nó sẽ khác, bạn vẫn giữ performace analyzer đồng thời cuộn xuống dưới xem danh sách sẽ có thêm thời gian tính, power BI cơ chế nó là vậy nó chỉ hiện đủ danh sách cho size report thôi, nên nó tính rất nhanh kéo xuống nó mới tính tiếp, thực tế bài này tôi có làm power pivot rồi chạy full cũng dưới 1s sau nạp đủ source rồi, VBA nó nhanh ở chỗ nạp source (nạp từ excel là sân nhà của VBA rồi), chứ riêng việc tính toán nó vẫn thua tool hay các ngôn ngữ khác vì cơ chế vẫn quét theo Row dữ liệu càng nhiều thì sẽ càng chậm
Muốn đo đúng bạn tính bằng calculated table là biết?
 
Lần chỉnh sửa cuối:
Báo cáo hiện tại thì Sếp ko cần refresh gì đâu bạn, bạn gửi Báo cáo cho sếp thì cái báo cáo đấy bạn phải tự refresh, Sếp chỉ coi report thôi, Sếp cũng không cần cài phần mềm power bi hay tool tương tự để xem được Report. Vì nếu dữ liệu lớn và phân tích phức tạp thì Sếp không có thời gian chờ Refresh. Report sẽ dạng như Public mà bạn vẫn coi trên các trang web ý, vẫn bấm coi bình thường mà không cần tự cập cập nhật dữ liệu.
Sếp ở đây là nói ví dụ vậy thôi.
Chắc bạn chưa hiểu ý của đề bài. Dữ liệu gốc có thể thay đổi, bổ sung, chỉnh sửa bất ký lúc nào, nó đâu có cố định.
Người xem báo cáo muốn cập nhật chuẩn cần phải refresh, để load lại từ đầu.
 
Như em cũng nói ở trên là load data mất 16s, còn đo thời gian em nghĩ tính từ đoạn mình bấm export ra kết quả file cuối cùng, đo thời gian từ đó đến khi xong file để so sánh giữa các loại là phù hợp nhất.
 
Sếp ở đây là nói ví dụ vậy thôi.
Chắc bạn chưa hiểu ý của đề bài. Dữ liệu gốc có thể thay đổi, bổ sung, chỉnh sửa bất ký lúc nào, nó đâu có cố định.
Người xem báo cáo muốn cập nhật chuẩn cần phải refresh, để load lại từ đầu.
Power BI nó có 2 chế độ là direct và import , direct thì sẽ xem real time tuy nhiên tốc độ xem các report sẽ rất chậm và phần lớn sẽ không dùng Dax được sẽ mất tính analytics , 2 là import toàn bộ dùng Dax sẽ tính toán thì tốc độ xem report nhất nhanh chỉ vài ms khi dùng các slicer điều khiển, BI nó không refresh thường xuyên mà refresh theo lịch (giới hạn 8 lần/ ngày với Pro), vì refresh import thường xuyên sẽ ảnh hưởng đến tài nguyên hệ thống Database (nếu chưa có data warehouse) khi số liệu quá lơn, nên BI nó sẽ refresh trước sau đó thông cho mọi người xem thôi, ví dụ công ty tôi hệ report Sales nó refresh 2 lần/ ngày mỗi lần refresh khoảng 20 phút tôi cài lịch là 7h và 12 giờ , nên tôi sẽ thông báo mọi người có thể xem mới lúc 8h/13h. End users chỉ quan tấm đến tốc độ xem report thôi (thông thường tiêu chuẩn của một báo cáo BI là phải dưới 3s), Excel cũng vậy nhưng không bị giới hạn số làn refresh, nhưng thông thường người ta sẽ làm ở power pivot để lưu source luôn, power query chỉ là trung gian ETL cho power pivot, không ai chơi đẩy thẳng kết quả từ power query cả, vì như vậy chỉ tạo được 1 report, trong khi đưa vào power pivot nó tạo thêm được hàng tá các report khác mà không cần load lại dữ liệu
 
Sếp ở đây là nói ví dụ vậy thôi.
Chắc bạn chưa hiểu ý của đề bài. Dữ liệu gốc có thể thay đổi, bổ sung, chỉnh sửa bất ký lúc nào, nó đâu có cố định.
Người xem báo cáo muốn cập nhật chuẩn cần phải refresh, để load lại từ đầu.
Chắc tôi hiểu lầm ý của bạn, Tôi nghĩ đơn giản hơn, người coi thì chỉ cần coi thôi, còn tính toán là trách nhiệm của người làm báo cáo trừ khi làm chung một nhóm, mỗi người làm một phần vào cái chung thì dùng chung.
 
Quý vị đang thi đấu với nhau về nghề lập trình hay xây dựng phần mềm vậy?
Cái chỉ tiêu (metrics) mà quý vị đưa ra là tốc độ. Từ thuở biết lập trình đến giờ, tôi chỉ thấy mấy phần mềm chuyên real-time (như đặt vé, xoát vé,...) mới cần tốc độ. Báo cáo là công việc rất ít cần tốc độ.

Chỉ tiêu chung của phần mềm ứng dụng CSDL là dễ dùng và chỉnh sửa. "Phát triển" (nhìn tiêu đề) theo tôi có nghĩa là:
1. người dùng có sự tin tưởng rằng phần mềm đáp ứng được nhu cầu của mình (rất tiếc rằng dân hỏi bài ở đây đã được làm quen với "tốc độ", cho nên họ chỉ chú ý đến điểm này)
2. người viết phần mềm hiểu rõ phạm vi và giới hạn của phần mềm. Khi cần triển khai, người ta nhanh chóng nhận định rằng phần mềm có thể chỉnh sửa hay phaiur dùng phầnn mềm khác.
3. cả người dùng và người viết đều có sự tin tưởng rằng giao diện (xuất nhập dữ liệu sang các nơi khác) đáp ứng đầy đủ.

Điển hình, đối với tôi thì cuộc thi "phát triển ngôn ngữ" này của các bạn đã thất bại hoàn toàn ở đây:
 
Web KT
Back
Top Bottom