1. ประเภทของ Search ใน Odoo
Odoo มีระบบค้นหาหลักๆ อยู่ 3 รูปแบบ ได้แก่:
- Basic Search: ค้นหาข้อความในฟิลด์ที่ตั้งค่า searchable เช่นชื่อสินค้า, รหัสลูกค้า, หมายเลขใบสั่ง เป็นต้น
- Advanced Search (Filters & Group by): เลือกเงื่อนไขการค้นหาและจัดกลุ่มข้อมูล เช่น เลือกเฉพาะใบสั่งที่ “อยู่ในสถานะ Draft”
- Custom Search Domains: การใช้ Domain Expressions เพื่อสร้างเงื่อนไขค้นหาแบบกำหนดเอง เช่น ['|', ('name', 'ilike', 'ABC'), ('phone', '=', '123456')]
Odoo ใช้ search_view เป็นตัวควบคุมโครงสร้างของหน้า Search View ซึ่งสามารถปรับแต่งได้ผ่าน XML:
โค้ด: เลือกทั้งหมด
<record id="view_partner_search_custom" model="ir.ui.view">
<field name="name">res.partner.search.custom</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_res_partner_filter"/>
<field name="arch" type="xml">
<xpath expr="//filter[@name='customer']" position="after">
<filter name="vip" string="VIP Customers" domain="[('is_vip','=',True)]"/>
</xpath>
<xpath expr="//search" position="inside">
<field name="phone"/>
<field name="email"/>
</xpath>
</field>
</record>
- เพิ่ม Filter เฉพาะกลุ่มลูกค้า VIP
- ค้นหาโดยใช้เบอร์โทรศัพท์หรืออีเมลได้โดยตรง
โดยปกติ ฟิลด์ใน Odoo จะไม่สามารถค้นหาได้ทันที เว้นแต่มีการกำหนด searchable หรือ index ดังนั้นหากต้องการเพิ่มฟิลด์ใหม่ให้ค้นหาได้ ต้องแก้ไขใน Python Model:
โค้ด: เลือกทั้งหมด
class ResPartner(models.Model):
_inherit = 'res.partner'
is_vip = fields.Boolean(string="VIP")
card_id = fields.Char(string="Card ID", index=True)
4. การใช้ Custom Search Function (Override name_search)
ในบางกรณี ผู้ใช้ต้องการให้สามารถค้นหาข้อมูลจากหลายฟิลด์พร้อมกัน เช่น ต้องการค้นหาลูกค้าจากชื่อ เบอร์โทร หรือรหัสบัตรประจำตัว
สามารถ override ฟังก์ชัน name_search ได้ดังนี้:
โค้ด: เลือกทั้งหมด
def name_search(self, name, args=None, operator='ilike', limit=100):
args = args or []
if name:
args += ['|', '|',
('name', operator, name),
('phone', operator, name),
('card_id', operator, name)]
return self.search(args, limit=limit).name_get()
- ผู้ใช้สามารถกรอกอะไรก็ได้ (ชื่อ/เบอร์/รหัส) แล้วค้นหาเจอเลยในช่องเดียว
- เพิ่มความสะดวกในการใช้งานระบบสำหรับทีมขายหรือแอดมิน
สำหรับช่อง Many2one หรือ Selection field สามารถเพิ่ม Suggestion ขณะพิมพ์เพื่อช่วยให้ผู้ใช้เลือกข้อมูลได้ง่ายขึ้น โดยใช้ name_get() และ name_search() ที่ปรับแต่งให้แสดงผลลัพธ์ตามที่ต้องการ เช่น:
โค้ด: เลือกทั้งหมด
def name_get(self):
result = []
for rec in self:
name = f"{rec.name} [{rec.card_id}]" if rec.card_id else rec.name
result.append((rec.id, name))
return result
สำหรับระบบที่ต้องการค้นหาข้อมูลขนาดใหญ่หรือข้อความยาว เช่น รายละเอียดสินค้า หรือโน้ตคำอธิบาย สามารถใช้ PostgreSQL Full-Text Search โดยใช้โมดูลเสริม หรือปรับแต่ง SQL Query
เช่น ใช้คำสั่ง unaccent + to_tsvector สำหรับรองรับภาษาต่างๆ เช่น ไทย อังกฤษ:
โค้ด: เลือกทั้งหมด
SELECT * FROM product_template
WHERE to_tsvector('simple', unaccent(name)) @@ plainto_tsquery('simple', 'printer')
กรณีศึกษา 1: ร้านค้าปลีก
ร้านค้าต้องการค้นหาสินค้าจากชื่อ รหัสบาร์โค้ด หรือหมวดหมู่
- ใช้ name_search รวมหลายฟิลด์
- ปรับ Search View เพิ่ม Filter หมวดหมู่
กรณีศึกษา 2: ธุรกิจบริการลูกค้า
เจ้าหน้าที่ call center ต้องค้นหาลูกค้าจากชื่อ เบอร์โทร หรือรหัสบัตร
- ปรับ name_get และ name_search ให้รองรับหลายรูปแบบ
- เพิ่ม index บนฟิลด์สำคัญ เช่น phone, card_id เพื่อเพิ่มความเร็ว
กรณีศึกษา 3: บริษัทที่มีข้อมูลจำนวนมาก
ฝ่ายบัญชีต้องการค้นหาใบแจ้งหนี้ที่มีหมายเหตุเฉพาะ
- ใช้ Full-text search สำหรับค้นหาในฟิลด์ note
- กำหนด filter เฉพาะบน field note
สรุป
การปรับแต่งระบบค้นหา (Search) ใน Odoo เป็นอีกหนึ่งแนวทางสำคัญที่ช่วยเพิ่มประสิทธิภาพในการใช้งานระบบ ERP โดยเฉพาะในองค์กรที่มีข้อมูลหลากหลายหรือมีความซับซ้อน การใช้ฟีเจอร์อย่าง search_view, การปรับแต่ง name_search, และการใช้ Full-text Search ช่วยให้ผู้ใช้สามารถค้นหาข้อมูลได้หลายรูปแบบ ตรงจุด และรวดเร็ว, นอกจากจะช่วยลดเวลาในการทำงานแล้ว ยังส่งผลให้การบริการลูกค้า การบริหารจัดการภายใน และการวิเคราะห์ข้อมูลมีประสิทธิภาพมากยิ่งขึ้น ทั้งนี้ ควรเลือกวิธีปรับแต่งให้เหมาะกับลักษณะข้อมูลและความต้องการของผู้ใช้งานในแต่ละองค์กร เพื่อให้ได้ผลลัพธ์สูงสุดจากระบบค้นหาของ Odoo
อ้างอิง
https://www.cybrosys.com/blog/how-to-create-name-search-function-in-odoo-17
https://www.cybrosys.com/blog/configure-search-view-and-filters-and-group-by-in-odoo-15
https://www.cybrosys.com/blog/how-to-add-filters-to-existing-search-view-in-odoo