Trợ giúp thay hàm Dsum trong query bằng vòng lặp trong dao (3 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

huyhoang_mmyeht

Thành viên hoạt động
Tham gia
5/5/09
Bài viết
142
Được thích
12
Chào tất cả các bạn trong diễn đàn, mình có vấn đề này cần nhờ các bạn giúp mình với
mình có 1 file access có 2 table

table 1 gồm (PO,MaVT,TT,Sl)
mình muốn sum số lượng theo điều kiện MaVT và TT sau đó gán vào Table2. mình đã làm bằng Query được nhưng nếu nếu mình bỏ thêm vào nhiều cột số lượng nữa thì rất nặng.
các bạn có cách nào dùng vòng lặp không giúp mình với!

các bạn xem file đính kèm!
cảm ơn các bạn!
 

File đính kèm

Chào tất cả các bạn trong diễn đàn, mình có vấn đề này cần nhờ các bạn giúp mình với
mình có 1 file access có 2 table

table 1 gồm (PO,MaVT,TT,Sl)
mình muốn sum số lượng theo điều kiện MaVT và TT sau đó gán vào Table2. mình đã làm bằng Query được nhưng nếu nếu mình bỏ thêm vào nhiều cột số lượng nữa thì rất nặng.
các bạn có cách nào dùng vòng lặp không giúp mình với!

các bạn xem file đính kèm!
cảm ơn các bạn!

Làm được ở query là ngon rồi, bạn muốn tăng tốc mà đòi dùng vòng lặp thì xin thưa rằng tốc độ của vòng lặp sẽ không bằng truy vấn của query.
 
Định nghĩa "nặng" của bạn là gì?

Khi update database, đặt vấn đề chỉ ở nhanh chậm (*) là cái nhìn thiển cận. Dân chuyên nghiệp người ta dùng vòng lặp là để bắt lỗi và sửa lỗi.

Khi update một recordset bằng 1 lệnh, nếu gặp lỗi, rất khó quyết định, 99% là phải rollback.

Khi dùng vòng lặp để update từng record của một recordset, nếu gặp lỗi, người ta có thể sử lý lỗi trước khi tiếp tục.

(*) tôi tránh dùng từ "nặng" vì tôi không hiểu các bạn định nghĩa thế nào.
 
bài của mình ở đây là mổi PO có rất nhiều loại sản lượng có khoảng 40 sản lượng khác nhau, ý mình là muốn dùng vòng lặp sử lý tình huống nếu khi sử lý xong 1 record nó sẽ lấy số liệu đã sử lý gán vào 1 table cố định và tiếp tục sử lý những record tiếp theo cho tới khi hết thì thôi, như vậy là bộ nhớ luôn được giải phóng.
 
Theo bạn thì khi sử lý một recordset, cần bao nhiêu trong bộ nhớ?
Giải phóng bộ nhớ quan trọng đến vậy sao?
Giải quyết theo kiểu từng record một thì có thể bị chậm giải phóng đường dẫn (connection).
 
Vấn đề ở đây là mình muốn dữ liệu tự động tính toán khi mình nhấn nút lệnh nào đó, nếu dùng truy vấn query như vậy là rất nặng mổi khi mở query.
file đính kièm của mình ở đây mới có 86 record đã thế này nếu 100 ngàn record sẽ thế nào??

bạn thử mở QR_P01 nhé!
 

File đính kèm

100 ngàn purchase order items thì Access engine cũng có cách tính toán tổng hợp của nó. Và cuối cùng khi ghi lại kết quả vẫn là N (số items trong inventory) lần.

Nếu muốn bỏ qua phần tính tổng hợp thì ý bạn muốn ghi kết quả 100 ngàn lần ? Cứ mỗi purchase order items thì update inventory một lần ?

Tôi không đọc được file Access của bạn.
Bạn cứ đưa câu query mà bạn đã viết được, cùng với điều kiện muốn phát triển nhiều cột sl ra sao. Tôi sẽ phân tích.

Trước mắt thì "nhiều cột số lượng" có nghĩa là CSDL không đạt chuẩn bậc 1 ?!?!?!
 
Cảm ơn bạn đã quan tâm đề tài của mình.

vì CSDL của mình nó là đặc thù của ngành giày da nên không thể chuyển sang 1 cột sản lượng được.

cái của mình là làm sao ra được kết quả mà không làm máy chạy châm lại.

trong ví dụ của mình cột sản lượng là cột P.. ở trong đó có bao nhiêu P.. là bấy nhiêu cột sản lượng

còn đây là query của mình.

SELECT QR_Plans_Detail.PO, DSum("[P01]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S01, DSum("[P02]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S02, DSum("[P03]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S03, DSum("[P04]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S04, DSum("[P05]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S05, DSum("[P06]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S06, DSum("[P07]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S07, DSum("[P08]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S08, DSum("[P09]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S09, DSum("[P10]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S10, DSum("[P11]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S11, DSum("[P12]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S12, DSum("[P13]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S13, DSum("[P14]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S14, DSum("[P15]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S15, DSum("[P16]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S16, DSum("[P17]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S17, DSum("[P18]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S18, DSum("[P19]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S19, DSum("[P20]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S20, DSum("[P21]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S21, DSum("[P22]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S22, DSum("[P23]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S23, DSum("[P24]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S24, DSum("[P25]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S25, DSum("[P26]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S26, DSum("[P27]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S27, DSum("[P28]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S28, DSum("[P29]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S29, DSum("[P30]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S30, DSum("[P31]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S31, DSum("[P32]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S32, DSum("[P33]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S33, DSum("[P34]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S34, DSum("[P35]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S35
FROM QR_Plans_Detail;
 
Cảm ơn bạn đã quan tâm đề tài của mình.

vì CSDL của mình nó là đặc thù của ngành giày da nên không thể chuyển sang 1 cột sản lượng được.

cái của mình là làm sao ra được kết quả mà không làm máy chạy châm lại.

trong ví dụ của mình cột sản lượng là cột P.. ở trong đó có bao nhiêu P.. là bấy nhiêu cột sản lượng

còn đây là query của mình.

SELECT QR_Plans_Detail.PO, DSum("[P01]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S01, DSum("[P02]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S02, DSum("[P03]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S03, DSum("[P04]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S04, DSum("[P05]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S05, DSum("[P06]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S06, DSum("[P07]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S07, DSum("[P08]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S08, DSum("[P09]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S09, DSum("[P10]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S10, DSum("[P11]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S11, DSum("[P12]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S12, DSum("[P13]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S13, DSum("[P14]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S14, DSum("[P15]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S15, DSum("[P16]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S16, DSum("[P17]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S17, DSum("[P18]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S18, DSum("[P19]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S19, DSum("[P20]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S20, DSum("[P21]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S21, DSum("[P22]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S22, DSum("[P23]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S23, DSum("[P24]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S24, DSum("[P25]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S25, DSum("[P26]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S26, DSum("[P27]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S27, DSum("[P28]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S28, DSum("[P29]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S29, DSum("[P30]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S30, DSum("[P31]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S31, DSum("[P32]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S32, DSum("[P33]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S33, DSum("[P34]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S34, DSum("[P35]","QR_Plans_Detail","[CodeID] = '" & [CodeID] & "' AND [CR] <= " & [CR] & "") AS S35
FROM QR_Plans_Detail;
Thank
 
Lần chỉnh sửa cuối:
Đọc hơi khó hiểu. Tôi đoán là hàng của bạn thuộc loại một mặt hàng có nhiểu kiểu (cỡ, màu, vv...). NV kế hoạch tổng hợp các đơn đặt hàng và cho biết với mỗi mặt hàng, mỗi kiểu (cỡ/màu) cần sản xuất bao nhiêu.

Nếu đúng như vậy thì cách dùng DSUM cho mỗi kiểu như vậy có thể rất chậm (*). Bạn dùng LEFT JOIN rồi tổng, hoặc dùng IIF sẽ hiệu quả hơn.

Đại khái như thế này:

SELECT QR_Plans_Detail.PO
, SUM(IIF(TT='kieu1', SoLuong, 0) AS [P01] -- nếu kiểu 1 thì lấy số lượng theo cột 1, không thì thôi
, SUM(IIF(TT='kieu2', SoLuong, 0) AS [P02]
, SUM(IIF(TT='kieu3', SoLuong, 0) AS [P03]
...
GROUP BY QR_Plans_Detail.PO

Nếu nó không cho dùng SoLuong trong câu GROUP như vậy thì dùng một subquery để tính số lượng từng kiểu rồi lồng vào một query khác để GROUP và tính SUM

Nếu có bảng món hàng, dùng LEFT JOIN sẽ hiệu quả hơn.

(*) Các CSDL hạng xịn có Query Planner nó tối ưu hoá câu truy vân. Nhưng Access có lẽ không có.
 
dữ liệu bên mình rất phức tạp luôn thay đổi, số lượng quy định theo hệ size khi đơn hàng lại theo chi tiết nhưng thực hiện lại theo tổng cộng cái của mình muốn là là sao lấy cái tổng cộng trừ cho chi tết mà máy tự hiểu qr trên chỉ là một minh họa thôi, còn phần bạn nói có lẻ không được rồi!
 
Cách truy vấn của bạn, với mỗi món hàng lại phải gọi hàm tổng cho từng cột, và hàm tổng được tính trên recordset, mỗi recordset là một câu truy vấn con. Nếu không có query optimiser thì 100 ngàn dòng sẽ nhân lên con số lớn khủng khiếp. Nếu nó tính lâu là tại số query con chứ không phải tại bộ nhớ bị kẹt.

Nếu bạn dùng vòng lặp hay con trỏ (cursor) thì vẫn bao nhiêu đó query con. Chẳng giảm thiểu gì được.

Nếu điều kiện dữ liệu phức tạp quá thì bạn bắt buộc phải thiết kế lại bảng, ví dụ tạo bảng phụ vv... Trên thực tế, việc thiết kế lại CSDL, hy sinh chẩn để tăng tốc cho các truy vấn quan trọng không phải là hiếm.
 
dữ liệu bên mình rất phức tạp luôn thay đổi, số lượng quy định theo hệ size khi đơn hàng lại theo chi tiết nhưng thực hiện lại theo tổng cộng cái của mình muốn là là sao lấy cái tổng cộng trừ cho chi tết mà máy tự hiểu qr trên chỉ là một minh họa thôi, còn phần bạn nói có lẻ không được rồi!

Với ngành giày thì việc thiết kế cho bảng dữ liệu sẽ gặp nhiều khó khăn, ví dụ như nhóm size (Trẻ sơ sinh, trẻ em, người lớn...), hệ size (UK,US,KR...), size nam, size nữ... Vấn đề là bắt buộc phải chia nhỏ bảng ra bạn à.
 
Bạn hai lúa hiểu mình đó!
các bạn ơi có cách nào lấy số tổng chừ dần cho số chi tiết không? ví dụ lấy tổng số tiền trừ cho từng hóa đơn còn lai
làm trên excel bằng công thức mình làm được nhưng trong access mình bó tay luôn!
 
Web KT

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

Back
Top Bottom