How Can We Help?
使用 Openupgrade 升級至 Odoo 10.0 – 除錯篇
完成 使用 Openupgrade 升級至 Odoo 10.0 – 準備篇 後,開始著手升級除錯了
執行升級語法
cd /var/tmp/openupgrade/10.0/server && python migrate.py --config=/opt/openerp-server.conf --database=odoo_v10 --run-migrations=10.0
資料庫升級後,一定會有需要修正的地方,嚴重時甚至無法完成升級
我們可以通過查看 migration.log 分析
vim /var/tmp/openupgrade/migration.log
升級資料庫遇到的問題可分為兩類:可『預先處理』與『事後處理』
預先處理
需預先處理的問題,大多數都是資料庫內的資料有異常,建議事先修正,才不會升級後無法使用
1. 升級完畢後出現了錯誤訊息
/opt/OpenUpgrade/odoo/models.py:403: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode – interpreting them as being unequal
elif not all(cols[field.name][key] == vals[key] for key in vals):
根據此文件 https://github.com/odoo/odoo/commit/c0ec09e9d56485f3c6a24593bbc0240f54e433c3
需修改 addons/mrp/model/mrp_bom.py
sed -i 's/help="When a procurement/help=u"When a procurement/g' /var/tmp/openupgrade/10.0/server/addons/mrp/models/mrp_bom.py && sed -i 's/orders with different BoMs. /orders with different BoMs./g' /var/tmp/openupgrade/10.0/server/addons/mrp/models/mrp_bom.py
完成後再次執行升級語法即可
2. bad query: ALTER TABLE “res_country_state” ADD CONSTRAINT “res_country_state_name_code_uniq” unique(country_id, code)
2018-03-02 17:22:44,829 2194 INFO v10_migrated odoo.sql_db: bad query: ALTER TABLE "res_country_state" ADD CONSTRAINT "res_country_state_name_code_uniq" unique(country_id, code) 2018-03-02 17:22:44,829 2194 WARNING v10_migrated odoo.models.schema: Table 'res_country_state': unable to add constraint 'unique(country_id, code)'! If you want to have it, you should update the records and execute manually: ALTER TABLE "res_country_state" ADD CONSTRAINT "res_country_state_name_code_uniq" unique(country_id, code)
由於我們的州份中有完全重複的資料,因此在更新欄位屬性為唯一值時會報錯
ERROR: could not create unique index "res_country_state_name_code_uniq" DETAIL: Key (country_id, code)=(229, å) is duplicated.
較簡單的解決方法是將重複的資料全部刪除(有些需先到聯絡人中修改地址資訊)
在開發者模式下 銷售/設定/聯絡人/本地化/州份 將台灣的縣市全部刪除後在執行
ALTER TABLE "res_country_state" ADD CONSTRAINT "res_country_state_name_code_uniq" unique(country_id, code)
3. bad query: ALTER TABLE “product_uom” ADD CONSTRAINT “product_uom_rounding_gt_zero” CHECK (rounding>0)
2018-03-05 06:38:30,818 8686 INFO odoo10_migrated odoo.sql_db: bad query: ALTER TABLE "product_uom" ADD CONSTRAINT "product_uom_rounding_gt_zero" CHECK (rounding>0) 2018-03-05 06:38:30,819 8686 WARNING odoo10_migrated odoo.models.schema: Table 'product_uom': unable to add constraint 'CHECK (rounding>0)'! If you want to have it, you should update the records and execute manually: ALTER TABLE "product_uom" ADD CONSTRAINT "product_uom_rounding_gt_zero" CHECK (rounding>0)
我們系統中有幾個量度單位的 Rounding(捨入精度)為 0,但不能為 0,因此更新屬性時會報錯
ERROR: check constraint "product_uom_rounding_gt_zero" is violated by some row
在開發者模式下,設定使用者的權限,開啟管理次要單位即可編輯,完成後再次執行
ALTER TABLE "product_uom" ADD CONSTRAINT "product_uom_rounding_gt_zero" CHECK (rounding>0)
4. Table ‘procurement_rule’: unable to set a NOT NULL constraint on column ‘picking_type_id’ !
2018-03-05 06:45:17,784 8686 WARNING odoo10_migrated odoo.models.schema: Table ‘procurement_rule’: unable to set a NOT NULL constraint on column ‘picking_type_id’ !
If you want to have it, you should update the records and execute manually:
ALTER TABLE procurement_rule ALTER COLUMN picking_type_id SET NOT NULL
研究後發現 Procurement Rule 中,有些 Record 沒有對應的 Picking Type(通常都是用不到的 Rule),可考慮直接刪除
delete from procurement_rule where picking_type_id SET is NULL
再更新資料表
ALTER TABLE procurement_rule ALTER COLUMN picking_type_id SET NOT NULL
5. IOError: [Errno 2] 沒有此一檔案或目錄
2018-03-02 17:24:21,095 2194 INFO v10_migrated odoo.addons.base.ir.ir_attachment: _read_file reading /root/.local/share/Odoo/filestore/v10_migrated/c2/c23bc6c927cbfa495f06c1e875cc5ca1e700ae53
Traceback (most recent call last):
File “/var/tmp/openupgrade/10.0/server/odoo/addons/base/ir/ir_attachment.py”, line 100, in _file_read
r = open(full_path,’rb’).read().encode(‘base64′)
IOError: [Errno 2] 沒有此一檔案或目錄: u’/root/.local/share/Odoo/filestore/v10_migrated/c2/c23bc6c927cbfa495f06c1e875cc5ca1e700ae53’
這部分很奇妙,因為我們資料庫的 filestore 是存放在 /var/lib/odoo/filestore 之中
使用 SQL 查詢
select * from ir_attachment where store_fname = '/c2/c23bc6c927cbfa495f06c1e875cc5ca1e700ae53'
發現是 res.partner 中 Administrator 的 image,於是將伙伴 Administrator 的大頭照刪除即可
6. 交貨後 Sale Order Lines 不會顯示 delivered
Odoo 8.0 升級 9.0 時將 hr_expense_ok 改為 can_be_expense,並且多了 expense_policy 這個欄位(預設值為 cost)
在 9.0 並沒有找到可以修改 expense_policy 的地方
但在 Odoo 10 中,即使產品 can_be_expense 未啟用,但只要 expense_policy 設定為 cost 時就不會進行欄位同步
可以使用 SQL 語法檢查,發現全部產品都是這個情況
select * from product_template where expense_policy = 'cost' and can_be_expensed is not true
使用 SQL 將全部產品 expense_policy 修改 “no” 即可解決
update product_template SET expense_policy = 'no' where expense_policy = 'cost'
升級後處理
升級後處理的問題,都是升級資料庫後新增欄位,需進一步設定欄位屬性
1. ALTER TABLE “mrp_production” ALTER COLUMN “picking_type_id” SET NOT NULL
2018-03-05 06:45:17,511 8686 INFO odoo10_migrated odoo.sql_db: bad query: ALTER TABLE “mrp_production” ALTER COLUMN “picking_type_id” SET NOT NULL
2018-03-05 06:45:17,512 8686 WARNING odoo10_migrated odoo.models: WARNING: unable to set column picking_type_id of table mrp_production not null !
Try to re-run: openerp-server –update=module
If it doesn’t work, update records and execute manually:
ALTER TABLE mrp_production ALTER COLUMN picking_type_id SET NOT NULL
Traceback (most recent call last):
File “/opt/OpenUpgrade/odoo/models.py”, line 2576, in _auto_init
cr.execute(‘ALTER TABLE “%s” ALTER COLUMN “%s” SET NOT NULL’ % (self._table, name))
File “/opt/OpenUpgrade/odoo/sql_db.py”, line 154, in wrapper
return f(self, *args, **kwargs)
File “/opt/OpenUpgrade/odoo/sql_db.py”, line 231, in execute
res = self._obj.execute(query, params)
IntegrityError: column “picking_type_id” contains null values
Odoo 10 中,MO多了 Picking Operation 的欄位,所以需要先製作一個 Manufacture Picking Operation 才能修正
使用 SQL 修正工單
update mrp_production set picking_type_id = " ?????"
再更新資料表
ALTER TABLE mrp_production ALTER COLUMN picking_type_id SET NOT NULL
2. bad query: ALTER TABLE “mrp_subproduct” ALTER COLUMN “product_uom_id” SET NOT NULL
2018-03-05 06:46:15,999 8686 INFO odoo10_migrated odoo.sql_db: bad query: ALTER TABLE “mrp_subproduct” ALTER COLUMN “product_uom_id” SET NOT NULL
2018-03-05 06:46:16,000 8686 WARNING odoo10_migrated odoo.models: WARNING: unable to set column product_uom_id of table mrp_subproduct not null !
Try to re-run: openerp-server –update=module
If it doesn’t work, update records and execute manually:
ALTER TABLE mrp_subproduct ALTER COLUMN product_uom_id SET NOT NULL
Traceback (most recent call last):
File “/opt/OpenUpgrade/odoo/models.py”, line 2576, in _auto_init
cr.execute(‘ALTER TABLE “%s” ALTER COLUMN “%s” SET NOT NULL’ % (self._table, name))
File “/opt/OpenUpgrade/odoo/sql_db.py”, line 154, in wrapper
return f(self, *args, **kwargs)
File “/opt/OpenUpgrade/odoo/sql_db.py”, line 231, in execute
res = self._obj.execute(query, params)
IntegrityError: column “product_uom_id” contains null values
product_uom_id 也是 Odoo 10 新增的欄位,在我們的應用下可直接用 Unit(s) 來取代
update mrp_subproduct set product_uom_id = 1 where product_uom_id is NULL
再更新資料表
ALTER TABLE "mrp_subproduct" ALTER COLUMN "product_uom_id" SET NOT NULL
無法理解的警告訊息
2018-03-02 17:23:51,937 2194 WARNING v10_migrated odoo.models: ir.ui.menu.write() with unknown fields: parent 2018-03-02 17:24:15,117 2194 WARNING v10_migrated odoo.models: res.users.write() with unknown fields: alias_name
這兩個 field 在對應的的 models 與資料庫中的 Table 都找不到,先不理會
$billing = $thisOrder->getBillingAddress();
$TAXID = $billing->getVatId();
‘tax_id’=>new xmlrpcval($TAXID,”string”),
$paymentInfo = ‘Payment Information:- ‘.$paymentMethod;
改為
$paymentInfo = ‘付款方式:’.$paymentMethod.”\n”.’Magento 單號:’.$incrementId;
在
$region = urlencode($flatAddress->getRegion());
加上這兩行
$zip = $flatAddress->getPostcode();
$street = $zip.” “.$city.$street;
MOB
已測試功能
測試過功能,正常無誤
統編模組
已測試功能
- 自動同步 Tax_id 與 note 至 Invoice
- Clear 按鈕運作正常
- 檢查統編是否正確(SO 與 Accounting 皆正常)
MIS Report
已測試功能
- 報表正常顯示
CEWOLF_INV_GUI
已測試功能
- 【鯨躍發票】:匯出、匯入
invoice 匯入、匯出
已測試功能
1.【鯨躍發票】:匯出、匯入
貨運單匯入、匯出
已測試功能
1.【貨運資料】:匯出、匯入
update ir_model_data set noupdate = false where noupdate is true and id = 5401;
update ir_model_data set noupdate = false where noupdate is true and id = 5930;
update ir_model_data set noupdate = false where noupdate is true and id = 2840;
update ir_model_data set noupdate = false where noupdate is true and id = 38335;
ALTER TABLE mrp_production ALTER COLUMN picking_type_id SET NOT NULL
ALTER TABLE mrp_production ALTER COLUMN picking_type_id SET NOT NULL
2018-06-28 14:52:21,298 23698 INFO open_migrated odoo.addons.base.ir.ir_ui_view: Field `name` does not exist
Error context:
View `mrp.bom.tree`
[view_id: 1964, xml_id: n/a, model: mrp.bom, parent_id: n/a]
2018-06-28 14:52:21,299 23698 WARNING open_migrated odoo.modules.loading: invalid custom view(s) for model mrp.bom: Field `name` does not exist
Error context:
View `mrp.bom.tree`
[view_id: 1964, xml_id: n/a, model: mrp.bom, parent_id: n/a]
2018-06-28 14:52:21,607 23698 INFO open_migrated odoo.addons.base.ir.ir_ui_view: Field `journal_id` does not exist
Error context:
View `account.analytic.line.tree`
[view_id: 422, xml_id: n/a, model: account.analytic.line, parent_id: n/a]
2018-06-28 14:52:21,607 23698 WARNING open_migrated odoo.modules.loading: invalid custom view(s) for model account.analytic.line: Field `journal_id` does not exist
Error context:
View `account.analytic.line.tree`
[view_id: 422, xml_id: n/a, model: account.analytic.line, parent_id: n/a]