ขอคำเสนอแนะครับ
กระทู้เก่าบอร์ด อ.Yeadram

 3,183   6
URL.หัวข้อ / URL
ขอคำเสนอแนะครับ

ปัญหาคือผมต้องการเขียนโปรแกรมตรวจสอบการสั่งยาของแพทย์ ซึ้งจะตรวจว่าการสั่งใช้ยาในครั้งนี้(1 ใบสั่งยา)มีการสั่งคู่ยาใช้ยาที่ไม่ควรใช้ด้วยกันหรือไม่และเป็นการสั่งใช้ยาคู่ยาอะไร(เช่น ยา A ต้องไม่สั่งคู่กับยา B เพราะเมื่อกินพร้อมกันจะเกิดเหตุการณ์บางอย่างที่อันตรายได้) ผมจะเขียนโปรแกรมให้ตรวจสอบอย่างไร
ตอนนี้มีตารางการสั่งใช้ยา และตารางที่เก็บคู่ยาที่ไม่ควรใช้คู่กัน field1 ยาตัวที่ 1 field2 ยาตัวที่ 2 field3 รายละเอียดการเกิดอันตราย

6 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R18965
คุณก็ใช้คำสั่ง SQL statement เพื่อเช็คก็ได้ สมมุติตาราง A คือ ตารางสั่งยา มีฟิลด์ชื่อ a1 เก็บรหัสยาที่สั่งให้คนไข้   และตาราง P คือตารางคู่ยา มีฟิลด์ p1, p2 เป็นยาตัวที่ 1 และ 2

SELECT P.* FROM A AS A_2 INNER JOIN (A AS A_1 INNER JOIN P ON A_1.a1 = P.p1) ON A_2.a1 = P.p2;

ผลลัพธ์ที่ได้คือรหัสยาตัวที่ 1,2,อันตรายที่เกิดขึ้น

แต่ถ้าต้องการว่า ป้อนรหัสยาปั๊ป ให้เช็คทันที คุณก็ต้องวนลูปเช็คระหว่างรหัสยาที่กำลังป้อนกับเรคอร์ดอื่นที่ได้ป้อนไปแล้วใน A แทนครับ

SELECT P.* FROM P WHERE P.p1 = "รหัสยาที่กำลังป้อน" AND P.p2 = "รหัสยาในเรคอร์ดอื่นๆ"

แต่ให้ระวังว่า หมอป้อนไปแล้ว 3 รายการ มียา Pa, Pb, Pc   สมมุติยา Pe กับ Pb ห้ามใช้ร่วมกัน แล้วหมอกลับมาแก้รายการที่ 2 เป็น Pe   เวลาเช็คต้องข้าม Pb ไปนะครับ เพราะกำลังแก้เป็น Pe ต้องเช็ค Pe แทน ไม่งั้นก็จะตีว่าห้ามใช้

ต้องหมายเหตุเอาไว้ตรงนี้ว่า ถ้าคุณเอาคำแนะนำผมไปใช้แล้วทั้งในคำตอบนี้และคำตอบต่อๆไป(ถ้ามี) มันเป็นความรับผิดชอบของคุณแต่ผู้เดียวที่ต้องทดสอบว่ามันให้ผลลัพธ์ได้อย่างถูกต้องหรือไม่ หากเกิดคุณใช้แล้วมันให้ผลลัพธ์ที่ไม่ถูกต้อง เกิดอันตรายต่อชีวิตคนไข้แล้ว ผมไม่มีส่วนรับผิดชอบใดๆทั้งสิ้นนะครับ
2 @R18968
คำถามต่อมาครับ เวลาตรวจสอบคู่ยาที่มีการสั่งใช้ร่วมกัน ไม่ได้ตรวจสอบจากรหัสยาครับอาจารย์ แต่ตรวจจากชื่อสามัญทางยา เช่น
เช่น ตาราง P มีคู่ายาที่ห้ามสั่งคู่กัน คือ a1=Simvastatin a2=Gemfibrozil
ปัญหาก็๋คือ ในชื่อยา 1 ชนิดจะมีหลายความแรง หลายรูปแบบ(ยาเม็๋ด ยาน้ำ ยาฉีด) เวลาแพทย์สั่งใช้ยาจะมีชื่อยาที่มีความแรงด้วย เช่น simvastatin 10 mg หรือ 20 mg หรือ 40 mg ซึ่งเวลาตรวจสอบผมสนใจแต่ชื่อสามัญทางยา(Generic name)เท่านั้น คือ simvastatin ที่สั่งใช้คู่กับ Gemfibrozil เท่านั้น ไม่สนใจขนาด หรือรูปแบบ แล้วจะทำอย่างไรครับ เพราะไม่อย่างนั้น ตาราง P ก็ต้องจับคู่ดังนี้
simvastatin 10 mg,Gemfibrozil 300 mg
simvastatin 20 mg ,Gemfibrozil 300 mg
simvastatin 40 mg,Gemfibrozil 300 mg

มันเยอะมากครับ ผมอยากให้ใช้ประมาณว่า A.ชื่อยา like P.name* ครับแต่เขียนคำสั่งไม่เป็น
ปล.การตรวจสอบนี้เป็นการตรวจสอบของห้องยาก่อนจ่ายยาให้ผู้ป่วยครับ (แพทย์สั่งยามาเสร็จแล้ว) ไม่ได้ตรวจสอบขณะสั่งใช้ยา
3 @R18982
ในเมื่อไม่สนใจขนาดหรือรูปแบบยา แล้วจะป้อนมันเข้าไปทำไมครับ ทำไมไม่ป้อน simvastatin ,Gemfibrozil เพียงแค่นี้ !!!

มันผิดหลักการออกแบบฐานข้อมูลครับ มันทำให้เกิดความซ้ำซ้อนและต้องมานั่งจัดการความซ้ำซ้อนนี้ เพื่อให้ได้ข้อมูลที่ถูกต้อง เพราะถ้าคุณมี simvastatin ขนาดหรือรูปแบบยาตัวใหม่มา 1 ตัว คุณต้องมาจับคู่กับ Gemfibrozil 300 mg อีกที แล้วถ้า Gemfibrozil มีมากกว่า 1 ขนาดหล่ะ มันจะกลายเป็น   n รูปแบบคูณ m รูปแบบ(เรคอร์ด)ที่คุณต้องป้อน แทนที่จะป้อนแค่รูปแบบ(เรคอร์ด)เดียว ใครจะมานั่งจัดการตรงนี้ ถ้าเกิดหลุดลืมจับคู่ไปแม้แต่ 1 คู่ อันตรายกับคนไข้ครับ

จริงๆแล้ว ยังไงมันก็ควรมีรหัสอะไรก็ได้เพิ่มมาอีกฟิลด์ลงในเทเบิลของยา เพื่อบอกว่า trade name, dose, รูปแบบทั้งหลายแหล่นั้นเป็นยาตัวเดียวกัน อาจใช้ชื่อ generic name ก็ได้ครับ แล้วเอา generic name นี่แหล่ะมาจับคู่ การใช้ Like operator เพื่อแก้ปัญหานี้เป็นสิ่งไม่ถูกต้องครับ ต้องแก้ที่การออกแบบเทเบิล
4 @R18985
นี่แหละครับคือคำถามว่าจะทำอย่างไรดี คือโปรแกรมนี้เขาเขียนไว้เสร็จเรียบร้อยแล้วใช้ฐานข้อมูล mysql ผมแก้ไขโครงสร้างตารางอะไรคงไม่ได้ แต่ผมต้องการเขียน โปรแกรมเพิ่มโดย MS Access เชื่อมต่อผ่าน ODBC เพื่อตรวจสอบความถูกต้องของการสั่งยาของแพทย์ก่อนจ่ายให้ผู้ป่วย โดยการสร้างตารางใน Access เพิ่มเพื่อเก็บข้อมูลคู่ยาที่ห้ามใช้ร่วมกัน(Drug interaction) แล้วไปตรวจสอบกับตารางการสั่งยา ใน mysql อีกทีหนึ่ง เพื่อให้เข้าใจง่ายขึ้นผมขอยกตัวอย่าง ดังนี้

ตารางการสั่งยา
    ชือยา                                           วิธีใช้                            จำนวน
Amoxycillin 500 mg                   1x3 pc                               20
Gemfibrozil   300 mg                 2x2 ac                             120
Paracetamol 500 mg                 1xprn                                20
Simvastatin   10 mg                   1xhs                                 30       
Alum milk    120 ml                    2x3 pc                             1
Norfloxacin 400 mg                   1x2 pc                               10

ตารางคู่ยาที่ห้ามใช้คู่กัน
ยา1                                           ยา2                             คำอธิบาย
Simvastatin                           Gemfibrozil            เพิ่ม Rhabdomyolysis
Alum milk                             Norfloxacin             ลด Absorbtion
Warfarin                                Clopidogrel              เพิ่ม Bleeding

ทำอย่างไรจึงจะตรวจสอบแล้วให้ได้ผลดังนี้
1.msgbox หรือข้อความใน Textbox บอกว่า มีการสั่งยาเกิด Drug interaction
2.เมื่อกดปุ่มดูรายละเอียด ให้รายงานผลว่า ยาที่เกิด Drug interaction คือ
   คู่ที่ 1simvastatin-Gemfibrozil ผล เพิ่ม Rhabdomyolysis
   คู่ที่ 2 Alum milk-Norfloxacin ผล ลด Absorbtion
5 @R18987
คนเดิมออกแบบมา แต่เราก็เพิ่มฟิลด์ Generic Name พร้อมสร้าง Index ของฟิลด์นี้ลงในเทเบิลบน MySQL ได้ไม่ใช่เหรอครับ ไม่น่ามีผลต่อโปรแกรมเดิม เพราะเราไม่ได้ไปลบหรือเปลี่ยนแปลงฟิลด์อื่นๆ แต่ยังไงก็ตามก็ต้องมีการแก้หน้าจอ Master ของเดิมที่ป้อน "Alum milk    120 ml" เพื่อให้ป้อน Generic Name ที่เพิ่มนี้เข้าไปด้วย และต้องกำหนดด้วยว่าเป็นฟิลด์ที่ต้องป้อนข้อมูล ตารางคู่ยาก็เหมือนกัน ทำใน MySQL ก็ได้

แต่ถ้าทำไม่ได้ เราก็ต้องมาทำบน Access เอง คือสร้างเทเบิล M (Mapping) บน Access ให้มี 2 ฟิลด์ ฟิลด์ m1 ป้อนทุกอย่างให้เหมือนชื่อยาในตารางสั่งยา ไม่ว่าจะชื่อยา ขนาด หรืออะไรอื่นๆอีก จำนวนช่องว่างก็ต้องให้เหมือนๆกันด้วย ส่วนอีกฟิลด์ m2 ก็ป้อนเฉพาะชื่อ Generic Name ดังนั้นเทเบิลนี้ก็จะทำตัวเป็นตัวเชื่อมนั่นเอง แต่ก็ต้องแลกมาด้วยความซ้ำซ้อนของขื่อยา และคุณต้องมีอะไรที่คอยจัดการ ให้ดี เช่น มีชื่อยาเพิ่มหรือเปลี่ยน คุณก็ต้องมาปรับปรุงข้อมูลใน M ให้ถูกต้องเป็นปัจจุบันด้วย ตรงนี้แหล่ะ ผมว่ามันจะหลุดไปได้

อีกเทเบิลก็คือเทเบิล D (Drug Interaction) มี 3 ฟิลด์คือ d1,d2 เป็น Generic Name และ d3 เป็นผลของยา

สมมุติตามเดิมว่าตาราง A คือ ตารางสั่งยา มีฟิลด์ชื่อ a1 เก็บรหัสยาที่สั่งให้คนไข้ และ a2 เก็บเลขที่ใบสั่งยา

สมมุติว่าคุณตรวจสอบเมื่อกดปุ่มที่ชื่อว่า btnCheck โค้ดก็เป็นอย่างนี้

Private Sub btnCheck_Click()
    Dim DB As DAO.Database
    Dim RS As DAO.Recordset
    Dim SQL As String
    Dim MSG As String
    Dim N   As Integer
    
    SQL = "select D.d1, D.d2, D.d3 from (((A as A1 inner join M as M1 on A1.a1 = M1.m1) " _
                                         + "inner join D on M1.m2 = D.d1) " _
                                         + "inner join M as M2 on D.d2 = M2.m2) " _
                                         + "inner join A as A2 on M2.m1 = A2.a1 " _
                                         + "where (A1.a2 = เลขที่ใบสั่งยา) And (A2.a2 = เลขที่ใบสั่งยา) "

    Set DB = CurrentDb
    Set RS = DB.OpenRecordset(SQL)
    Do Until RS.EOF
        If MSG = "" Then
            MSG = "ยาที่เกิด Interaction คือ " + vbCrLf + vbCrLf
        End If
       
        N = N + 1
        MSG = MSG + CStr(N) + ". " + RS!d1 + " - " + RS!d2 + " ผล " + RS!d3 + vbCrLf
        RS.MoveNext
    Loop
       
    RS.Close: Set RS = Nothing
    
    If MSG <> "" Then
        MsgBox MSG
        ...
        ตรงนี้จะให้ทำอะไรต่อเมื่อมีผลของคู่ย่เกิดขึ้น คุณก็สั่งต่อไป
        ...
    End If
End Sub

ภาพแสดงการเชื่อมกันของเทเบิลจนออกมาเป็นตัว SQL

6 @R18988
อ๋อ!! เป็นอย่างนี้นี่เอง เข้าใจแล้วครับ ขอบคุณอาจารย์สันติสุขอย่างยิ่งครับ ที่แรกตอนอ่าน SQL ยังงงๆ แต่พอดูภาพ ถึงบางอ้อ เลย ^_^
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2815s