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

Viết thêm phương thức ORM cho OpenERP

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

Em chào anh chị!!!
Hiện em đang là sinh viên và đang làm đồ án về ERP, em mới được biết về công ty của các anh và rất mong học hỏi được thêm nhiều kình nghiệm từ các anh. Đồ án em làm là phát triển một website nhỏ để thực hiện trao đổi dữ liệu với server ERP, hiện em đã hoàn thành việc đó nhưng có một vấn đề là tốc độ rất chậm. Em có tìm hiểu và biết được rằng nếu viết thêm phương thức ORM bên server để thực hiện mục đích của mình thì sẽ nhanh hơn rất nhiều, chằng hạn hiện tại em muốn xem thông tin của một Purchase Order nào đó thì trước tiên em phải chọc vào erp và lấy id của nó rồi sau đó mới dùng hàm read để lấy dữ liệu. Bây giờ em muốn viết thêm một hàm trong ORM như searchPO, hàm này làm nhiệm vụ lấy id và read đồng thời, lúc này sẽ tốc độ sẽ nhanh hơn. Em có thử viết một phương thức nhỏ ban đầu nhưng lỗi tùm lum. Em rất mong anh chị có thể cho em một vài gợi ý về việc này. Em vô cùng cảm ơn anh chị

Ảnh đại diện
Huỷ bỏ
11 Trả lời
0
Ảnh đại diện
Leo Tran
Best Answer
Em chào anh chị!!!
Hiện em đang là sinh viên và đang làm đồ án về ERP, em mới được biết về công ty của các anh và rất mong học hỏi được thêm nhiều kình nghiệm từ các anh. Đồ án em làm là phát triển một website nhỏ để thực hiện trao đổi dữ liệu với server ERP, hiện em đã hoàn thành việc đó nhưng có một vấn đề là tốc độ rất chậm. Em có tìm hiểu và biết được rằng nếu viết thêm phương thức ORM bên server để thực hiện mục đích của mình thì sẽ nhanh hơn rất nhiều, chằng hạn hiện tại em muốn xem thông tin của một Purchase Order nào đó thì trước tiên em phải chọc vào erp và lấy id của nó rồi sau đó mới dùng hàm read để lấy dữ liệu. Bây giờ em muốn viết thêm một hàm trong ORM như searchPO, hàm này làm nhiệm vụ lấy id và read đồng thời, lúc này sẽ tốc độ sẽ nhanh hơn. Em có thử viết một phương thức nhỏ ban đầu nhưng lỗi tùm lum. Em rất mong anh chị có thể cho em một vài gợi ý về việc này. Em vô cùng cảm ơn anh chị
Chúng ta đã biết hệ thống ORM của OpenERP là tương đối chuẩn (nếu không muốn nói là "chuẩn không cần chỉnh"). Nó đã được chứng minh thông qua web_client và gtk, xuyên suốt từ bản tiny cho đến bây giờ. Vì vậy, trên thực tế nếu như nó không gây lỗi (bug) hoặc vì một lý do đặc thù nhất định thì ta không nên can thiệp vào nó.

Trường hợp của em, nếu là nghiên cứu phục vụ mục đích học tập thì anh rất hoan nghênh, nhưng anh có comment như sau: để viết được hàm trong ORM, em phải hiểu được cấu trúc và nguyên tắc Mapping của OpenERP + kiến thức về python

Sau khi có được hàm searchPO rồi, việc gọi nó thì hết sức đơn giản, không khác gì việc em gọi hàm read, search, write,… Nếu phát sinh lỗi, nhiều khả năng nó nằm ở hamgf searchPO.
Ảnh đại diện
Huỷ bỏ
1
Ảnh đại diện
Vũ Thành Luân
Best Answer

Chào Vũ Đình Dũng,

Vấn đề của em, anh có một số ý kiến thế này,
Về cơ bản việc kết nối mỗi khi đọc dữ liệu từ OpenErp là không thể tránh khỏi, cách duy nhất để tránh quá nhiều kết nối là khi mình viết code thì hạn chế read từng ID mà truyền luôn một mảng ID để read một thể, giống như anh David Tran đã nói ở trên.

Với yêu cầu của em : truyền mã PO vào rồi lấy ra toàn bộ thông tin của nó :
Quy trình sẽ như sau :
B1 : search ID của mã PO đó
B2 : search POL tương ứng với ID của PO
B3 : Đọc nội dung từ mảng ID mà B2 trả về . Truyền luôn mảng ID và hàm Read rồi đọc
B4 : Show ra nội dung chi tiết.

Anh có xem qua đoạn code của em ở bên trên, công nhận thì cũng tương đối là khó nhìn :D
Và sao em phải viết một hàm để decode cái thông tin và OpenErp gửi về nhỉ , class xmlrpc của PHP nó hỗ trợ mình một hàm để decode cái thông tin đó rồi. (php_xmlrpc_decode)

Ảnh đại diện
Huỷ bỏ
1
Ảnh đại diện
Trần Ngọc Tuấn
Best Answer

Bạn truyền id vào read thì OK rồi, chậm làm sao được. Nếu bạn search ra nhiều ID thì lúc truyền vào read hãy truyền một mảng id để tránh kết nối lại.

Ngoài ra, nên hạn chế việc kết nối lại. Bạn cũng cần vacuum định kỳ cho PostgreSQL nếu bạn đang sử dụng phiên bản 8.4 trở về trước để tăng tốc độ truy vấn dữ liệu.
Bạn thử copy đoạn code của bạn lên mình xem thử xem sao.
FYI, https://www.erponline.vn/vi/pricing <== toàn bộ dữ liệu ở đây là lấy thông qua xmlrpc của OpenERP (giao thức https)

Ảnh đại diện
Huỷ bỏ
1
Ảnh đại diện
Trần Ngọc Tuấn
Best Answer

Cái này có lẽ do bạn sử dụng chưa đúng. Như bạn biết đấy, web client và gtk client của OpenERP đều sử dụng XML-RPC để làm việc với OpenERP server mà bạn thấy tốc độ có bị chậm đâu?
Về cơ bản, ORM là một lớp trung gian vô cùng quan trọng trong OpenERP Server, nó đã làm hết mọi việc để giúp cho Developers rồi.
Bạn có thể cho biết bạn sử dụng ngôn ngữ nào cho website không? có thể bên mình sẽ căn cứ vào đó làm thử đoạn code để test xem sao.

Ảnh đại diện
Huỷ bỏ
0
Ảnh đại diện
Leo Tran
Best Answer
Vâng, đúng như anh Leo nói, em thấy chọc vào cái ORM phức tạp kinh khủng. Em hiện tại chưa đủ trình độ để chạm vào nó :) Em sẽ nghiên cứu dần dần, từ lúc em tìm hiểu cái ERP này càng lúc càng thấy tiềm năng của nó lớn.sau này nếu em làm kinh doanh hoặc có người nhà làm kình doanh em cũng sẽ giới thiệu phần mềm này. Em còn phải tìm hiểu nhiều thứ nên rất mong được học hỏi thêm kinh nghiệm của các anh Cuối tháng 6 em lên chỗ anh Leo nhậu một bữa nhé, rất mong được gặp anh :)
Wellcome! gì chữ, khoản "nhậu" thì chắc anh tiếp được :">
Ảnh đại diện
Huỷ bỏ
0
Ảnh đại diện
vũ đình dũng
Best Answer

Vâng, đúng như anh Leo nói, em thấy chọc vào cái ORM phức tạp kinh khủng. Em hiện tại chưa đủ trình độ để chạm vào nó :) Em sẽ nghiên cứu dần dần, từ lúc em tìm hiểu cái ERP này càng lúc càng thấy tiềm năng của nó lớn.sau này nếu em làm kinh doanh hoặc có người nhà làm kình doanh em cũng sẽ giới thiệu phần mềm này. Em còn phải tìm hiểu nhiều thứ nên rất mong được học hỏi thêm kinh nghiệm của các anh Cuối tháng 6 em lên chỗ anh Leo nhậu một bữa nhé, rất mong được gặp anh :)

1 Bình luận
Ảnh đại diện
Huỷ bỏ
Ảnh đại diện
Trần Ngọc Tuấn
-

Cái này không chỉ dành cho dân kinh doanh đâu em nhé. Nó hướng đến các nhà quản lý và các nhà hoạch định doanh nghiệp hơn. Kinh doanh chỉ là một bộ phận trong cả một doanh nghiệp.

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

Em cũng làm như thế đó anh, nhưng cứ thấy chậm chậm. Em cũng đưa vào mảng id trả về, thực ra cái hàm để decode của em cũng là sử dụng cái decode của xmlrpc thôi anh, nhưng nếu dùng hàm decode của rpc thì vẫn còn cái key của nó đi cùng, kiểu [id]->12 em tách nốt cái key của nó ra và chỉ lấy cái value thuần thôi rồi đưa vào mảng, cái hàm valuesplit của em cũng na ná, em thấy lúc mà read nó trả về dữ liệu kiểu mảng 2 chiều nên em cũng dùng cái này để bóc tách dần và lấy cái value cuối cùng thôi. Em nghĩ em phải sửa lại cách tổ chức code thì sẽ nhanh hơn thôi, vì cách làm thì em cũng làm như cách anh nói rôi. Em viết lộn xộn quá :p . Em cảm ơn các anh rất nhiều

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

em đặt một cái time() khi bắt đầu chạy code, một cái time() cuối đoạn lệnh, đếm xem cho anh mất bao lâu nhé,
Khi nào tấm 1s thì ok

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

Em rất mong hướng dẫn từ anh . Em cảm ơn.

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

//fields của purchase order
$arr_po = array('partner_id','pricelist_id','partner_address_id','date_order');
//fields của purchase order line
$arr_pol = array('product_id','product_qty','product_uom','price_unit');
$po = search($client,'purchase.order','name','ilike',$_POST['PurchaseOrder']);
//idsplit là hàm em viết để decode những object trả về đê lấy mảng id
$read_po = read($client,'purchase.order',IdSplit($po),$arr_po);
//ValueSplit là hàm em viết để lấy riêng những giá trị trong mảng trả về đê show lên
//vì giá trị trả về sau khi decode là một mảng lồng nên em viết hàm này để tách giá trị
//trong cùng ra
//giả sử nó trả về
/*Array ( [0] => Array (
[purchase_id] => xmlrpcval Object ( [me] => Array ( [int] => 48 ) [mytype] => 1 [_php_class] => ) )
[1] => Array (
[origin] => xmlrpcval Object ( [me] => Array ( [string] => PO00040 ) [mytype] => 1 [_php_class] => ) )*/
//thì sau khi xử lý em lấy cái PO00040 thôi rồi đưa vào mảng
$val_po = ValueSplit(IdSplit($read_po),$arr_po);
$id_po = IdSplit($po);
$pol = search($client,'purchase.order.line','order_id','=',$id_po[0]);
$read_pol = read($client,'purchase.order.line',IdSplit($pol),$arr_pol);
$val = ValueSplit(IdSplit($read_pol),$arr_pol);
Code em tùm lum kiểu này ạ :(

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

Như lúc em nhập vào một mã purchase order, sau đó sẽ hiển thị thông tin thì trước tiên em search để lấy cái id của po đó, sau đó em search tiếp trong bảng purchase.order.line những trường có id = id của po đó vì 1 po có nhiều pol, sau khi lấy được hết id của pol thì em mới read tiếp, lúc này em mới show ra hoàn chỉnh thông tin purchase order được. Em thấy kết nối nhiều quá, chắc tại em làm sai cách. Em rất mong nhận được sự hướng dẫn của anh.

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

Em dùng php ạ

Ả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.