มีโอกาสได้เข้าร่วมอบรม การเขียนรายงานด้วย ireport รุ่นแรก ขอบคุณ เพื่อนๆเหล่าเทพเจทั้งหลายที่ส่งข่าวมา(อ.แรมโบ้เสืออีสาน,ลุงหนวดหมออนามัย,นู๋ตั๊กแห่งเมืองปาย) ขอบคุณศูนย์เทคที่จัดกาสอบรม ขอบคุณพี่ปูแห่ง สสจ.สตูลที่ให้โอกาส คิดว่าความรู้ที่ได้มาจะนำมาศึกษาและเผยแพร่ต่อไปให้กับผู้ที่ประสงค์ที่จะศึกษาทุกท่านโดยไม่ปิดบังใดๆ
ในการเข้าร่วมอบรม มีโอกาสได้เรียนรู้โครงสร้างฐานข้อมูลของjhcis ER diagram ของ database ความสัมพันธ์ระหว่างตารางต่างๆในjhcis ทำให้คำสั่งในการเขียนรายงานของเราถูกต้องยิ่งขึ้น
การอบรมทั้ง 5 วันได้มีโอกาสเจอเพื่อฝูงมากมาย เหนือกลางอีสานใต้ ที่ดีใจเหนือสิ่งอื่นใดคือได้เจอลุงหนวดตัวเป็นๆ (คุยกันเกื่อบปีไม่เคยเห็นแม้แต่หน้าตาหรือรูปภาพ)
สาระสำคัญที่ต้องเน้นในกาเขียนรายงานใน jhcis คือ ในการ join ตาราง ตัวที่เป็นคีย์ต้อง join ให้ครบและถูกต้องไม่เช่นนั้นการแสดงผลของรายงานจะช้ามาก
เข่น ถ้าจะ join person กะ house ก็ต้อง
select ...from person inner JOIN house on person.pcucodeperson = house.pcucodeperson
and person.hcode = house.hcode
and right(house.villcode,2) <>'00'
คอนเซบที่ได้มาคือ คนอยู่ในบ้าน บ้านอยู่ในหมู่บ้าน และไม่ใช่นอกเขต
เรา join กันเรียบร้อยค่อย มา list ดูฟิล์ที่เราต้องการ SQL(select.. from where....)
เมื่อเราเข้าใจคอนเซบแล้วต่อไปคงไม่ยากเกินไปแล้ว สำหรับ database jhcis ที่มีตารางประมาณ 250 ตาราง ไม่เยอะนะถ้าเทียบกับ program ค่ายอื่นๆ
- คอนเซบอีกอย่างของโปรแกรม jhcis เป็น คิดเป็น flow ผู้ป่วยนอกแบบจำง่ายๆก็คือ
ผู้ป่วยเป็นใคร (person) มารับบริการวันไหน (visit) ด้วยโรคอะไร หรือ กิจกรรมอะไร (vistdiag,visitanc,visitepi,.....) พอเข้าใจเรื่อง flow แบบนี้ต่อไปเรื่องการเขียนคำสั่งที่จะไปเอาข้อมูลตามต้องการคงไม่ยาก
นอกจากนี้ใน database jhcis เก็บข้อมูลพื้นฐานที่ไม่มี transection ไว้ในตารางที่ขึ้นต้นด้วย c.... เช่น ctitle เก็บข้มูลคำนำหน้าชื่อ cdrug,cdisease เป็นต้น
ตารางเหล่านี้มีความสัมพันธ์กับตารางที่เป็น trasattion เช่น ใน person เก็บคำนำหน้าชื่อไว้เป็นรหัส หากเราต้องการอ่านคำนำหน้าชื่อนี้ให้รู้เรื่อง เราต้องเอามา join กับ ctitle ก่อน
เกริ่นนำคร่าวๆแต่นี้ก่อนนะครับ
คงมีคนสงสัยว่าทำไมไปอบรม ireport แต่ทำไมไม่พูด ถึง ireport เลย
คำตอบคือ ถ้าไม่เข้าใจคอนเซบการ query หรือ เขียน sql ไม่ได้ก็ไม่สามารถเขียนรายงานด้วย ireport ได้ครับ
------------------------------------------------------------------------------------------------------------------
#หมู่บ้านในเขตรับผิดชอบ
#----------------------------
select v.villcode,v.villname,s.subdistname,d.distname,c.provname
FROM village v
inner join cprovince c on left(v.villcode,2) =c.provcode
inner join cdistrict d on left(v.villcode,2) =d.provcode
and substring(v.villcode,3,2) =d.distcode
inner join csubdistrict s on left(v.villcode,2) =s.provcode
and substring(v.villcode,3,2) =s.distcode
and substring(v.villcode,5,2) =s.subdistcode
----------------------------------------------------
# ประชากรตากลุ่มอายุ
--------------------------------
select
case when getAgeYearNum(person.birth,CURDATE()) between 0 and 4 then 'gr0-04'
when getAgeYearNum(person.birth,CURDATE()) between 5 and 9 then 'gr05-09'
when getAgeYearNum(person.birth,CURDATE()) between 10 and 14 then 'gr10-14'
when getAgeYearNum(person.birth,CURDATE()) between 15 and 19 then 'gr15-19'
when getAgeYearNum(person.birth,CURDATE()) between 20 and 24 then 'gr20-24'
when getAgeYearNum(person.birth,CURDATE()) between 25 and 29 then 'gr25-29'
when getAgeYearNum(person.birth,CURDATE()) between 30 and 34 then 'gr30-34'
when getAgeYearNum(person.birth,CURDATE()) between 35 and 39 then 'gr35-39'
when getAgeYearNum(person.birth,CURDATE()) between 40 and 44 then 'gr40-44'
when getAgeYearNum(person.birth,CURDATE()) between 45 and 49 then 'gr45-49'
when getAgeYearNum(person.birth,CURDATE()) between 50 and 54 then 'gr50-54'
when getAgeYearNum(person.birth,CURDATE()) between 55 and 59 then 'gr55-59'
when getAgeYearNum(person.birth,CURDATE()) > 60 then 'gr60+'
else '-' end as agegroup
,sum(case when concat(person.pid,person.pcucodeperson) and person.sex = '1' then '1' else '' end )as man
,sum(case when concat(person.pid,person.pcucodeperson) and person.sex = '2' then '1' else '' end )as woman
,sum(case when concat(person.pid,person.pcucodeperson) and person.sex = '1' or '2'then '1' else '' end )as personall
FROM village
INNER JOIN house ON village.villcode = house.villcode AND village.pcucode = house.pcucode
INNER JOIN person ON house.hcode = person.hcode AND house.pcucode = person.pcucodeperson and CONCAT(person.pid,person.pcucodeperson)
NOT IN (SELECT CONCAT(persondeath.pid,persondeath.pcucodeperson) FROM persondeath WHERE deaddate <= CURDATE() or deaddate is not NULL)#ตัดคนตายออกไป
WHERE RIGHT(house.villcode,2)!= '00'#เป็นหมู่บ้านในเขตบริการ
GROUP BY agegroup;
-----------------------------------------------------------------------