MySQL Tip ! แปลง RichText ให้แยกเป็น column แบบ array ฟอร์มใบนัด
มีพี่เภสัชฯ ท่านหนึ่งถามมานานมากแล้ว ว่าจะทำยังไงให้ ข้อมูลที่เก็บแบบ text แต่ โปรแกรมบันทึกเป็นแบบ RichText เหมือน Notepad ที่มี การแยกบรรทัดไว้ เวลาเอามาใช้งาน แบบ text ละก็มันจะแสดงเป็นแนวยาว ตัดเป็น array ก็ไม่ได้ (หากจะเขียน sql เพียวๆ เลย)
วันนี้เลยได้โจทย์มาทำฟอร์มใบนัด A5 แต่ไม่อยากให้ออกแบบเหมือน OPDCARD เพราะจะซับซน เวลาแพทย์หรือพยาบาลเอาไปใช้งาน เลยต้องทำเป็นแนวตั้ง แต่พิมพ์แบบ แนวนอน งง ไหม (คือวางกระดาษเป็นแนวนอน A5 แต่ให้พิมพ์ออกมาเป็นตัวอักษรแนวตั้ง ) ดูภาพประกอบ
(เอาฐาน hosxp มาประกอบในโจทย์ นะครับ)
โดยฟิวล์ที่เก็บแบบ text หรือแบบ RichText ก็คือฟิวล์ note1 หรือที่ให้ติ๊กว่า “การปฏิบัติตัว” นั้นเอง เราจะมาแยกเป็น array กันดูว่าจะทำได้ไหมนะครับ
ฟิวล์ที่เก็บ ช่อง “การปฏิบัติตัว” คือฟิวล์ note1 เก็บข้อมูลแบบ RichText คือเก็บเป็นแถวๆ แล้วขึ้นบันทัดใหม่ไปเรื่อยๆ เหมือน array แต่เราจะมาแยกให้เป็น arrry แต่ละตัว เพื่อให้เอามาแสดงเป็น คอลัม ๆ เพื่อนำไปใช้งาน ให้ง่าย และสะดวกขึ้น
โค้ดแรกที่จะเอามาใช้งานคือ (ตรวจสอบเครื่อง ” ให้ถูกนะเวลาคัดลอกไปนะครับ)
select o.note1,
SUBSTRING_INDEX(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(o.note1, ‘\r’, ‘\\r’),’\n’,’\\n’),’n’,’.’),’r’,”),’\
\’,”),’.’,1)as dd1,
SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(o.note1, ‘\r’, ‘\\r’),’\n’,’\
\n’),’n’,’.’),’r’,”),’\\’,”),’.’,2),’.’,-1)as dd2,
SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(o.note1, ‘\r’, ‘\\r’),’\n’,’\
\n’),’n’,’.’),’r’,”),’\\’,”),’.’,3),’.’,-1)as dd3,
SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(o.note1, ‘\r’, ‘\\r’),’\n’,’\
\n’),’n’,’.’),’r’,”),’\\’,”),’.’,4),’.’,-1)as dd4,
SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(o.note1, ‘\r’, ‘\\r’),’\n’,’\
\n’),’n’,’.’),’r’,”),’\\’,”),’.’,5),’.’,-1)as dd5,
SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(o.note1, ‘\r’, ‘\\r’),’\n’,’\
\n’),’n’,’.’),’r’,”),’\\’,”),’.’,6),’.’,-1)as dd6,
SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(o.note1, ‘\r’, ‘\\r’),’\n’,’\
\n’),’n’,’.’),’r’,”),’\\’,”),’.’,7),’.’,-1)as dd7,
SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(o.note1, ‘\r’, ‘\\r’),’\n’,’\
\n’),’n’,’.’),’r’,”),’\\’,”),’.’,8),’.’,-1)as dd8,
SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(o.note1, ‘\r’, ‘\\r’),’\n’,’\
\n’),’n’,’.’),’r’,”),’\\’,”),’.’,9),’.’,-1)as dd9
from oapp o
where o.oapp_id=”942528″
สังเกตุจะมี 2 ฟังชัน คือ REPLACE กับ SUBSTRING_INDEX
REPLACE คือฟังชันสำหรับ แทนค่าตัวอักษร โดยค้นหา ว่ามีไหม ถ้ามีแล้วแทนค่าด้วยตัวอักษรอะไรก็ใส่เข้าไป กรณีนี้ ค้นหา ‘\r’ แทนค่าให้เป็น ‘\\r’
รูปแบบ คำสั่ง REPLACE
REPLACE(str, find_string, replace_with)
ส่วน SUBSTRING_INDEX คือ อ่านตัวอักษรว่ามีตัวคั่น หรือ ตัวอักษรที่จะให้อ่านก็ได้เช่น จุด(.) ตัวคั่น(,) แล้วระบุว่าจะแสดงตัวคั่นที่ตำแหน่งไหน
รูปแบบ คำสั่ง SUBSTRING_INDEX
SUBSTRING_INDEX(str, delim, count)
เวลารันและลองส่งออก Excel จะได้ตามรูปนี้ครับ
ก็จะได้ตัวแปรของแต่ละตัว แยกเป็น คอลัม ได้แล้ว ที่นี้ก็เอามาใช้งานได้เลย
ต่อมาก็เอาไปรวมกันกับโค้ดเดิมที่เคยทำไว้ ก็จะได้โค้ดยาวๆ ตัวนี้ครับ
select o.note1,
SUBSTRING_INDEX(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(o.note1, ‘\r’, ‘\\r’),’\n’,’\\n’),’n’,’.’),’r’,”),’\\’,”),’.’,1)as dd1,
SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(o.note1, ‘\r’, ‘\\r’),’\n’,’\\n’),’n’,’.’),’r’,”),’\\’,”),’.’,2),’.’,-1)as dd2,
SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(o.note1, ‘\r’, ‘\\r’),’\n’,’\\n’),’n’,’.’),’r’,”),’\\’,”),’.’,3),’.’,-1)as dd3,
SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(o.note1, ‘\r’, ‘\\r’),’\n’,’\\n’),’n’,’.’),’r’,”),’\\’,”),’.’,4),’.’,-1)as dd4,
SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(o.note1, ‘\r’, ‘\\r’),’\n’,’\\n’),’n’,’.’),’r’,”),’\\’,”),’.’,5),’.’,-1)as dd5,
SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(o.note1, ‘\r’, ‘\\r’),’\n’,’\\n’),’n’,’.’),’r’,”),’\\’,”),’.’,6),’.’,-1)as dd6,
SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(o.note1, ‘\r’, ‘\\r’),’\n’,’\\n’),’n’,’.’),’r’,”),’\\’,”),’.’,7),’.’,-1)as dd7,
SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(o.note1, ‘\r’, ‘\\r’),’\n’,’\\n’),’n’,’.’),’r’,”),’\\’,”),’.’,8),’.’,-1)as dd8,
SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(o.note1, ‘\r’, ‘\\r’),’\n’,’\\n’),’n’,’.’),’r’,”),’\\’,”),’.’,9),’.’,-1)as dd9,
(select l.sub_group_list from lab_app_head h left outer join lab_app_order o on o.lab_app_order_number = h.lab_app_order_number
left outer join lab_items l on l.lab_items_code=o.lab_items_code where h.oapp_id=o.oapp_id and l.sub_group_list is not null
group by l.sub_group_list limit 0,1)as lab_show1,
(select l.sub_group_list from lab_app_head h left outer join lab_app_order o on o.lab_app_order_number = h.lab_app_order_number
left outer join lab_items l on l.lab_items_code=o.lab_items_code where h.oapp_id=o.oapp_id and l.sub_group_list is not null
group by l.sub_group_list limit 1,1)as lab_show2,
(select l.sub_group_list from lab_app_head h left outer join lab_app_order o on o.lab_app_order_number = h.lab_app_order_number
left outer join lab_items l on l.lab_items_code=o.lab_items_code where h.oapp_id=o.oapp_id and l.sub_group_list is not null
group by l.sub_group_list limit 2,1)as lab_show3,
(select l.sub_group_list from lab_app_head h left outer join lab_app_order o on o.lab_app_order_number = h.lab_app_order_number
left outer join lab_items l on l.lab_items_code=o.lab_items_code where h.oapp_id=o.oapp_id and l.sub_group_list is not null
group by l.sub_group_list limit 3,1)as lab_show4,
(select l.sub_group_list from lab_app_head h left outer join lab_app_order o on o.lab_app_order_number = h.lab_app_order_number
left outer join lab_items l on l.lab_items_code=o.lab_items_code where h.oapp_id=o.oapp_id and l.sub_group_list is not null
group by l.sub_group_list limit 4,1)as lab_show5,
(select xi.xray_items_name from oapp_xray x
left outer join xray_items xi on xi.xray_items_code=x.xray_items_code
where x.oapp_id=o.oapp_id limit 0,1)as xray_show1,
(select xi.xray_items_name from oapp_xray x
left outer join xray_items xi on xi.xray_items_code=x.xray_items_code
where x.oapp_id=o.oapp_id limit 1,1)as xray_show2,
(select xi.xray_items_name from oapp_xray x
left outer join xray_items xi on xi.xray_items_code=x.xray_items_code
where x.oapp_id=o.oapp_id limit 2,1)as xray_show3
from oapp o
left outer join patient p on p.hn=o.hn
left outer join doctor d on d.code=o.doctor
left outer join clinic c on c.clinic=o.clinic
left outer join thaiaddress t1 on t1.addressid = concat(p.chwpart,”0000″)
left outer join thaiaddress t2 on t2.addressid = concat(p.chwpart,p.amppart,”00″)
left outer join thaiaddress t3 on t3.addressid = concat(p.chwpart,p.amppart,p.tmbpart)
left outer join nationality n on n.nationality=p.nationality
left outer join ovst ov on ov.vn=o.vn
left outer join opdscreen opds on opds.vn=o.vn
left outer join rx_doctor rx_d on rx_d.vn=o.vn
left outer join doctor d2 on d2.code=rx_d.doctor
left outer join pttype ptt on ptt.pttype=ov.pttype
left outer join kskdepartment ksk on ksk.depcode=o.depcode
where o.oapp_id=”967784″ group by o.oapp_id
เวลาคัดลอกไป ให้ตรวจสอบเครื่องหมาย ” ให้ดูดีๆ นะครับ เพราะอาจจะเพี้ยนได้
ก็จะได้ตามรูปนี้ เสร็จแล้วก็เอาไปออกแบบรายงานต่อไปได้เลย
ออกแบบแนวตั้ง แบบนี้ครับ
ดูเหมือนง่าย แต่เวลาเอาไปจับวางแล้วปรับ angle = 90 ด้วยนะ ไม่งั้นไม่ตั้ง ตามแนวแน่ๆ
เราจะใช้ dbtext นะครับแล้วคลิกขวา เลือกเมนู Position
ต่อมาก็มากำหนด
Angle = 90 องศา
ก็จะได้แนวตั้งตามต้องการแล้ว
ฟอร์มก็จะออกมาตามรูปนี้นะครับ
เวลาพิมพ์ออกมาให้วางกระดาษแนวเดียวกับ ฟอร์มใบ OPDCARD ห้องแพทย์ (กรณี้ใช้ A5 นะครับ) ก็จะใช้งานพร้อมกันกับฟอร์มห้องแพทย์ได้ คือรายงานจะพิมพ์ออกมาแบบกระดาษแนวนอน แต่พิมพ์ตัวอักษร เป็นแนวตั้ง ประมาณนี้นะครับ
มีท่านไหน ไม่เข้าใจ หรือสงสัย ก็ comment ลงใต้ blog นี้ก็ได้นะครับ ผมจะมาตอบให้ หรือจะ inbox มาที่ facebook ก็ได้นะครับ
ดาวโหลดฟอร์มรายงานตัวนี้ได้ เพื่อเอาไปศึกษาเป็นตัวอย่าง นะครับ
ดาวโหลดฟอร์ม FORM-Appointment-new.cds
หวังว่าจะเป็นประโยชน์กับเพื่อนๆ พี่ๆ น้องๆ นะครับ
แล้วพบกันใหม่ในบทความต่อไป ขอบคุณที่ติดตามครับ