Em chào anh chị !!!
Anh chị cho em hỏi một chút thế này ạ. Trong package Purchase trong phần addons có một package là report và trong đó có một file là purchase_report.py, class purchase_report được xây dựng để tạo bảng lưu những giá trị cần thiết và có một hàm là def init(self, cr): để thực hiện câu truy vấn đến database lấy những giá trị cần thiết nhưng em không hiểu khi select họ lấy min(l.id) as id để làm gì ạ? l ở đây là purchase_order_line, theo em hiểu thì sau khi tạo bảng họ cần có id cho các record nhưng em không hiểu sao lại là min(l.id). Em rất mong các anh chị có thể gợi ý cho em phần này ạ, em cảm ơn anh chị.
5 Trả lời
Chào Dũng,
Không chỉ trong purchase_report, mà rất nhiều report trong OpenERP đều có select min id. Nếu trường select min id mà là Null có nghĩa là không có bản ghi nào và ngược lại.
Như vậy mục đích của trường min id là giúp chúng ta kiểm tra xem trong câu select đấy có dữ liệu hay không. Đằng nào cũng phải select thì chúng ta select luôn min(id), rồi dùng trường đó để kiểm tra, thay vì chúng ta lại phải trọc vào database để select count.
Ví dụ: trong việc tính phân bổ tài sản, anh có câu truy vấn như sau?
CASE WHEN (select min(d.id) from account_asset_depreciation_line as d left join account_asset_asset as ac ON (ac.id=d.asset_id) where a.id=ac.id) = min(dl.id) THEN a.purchase_value ELSE 0 END[
Đơn giản nó chỉ là một thủ thuật thay cho việc em lại phải select count rồi kiểm tra count > 0.
Theo như anh bảo thì cái đó chỉ dùng để kiểm tra nhưng ở đây tại sao họ lại lấy theo purchase order line mà không phải là purchase order, em đang làm một cái report đơn giản theo cách họ làm nhưng cách biểu diễn của em khác họ, em vẫn thấy mập mờ chưa hiểu rõ lắm :(
Lấy cái gì là do mục đích của họ. Như anh đã nói, ý nghĩa của nó là dùng để kiểm tra xem có dữ liệu hay không. Như vậy trong trường hợp này họ muốn kiểm tra xem puchase order đấy có line nào không? Về nguyên tắc, bất kỳ một purchase order nào cũng phải có ít nhất 1 line. Do đó min(l.id) luôn luôn khác null. Nếu = null nghĩa là dữ liệu có vấn đề.