2023年5月21日 星期日

V20302 – 不允許切換至[編輯]頁 – tabChange – setActiveTab()

 目的: V20302 – 不允許切換至[編輯] – tabChange – setActiveTab()

處理說明:  1>event : tabChange  - 判斷條件是否符合
                   2>若不符合,則不允許切換 tab 


1>*.js
//若 tabchange 時, 若未選擇資料, 則顯示訊息, 不允許切換至[編輯]頁
TMSingleViewEdit.on('tabchange', function (tabPanel, tab) {
if (tab.id == 'tab1') {
var cur_recs = Ext.getCmp('grid_Single').getSelectionModel().getSelection();
if (cur_recs.length == 0) {
var Tmp_Str = '請先選擇要瀏覽明細的資料!!';
mywarnalert(Tmp_Str);
Ext.getCmp('TMSingleViewEdit').setActiveTab('tab2');  //停留在[瀏覽]頁
//TMSingleViewEdit.setActiveTab(tab2);
//Ext.getCmp('TMSingleViewEdit').activeTab = 1; 
}
}
}); // end of tabchange


2023年5月19日 星期五

V20302 –Cookie – 如何判斷後端資料已更新完成, 才出現子畫面 -2 - settrue , waittrue - Cookie

 目的: V20302 – [確認除帳] – 如何判斷後端資料已更新完成, 才出現子畫面 -2 
           利用 myfunc.js 的  settrue , waittrue  - 設定Cookie 欄位值 & 取得Cookie欄位

處理說明: 1>當 store.on('load' 時, settrue(par_key) - 設定Cookie 為 true
                  2>waittrue(par_key, AddItem) - 直到 Cookie 為 true 時,才執行函式

1>*.js
    Ext.getCmp('sub1_Grid2').store.getProxy().url = '../api/V20302BAPI/getsubData2';
    Ext.getCmp('sub1_Grid2').store.getProxy().extraParams = np; //分頁OK,篩選條件OK    
    Ext.getCmp('sub1_Grid2').store.load();           
    
    //將 CSM_AF@TLS_245 的專案承辦人(以@分隔人員編號) 加入 副本.人員 [姓名][Notes_Email]
    Ext.getCmp('sub1_Grid2').store.on('load', function (me, records, successful, operation, eOpts) {        
        settrue("sub1_Grid2");
    }
    );

    waittrue("sub1_Grid2", AddItem);
    function AddItem() {
        Add_sub1_Grid2(par_EMPLYIDnot6);        
        Ext.getCmp('sub1_Grid2').getView().refresh();
    }
    



2>myfunc.js  -->   settrue()    waittrue()
/*
//函式名稱 : settrue  
傳入參數: par_key: string
設定 Cookie(par_key) 為 true 時
 */
function settrue(par_key, call_func) {
    Ext.util.Cookies.set(par_key,true);
}

/*
//函式名稱 : waittrue  
   傳入參數 : par_key : string
   若 Cookie(par_key) 為 true 時,才執行函式 call_func
*/
function waittrue(par_key, call_func) {
    console.log("par_key:", par_key);
    var timer = setInterval(function () {
        //var Tmp_loaded = decodeURIComponent(Ext.util.Cookies.get(par_key));
        var Tmp_loaded = Ext.util.Cookies.get(par_key);
        if (Tmp_loaded) {
            Ext.util.Cookies.clear(par_key);
            clearInterval(timer);  //不再重覆執行
            call_func();
            return;
        }
    }, 1000);
    };       // end ot waittrue()
    

2023年5月18日 星期四

V20302 – Cookie – 如何判斷後端資料已更新完成, 才出現子畫面 - timer - setInterval -等待時間

目的: V20302 – [確認除帳] – 更新後端資料後,才顯示子畫面
           --> 如何判斷後端資料已更新完成, 才出現子畫面
           --> 利用 Cookies(“finished”) 有值, 表示後端已執行完成

處理說明: 1>利用 Cookie 才判斷後端資料庫是否已更新完成, 以便往下繼續執行
                        var r = r_cookies('DoRemove_finished');
                        if (!checkisnull(r)) {

                  2>顯示訊息,使用者回應後才往下執行
                       var Tmp_Msg = "確認勾選的資料已正確, 並進行除帳作業嗎?";
                       Ext.Msg.confirm("確認", Tmp_Msg, DoRemove);
                       if (id == "no")
                          { return; }




1>*.js
Ext.getCmp('s_form').submit({
                method: "POST",
                url: '../../api/V20302API/DoRemove',  //更新資料庫單況
                standardSubmit: true,
                params: np,
                async: false,
            });  //end of Ext.Ajax.Request                    
                var mask = new Ext.LoadMask(Ext.getBody(), {
                    msg: '確認除帳處理中, 請稍待...'
                });
            mask.show();//使用 mask 需手動呼叫show() 方法下        
            //每隔 1秒後 , 執行 function , 檢核是否已完成(Cookie有值), 
            //                 至到 clearInterval(timer);  //不再重覆執行
                var timer = setInterval(function () {                                        
                    //若資料庫已更新完成, 則 Email 委約==6  &  Email 委約<>6
                    var r = r_cookies('DoRemove_finished');
                    if (!checkisnull(r)) {
                        is_Ok = false;                        
                        mask.hide();
                        clearInterval(timer);  //不再重覆執行
                        var Tmp_r = r.split(';');
                        var Tmp_cnt6 = Number(Tmp_r[1]);
                        var Tmp_cntnot6 = Number(Tmp_r[2]);
                        //取得 副本. [員工編號] , 以 @分隔
                        var Tmp_EMPLYIDnot6 = Tmp_r[3];
                        //console.log(" Tmp_cnt6 :", Tmp_cnt6);
                        //console.log(" Tmp_cntnot6 :", Tmp_cntnot6);
                        if (Tmp_cnt6 > 0) {
                           // console.log(" ShowEmail6() ");
                            ShowEmail6();
                        }                            
                        if (Tmp_cntnot6 > 0) {
                            //console.log(" ShowEmailnot6() ");
                            ShowEmailnot6(Tmp_EMPLYIDnot6);
                        }
                    }
                    //顯示 [挑選Email收件人]子畫面
                }, 1000)  // end of timer            
        };  // end of DoRemove


V20302B - 開啟子畫面時, 加入副本人員,但未顯示在畫面 - load() ,store

 目的: V20302B – 開啟子畫面時, 加入副本人員,但未顯示在畫面

處理說明:  1>開啟子畫面時, sub1_Grid2.store 會重新 load()
                   2>[副本人員]加入資料時, sub1_Grid2.store 尚未載入完成  - store load 尚未完成       
                   3>sub1_Grid2.store 載入完成時, 會覆蓋原本的 [副本人員]加入資料
                       --> 以致畫面上未加入資料


1>*.js

function ShowEmailnot6(par_EMPLYIDnot6) {
    Ext.getCmp('sub1_Grid2').store.getProxy().url = '../api/V20302BAPI/getsubData2';
    Ext.getCmp('sub1_Grid2').store.getProxy().extraParams = np; //分頁OK,篩選條件OK    
    Ext.getCmp('sub1_Grid2').store.load();                                                
    //將 CSM_AF@TLS_245 的專案承辦人(以@分隔人員編號) 加入 副本.人員 [姓名][Notes_Email]
    Add_sub1_Grid2(par_EMPLYIDnot6);
    Ext.getCmp('sub1_Grid2').getView().refresh();
   
}

--> store.load();
      Add_sub1_Grid2(par_EMPLYIDnot6);   //store尚未執行完成, 就 加入資料
      //等 store.load() 完成, sub1_Grid2原本加入的資料, 又被清空, 所以畫面無資料

-->改成 load 完成後,再加入資料即可
    store.on('load',function(){
        Add_sub1_Grid2(par_EMPLYIDnot6);
        Ext.getCmp('sub1_Grid2').getView().refresh();
   
    }

2023年5月17日 星期三

V20302A - 畫面 & Email 的換行處理
\r\n

 目的: 畫面 &  Email 的換行處理

處理說明:  1>前端畫面 : xtype: "textareafield" 欄位 ,   Tmp_content=Tmp_content +"\r\n" ;
                                           xtype: "label" 欄位 ,   Tmp_content=Tmp_content +"<br>" ;
                   2>Email內容: 
                       string  Tmp_content = nvc["sub_content"];  //    \r\n  --> 到後端只剩下\n
                       Tmp_content = Tmp_content.Replace("\n", "<br>");
                       sendMail(Tmp_Subject, Tmp_content, ChkMail);


1>*.js
      var Tmp_sub_content6 = "已經接收器材:\r\n"
                                            + r_V20302_content6 + "\r\n"
                                            + "請至 AMM系統 V20304: 拆檢/測試結果登錄做後續處理。\r\n";  
      Ext.getCmp("sub_Subject").setValue(Tmp_sub_Subjectnot6);

2>*.cs
       MailMessage ChkMail = new MailMessage();
      string  Tmp_Subject = nvc["sub_Subject"];
      string  Tmp_content = nvc["sub_content"];
      Tmp_content = Tmp_content.Replace("\n", "<br>");  // Email 必需以  <br> 換行
     string mail_from = "tlsapp@ms.aidc.com.tw";
     ChkMail.From = new MailAddress(mail_from, "AMM系統", System.Text.Encoding.UTF8);
     sendMail(Tmp_Subject, Tmp_content, ChkMail);







PS: 換行處理

1. 使用【+】符號 連接符號
string strSQL= "SELECT * FROM Flight_Schedule AS F"
                        + " INNER JOIN System_Code AS S"
                        + " ON F.Formno = c.Code_Desc1"
                        + " ORDER BY F.Formno";
                 
2.使用【@】符號 連接符號
string strSQL= @"SELECT * FROM Flight_Schedule AS F
                                INNER JOIN System_Code AS S
                                ON F.Formno = c.Code_Desc1
                               ORDER BY F.Formno"; 
 
3>標籤(Label)要換行"<br>"
Ex︰
lb_other.Text = "編號:" + lb_sno.Text + "<br>"
                        + "姓名:" + Txt_Name + "<br>"
                        + "電話:" + Txt_Tel ;
 
4>文字盒(TextBox)要換行"\r\n"
Ex︰
textBox1.Text = "編號:" + id + "\r\n"
                         + "姓名" + Name +"\r\n"
                         + "電話" + Tel;

V20302 - 1>前端取得 store 的欄位值 & store.總筆數 2>後端取得 datatable 的欄位值 , 取得 ds,dt 欄位值

 目的: 1>前端取得 store 的欄位值 *.js

               取得 store 總筆數(store.getTotalCount())

           2>後端取得 datatable 的欄位值 *.cs 

處理說明: 1>*.js
                         for (var i=0;i<ds1.getTotalCount(); i++){
                         var rec = ds1.getAt(i);
                         rec.data["NOTES_MAIL"].toString();
                         }
                  2>*.cs
                        for (var i = 0; i < dt1.Rows.Count; i++)





1>*.js
    var ds1 = Ext.getCmp("sub_Grid1").store;
    var rec;
    for (i = 0; i < ds1.getTotalCount(); i++) {
        rec = ds1.getAt(i);
        console.log("rec:", rec);
        Tmp_MEmail = Tmp_MEmail + rec.data["NOTES_MAIL"].toString() + ";";
    }

2>*.cs

2>*.cs
       for (var i = 0; i < dt1.Rows.Count; i++)
                {
                    Tmp_AMMNO = dt1.Rows[i]["AMMNO"].ToString();
                    Tmp_RPNOAF = dt1.Rows[i]["RPNOAF"].ToString();
                    Tmp_MRPNOAF = dt1.Rows[i]["MRPNOAF"].ToString();
                    Tmp_SAPNO_ = dt1.Rows[i]["SAPNO_"].ToString();

2023年5月16日 星期二

http傳送 字串編碼 & 字串解碼 - HttpUtility.UrlEncode(String) , UrlDecode(String) - Cookie

 目的: 在 Http的資料流程, 傳遞空白/標點符號之類的字元, 在接收端可能會錯誤解譯
          所以必需先 URL編碼 , 將URL中不允許的字元(空白,<>,...)編碼
          --> 當字元內嵌在 URL 中傳輸的文字區塊時,
                 這些字元 < and > 會編碼為 %3c 和 %3e

處理說明:  1>TextArea 欄位,以 "\r\n" 換行

                 2>由後端組合好的字串, 必需先 UriEncode ,再送至前端 

                 3>還原後端的字串,必需先 decodeURI , 

                      -->  但空白,可能變成+




1>*.cs
      if (Tmp_TYPEAF == "6")
          { Tmp_content6 = Tmp_content6 + "提領編號:" + Tmp_GONOAF + ",交修單號:" + Tmp_RPNOAF + "\r\n"; }
      else
          { Tmp_contentnot6 = Tmp_contentnot6 + "提領編號:" + Tmp_GONOAF + ",交修單號:" + Tmp_RPNOAF + "\r\n"; }
      MyCookie = new HttpCookie("V20302_content6", HttpUtility.UrlEncode(Tmp_content6));
      HttpContext.Current.Response.Cookies.Add(MyCookie);


2>*.js
   var r_V20302_contentnot6 = r_cookies('V20302_contentnot6');
   var Tmp_sub_contentnot6 = "已經接收器材:\r\n"
        + r_V20302_contentnot6 + "\r\n"
        + "請至 AMM系統 V20303: 進廠檢查資料登錄做後續處理。\r\n";  
    Ext.getCmp("sub_Subjext").setValue(Tmp_sub_Subjectnot6);
    Ext.getCmp("sub_content").setValue(Tmp_sub_contentnot6);    


function r_cookies(i_params) {
    var cookie_token = Ext.util.Cookies.get(i_params);
    return decodeURIComponent(escape(cookie_token));
}

PS1:
在 client 端送資料給 server 端時,若使用 query string 的方式,格式通常是這樣 https://www.sample.com?foo=abc&bar=def,而若當中有空白的話,像是 foo=a b c a、b、c 中間有空白,則會有以下加號(+)和 %20 兩種情況(可參考這裡)。

PS2: https://www.cythilya.tw/2020/07/24/encode-decode/
const encodedStr = encodeURIComponent('這是中文字串'); // encodedStr 得到 %E9%80%99%E6%98%AF%E4%B8%AD%E6%96%87%E5%AD%97%E4%B8%B2
const decodedStr = decodeURIComponent(encodedStr); // decodedStr 得到 這是中文字串