BMS-HOSxP Community
HOSxP => การเขียน SQL Script => ข้อความที่เริ่มโดย: draran ที่ กุมภาพันธ์ 15, 2007, 22: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 ที่ต้องการ
-
ตัวอย่าง 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.
-
อีักอันเป็นตัวอย่างที่ยากขึ้นหน่อย เป็น OPD Card ที่ให้ผู้ัใช้ คีย์ hn แบบไม่มีศูนย์(code ตรวจสอบเองว่า เป็น hn แบบกี่หลัก) แล้ว ผู้ใช้เลือกวันที่ที่ผู้ป่วยมา (เนื่องจาก code ยาว ขอ post แบบไฟล์ .cds ล่ะกัน)
-
ในส่วนการแสดงรายการวินิจฉัย และรายการยา ต้องใช้ blobtext ช่วย คือไปวนรอบใน script และอัดลง blobtext อันนี้ยุ่งยากเล็กน้อย :D
เนื่องจากปกติ ที่บ้านไม่ได้พูด ภาษา Pascal หรือ Delphi หากผิดพลาดประการใดก็ขออภัยไว้น่ะที่นี้ด้วย ;D และรบกวน อ.ชัยพร และ อ.อ๊อดช่วยแก้ไขด้วย
เป็นไอเดีย ง่ายๆ ที่ทดลองใช้ และสอนน้องไอทีแล้ว พบว่าได้ผลดีพอควร
-
ขอบคุณมากครับ :D
-
เพื่อให้ script นี้ทำงานได้ อย่าลืม check ตรงนี้ด้วยนะครับ
-
หมายความว่า pascal script คำสั่งที่อ้างกับ tempreport จำเป็นต้องทำทุกครั้งใช่หรือไม่ครับ
-
เฉพาะ report บางตัวที่ถูกสั่ง Print จากระบบ document ของโปรแกรมครับ แต่หากสั่ง print จาก Custom Report ไม่ต้อง check ก็ได้ครับ
-
ขอบคุณครับ
-
ขอบคุณมากครับ อ. ;D ช่วงนี้เป็นน้องไอที ทำรายงานแบบนี้เยอะขี้น โดย copy code ไปเลย ตรงไหนไม่ใช่ก็ลบหรือ mark ไว้จนกลายเป็นต้องพิมพ์เอกสารเกือบทุกชนิด ไม่เว้นแม้แต่ ใบรับรองการเกิด ที่อุตส่าห์มีมาให้แล้วในสมุด ANC :D เห็นสนุก(เมามันกันอยู่) แล้วปล่อยตามสบาย
-
..
-
ถ้าจะเริ่มหัดเขียน script ต้องทำไงครับ พอมีคู่มือการเขียน script พื้นฐานไหมครับ