กระทู้เก่าบอร์ด อ.Yeadram
3,231 6
URL.หัวข้อ /
URL
ขอคำเสนอแนะครับ
ปัญหาคือผมต้องการเขียนโปรแกรมตรวจสอบการสั่งยาของแพทย์ ซึ้งจะตรวจว่าการสั่งใช้ยาในครั้งนี้(1 ใบสั่งยา)มีการสั่งคู่ยาใช้ยาที่ไม่ควรใช้ด้วยกันหรือไม่และเป็นการสั่งใช้ยาคู่ยาอะไร(เช่น ยา A ต้องไม่สั่งคู่กับยา B เพราะเมื่อกินพร้อมกันจะเกิดเหตุการณ์บางอย่างที่อันตรายได้) ผมจะเขียนโปรแกรมให้ตรวจสอบอย่างไร
ตอนนี้มีตารางการสั่งใช้ยา และตารางที่เก็บคู่ยาที่ไม่ควรใช้คู่กัน field1 ยาตัวที่ 1 field2 ยาตัวที่ 2 field3 รายละเอียดการเกิดอันตราย
ตอนนี้มีตารางการสั่งใช้ยา และตารางที่เก็บคู่ยาที่ไม่ควรใช้คู่กัน field1 ยาตัวที่ 1 field2 ยาตัวที่ 2 field3 รายละเอียดการเกิดอันตราย
6 Reply in this Topic. Dispaly 1 pages and you are on page number 1
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* ครับแต่เขียนคำสั่งไม่เป็น
ปล.การตรวจสอบนี้เป็นการตรวจสอบของห้องยาก่อนจ่ายยาให้ผู้ป่วยครับ (แพทย์สั่งยามาเสร็จแล้ว) ไม่ได้ตรวจสอบขณะสั่งใช้ยา
เช่น ตาราง 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 เพื่อแก้ปัญหานี้เป็นสิ่งไม่ถูกต้องครับ ต้องแก้ที่การออกแบบเทเบิล
มันผิดหลักการออกแบบฐานข้อมูลครับ มันทำให้เกิดความซ้ำซ้อนและต้องมานั่งจัดการความซ้ำซ้อนนี้ เพื่อให้ได้ข้อมูลที่ถูกต้อง เพราะถ้าคุณมี 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
ตารางการสั่งยา
ชือยา วิธีใช้ จำนวน
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
แต่ถ้าทำไม่ได้ เราก็ต้องมาทำบน 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 ยังงงๆ แต่พอดูภาพ ถึงบางอ้อ เลย ^_^
Time: 0.3617s
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 แทน ไม่งั้นก็จะตีว่าห้ามใช้
ต้องหมายเหตุเอาไว้ตรงนี้ว่า ถ้าคุณเอาคำแนะนำผมไปใช้แล้วทั้งในคำตอบนี้และคำตอบต่อๆไป(ถ้ามี) มันเป็นความรับผิดชอบของคุณแต่ผู้เดียวที่ต้องทดสอบว่ามันให้ผลลัพธ์ได้อย่างถูกต้องหรือไม่ หากเกิดคุณใช้แล้วมันให้ผลลัพธ์ที่ไม่ถูกต้อง เกิดอันตรายต่อชีวิตคนไข้แล้ว ผมไม่มีส่วนรับผิดชอบใดๆทั้งสิ้นนะครับ