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) {




2026年6月28日 星期日

V1060301C –匯出EXCEL, 設定資料範圍框線 - GetExcelPos(column_x,row_y)

 目的: V1060301C –匯出EXCEL, 設定資料範圍框線

處理說明:  1>整個資料範圍設定框線

                    2> 若單一 cell 設定框線, 可能沒資料的空白行, 也會有框線

                    3>myfunc.GetExcelPos(24, row) ;       
                         -->  myfunc.GetExcelPos(column_x, row_y) ;       

                    4>CellRange rowRange = ws.Range["A0:Y9"];   //24欄9行


1>*.cs 
               for (int i = 0; i < dt1.Rows.Count; i++)
                {
                    //string Tmp_PROJID, Tmp_TYPE_, Tmp_ITEM, Tmp_WUC,Tmp_CHKCHG_NM;
                    Tmp_PROJID = dt1.Rows[i]["PROJID"].ToString();
                    Tmp_TYPE_ = dt1.Rows[i]["TYPE_"].ToString();
                    :
               }

      string Tmp_rowRange_Str = myfunc.GetExcelPos(0, 0) + ":" + myfunc.GetExcelPos(24, row);
                CellRange rowRange = ws.Range[Tmp_rowRange_Str];  //  A0:Y9  -->第1~9行 , 第0~24欄
                rowRange.Borders.LineStyle = LineStyleType.Thin;
                rowRange.Borders.Color = Color.Black;
     rowRange.Borders[BordersLineType.DiagonalDown].LineStyle = LineStyleType.None;  //不畫斜線
     rowRange.Borders[BordersLineType.DiagonalUp].LineStyle = LineStyleType.None;


2>*.cs --> 若一行一行畫框,可能資料的空白行,也會畫框
                     row = row + 1;
                    //for (var k = 0; k <= 24; k++)
                    //{
                    //若一行一行畫框,可能資料的空白行,也會畫框
                    //    CellRange cell = ws.Range[myfunc.GetExcelPos(k, row)];
                    //    cell.Borders.LineStyle = LineStyleType.Thin;  //包含斜線,
                    //    cell.Borders[BordersLineType.EdgeTop].LineStyle = LineStyleType.Thin;
                    //    cell.Borders[BordersLineType.EdgeBottom].LineStyle = LineStyleType.Thin;
                    //    cell.Borders[BordersLineType.EdgeLeft].LineStyle = LineStyleType.Thin;
                    //    cell.Borders[BordersLineType.EdgeRight].LineStyle = LineStyleType.Thin;
                    //    cell.Borders.Color = Color.Black;
                    //    //斜線不列出
                    //   cell.Borders[BordersLineType.DiagonalDown].LineStyle = LineStyleType.None;
                    //   cell.Borders[BordersLineType.DiagonalUp].LineStyle = LineStyleType.None;
                    //};                    





2026年6月25日 星期四

V1060301 – 編輯-存檔-允許編輯PK欄位 – PROJID+TYPE+ITEM - 修改PK

 目的: V1060301 – 編輯-存檔-允許編輯PK欄位 – PROJID+TYPE+ITEM
            - 若PK Table(AMM_CHKCHG)  已有 子 Table(AMM_CHKCHG_ASN)
               --> 修改 PK ,則會出現錯誤訊息,不允許修改            

處理說明: 1>*.js  - beforeEdit : 將 PK的舊欄位值傳至後端
                      Ext.getCmp('btn_save').beforeEdit = function () {
                        //isCheck = S_DB.doSave('Update');
                        //doSave: function (actType_S, apiName, pkFunctionName, oKeyArr)
                        //oDKeyArr:要修改的PK,在JS樣板會自動加上o_並起一併傳到C#(EX:'SCITM')
                        isCheck = S_DB.doSave('Update', undefined, undefined, ['ITEM']);
                        return isCheck;
                       };
                   2>*.cs - Update
 [HttpPost]
        public void Update()
        {
            var c = System.Web.HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            //string[] arrCondition = getPK();
            //excuteUpdate(nvc, DBTable, arrCondition);
            string[] arrCondition = new string[] { "PROJID","TYPE" };  //不含會異動的PK
            NameValueCollection i_nvc = new NameValueCollection();  //不含異動的o_PK
            string[] arr_key = nvc.AllKeys;

            Dictionary<string, dynamic> oldParamDict = new Dictionary<string, dynamic>();
            for (int i = 0; i < arr_key.Length; i++)
            {
                if ((arr_key[i].IndexOf("o_") >= 0))
                {
                    oldParamDict.Add(arr_key[i], nvc[arr_key[i]]);
                }
                else
                {
                    i_nvc[arr_key[i]] = nvc[arr_key[i]];
                }
            }
            excuteUpdate(i_nvc, "AMM_CHKCHG", arrCondition, null, true, oldParamDict);
        }


1>*.js  - 將 PK 的舊值傳至後端
Ext.getCmp('btn_save').beforeEdit = function () {
        //isCheck = S_DB.doSave('Update');
        //doSave: function (actType_S, apiName, pkFunctionName, oKeyArr)
        //oDKeyArr:要修改的PK,在JS樣板會自動加上o_並起一併傳到C#(EX:'SCITM')
        isCheck = S_DB.doSave('Update', undefined, undefined, ['PROJID','TYPE','ITEM']);
        return isCheck;
    };

2>*.cs- 透過 executeUpdate 參數- 組合出 SQL
     UPDATE  AMM_CHKCHG
     SET          PROJID=:PRJID
                      TYPE=:TYPE
                      ITEM=:ITEM 
                      CHKCHG_TM=:CHKCHG_TM
     WHERE   PROJID=:o_PROJID
     AND         TYPE=:o_TYPE
     AND          ITEM=:o_ITEM

-->
[HttpPost]
        public void Update()
        {
            var c = System.Web.HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            //string[] arrCondition = getPK();
            //excuteUpdate(nvc, DBTable, arrCondition);
            //string[] arrCondition = new string[] { "PROJID","TYPE" };  //會異動到的key值(ITEM)不要寫進去
            string[] arrCondition = new string[] {};  //會動到的key值不要寫進去
            NameValueCollection i_nvc = new NameValueCollection();
            string[] arr_key = nvc.AllKeys;

            Dictionary<string, dynamic> oldParamDict = new Dictionary<string, dynamic>();
            for (int i = 0; i < arr_key.Length; i++)
            {
                if ((arr_key[i].IndexOf("o_") >= 0))
                {
                    oldParamDict.Add(arr_key[i], nvc[arr_key[i]]);
                }
                else
                {
                    i_nvc[arr_key[i]] = nvc[arr_key[i]];
                }
            }
//public string excuteUpdate(NameValueCollection nvc, string tableName, string[] arrCondition, Dictionary<string, dynamic> dict = null, bool isExcute = true, Dictionary<string, dynamic> oldParamDict = null, OracleConnection i_conn = null)
            excuteUpdate(i_nvc, "AMM_CHKCHG", arrCondition, null, true, oldParamDict);
        }