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);
        }



V1060304A – try exception 訊息: Tmp_Sql 由內層傳至外層 - throw new Exception(Tmp_Msg) - raise

 目的: V1060304A – try exception 訊息: Tmp_Sql 由內層傳至外層 , Ex:錯誤的 SQL

處理說明: 1>


1>*.cs
  try
            {
                //取得[來源1] & [目的2] 的 資料欄位值
               UPDATE_AMM_CHKCHG_ASN(Tmp_PROJID1, Tmp_TYPE1, Tmp_ITEM1, Tmp_ASN1, Tmp_ASN2);             
             Tmp_RtnMsg ="專案別(" + Tmp_PROJID1 + ")<br>"
                                        + "件號(" + Tmp_PN1 + ")<br>"
                                       + "ITEM(" + Tmp_ITEM1 + ")<br>"
                                        + "來源機號(" + Tmp_ASN1 + ")<br>"
                                        + "目的機號(" + Tmp_ASN2 + ")<br>"
                                       + "定更定檢拆挪完成!!<br>";
                return Tmp_RtnMsg;
            }  // end of try
            catch (Exception e)
            {
                Tmp_RtnMsg = myfunc.Get1ORA(e.Message);
                Tmp_RtnMsg = "錯誤: 拆挪作業失敗 !!<br>"
                                         + Tmp_RtnMsg+"<br>"
                                         +"SQL如下:<br>"
                                         +Tmp_Sql;
            }
            return Tmp_RtnMsg;

public void UPDATE_AMM_CHKCHG_ASN(string par_PROJID, string par_TYPE, string par_ITEM, string par_ASN1, string par_ASN2, string par_12="1")
 {
 try
            {
 }   // end of try
            catch (Exception e)
            {
                Tmp_RtnMsg = myfunc.Get1ORA(e.Message);
                Tmp_RtnMsg = Tmp_RtnMsg + "<br>"
                                       + "SQL:<br>"
                                       + Tmp_Sql;
                //Tmp_RtnMsg = "錯誤: 拆挪作業失敗 !!<br>"
                //                         + Tmp_RtnMsg + "<br>"
                //                         + "SQL如下:<br>"
                //                         + Tmp_Sql;
                throw new Exception(Tmp_RtnMsg);
                //raiseEXP(new Exception(), Tmp_RtnMsg);
            }

2026年6月23日 星期二

V1060304A-定更定檢拆挪管制 - 自定icon – icon佔滿按鈕 - 空間 - space - css

 目的: V1060304A-定更定檢拆挪管制 - 自定icon – icon佔滿按鈕

處理說明: 1>var Tmp_Str = "<link type='text/css' rel='stylesheet' href='../JsFunction/mycss.css' >";
                      $('head').append(Tmp_Str);

     2>  var cmp_sub_btn_MOVE12 = get_cmp_btn1('右移', 'sub_btn_MOVE12', 10, 'myicon-right',);               var cmp_sub_btn_MOVE13 = get_cmp_btn1('  ', 'sub_btn_MOVE13', 10, 'icon-down',);
           --> 按鈕文字填入'   ' , 空白space  

    var cmp_sub_btn_MOVE31 = get_cmp_btn1('  ', 'sub_btn_MOVE31', 10, 'icon-up',);
3> //利用 { xtype: 'panel', flex: 20, } 製造按鈕空間
       items: [
                      { xtype: 'panel', flex: 20, }, //space panel
                       cmp_sub_btn_MOVE12,
                      { xtype: 'panel', flex: 5, }, //space panel
                       cmp_sub_btn_MOVE21,
                      { xtype: 'panel', flex: 5, },//space panel
                  ]

1>mycss.css
<style type="text/css" >
#my_tbl {
    border-width: 9px;
    border-style: solid;    
}
.my_bigfont{
    font-size:  30px;
        color: yellow;
}
.my_redcolor {
    background-color: red;
    background: red;
}
.my_required {
    background: #FFDBE4;
}
.my_lightgreen {
    background: #CCFF00;
}
.myicon-right {
    background-image: url('../images/icons/right.png'); /* 圖示路徑 */
    /*background-size: cover; */ /*圖示縮放填滿 */
    background-position: center;
    width: 80% !important;
    height: 80% !important;
}
 </style >

2>V1060304A.js
 //panel22 左移/右移
    var cmp_sub_btn_MOVE21 = get_cmp_btn1('  ', 'sub_btn_MOVE21', 10, 'icon-left-select',);
    //使用自定的 mycss.css檔案
    //var cmp_sub_btn_MOVE12 = get_cmp_btn1('右移', 'sub_btn_MOVE12', 10, 'myicon-right',);  
    var cmp_sub_btn_MOVE12 = get_cmp_btn1('  ', 'sub_btn_MOVE12', 10, 'icon-right-select',);
    //panel3 下移1/上移1     下移2/上移2
    var cmp_sub_btn_MOVE13 = get_cmp_btn1('  ', 'sub_btn_MOVE13', 10, 'icon-down',);
    var cmp_sub_btn_MOVE31 = get_cmp_btn1('  ', 'sub_btn_MOVE31', 10, 'icon-up',);
    var cmp_sub_btn_MOVE23 = get_cmp_btn1('  ', 'sub_btn_MOVE23', 10, 'icon-down',);
    var cmp_sub_btn_MOVE32 = get_cmp_btn1('  ', 'sub_btn_MOVE32', 10, 'icon-up',);

   {  //sub_panel22,左/右移    //利用 製造按鈕空間{ xtype: 'panel', flex: 20, }
                                                xtype: 'panel',
                                                id: 'sub_panel22',
                                                flex: 5,
                                                layout: { type: 'vbox',align:'stretch',},
                                                border: 1,
                                                //title: 'sub_panel22',
                                                items: [                                                    
                                                    { xtype: 'panel', flex: 20, }, //space panel
                                                    //{ xtype: 'spacer' },
                                                    cmp_sub_btn_MOVE12,                                                    
                                                    { xtype: 'panel', flex: 5, }, //space panel
                                                    //{ xtype: 'spacer' },
                                                    cmp_sub_btn_MOVE21,
                                                    //{ xtype: 'spacer' },
                                                    { xtype: 'panel', flex: 5, },//space panel
                                                ]
                                            },


2026年6月21日 星期日

V1060301 – Visual Studio的 Debug 問題  按[下一步]卻停在不對的 statement , Debug/Release

 目的: V1060301 – Visual Studio Debug 問題,    [下一步]卻停在不對的 statement

處理說明: 1>Visual Studio的 組態必需為 Debug , 不可為  Release ,
                       --> 若為 Release ,則 Debug 的下一步  statement 會不正確




2026年6月17日 星期三

V1060304A- 判斷多欄位PK是否存在 Grid(store)中 – store.findBy( function(rec,id) { }) - 符合

 目的: V1060304A- 判斷多欄位PK是否存在 Grid(store) – store.findBy( function(rec,id) { })

處理說明: 1>var Tmp_index= store.findBy( function (rec,id) {      }) ;
                       若有符合條件,則傳回 符合的 index 
                            var Tmp_index = gridstore.findBy(function (rec, id) {
                                       var Tmp_bol = true;           
                                       Tmp_bol = rec.data["PROJID"].toString() == Tmp_PROJID
                                                         && rec.data["TYPE"].toString() == Tmp_TYPE
                                                         && rec.data["ITEM"].toString() == Tmp_ITEM;           
                                        return Tmp_bol;   // true : 有找到
                             });


1>*.js
      var Tmp_PROJID = nulltoStr(cur_rec.data['PROJID']).toString();
      var Tmp_TYPE = nulltoStr(cur_rec.data['TYPE']).toString();
      var Tmp_ITEM = nulltoStr(cur_rec.data['ITEM']).toString();
      var Tmp_ASN = nulltoStr(cur_rec.data['ASN']).toString();
 
//判斷目前資料是否已存在  sub_Grid2
        var gridstore = Ext.getCmp("sub_Grid2").store;
        var Tmp_index = gridstore.findBy(function (rec, id) {
            var Tmp_bol = true;           
            Tmp_bol = rec.data["PROJID"].toString() == Tmp_PROJID
                && rec.data["TYPE"].toString() == Tmp_TYPE
                && rec.data["ITEM"].toString() == Tmp_ITEM;           
            return Tmp_bol;   // true : 有找到
        });
        if (Tmp_index > 0) {
            Tmp_Str = "機號(" + Tmp_ASN2 + ")<br>"
                + "分類(" + Tmp_TYPE + ")<br>"
                + "ITEM(" + Tmp_ITEM + ")<br>"
                //+ "定更定檢項目(" + Tmp_CHKCHG_NM + ")<br>"               
                + " 資料已存在!!<br><br>"
                + "請先將機號(" + Tmp_ASN2 + ")ITEM(" + Tmp_ITEM + ")拆挪至備份件<br> "
                + "才可將機號(" + Tmp_ASN1 + ")ITEM(" + Tmp_ITEM + ")拆挪至機號(" + Tmp_ASN2+")<br>"
                ;
            mywarnalert(Tmp_Str);
            return;
        }