Hỏi Đáp

Welcome!

This community is for professionals and enthusiasts of our products and services.
Share and discuss the best content and new marketing ideas, build your professional profile and become a better marketer together.

0

Cách lấy chính xác id sản phẩm trong bảng purchase_order_line qua XMLRPC

Ảnh đại diện
vũ đình dũng

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.

Ảnh đại diện
Huỷ bỏ
11 Trả lời
1
Ảnh đại diện
vũ đình dũng
Best Answer
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

Cách lấy chính xác id sản phẩm

Ảnh đại diện
Huỷ bỏ
1
Ảnh đại diện
vũ đình dũng
Best Answer

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.

1 Bình luận
Ảnh đại diện
Huỷ bỏ
Ảnh đại diện
ViindooBot
-

Nếu chỉ dựa vào những thông tin em cung cấp anh rất khó xác định lỗi này. Em thử xem lại đường dẫn file osv trên máy em và máy bạn em có giống nhau không? Nếu giống nhau thì hơi khó bug, trừ khi a trực tiếp thao tác và nhìn thấy lỗi đấy. :D

0
Ảnh đại diện
vũ đình dũng
Best Answer

Vâng ạ

Ảnh đại diện
Huỷ bỏ
0
Ảnh đại diện
Leo Tran
Best Answer

Em tạo một topic mới liên quan đến report trong OpenERP đi, anh sẽ trao đổi cụ thể với em, từ cấu trúc, nguyên tắc hoạt động của report trong OpenERP.

Ảnh đại diện
Huỷ bỏ
0
Ảnh đại diện
vũ đình dũng
Best Answer

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 :(

Ảnh đại diện
Huỷ bỏ
0
Ảnh đại diện
Leo Tran
Best Answer

@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).

Ảnh đại diện
Huỷ bỏ
0
Ảnh đại diện
Leo Tran
Best Answer
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 copy câu truy vấn lên đây anh xem nào.
Ảnh đại diện
Huỷ bỏ
0
Ảnh đại diện
vũ đình dũng
Best Answer

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

Ảnh đại diện
Huỷ bỏ
0
Ảnh đại diện
vũ đình dũng
Best Answer

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 :(

1 Bình luận
Ảnh đại diện
Huỷ bỏ
Ảnh đại diện
ViindooBot
-

Em show code read của em lên đây anh xem nào

0
Ảnh đại diện
Leo Tran
Best Answer
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.
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).
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.
Ảnh đại diện
Huỷ bỏ
0
Ảnh đại diện
Leo Tran
Best Answer
Em chào các anh !!!
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 .
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?
Ảnh đại diện
Huỷ bỏ

Trả lời của Bạn

Vui lòng đảm bảo câu trả lời của bạn có liên quan và giải đáp đúng nội dung câu hỏi. Nếu muốn bình luận về câu hỏi hoặc câu trả lời, hãy sử dụng công cụ Bình luận. Lưu ý, bạn có thể thay đổi nội dung trả lời thay vì trả lời lại 02 lần cho cùng một câu hỏi. Đồng thời bạn có thể nhấn nút để bầu chọn câu hỏi / câu trả lời tốt nhất.