วันจันทร์ที่ 24 สิงหาคม พ.ศ. 2563

windows10

C:\Users\xxxxxx\AppData\Roaming\BMS\HOSxPXE_PCU\Backup\tmp

C:\Users\it01\AppData\Roaming>

C:\Users\it01\AppData\Roaming\BMS\BMS

วันเสาร์ที่ 14 ธันวาคม พ.ศ. 2562

ระบบ RUN Script PCU XE (บันทึกช่วยจำเท่านั้น ชัยพร สุรเตมีย์กุล ผู้เขียยนบทความ )


ผมปรับปรุงระบบ integrate script engine ใหม่ รองรับการ run script เพื่อตรวจสอบข้อมูล ก่อน และ หลัง การบันทึกข้อมูล ทดสอบตามนี้นะครับ
เข้าระบบ Script Form Designer แล้วสร้าง DataModule ตรง Tab DPR ให้ Check ตรง Customize DPR เอาไว้ แล้วจะสามารถแก้ไข DPR Code ได้โดยโปรแกรมจะไม่เขียนค่า Default ทับ
Save Script ไว้






ใน Script จะสามารถหาค่าของข้อมูล HN / VN ปัจจุบันได้จากตัวแปร BMSGlobalTS.values['HN'] , BMSGlobalTS.values['VN']

ต้อง uses HOSxPDMU ด้วยนะ
ต่อไปก็จะต้องไปหา xe_app_script_id มาใช้ ก็เปิดตาราง xe_app_script มาดูก่อน (ตอนนี้ยังไม่มี UI ให้กำหนดค่า ต้องทำ manual ไปก่อน)
ในเครื่องผมเมื่อกี้ ได้ ID 170
เอา ID นี้ไปตั้งในตาราง xe_table_script ดังตัวอย่าง

table_name = patient  (ตอนนี้ตั้งได้ patient, ovst, ovst_doctor_sign) จะ run ตอน บันทึกข้อมูลคนไข้ / ส่งตรวจ / บันทึกจากระบบ Workbench
table_op = 2 (1 = รายการใหม่ , 2 = แก้ไขรายการ , 3 = ลบรายการ)
run_before = N ( Y = ทำงานการบันทึก / ลบ , N = ทำงานหลังจากบันทึก / ลบ)
ตัวอย่าง script ใน DPR

Program BMSScriptMainProgram1;

uses SysUtils, Variants, Classes, Controls, Forms, Dialogs, StdCtrls, HOSxPDMU;

var
  s: string;
  i: integer;

begin

  s := BMSGlobalTS.values['HN'];

  if s = '' then
  begin
    s := ShowFindHNDialog;
  end;

  if s = '' then
    exit;

  i := getsqldata('select count(*) from ovst where hn = "' + s + '"');

  showmessage('hello ! this is patient HN Edit Script ' + s + ' Visit Count = '
    + inttostr(i));

end.
ตัวอย่างหน้าจอตอน script ทำงาน
เนื่องจากมันเป็น script มันจะถูก compile และ cache เอาไว้ตอน run ครั้งแรก ดังนั้นหากต้องการแก้ไข script และทดสอบ ต้องออกจากโปรแกรมแล้วเข้าใหม่จึงจะเห็น script ตัวใหม่นะ



ผมมา Update ระบบ Script เมื่อวานนี้ครับ หลังจากนั่งแก้ bug และเพิ่ม feature เล็กๆน้อยๆ มาทั้งวัน

14:48 ชัยพร สุรเตมีย์กุล อันดับแรก ระบบ Script จะทำงานอยู่ 4 Phase คือ

Phase I : หลังจากที่ระบบ Load ข้อมูลมาแสดง (นึกถึงหน้าจอเวชระเบียนที่ใส่ HN เสร็จ แล้วระบบแสดงข้อมูลคนไข้เสร็จ) จะเขียนให้นำข้อมูลอื่นๆ ที่เกียวข้องกัน หรือตรวจสอบข้อมูลใน Phase นี้ได้
Phase II : ก่อนที่จะทำการบันทึกข้อมูล เขียนให้ตรวจสอบข้อมูลว่าสมบูรณ์ หรือไม่
Phase III : หลังจากที่บันทึกข้อมูลเสร็จแล้ว อาจจะเขียนให้ทำการ cleaning ข้อมูลอื่นๆ หรือทำงานอื่นๆใน Phase นี้ได้อีก

14:48 ชัยพร สุรเตมีย์กุล Phase IV : ก่อนที่จะทำการลบข้อมูล

อย่างที่ 2 เพื่อที่จะให้ระบบ Script เข้าถึง Dataset ในหน้าจอที่ User กำลังแก้ไขได้ ผมจึงประกาศ Global Variable ชื่อ CurrentHostScriptDataSet ซึ่ง Script สามารถเข้าถึงตัวแปรนี้ได้ หลังจาก uses HOSxPDMU unit จะเป็น dataset ตัวเดียวกับที่แสดงข้อมูลในหน้าจอปัจจุบัน

มาดูตัวอย่าง Script ที่ผมเขียนให้แสดงข้อมูลใน Phase I กันนะครับ

Program BMSScriptMainProgram1;

uses SysUtils, Variants, Classes, Controls, Forms, Dialogs, StdCtrls, DB,DBClient, HOSxPDMU;

var
  s: string;
  i: integer;   
                   


begin



 
  if assigned(CurrentHostScriptDataSet) then
  if CurrentHostScriptDataSet.active then
  if CurrentHostScriptDataSet.recordcount>0 then
  begin                                                                 

    s:= CurrentHostScriptDataSet.fieldbyname('hn').asstring;

    showmessage('CurrentHostScriptDataSet assigned ! : '+CurrentHostScriptDataSet.fieldbyname('hn').asstring);
 
 
     i := getsqldata('select count(*) from ovst where hn = "' + s + '"');

   showmessage('hello ! this is patient HN Info Script ' + s + ' Visit Count = '
    + inttostr(i));

  end;



end.








รูป 1








14:54 ชัยพร สุรเตมีย์กุล Phase I Script ต้องกำหนด table_op เป็น 4 ครับ (มันมาทีหลัง)
14:55 ชัยพร สุรเตมีย์กุล ตอนนี้ระบบ Script จะมีปัญหากวนใจอยู่นิดเดียว คือ ตอนที่มันทำงานครั้งแรกจะรอนานหน่อย ถ้าเครื่องช้า อาจจะต้องรอนานเป็น 10 วินาที ถ้าเครื่องเร็วก็อึดใจเดียว
14:56 ชัยพร สุรเตมีย์กุล ผมเพิ่มตาราง opdscreen , person ให้ระบบ script สามารถทำงานได้ในหน้าจอที่เกียวข้องแล้วครับ สามารถทดสอบได้ใน HOSxP XE / PCU XE version ล่าสุด
15:10 ชัยพร สุรเตมีย์กุล มาดูอีกเรื่องครับ คือการ Load Form ขึ้นมาแสดงจากระบบ Script
15:11 ชัยพร สุรเตมีย์กุล ระบบ Script ใน V3 เป็นระบบ Script เดี่ยวๆ ที่เรียกใช้ได้เฉพาะ function ของ unit ของระบบ หรือเฉพาะ function ที่อยู่ใน file เดียวกัน แต่ใน V4 ได้ปรับปรุงให้สามารถออกแบบหน้าจอแยกจากกัน แล้ว load มาแสดงใน Script ไหน ก็ได้ครับ







ผมสร้าง Form ใหม่ แล้วตั้งชื่อ Form ว่า MyPatientInfoForm1 ซึ่งชื่อนี้จะถูกนำไปตั้งชื่อ Module ให้โดยอัตโนมัติ














ถ้าดูใน tab PAS จะให้ว่าโปรแกรมตั้งชื่อ Unit ให้อัตโนมัติ ด้วยการนำชื่อ Module + Unit จะได้ชื่อ Unit คือ MyPatientInfoForm1Unit ซึ่งหลังจากบันทึกแล้ว เราสามารถใช้ uses unit นี้ ใน Script ตัวอื่นได้ครับ





กลับมาที่ Script แรกของเรา ผมแก้ไขใหม่ตามนี้

Program BMSScriptMainProgram1;

uses SysUtils, Variants, Classes, Controls, Forms, Dialogs, StdCtrls, DB,DBClient, HOSxPDMU,MyPatientInfoForm1Unit;

var
  s: string;
  i: integer;   
                   
  fm : TMyPatientInfoForm1;

begin



 
  if assigned(CurrentHostScriptDataSet) then
  if CurrentHostScriptDataSet.active then
  if CurrentHostScriptDataSet.recordcount>0 then
  begin                                                                 

    s:= CurrentHostScriptDataSet.fieldbyname('hn').asstring;

    showmessage('HN xxxxx : '+CurrentHostScriptDataSet.fieldbyname('hn').asstring);
 
 
     i := getsqldata('select count(*) from ovst where hn = "' + s + '"');

   showmessage('hello ! this is patient HN Info Script ' + s + ' Visit Count = '
    + inttostr(i));     
 
    fm:=TMyPatientInfoForm1.create(application);
    fm.showmodal;
    fm.free;

  end;



end.







เพิ่ม uses MyPatientInfoForm1Unit ที่ด้านบน และประกาศตัวแปร fm เป็น class TMyPatientInfoForm1 แล้วทำการสร้างและให้แสดงขึ้นมาตอนท้ายๆ ของ script







15:20 ชัยพร สุรเตมีย์กุล ตัวอย่าง video ตอนที่ script ทำงานครับ
15:26 ชัยพร สุรเตมีย์กุล คราวนี้ กลับไปแก้ Form ของเราใหม่ เพิ่มช่องแสดงข้อมูลตามรูป ผมให้ Link กับ field pname, fname และ lname






15:26 ชัยพร สุรเตมีย์กุล ผ่าน datasource1
15:27 ชัยพร สุรเตมีย์กุล เขียน Event onShorw ของ form เป็น

procedure FormShow(Sender: TObject);
begin
  datasource1.dataset:=CurrentHostScriptDataSet;
end;







เมื่อ Script ทำงาน ก็จะสามารถนำข้อมูลก่อนที่จะถูกบันทึกมาตรวจสอบได้อีกครั้ง








PCU XE จะเข้าระบบ Form Designer ได้จากเมนู Tools -> Data -> Form Designer นะครับ






อีกปัญหาที่เจอใน v3 ก็คือ จะทราบได้อย่างไรว่ามี function อะไรให้เรียกใช้ได้บ้าง ผมก็เลยเพิ่ม Tab Code Explorer มาให้กดดูว่าในระบบ script ของเรานั้น รู้จัก Unit อะไร และในแต่ละ Unit มี Function อะไรให้เรียกใช้ได้บ้างครับ ปกติก็คล้ายๆ กับ v3 นะครับ พวก HOSxP_GetDataSet / UpdateDelta และ อื่นๆ ครับ






ปี 2020 (2563) บนความกลุ่มนี้สำหรับการเตรียมความพร้อม HOSxPXE PCU หรือ PCU XE

บนความกลุ่มนี้สำหรับการเตรียมความพร้อม   HOSxPXE PCU  หรือ  PCU XE 
ปี 2020
1 .  ฐ้านข้อมูล  MySQl หรือ PostSQL
2.