HOSxP Community
HOSxP Community Forum
HOSxP Community
ข่าว: SMF - Just Installed
 
*
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน ตุลาคม 23, 2014, 06:19:34 AM


เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น


หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: การเขียน pascal script แบบประยุกต์(อย่างง่าย)  (อ่าน 18261 ครั้ง)
0 สมาชิก และ 0 บุคคลทั่วไป กำลังดูหัวข้อนี้ Send to Stock topic | Answer point :
draran
Full Member
***

Karma: 0
ออฟไลน์ ออฟไลน์

กระทู้: 116


draroka@hotmail.com
ดูรายละเอียด อีเมล์
« เมื่อ: กุมภาพันธ์ 15, 2007, 10:51:40 PM »

เนื่องจากติดภารกิจด้านอื่น จึงจำใจต้องยกหน้าที่การดูแลระบบให้น้องไอทีดูแลเต็มตัว พบว่า ปัญหาสำคัญที่ผู้ดูระบบ(มือใหม่) พบก็คือการเขียนรายงาน โดยเฉพาะแบบที่ผู้ใช้ต้องใส่ค่า เช่น hn,an,vn เอง(ยกเว้นวันที่ที่ อ.เขียนระบบตรวจสอบอัตโนมัติอยู่แล้ว) ซึ่งต้องใช้ Pascal script ในการทำงาน

ขอสรุปหลักการการเขียน custom report สั้นๆ เพื่อความเข้าใจตรงกัน หลักๆมีสองแบบ คือ

1.   ใช้ sql script ล้วนๆ ข้อดีคือ ตรงไปตรงมา สามารถนำผลการ query ไปใช้ได้เลย ข้อเสีย แม้เราจะสามารถเชื่อมระหว่างหลายๆตารางได้ แต่ก็จะทำ query ซับซ้อน ทำงานช้า กำหนดเงื่อนไขได้จำกัด เนื่องจากเป็นการ query ในครั้งเดียว ที่สำคัญ(ซึ่งเป็นที่มาของบทความนี้)ก็คือ เราไม่สามารถรับค่าตัวแปรอย่างอิสระจากผู้ใช้

2.   ใช้ Pascal ดึงข้อมูลใส่ตาราง tempreport แล้ว ใช้  sql script ดึงจาก tempreport มาแสดงผลอีกที ข้อดี(มากมาย) ยืดหยุ่นมาก สามารถ query ไม่จำกัดจำนวนครั้งใน script สามารถรับค่าตัวแปรได้ ข้อเสียคือ เขียนยาก เพราะเป็นภาษา Pascal มีความยุ่งยากมาก เนื่องจากจะต้องใส่ทุกค่าที่ต้องการแสดงผลลงใน ตาราง temreport หากจำนวนค่าที่ต้องการแสดงผลมาก จำเป็นต้องใช้ record ใน tempreport มากกว่า 1 แถว การเขียน script ก็จะยุ่งยากขึ้นมาก และแต่ละ filed ใน tempreport ไม่ได้สื่อความหมาย ทำให้ใช้งานยาก ต้องจดจำ หรือกำหนดชื่อให้กับทุกค่า

บทความนี้ขอเสนอไอเดียการใช้ Pascal script แบบประยุกต์ ในรายงานที่จำเป็นต้องใช้ค่าที่รับมาจากผู้ใช้โดยมีข้อดี คือ
1.ไม่ต้องบันทึกข้อมูลทุกตัวที่ต้องการลงใน tempreport โดยใช้ Pascal script แต่ยังใช้ Pascal script เพื่อรับตัวแปรจากผู้ใช้งาน และบันทึกลง tempreport เฉพาะตัวแปรนี้ เพื่อใช้ในการ query ภายหลัง
2. เนื่องจากไม่ต้องบันทึกข้อมูลจำนวนมากลงใน tempreport ลดความยาวและซับซ้อนของ Pascal script
3. ดึงข้อมูลโดย sql script เป็นหลัก โดยเชื่อมกับตัวแปรที่บันทึกใน tempreport ทำให้ออกแบบรายงานง่ายขึ้น เนื่องจากตัวแปร แต่ละตัวยังคงแสดงชื่อ ตามชื่อ field
อย่างไรตาม ยังสามารถบันทึกข้อมูลอื่นๆ ได้เป็นอิสระจาก query หลัก โดยบันทึกลงใน filed ต่างๆของ tempreport ได้ตามปกติ

ขอสรุปรูปแบบของ Pascal script สำหรับผู้เริ่มต้น โดยสังเขป ซึ่งจะประกอบไปด้วยกระบวนการหลักๆ คือ
1) การประกาศฟังชั่นที่ใช้ใน script 
2)การประกาศตัวแปร
3) รับค่าจากผู้ใช้
4) หลังจากนั้น จัดการกับตัวแปร เช่น ตรวจสอบความถูกต้องของค่าที่ได้รับ จนได้ค่าที่ต้องการ
5) แล้วลบข้อมูลที่มีอยู่ตาราง tempreport ที่มี id ตามที่เรากำหนดไว้(คือชื่อตาราง)
 6) กำหนดค่าให้กับ field ที่เราต้องการ
7) สุดท้ายก็ update ตาราง tempreport เป็นอันเสร็จพิธี
ตัวอย่างแรกเป็นตัวอย่างง่ายๆ คือ รับการ hn จากผู้ใช้ โดยไม่ต้องใช้ศูนย์นำหน้า แล้วไปเติมศูนย์ให้เป็น 9 หลักใน script(เพื่อความสะดวกแก่ผู้ใช้งาน) แล้วนำไปเชื่อมกับ ตาราง patient เพื่อดึงข้อมูลตาม hn ที่ต้องการ


« แก้ไขครั้งสุดท้าย: กุมภาพันธ์ 15, 2007, 11:34:23 PM โดย draran » Thanks : (nahos, sukkla_01, sakdaphot) 203.113.116.50 (?)

ความช่วยเหลือ จะมายังผู้ที่พยายาม
Administrator,Programmer,Thungyangdaeng Hospital,Pattani
SERVER: Intel Xeon Dual-Core 5140 2.33GHz. Cach 4NB.1333Mhz ,RAM DDR2 512MB*2,HDD SATA2 160 GB*2,
OS:CentOS 4.4 x86_64 MySQL 4.1.20 ,Replicate: Pentium4 WindowsXP RAM 512 MB, Client:Celeron,Sempron,PentiumIII WindowsXP
draran
Full Member
***

Karma: 0
ออฟไลน์ ออฟไลน์

กระทู้: 116


draroka@hotmail.com
ดูรายละเอียด อีเมล์
« ตอบ #1 เมื่อ: กุมภาพันธ์ 15, 2007, 10:57:57 PM »

ตัวอย่าง sql script

select p.*
from patient p
left outer join tempreport t on t.name=p.hn
where t.id='CUSTOM-OPD-Sample'

ให้บันทึก ค่า hn ลงใน tempreport.name โดยใช้ pascal script และดึงมาเชื่อมกับ ตาราง patient ด้วยคำสั่่ง left outer join

ตัวอย่าง pascal script

unit MyOPDReport;
//function user for convert hn to 9 digit #1
function addzero(s:string):string;
begin
 while length(s)<9 do
 begin
 s:='0'+s;
 end;
 result:=s;
end;

//set varieble # 2
procedure main;
var
s:string;
fhn:string;

begin
   //recieve hn # 3
   if preset_value(1)='' then
   begin
     if not inputquery('Please enter Hospital Number','HN',fhn) then exit;
   end else
   begin
     fhn:=preset_value(1);
   end;
   begin
   fhn:=addzero(fhn);
   showmessage('hn = '+fhn);
     
   //check hn in patient  #4
   if getsqldata('select count(*) as cc from patient where hn="'+fhn+'"')=0 then
      raise exception.create('Invalid HN');
   
      end;
 
 //delete old data from tempreport  # 5
   zquery.sql.text:='delete from tempreport where id = "CUSTOM-OPD-Sample" ';
   zquery.execsql;

   fcds.close;
   fcds.datarequest('select * from tempreport where id = "CUSTOM-OPD-Sample" ');
   fcds.open;

//start insert data into tempreport # 6
   fcds.insert;
   fcds['id']:='CUSTOM-OPD-Sample';
   fcds['reportname']:='CUSTOM-OPD-Sample';
   fcds['name']:=fhn;
   
   fcds.post;
   
    //update tempreport # 7
   fcds.datarequest('select * from tempreport where id = "CUSTOM-OPD-Sample" ');
   applyupdate_fcds();

end;
end.

« แก้ไขครั้งสุดท้าย: กุมภาพันธ์ 15, 2007, 11:50:18 PM โดย draran » Thanks : (sukkla_01, ธาดา) 203.113.116.50 (?)

ความช่วยเหลือ จะมายังผู้ที่พยายาม
Administrator,Programmer,Thungyangdaeng Hospital,Pattani
SERVER: Intel Xeon Dual-Core 5140 2.33GHz. Cach 4NB.1333Mhz ,RAM DDR2 512MB*2,HDD SATA2 160 GB*2,
OS:CentOS 4.4 x86_64 MySQL 4.1.20 ,Replicate: Pentium4 WindowsXP RAM 512 MB, Client:Celeron,Sempron,PentiumIII WindowsXP
draran
Full Member
***

Karma: 0
ออฟไลน์ ออฟไลน์

กระทู้: 116


draroka@hotmail.com
ดูรายละเอียด อีเมล์
« ตอบ #2 เมื่อ: กุมภาพันธ์ 15, 2007, 11:08:38 PM »

อีักอันเป็นตัวอย่างที่ยากขึ้นหน่อย เป็น OPD Card ที่ให้ผู้ัใช้ คีย์ hn แบบไม่มีศูนย์(code ตรวจสอบเองว่า เป็น hn แบบกี่หลัก) แล้ว ผู้ใช้เลือกวันที่ที่ผู้ป่วยมา (เนื่องจาก code ยาว ขอ post แบบไฟล์ .cds ล่ะกัน)
Thanks : (nahos) 203.113.116.50 (?)

ความช่วยเหลือ จะมายังผู้ที่พยายาม
Administrator,Programmer,Thungyangdaeng Hospital,Pattani
SERVER: Intel Xeon Dual-Core 5140 2.33GHz. Cach 4NB.1333Mhz ,RAM DDR2 512MB*2,HDD SATA2 160 GB*2,
OS:CentOS 4.4 x86_64 MySQL 4.1.20 ,Replicate: Pentium4 WindowsXP RAM 512 MB, Client:Celeron,Sempron,PentiumIII WindowsXP
draran
Full Member
***

Karma: 0
ออฟไลน์ ออฟไลน์

กระทู้: 116


draroka@hotmail.com
ดูรายละเอียด อีเมล์
« ตอบ #3 เมื่อ: กุมภาพันธ์ 15, 2007, 11:14:14 PM »

ในส่วนการแสดงรายการวินิจฉัย และรายการยา ต้องใช้ blobtext ช่วย คือไปวนรอบใน script และอัดลง blobtext อันนี้ยุ่งยากเล็กน้อย Cheesy

เนื่องจากปกติ ที่บ้านไม่ได้พูด ภาษา Pascal หรือ Delphi หากผิดพลาดประการใดก็ขออภัยไว้น่ะที่นี้ด้วย  Grin และรบกวน อ.ชัยพร และ อ.อ๊อดช่วยแก้ไขด้วย
เป็นไอเดีย ง่ายๆ ที่ทดลองใช้ และสอนน้องไอทีแล้ว พบว่าได้ผลดีพอควร
Thanks : (sukkla_01) 203.113.116.50 (?)

ความช่วยเหลือ จะมายังผู้ที่พยายาม
Administrator,Programmer,Thungyangdaeng Hospital,Pattani
SERVER: Intel Xeon Dual-Core 5140 2.33GHz. Cach 4NB.1333Mhz ,RAM DDR2 512MB*2,HDD SATA2 160 GB*2,
OS:CentOS 4.4 x86_64 MySQL 4.1.20 ,Replicate: Pentium4 WindowsXP RAM 512 MB, Client:Celeron,Sempron,PentiumIII WindowsXP
naj
Hero Member
*****

Karma: -4
ออฟไลน์ ออฟไลน์

กระทู้: 2441


najhosxp@homail.com
ดูรายละเอียด เว็บไซต์
« ตอบ #4 เมื่อ: กุมภาพันธ์ 18, 2007, 11:43:33 PM »

ขอบคุณมากครับ  Cheesy
Thanks : () 124.157.240.194 (?)

Yindee And Tan
manoi
Moderator
Hero Member
*****

Karma: 53
ออฟไลน์ ออฟไลน์

กระทู้: 8343


manoi_rx@msn.com manoi_rx@yahoo.com
ดูรายละเอียด เว็บไซต์ อีเมล์
« ตอบ #5 เมื่อ: กุมภาพันธ์ 19, 2007, 03:38:23 AM »

เพื่อให้ script นี้ทำงานได้ อย่าลืม check ตรงนี้ด้วยนะครับ
Thanks : (sukkla_01) 58.181.233.61 (?)

HOSxP Project Manager / Cheif Developer / BMS MD
naj
Hero Member
*****

Karma: -4
ออฟไลน์ ออฟไลน์

กระทู้: 2441


najhosxp@homail.com
ดูรายละเอียด เว็บไซต์
« ตอบ #6 เมื่อ: กุมภาพันธ์ 19, 2007, 04:55:04 AM »

หมายความว่า pascal script คำสั่งที่อ้างกับ tempreport จำเป็นต้องทำทุกครั้งใช่หรือไม่ครับ
Thanks : () 124.157.240.194 (?)

Yindee And Tan
manoi
Moderator
Hero Member
*****

Karma: 53
ออฟไลน์ ออฟไลน์

กระทู้: 8343


manoi_rx@msn.com manoi_rx@yahoo.com
ดูรายละเอียด เว็บไซต์ อีเมล์
« ตอบ #7 เมื่อ: กุมภาพันธ์ 19, 2007, 05:21:27 AM »

เฉพาะ report บางตัวที่ถูกสั่ง Print จากระบบ document ของโปรแกรมครับ แต่หากสั่ง print จาก Custom Report ไม่ต้อง check ก็ได้ครับ
Thanks : () 58.181.233.61 (?)

HOSxP Project Manager / Cheif Developer / BMS MD
naj
Hero Member
*****

Karma: -4
ออฟไลน์ ออฟไลน์

กระทู้: 2441


najhosxp@homail.com
ดูรายละเอียด เว็บไซต์
« ตอบ #8 เมื่อ: กุมภาพันธ์ 19, 2007, 05:26:49 AM »

ขอบคุณครับ
Thanks : () 124.157.240.194 (?)

Yindee And Tan
draran
Full Member
***

Karma: 0
ออฟไลน์ ออฟไลน์

กระทู้: 116


draroka@hotmail.com
ดูรายละเอียด อีเมล์
« ตอบ #9 เมื่อ: กุมภาพันธ์ 19, 2007, 02:17:08 PM »

ขอบคุณมากครับ อ.  Grin ช่วงนี้เป็นน้องไอที ทำรายงานแบบนี้เยอะขี้น โดย copy code ไปเลย ตรงไหนไม่ใช่ก็ลบหรือ mark ไว้จนกลายเป็นต้องพิมพ์เอกสารเกือบทุกชนิด  ไม่เว้นแม้แต่ ใบรับรองการเกิด ที่อุตส่าห์มีมาให้แล้วในสมุด ANC  Cheesy เห็นสนุก(เมามันกันอยู่) แล้วปล่อยตามสบาย
Thanks : () 203.113.116.50 (?)

ความช่วยเหลือ จะมายังผู้ที่พยายาม
Administrator,Programmer,Thungyangdaeng Hospital,Pattani
SERVER: Intel Xeon Dual-Core 5140 2.33GHz. Cach 4NB.1333Mhz ,RAM DDR2 512MB*2,HDD SATA2 160 GB*2,
OS:CentOS 4.4 x86_64 MySQL 4.1.20 ,Replicate: Pentium4 WindowsXP RAM 512 MB, Client:Celeron,Sempron,PentiumIII WindowsXP
krathokman
Sr. Member
****

Karma: -2
ออฟไลน์ ออฟไลน์

กระทู้: 263



ดูรายละเอียด
« ตอบ #10 เมื่อ: ธันวาคม 12, 2011, 03:47:20 PM »

..
« แก้ไขครั้งสุดท้าย: กรกฎาคม 21, 2012, 11:08:46 AM โดย krathokman » Thanks : () 113.53.185.112 (?)

อรรถเดช รพ.จัตุรัส ชัยภูมิ
Amoxydate@hotmail.com
ขึ้นระบบ 10/9/54  โดย BMS Version 3.55.2.19
sukkla_01
Jr. Member
**

Karma: -1
ออฟไลน์ ออฟไลน์

กระทู้: 96



ดูรายละเอียด
« ตอบ #11 เมื่อ: ธันวาคม 12, 2011, 07:22:51 PM »

ถ้าจะเริ่มหัดเขียน script ต้องทำไงครับ พอมีคู่มือการเขียน script พื้นฐานไหมครับ
Thanks : (sakdaphot) 118.172.219.187 (?)

โรงพยาบาลศรีสังวรสุโขทัย
นักวิชาการคอมพิวเตอร์ พนักงานราชการ
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป:  

Powered by MySQL Powered by PHP Powered by SMF 1.1 RC2 | SMF © 2001-2006, Lewis Media

Valid XHTML 1.0! Valid CSS! Dilber MC Theme by HarzeM
หน้านี้ถูกสร้างขึ้นภายในเวลา 0.047 วินาที กับ 33 คำสั่ง