2022年10月31日 星期一

jQuery - $("#my_id") - $(".my_class") - $("h1") - $的用法

1>jQuery 是什麼 ?

jQuery 是一個 JavaScript 函式庫 (Javascipt Framework)
主要目的就跟 Logo 上面寫的精神一樣:「write less, do more
由於如果要直接用 Javascript 將所有功能實作出來,常常要費時費力且造成大量且難以閱讀的程式碼,更嚴重者,有於瀏覽器之間的差異,常常要針對不同瀏覽器寫不同的程式碼,讓程式碼維護的難度大為提升。
jQuery 就是一個讓你加速網頁程式開發速度的工具
如何有效率的產出大量的 javascript 與 ajax ,就是 jQuery 所主打的目標。

其中的 $() 符號就是 jQuery 常用的選擇器善用選擇器可以快速找到網頁當中的物件,不知道各位有沒有感受到 jQuery 的威力了呢 ?

Ex:

整個流程應該會是 (1) 找出所有 input 元素 (2) 當元素是 radio button 且屬於某個 group (3) 確認某個選項已經被勾選了 (4) 將勾選的值指派給 checkValue 變數

1>傳統寫法:
var checkValue;
var elements = document.getElementsByTagName(‘input’);
for (var n = 0; n < elements.length; n++){
if (elements[n].type == ‘radio’ && elements[n].name == ‘RadioGroup’ && elements[n].checked){
checkedValue = elements[n].value;
}
-->
    document.getElementById()                 $("#my_id")
     document.getElementsByTagName()         $("h1")                      $("input")
     document.getElementsByClassName()       $(".my_class")  

2>jQuery寫法:

    $("[name='RadioGroup']")
    $("#my_id").click();


3> 引用 jQuery
1>>第一種是將js檔案下載下來,並在html的<head></head>中定義使用下載的js檔案。
<head>
<script src="jquery-3.1.1.min.js"></script>
</head>

2>>直接引用 網路的 jQuery

第二種是使用Content Delivery Network (CDN),直接引用網路上的js檔案。網路上有很多CDN可以使用,如:google或微軟,如果使用google的CDN:

<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
</head>

如果使用微軟的CDN:

<head>
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.1.1.min.js"></script>
</head>


2>jQuery的基本語法是: $(selector).action()
$(this).hide() - hides the current element.
  $("p").hide() - hides all <p> elements.
  $(".test").hide() - hides all elements with class="test".
  $("#test").hide() - hides the element with id="test".






1$的含义

JS应用库JQUERY的作者将 $ 做为一个自定义函数名,这个函数是获取指定网页元素的函数。

1

2

3

function $(Nid){

return document.getElementById(Nid);

}

2、简单用法

这里介绍三种简单的使用方法。

2.1$(expresion)

$()可以是 $(expresion),即css选择器、Xpathhtml元素,也就是通过上述表达式来匹配目标元素。

2.2$(element)

$()可以是 $(element),即一个特定的DOM元素。如常用的DOM对象有documentlocationform等。

2.3$(function)

$()可以是$(function),即一个函数,它是 $(document).ready()的一个速记方式。

1

2

3

$(document).ready(function(){

alert("Hello world!");

});

可以写作:

1

2

3

$(function(){

alert("Hello world!");

});

 


Array 及 Object 的宣告, 及新增元素, 取得元素值處理

 目的: Array 及  Object 的宣告, 及新增元素 取值處理

處理說明:  1>Array  及 Object 的宣告
                       var Tmp_Ary=[];      //宣告 Array   
                       var Tmp_Obj={};     //宣告 Object

                   2>Array 及 Object 設定值
                       var Tmp_len=0;
                       for (var i=1; i<=5;i++)
                       { 
                           Tmp_len=Tmp_Ary.push(i) //傳回目前 Tmp_Ary.length
                           //Tmp_Ary[Tmp_len-1]=整數,並非Object ,所以無法設定property(newSet)
                           Tmp_Ary[Tmp_len - 1].newSet = i;    //undefined
                        } 
                       
                        Tmp_Obj = {
                             name: "蔡聰進",
                             gender: "男",
                        };             
                        Tmp_Obj.newSet=1;  //新增  Object 的屬性,直接 Assing 即可 

                        Tmp_len=Tmp_Ary.push(Tmp_Obj) ;
                        //Tmp_Ary[Tmp_len-1] 為 Object ,所以可以設定 property(newSet2) , 取值也會正常
                        Tmp_Ary[Tmp_len-1].newSet2=2;  

                   3>Array 及 Object 取值 
                       var Tmp_Ary=[1,2,3,4,5] ;
                       var  Tmp_Obj={
                               name: "蔡聰進",
                               gender: "男",
                               newSet: 1,
                               }
                      var Tmp_Str="";
                       //取得  Array 元素值_1  for 
                      for (var i=0; i<=Tmp_Ary.length-1;i++)
                     { 
                         Tmp_Str="Tmp_Ary[i]="+Tmp_Ary[i];
                        console.log(Tmp_Str) ;
                      }
                      //取得  Object property值  for 
                     for (var prop in Tmp_Obj)
                     {
                        Tmp_Str="Tmp_Obj["+prop +"]="+Tmp_Obj[prop];
                        console.log(Tmp_Str) ;
                      }

                      //取得  Array元素值_2  Ext.each
                      Ext.each(Tmp_Ary, functon(item,index){
                        Tmp_Str="Tmp_Ary["+index+"]="+item;
                        console.log(Tmp_Str) ;
                      });


實際案例:
                    var Tmp_Ary = [];
                    var Tmp_Obj = {};
                    var cur_recs = Ext.getCmp('grid_Single').getView().getSelectionModel().getSelection();
                    var cur_rec;
                    if (cur_recs.length > 0) {
                        cur_rec = cur_recs[0];
                        Tmp_Ary.push(cur_rec);
                        cur_rec.newSet = 0;
                    }
                    console.log("cur_rec.newSet:", cur_rec.newSet);
            console.log("Tmp_Ary[Tmp_Ary.length-1].newSet:", Tmp_Ary[Tmp_Ary.length - 1].newSet);
                    console.log("0 Tmp_Ary.length:", Tmp_Ary.length);
                    //mysuccessalert("cur_rec.newSet:" + cur_rec.newSet.toString());                    
                    var Tmp_len;
                    var Tmp_Str = "";

                   //0.5
                    for (var i = 1; i <= 5; i++) {                     
                        Tmp_len = Tmp_Ary.push(i);
                        console.log("0.5 Tmp_len:", Tmp_len);
                        Tmp_Ary[Tmp_len - 1].newSet = i;
                        //因 Tmp_Ary[Tmp_len - 1]=整數,非 Object , 所以,newSet undefined
                        console.log("0.5  Tmp_Ary[Tmp_len - 1].newSet:", Tmp_Ary[Tmp_len - 1].newSet);
                    }
                    for (var i = 1; i <= 5; i++) {
                        var Tmp_Obj1 = {};
                        Tmp_Obj1.value = i;
                        Tmp_len = Tmp_Ary.push(Tmp_Obj1);
                        console.log("1 Tmp_len:", Tmp_len);
                        //因 Tmp_Ary[Tmp_len - 1]= Object , 所以,newSet 可存值
                        Tmp_Ary[Tmp_len - 1].newSet = i;    
                        console.log("1  Tmp_Ary[Tmp_len - 1].newSet:", Tmp_Ary[Tmp_len - 1].newSet);
                    }
                    console.log("1 Tmp_Ary.length:", Tmp_Ary.length);
     
                    //1.5
                    //item 為 Array 元素
                    Ext.each(Tmp_Ary,
                        function (item, index) {
                            console.log("1.5 index:", index);
                            Tmp_Str = " 1.5  Tmp_Ary[index]=" + Tmp_Ary[index];
                            console.log(Tmp_Str);
                            Tmp_Str = " 1.5  Tmp_Ary[index].newSet=" + Tmp_Ary[index].newSet;
                            console.log(Tmp_Str);
                    )  
 
                    //1.8     
                    for (var index in Tmp_Ary) {
                        Tmp_Str = " 1.8  index=" + index;
                        console.log(Tmp_Str);
                        Tmp_Str = " 1.8  Tmp_Ary[index].newSet=" + Tmp_Ary[index].newSet;
                        console.log(Tmp_Str);
                    }
                    
                    //1.9  
                    Tmp_Str = " 1.9  Tmp_Ary.length=" + Tmp_Ary.length;
                    console.log(Tmp_Str);                     
                    for (var index = 0; index < Tmp_Ary.length ; index++) {
                        Tmp_Str = " 1.9  index: " + index;
                        console.log(Tmp_Str);
                        Tmp_Str = " 1.9  Tmp_Ary[index].newSet=" + Tmp_Ary[index].newSet;
                        console.log(Tmp_Str);
                    }
                    Tmp_Obj = {
                        name: "蔡聰進",
                        gender: "男",
                    };                 
                    Tmp_Obj.newSet = 1;

                    //2  
                    for (var item in Tmp_Obj) {
                        Tmp_Str = "2 Tmp_Obj[" + item + "] is " + Tmp_Obj[item];
                        console.log(Tmp_Str);
                    }

輸出結果:
0 Tmp_Ary.length: 1
0.5 Tmp_len: 2
0.5  Tmp_Ary[Tmp_len - 1].newSet: undefined
0.5 Tmp_len: 3
0.5  Tmp_Ary[Tmp_len - 1].newSet: undefined
0.5 Tmp_len: 4
0.5 Tmp_Ary[Tmp_len - 1].newSet: undefined
0.5 Tmp_len: 5
0.5  Tmp_Ary[Tmp_len - 1].newSet: undefined
0.5 Tmp_len: 6
0.5  Tmp_Ary[Tmp_len - 1].newSet: undefined

1 Tmp_len: 7
1  Tmp_Ary[Tmp_len - 1].newSet: 1
1 Tmp_len: 8
1  Tmp_Ary[Tmp_len - 1].newSet: 2
1 Tmp_len: 9
1  Tmp_Ary[Tmp_len - 1].newSet: 3
1 Tmp_len: 10
1  Tmp_Ary[Tmp_len - 1].newSet: 4
1 Tmp_len: 11
1  Tmp_Ary[Tmp_len - 1].newSet: 5
1 Tmp_Ary.length: 11

1.5 index: 0
1.5  Tmp_Ary[index]=[object Object]
1.5  Tmp_Ary[index].newSet=0
1.5 index: 1
1.5  Tmp_Ary[index]=1
1.5  Tmp_Ary[index].newSet=undefined
1.5 index: 2
1.5  Tmp_Ary[index]=2
1.5  Tmp_Ary[index].newSet=undefined
1.5 index: 3
1.5  Tmp_Ary[index]=3
1.5  Tmp_Ary[index].newSet=undefined
1.5 index: 4
1.5  Tmp_Ary[index]=4
1.5  Tmp_Ary[index].newSet=undefined
1.5 index: 5
1.5  Tmp_Ary[index]=5
1.5  Tmp_Ary[index].newSet=undefined
1.5 index: 6
1.5  Tmp_Ary[index]=[object Object]
1.5  Tmp_Ary[index].newSet=1
1.5 index: 7
1.5  Tmp_Ary[index]=[object Object]
1.5  Tmp_Ary[index].newSet=2
1.5 index: 8
1.5  Tmp_Ary[index]=[object Object]
1.5  Tmp_Ary[index].newSet=3
1.5 index: 9
1.5  Tmp_Ary[index]=[object Object]
1.5  Tmp_Ary[index].newSet=4
1.5 index: 10
1.5  Tmp_Ary[index]=[object Object]
1.5  Tmp_Ary[index].newSet=5

1.8  index=0
1.8  Tmp_Ary[index].newSet=0
1.8  index=1
1.8  Tmp_Ary[index].newSet=undefined
1.8  index=2
1.8  Tmp_Ary[index].newSet=undefined
1.8  index=3
1.8  Tmp_Ary[index].newSet=undefined
1.8  index=4
1.8  Tmp_Ary[index].newSet=undefined
1.8  index=5
1.8  Tmp_Ary[index].newSet=undefined
1.8  index=6
1.8  Tmp_Ary[index].newSet=1
1.8  index=7
1.8  Tmp_Ary[index].newSet=2
1.8  index=8
1.8  Tmp_Ary[index].newSet=3
1.8  index=9
1.8  Tmp_Ary[index].newSet=4
1.8  index=10
1.8  Tmp_Ary[index].newSet=5


1.9  Tmp_Ary.length=11
1.9  index: 0
1.9  Tmp_Ary[index].newSet=0
1.9  index: 1
1.9  Tmp_Ary[index].newSet=undefined
1.9  index: 2
1.9  Tmp_Ary[index].newSet=undefined
1.9  index: 3
1.9  Tmp_Ary[index].newSet=undefined
1.9  index: 4
1.9  Tmp_Ary[index].newSet=undefined
1.9  index: 5
1.9  Tmp_Ary[index].newSet=undefined
1.9  index: 6
1.9  Tmp_Ary[index].newSet=1
1.9  index: 7
1.9  Tmp_Ary[index].newSet=2
1.9  index: 8
1.9  Tmp_Ary[index].newSet=3
1.9  index: 9
1.9  Tmp_Ary[index].newSet=4
1.9  index: 10
1.9  Tmp_Ary[index].newSet=5

2 Tmp_Obj[name] is 蔡聰進
2 Tmp_Obj[gender] is 男
2 Tmp_Obj[newSet] is 1

2022年10月27日 星期四

V20107 – 若有新增/修改, 則 MD不可再跳到其他筆資料 - selectionchange - beforedeselect

 目的: V20107 – 編輯 – MDD – 子步序說明 若有新增/修改, MD不可再跳到其他筆資料

處理說明:  1>判斷 MDD- grid_D1 是否有異動資料
                       if (Ext.getCmp('grid_D1').store.tempData.length > 0) {
                       }
                    2>在 grid_D 的 beforedeselect event (目前選擇的資料 deselect 時)
                        判斷 grid_D1 是否有異動資料, 若有,則不允許選擇( return false)
                       Ext.getCmp('grid_D').on("beforedeselect", function (me, record, index, eOpts) {
                      })

                    



1>*.js
 Ext.getCmp('grid_D').on("beforedeselect", function (me, record, index, eOpts) {
        //若 M-D-D(grid_D1) 已有新增/修改/刪除,則不允許 grid_D 跳至另一筆資料
        if (Ext.getCmp('grid_D1').store.tempData.length > 0) {
            var Tmp_Str = "";            
            Tmp_Str = Tmp_Str+"子步序說明的資料已有異動<br>"
                + " 不可移動至另一工作步序說明<br>"
                + "請先按[存檔]鈕<br>"
                + "再移動步序說明";
            mysuccessalert(Tmp_Str);
            return false;
        }
    }); // beforedeselect
--> 

  不可選   beforeselect event  
  --> 因為beforeselect event 時,目前選擇資料已不被選擇(deselect) ,
        若不符 return false, grid_D 會無選擇資料

2022年10月26日 星期三

V20107 – [刪除]鈕, 除刪除主檔外, 連明細檔一起刪除 or [刪除]鈕, 只刪除主檔, 顯示訊息 " 明細檔必需先刪除,才可刪主檔

目的: V20107 – [刪除]鈕, 除刪除主檔外, 連明細檔一起刪除   (Default)

           or  [刪除]鈕,  只刪除主檔, 顯示訊息 " 明細檔必需先刪除,才可刪主檔

處理說明: 1> [刪除]鈕, 除刪除主檔外, 連明細檔一起刪除   (Default)

                  2>  [刪除]鈕,  只刪除主檔, 顯示訊息 " 明細檔必需先刪除,才可刪主檔


1>*.js
  1>> [刪除]鈕, 除刪除主檔外, 連明細檔一起刪除   (Default)
          不需額外處理

  2>> [刪除]鈕, 只刪除主檔外, 若仍有明細檔,則不允許刪除
        Ext.getCmp("btn_del").delMessage = "確定要刪除本筆工作程序主檔嗎 ?<br>"
                                                                   + "請先刪除子步序資料,才可刪除主檔資料<br> ";


    //主檔.[刪除]前,先判斷子Table 是否有資料,
    //若有的顯示訊息,請先刪除子Table資枓
    Ext.getCmp("btn_del").beforeDel = function () {
        var Tmp_grid_D1 = Ext.getCmp("grid_D1");
        var Tmp_grid_D = Ext.getCmp("grid_D");
        var Tmp_Str = "";
        if (!checkisnull(Tmp_grid_D1) && !checkisnull(Tmp_grid_D)) {
            if ((Tmp_grid_D1.store.getCount() > 0) || (Tmp_grid_D.store.getCount() > 0)) {
                Tmp_Str = "主工作程序還有明細資料(子步序), 不可刪除主工作程序資料<br>"
                    + "請先刪除主工作程序明細資料(步序說明/子步序說明)<br>"
                    + "才可刪除主工作程序資料";
                mywarnalert(Tmp_Str);
                return false;
            }
        }
    }



2>*.cs
  1>> [刪除]鈕, 除刪除主檔外, 連明細檔一起刪除   (Default)
       [HttpPost]
        public void Delete()
        {
            var c = System.Web.HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            string[] arrCondition;
            //string[] arrCondition = getPK("AMM_WKSTPDD"); //需修改成指定的key
             //除刪除主檔外, 連明細檔一起刪除   (Default)
            arrCondition = getPK("AMM_WKSTP"); //需修改成指定的key
            excuteDelete(nvc, "AMM_WKSTPDD", arrCondition);

            //arrCondition = getPK("AMM_WKSTPD"); //需修改成指定的key
            arrCondition = getPK("AMM_WKSTP"); //需修改成指定的key
            excuteDelete(nvc, "AMM_WKSTPD", arrCondition);

            arrCondition = getPK();
            excuteDelete(nvc, DBTable, arrCondition);
        }

      2>> [刪除]鈕, 只刪除主檔外, 若仍有明細檔,則不允許刪除
        [HttpPost]
        public void Delete()
        {
            var c = System.Web.HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            string[] arrCondition;          

            arrCondition = getPK();
            excuteDelete(nvc, DBTable, arrCondition);
        }

V20107 – 編輯畫面 – [件號]欄位離開時 , 自動取得件號名稱 - listeners - blur - event

 目的: V20107 – 編輯畫面 – [件號]欄位離開時 , 自動取得件號名稱  - listeners - blur

處理說明:   1>直接在[PN]宣告時,加入觸發 event blur
     {id: "PN", name: "PN", xtype: "textfield", width: 320, padding: "0 4 0 0", maxLength: 32,
                     listeners: {
       blur: function () {  //件號離開時,自動取得件號中文名稱 & 英文名稱
                           console.log("call PN on blur 2");
                         }

                    2> 於程式加入 eventhandler .on("blur", function(){});
                          Ext.getCmp('PN').on("blur", function (me, event, eOpts) {

                          });  // end of Ext.getCmp("PN").on("blur", function (me, event, eOpts) {  


1>*.js

id: "PN", name: "PN", xtype: "textfield", width: 320, padding: "0 4 0 0", maxLength: 32,
listeners: {
blur: function () {  //件號離開時,自動取得件號中文名稱 & 英文名稱
//public HttpResponseMessage get_PNNM(string PN)
      console.log("call PN on blur 2");
var Tmp_PN = Ext.getCmp('PN').getValue();
console.log("Tmp_PN:", Tmp_PN);
var Tmp_Sql;
if (checkisnull(Tmp_PN)) {
return;
}
var np = {};
Ext.Ajax.request({
     url: '../../api/V20107API/get_PNNM?PN=' + Tmp_PN,
method: 'POST',
            async: false,
//standardSubmit: true, // 非 Ajax 的方式  //若要傳送檔案至前端, standardSubmit必需設為 true 
      params: np,
success: function (response, opts) {
console.log("success response.responseText:", response.responseText);
var obj = Ext.decode(response.responseText);
console.log("obj:", obj);
if (obj["success"]) {
console.log(' 取得件號名稱 !!');
var Tmp_CNM = obj["CNM"];
var Tmp_ENM = obj["ENM"];
//mysuccessalert(Tmp_Str);
console.log("success=true , Tmp_CNM=", Tmp_CNM);
console.log("success=true , Tmp_ENM=", Tmp_ENM);
Ext.getCmp("CNM").setValue(Tmp_CNM);
Ext.getCmp("ENM").setValue(Tmp_ENM);
}
else {
Tmp_Str = "取得件號名稱失敗!! <br>"
+ obj["Rtn_Msg"];
mywarnalert(Tmp_Str);
}
},
failure: function (response, opts) {
var obj = Ext.decode(response.responseText);
console.log("obj:", obj);
Tmp_Str = "取得件號名稱失敗!! < br > "
+ obj["Rtn_Msg"];
mywarnalert(Tmp_Str);
} // end of failure 
});  // end of Ext.Ajax
}  //end  of blur
*/
}  // end of listeners


Ext.getCmp('PN').on("blur", function (me, event, eOpts) {
        console.log("call PN on blur 1");
        var Tmp_PN = Ext.getCmp('PN').getValue();
        console.log("Tmp_PN:", Tmp_PN);
        var Tmp_Sql;
        if (checkisnull(Tmp_PN)) {
            return;
        }
        var np = {};
        Ext.Ajax.request({
            url: '../../api/V20107API/get_PNNM?PN=' + Tmp_PN,
            method: 'POST',
            async: false,
            //standardSubmit: true, // 非 Ajax 的方式  //若要傳送檔案至前端, standardSubmit必需設為 true 
            params: np,
            success: function (response, opts) {
                console.log("success response.responseText:", response.responseText);
                var obj = Ext.decode(response.responseText);
                console.log("obj:", obj);
                if (obj["success"]) {
                    console.log(' 取得件號名稱 !!');
                    var Tmp_CNM = obj["CNM"];
                    var Tmp_ENM = obj["ENM"];
                    //mysuccessalert(Tmp_Str);
                    console.log("success=true , Tmp_CNM=", Tmp_CNM);
                    console.log("success=true , Tmp_ENM=", Tmp_ENM);
                    Ext.getCmp("CNM").setValue(Tmp_CNM);
                    Ext.getCmp("ENM").setValue(Tmp_ENM);
                }
                else {
                    Tmp_Str = "取得件號名稱失敗!! <br>"
                        + obj["Rtn_Msg"];
                    mywarnalert(Tmp_Str);
                }
            },
            failure: function (response, opts) {
                var obj = Ext.decode(response.responseText);
                console.log("obj:", obj);
                Tmp_Str = "取得件號名稱失敗!! < br > "
                    + obj["Rtn_Msg"];
                mywarnalert(Tmp_Str);
            } // end of failure 
        });  // end of submit
    });  // end of Ext.getCmp("PN").on("blur", function (me, event, eOpts) {



V20107 – Master[存檔]完成, 自動重新顯示 Detail資料 - fireEvent

 目的: V20107 – Master[存檔]完成,自動新增 4 Detail資料並重新顯示 Detail資料

處理說明: 1>fireEvent("eventName", event_param1,event_param2,event_param3,...);

Ex: selectionchange( this, selected, eOpts )
       傳入參數如下: 
         this : Ext.selection.Model
         selected : Ext.data.Model[]  ,          The selected records
         eOpts : Object

       --> fireEvent("selectionchange",this,selected,eOpts);0

  Ex:  Ext.getCmp('grid_M').fireEvent("selectionchange", Ext.getCmp("grid_M").getSelectionModel(),cur_recs);


1>*.js

 //先執行 Template 的 onClick , 再執行 V20107 的 onClick

    Ext.getCmp('btn_save').on('click', function () {

        //若 checkFormValue 有問題,則 is_Keepgoing=false , 不往下執行

        if (is_keepgoing==false)

            return ;

        console.log('step 1 click_btn_save of V20107');

        if (!check_AMM_WKSTPD_isnull()) {

            console.log("if !check_AMM_WKSTPD_isnull() , return ");

            return ;   // AMM_WKSTPD 已有資料,不新增 4筆資料

        }

        //若 AMM_WKSTPD 為空值,則詢問是否為系統件維修,

        //若是,則  INSERT_AMM_WKSTPD4  ,寫入 4筆資料

        console.log("3 詢問是否為系統件維修嗎?");

        var Tmp_Msg = "本交修件為系統件維修嗎 ?";

        Ext.Msg.confirm('確認', Tmp_Msg, callBackFunc);

        function callBackFunc(id) {

            console.log("1 callBackFunc : 本交修件為系統件維修嗎 ?");

            if (id == 'no')

                return;

            //insert 四筆資料   AMM_WKSTPD

            var np = {};

            np["MITM"] = Ext.getCmp("MITM").getValue();

            np["PN"] = Ext.getCmp("PN").getValue();

            np["DEPID"] = Ext.getCmp("DEPID").getValue();

            np["WC"] = Ext.getCmp("WC").getValue();

            var is_Ok = true;

            Ext.Ajax.request({

                method: "POST",

                url: '../../api/V20107API/DO_Ins_AMM_WKSTPD4',

                params: np,

                async: false,

                success: function (response, opts) {

                    console.log("0 response.responseText=", response.responseText);

                    var Tmp_Obj = Ext.decode(response.responseText);

                    console.log("1  Tmp_Obj=", Tmp_Obj);

                    if (Tmp_Obj["success"] == true) {

                        var Tmp_Rtn_Msg = "自動新增4筆工作步序說明資料(AMM_WKSTPD)<br>"

                            + "- 進廠檢測,拆檢,組裝,完工測試<br>";

                        + Tmp_Obj["Rtn_Msg"];

                        mysuccessalert(Tmp_Rtn_Msg);

                        is_Ok = true;

                        console.log(" 5 Ext.getCmp('grid_M').fireEvent(selectionchange) ");

                        //Ext.getCmp('grid_M').fireEvent("selectionchange",);

                            //("selectionchange", function (view, selections, options) {

                        var cur_recs = Ext.getCmp("grid_M").getSelectionModel().getSelection();    

                    Ext.getCmp('grid_M').fireEvent("selectionchange", Ext.getCmp("grid_M").getSelectionModel(),cur_recs);

                    }

                    else {

                        var Tmp_Rtn_Msg = "自動新增4筆工作步序說明資料(AMM_WKSTPD)失敗<br>"

                            + "- 進廠檢測,拆檢,組裝,完工測試<br>"

                            + "請檢核!! <br>"

                            + Tmp_Obj["Rtn_Msg"];

                        mywarnalert(Tmp_Rtn_Msg);

                        is_Ok= false;

                    }

                },  //end of success                

                failure: function (response, opts) {

                    var Tmp_Obj = Ext.decode(response.responseText);

                    var Tmp_Rtn_Msg = "新增4筆工作步序說明資料(AMM_WKSTPD)失敗<br>"

                        + "請檢核<br>"

                        + Tmp_Obj["Rtn_Msg"];

                    mywarnalert(Tmp_Rtn_Msg);

                    is_Ok= false;

                }

            })  //end of Ext.Ajax.Request       

            return is_OK;

        };  // end of callBackFunc(id)

    })  //Ext.getCmp('btn_save').on('click', function () {