Hoàng Trọng Nghĩa > 29-02-24, 04:29 PM
SELECT ToNhom, LenhSanXuat, NgayCap, DonHang, NgayDH, NgayGH, TenKH, MaKH, MAsP, MAsPKhach, MaQuai, MaDe, MaMatTay, MauSac, ChatLieu, HieuIn, NhomSizeQuai, ChiTietQuai, NhomSizeDe, ChiTietDe, TimeRowDH, NgayNhan, Sum(PCSize38) AS PC38, Sum(PCSize39) AS PC39, Sum(PCSize40) AS PC40, Sum(PCSize41) AS PC41, Sum(PCSize42) AS PC42, Sum(PCSize43) AS PC43, Sum(PCSize44) AS PC44, Sum(PCSize45) AS PC45, Sum(PCSize46) AS PC46, Sum(PCTong) AS TongPC, Sum(SXSize38) AS SX38, Sum(SXSize39) AS SX39, Sum(SXSize40) AS SX40, Sum(SXSize41) AS SX41, Sum(SXSize42) AS SX42, Sum(SXSize43) AS SX43, Sum(SXSize44) AS SX44, Sum(SXSize45) AS SX45, Sum(SXSize46) AS SX46, Sum(SXTong) AS TongSX
FROM (SELECT
fldToNhom As ToNhom,
fldLenhSX As LenhSanXuat,
fldNgayCap As NgayCap,
fldDonHang As DonHang,
fldNgayDH As NgayDH,
fldNgayGH As NgayGH,
fldTenKH As TenKH,
fldMaKH As MaKH,
fldMAsP As MAsP,
fldMAsPKhach As MAsPKhach,
fldMaQuai As MaQuai,
fldMaDe As MaDe,
fldMaMatTay As MaMatTay,
fldMauSac As MauSac,
fldChatLieu As ChatLieu,
fldHieuIn As HieuIn,
fldNhomSizeQuai As NhomSizeQuai,
fldChiTietQuai As ChiTietQuai,
fldNhomSizeDe As NhomSizeDe,
fldChiTietDe As ChiTietDe,
fldTimeRowDH As TimeRowDH,
IIF(fldNgayNhan>0,'X','') As NgayNhan,
fldSize38 As PCSize38, 0 As SXSize38,
fldSize39 As PCSize39, 0 As SXSize39,
fldSize40 As PCSize40, 0 As SXSize40,
fldSize41 As PCSize41, 0 As SXSize41,
fldSize42 As PCSize42, 0 As SXSize42,
fldSize43 As PCSize43, 0 As SXSize43,
fldSize44 As PCSize44, 0 As SXSize44,
fldSize45 As PCSize45, 0 As SXSize45,
fldSize46 As PCSize46, 0 As SXSize46,
fldTongSL As PCTong, 0 As SXTong
FROM [tblPhanCong]
UNION ALL SELECT
fldToNhom As ToNhom,
fldLenhSX As LenhSanXuat,
fldNgayCap As NgayCap,
fldDonHang As DonHang,
fldNgayDH As NgayDH,
fldNgayGH As NgayGH,
fldTenKH As TenKH,
fldMaKH As MaKH,
fldMAsP As MAsP,
fldMAsPKhach As MAsPKhach,
fldMaQuai As MaQuai,
fldMaDe As MaDe,
fldMaMatTay As MaMatTay,
fldMauSac As MauSac,
fldChatLieu As ChatLieu,
fldHieuIn As HieuIn,
fldNhomSizeQuai As NhomSizeQuai,
fldChiTietQuai As ChiTietQuai,
fldNhomSizeDe As NhomSizeDe,
fldChiTietDe As ChiTietDe,
fldTimeRowDH As TimeRowDH,
IIF(fldNgayNhan>0,'X','') As NgayNhan,
0 As PCSize38, fldSize38 As SXSize38,
0 As PCSize39, fldSize39 As SXSize39,
0 As PCSize40, fldSize40 As SXSize40,
0 As PCSize41, fldSize41 As SXSize41,
0 As PCSize42, fldSize42 As SXSize42,
0 As PCSize43, fldSize43 As SXSize43,
0 As PCSize44, fldSize44 As SXSize44,
0 As PCSize45, fldSize45 As SXSize45,
0 As PCSize46, fldSize46 As SXSize46,
0 As PCTong, fldTongSL As SXTong
FROM [tblSanXuat]
WHERE fldPhanLoai<>'BTP') AS [%$##@_AliAs]
GROUP BY ToNhom, LenhSanXuat, NgayCap, DonHang, NgayDH, NgayGH, TenKH, MaKH, MAsP, MAsPKhach, MaQuai, MaDe, MaMatTay, MauSac, ChatLieu, HieuIn, NhomSizeQuai, ChiTietQuai, NhomSizeDe, ChiTietDe, TimeRowDH, NgayNhan;
Noname > 29-02-24, 04:53 PM
Hoàng Trọng Nghĩa > 29-02-24, 04:56 PM
(29-02-24, 04:53 PM)Noname Đã viết: mình thấy bên phần bảng sản xuất của bạn có cái lệnh Sum nào đâu mà nó cộng, với lại cách phát biểu của bạn khá rối rắm, sum trong chính cái query Union thì nó hơi kỳ kỳ, bạn nên tách ra 1 query union, rồi 1 query Group by lấy nguồn từ query kia, nó tường minh hơn và dễ kiểm tra
Noname > 29-02-24, 05:51 PM
Trích dẫn:Điều quan trọng cần phải ghi nhớ rằng bạn không thể dùng các toán tử so sánh như “=”, “<”, hoặc “>” với giá trị NULL. Đó là do giá trị NULL chưa được biết đến và có thể đại diện cho giá trị bất kỳ. Thay vào đó, bạn phải dùng toán tử “IS NULL” hoặc “IS NOT NULL” để kiểm tra xem liệu một giá trị có phải là NULL.
ongke0711 > 29-02-24, 07:57 PM
(29-02-24, 04:29 PM)Hoàng Trọng Nghĩa Đã viết: Tôi tạo một query từ 2 table, cấu trúc SQL như sau:
...
Điều kỳ lạ là sau khi truy vấn, phần các cột từ bảng Phân Công nó Sum, còn phần các cột bảng Sản Xuất nó chỉ bằng 0. Các anh chị xem file và cho biết nguyên nhân lỗi tại đâu.
Hoàng Trọng Nghĩa > 29-02-24, 08:05 PM
(29-02-24, 05:51 PM)Noname Đã viết: Mình thấy chỗ này
FROM [tblSanXuat]
WHERE fldPhanLoai<>'BTP'
Mà trong table tblSanxuat cột đó không có giá trị, bạn thử kiểm lại xem.
Mình vẫn chưa rõ cơ chế của việc so sánh với giá trị Null, nhưng có lẽ vấn đề chỗ ô phân loại đó. bạn cần đặt giá trị mặc định cho trường này
Theo định nghĩa giá trị Null, bạn tham khảo
Trích dẫn:Điều quan trọng cần phải ghi nhớ rằng bạn không thể dùng các toán tử so sánh như “=”, “<”, hoặc “>” với giá trị NULL. Đó là do giá trị NULL chưa được biết đến và có thể đại diện cho giá trị bất kỳ. Thay vào đó, bạn phải dùng toán tử “IS NULL” hoặc “IS NOT NULL” để kiểm tra xem liệu một giá trị có phải là NULL.
Hoàng Trọng Nghĩa > 29-02-24, 09:08 PM
(29-02-24, 07:57 PM)ongke0711 Đã viết:(29-02-24, 04:29 PM)Hoàng Trọng Nghĩa Đã viết: Tôi tạo một query từ 2 table, cấu trúc SQL như sau:
...
Điều kỳ lạ là sau khi truy vấn, phần các cột từ bảng Phân Công nó Sum, còn phần các cột bảng Sản Xuất nó chỉ bằng 0. Các anh chị xem file và cho biết nguyên nhân lỗi tại đâu.
File đã sửa đây: https://www.mediafire.com/file/er4f6hx3e...accdb/file
Bác Nghĩa muốn bắt đầu làm với CSDL Access hay là chỉ muốn mượn Query của Access để xử lý vậy?
Query của bác có mấy vấn đề sau:
- Nếu đã làm với Query Access thì các Query phức tạp, nên tách ra các Query con để sau này dễ bảo trì, sửa chữa.
- Điều kiện WHERE fldPhanLoai <> 'BTP' không chạy vì Null, zero-length string, string khác nhau, nó không so được. Do đó bác phải dùng hàm khử NULL trước khi so sánh (giống như ép kiểu). Access có hàm Nz() rất mạnh.
Vd: Nz(fldPhanLoai,"") ==> nếu nó thấy giá trị trường fldPhanLoai là rỗng, gì gì đó thì nó sẽ ép thành "" (có thể thay bằng 0 tùy bài toán), sau đó nó lấy giá trị string đó so sánh với "BTP"
Nếu bác dùng trong Excel thì tự viết cái hàm Nz() này. Tôi nhớ hình như có viết cái hàm này bên đó rồi.
Còn 1 vấn đề ngoài luồng là sau khi chạy các query nhiều lần CSDL sẽ phình lên. Do đó bác nên vào menu File - chọn Compact & Repair Database -> nó sẽ trả về hiện trạng thực tế của nó. (File của bác chỉ có 480kb mà bác gửi file lên đến 1.9M)
ongke0711 > 29-02-24, 09:33 PM
(29-02-24, 09:08 PM)Hoàng Trọng Nghĩa Đã viết: Mình xử lý WHERE NZ(fldPhanLoai,'')<>'BTP' thì Access OK, nhưng khi lấy dữ liệu từ Query này gán lên UserForm Excel thì nó phát sinh lỗi (Underfined function 'NZ' in expression) khi load form, không biết tại sao, nên dùng WHERE IIF(ISNULL(fldPhanLoai),'',fldPhanLoai)<>'BTP' thì ổn.
Hoàng Trọng Nghĩa > 29-02-24, 10:08 PM
(29-02-24, 09:33 PM)ongke0711 Đã viết:(29-02-24, 09:08 PM)Hoàng Trọng Nghĩa Đã viết: Mình xử lý WHERE NZ(fldPhanLoai,'')<>'BTP' thì Access OK, nhưng khi lấy dữ liệu từ Query này gán lên UserForm Excel thì nó phát sinh lỗi (Underfined function 'NZ' in expression) khi load form, không biết tại sao, nên dùng WHERE IIF(ISNULL(fldPhanLoai),'',fldPhanLoai)<>'BTP' thì ổn.
Bác làm vậy sao được. Bác gọi câu lệnh Query từ Excel thì nó có hàm Nz() đâu mà xử lý. Query trên chỉ chạy trên Access engine thôi.
Muốn lấy thì bác tạo Recordset từ cái query đó xem rồi gán Recordset đó xuống Sheet tạm hoặc thẳng lên Useform. Tôi chưa kiểu này bao giờ vì tôi luôn thiết kế đồng bộ với nhau.
ongke0711 > 29-02-24, 11:05 PM
(29-02-24, 10:08 PM)Hoàng Trọng Nghĩa Đã viết: Mình vẫn chưa hiểu, cái Query đó đã sử dụng hàm NZ OK rồi, chỉ dùng ADO lấy dữ liệu có sẵn từ nó lên form thôi. Có dùng hàm NZ trên ADO gì đâu mà phát sinh lỗi??