วันพฤหัสบดีที่ 6 มกราคม พ.ศ. 2554

05. วิธีทำ Progress Bar

ตัวอย่างหน้าจอประมวลผลปิดสิ้นวัน เช่น w_dlg_dp_dayproc_wizard_new.aspx

ขั้นตอนการสร้าง
1. เปิด Project WebService

2. สร้าง Class สำหรับงานประมวลผล 1 Class ในโฟลเดอร์ Processing ตัวอย่างเช่น
public class DpCloseDayProgress : MainProgressRunning
ตัวอย่างนี้ใช้ Class ชื่อ DpCloseDayProgress
(กรุณาเปิดดูไฟล์นี้ประกอบด้วย) โดยต้อง Inherit Class MainProgress และ Interface Runningจากนั้นทำการ Implement Interface Running จะได้ method Disconnect() GetProgress() และ Run()

3. ประกาศตัวแปร Instance ที่จำเป็นต้องใช้คือ
     private n_cst_deposit_service svDep;
       private n_cst_dbconnectservice svCon;
       private n_cst_progresscontrol svProgress;
       private bool isError = false;
* ตัวแปร svDep คือเซอร์วิสเงินฝากสำหรับประมวลผลปิดสิ้นวัน นอกนั้นต้องประกาศให้เหมือนกันทุกระบบ

4. สร้าง Constructor โดยรับ argument ตัวแรกคือ wsPass และตัวถัดไปคือ argument ที่จำเป็นสำหรับส่งให้ pbservice ใช้งาน

   //Argument
       private DateTime closeDate;
       private DateTime workDate;
       private String appName;
       private String branchId;
       private String entryId;
       private String machine;

       //Constructor
       public DpCloseDayProgress(String connectionString, DateTime closeDate, DateTime workDate,
       String appName, String branchId, String entryId, String machine) {  }
ภายใน Constructor จะเป็นการกำหนดค่าให้ตัวแปร Instance และประกาศตัวแปรจาก pbservice และจะต้องจบท้ายด้วยคำสั่ง SetRunning(this); เพื่อเป็นการระบุให้ class แม่รู้ว่าทำงานแบบ thread

5. สร้าง Destructor และเขียนคำสั่งใน method DisConnect() เพื่อทำการตัดการเชื่อมต่อ Database ในกรณีเกิดข้อผิดผลาด  Destructor จะช่วยตัดการเชื่อมต่อโดยอัตโนมัติ


//Destructor
~DpCloseDayProgress() {
DisConnect();
}

//Method Disconnect()
public void DisConnect() {
try {
svCon.of_disconnectdb();
} catch { }
}


6. ใน method Run() จะเป็นการเรียก PB Service (ในตัวอย่างนี้สร้าง method RunningThread() แยกไว้เพื่อไปเรียก PB Service อีกต่อหนึ่ง) หากเกิด Exception ทำการตั้งค่าเองเพราะ pbservice อาจไม่สามารถตั้งค่าเองขณะเกิด exception ได้

       public void Run() {
           if (thread != null) {
               try {
                   RunningThread();
                   DisConnect();
               } catch (Exception ex) {
                   DisConnect();
                   isError = true;
                   svDep.of_set_progresscontrol(ref svProgress);
                   progress = svProgress.of_get_progress();
                   progress.status = -1;
                   progress.progress_text = ex.Message;
               }
           }
       }

7. ใน Method GetProgress() เป็นการ return ค่าไปให้ฝั่ง UI เพื่อไปดูสถานะ และความคืบหน้าต่างๆ โดยในโคดมีการเช็คว่าหากเกิด error หรือ Exception ให้นำสถานะจากการดัก Exception ไปใช้ แต่ถ้าไม่ error ก็นำสถานะจาก pbservice ไปใช้

        public str_progress GetProgress() {
           if (isError) {
               return progress;
           } else {
               svDep.of_set_progresscontrol(ref svProgress);
               return svProgress.of_get_progress();
           }
       }
*** จบส่วนการสร้าง Class เพื่อรองรับการประมวลผล ***

8. สร้าง [WebMethod] ของ WebService เพื่อเรียกใช้การประมวลผล
    1. ประกาศตัวแปร(dp) object สำหรับประมวลผล โดยส่ง argument ที่ constructor ด้วย
    2. ใช้คำสั่ง Processing.Progressing.Add() โดย Add() มี argument เรียงตามนี้

    Add(Running running, String application, String w_sheet_id, bool isRemoveBefore)
          1. object สำหรับประมวลผล
          2. ชื่อระบบ
          3. ชื่อหน้าจอ
          4. กรณีหากมีการประมวลผลอยู่ให้หยุดประมวลผลเดิมอัตโนมัติ และทำการประมวลใหม่ โดยค่าที่ return ออกมาจะเป็นลำดับที่การประมวลผลปัจจุบัน

    [WebMethod]
       public int RunCloseDayProcess(String wsPass, String w_sheet_id, DateTime closeDate, DateTime workDate, String appName, String branchId, String entryId, String machine) {

           DpCloseDayProgress dp = new DpCloseDayProgress(wsPass, closeDate, workDate, appName, branchId, entryId, machine);
           int ii = Processing.Progressing.Add(dp, appName, w_sheet_id, true);
           return ii;

       }
*** จบส่วน WebService การประมวลผล ***

9. หน้าจอ UI สร้างการเรียกใช้งานปิดสิ้นวัน w_dlg_dp_dayproc_wizard_new.aspx
    1. สร้าง <asp:HiddenField ID="HdCloseday" runat="server" /> เพื่อเอาไว้เช็คว่าหลัง postback แล้วให้เปิด Iframe ดูสถานะหรือไม่
    2. สร้างฟังก์ชั่น JavaScript SheetLoadComplete() ทำการเช็คค่า HdCloseDay หากเป็น "true" ให้ใช้คำสั่ง

Gcoop.OpenProgressBar() โดยมี argument ดังนี้

Gcoop.OpenProgressBar(progressName, warnning, showCloseButton, extraFunction, extraWinId)
  1. progressName:String – ชื่อประมวลผลสำหรับ Display บนหน้า Iframe
  2. warnning:bool - ให้แสดงข้อความเตือนห้ามปิดหน้าจอหรือไม่
  3. showCloseButton:bool – ให้โชว์ปุ่มปิด Iframe ระหว่างประมวลผลหรือไม่
  4. extraFunction:object – หากกดปุ่มปิดแล้วให้ไปเรียกใช้ฟังก์ชั่นของ w_sheet โดยหากไม่ใส่ argument นี้หรือส่งค่า null ไปจะเป็นการปิด IFrame ธรรมดา
  5. extraWinId:String – ส่งค่าพิเศษกรณีหน้าจอ 1 หน้ามีการประมวลผลมากกว่า 1 หากไม่มีไม่ต้องใส่ argument หรือใส่ค่า null


               function SheetLoadComplete(){
         if(Gcoop.GetEl("HdCloseday").value == "true"){
            Gcoop.OpenProgressBar("ประมวลผลปิดสิ้นวัน", true, false, CloseDayFinish);
               }
             }
    1. หน้า Code Behind ที่ method WebSheetLoadBegin() ตั้งค่า HdCloseday.Value = "false";


           public void WebSheetLoadBegin() {
                   HdCloseday.Value = "false";
                   //................................................
               }

    1. ที่ method CheckJsPostBack(eventArg) หากมีการ postback จะไปเรียก JsPostCloseDay() เมื่อเรียกใช้ WebService การประมวลผล  ให้ตั้งค่า HdCloseday.Value = "true";


   private void JsPostCloseDay() {
           //......................................
           try {
               depService.RunCloseDayProcess(state.SsWsPass, state.CurrentPage, closeDate, state.SsWorkDate, state.SsApplication, state.SsBranchId, state.SsUsername, state.SsClientComputerName);
               HdCloseday.Value = "true";
           } catch (Exception ex) {
               LtServerMessage.Text = WebUtil.ErrorMessage(ex);
           }
       }

0 ความคิดเห็น:

แสดงความคิดเห็น