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ị
11 Trả lời
Em chào 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ó.
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ị
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.
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)
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)
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.
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 :">
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 :)
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
//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ư 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.