Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
การสรางรายงานดวย Report Designer ขนสง ระหวางวนท ๑๘ – ๒๐ มกราคม ๒๕๕๕
จดโดย
บ.บางกอก เมดคอล ซอฟแวร จ ากด 2 ชน 2 ม.8 ซ.สขสวสด 33 แขวง/เขต ราษฎรบรณะ กรงเทพฯ
เรยบเรยงโดย นายสชาต จนตะวงศ นกวชาการสาธารณสขช านาญการ ส านกงานสาธารณสขอ าเภอเชยงกลาง
หลกสตรอบรมผดแลระบบ
การสรางรายงานดวย Report Designer ขนสง
วตถประสงค
1. เพอเพมศกยภาพใหผเขารวมอบรมมความร ความเขาใจ และสามารถเลอกใชเครองมอ
(Components) ในก าหนดรปแบบการแสดงผลรายงานในรปแบบตางๆ ทมอยใน Report Designer ไดอยาง
เหมาะสม
2. เพอเพมศกยภาพใหผเขารวมอบรมมความร ความเขาใจ สามารถสราง แบบฟอรม และรายงาน
ส าหรบหนวยบรการไดอยางมประสทธภาพสงสด
เนอหา
1. การใช Sub Report ในการสรางรายงาน เพอใหรายงานแสดงผลไดดและสวยงามยงขน
2. การใช Crosstab ในการสรางรายงานทซบซอนขน
3. การสรางรายงานโดย การเขยน Script ในโปรแกรม Report Designer
4. การเปรยบเทยบความสามารถและเทคนคการแสดงผลรายงาน ดวย Components
5. การเปรยบเทยบความสามารถและเทคนคการแสดงผลรายงาน ดวยการเขยน Script ในรายงาน
เหมาะส าหรบ: ผทผานการอบรมการสรางรายงานดวย Report Designer ขนประยกต หรอผทมทกษะ
ความรเรองค าสง SQL การใชงาน Report Designer และการเขยนโปรแกรม
ระยะเวลาในการอบรม 3 วน /รน
วนท 18-20 มกราคม 2555
สถานทอบรม
บรษท บางกอก เมดคอล ซอฟตแวร จ ากด
2 ชน 2 ม.8 ซ.สขสวสด 33 ถ.สขสวสด แขวง/เขต ราษฎรบรณะ กรงเทพฯ
คาลงทะเบยนทานละ 7,000 บาท (เจดพนบาทถวน) (รวมคาเอกสาร อาหารกลางวน 3 มอ อาหารวาง 6 มอ)
ตารางการอบรม
วนท 1
- การใช Sub Report ในการสรางรายงาน
- แบบฝกหด
วนท 2
- การใช Crosstab ในการสรางรายงาน
- แบบฝกหด
วนท3
- การเขยน Script ในรายงาน
- การเลอกใชวธสรางรายงานใหเหมาะสมกบรายงาน
- แบบฝกหด
การใช Sub Report ในการสรางรายงาน เพอใหรายงานแสดงผลไดดและสวยงามยงขน
ตวอยางรายงาน
รายงานทะเบยนการตรวจรกษาผปวย
ตงแตวนท ถงวนท
ชอโรงพยาบาล
ล าดบ วนท HN ชอ – สกล รวมคาใชจาย
การวนจฉยโรค
หตถการ
รายการยา
วธการสรางรายงาน
๑. สรางค าสง SQL ค าสงหลก
Select CONCAT(pname,fname,” “,lname) AS ptname,o.*
From ovst o,patient pt
Where o.hn = pt.hn and o.vstdate Between “2011-10-01” and “2011-10-31”
ในเมน SQL Query ของโปรแกรม HOSxP และทดลอง Run
2. การสรางชวงวนททตองการระบ ๒.๑ การประกาศตวแปรวนท
ทแถบ Calc ประกาศตวแปรวนทโดยก าหนด และคลก Declarations var date1,date2 : datetime; ds1,ds2 : string; เสรจแลวลอง Compile ตวแปรด
๒.๒ การสรางกลองวนท Dialog ทแถบ Calc เลอก Events เลอก On Create เขยนค าสงโดยด าเนนการดงน - ท Code Toolbox เลอก String - เลอกแถบ Language เลอกฟงกชน GetDateRangeDialog(date1, date2); ลากมาวางใต begin และ
ตวแปร date1 และdate2 จะตองตรงกบชอตวแปร datetime ทประกาศใน var ในทนเขยนไดดงน GetDateRangeDialog(date1, date2);
๒.๓ เปลยนรปแบบวนทใหกลายเปนรปแบบ พ.ศ. โดยใชฟงกชน FormatDateTime(Format, aDateTime); ท Code Toolbox เลอก Format เลอกแถบ Language เลอกฟงกชน FormatDateTime(Format, aDateTime); ลากไปวางใตค าสง ฟงกชน GetDateRangeDialog(date1, date2); และสรางตวแปรมารบคา โดยใชตวแปรทไดประกาศตวแปรไวท Declarations ไดแก ds1,ds2 : string; ไปวางหนาฟงกชน ในทนเขยนค าสงฟงกชนไดดงน
ds1 := FormatDateTime('yyyy-mm-dd', date1); ds2 := FormatDateTime('yyyy-mm-dd', date2);
- เสรจแลวลอง compile และ preview
2.4 สรางกลองวนทในตวรายงานทหนา Design
ใชกลองเครองมอ Variable มาวางตรงทตองการชวงวนท แลวคลกขวาท variable เลอก calculations… แลวก าหนดคาวนทใหตรงตวแปรทเราตองการ เชน คาแรกก าหนดเปน Value := date1; คาทสองก าหนดเปน Value := date๒; เสรจแลว ก าหนดชนดขอมลเปน date time ทบรเวณมมขวาบน หรออกวธการสรางวนทโดยใชรปแบบการเชอมค าโดยใช + ในการสรางกลอง variable เพยงกลองเดยว แลวก าหนดเปน Value := FormatThaiDate('D MMMM EEEE', date1)+' ' +'ถง'+' '+ FormatThaiDate('D MMMM EEEE', date2);
๓. การสรางตวแปรของขอมลทตองการ
3.1 คดลอกค าสงไปวางใน Calc ตามหลงฟงกชน ChangeReportSQL(sql); โดยวางแทน sql โดยใส
เครองหมาย ‘’กอน แลวด าเนนการเชอมค า ผลทได ChangeReportSQL('select concat(pname,fname," ",lname) as ptname,o.* '+
' from ovst o ,patient pt '+
' where o.hn = pt.hn and o.vstdate '+
' between "'+ds1+'" and "'+ds2+'" and (o.an is null or o.an = "") order by o.vn ');
โดยวางถดจากฟงกชนของวนท เสรจแลว ลอง compile และ preview ด จะได ทแถบ data จะม จะปรากฏชอ DBPipeline
3.2 ออกแบบรายงานในหนา Design โดยด าเนนการดงน - การสรางล าดบทให RUN อตโนมต โดยใชเครองชอ DBcalc คลกใตชอล าดบในแถบ Detail แลวคลกขวาท variable เลอก calculations… Calc Type เลอก Count คลก OK
- การสรางวนท โดยใชเครองมอทชอวา DBtext คลกวางในแถบ Detail ทแถบ DBPipeline ขางบน
เลอก vstdate - การสราง HN โดยใชเครองมอทชอวา DBtext คลกวางในแถบ Detail ทแถบ DBPipeline ขางบนเลอก hn
- การสราง ชอ – สกล โดยใชเครองมอทชอวา DBtext คลกวางในแถบ Detail ทแถบ DBPipeline ขางบน
เลอก ptname - การสราง รวมคาใชจาย โดยใชเครองมอ Variable วาง แลวคลกขวา variable เลอก calculations… ก าหนดคาตวแปร variable โดยท Code Toolbox เลอก Math เลอกฟงกชน GetSQLDoubleData(sql); มาวางตอจาก Value := และเขยนค าสง sql เปน Value := GetSQLDoubleData('select sum(sum_price) from opitemrece where vn ="'+DBPipeline['vn']+'"'); อยาลมการเชอมค าดวย + และการก าหนดคา vn = ใหใช DBPipeline['vn'] จากแถบ data ลากมาวางแทนการพมพใน "'++'" การเปลยนคา รวมคาใชจาย ใหเปนรปตวเลขทมทศนยม ๒ ต าแหนง โดยเปลยนลกษณะขอมล
เปน Double คลกขวาท Variable ของรวมคาใชจาย เลอก Display Format… เลอกลกษณะขอมลท
เปนตวเลขทมทศนยม จ านวนทศนยมสามารถพมพเพมได
การใช Sub Report
๔. การออกแบบการวนจฉยโรค
- น าขอมลทตองการจากตาราง ovstdiag
- รปแบบทตองการแสดงผล
๑. รหสโรคหลก : [PDx] ชอโรค
๒. รหสโรครอง : [ตวเลข] ชอโรค หมายเหต ตวเลขจะแสดงDiagType
- ค าสงทตองการ
Select i.name,o.vn,o.icd10,o.diagtype,
IF (o.diagtype = “1”,CONCAT(“[PDx] “,i.name),CONCAT(“[“,o.diagtype,”]”,i.name)) AS
diagname
From ovstdiag o,icd101 i
Where o.icd10 = i.code and o.vn = “521118071753”
Order by o.diagtype
- การใชแถบเครองมอ Sub Report มาวางทแถบ Detail ใตขอมลทออกแบบไวกอนแลว เสรจ
แลวไปก าหนดคณสมบตของขอมลโดยไปเลอกทแถบ Properties For SubReport1 ทแถบ Data
เลอก DataPipeline คลกเลอก DBPipelineLink1
- ไปท Calc เลอก Events เลอก On Create เขยนค าสงโดยด าเนนการดงน
๑. ท Code Toolbox เลอก String เลอกแถบ Language เลอกฟงกชน ChangeDBPipeLineLink1SQL(sql); เสรจแลวน าค าสงทตองการไปวางแทน sql (‘’) และแกไขคาตวแปร vn โดยใชคาของ "'+DBPipeline['vn']+'" มาวางแทน จะไดค าสงเปน
ChangeDBPipeLineLink1SQL('select i.name,o.vn,o.icd10,o.diagtype, '+ 'if(o.diagtype="1",concat("[PDx] ",i.name) ,concat("[",o.diagtype,"] ",i.name )) as diagname '+ 'from ovstdiag o , icd101 i '+ 'where o.icd10 = i.code and o.vn = "'+DBPipeline['vn']+'" '+ 'order by o.diagtype');
๒. เสรจแลว Compile และ Preview 1 รอบ สงเกตท Code Toolbox : Data เลอก DBPipeLineLink1 ทแถบ Data บน Fields For DBPipeLineLink1 จะมขอมลอย
๓. ด าเนนการ Copy ค าสงของ DBPipeLineLink1 ไปวางท Calc คลกขวาบรเวณทวาง เลอก Event ทแถบ Detail ของ Main : DBPipeLine คลก BeforeGenerate เสรจแลวลอง compile และ preview ด
- ด าเนนการออกแบบรายงานทหนา Design ท Sub Report1: DBPipeLineLink1 โดยใช DBtext และ
เลอกขอมลใน DBPipeLineLink1 ใหตรงตามคาขอมลทตองการ
๕. การออกแบบหตถการ
- รปแบบทตองการแสดง
๑. หตถการทมาจาก ER ใหขนดวยค าวา ล าดบ [ER] ชอหตถการ
มาจากตาราง ER_regist_oper
๒. หตถการทมาจาก OPD ใหขนดวยค าวา ล าดบ [OPD] ชอหตถการ
มาจากตาราง doctor_operation
- ค าสงทตองการ
๑. เขยนค าสงทหตถการมาจาก ER
select e.icd9cm,o.er_oper_code,e.name,o.vn,concat("[ER] ",e.name) as o_name
from er_oper_code e
left outer join er_regist_oper o on e.er_oper_code = o.er_oper_code
where o.vn = “541111111”
๒. เขยนค าสงทหตถการมาจาก OPD
select e.icd9cm,o.er_oper_code,e.name,o.vn,concat("[OPD] ",e.name) as o_name from
er_oper_code e
left outer join doctor_operation o on e.er_oper_code = o.er_oper_code
where o.vn = “541111111”
๓. น าค าสงทไดทงสองมาเชอมกนโดยใชตวเชอมเปน Union
- การใชแถบเครองมอ Sub Report มาวางทแถบ Detail ใตขอมลทออกแบบไวกอนแลว เสรจ
แลวไปก าหนดคณสมบตของขอมลโดยไปเลอกทแถบ Properties For SubReport2 ทแถบ Data
เลอก DataPipeline คลกเลอก DBPipelineLink2
- ไปท Calc เลอก Events เลอก On Create เขยนค าสงโดยด าเนนการดงน
๑. ท Code Toolbox เลอก String เลอกแถบ Language เลอกฟงกชน ChangeDBPipeLineLink๒SQL(sql); เสรจแลวน าค าสงทตองการไปวางแทน sql (‘’) และแกไขคาตวแปร vn โดยใชคาของ
"'+DBPipeline['vn']+'" มาวางแทน จะไดค าสงเปน ChangeDBPipeLineLink2SQL('select e.icd9cm,o.er_oper_code,e.name,o.vn,concat("[ER] ",e.name) as o_name '+ 'from er_oper_code e '+ 'left outer join er_regist_oper o on e.er_oper_code = o.er_oper_code '+
'where o.vn = "'+DBPipeline['vn']+'" '+ 'union '+ 'select e.icd9cm,o.er_oper_code,e.name,o.vn,concat("[OPD] ",e.name) as o_name from er_oper_code e '+ 'left outer join doctor_operation o on e.er_oper_code = o.er_oper_code '+ 'where o.vn = "'+DBPipeline['vn']+'" ');
๒. เสรจแลว Compile และ Preview 1 รอบ สงเกตท Code Toolbox : Data เลอก DBPipeLineLink๒ ทแถบ Data บน Fields For DBPipeLineLink๒ จะมขอมลอย
๓. ด าเนนการ Copy ค าสงของ DBPipeLineLink๒ ไปวางท Calc คลกขวาบรเวณทวาง เลอก Event ทแถบ Detail ของ Main : DBPipeLine คลก BeforeGenerate เสรจแลวลอง compile และ preview ด
- ด าเนนการออกแบบรายงานทหนา Design ท Sub Report1: DBPipeLineLink๒ โดยใช DBtext และ
เลอกขอมลใน DBPipeLineLink๒ ใหตรงตามคาขอมลทตองการ
- การด าเนนการให Sub Report2 ไปตอทายกบขอมลของ Sub Report1 โดยคลกขวาท Sub Report2
เลอก ShiftRelativeTo… แลวเลอกใหตอทาย Sub Report1
๖. การออกแบบรายการยา
- รปแบบทตองการแสดง
ล าดบ ชอ + ความแรง # จ านวนทใช
มาจากตาราง drugitems และ opitemrece
- ค าสงทตองการ
select opitemrece.vn,concat(drugitems.name,"+",drugitems.strength,"#",
opitemrece.qty,drugitems.units) as d_name
from drugitems,opitemrece
where drugitems.icode = opitemrece.icode and opitemrece.vn =“541111111”
- การใชแถบเครองมอ Sub Report มาวางทแถบ Detail ใตขอมลทออกแบบไวกอนแลว เสรจ
แลวไปก าหนดคณสมบตของขอมลโดยไปเลอกทแถบ Properties For SubReport3 ทแถบ Data
เลอก DataPipeline คลกเลอก DBPipelineLink3
- ไปท Calc เลอก Events เลอก On Create เขยนค าสงโดยด าเนนการดงน
๑. ท Code Toolbox เลอก String เลอกแถบ Language เลอกฟงกชน ChangeDBPipeLineLink๓SQL(sql); เสรจแลวน าค าสงทตองการไปวางแทน sql (‘’) และแกไขคาตวแปร vn โดยใชคาของ
"'+DBPipeline['vn']+'" มาวางแทน จะไดค าสงเปน
ChangeDBPipeLineLink3SQL('select opitemrece.vn,concat(drugitems.name,"+", drugitems.strength,"#",opitemrece.qty,drugitems.units) as d_name '+
'from drugitems,opitemrece '+ ' where drugitems.icode = opitemrece.icode and opitemrece.vn = "'+DBPipeline['vn']+'" ');
๒. เสรจแลว Compile และ Preview 1 รอบ สงเกตท Code Toolbox : Data เลอก DBPipeLineLink๓ ทแถบ Data บน Fields For DBPipeLineLink๓ จะมขอมลอย
๓. ด าเนนการ Copy ค าสงของ DBPipeLineLink๓ ไปวางท Calc คลกขวาบรเวณทวาง เลอก Event ทแถบ Detail ของ Main : DBPipeLine คลก BeforeGenerate เสรจแลวลอง compile และ preview ด
- ด าเนนการออกแบบรายงานทหนา Design ท Sub Report3: DBPipeLineLink1 โดยใช DBtext และ
เลอกขอมลใน DBPipeLineLink๓ ใหตรงตามคาขอมลทตองการ
๗. การสรางเสนใหแสดงโดยใชการสรางกรปของขอมล ด าเนนการไปคลกท Report บนแถบเมนบาร
เลอก Groups… ทบลอกของเมน Groups ทแถบ Break 0 เลอก DBPipeLine:vn คลก Add แลว Ok
จะได Group Footer [0] : vn ใหสรางเสนใน Group น เสนจะปรากฏทรายการสดทายของเลขท VN นนๆ
๘. การสรางกรอบของขอมล โดยใชเครองมอ Region ไปวางท SubReport
ขอมลทน ามาแสดงในกรอบนไดแก อาการส าคญ อาการแสดง คาความดนโลหตสง คาน าหนก
สวนสง ฯลฯ โดยด าเนนการดงน
๑. สราง Sub Report ทจะแสดงขอมล
๒. ออกแบบรายการขอมลทตองการ โดยใชเครองมอ DBtext และเลอกขอมลท DBPipelineL
๓. คลกทเครองมอ Region มาวางทบขอมลทไดออกแบบไว และคลกขวาทกรอบของ Region เลอก
sent to black เพอใหแสดงขอมล
๔. ถาอยากให กรอบ Region ไมแสดงในกรณทไมมขอมล ด าเนนการคลกเครองมอ Variable มา
วางใกลๆของกรอบ Region คลกขวาท Variable เลอก calculations… ก าหนดคาตวแปร
variable เชน กรณคาของ CC ใชฟงกชน
If DBText9.text <>’’ then
Region2.visible :=True
else
Region2.visible :=False;
ตองการรายงาน
รายงานแสดงคาใชจายในการรกษาพยาบาลโดยแยกตามสทธการรกษา
รหส สทธ คาใชจาย
ต.ค. พ.ย. ธ.ค. ม.ค. ก.พ. ม.ค. เม.ย.
๑. เขยนค าสงหลก
select o.pttype,pttype.name,sum(o.sum_price ) from opitemrece o, pttype ptt
where o.pttype = ptt.pttype and o.vstdate between "2009-10-01" and "2009-10-01
group by o.pttype
๒. หรอจะใชรปแบบการเขยน script ดงขอมลทตองการมาเกบไวชวคราวท TempReport แลวคอยดง
ขอมลมาประมวลผลอกท ดงน
unit Myptt; ตงชอ Scrip
procedure main; รปแบบหลกทตองม
var ประกาศตวแปร
mycds :TClientDataset;
Mycds2:TClientDataset;
date1, date2 :Tdatetime;
ds1,ds2 :string;
begin
zquery.close; ใหปดรายงานเดมทเปดไวกอน
zquery.sql.text:='delete from tempreport where reportname="Myptt"'; ใหลบขอมลในรายงาน
เดมกอนเพอประหยดหนวยความจ า มผลตอความเรวในการประมวลผล
zquery.execsql;
if not getdaterange() then exit
date1 :=date_result1();
date2 :=date_result2();
ds1:=formatdatetime('YYY-MM-DD',date1);
ds2:=formatdatetime('YYY-MM-DD',date2);
Mycds:=TClientDataset.Create(nil);
Mycds.data:=hosxp_getdataset('select o.pttype,ptt.name,o.sum_price,o.vstdate '+
' from opitemrece o,pttype ptt '+
' where o.pttype = ptt.pttype '+
' and o.vstdate between "'+ds1+'" and "'+ds2+'" ');
Mycds2:= TClientDataset.Create(nil);
Mycds2.data:=hosxp_getdataset('select * from tempreport '+
' where reportname="Myptt"');
Mycds.First;
Mycds2.First;
while not Mycds.EOF do
begin
Mycds2.Insert;
Mycds2.FieldByName('reportname').AsString :='Myptt';
Mycds2.FieldByName('id').AsString :='Myptt';
Mycds2.FieldByName('name').AsString :=Mycds.FieldByName('pttype').Asstring;
Mycds2.FieldByName('name1').AsString :=Mycds.FieldByName('name').Asstring;
Mycds2.FieldByName('mon').Asinteger :=Mycds.FieldByName('sum_price').Asinteger;
Mycds2.FieldByName('date1').Asdatetime :=Mycds.FieldByName('vstdate').Asdatetime;
Mycds.Next;
Mycds2.Next;
End;
If Mycds2.changecount>0 then
hosxp_updatedelta(Mycds2.delta,'select * from tempreport where reportname="Myptt"');
Showmessage('Success');
end;
end.
๓. ด าเนนการออกแบบรายงานในหนา Design
๔. การก าหนดปงบประมาณ โดยดงขอมลปเฉพาะทตองการออกมา ดวยการใชฟงกชน date_format
หรอ year รปแบบ (date_format(vstdate,”%Y”))+543 หรอ distinct(year(vstdate))+543
๕. ด าเนนการเขยนค าสง
begin
year:=GetPickupList('select distinct(year(date1))+543 as y '+
' from tempreport having y like "25%" order by y desc');
showMessage(year);
byear :=StrToInt(year)-544;
eyear :=StrToInt(year)-543;
m100 := encodedate(byear,10,01) ;
m101 := encodedate(byear,10,31) ;
m110 := encodedate(byear,11,01) ;
m111 := encodedate(byear,11,30) ;
m120 := encodedate(byear,12,01) ;
m121 := encodedate(byear,12,31) ;
m010 := encodedate(eyear,01,01) ;
m011 := encodedate(eyear,01,31) ;
m020 := encodedate(eyear,02,01) ;
m021 := encodedate(eyear,02,29) ;
m030 := encodedate(eyear,03,01) ;
m031 := encodedate(eyear,03,31) ;
m040 := encodedate(eyear,04,01) ;
m041 := encodedate(eyear,04,30) ;
m050 := encodedate(eyear,05,01) ;
m051 := encodedate(eyear,05,31) ;
m060 := encodedate(eyear,06,01) ;
m061 := encodedate(eyear,06,30) ;
m070 := encodedate(eyear,07,01) ;
m071 := encodedate(eyear,07,31) ;
m080 := encodedate(eyear,08,01) ;
m081 := encodedate(eyear,08,31) ;
m090 := encodedate(eyear,09,01) ;
m091 := encodedate(eyear,09,30) ; oct := '"'+FormatDateTime('YYYY-MM-DD', m100)+'" and "'+FormatDateTime('YYYY-MM-DD', m101)+'"';
nov := '"'+FormatDateTime('YYYY-MM-DD', m110)+'" and "'+FormatDateTime('YYYY-MM-DD', m111)+'"';
dec := '"'+FormatDateTime('YYYY-MM-DD', m120)+'" and "'+FormatDateTime('YYYY-MM-DD', m121)+'"';
jan := '"'+FormatDateTime('YYYY-MM-DD', m010)+'" and "'+FormatDateTime('YYYY-MM-DD', m011)+'"';
feb := '"'+FormatDateTime('YYYY-MM-DD', m020)+'" and "'+FormatDateTime('YYYY-MM-DD', m021)+'"';
mar := '"'+FormatDateTime('YYYY-MM-DD', m030)+'" and "'+FormatDateTime('YYYY-MM-DD', m031)+'"';
apr := '"'+FormatDateTime('YYYY-MM-DD', m040)+'" and "'+FormatDateTime('YYYY-MM-DD', m041)+'"';
may := '"'+FormatDateTime('YYYY-MM-DD', m050)+'" and "'+FormatDateTime('YYYY-MM-DD', m051)+'"';
jun := '"'+FormatDateTime('YYYY-MM-DD', m060)+'" and "'+FormatDateTime('YYYY-MM-DD', m061)+'"';
jul := '"'+FormatDateTime('YYYY-MM-DD', m070)+'" and "'+FormatDateTime('YYYY-MM-DD', m071)+'"';
aug := '"'+FormatDateTime('YYYY-MM-DD', m080)+'" and "'+FormatDateTime('YYYY-MM-DD', m081)+'"';
sep := '"'+FormatDateTime('YYYY-MM-DD', m090)+'" and "'+FormatDateTime('YYYY-MM-DD', m091)+'"';
octTosep := '"'+FormatDateTime('YYYY-MM-DD', m100)+'" and "'+FormatDateTime('YYYY-MM-DD', m091)+'"';
ChangeReportSQL('select name as pttype,name1 as name,date1 as vstdate,mon as sum_price '+
'from tempreport where reportname = "Myptt" and vstdate between '+octTosep+' group by pttype ');
end;
๖. ใช DBText ในการออกแบบรายงาน
การใช Crosstab ในการสรางรายงานทซบซอนขน
ตวอยางรายงาน
ตองการรายงานแสดงจ านวนผมารบบรการแยกตามสทธการรกษา และแยกตามแพทยผรกษา
ด าเนนการดงน
๑. ขอมลทตองการไดมาจากตาราง vn_stat , opitemrece
๒. สรางกลองแสดงวนททตองการ
๓. เขยนค าสงหลกทตองการ
select v.pttype,v.dx_doctor,v.income,ptt.name as pttname,d.name as docname
from vn_stat v,pttype ptt,doctor d
where v.pttype=ptt.pttype and v.dx_doctor=d.code
and v.vstdate between "'+ds1+'" and "'+ds2+'"
order by d.code');
๔. ด าเนนการออกแบบรายงานในแถบ Design
คลกทปมเมน Crosstab มาวางท Title โดยปกตรายงานทสรางจาก Crosstab จะนยมสรางใน
สวน Title เพอใหแสดงผลครงเดยว ถาสรางในสวน Header หรอ Detail จะมการวนลปของรายงาน
ท าใหมการแสดงผลหลายครง
๕. คลกขวาทแถบ Cross Tab เลอกConfigure…
ทแถบเมน Configure Crosstab ด าเนนการออกแบบโดยจะใหขอมลอะไรโชวในคอลมน หรอขอมล
อะไรโชวในชองแถว เชนใหขอมลรหสสทธการรกษา แสดงในคอลมน และขอมลแพทยผรกษาแสดง
ในแถว จะด าเนนการดงน
- ลาก docname วางท new row
- ลาก pttype วางท new column
- ลาก income มาวางตรงกลาง ระหวาง docname กบ pttype ท new value ซงโปรแกรมจะ
ก าหนดคาเรมตนท Sum และสามารถแกไขได
- ด าเนนแกไข ปรบปรงแบบรายงานตามทตองกน
- ลอง Preview ด
๖. การแกไขชอขอมลตางๆตองไปแกไขทค าสงหลก As……
การสรางรายงานโดย การเขยน Script ในโปรแกรม Report Designer
ทบทวน Pascal
รปแบบของโปรแกรม Pascal
Program
Var
Begin
End.
๑. สวนหวของโปรแกรม : Program Heading ลกษณะทใช
ใชในการตงชอของโปรแกรม รปแบบ
Program ชอโปรแกรม; ตวอยาง
MyFirstProgram; ๒. สวนหวการประกาศ : Declaration Part ลกษณะทใช
๑. ประกาศตวแปรทใชในโปรแกรม (Variable Declaration) รปแบบ Var ชอตวแปร : ชนดตวแปร; ตวอยาง Var date1,date2 : datetme; ds1,ds2 : string; ๒. ประกาศคาคงท (Constant Declaration) รปแบบ Const ชอคาคงท = คาทก าหนด; ตวอยาง Const Addon = 80; ๓. ประกาศชนดของขอมลทสรางขนใหม (Type Declaration) ตวอยาง Type Color = (red,green,blue); ๔. ประกาศตวแปรยอยในรปของ Procedure และ Function
3. สวนค าสง : Statement ลกษณะทใช ใชในการเขยนค าสงประมวลผล รปแบบ Begin Statement_1 Statement_2 ………..
Statement_n End. ตวอยาง Program MyFirstProgram Begin ShowMessage(‘This is a Pascal Program’); End. Program MyFirstProgram Var IntegerVar : Integer; Begin IntegerVar := 3; ShowMessage(IntToStr(IntegerVar)); End.
ชนดของขอมล ๑. Integer เกบขอมลแบบตวเลขจ านวนเตม มคาระหวา –๓๒๗๖๘ ถง ๓๒๗๙๗ ๒. Real เกบขอมลแบบตวเลขจ านวนจรง ทประกอบดวยตวเลขจ านวนเตมและทศนยม ๓. Char เกบขอมลเปนตวอกขระ หรอตวอกษร เพยง ๑ ตว อาจจะเปนตวเลข, ตวอกษร, สญลกษณพเศษ ๔. String เกบขอมลทเปนขอความ ๕. Boolean เกบขอมลทเปนแบบตรรกศาสตร ทแสดงถงการตดสนใจวาขอมลนนจรง(True) หรอเทจ
(False) เครองหมายทางคณตศาสตร (Arithmetic Operator)
๑. เครองหมายบวก สญลกษณ + ๒. เครองหมายลบ สญลกษณ - ๓. เครองหมายคณ สญลกษณ * ๔. เครองหมายหาร สญลกษณ / ๕. เครองหมายหารตดเศษ สญลกษณ div ๖. เครองหมายหารเอาแตเศษ สญลกษณ mod ๗. ฟงกชนเพอค านวณการยกก าลงสองของX สญลกษณ sqr(x) ๘. ฟงกชนการหารากทสองของx สญลกษณ sqrt(x)
Compound Statement รปแบบ IF Comdition1 Then Begin ….. End // end ตวแรกไมตองมเครองหมาย; Else Begin ….. End; การทางานแบบวนรอบ หรอทาซา (LOOP) เปนการเขยนค าสงเพอใหโปรแกรมวนท างานซ าค าสงเดม โดยการก าหนดเงอนไขในการวนรอบท างานจนกวาเงอนไขไมเปนจรง จงจะหยด ค าสง WHILE รปแบบ While Condition do Statement; หรอ While Condition do Begin Statement1; Statement2;
………………. Increment/Decrement;
End;
Data set Component
คอชดเครองมอทใชจดการชดขอมล เชน
- DBMS : Database Management System คอ โปรแกรมทท าหนาเปนตวกลางระหวางผใช (user) กบฐานขอมลเพอจดการและควบคมความถกตอง ความซ าซอน และความสมพนธระหวางขอมลตางๆ ภายในฐานขอมล เชน MySQL, Postgresql
- Connection Component
เชน
TMy Connection จะใชบอย
TSQL Connection จะใชตดตอฐานขอมล
- Dataset Component จะใชในการสงงาน
เชน TMy Query , TSQL Dataset
ชนดของ Dataset
1. รปแบบทขอมลจะด าเนนการเปลยนแปลงทนทเมอใชงานและจ าเปนตองตดตอ (Connect) ฐานขอมล
ตลอดทใชงาน ไดแก
- TTable สามารถสงงานไดเลย โดยจะอางถง Tablename
- TQuery เชน SQL Text
2. Manual apply update after post ขอมลจะถกจ าคาไวทฐานจ าลองชวคราว และจะถกเปลยนท
ฐานขอมลเมอถกสงอกครง ไดแก
- TClient Dataset
Working with dataset
1. Dataset.Open เปด
2. Dataset.Insert / Append น าเขาขอมล
3. Dataset.Fields[x].Asxx := จะเกบคาขอมล [x] คอล าดบของคอลมน
4. Dataset.Post
5. Dataset.Close
เครองมอทมใน Script
- ปมแรกลกษณะคลายสายฟาสเหลอง ท าหนาทคลายกบ Run หรอ Append ใน SQL Query ใน
Hosxp
- ปมทสอง คลายหนาเอกสารฉกครง ท าหนาท Load Template ซงเปนรปแบบในการเขยนค าสง
- ปมทสาม และปมทส คลายแวนขยาย ท าหนาทสวทซไปมาระหวางตวอกษร
- ปมทหา ท าหนาทโหลดไฟลทเปนภาษา Pascal จากภายนอกเขามา
ขนตอนการเขยน Script ในโปรแกรม Report Designer
๑. ตดตอกบฐานขอมล HOSxP
การใชงานในโปรแกรม Report Designer ปกตจะเชอมตอกบฐานขอมล HOSxP ตงแตเขาสโปรแกรม
แลว จงสามารถขามขนตอนนไปได
๒. สรางค าสง SQL เพอดงขอมลทตองการออกมาเกบไวท Dataset
๓. แสดงขอมลใน Dataset
ตวอยางการเขยน Script
วธการสรางตวแปรทมชนดเปน Dataset (TClient Dataset)
0. ตงชอโปรแกรม ประกาศตวแปร และสรางตวแปรทใชเกบขอมล
Unit MyScript; ชอโปรแกรม MyScript
Procedure main;
var Mycds:TClientDataset; ประกาศตวแปร
begin
Mycds:=TClientDataset.Create(nil); สรางขอมล Mycds ทมชนดเปน dataset (TClient Dataset) : nil ไมม
ใคร ลอยๆ วตถไมขนกบใครจะถกท าลายเมอปด Report
1. สงค าสง SQL เขาไปและดดขอมลมาไวใน Dataset
ฟงกชนทใช เชน hosxp_getdataset จะใชดดขอมล และเกบขอมลเปนนามสกล .data
Mycds.data:=hosxp_getdataset('select * from pttype order by pttype limit 10');
Mycds.First;
While not Mycds.EOF do
begin
2. แสดงขอมลใน Dataset จะตองระบใหแสดงขอมลในคอลมนใหน เชน
ShowMessage(Mycds.fields[0].AsString+' '+
Mycds.fieldByName('name').AsString);
Mycds.Next; ใหแสดงแถวแรก
end;
end;
ขนตอนการน าขอมลไปเกบใน Temp Report
๑. ตรวจสอบกอนวามขอมลของ Report Name นหรอยงถามแลวใหด าเนนการลบทง
เชน select * from tempreport where reportname=’RB1T02’
Delete from tempreport where reportname=’RB1T02’
ฟงกชน
zquery.close; เพอใหปดฟอรมทเปดทงไว กอนจะสงใหด าเนนการตามค าสงใหม
zquery.open; อาจจะไมใชกได
zquery.sql.text:=’delete from tempreport where reportname=”Myscript”’; ใชลบขอมล
zquery.execsql;
๒. สงค าสง SQL ไปดงขอมลมาเกบใน Dataset
ประกาศตวแปรเพม
Mycds2:TClientDataset;
สรางตวแปรขนมา
Mycds2:= TClientDataset.Create(nil);
Mycds2.data:=hosxp_getdataset(‘select * from tempreport ‘+
‘ where reportname=”Myscript”’);
๓. น าขอมลไปเกบ
สงใหไปทคอลมนแรก
Mycds.First;
Mycds2.First;
น าขอมลจากmycds ไปเกบ Mycds2
while not Mycds.EOF do
begin
Mycds2.Insert; เพอบอกใหรวาเปนการใสคาให เหมอนการสงให อพเดดขอมล
Mycds2.FieldByName(‘reportname’).AsString :=’Myscript’;
Mycds2.FieldByName(‘id’).AsString :=’Myscript’;
Mycds2.FieldByName(‘name’).AsString :=Mycds.FieldByName(‘pttype’).Asstring;
Mycds2.FieldByName(‘name1’).AsString :=Mycds.FieldByName(‘name’).Asstring;
Mycds.Next;
Mycds2.Next;
End;
ค าสงการอพเดดขอมลลงในฐานขอมล
If Mycds2.changecount>0 then เปนการตรวจสอบวามขอมลในตารางหรอไม มากกวาศนย
hosxp_updatedelta(Mycds2.delta,’select * from tempreport where reportname=”Myscript”’);
เปนฟงกชนทมอยแลว
Showmessage(‘Success’); เพอบอกใหร
ค าสงทได
unit myscript;
procedure main;
var
Mycds:TClientDataset;
Mycds2:TClientDataset;
onlineuser : string;
begin
onlineuser := report_value(2);
zquery.close;
zquery.sql.text:='delete from tempreport where reportname="Myscript" and id
="'+onlineuser+'"';
zquery.execsql;
Mycds:=TClientDataset.Create(nil);
Mycds.data:=hosxp_getdataset('select * from pttype order by pttype limit 10');
Mycds2:= TClientDataset.Create(nil);
Mycds2.data:=hosxp_getdataset('select * from tempreport '+
' where reportname="Myscript" and id ="'+onlineuser+'"');
Mycds.First;
Mycds2.First;
while not Mycds.EOF do
begin
Mycds2.Insert;
Mycds2.FieldByName('reportname').AsString :='Myscript';
Mycds2.FieldByName('id').AsString := onlineuser;
Mycds2.FieldByName('name').AsString :=Mycds.FieldByName('pttype').Asstring;
Mycds2.FieldByName('name1').AsString :=Mycds.FieldByName('name').Asstring;
Mycds.Next;
Mycds2.Next;
End;
If Mycds2.changecount>0 then
hosxp_updatedelta(Mycds2.delta,'select * from tempreport where reportname="Myscript" and
id ="'+onlineuser+'"');
Showmessage('Success');
mycds.free;
mycds2.free;
end;
end.
จงเกบขอมลตอไปน ลงในตาราง TempReport
HN,ชอ – สกล,อาย(ป),สทธประจ าตว,วนเกด
โดยตงชอ reportname วา MyPatient 20 คนแรก
unit Mypatient;
procedure main;
Mycds:TClientDataset;
Mycds:=TClientDataset.Create(nil);
Mycds2:TClientDataset;
Mycds2:= TClientDataset.Create(nil);
Mycds.data:=hosxp_getdataset('select p.hn,concat(p.pname,p.fname," ",p.lname) as
name,v.age_y,ptt.name as nameptt,p.birthday '+
' from patient p,vn_stat v,pttype ptt '+
' where p.hn=v.hn and p.pttype=ptt.pttype '+
' LIMIT 20');
Mycds2.data:=hosxp_getdataset('select * from tempreport '+
' where reportname="Mypatient"');
Mycds.First;
Mycds2.First;
While not Mycds.EOF do
Begin
Mycds2.Insert;
Mycds2.FieldByName('reportname').AsString :='Mypatient';
Mycds2.FieldByName('id').AsString :='Mypatient';
Mycds2.FieldByName('name').AsString :=Mycds.FieldByName('hn').Asstring;
Mycds2.FieldByName('name1').AsString :=Mycds.FieldByName('name').Asstring;
Mycds2.FieldByName('name2').AsString :=Mycds.FieldByName('age_y').Asstring;
Mycds2.FieldByName('name3').AsString :=Mycds.FieldByName('nameptt').Asstring;
Mycds2.FieldByName('name4').AsString :=Mycds.FieldByName('birthday').Asstring;
Mycds.Next;
Mycds2.Next;
End;
If Mycds2.changecount>0 then
hosxp_updatedelta(Mycds2.delta,'select * from tempreport where reportname="Mypatient"');
Showmessage('Success');
End;
End.
การแสดงขอมลในตารางRefer
|hn| | ชอ – สกล | เลขทrefer | สถานทสงมา | วนท
๑. เขยน Script ดดขอมลของคนไขทมารบบรการจากตาราง ovst ของคนไขทมารบบรการในชวงวนท
เลอกไวกอน
ค าสงทตองการ
select o.vn,o.hn,o.vestdate
from ovst o
left outer join patient p on o.hn=p.hn
where o.vstdate between “2011-01-01” and “2011-01-31”
๒. ด าเนนการเขยน Script
Unit myscript1;
Procedure main;
var
mycds :TClientDataset;
Mycds2:TClientDataset;
Begin
zquery.close;
zquery.sql.text:='delete from tempreport where reportname="Myscript1"';
zquery.execsql;
Mycds:=TClientDataset.Create(nil);
Mycds.data:=hosxp_getdataset('select o.vn,o.hn,concat(p.pname,p.fname," ",p.lname) as
name,o.vstdate from ovst o left outer join patient p on o.hn=p.hn '+
' where o.vstdate between "2011-01-01" and "2011-01-31" LIMIT 10');
Mycds2:= TClientDataset.Create(nil);
Mycds2.data:=hosxp_getdataset('select * from tempreport '+
' where reportname="Myscript1"');
Mycds.First;
Mycds2.First;
While not Mycds.EOF do
Begin
Mycds2.Insert;
Mycds2.FieldByName('reportname').AsString :='Myscript1';
Mycds2.FieldByName('id').AsString :='Myscript1';
Mycds2.FieldByName('name').AsString :=Mycds.FieldByName('vn').Asstring;
Mycds2.FieldByName('name1').AsString :=Mycds.FieldByName('hn').Asstring;
Mycds2.FieldByName('name2').AsString :=Mycds.FieldByName('name').Asstring;
Mycds2.FieldByName('name3').AsString :=Mycds.FieldByName('vstdate').Asstring;
Mycds.Next;
Mycds2.Next;
End;
If Mycds2.changecount>0 then
hosxp_updatedelta(Mycds2.delta,'select * from tempreport where reportname="Myscript1"');
Showmessage('Success');
End;
End.
การเขยนฟงกชนทใชรปแบบทมอยแลวในโปรแกรมชวยเขยนใหงายขน
- ฟงกชน Inputquery(Title,Label,ตวแปรเกบคา)
๑. ใชส าหรบบอกใหผใชด าเนนการอยางไร
๒. ใชคาทผใชไมกรอกแตทราบคาทแนนอน (คาDeflur)
เชน –
var min,max : string เปนการประกาศตวแปร
min := ‘80’
max := ‘99’
Inputquery(‘คาเรมตน’,’กรณาใสคาเรมตนของระดบน าตาลทตองการ?’,’80’)
Inputquery(‘คาสนสด’,’กรณาใสคาสนสดของระดบน าตาลทตองการ?’,’99’)
zquery.close; ลบอนเดมออกกอน
zquery.sql.text :=’delete from tempreport where reportname =”testscript”’; เปนการ
ลบฟอรม
zquery.execsql;
fcds.close;
fcds.datarequest(‘select * from tempreport where reportname =”testscript”’);
fcds.open;
fcds.insert;
fcds[‘reportname’]:=’testscript’;
fcds[‘name1’]:=min;
fcds[‘name2’]:=max;
fcds.post;
fcds.datarequest(‘select * from tempreport where reportname =”testscript”’) ตองเขยน
อกรอบ
applyupdate_fcds; เปนการสงใหอพเดดขอมล
หมายเหต
- fcds เปนตวแปรทมอยแลวไมจ าเปนตองประกาศตวแปรอก
- .datarequest เปนคาทดงขอมลออกมาจากHosxp ซงมอยแลวในโปรแกรม
- Mycds2.FieldByName('reportname').AsString สามารถแทนได fcds[‘reportname’]
- ฟงกชน GetUserParameter เปนฟงกชนไวตรวจสอบมการสงตวแปรหรอพารามเตอรเขาfrom นหรอ
ยง ถายงจะไดเรยกฟงกชนใหใสตวแปรตอไป
เชน
Unit myscript1;
Procedure main;
var
mycds :TClientDataset;
Mycds2:TClientDataset;
date1, date2 :Tdatetime;
ds1,ds2 :string;
Begin
zquery.close;
zquery.sql.text:='delete from tempreport where reportname="Myscript1"';
zquery.execsql;
If not getdaterange() then exit
date1 :=date_result1();
date2 :=date_result2();
ds1:=formatdatetime('YYY-MM-DD',date1);
ds2:=formatdatetime('YYY-MM-DD',date2);
Mycds:=TClientDataset.Create(nil);
Mycds.data:=hosxp_getdataset('select o.vn,o.hn,concat(p.pname,p.fname," ",p.lname) as
name,o.vstdate from ovst o left outer join patient p on o.hn=p.hn '+
' where o.vstdate between "'+ds1+'" and "'+ds2+'"');
Mycds2:= TClientDataset.Create(nil);
Mycds2.data:=hosxp_getdataset('select * from tempreport '+
' where reportname="Myscript1"');
Mycds.First;
Mycds2.First;
While not Mycds.EOF do
Begin
Mycds2.Insert;
Mycds2.FieldByName('reportname').AsString :='Myscript1';
Mycds2.FieldByName('id').AsString :='Myscript1';
Mycds2.FieldByName('name').AsString :=Mycds.FieldByName('vn').Asstring;
Mycds2.FieldByName('name1').AsString :=Mycds.FieldByName('hn').Asstring;
Mycds2.FieldByName('name2').AsString :=Mycds.FieldByName('name').Asstring;
Mycds2.FieldByName('name3').AsString :=Mycds.FieldByName('vstdate').Asstring;
Mycds.Next;
Mycds2.Next;
End;
If Mycds2.changecount>0 then
hosxp_updatedelta(Mycds2.delta,'select * from tempreport where reportname="Myscript1"');
Showmessage('Success');
End;
End.
การเปรยบเทยบความสามารถและเทคนคการแสดงผลรายงาน ดวยการเขยน Script ในรายงาน
๑. มความยดหยนในการเขยนรายงาน
๒. สามารถน าขอมลมาเกบไวใน Dataset แลวคอยน ามาแสดงผลทหลงท าใหมผลตอความไวในการ
ประมวลผลทมขอมลจ านวนมาก