2026年7月9日 星期四

V1060302B – 匯入 –C# 主函式呼叫子函式 – 子函式可以供用主函式的現有變數

 目的: V1060302B – 匯入 –C# 主函式呼叫子函式 子函式可以供用主函式的現有變數

處理說明: 1> 宣告子函式    
                                        void CHECK_TMVAL()
                                              {
                                                       共用主函式的變數
                                                }
                                 2>在主函式中呼叫子函式
                                       [HttpPost]
        public void XLS2XLS()
        {
            HttpContext c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            string FName = nvc["FName"]; 
             string Tmp_L_FLYHR; 
               try
               {

                            }                               :

                           CHECK_TMVAL();   

                                            void CHECK_TMVAL()
                                              {
                                                       //共用主函式的變數
                                                       Tmp_L_FLYHR=105;
                                                }
                                        }// end of XLS2XLS


2026年7月8日 星期三

由 GitLab 下載 TLSWEB_PM專案 master Source 至 Local目錄 -II

 目的: 由 GitLab 下載 TLSWEB_PM專案 master  Source 至 Local目錄

處理說明: 1> 至  GitLab 網站(https://gitlab)
                  2>選擇 Member 頁(各專案存放庫) - TLSWEB_PM
                  3>複製 PM專案.Code 在 Gitlab 的位置 , 以便至 Visual Studio 下載存放庫   
                  4> 在 Visual Studio 環境,由 Gitlab 的位置安裝  PM專案 Source
                  5>在 C# 7.3 中無法使用 'using 宣告' 功能。請使用C#語言版本 8.0 。
                       於 TLSWEB_PM.csproj 中, 文字檔案加入
 <PropertyGroup>
 <LangVersion>8.0</LangVersion>
 </PropertyGroup>
                   6>web.config 
                       <!--server端帳密,發行時請取消註解-->
                       <!--<identity impersonate="true" userName="webadmin" password="Ai@" />-->
                   7>由 gitlab 的位置安裝 PM專案, 安裝後多一  package 目錄 
                        若由 *.zip 安裝,則無 package 目錄 
                         
1> 至  GitLab 網站(https://gitlab)


2>選擇 [Member]頁 - [TLSWEB_PM] 


3>複製 Gitlab 的專案Source 位置


4>Visual Studio環境,取得 Gitlab 的程式碼




5>由 gitlab 的位置安裝 PM專案, 安裝後多一  package 目錄


















2026年7月2日 星期四

V1060302 – 匯出- 顯示”處理中,請稍候”訊息 - LoadMask

 目的: V1060302 – 匯出- 顯示處理中,請稍候訊息 - LoadMask

處理說明:  1>  顯示訊息
                         var mask = new Ext.LoadMask(Ext.getBody(), {
                              msg: '處理中,請稍候...'
                           });
                          mask.show();
                  2> Ext.Ajax.request 
                           :
                             async  : false;  //將非同步功能關閉 , 才會顯示請 稍候訊息
                  



1>*.js
                 var mask = new Ext.LoadMask(Ext.getBody(), {
                        msg: '處理中,請稍候...'
                    });
                    mask.show();

                    //Ext.Msg.wait('處理中,請稍候...', '系統訊息');
                    Ext.Ajax.request({
                        url: '../api/V1060302API/getGridData_M?par_paging=false',
                        method: 'POST',
                        //params: { all: 1 },
                        params: np ,
                        //async: false, //將非同步功能關閉 , 才會顯示請 稍候訊息
                        failure: function (response, opts) {
                            mask.hide();
                        },
                        success: function (response, opts) {
                              mask.hide();
                            //Ext.Msg.hide(); // 成功後關閉等待訊息
                            let Tmp_DataAry1 = [];
                            var obj = Ext.decode(response.responseText);
                            obj.T1.forEach(function (item, i) {
                                Tmp_DataAry1.push(item);
                            });
                            CALL_V1060302C(Tmp_DataAry1); //排程資料匯出
                        }

2>CALL_V1060302C  -submit - 利用  cookie 傳回結果
    var mask = new Ext.LoadMask(Ext.getBody(), {
        msg: '處理中,請稍待...'
    });

    mask.show();//使用 mask 需手動呼叫show() 方法下
    //每1秒檢核一次,是否已完成, 若已完成,則不再檢核
    var timer = setInterval(function () {
        var r = r_cookies('Rtn_Msg');
        //console.log("r_cookies=", r);
        if (!checkisnull(r)) {
            mysuccessalert(r);
            clearInterval(timer);
            mask.hide();
            timer = null;
        }
    }, 1000);  //1000ms = 1sec


2026年7月1日 星期三

V1060302 – 欄位挑選值 – 依其他欄位值過濾 - Query - url -? - &

 目的:V1060302 – 欄位挑選值 依其他欄位值過濾

處理說明:  1> 將目前欄位傳入 url 當參數
     var Tmp_url = '../api/V1060302API/get_ITEMPick';
        if ((Tmp_PROJID.length > 0) || (Tmp_TYPE.length > 0)) {         
                Tmp_url = Tmp_url + "?PROJID=" + Tmp_PROJID;            
                Tmp_url = Tmp_url + "&TYPE=" + Tmp_TYPE;
        }

                   2>依 url 傳入參數 , 組合成 SQL , 過濾 ITEM 



1>*.js
Ext.getCmp('btn_ITEM').on("click", function () {
var Tmp_PROJID = Ext.getCmp("PROJID").getValue();
var Tmp_TYPE = Ext.getCmp("TYPE").getValue();
var Tmp_url = '../api/V1060302API/get_ITEMPick';
if ((Tmp_PROJID.length > 0) || (Tmp_TYPE.length > 0)) {
    Tmp_url = Tmp_url + "?PROJID=" + Tmp_PROJID;
    Tmp_url = Tmp_url + "&TYPE=" + Tmp_TYPE;
}
var win = EditPickx('ITEM', Tmp_url , ['ITEM'], ['ITEM'], J_pickstore_ITEM, J_pickcolumns_ITEM,true,false);
win.show();
});

2>*.cs

//欄位 [ITEM(ITEM)]挑選
[HttpPost]
public dynamic get_ITEMPick(string PROJID = "", string TYPE = "", string ITEM = "", int isComplete = 0)
{
string Tmp_Sql = " SELECT distinct PROJID,TYPE,ITEM,CHKCHG_NM,CHKCHG_TM,TMBASE1,TMFEQ1,TMUNIT1 "
+ " FROM AMM_CHKCHG "
+ " WHERE ITEM IS NOT NULL ";
string n = funId + "s_ITEM";
if (PROJID != null && !PROJID.Equals(""))
{
if (isComplete == 1)
{
Tmp_Sql = Tmp_Sql + " AND PROJID=" + myfunc.AA(PROJID);
}
else
{
Tmp_Sql = Tmp_Sql + " AND PROJID LIKE " + myfunc.AA("%" + PROJID+"%");
}
}
if (TYPE != null && !TYPE.Equals(""))
{
if (isComplete == 1)
{
Tmp_Sql = Tmp_Sql + " AND TYPE=" + myfunc.AA(TYPE);
}
else
{
Tmp_Sql = Tmp_Sql + " AND TYPE LIKE " + myfunc.AA("%" + TYPE+"%");
}
}
Tmp_Sql = Tmp_Sql + " ORDER BY PROJID,TYPE,ITEM ";
//realtime
DataSet ds = setupPickDs(n, Tmp_Sql, new string[] { "AMM_CHKCHG" },true,true);
if (ITEM != null && !ITEM.Equals(""))
{
if (isComplete == 1)
{
ds = getPickDsbyCondi(n, "ITEM='" + ITEM + "'");
}
else
{
ds = getPickDsbyCondi(n, "ITEM LIKE '%" + ITEM + "%'");
}
}
return ds;
} // end of get_s_ITEMPick

2026年6月30日 星期二

V1060302 – 檢核飛行小時的格式(hhhhhh:mm) - regex - 允許前導空白,小時可為負數,1~6 位數字 + 冒號 + 2 位數字

 目的: V1060302 – 檢核飛行小時的格式(hhhhhh:mm) - regex
           - 允許前導空白,小時可為負數,1~6 位數字+冒號+2 位數字
                  Ex:   123:30  ,  -123:30 ,000123:30   均可

處理說明:  1> 格式:6 位數字 + 冒號 + 2 位數字
                        const regex = /^\d{6}:\d{2}$/;       
                        regex.text(value) ; //若value正確,則傳回 true , 否則 false 
                   2>格式 :     // 允許前導空白,小時可為負數,1~6 位數字 + 冒號 + 2 位數字       
                        const regex = /^\s*-?\d{1,6}:\d{2}$/;
                        regex.text(value) ; //若value正確,則傳回 true , 否則 false 


1>*.js
//STEP1.5>檢核[小時]格式是否符合 hhhhhh:mm    
    function CHECK_TMFIELD() {        
        var Tmp_isok = true;
        // 格式:6 位數字 + 冒號 + 2 位數字
        //const regex = /^\d{6}:\d{2}$/;       
        // 允許前導空白,小時可為負數,1~6 位數字 + 冒號 + 2 位數字       
        const regex = /^\s*-?\d{1,6}:\d{2}$/;
        //1>檢核[上次總飛行小時(L_FLYHR)
        var Tmp_L_FLYHR = Ext.getCmp("L_FLYHR").getValue().trim();
        if (Tmp_L_FLYHR.length > 0) {
        Tmp_isok = regex.test(Tmp_L_FLYHR);
        if (!Tmp_isok) {
            Tmp_Str = "[上次總飛行小時(" + Tmp_L_FLYHR + ")格式(hhhhhh:mm)不符<br>"
                + "敬請檢核!! ";
            mywarnalert(Tmp_Str);
            return Tmp_isok;
        }
        const [hours, minutes] = Tmp_L_FLYHR.trim().split(":");
        Tmp_isok = parseInt(minutes, 10) >= 0 && parseInt(minutes, 10) <= 59;
        if (!Tmp_isok) {
            Tmp_Str = "[上次總飛行小時(" + Tmp_L_FLYHR + ")格式(hhhhhh:mm)不符<br>"
                + "分鐘數字不符<br>"
                +"敬請檢核!! ";
            mywarnalert(Tmp_Str);
            return Tmp_isok;
            }
        }  // end of  if (Tmp_L_FLYHR.length > 0) {






V1060302 – 定更定檢清單維護 - 依 ITEM(9,9-1,10,10-1)排序, 每頁只能 30筆

 目的: V1060302 – 定更定檢清單維護 - 依 ITEM(9,9-1,10,10-1)排序, 每頁只能 30筆

處理說明: 1> 依 ITEM(9,9-1,10,10-1)排序, 
SELECT  RNK,        
                    PROJID ,TYPE ,ITEM ,ASN ,SERNO ,    
                            IS_IN_FCHK ,INS_DT ,MK_DT ,STK_DT ,L_CHKCHG_DT ,    
                            TMVAL1 ,TMVAL2 ,L_FLYHR ,L_FLYAC ,L_ENGHR ,   
                             L_APUHR ,L_APUAC ,L_APUDT ,L_FLYDT ,L_TURBOAC ,    
                            CHKCHG_STS ,CLSID ,CLSDT ,GRPIDS ,L_TYPE_I ,L_TAC,     
                          REMARK ,MKID ,MKDT     
FROM  (    select  dense_rank()  over(order by  PROJID,ASN,TYPE,
 CAST((case when instr(ITEM,'-')>0 then substring(ITEM,1,instr(ITEM,'-')-1) else ITEM end) as INTEGER),ITEM) as RNK,  
                   PROJID,ASN  ,TYPE ,ITEM ,SERNO ,    
                   IS_IN_FCHK ,INS_DT ,MK_DT ,STK_DT ,L_CHKCHG_DT ,    
                   TMVAL1 ,TMVAL2 ,L_FLYHR ,L_FLYAC ,L_ENGHR ,   
                   L_APUHR ,L_APUAC ,L_APUDT ,L_FLYDT ,L_TURBOAC ,    
                   CHKCHG_STS ,CLSID ,CLSDT ,GRPIDS ,L_TYPE_I ,L_TAC,     
                   REMARK ,MKID ,MKDT     
           FROM    AMM_CHKCHG_ASN  A   
           WHERE  1=1    
           );

1>*.cs

select  dense_rank()  over(order by  PROJID,ASN,TYPE,
 CAST((case when instr(ITEM,'-')>0 then substring(ITEM,1,instr(ITEM,'-')-1) else ITEM end) as INTEGER),ITEM) as RNK,  





2026年6月29日 星期一

V1060304A –定更定檢拆挪– DataAry=[] , 加入目前datastore 的資料, 若無資料,則 加入 {ASN1:’A0001’} - cur_rec

 目的: V1060304A –定更定檢拆挪– DataAry=[] , 加入目前datastore 的資料, 若無資料, 加入 {ASN1:’A0001’}

處理說明: 1>var Tmp_DataAry1=[];
                       cur_rec=cur_recs[0];
                       Tmp_DataAry1.Add(cur_rec.data);
                   2>若 Grid空白,加入 ASN: 'A0001' 的資料
                        var Tmp_DataAry1=[];
                        var Tmp_cur_rec1_data={ASN:’A0001’}
                        Tmp_DataAry1.Add(Tmp_cur_rec1);


1>*.js
        let Tmp_DataAry1 = [];
        let Tmp_DataAry2 = [];
        let Tmp_DataAry3 = [];
        var Tmp_Str = "";
        var cur_recs, cur_rec;
        //機號1
        cur_recs = Ext.getCmp('sub_Grid1').getView().selModel.getSelection();
        console.log("cur_recs:", cur_recs);
        //if (cur_recs.length == 0) {
        //    mywarnalert("請先選擇要拆挪的定更定檢資料-1!!");
        //    return;
        //}
        if (cur_recs.length == 0) {
            //mywarnalert("請先選擇要拆挪的定更定檢資料-2!!");
            //return;
            // 建立一個新的 record
            var cur_rec1_data;
            cur_rec1_data = {
                ASN: Tmp_ASN_dest,   //Tmp_ASN1
            };
            Tmp_DataAry1.push(cur_rec1_data);
        }
        else {
            cur_rec1 = cur_recs[0];
            console.log(Tmp_Str + "cur_rec:", cur_rec1);
            Tmp_DataAry2.push(cur_rec1.data);
        }

        //cur_rec = cur_recs[0];
        //console.log(Tmp_Str + "cur_rec:", cur_rec);
        //Tmp_DataAry1.push(cur_rec.data);
        //機號2
        //cur_recs = Ext.getCmp('sub_Grid2').getView().selModel.getSelection();
        //console.log("cur_recs:", cur_recs);
        //if (cur_recs.length == 0) {
        //    mywarnalert("請先選擇要拆挪的定更定檢資料-2!!");
        //    return;
        //}
        //cur_rec = cur_recs[0];
        //console.log(Tmp_Str + "cur_rec:", cur_rec);
        //Tmp_DataAry2.push(cur_rec.data);
        //備份件
        cur_recs = Ext.getCmp('sub_Grid3').getView().selModel.getSelection();
        console.log("cur_recs:", cur_recs);
        if (cur_recs.length == 0) {
            mywarnalert("請先選擇備份件資料-3!!");
            return;
        }
        cur_rec = cur_recs[0];
        console.log(Tmp_Str + "cur_rec:", cur_rec);
        Tmp_DataAry3.push(cur_rec.data);
        //console.log("Tmp_DataAry1:", Tmp_DataAry1);
        // 將目前子畫面的資料(Table)轉成 JSON字串
        let Tmp_DataString1 = JSON.stringify(Tmp_DataAry1);
        let Tmp_DataString2 = JSON.stringify(Tmp_DataAry2);
        let Tmp_DataString3 = JSON.stringify(Tmp_DataAry3);
        let Tmp_MOVE_TYPE = 'MOVE_31';   // 備份件  --> sub_Grid1
        //console.log("Tmp_DataString1:", Tmp_DataString1);
        var np = {};
        np = {
            DataString_sur: Tmp_DataString3,
            DataString_dest: Tmp_DataString1,
            MOVE_TYPE: Tmp_MOVE_TYPE,
        };
        //STEP1: 拆挪- 機號1to機號2 , 機號1to備份件,  備份件to機號2
        var Tmp_url = '../../api/V1060304AAPI/MOVE31';
        var Tmp_RtnStr = getUrlStr(Tmp_url, np, "定更定檢拆挪- 備份件to機號1");
        if (!checkRtnOK(Tmp_RtnStr)) {
            mywarnalert(Tmp_RtnStr);
            return;
        }
        else {
            mysuccessalert(Tmp_RtnStr);
            //重新顯示資料
            Ext.getCmp("sub_btn_Show1").fireEvent("click");
            //Ext.getCmp("sub_btn_Show2").fireEvent("click");
            //Ext.getCmp("sub_btn_Show3").fireEvent("click");
        }
    });  //end of Ext.getCmp("sub_btn_MOVE31").on("click", function (me, e, eOpts) {