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
Tôi thử làm offline trên Access. Query có SQL là:
SQL:
Select dm.* , iif(dk.SL01 > 0,dk.SL01,0) +iif(pre.pssl > 0,pre.pssl,0) as SLdkBC,
iif(dk.ttien01>0,dk.ttien01,0)+ iif( pre.pstt>0,pre.pstt,0) as TTDkBC, dtps.sln,dtps.ttn, dtps.slx,dtps.ttx,
iif(SLdkBC>0,SLdkBC,0)+iif(dtps.sln>0,dtps.sln,0) - iif(dtps.slx,dtps.slx,0) as SLCky,
iif(TTDkBC>0,TTDkBC,0) + iif(dtps.ttn>0,dtps.ttn,0) - iif(dtps.ttx >0,dtps.ttx,0) as TTCky
from ( (danhmuc dm left join Ton1 dk on dm.MA_VLSPHH = dk.Ma01)
left join (select dt.MA_VLSPHH as Ma,sum(iif(dt.loai_phieu="N",dt.slg,- dt.slg)) as PSSL, 
    sum(iif(dt.loai_phieu="N",dt.THANH_TIEN,- dt.THANH_TIEN)) as PStt
    from data dt where dt.ngay_ct < dateserial(2013,2,1) group by dt.MA_VLSPHH ) as Pre  on pre.Ma=dm.MA_VLSPHH )
left join (select dt.MA_VLSPHH as Ma,sum(iif(dt.loai_phieu="N",dt.slg,0)) as sln,  sum(iif(dt.loai_phieu="N",dt.THANH_TIEN,0)) as ttn,
 sum(iif(dt.loai_phieu="X",dt.slg,0)) as slx,  sum(iif(dt.loai_phieu="X",dt.THANH_TIEN,0)) as ttx
    from data dt where dt.ngay_ct >= dateserial(2013,2,1) and dt.ngay_ct <= dateserial(2013,2,28) group by dt.MA_VLSPHH ) as dtps
     on dtps.Ma=dm.MA_VLSPHH

Trong đó DateFrom là dateserial(2013,2,1) và DateTo là dateserial(2013,2,28) (nguyên tháng 2)
Từ SQL view sửa DateTo thành ngày khác (thí dụ dateserial(2013,3,3), nhấn nút xem DataSheet view thì khoảng 2 giây.

Hình 1: SQL view, nhấn nút datasheet view
View attachment 267456

Hình 2: Datasheet view

View attachment 267457
Up file đi sư phụ. Access quá mạnh mà gần như em chưa mở nó lên bao giờ :(
 
Tôi thử làm offline trên Access. Query có SQL là:


Trong đó DateFrom là dateserial(2013,2,1) và DateTo là dateserial(2013,2,28) (nguyên tháng 2)
Từ SQL view sửa DateTo thành ngày khác (thí dụ dateserial(2013,3,3), nhấn nút xem DataSheet view thì khoảng 2 giây.
Lấy dữ liệu từ 1/2/2013 - 30/6/2103 cho giống đề bài nha bác.
 
Lấy dữ liệu từ 1/2/2013 - 30/6/2103 cho giống đề bài nha bác.
2 tháng như bài trên = hơn 2 giây.
từ 1/2/2013 - 30/6/2103 = 6.22 giây

1633826449576.png

Up file đi sư phụ. Access quá mạnh mà gần như em chưa mở nó lên bao giờ :(
File 139 Mb :). Mở form và nhấn nút Open query. Có thêm 1 report và có thể nhấn nút Open report.
Link download
 
Lần chỉnh sửa cuối:
Nếu lấy làm ứng dụng thực tế thì không nên dùng dữ liệu kiểu này (ở Excel), nên Cần tổ chức lại thì mới nhanh hay chậm được
Và quan trọng bài toán kinh tế không phải nhanh chậm, mà là độ chính xác và Nhanh là tức thời với phản ứng
----
Nội dung trên định viết từ hôm trước rồi, mà quên post
Data chuyển qua Access nở ra kinh khủng quá ạ.
Access cũng là trình quản lý dữ liệu tầm tầm và ứng dụng cho desktop offline là chính
Còn như mục đích bài 1 thì có vẻ phải đặt lại vấn đề
 
Nếu lấy làm ứng dụng thực tế thì không nên dùng dữ liệu kiểu này (ở Excel), nên Cần tổ chức lại thì mới nhanh hay chậm được
Và quan trọng bài toán kinh tế không phải nhanh chậm, mà là độ chính xác và Nhanh là tức thời với phản ứng
----
Nội dung trên định viết từ hôm trước rồi, mà quên post

Access cũng là trình quản lý dữ liệu tầm tầm và ứng dụng cho desktop offline là chính
Còn như mục đích bài 1 thì có vẻ phải đặt lại vấn đề
vâng anh, với bài này làm offline nhiều giải pháp, nhanh, chính xác.
Tuy nhiên, tinh thần bài này là làm online.
Dữ liệu gốc nặng nề đẩy lên Drive.
File báo cáo nhẹ tênh, gửi mail cho đối tác để họ tự chạy.
 
2 tháng như bài trên = hơn 2 giây.
từ 1/2/2013 - 30/6/2103 = 6.22 giây

Link download

Bác xem lại công thức tính tồn đầu kỳ nhé, nó bị sai.

Mới test trên Access 2013 - 32bit, không hiểu sao nhanh hơn 2016 - 64bit.

Mở trực tiếp Query:
Screen Shot 2021-10-10 at 10.54.33.png

Xuất ra Excel:
Screen Shot 2021-10-10 at 10.57.08.png

Data chuyển qua Access nở ra kinh khủng quá ạ.
Đúng là data nó phình lên gấp đôi nhưng bạn mở file Access thấy nó cực nhanh so với mở file data Excel không?

Link file demo: https://www.mediafire.com/file/g72sunrp549cnqg/NXT_Access.7z/file
Bài đã được tự động gộp:

vâng anh, với bài này làm offline nhiều giải pháp, nhanh, chính xác.
Tuy nhiên, tinh thần bài này là làm online.
Dữ liệu gốc nặng nề đẩy lên Drive.
File báo cáo nhẹ tênh, gửi mail cho đối tác để họ tự chạy.

Sao bạn không tạo folder chứa file data trên máy rồi đồng bộ nó lên cloud. Khi bạn xử lý thì file data đó vẫn là file trên máy thay vì làm trực tiếp file trên Cloud.
 
Bác xem lại công thức tính tồn đầu kỳ nhé, nó bị sai.

Mới test trên Access 2013 - 32bit, không hiểu sao nhanh hơn 2016 - 64bit.

Mở trực tiếp Query:
View attachment 267467

Xuất ra Excel:
View attachment 267468


Đúng là data nó phình lên gấp đôi nhưng bạn mở file Access thấy nó cực nhanh so với mở file data Excel không?

Link file demo: https://www.mediafire.com/file/g72sunrp549cnqg/NXT_Access.7z/file
Bài đã được tự động gộp:



Sao bạn không tạo folder chứa file data trên máy rồi đồng bộ nó lên cloud. Khi bạn xử lý thì file data đó vẫn là file trên máy thay vì làm trực tiếp file trên Cloud.
Data vẫn làm trực tiếp trên máy trạm ạ. Rồi save trên onedrive/cloud đó anh.
 
Data vẫn làm trực tiếp trên máy trạm ạ. Rồi save trên onedrive/cloud đó anh.
Hình như cách này dữ liệu thay đổi liên tục onedrive nó thông báo gì đó và nó lưu có file tạm ... mấy na9m trước có vọc theo hướng này xong bỏ
 
Bác xem lại công thức tính tồn đầu kỳ nhé, nó bị sai.
Tôi xin lỗi, file của tôi lấy dữ liệu từ file excel khác, giống cấu trúc nhưng số liệu không giống file của @Cá ngừ F1. Link file trong bài 2, lúc đó tôi viết power query. Table đầu kỳ trong file đó 36 cột cho 12 tháng, và tôi dùng Power query động để lấy tồn tháng gần nhất
 
Tôi thử nhiều cách nhưng không thể truy vấn SQL trực tiếp từ cái link OneDrive đó. Nếu làm offline thì Excel chạy hết 73s. Nếu mở sẵn file nguồn lên thì nhanh hơn (khoảng 34s)
 
Bác xem lại công thức tính tồn đầu kỳ nhé, nó bị sai.
Bạn cũng xem lại:
Cách tính tồn đầu kỳ = tồn đầu năm (bảng TonDK) + PS nhập trước ngày đầu báo cáo - PS xuất trước ngày đầu báo cáo

Query qrTDKPS của bạn lấy phát sinh nhập xuất between(ngày đầu, ngày cuối)

Hỏi thêm:
Tôi thấy trong SQL view, câu SQL của bạn có hàm Nz đó là gì, vì tôi không có nó cũng ra kết quả?
 
Bạn cũng xem lại:
Cách tính tồn đầu kỳ = tồn đầu năm (bảng TonDK) + PS nhập trước ngày đầu báo cáo - PS xuất trước ngày đầu báo cáo

Query qrTDKPS của bạn lấy phát sinh nhập xuất between(ngày đầu, ngày cuối)

Hỏi thêm:
Tôi thấy trong SQL view, câu SQL của bạn có hàm Nz đó là gì, vì tôi không có nó cũng ra kết quả?
Tôi cũng tính tồn đầu theo công thức trên đó anh. qryTDK = TonDK + qry TonDKPS (Phát sinh N/X trước ngày báo cáo)
Còn hàm Nz() là hàm khử Null (Nếu gặp giá trị Null nó sẽ chuyển về =0). Trong bài này có những mã hàng TDK có nhưng phát sinh N/X không có, khi nối (Join) 2 bảng lại với nhau thì Access tự động ghi Null cho các giá trị N/X không có dữ liệu --> khi tính toán +/- sẽ bị sai kết quả. Nên chắc ăn nhất là cứ khử giá trị Null trước khi tính toán.
Còn trong câu lệnh SQL của anh có dùng hàm IIF() để thay thế Null bằng các giá trị 0 rồi. Dùng Nz() thì nó gọn hơn.
Tôi không dùng các subquery lồng nhau mà tách riêng ra để dễ kiểm tra từng hạng mục. Thường cũng chỉ dùng 1 subquery lồng vô thôi.

Mới test kiểu dùng linked Table link tới file Excel luôn để xử lý thì tốc độ cũng khá nhanh với điều kiện là phải duy trì kết nối liên tục tới file Excel trong qua trình truy vấn dữ liệu, nếu không thì mất hơn 1 phút mới ra kết quả.

Screen Shot 2021-10-10 at 15.52.41.png

Đây cũng là một cách dã chiến mà ứng dụng Access thiết kế cho nhiều người dùng nhập liệu (Font end) qua Internet mà không cần các tool hỗ trợ khác ngoại trừ một tài khoản Cloud Drive (One Drive, Google Drive). Tốc độ đồng bộ cũng 3, 4 s tuỳ hạ tầng mạng. Data back end lưu trên ổ đám mây, còn các máy con thì dùng ứng dụng Font end trên máy họ mà nhập liệu, xem báo cáo.
 
Lần chỉnh sửa cuối:
Tôi cũng tính tồn đầu theo công thức trên đó anh. qryTDK = TonDK + qry TonDKPS (Phát sinh N/X trước ngày báo cáo)
Cám ơn bạn về việc giải thích Nz. Do không biết hàm đó nên phải IIf >0.
Còn công thức trên bạn ghi đúng nhưng trong SQL lại between (ngày đầu báo cáo, ngày cuối báo cáo). Đúng ra phải là between(ngày 1/1/2013, ngày đầu báo cáo). Thậm chí không dùng between vì between lấy luôn giá trị ngày 1/2. Phải là >= 1/1/2013 and < ngày đầu BC
 
Tôi thử nhiều cách nhưng không thể truy vấn SQL trực tiếp từ cái link OneDrive đó. Nếu làm offline thì Excel chạy hết 73s. Nếu mở sẵn file nguồn lên thì nhanh hơn (khoảng 34s)
Vâng anh.
Chắc onedrive không cho SQL trực tiếp.
Anh làm offline bằng ADO anh cứ share cho anh em học hỏi. Vì em hình dung với bài này ADO join các bảng không biết phức tạp không.
 
Vâng anh.
Chắc onedrive không cho SQL trực tiếp.
Anh làm offline bằng ADO anh cứ share cho anh em học hỏi. Vì em hình dung với bài này ADO join các bảng không biết phức tạp không.
ADO cũng dùng câu lệnh SQL, tương tự SQL troong Access vậy. Xem file của anh @ongke0711 và của tôi để tham khảo. Chỉ là viết trong môi trường VBA của Excel mà thôi
 
Web KT

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

Back
Top Bottom