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


V1060304A- 調整版面高度 – 若為 region ,則split: true 若為 hbox,vbox 則 { xtype: 'splitter',width: 2},

 目的: V1060304A- 調整版面高度  
                  若為 region ,split: true  
            若為 hbox,vbox { xtype: 'splitter',width: 2}, 

處理說明:  1> 若為 region ,split: true    , Ex: V1060304A                  


   2> 若為 hbox,vbox { xtype: 'splitter',width: 2},  Ex: V20302B

1>V1060304A.js
 {  //往上/往下按鈕 - 
                        xtype: 'panel',
                        id: 'sub_panel3',
                        height: 60,
                        split: true,
                        region: 'south',
                        layout: { type: 'hbox', align: 'stretch' },
                        border: 1,
                        //title: 'sub_panel3',
                        items: [
                            { xtype: 'panel', flex: 30, }, //space panel
                            cmp_sub_btn_DOWN1,
                            { xtype: 'panel', flex: 10, }, //space panel
                            cmp_sub_btn_UP1,
                            { xtype: 'panel', flex: 50, },//space panel
                            cmp_sub_btn_DOWN2,
                            { xtype: 'panel', flex: 10, }, //space panel
                            cmp_sub_btn_UP2,
                            { xtype: 'panel', flex: 20, }, //space panel
                            cmp_sub_btn_CLOSE,
                        ]
                    },


2>V20304B.js - 系統件除帳
{
  xtype:'panel',bodyStyle: "background-color:transparent;", border: false, 
layout: {  type: "vbox",  align: 'stretch' }, padding: "5",
            id: 'sub1_myForm', items: [
 {
                    xtype: "fieldcontainer", fieldLabel: "內容", labelWidth: 60, layout: "fit", flex: 3, items: [
                        {
                            id: "sub1_content", name: "sub1_content", xtype: "textareafield",  padding: "0 4 0 0", 
                            //value: "AJT",
                        },
                    ]
                }, // end of 內容
  {
                    xtype: 'splitter',
                    width: 2,
                },
                {  //下方 TreeView, 左右移,正本/副本
                    xtype: "panel", flex: 5,
                    layout: {
                        type: 'hbox',
                        align: 'stretch'
                    },