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

 

2026年6月16日 星期二

V1060304A – sub_Grid 不分頁 && 不顯示Toolbar

 目的: V1060304A – sub_Grid 不分頁 && 不顯示Toolbar

處理說明: 1>資料不分頁:
                       DataSet ds = getDataTable(cmd, countSql, false);
                  2>Toolbar 不顯示
                       Ext.getCmp('sub_Grid1_ptb').hide();  //toolbar 名稱= Grid名稱+'_ptb';
                       Ext.getCmp('sub_Grid2_ptb').hide(); 
                       Ext.getCmp('sub_Grid3_ptb').hide();



1>*.cs

        DataSet ds = getDataTable(cmd, countSql, false);  //paging = false

2>*.js
    //隱藏 ToolBar  , //toolbar 名稱= Grid名稱+'_ptb';
    Ext.getCmp('sub_Grid1_ptb').hide();
    Ext.getCmp('sub_Grid2_ptb').hide();
    Ext.getCmp('sub_Grid3_ptb').hide();