2022年9月12日 星期一

V80C03 - 顯示資料 - 分頁不正確

 目的: 顯示資料的分頁處理(RNK), RNK 必需為唯一, 即 order by 必需為 PK

處理說明:  1>*.cs 顯示資料的 SQL  , RNK 必需為唯一 , 即 order by 必需為 PK 



1>*.cs
[HttpPost]
        public dynamic getGridData_M(bool par_paging= true)
        {
        
Sql = " SELECT  RNK,     "
                          + " ACNO,SAPNO,AMMNO,ITM,PN,MOSM, PLANNINGCARD,AREA, TEAM,CRITCL,BSDT,BEDT,STAFF,HRS,STDHRS,DURAION,STARTDAY,ENDDAY,INSDT, CLS,  "
                            + "  GRP,FOREMAN1,TEAM,LDMAN1,EMPLYID,DT,CLSRM,PATCHMAN,ASHR,REMARK,PTY,CREWBOARDSDT "
                            + "  FROM  ( "
+"select  dense_rank()  over(order by  nvl(d.STARTVAL,d.ACNO),d.SAPNO,a.AMMNO,a.ITM,b.EMPLYID,b.DT) as RNK,"
//+ "select  dense_rank()  over(order by  nvl(d.STARTVAL,d.ACNO),d.SAPNO) as RNK,"   //非唯一,分頁會有問題
                                                   + "   nvl(d.STARTVAL,d.ACNO) as ACNO, d.SAPNO,d.PTY,d.CREWBOARDSDT, "
                                                   + "  a.AMMNO,a.ITM,a.PN,a.MOSM,a.PLANNINGCARD,a.AREA, a.TEAM,a.CRITCL,a.BSDT,a.BEDT,a.STAFF,a.HRS,a.STDHRS,a.DURAION,a.STARTDAY,a.ENDDAY,a.INSDT, a.CLS, "
                                                   + "  b.GRP,b.FOREMAN1,b.TEAM as bTEAM,b.LDMAN1,b.EMPLYID,b.DT,b.CLSRM,b.PATCHMAN,b.ASHR,b.REMARK "
                                       + "  from AMM_CREW a, AMM_SRO d,  "
                                                   + " (select    a.AMMNO,a.ITM,a.GRP,b.FOREMAN1,a.TEAM,c.LDMAN1,a.EMPLYID,a.DT,a.CLSRM,a.PATCHMAN,a.ASHR,a.REMARK  "
                                                   + "  from      AMM_CREWD a, AMM_CREWGRP b,AMM_CREWTEAM c "
                                                   + "   where   a.GRP = b.GRP and a.TEAM = c.TEAM) b  "
                                      + "   where  a.AMMNO = b.AMMNO(+)  "
                                      + "   and       a.ITM = b.ITM(+)   "
                                      + "   and      a.AMMNO=d.AMMNO  ";                                    
            //AMM單號
            if (!myfunc.checkisnull(Tmp_AMMNO))
            {
                Tmp_Sql = Tmp_Sql + " AND   A.AMMNO=" + myfunc.AA(Tmp_AMMNO);
            };
            //分工單計畫開始日   起~迄
            if ((!myfunc.checkisnull(Tmp_BEDT1)) || (!myfunc.checkisnull(Tmp_BEDT2)))
            {
                if (!myfunc.checkisnull(Tmp_BEDT1))
                {
                    Tmp_Sql = Tmp_Sql + " AND   A.BEDT  >=" + myfunc.AA(Tmp_BEDT1);
                }
                if (!myfunc.checkisnull(Tmp_BEDT2))
                {
                    Tmp_Sql = Tmp_Sql + " AND   A.BEDT  <=" + myfunc.AA(Tmp_BEDT2);
                }
            };
            //施工日期   起~迄
            if ((!myfunc.checkisnull(Tmp_DT1)) || (!myfunc.checkisnull(Tmp_DT2)))
            {
                if (!myfunc.checkisnull(Tmp_DT1))
                {
                    Tmp_Sql = Tmp_Sql + " AND   B.DT  >=" + myfunc.AA(Tmp_DT1);
                }
                if (!myfunc.checkisnull(Tmp_DT2))
                {
                    Tmp_Sql = Tmp_Sql + " AND   B.DT  <=" + myfunc.AA(Tmp_DT2);
                }
            };
            //區域
            if (!myfunc.checkisnull(Tmp_AREA))
            {
                Tmp_Sql = Tmp_Sql + " AND   A.AREA=" + myfunc.AA(Tmp_AREA);
            };
            //發工件號
            if (!myfunc.checkisnull(Tmp_PN))
            {
                Tmp_Sql = Tmp_Sql + " AND   A.PN=" + myfunc.AA(Tmp_PN);
            };
            //CREWBOARD起始天   起~迄
            if ((!myfunc.checkisnull(Tmp_PLANDAY1)) || (!myfunc.checkisnull(Tmp_PLANDAY2)))
            {
                Tmp_Sql = Tmp_Sql + " AND   A.PN  IN  (SELECT  DISTINCT PLANNINGCARD FROM   AMM_PLANCARD  WHERE  1=1 ";
                if (!myfunc.checkisnull(Tmp_PLANDAY1))
                {
                    Tmp_Sql = Tmp_Sql + " AND   PLANDAY  >=" + myfunc.AA(Tmp_PLANDAY1);
                }
                if (!myfunc.checkisnull(Tmp_PLANDAY2))
                {
                    Tmp_Sql = Tmp_Sql + " AND   PLANDAY  <=" + myfunc.AA(Tmp_PLANDAY2);
                }
                Tmp_Sql = Tmp_Sql + " ) ";
            };
            //TEAM
            if (!myfunc.checkisnull(Tmp_TEAM))
            {
                Tmp_Sql = Tmp_Sql + " AND   A.TEAM=" + myfunc.AA(Tmp_TEAM);
            };
            //領班 FOREMAN1 of   AMM_CREWGRP.GRP
            if (!myfunc.checkisnull(Tmp_FOREMAN1))
            {
                Tmp_Sql = Tmp_Sql + " AND   B.GRP  IN (SELECT GRP FROM  AMM_CREWGRP  WHERE  FOREMAN1=" + myfunc.AA(Tmp_FOREMAN1) + ")";
            };
            //小組長 LDMAN1 of  AMM_CREWTEAM.TEAM
            if (!myfunc.checkisnull(Tmp_LDMAN1))
            {
                Tmp_Sql = Tmp_Sql + " AND   B.TEAM  IN (SELECT TEAM FROM  AMM_CREWTEAM  WHERE  LDMAN1=" + myfunc.AA(Tmp_LDMAN1) + ")";
            };
            // AMM_SRO的過濾條件
            //機號 & 工號
            if ((!myfunc.checkisnull(Tmp_ACNO)) || (!myfunc.checkisnull(Tmp_SAPNO)) ||
                  (!myfunc.checkisnull(Tmp_PTY1)) || (!myfunc.checkisnull(Tmp_PTY2)) ||
                  (!myfunc.checkisnull(Tmp_CREWBOARDSDT1)) || (!myfunc.checkisnull(Tmp_CREWBOARDSDT2)))
            {
                Tmp_Sql = Tmp_Sql + " AND   A.AMMNO  IN (SELECT AMMNO FROM  AMM_SRO WHERE  1=1 ";
                if (!myfunc.checkisnull(Tmp_ACNO))
                {
                    Tmp_Sql = Tmp_Sql + " AND   nvl(STARTVAL,ACNO)=" + myfunc.AA(Tmp_ACNO);
                };
                if (!myfunc.checkisnull(Tmp_SAPNO))
                {
                    Tmp_Sql = Tmp_Sql + " AND   SAPNO=" + myfunc.AA(Tmp_SAPNO);
                };
                if (!myfunc.checkisnull(Tmp_PTY1))
                {
                    Tmp_Sql = Tmp_Sql + " AND   PTY>=" + Tmp_PTY1;
                };
                if (!myfunc.checkisnull(Tmp_PTY2))
                {
                    Tmp_Sql = Tmp_Sql + " AND   PTY<=" + Tmp_PTY2;
                };
                if (!myfunc.checkisnull(Tmp_CREWBOARDSDT1))
                {
                    Tmp_CREWBOARDSDT1 = string.Format("{0:yyyy/MM/dd}", DateTime.Parse(Tmp_CREWBOARDSDT1));
                    Tmp_Sql = Tmp_Sql + " AND   CREWBOARDSDT>=" + myfunc.AA(Tmp_CREWBOARDSDT1);
                };
                if (!myfunc.checkisnull(Tmp_CREWBOARDSDT2))
                {
                    Tmp_CREWBOARDSDT2 = string.Format("{0:yyyy/MM/dd}", DateTime.Parse(Tmp_CREWBOARDSDT2));
                    Tmp_Sql = Tmp_Sql + " AND   CREWBOARDSDT<=" + myfunc.AA(Tmp_CREWBOARDSDT2);
                };
                Tmp_Sql = Tmp_Sql + " )";
            }

            Tmp_Sql = Tmp_Sql + "   )   ";                                                     
            cmd.CommandText = Tmp_Sql;
            string countSql = " SELECT COUNT(*) as total FROM (" + Tmp_Sql + ")";
            //匯出時 ,取全部資料, par_paging =true
            DataSet ds = getDataTable(cmd, countSql, par_paging);


2022年9月7日 星期三

V20306 - 傳送檔案至前端 - 若有錯誤(Exception),則顯示錯誤訊息

 目的: 傳送檔案至前端 - 若有錯誤(Exception),則顯示錯誤訊息

處理說明:  1>*.cs  , 
            將錯誤訊息加入 Cookie & HttpContext.Current.ApplicationInstance.CompleteRequest();

             catch (Exception e)
            {
                var Tmp_ErrMsg = e.Message;
                //包裝標籤檔產生完成
                Tmp_Str = "產生包裝匯出檔案失敗<br>"                                
                                + Tmp_ErrMsg;
                MyCookie = new HttpCookie("EX_DFile", HttpUtility.UrlEncode(Tmp_Str));                
                HttpContext.Current.Response.Cookies.Add(MyCookie);
                HttpContext.Current.ApplicationInstance.CompleteRequest();

                return;
            }




1>*.js
//查詢  - 將目前所選的資料,匯出成報表
    function LookBtn_click() {
        var Tmp_Grid = Ext.getCmp('grid_Single');
        var cur_recs,cur_rec;
        var Tmp_SAPNO, Tmp_PN, Tmp_QTY, Tmp_EOCND, Tmp_RMK;
        var Tmp_data_JSON = "";  //將store資料轉成 JSON 的字串
        var Tmp_sub_np = {};
        let Tmp_DataAry1 = [];
        var Tmp_Str = "";
        cur_recs = Tmp_Grid.getView().selModel.getSelection();
        //console.log("cur_recs:", cur_recs);
        if (cur_recs.length == 0) {
            mywarnalert("請先選擇要查詢的資料");
            return;
        }
        for (var i = 0; i < cur_recs.length; i++) {
            cur_rec = cur_recs[i];
            //console.log(Tmp_Str + "cur_rec:", cur_rec);
            Tmp_DataAry1.push(cur_rec.data);
        }
        //console.log("Tmp_DataAry1:", Tmp_DataAry1);
        // 將目前子畫面的資料(Table)轉成 JSON字串
        let Tmp_DataString1 = JSON.stringify(Tmp_DataAry1);
        //console.log("Tmp_DataString1:", Tmp_DataString1);        
        var np = {};
        np = {
            DataString1: Tmp_DataString1,            
        };

        Ext.getCmp('s_form').submit({
        //Ext.Ajax.request({
            url: '../../api/V20306API/DoPRNLIST',
            method: 'POST',
            async: false,
            standardSubmit: true, //若要傳送檔案至前端, standardSubmit必需設為 true  
            params: np,
        });
        //顯示結果訊息..

        var mask = new Ext.LoadMask(Ext.getBody(), {
            msg: '處理中,請稍待...'
        });

        mask.show();//使用 mask 需手動呼叫show() 方法下
        var timer = setInterval(function () {
            clearInterval(timer);
            mask.hide();
            timer = null;
            var r = r_cookies('EX_DFile');
            //console.log("r_cookies=", r);
            if (!checkisnull(r)) {
                mysuccessalert(r);
            }
        }, 5000);  //3000ms = 3sec
    }  // end of  function LookBtn_click() {


2>*.cs  -  HttpContext.Current.ApplicationInstance.CompleteRequest();

 HttpCookie MyCookie;
 try
 {

}
 catch (Exception e) {
               var Tmp_ErrMsg = e.Message;
                //包裝標籤檔產生完成
                Tmp_Str = "產生包裝匯出檔案失敗<br>"                                
                                + Tmp_ErrMsg;
                MyCookie = new HttpCookie("EX_DFile", HttpUtility.UrlEncode(Tmp_Str));                
                HttpContext.Current.Response.Cookies.Add(MyCookie);  
                HttpContext.Current.ApplicationInstance.CompleteRequest();
                return;
}
 finally
            {                
                wk.Dispose();
                conn.Close();
            }

HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + HttpUtility.UrlEncode((string)FileName, System.Text.Encoding.UTF8) + "\"");
            HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
            HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            HttpContext.Current.Response.BinaryWrite(mstream.ToArray());
            //包裝標籤檔產生完成
            Tmp_Str = "產生包裝匯出檔案成功<br>"
                            + "(" + FileName + ")<br>";
            MyCookie = new HttpCookie("EX_DFile", HttpUtility.UrlEncode(Tmp_Str));
            HttpContext.Current.Response.Cookies.Add(MyCookie);
            HttpContext.Current.Response.End();

2022年9月6日 星期二

Array 處理 - Array宣告 - 判斷元素是否在 Array內 - c# 判斷字串是否在長字串內

 目的: Array 的宣告 & 判斷 元素是否在 Array內

處理說明: 1>宣告 Array  :    
                        Opts1> let  Tmp_Ary=["A","B","C"];   //宣告 Tmp_Ary 共 3元素("A","B","C")
                        Opts2> let  Tmp_Ary= new Array(3);  //宣告 Tmp_Ary 共 3元素
                  2>判斷元素("A")是否在 Array內 , 利用 Array.indexOf("A") , 傳回 index 
                       if (Tmp_Ary.indexOf("A")== -1)
                  3>c# 字串判斷是否存在 , 若 Tmp_IRESAK 為"", 則傳回 0 , 非 -1
                        if ("1;2;3;4;5;6;7;8;".IndexOf(Tmp_IRESAK) == -1)
                            {
                                Tmp_RtnMsg1 = Tmp_RtnMsg1 + "[檢測結果代碼]欄位值不符!!"
                                                          +"(" +Tmp_IRESAK + ")<br>";
                            }
                        --> 所以必需先判斷 Tmp_IRESAK 是否為空字串
                               if (myfunc.checkisnull(Tmp_IRESAK.Trim()))
                                {
                                  Tmp_RtnMsg1 = Tmp_RtnMsg1 + "[檢測結果代碼]欄位值不可空白!!<br>";
                                  }

 PS: *.js  利用 "A" in Tmp_Ary 不準,  不用之   , 

        --> 但 *.cs   key in Keys 可


1>*.js  var  Tmp_Ary=["A","B","C"];

  let Tmp_Ary = ["A", "B", "C", "D"];

            console.log("1 par_WTLV in [A,B, C,D] :", ("A" in Tmp_Ary));            

            console.log("3 Tmp_Ary.indexOf(par_WTLV) :", Tmp_Ary.indexOf(par_WTLV));

            //用  Arrary 用  in  不準, 改用 indexOf

            if (Tmp_Ary.indexOf(par_WTLV)==-1)

                return;


2>*.cs  string[] Tmp_StrAry= new string[3] {"A","B","C"}

             string[]  Tmp_StrAry=new string[3] {"MITM","WITM","DDITM"};

             int[]   Tmp_intAry= new int[3]{21,22,25};

            Tmp_intAry[2]=23;

            int Tmp_int2=Tmp_intAry[2];


             Tmp_StrAry[0].Contains("A");

             Tmp_StrAry.Contains(obj.Index);


3>Array 也是 Object 的型態之一

    Ex: var Tmp_Ary=[];

           Tmp_Ary.push(cur_rec);   //method

           Tmp_Ary.length=1;          //property  

           Tmp_Ary.newSet=-1;   //宣告新的 property





V20306 - 欄位值2Checkbox - 將資料庫欄位值顯示 在 checkbox

 目的: 將資料庫欄位值轉成 checkbox  &  將畫面checkbox值轉成資料庫欄位值

處理說明: 1>顯示資料 -  將資料庫欄位值轉成 checkbox (tab1.onShow event )

                  2>儲存資料 -  將畫面checkbox值轉成資料庫欄位值(按[存檔]鈕)




1>*.js 顯示資料 - 將資料庫欄位值轉成 checkbox (tab1.onShow event )

Ext.getCmp("tab1").on("show", function (me, eOpts) {
        //編輯畫面顯示,將欄位值反應至編輯畫面的 checkbox 選項             
        console.log("*** tab1 show event trigger");
        var sel_recs = Ext.getCmp('grid_Single').getView().getSelectionModel().getSelection();
        if (sel_recs.length > 0) {
            var sel_rec = sel_recs[0];
            console.log("sel_rec:" , sel_rec);
            if (checkisnull(sel_rec)) {
                return true;
            }
            var Tmp_WTLV = sel_rec.data["WTLV"].toString();
            var Tmp_ITPR = sel_rec.data["ITPR"].toString();
            setcheckbox_WTLV(Tmp_WTLV);
            setcheckbox_ITPR(Tmp_ITPR);            
        }

        function setcheckbox_WTLV(par_WTLV) {            
            let Tmp_Ary = ["A", "B", "C", "D"];
            //用  Arrary 用  in  不準, 改用 indexOf
            if (Tmp_Ary.indexOf(par_WTLV)==-1)
                return;


            var WTLV_id = "WTLV_" + par_WTLV;
            Ext.getCmp(WTLV_id).setValue(true);
        }

        //欄位值 par_ITPR: A/B/C/D/E/F/G:其他1
        function setcheckbox_ITPR(par_ITPR) {
            let Tmp_Ary = ["A", "B", "C", "D", "E", "F", "G"];
            let Tmp_ITPR1 = par_ITPR.substr(0, 1);
            if (Tmp_Ary.indexOf(Tmp_ITPR1) == -1)
                return;

            var par_ITPR_Ary = new Array;
            par_ITPR_Ary = par_ITPR.split(":");         
            //設定其他備註欄位  
            if (par_ITPR_Ary[0] == "G") {
                Ext.getCmp("ITPR1").setValue(par_ITPR_Ary[1]);
            }
            var ITPR_id = "ITPR_" + par_ITPR_Ary[0];                        

            //若為 G:其他1 , 則需特別處理
            var Tmp_ITPR_id = Ext.getCmp(ITPR_id).getValue();            
            Ext.getCmp(ITPR_id).setValue(true);            
        }
    });


     //修改的存檔, 重新顯示
    Ext.getCmp('btn_save').beforeEdit = function () {
        //執行後端 Upate 程式
        isCheck = S_DB.doSave('Update');
        //後端   Insert 後, store 重取
        if (isCheck)
           Ext.getCmp("btn_Show").fireHandler();
        return isCheck;
    };


2>*.cs 儲存資料 -  將畫面checkbox值轉成資料庫欄位值(按[存檔]鈕)

[HttpPost]
        public void Update()
        {
            var c = System.Web.HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            string[] arrCondition = getPK();
            NameValueCollection nvc1 = new NameValueCollection();
            nvc1=Proc_ITPR(nvc1, nvc);            
            excuteUpdate(nvc1, DBTable, arrCondition);
        }

public NameValueCollection Proc_ITPR(NameValueCollection par_nvc1, NameValueCollection par_nvc)
        {
            //nvc 移除 radio開頭的 key
            var Tmp_key = "";
            foreach (string key in par_nvc.Keys)
            {
                if (!key.Contains("radio"))
                    par_nvc1[key] = par_nvc[key];
            }

            //若為[ITPR]若為'G', 其他則 nvc1[ITPR]=nvc1[ITPR]+":"+nvc1[ITPR1];
            //刪除 nvc1[ITRP1]
            if (par_nvc1["ITPR"] == "G")
                par_nvc1["ITPR"] = par_nvc1["ITPR"] + ":" + par_nvc1["ITPR1"];
            par_nvc1.Remove("ITPR1");
            return par_nvc1;
        }

 public void Insert()
        {
            var c = System.Web.HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            NameValueCollection nvc1= new NameValueCollection();            
            nvc1 = Proc_ITPR(nvc1, nvc);        
            excuteInsert(nvc1, DBTable);
        }


3>V20306_JSON.js  - 畫面欄位設計  - checkbox


{
  xtype: 'radiogroup', fieldLabel: '重量等級', labelWidth: 160, layout: 'vbox',
id: 'WTLV',
items: [
{
boxLabel: '極重(木箱)',
name: 'WTLV', 
id: 'WTLV_A', 
inputValue: 'A',
border: 1,
width:300
}, {
boxLabel: '很重(七層紙箱)',
name: 'WTLV', 
id: 'WTLV_B', 
inputValue: 'B',
border: 1,
}, {
boxLabel: '重(五層紙箱)',
name: 'WTLV', 
id: 'WTLV_C', 
inputValue: 'C',
checked: true,
},
{
boxLabel: '一般(三層紙箱)',
name: 'WTLV', 
id: 'WTLV_D', 
inputValue: 'D',
}
]
}, // end of  WTLV重量等級
{
                xtype: 'radiogroup', fieldLabel: '內層包裝需求', labelWidth: 160, layout: 'vbox',
id: 'ITPR',
items: [
{
boxLabel: '旭化層',
name: 'ITPR', 
id: 'ITPR_A', 
inputValue: 'A',
}, {
boxLabel: '大氣泡布',
name: 'ITPR', 
id: 'ITPR_B', 
inputValue: 'B',
}, {
boxLabel: '小氣泡布',
name: 'ITPR', 
id: 'ITPR_C', 
inputValue: 'C',
checked: true,
},
{
boxLabel: '舒美布',
name: 'ITPR', 
id: 'ITPR_D', 
inputValue: 'D',
},
{
boxLabel: '牛皮紙',
name: 'ITPR', 
id: 'ITPR_E', 
inputValue: 'E',
},
{
boxLabel: '紙版',
name: 'ITPR', 
id: 'ITPR_F', 
inputValue: 'F',
},
                                         //用 panel - 包含 checkbox & TextField  
{
xtype: 'panel', layout: { type: 'hbox' }, border: 0,
items: [
{
xtype: 'radio', boxLabel: '其他', name: 'ITPR',
id: 'ITPR_G', 
inputValue: 'G',
},
{ xtype: 'textfield', id: 'ITPR1', width: 150, padding: "0 5 0 5" },
]
},
]
}, // end of  ITPR

2022年9月2日 星期五

V20306 - 若Template Grid畫面有 CheckBoxModel ,則判斷選擇資料會錯誤 - 移除 parent.onclick function -改用自定的 onclick

       目的: 若Grid畫面有 CheckBoxModel ,則判斷選擇資料會錯誤 , 

                 已勾選資料,但編輯時,仍會顯示"請先選擇一筆資料!! "

                  --> Template 的錯誤, 更  TMGrid.js  & TMSingleViewEdit.js 即可

處理說明: 方法1>將 parent 的 onclick 解除  Listener 

                              不呼叫 parent.onclick function , 只呼叫 child.onclick function

                              V20306 繼承自 TMSingleViewEdit class,  onClick時,會先呼叫 parent .onClick

                             (因 constructor: function (config){ ...   ;  this.callParent(config);}    ) 

                  方法2>置換 V20306.grid_Single 元件,將 grid.SelModel 改成 checkboxModel 





1>方法一:   *.js   移除 parent .onclick function  - 改用自定的 onclick   

//兩種方法均可  - un("click",handlerFn)   - removeEventListener("click", handlerFn);
Ext.getCmp('btn_edit').un("click", Ext.getCmp('btn_edit').events.click.listeners[0].fn);
//Ext.getCmp('btn_edit').removeEventListener("click", Ext.getCmp('btn_edit').events.click.listeners[0].fn);        

Ext.getCmp('btn_edit').on("click", function (me, e, eOpts) {
        var sel_recs = Ext.getCmp('grid_Single').getView().getSelectionModel().getSelection();
if (sel_recs.length > 0) {
var sel_rec = sel_recs[0];
            setFormData(sel_recs);
            buttonModel.setModelType(2);
            Ext.getCmp("tab2").setDisabled(true);                              
            Ext.getCmp("TMSingleViewEdit").setActiveTab("tab1");
}
 else {
            mywarnalert("請先選擇一筆資料 !!");
        }

        setFieldsCls('myform', ['ASPNO', 'LCNO', 'MCNM', 'ORDID', 'PCTP', 'FICNMA', 'STLCT', 'PCQTY', 'LRULT', 'LRUWT', 'LRUHG'], ['ASPNO'],['ASPNO','RPNOAF','LCNO','LRWET','MCNM','ASPSTA','ORDID','PCTP','FICNMA','STLCT','PCQTY','ASLV','ASPRMK','NGONOAF','PN','LCITM','LCETDT','LCCHID','LCORAO','LRULT','LRUWT','LRUHG','WTLV','ITPR']);
        showFormButton('myform', ['btn_RPNOAF', 'btn_LRWET', 'btn_MCNM', 'btn_ASPSTA', 'btn_ORDID', 'btn_PCTP', 'btn_FICNMA', 'btn_STLCT', 'btn_ASPRMK', 'btn_NGONOAF', 'btn_PN', 'btn_LCCHID']);
        return false;
    });


方法2:  置換 selModel 成  Ext.selection.CheckboxModel
              另外Template   TMGrid.js  & TMSingleViewEdit.js   也要換成最新版本

Ext.onReady(function () {
    var TMSingleViewEdit = Ext.create('TMSingleViewEdit');
    
    Ext.getCmp('grid_Single').destroy(); //20220905
    var grid_Single = Ext.create('grid_Single', {
        id: 'grid_Single',
        resizable: true,
        selModel: Ext.create('Ext.selection.CheckboxModel', {
            selectionMode: 'SIMPLE',
            listeners: {
                /*selectionchange: function (cb, selected, eOpts) {
                    //view.selModel.getSelection()
                },*/
                RowMouseDown: function (view, record, item, index, e) {
                    var me = this;
                    if (index !== -1) {

                        if (!me.allowRightMouseSelection(e)) {
                            return;
                        }

                        if (e.shiftKey && me.lastFocused) {
                            me.selectRange(me.lastFocused, record, e.ctrlKey);
                            me.processSelection(view, record, item, index, e);
                        }

                        if (!me.isSelected(record)) {
                            me.mousedownAction = true;
                            me.processSelection(view, record, item, index, e);
                        } else {
                            me.mousedownAction = false;
                        }
                    }

                }
            }
        })
    });
    Ext.getCmp('tab2').add(grid_Single); //將grid加入到tab裡面
    Ext.getCmp('tab2').updateLayout();


2022年9月1日 星期四

JS - 箭頭函式的用法 => , 即函式的簡約寫法

 目的: 了解 JS 箭頭函式的用法  =>

處理說明:  1>箭頭函式  =>  , 即  function 的簡要 statement
                   2>var func = function (x) { return x + 1 }
可簡約寫成 var func= (x)=>x+1
3>若用 {} , 則需自行 (return 傳回值)
var func1=function (x) { return x+1}
需簡約寫成 var func1=(x)=>{return x+1};
--> 若簡約寫成 var func1=(x)=>{x+1}; , 會無傳回值

JS - class 的寫法 - 和 prototype的關係, 如何用 extends 達到繼承 (inheritance) 效果

 目的: 了解 JavaScript class 的寫法及 繼承(extends)  &  static 的用法

處理說明: 1>JavaScript  class 的本體是 函式(function) , 

                      class 只是宣告函式的一種特別的語法。

                 2>class person_child extends person_parent{

                     }                     

                     -->JavaScript將 person_child.prototype 的 [[Prototype]] 設為 person_parent.prototype,

[傳統寫法] [class寫法]

一.傳統寫法   - 物件屬性 - 以 prototype 定義屬性
1>傳統宣告 Object _的方法 - function ObjectName(par_param) { }
    1>>定義物件 - 以 function 函式定義物件 - constructor()  , this.property=xxxx;
function Person(par_name){
this.name=par_name;
}

    2>>定義屬性 Object.prototype.property
        Person.prototype.name="Defaultname";

    3>>定義方法 Object.prototype.property=function() { }
Person.prototype.SayHello=function(){
console.log(" Hello !! "+this.name);
}

   4>實際建立 Object  - new Constructor
       var Person1=new Person("parent Micro Tsai");
       Person1.SayHello();
 
--> 執行結果 :
      Hello!!  parent Micro Tsai


二.傳統宣告 Object 的 _inherit 方法  -  child.prototype=parent.prototype;
1>>宣告 person_son Object
function person_son(par_name,par_age){
this.name=par_name;
this.age=par_age
}
2>>person_son 繼承自 person 
//person_son.prototype.__proto__ = Person.prototype;
person_son.prototype = Person.prototype;
person_son.prototype.ShowName = function(){
console.log("My name is "+this.name);
}
person_son.prototype.ShowAge = function(){
console.log("My age is "+this.age);
}
var person_son1=new person_son("child Micro Tsai",28);
person_son1.SayHello();    //person_son1未定義 SayHello ,因繼承自 parent ,所以可以用 SayHello
person_son1.ShowName();
person_son1.ShowAge();

--> 執行結果:
 Hello !! child Micro Tsai
My name is child Micro Tsai
My age is 28


三.class 的物件寫法 
1>宣告 class  -  class  class_name{ constructor(){}; SayHello(){}; }
class Person_parent{
    constructor(par_name){
        this.name=par_name;
    }
    SetName(par_name){ this.name=par_name; }
    SayHello(){
        console.log(" Hello "+this.name);
    }
}

Person2=new Person_parent("Micro Tsai 2");
Person2.SayHello();
Person2.SetName("Micro Tsai 3");
Person2.SayHello();
--> 執行結果:
Hello parent Micro Tsai 
Hello parent Micro Tsai SetName

2>class的繼承   子class  extends  父class
class Person_child extends Person_parent{    
    constructor (par_name,par_gender){
        super(par_name);  //call parent.constructor
        this.gender=par_gender;
    }
    
    SetAge(par_age){
        this.age=par_age;
    }
    ShowAge(){
        console.log(this.name+" age is "+this.age);
    }
    SayHello(par_name){
        console.log("please Jump !! "+par_name);
        super.SayHello();  //call parent function SayHello();  
    }
    ShowGender(){
        console.log(this.name+" gender is "+this.gender);
    }
}

Person_child=new Person_child("Micro Tsai 5","Male");
Person_child.SayHello(Person_child.name);
Person_child.SetAge(57);
Person_child.ShowAge();
Person_child.ShowGender();

--> 執行結果:
please Jump !! Micro Tsai 5
 Hello Micro Tsai 5
Micro Tsai 5 age is 57
Micro Tsai 5 gender is Male