Em chào các anh !!!
Em có một vấn để muỗn xin ý kiển của các anh như sau ạ:
Mục đích của em là muốn insert hàng vào trong bảng incoming shipment, và trong bảng này thì nó nhận id của product để insert
Em gặp vấn đề là khi bên website của em muỗn lấy ra id của sản phẩm(trong bảng purchase_order_line) của 1 purchase order nào đó thì nó không trả về id mà trả về kiểu gồm cả default_code + name như kiêu [sữa]sữa tươi, car[cartravel], mặc dù trường em lấy là id vì trong bảng purchase_order_line nó là trường id
Bây giờ khi em muỗn dùng sản phẩm này để insert vào trong bảng incoming_shipment thì không được vì nó phải insert vào id của sản phẩm. Em định cắt chuỗi để lấy ra name của sản phẩm là sữatuoi rồi sau đó search để lấy id rồi mới update nhưng em thấy dở quá. Em rất mong các anh cho em xin ý kiến về vấn đề này ạ. Em xin cẳm ơn.
11 Trả lời
class incoming_shipment_report(osv.osv): _name = 'incoming.shipment.report' _description = "Incoming Shipment Report" _auto = False _columns = { 'purchase_order':fields.many2one('purchase.order', 'Purchase Order', readonly=True), 'product':fields.many2one('product.product', 'Product', readonly=True), 'unit':fields.many2one('product.uom', 'UOM', readonly=True), 'shipment':fields.many2one('stock.picking', 'Shipment', readonly=True), 'quantity':fields.float('Quantity', readonly=True), 'received':fields.float('Received',readonly=True), 'date':fields.char('Date Expected',size=128,readonly=True), 'sm_id':fields.many2one('stock.move','Stock Move ID', readonly = True), 'price_total': fields.float('Total Price', readonly=True), 'roast':fields.float('Roast',readonly=True), } def init(self, cr): tools.sql.drop_view_if_exists(cr, 'incoming_shipment_report') cr.execute(""" create or replace view incoming_shipment_report as( select min(sm.id) as id, po.id as purchase_order, sp.id as shipment, sm.id as sm_id, pol.product_id as product, (pol.price_unit*pol.product_qty) as price_total, sm.product_uom as unit, pol.product_qty as quantity, sum(sm.product_qty) as received, to_char(sm.date_expected, 'DD-MM-YYYY') as date, (case when pol.product_id = sm.product_id then pol.product_qty - sum(sm.product_qty) else sm.product_id end) as roast from purchase_order as po left join purchase_order_line as pol on po.id = pol.order_id left join stock_picking as sp on po.id = sp.purchase_id left join stock_move as sm on sp.id = sm.picking_id where po.state != 'draft' and sp.type = 'in' and (pol.product_id = sm.product_id or sm.product_id is null) group by po.id, pol.product_id, sp.id, pol.product_qty, sm.product_qty, sm.product_uom, sm.id, sm.product_id, sm.date_expected, pol.price_unit
Đấy là em tạo ra đối tượng
Sau đó em vào kiểm tra trong sql thì không thấy bảng đó như hình bên dưới ạ, nhưng khi select em vẫn select được. Em không biết có phải do việc em drop view không anh nhỉ
tools.sql.drop_view_if_exists(cr, 'incoming_shipment_report'). Em cảm ơn anh
Em có một vấn đề nữa rất mong người có kình nghiệm như anh sẽ xem xét giúp em, module của em chạy ngon rồi, em copy package đó sang máy bạn em chạy thử thì bị báo lỗi dòng
from osv import fields,osv
import tools
Em xóa đi viết lại cũng không được, máy bạn em cài như máy em và chạy trước giờ vẫn ổn đinh, em xóa module đó ở máy em đi và dùng module vừa cop cho bạn em thì vẫn chay bình thường, em tạo một package khác trên máy bạn em thì cũng vẫn báo lỗi dòng
from osv import fields,osv
Bạn em đang dùng phần config extend của erp cũng như máy em rồi. Em rất mong nhận được ý kiến của anh, em cảm ơn anh.
Em xem cách người ta làm rồi bắt chước làm theo để tìm hiểu dần thôi ạ chứ có ai bảo đâu anh :D, lúc đầu em xem cái report người ta làm thì sẽ tạo một object và sau đó select những trường cần thiết để đưa vào trong đối tượng vừa tạo, em tưởng khi select những trường kia và quẳng vào trong incoming_shipment là được ạ, vì bên xml em vẫn sử dụng bảng incoming_shipment để lấy các dữ liệu của nó mà, em hiểu sai gì rồi đúng không anh :(
@Dũng,
1. Ai chỉ em (hoặc em search ở đâu) cách tạo báo cáo trong OpenERP như này vậy :)
2. Bảng mà em cần tìm sẽ là incoming_shipment_report
3. Trong câu truy vấn em select từ bảng purchase_order joint với bảng purchase_order_line, stock_picking và stock_move. Đâu có liên quan đến bảng mà em định tạo (incoming_shipment_report).
Phù, giờ em mới về đến nhà, em hiểu ý anh rồi, em sẽ chuyển hướng làm như anh bảo. À, lúc nãy em ngồi gõ code thì thấy có một vấn đề là em tạo một object là imcoming_shipment_report để tạo báo cáo, em chạy module được rồi, show lên được rồi, mối khi thêm mới purchase_order thì báo cáo cũng hiển thị rồi nhưng khi em vào sql thì không thấy bảng đó đâu, em kiểm tra rất kỹ rồi, nhưng khi em viết cấu select thì vẫn được, :(, anh cho em hỏi thế là làm sao ạ, am cảm ơnEm copy câu truy vấn lên đây anh xem nào.
Phù, giờ em mới về đến nhà, em hiểu ý anh rồi, em sẽ chuyển hướng làm như anh bảo. À, lúc nãy em ngồi gõ code thì thấy có một vấn đề là em tạo một object là imcoming_shipment_report để tạo báo cáo, em chạy module được rồi, show lên được rồi, mối khi thêm mới purchase_order thì báo cáo cũng hiển thị rồi nhưng khi em vào sql thì không thấy bảng đó đâu, em kiểm tra rất kỹ rồi, nhưng khi em viết cấu select thì vẫn được, :(, anh cho em hỏi thế là làm sao ạ, am cảm ơn
Em kiểm tra rồi anh ạ, bên sql em select thì nó vẫn trả về id nhưng không hiểu sao khi em đưa vào read chính xác bảng purchase order line thì nó lại trả về kiểu đó, em kiểm tra rất kỹ rồi anh, giống như khi em lấy thông tin trong bảng purchase order, lấy hết thông tin thì cái trường code nó cũng trả về kiểu kết hợp kia :(
Em chào các anh !!!Trên thực tế, chúng ta sẽ không insert trực tiếp dữ liệu vào bảng incomming_shipment. Thậm chí ngay trông phần mềm OpenERP mình cũng không nên làm thế. Việc này sẽ được tự động thực hiện thông qua workflow Mua hàng/Bán hàng. Nghĩa là khi em xác nhận một đơn hàng, nếu sản phẩm của em thuộc loại "Sản phẩm có thể lưu trữ" hoặc "Sản phẩm có thể tiêu thụ", hệ thống sẽ tự động tạo Incoming Shipment (nếu là Mua hàng) hoặc Delivery Order (nếu là Bán hàng).
Em có một vấn để muỗn xin ý kiển của các anh như sau ạ:
Mục đích của em là muốn insert hàng vào trong bảng incoming shipment, và trong bảng này thì nó nhận id của product để insert.
Do em không lường trước đươc trong workflow nó còn tác động đến nghiệp vụ nào nữa không? Chính vì thế nếu em chỉ đơn thuần insert dữ liệu vào bảng incoming_shipment thì rất có thể em bị thiếu một vài nghiệp vụ mà em không biết, những nghiệp vụ thiếu này sẽ ảnh hưởng đến khả năng phân tích, hoạch định và một số automated action của hệ thống.
Để giải quyết bài toán này của em, anh sẽ làm như sau: Website của em dùng xmlrpc để tạo purchase_order (tất nhiên phải có purchase_order_line). Sau đó thay vì tác động vào bảng incoming_shipment, website thông qua xmlrpc chạy workflow với button signal là "order_confirm". Việc còn lại thằng OpenERP sẽ tự xử thông qua workflow trên.
Việc gọi workflow trong OpenERP thông qua xmlrpc là cực kỳ đơn giản, tội gì ta không dùng.
exec_workflow (dbname, uid, pwd, 'purchase.order', 'order_confirm', purchase_order_id)
Sau đoạn code này, OpenERP nó sẽ làm tất cả các việc đã được định nghĩa trong workflow.
Em chào các anh !!!Về vấn đề này em có thể xem lại code hàm read của em. Vì như anh được biết trong bảng purchase_order_line có trường product_id. Hay em nhầm id của bảng (purchase_order_line) với product_id?
Em gặp vấn đề là khi bên website của em muỗn lấy ra id của sản phẩm(trong bảng purchase_order_line) của 1 purchase order nào đó thì nó không trả về id mà trả về kiểu gồm cả default_code + name .