BMS-HOSxP Community
HOSxP => แจ้งปัญหา / ขอความช่วยเหลือ => ข้อความที่เริ่มโดย: James011 ที่ กรกฎาคม 28, 2009, 09:32:55 AM
-
;D ;D ;D เพิ่งทำเสร็จเมื่อคืน เทพReport ชี้แนะหน่อยครับ
1.เป็นรายงาน Doctor review พิมพ์ตอนจำหน่ายผู้ป่วยจากตึกผู้ป่วยใน
2.พิมพ์เสร็จ นำไปเก็บไว้ใน OPDCARD ด้านหลัง ไว้ให้หมอดูประวัติการ Admit เวลาคนไข้มาตรวจผู้ป่วยนอก
3.ติดปัญหาผมต้องการทำ Subreport ที่ Diag โรคให้มันออกทุกโรค ตามรูปครับ เทพReport ช่วยชี้แนะหน่อยครับ
*******************Code***************************
select concat(pt.pname,pt.fname," ",pt.lname) as ptname,i.an,i.hn,i.admdoctor,i.dchdate,
i.dchstts,ds.name as ds_name,i.dchtime,i.dchtype,dt.name as dt_name,
i.regdate,i.regtime,i.ward,w.name as w_name,
d.name as drugname,d.strength,o.qty,du.shortlist,o.unitprice,o.sum_price,
ig.diagtype,ig.doctor,dc.name as dc_name,ig.icd10,icd.name as icd_name,
im.admday,im.bedno,tr.name as addr,tr.name1 as age,tr.name3 as pttype_n
from ipt i
left outer join opitemrece o on i.an=o.an
left outer join drugitems d on o.icode=d.icode
left outer join drugusage du on o.drugusage=du.drugusage
left outer join dchstts ds on i.dchstts=ds.dchstts
left outer join dchtype dt on i.dchtype=dt.dchtype
left outer join ward w on i.ward=w.ward
left outer join iptdiag ig on i.an=ig.an
left outer join doctor dc on ig.doctor=dc.code
left outer join icd101 icd on ig.icd10=icd.code
left outer join iptadm im on i.an=im.an
left outer join tempreport tr on i.an=tr.reportname and i.an=tr.id
left outer join patient pt on i.hn=pt.hn
where i.an="000000647" and item_type="H"
group by o.icode
order by ig.diagtype asc
******************************************************************
-
เป็นคำแนะนำนะคับ มือใหม่เหมือนกัน ไม่ต้องทำเป็น sub report ก็ได้นะคับ ลองเพิ่ม script จากตารางของผู้ป่วยใน (ลองหาดูก่อน) ที่เก็บข้อมูลการ diag แล้วที่ report designer ก็ใช้ DbText แทน ทำเผื่อตาม field ในตาราง คาดว่า 1 คนก็ไม่น่าเกิน 5 diag ไหมคับ ไม่ทราบว่าตรงประเด็นหรือเปล่า เพราะว่าในใบสั่งยาของที่ รพ. ก็ใช้วิธีการแบบนี้อ่ะคับ หมอต้องการเห็น diag อย่างน้อย 3 โรค ตารางน่าจะอยู่ใน an_stat นะคับที่เก็บข้อมูลทุกอย่าง ลองดูนะคับผิดถูกยังไงก็ลองดู แบบนี้ไม่น่าจะซับซ้อน
-
;D ;D ;D มีคู่มือการเพิ่ม Script ป่าวครับ
-
;D ;D ผมลองใช้ Variable เพื่อดึงข้อมูล แต่มันดึงได้ครั้งละ 1 ค่า ตัวใช้ Variable 5 ตัวในการดึง ข้อมูลการวินิจฉัยทั้งหมด 5 ตัวครับ มีวิธีอื่นที่ ดึงครั้งเดียวมาทั้งหมดป่าวครับ
-
รอเก็บด้วยคนนะครับ
-
;D ;D ;D ทำเสร็จ Up ให้ครับ ไม่นานเกินรอครับ
-
พอดีอยากให้ได้รายงานยากลับบ้านให้คนไข้ถือด้วยครับ ฝ่ายเภสัชเขาขอมา เพิ่มวิธีรับประทานด้วยน่ะครับ
-
;D ;D ;D เสร็จแล้วครับ Up เลยครับ diag โรค ใช้ Variable ครับ ;D
-
... ตรงส่วนของการ diag บางครั้ง บาง diagtype อาจมีมากกว่า 1 รายการก็ได้ครับ ทำให้การใช้ function GetSQLStringData ใน variable แสดงข้อมูลได้ไม่ครบครับ(ได้แค่รายการเดียว) ...
... ท่าน เจมส์@ศูนย์อนามัยที่ 11 ลองใช้การวาง Memo ขึ้นมาใหม่ 1 ตัว แล้วใช้ variable ไปดึงข้อมูลจาก iptdiag โดยใช้ function GetListFromQuery แล้วจึงส่งค่าที่ได้นี้ ไปแสดงผลที่ Memo ที่เราสร้างไว้แทน ลองๆ ทดลองทำดูครับ ... :D ....
-
;D ;D แจ่มครับ ขอบคุณครับ ขอลองก่อนนะครับ
-
เกือบเสร็จแล้วสิครับ สู้ ๆ คับ ^_^
มาแนะนำเผื่อยังทำไม่เสร็จ แต่ถ้าทำเสร็จแล้วก็ข้ามไปได้เลยคับ
สร้าง Memo และ Variable ขึ้นมาอย่างละตัวครับ
สมมุติว่า Memo ชื่อ Memo1 สร้างแล้วให้กำหนดขนาดตามต้องการ
ใน Variable ใส่โค้ดเป็น
Memo1.text := GetListFromQuery('select concat(ic.code," ",ic.name) from iptdiag ip,icd101 ic '+
'where ip.icd10=ic.code and ip.an="'+DBPipeLine['an']+'"');
ปล. คอมไพล์ code ดูก่อนนะคับไม่รู้จะ error หรือเปล่า
===========================================================
แต่ถ้าอยากใช้ subreport
1. เพิ่ม code ใน event oncreate
ChangeDBPipeLineLink1SQL('select ic.code,ic.name from iptdiag ip,icd101 ic '+
'where ip.icd10=ic.code and ip.an="'+DBPipeLine['an']+'"');
ก็จะได้ข้อมูลการวินิจฉัยอยู่ใน DBPipeLineLink1
2. สร้าง subreport จัดตำแหน่งให้เรียบร้อยแล้วเปลี่ยน ตรง DataPipeLine ให้เปลี่ยนเป็น DBPipeLineLink1
3. ใน Subreport ก็เอา DBText ดึงข้อมูลเหมือนปกติครับ
ผลลัพธ์ใกล้เคียงกันครับ แต่ sub report สามารถจัดรหัสโรค กับชื่อโรคให้ตรงกันได้
อาจจะมีวิธีใช้ Memo ที่แสดงรหัสโรคและชื่อโรคตรงกัน แต่ผมไม่เคยทำคับ ^_^
-
ลองทำไฟล์ตัวอย่างได้ไหมครับ
-
เกือบเสร็จแล้วสิครับ สู้ ๆ คับ ^_^
มาแนะนำเผื่อยังทำไม่เสร็จ แต่ถ้าทำเสร็จแล้วก็ข้ามไปได้เลยคับ
สร้าง Memo และ Variable ขึ้นมาอย่างละตัวครับ
สมมุติว่า Memo ชื่อ Memo1 สร้างแล้วให้กำหนดขนาดตามต้องการ
ใน Variable ใส่โค้ดเป็น
Memo1.text := GetListFromQuery('select concat(ic.code," ",ic.name) from iptdiag ip,icd101 ic '+
'where ip.icd10=ic.code and ip.an="'+DBPipeLine['an']+'"');
ปล. คอมไพล์ code ดูก่อนนะคับไม่รู้จะ error หรือเปล่า
===========================================================
แต่ถ้าอยากใช้ subreport
1. เพิ่ม code ใน event oncreate
ChangeDBPipeLineLink1SQL('select ic.code,ic.name from iptdiag ip,icd101 ic '+
'where ip.icd10=ic.code and ip.an="'+DBPipeLine['an']+'"');
ก็จะได้ข้อมูลการวินิจฉัยอยู่ใน DBPipeLineLink1
2. สร้าง subreport จัดตำแหน่งให้เรียบร้อยแล้วเปลี่ยน ตรง DataPipeLine ให้เปลี่ยนเป็น DBPipeLineLink1
3. ใน Subreport ก็เอา DBText ดึงข้อมูลเหมือนปกติครับ
ผลลัพธ์ใกล้เคียงกันครับ แต่ sub report สามารถจัดรหัสโรค กับชื่อโรคให้ตรงกันได้
อาจจะมีวิธีใช้ Memo ที่แสดงรหัสโรคและชื่อโรคตรงกัน แต่ผมไม่เคยทำคับ ^_^
;D ;D ;D thank ครับ Share Value ดีครับ
-
รอเก็บครับ
-
;D ;D ;D เสร็จแล้วครับ UP Version ใหม่ ตามคำขอ
1.เปลี่ยนจาก Variable เป็น Subreport
2.เพิ่มรายการยาที่แพ้ (จัดให้ตามคำขอ)
3.แก้ Bug ให้สามารถ print ใน Med profile คลิกขวาเลือก Document (จัดให้ตามคำขอ)
-
;D ;D เพิ่ม ราคา ราคารวม วิธิการใช้ยาแบบเต็ม(ตามคำขอ)
-
;D ;D ;D ท่านที่โหลดไปแล้วช่วย ทดสอบให้หน่อยครับ ว่า
ที่อยู่ สิทธิ อายุ ว่าออกครบหรือป่าว ครับ แต่ผมทดสอบแล้วออกครับ
แต่คุณ pongsa เอาไปใช้แล้ว ที่อยู่ สิทธิ อายุ ไม่ออกครับ
ข้อมูล ที่อยู่ สิทธิ อายุ ผมจะดึงจาก tempreport ฐานข้อมูลผมมีข้อมูลครบ
แต่ของคุณ pongsa ที่อยู่ สิทธิ อายุ ในตาราง tempreport ไม่มี งงง
ท่านผู้รู้ช่วยอธิบายหลัการทำงาน ของ tempreport หน่อยครับ
-
อ.ขวด ช่วยออกความคิดเห็นหน่อยครับ
-
ขอบคุณครับ อ.เจมส์ จะสมบูรณ์มากขึ้นครับ ถ้าเพิ่ม CC , vital sign, PE , วันนัด F/U ตามแบบ discharg summary ของ MRA ของ สปสช. (เอาไว้ข้างบน วินิจฉัยก็ได้ครับ)
-
;D ;D ;D ท่านที่โหลดไปแล้วช่วย ทดสอบให้หน่อยครับ ว่า
ที่อยู่ สิทธิ อายุ ว่าออกครบหรือป่าว ครับ แต่ผมทดสอบแล้วออกครับ
แต่คุณ pongsa เอาไปใช้แล้ว ที่อยู่ สิทธิ อายุ ไม่ออกครับ
ข้อมูล ที่อยู่ สิทธิ อายุ ผมจะดึงจาก tempreport ฐานข้อมูลผมมีข้อมูลครบ
แต่ของคุณ pongsa ที่อยู่ สิทธิ อายุ ในตาราง tempreport ไม่มี งงง
ท่านผู้รู้ช่วยอธิบายหลัการทำงาน ของ tempreport หน่อยครับ
tempreport เป็นแค่ตารางที่เอาไว้พักข้อมูลชั่วคราวครับสำหรับทำรายงาน ณ เมื่อเราเรียกรายงานนั้น ๆ ที่ส่วนใหญ่ค่อนข้างซับซ้อน(ซึ่งจะต้องมีการเขียน script สำหรับ insert ข้อมูลแนบเอาไว้ในรายงานนั้นๆด้วย) การที่ข้อมูลมีเหลืออยู่ในตารางนี้ก็แสดงว่า ข้อมูลเดิมจากการเรียกรายงานครั้งที่แล้วยังไม่ถูกลบ โดยปกติ ก่อนที่จะยัดข้อมูลที่เป็นรายงานใหม่ ๆ จะต้องลบของเก่าออกก่อนเสมอ เช่น zquery.sql.text:='delete from tempreport where id = "'+onlineid+'" '; อาจจะเป็น ฟิลด์ใดฟิลด์หนึ่งของtempreport ก็ได้ที่อ้างอิงถึงรายงานนั้น ลอง select * from tempreport ดู ชื่อฟิลต่าง ๆ บางทีก็ไม่สำพันธ์กับค่า เป็นแค่ที่พักข้อมูลเอาไว้ทำรายงานเฉย ๆ ครับ การที่เลือกดึงข้อมูลจากตารางนี้ไม่เวิร์คครับ ลองดูจากรายงานเก่า ๆ ที่มีในเครื่องครับที่มี select t1.name1 ... t1.namexxx โดยทั่วไปจะประมาณนี้ หรือ คำสั่งธรรมดา อย่าง select * from xxx แต่การที่ทำงานะอยู่ตรง tab script ครับ ดูจากตัวอย่างรายงานนี้ก็ได้นะ CUSTOM-Finance หนังสือรับรองเพื่อประกอบการเบิกจ่ายยานอกบัญชียาหลักแห่งชาติจะเห็นการทำงานของ tempreport ได้ไม่ยาก ไม่ได้ encode อะไรไว้ พอแกะได้ครับ คงพอเข้าใจนะครับ รีบเปี่ยนเป็น vn_stat หรือตารางอื่นที่แน่นอนกว่าดีกว่าครับ ข้างล่างคือตัวอย่างแบบง่าย ๆ ครับเลือกคิวรี่ข้อมูลได้ recordset จากนั้นก็ทำลูปจับยัดเข้า tempreport
unit MyIPDReport;
procedure main;
var d1,d2:tdatetime;i:integer;
begin
if not getdaterange() then exit;
d1:=date_result1();
d2:=date_result2();
fonlineid:=report_value(1);
setstatuslabel('Processing...');
ds1:=formatdatetime('yyyy-mm-dd',d1);
ds2:=formatdatetime('yyyy-mm-dd',d2);
//delete old data from tempreport
zquery.sql.text:='delete from tempreport where id = "CUSTOM-stupid" ';
zquery.execsql;
fcds.close;
fcds.datarequest('select * from tempreport where id = "CUSTOM-stupid" ');
fcds.open;
i:=0;
zquery.close;
zquery.sql.text :='select concat(pt.pname,pt.fname,'' '',pt.lname) as ptname,pt.cid,v.age_y as age,op.bw, '+
' pt.sex,pt.informaddr,oh.cc_persist_disease as history_ill,l.lab_items_name,o.lab_order_result,h.hn,v.vstdate '+
' from lab_order o '+
' left outer join lab_head h on o.lab_order_number = h.lab_order_number '+
' left outer join ovst o1 on h.vn = o1.vn '+
' left outer join patient pt on h.hn = pt.hn '+
' inner join lab_items l on l.lab_items_code = o.lab_items_code and o.lab_items_code in (''199'',''100'',''109'',''155'')'+
' inner join opdscreen op on op.vn = o1.vn '+
' inner join vn_stat v on v.vn = o1.vn '+
' left outer join opd_ill_history oh on oh.hn=op.hn '+
' where h.order_date between "'+ds1+'" and "'+ds2+'" ';
zquery.open;
zquery.first;
while not zquery.eof do
begin
i:=i+1;
//start insert data into tempreport
fcds.insert;
fcds['id']:=get_onlineid;
fcds['reportname']:='CUSTOM-stupid';
fcds['name']:=zquery.fields[0].asstring;
fcds['name1']:=zquery.fields[1].asstring;
fcds['name2']:=zquery.fields[2].asstring;
.....
fcds['name8']:=zquery.fields[8].asstring;
fcds['name9']:=zquery.fields[9].asstring;
...
zquery.next;
end;
fcds.post;
fcds.datarequest('select * from tempreport where id = "CUSTOM-stupid" ');
applyupdate_fcds();
setstatuslabel('Done.');
end;
end.
-
;D ;D ;D ท่านที่โหลดไปแล้วช่วย ทดสอบให้หน่อยครับ ว่า
ที่อยู่ สิทธิ อายุ ว่าออกครบหรือป่าว ครับ แต่ผมทดสอบแล้วออกครับ
แต่คุณ pongsa เอาไปใช้แล้ว ที่อยู่ สิทธิ อายุ ไม่ออกครับ
ข้อมูล ที่อยู่ สิทธิ อายุ ผมจะดึงจาก tempreport ฐานข้อมูลผมมีข้อมูลครบ
แต่ของคุณ pongsa ที่อยู่ สิทธิ อายุ ในตาราง tempreport ไม่มี งงง
ท่านผู้รู้ช่วยอธิบายหลัการทำงาน ของ tempreport หน่อยครับ
ของผม ข้อมูลสิทธิ อายุ ที่อยู่ไม่ออกครับ เหมือนของคุณ pongsa เลยครับ
-
;D ;D ;D ท่านที่โหลดไปแล้วช่วย ทดสอบให้หน่อยครับ ว่า
ที่อยู่ สิทธิ อายุ ว่าออกครบหรือป่าว ครับ แต่ผมทดสอบแล้วออกครับ
แต่คุณ pongsa เอาไปใช้แล้ว ที่อยู่ สิทธิ อายุ ไม่ออกครับ
ข้อมูล ที่อยู่ สิทธิ อายุ ผมจะดึงจาก tempreport ฐานข้อมูลผมมีข้อมูลครบ
แต่ของคุณ pongsa ที่อยู่ สิทธิ อายุ ในตาราง tempreport ไม่มี งงง
ท่านผู้รู้ช่วยอธิบายหลัการทำงาน ของ tempreport หน่อยครับ
ของผม ข้อมูลสิทธิ อายุ ที่อยู่ไม่ออกครับ เหมือนของคุณ pongsa เลยครับ
เหมือนกันเลยครับ...ไม่ออกที่อยู่้ อายุ สิทธิ
-
;D ;D ;D ท่านที่โหลดไปแล้วช่วย ทดสอบให้หน่อยครับ ว่า
ที่อยู่ สิทธิ อายุ ว่าออกครบหรือป่าว ครับ แต่ผมทดสอบแล้วออกครับ
แต่คุณ pongsa เอาไปใช้แล้ว ที่อยู่ สิทธิ อายุ ไม่ออกครับ
ข้อมูล ที่อยู่ สิทธิ อายุ ผมจะดึงจาก tempreport ฐานข้อมูลผมมีข้อมูลครบ
แต่ของคุณ pongsa ที่อยู่ สิทธิ อายุ ในตาราง tempreport ไม่มี งงง
ท่านผู้รู้ช่วยอธิบายหลัการทำงาน ของ tempreport หน่อยครับ
tempreport เป็นแค่ตารางที่เอาไว้พักข้อมูลชั่วคราวครับสำหรับทำรายงาน ณ เมื่อเราเรียกรายงานนั้น ๆ ที่ส่วนใหญ่ค่อนข้างซับซ้อน(ซึ่งจะต้องมีการเขียน script สำหรับ insert ข้อมูลแนบเอาไว้ในรายงานนั้นๆด้วย) การที่ข้อมูลมีเหลืออยู่ในตารางนี้ก็แสดงว่า ข้อมูลเดิมจากการเรียกรายงานครั้งที่แล้วยังไม่ถูกลบ โดยปกติ ก่อนที่จะยัดข้อมูลที่เป็นรายงานใหม่ ๆ จะต้องลบของเก่าออกก่อนเสมอ เช่น zquery.sql.text:='delete from tempreport where id = "'+onlineid+'" '; อาจจะเป็น ฟิลด์ใดฟิลด์หนึ่งของtempreport ก็ได้ที่อ้างอิงถึงรายงานนั้น ลอง select * from tempreport ดู ชื่อฟิลต่าง ๆ บางทีก็ไม่สำพันธ์กับค่า เป็นแค่ที่พักข้อมูลเอาไว้ทำรายงานเฉย ๆ ครับ การที่เลือกดึงข้อมูลจากตารางนี้ไม่เวิร์คครับ ลองดูจากรายงานเก่า ๆ ที่มีในเครื่องครับที่มี select t1.name1 ... t1.namexxx โดยทั่วไปจะประมาณนี้ หรือ คำสั่งธรรมดา อย่าง select * from xxx แต่การที่ทำงานะอยู่ตรง tab script ครับ ดูจากตัวอย่างรายงานนี้ก็ได้นะ CUSTOM-Finance หนังสือรับรองเพื่อประกอบการเบิกจ่ายยานอกบัญชียาหลักแห่งชาติจะเห็นการทำงานของ tempreport ได้ไม่ยาก ไม่ได้ encode อะไรไว้ พอแกะได้ครับ คงพอเข้าใจนะครับ รีบเปี่ยนเป็น vn_stat หรือตารางอื่นที่แน่นอนกว่าดีกว่าครับ ข้างล่างคือตัวอย่างแบบง่าย ๆ ครับเลือกคิวรี่ข้อมูลได้ recordset จากนั้นก็ทำลูปจับยัดเข้า tempreport
unit MyIPDReport;
procedure main;
var d1,d2:tdatetime;i:integer;
begin
if not getdaterange() then exit;
d1:=date_result1();
d2:=date_result2();
fonlineid:=report_value(1);
setstatuslabel('Processing...');
ds1:=formatdatetime('yyyy-mm-dd',d1);
ds2:=formatdatetime('yyyy-mm-dd',d2);
//delete old data from tempreport
zquery.sql.text:='delete from tempreport where id = "CUSTOM-stupid" ';
zquery.execsql;
fcds.close;
fcds.datarequest('select * from tempreport where id = "CUSTOM-stupid" ');
fcds.open;
i:=0;
zquery.close;
zquery.sql.text :='select concat(pt.pname,pt.fname,'' '',pt.lname) as ptname,pt.cid,v.age_y as age,op.bw, '+
' pt.sex,pt.informaddr,oh.cc_persist_disease as history_ill,l.lab_items_name,o.lab_order_result,h.hn,v.vstdate '+
' from lab_order o '+
' left outer join lab_head h on o.lab_order_number = h.lab_order_number '+
' left outer join ovst o1 on h.vn = o1.vn '+
' left outer join patient pt on h.hn = pt.hn '+
' inner join lab_items l on l.lab_items_code = o.lab_items_code and o.lab_items_code in (''199'',''100'',''109'',''155'')'+
' inner join opdscreen op on op.vn = o1.vn '+
' inner join vn_stat v on v.vn = o1.vn '+
' left outer join opd_ill_history oh on oh.hn=op.hn '+
' where h.order_date between "'+ds1+'" and "'+ds2+'" ';
zquery.open;
zquery.first;
while not zquery.eof do
begin
i:=i+1;
//start insert data into tempreport
fcds.insert;
fcds['id']:=get_onlineid;
fcds['reportname']:='CUSTOM-stupid';
fcds['name']:=zquery.fields[0].asstring;
fcds['name1']:=zquery.fields[1].asstring;
fcds['name2']:=zquery.fields[2].asstring;
.....
fcds['name8']:=zquery.fields[8].asstring;
fcds['name9']:=zquery.fields[9].asstring;
...
zquery.next;
end;
fcds.post;
fcds.datarequest('select * from tempreport where id = "CUSTOM-stupid" ');
applyupdate_fcds();
setstatuslabel('Done.');
end;
end.
ขอบคุณครับ
-
ผมลองแก้แล้วครับ ช่วยทดสอบด้วยครับว่าขึ้นหรือป่าว ตัดตรงที่อยู่ อายุ และสิทธิดึงจาก an_stat แทนครับ
-
ลองเอาตัวนี้ไปปรับใช้ดูนะครับ
-
ขอโทษครับ ท่านอาจารย์ รายงานนี้พิมพ์และเอาไปใช้ตอนไหนครับ
-
[quoขอโทษครับ ท่านอาจารย์ รายงานนี้พิมพ์และเอาไปใช้ตอนไหนครับ
แนบ chart ผู้ป่วยใน หลัง discharge ครับ