BMS-HOSxP Community
HOSxP => แจ้งปัญหา / ขอความช่วยเหลือ => ข้อความที่เริ่มโดย: tote ที่ พฤษภาคม 15, 2008, 12:18:13 PM
-
version 3.51.4.17
ดูเหมือนโปรแกรมจะคำนวณจำนวนยาเป็นเลขจำนวนเต็ม ตัดเศษทิ้ง ก่อนที่จำเอาจำนวนเม็ดต่อวัน ไปคูณกับจำนวนวัน
0.5 x 1 = 0.5 -> วันละ 0 เม็ด x 30 วัน = 0
0.5 x 2 = 1 -> วันละ 1 เม็ด x 30 วัน = 30
0.5 x 3 = 1.5 -> วันละ 1 เม็ด x 30 วัน = 30
0.5 x 5 = 2.5 -> วันละ 2 เม็ด x 30 วัน = 60
จำนวนยาต่อวัน น่าจะคิดเป็น real number (double) นะครับ
แล้วหลังจากคูณจำนวนวันแล้ว ค่อยแปลงเป็นเลขจำนวนเต็มทีหลัง
และน่าจะปัดเศษขึ้นเสมอ
ขอเสนอเพิ่มเติม
ยา syrup น่าจะคำนวนเป็น cc ได้
จำนวนยา = ceil ( ปริมาณยาต่อวันเป็น cc x จำนวนวัน / ปริมาณยาในแต่ละขวดเป็น cc )
ยาเม็ดที่สั่งเป็นแผงก็น่าจะทำแบบเดียวกันได้
จำนวนยา = ceil ( จำนวนเม็ดต่อวัน x จำนวนวัน / จำนวนเม็ดต่อแผง )
-
ขอบคุณที่ช่วยตรวจสอบและให้คำแนะนำครับ ทำการแก้ไขให้แล้วใน 3.51.5.24 ครับ
-
ขอบคุณครับอาจารย์ แต่มันยังมีปัญหาอยู่ครับ
ผมทดสอบ version 3.51.5.28 กับ 3.51.7.2 พบว่า
คราวนี้มันไม่ใช้แค่คำนวณแบบวันละครึ่งเม็ดไม่ได้ วันละเต็มเม็ดมันก็คำนวณไม่ได้ด้วย
เวลาพิมพ์เลขเข้าไปใน column วัน แล้วตัวเลขใน column จำนวน มันไม่เปลี่ยนตามเลยครับ
-
ขอบคุณครับอาจารย์ แต่มันยังมีปัญหาอยู่ครับ
ผมทดสอบ version 3.51.5.28 กับ 3.51.7.2 พบว่า
คราวนี้มันไม่ใช้แค่คำนวณแบบวันละครึ่งเม็ดไม่ได้ วันละเต็มเม็ดมันก็คำนวณไม่ได้ด้วย
เวลาพิมพ์เลขเข้าไปใน column วัน แล้วตัวเลขใน column จำนวน มันไม่เปลี่ยนตามเลยครับ
ผมก็คำนวณไม่ได้เหมือนกันครับ 3.51.7.2
รออาจารย์ตอบเรื่องการปรับปรุง special usage + คำนวณจำนวณตามวันที่ใช้อยู่ครับ
สงสัยไปเที่ยวยังไม่กลับ ::)
กระทู้เดิม (อ้างอิงบ่อยจนเริ่มรู้สึกน่าเกกลียด หุหุ)
http://hosxp.net/index.php?option=com_smf&Itemid=28&topic=6128.0
-
เอาแบบตรงเลย สุดยอด
ของผมใกล้ ๆๆ ของที่จะใช้ก็ ok แล้ว
ที่เหลือ ให้คนตรวจ บ้าง เดียว ตกงานหมด
-
เอาแบบตรงเลย สุดยอด
ของผมใกล้ ๆๆ ของที่จะใช้ก็ ok แล้ว
ที่เหลือ ให้คนตรวจ บ้าง เดียว ตกงานหมด
ตอบกระทู้มากไปรึป่าวอาจารย์ แปลว่าอะไรหว่า
ของที่จะใช้อะไรหรอครับ อย่างกับโพสคนละกระทู้ :'(
-
version 3.51.7.8c กลับมาคำนวณแบบเต็มเม็ดได้เหมือนก่อนหน้านี้แล้วครับ
แต่วันละครึ่งเม็ดยังก็คงคำนวณไม่ได้เหมือนเดิม
-
ดูจาก source code DoctorDeskU.pas จาก SVN revision 429 (12/5/2551)
6687 procedure TDoctorDeskForm.DoctorDrugGridKeyUp(Sender: TObject; var Key: Word;
6688 Shift: TShiftState);
...
6697 i, qd: integer;
...
7182 i :=
7183 getsqldata('select iperdose*iperday from drugusage where shortlist="'
7184 +
7185 doctorrxcdsshortlist.value + '"');
...
7193 doctorrxcdsiperday.value :=
7194 strtoint(doctordruggrid.inplaceeditor.text);
...
7198 doctorrxcdsqty.value := i *
7199 strtoint(doctordruggrid.inplaceeditor.text);
...
17958 procedure TDoctorDeskForm.N48Click(Sender: TObject);
17959 var
17960 qd: integer;
17961 i: integer;
...
17983 i :=
17984 getsqldata('select iperdose*iperday from drugusage where shortlist="'
17985 +
17986 doctorrxcdsshortlist.value + '"');
...
17993 doctorrxcdsqty.value := i * qd;
...
พบว่ามีการมีการคำนวณ iperdose*iperday แล้วเอาผลคูณไปเก็บไว้ในตัวแปร i ซึ่งเป็นชนิด integer ก่อน แล้วค่อยเอามาคูณ กับจำนวนวันอีกที
ตอนแปลงเป็น integer เพื่อเก็บในตัวแปร i จะทำให้ผลคูณส่วนที่เป็นเศษหายไป เช่น 0.5 กลายเป็น 0, 1.5 กลายเป็น 2, 2.5 กลายเป็น 2 ทำให้ค่าที่คำนวณได้ผิดไป
ผมขอเสนอการแก้ไขดังนี้นะครับ
1.สร้างตัวแปรชนิด float real หรือ double ขึ้นมา 1 ตัว เพื่อใช้แทนตัวแปร i ในการคำนวณนี้
2.ใช้ function ceil ในบรรทัดที่ 7198-7199 และ 17993 เพื่อปัดเศษขึ้นในกรณีที่คำนวณออกมาแล้วไม่ลงตัว
ปล. อีกที่หนึ่งที่อาจเกี่ยวข้องคือ getsqldata ไม่แน่ใจว่ามันสามารถอ่านค่า iperdose*iperday เป็นเลขทศนิยมได้หรือเปล่า
-
สุดยอด
-
ขอบคุณที่ช่วยตรวจสอบให้ครับ พอดีแก้ไปแล้วจุดเดียว แต่มันมีจุดที่ต้องแก้ทั้งหมด 3 จุดครับ
แก้ไขให้แล้วครับใน 3.51.7.16
-
ขอบคุณครับ อ.manoi ;D
-
ใช้ version 3.51.7.27 พบว่า คำนวณจำนวนยาวันละครึ่งเม็ดได้แล้วครับ :)
แต่อยากให้ปรับปรุงอีกนิดนึงครับ เพราะ บางทีมันจะปัดเศษลงทำให้จำนวนเม็ดยาที่คำนวณได้ไม่พอตามจำนวนวันครับ
เมื่อกี้ไปดู source code ที่อาจารย์เพิ่งอัพเดทมา เห็นใช้ function round()
ถ้าสั่งวันละ 0.5 เม็ด
30 วัน -> round(15.0) = 15 -> พอ
25 วัน -> round(12.5) = 12 -> ไม่พอ
15 วัน -> round( 7.5) = 8 -> พอ
7 วัน -> round( 3.5) = 4 -> พอ
5 วัน -> round( 2.5) = 2 -> ไม่พอ
1 วัน -> round( 0.5) = 0 -> ไม่พอ
ถ้าเปลี่ยนจาก round() เป็น ceil() น่าจะแก้ปัญหานี้ได้นะครับ
-
สุดยอด