2025年3月20日 星期四

Web – V20305G –[物料清單匯出]鈕 – 套表匯出 / 不套表匯出 - get_SS_FILES - 取得套表檔案

 目的: V20305G –[物料清單匯出]鈕 – 套表匯出 / 不套表匯出 

            - get_SS_FILES - 取得套表檔案

處理說明: 1>依勾選的資料s,當成參數,傳至後端(*.js)
                       //取得目前所勾選資料,再匯出    
                      for (var i = 0; i < CHK_PK_OBJ.PK_LIST.length; i++) {
                           cur_rec = CHK_PK_OBJ.ALL_LIST[i];
                          if (!(JSON.stringify(cur_rec) === '{}')) {
                          Tmp_DataAry1.push(cur_rec);
                       }
                      }
                        //將目前子畫面的資料(Table)轉成 JSON字串
                       let Tmp_DataString1 = JSON.stringify(Tmp_DataAry1); 
                      //因為[備註]欄位 有/n .. 等特殊字元 ,  JSON.stringify 會 Error
                      var np = {};    
                      np = {
                               DataString1: Tmp_DataString1,
                      };
                  2>取得套表檔案(*.cs)
                      string Tmp_FName = "V20305_物料清單匯出.xlsx";      //套表的檔案名稱 , 
                      string documentPath = HttpContext.Current.Server.MapPath("~") + "document\\";  
                      string pathFName = documentPath + Tmp_FName;          
                      FileStream fs = null;
                      Workbook wk = null;
                      fs = myfunc.get_SS_FILES(Tmp_FName);
                      wk = new Workbook();
                      wk.LoadFromStream(fs);

                  3>若不用套表(*.cs)  
 string[] outFieldArray = {"提領編號","交修單號","維修交修單號","工單號碼","序號",
                                          "展BOM件號","展BOM件號名稱","圖號","索引","技令號碼",
                                          "WP","提料件號","零件名稱","記錄項次","需求數量",
                                          "需求單位","更換情形","超量原因","子件工單號碼","子件序號",
                                    "備註","機種","可修件更換原因說明","拆挪LRU交修單號","拆挪子件序號",
                                          "故障現象說明","請料者","狀態"};
                for (int i = 0; i < outFieldArray.Length; i++)
                {
                    ws.Range[myfunc.GetExcelPos(i, 0)].Text = outFieldArray[i];
                }



1>*.js
 //取得目前所勾選資料,再匯出    
    for (var i = 0; i < CHK_PK_OBJ.PK_LIST.length; i++) {
            cur_rec = CHK_PK_OBJ.ALL_LIST[i];
        if (!(JSON.stringify(cur_rec) === '{}')) {
            Tmp_DataAry1.push(cur_rec);
        }
    }
    let Tmp_DataString1 = JSON.stringify(Tmp_DataAry1);
    //console.log("Tmp_DataString1:", Tmp_DataString1);
    //因為[備註]欄位 有/n .. 等特殊字元 ,  JSON.stringify 會 Error
    var np = {};    
    np = {
        DataString1: Tmp_DataString1,
    };


2>*.cs
[HttpPost]
        public void Material_XlsOut()
        {
            //取得參數值
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            
            // 1>將 SS_FILES.FBOLD 存成 Local檔案
            //取得目前子畫面的欄位值
string Tmp_DataString1 = nvc["DataString1"];  //Tmp_DataString:  將目前子畫面的資料. JSON字串   

            //將 table 字串轉成 DataTable
//DataTable DataTable1 = (DataTable)JsonConvert.DeserializeObject(Tmp_DataString1, (typeof(DataTable)));
            DataTable dt1 = myfunc.JSON2dt(Tmp_DataString1);

            string Tmp_Sql = "";
            string Tmp_Str = "";
            string Tmp_Str1 = "";
            string Tmp_RtnMsg;
            string Tmp_FName = "V20305_物料清單匯出.xlsx";      //套表的檔案名稱 , 
            //documentPath = c:\\inetpub\wwwroot\TLS5\TLSWEB_AMM5\document\
 string documentPath = HttpContext.Current.Server.MapPath("~") + "document\\"; //取得實實的路徑                        
            string pathFName = documentPath + Tmp_FName;
            //需要擷取大量資料時,DataReader 是很好的選擇,因為資料不會快取至記憶體。
            //OracleDataReader reader;
            FileStream fs = null;
            Workbook wk = null;

            //MemoryStream mstream = new MemoryStream();
            string FileName = "V20305_物料清單匯出_" + DateTime.Now.ToString("yyyyMMdd") + ".xlsx";
            string FileName1 = documentPath + FileName;
            MemoryStream mstream = new MemoryStream();
            HttpCookie MyCookie;
            int row = 0;
            try
            {
//套表設定 - 欄位寬度佳
                // 取得 Template SS_FILES 
                fs = myfunc.get_SS_FILES(Tmp_FName);
                wk = new Workbook();
                wk.LoadFromStream(fs);


                //2 > 主機.Local檔案 XLS 讀入  FStream
                Worksheet ws = wk.Worksheets[0];//獲取第一個工作表

//非套表設定 - 欄位寬度不佳
//string[] outFieldArray = {"提領編號","交修單號","維修交修單號","工單號碼","序號",
//                                           "展BOM件號","展BOM件號名稱","圖號","索引","技令號碼",
//                                           "WP","提料件號","零件名稱","記錄項次","需求數量",
//                                           "需求單位","更換情形","超量原因","子件工單號碼","子件序號",
//                                "備註","機種","可修件更換原因說明","拆挪LRU交修單號","拆挪子件序號",
//                                           "故障現象說明","請料者","狀態"};
//for (int i = 0; i < outFieldArray.Length; i++)
//{
//    ws.Range[myfunc.GetExcelPos(i, 0)].Text = outFieldArray[i];
//}

                ////AMM_UOC
                string Tmp_RPNOAF, Tmp_OGONOAF, Tmp_MRPNOAF, Tmp_SAPNO_, Tmp_SEQOAF;
                string Tmp_PN, Tmp_C_NM;
                //AMM_UOCD
                string Tmp_FIG, Tmp_IND, Tmp_TMNOXX, Tmp_WP, Tmp_FACPN, Tmp_RQCAGE;
                string Tmp_C_NM_, Tmp_ITMUOCD, Tmp_NQTYAH, Tmp_C_UNIT, Tmp_RSTHAH, Tmp_RSTHAH_;
                string Tmp_OVERAHD, Tmp_FRNOAF_S, Tmp_SN, Tmp_NOTE, Tmp_EIAC, Tmp_FACHRN;
                string Tmp_RMRPNOAF, Tmp_RMSBSN, Tmp_FRMK, Tmp_EMPLYID, Tmp_EMPLYID_;
                string Tmp_STAUOCD, Tmp_STAUOCD_;

                int Tmp_cnt1 = dt1.Rows.Count;
                int Tmp_cnt2;                
                DataTable dt2 = new DataTable();
                for (int i = 0; i < dt1.Rows.Count; i++)
                {
                    //PK  AMM_FM 
                    Tmp_RPNOAF = dt1.Rows[i]["RPNOAF"].ToString();
                    Tmp_OGONOAF = dt1.Rows[i]["OGONOAF"].ToString();
                    Tmp_MRPNOAF = dt1.Rows[i]["MRPNOAF"].ToString();
                    Tmp_SAPNO_ = dt1.Rows[i]["SAPNO_"].ToString();
                    Tmp_SEQOAF = dt1.Rows[i]["SEQOAF"].ToString();
                    Tmp_PN = dt1.Rows[i]["PN"].ToString();
                    Tmp_C_NM = dt1.Rows[i]["C_NM"].ToString();

                    Tmp_Sql = " SELECT  dense_rank()  over(order by  A.PN,A.RPNOAF,A.EIAC,A.EI_LCN,A.EI_ALC,A.NHA_LCN,A.NHA_ALC,A.LCN,A.ALC) as RNK, "
                                                    + " A.RPNOAF,A.AMMNO,A.EIAC,A.EI_LCN,A.EI_ALC,A.NHA_LCN,A.NHA_ALC,A.LCN,A.ALC,"
                                                    + " A.PN,A.CAGE,A.NSN,A.RQPN,A.RQCAGE, A.FACPN,"
                                                    + " B.FIG,B.IND,B.TMNOXX,B.WP,B.ITMUOCD, "
                                                    + " B.NQTYAH,B.C_UNIT,B.RSTHAH,B.OVERAHD,B.FRNOAF_S,"
                                                    + " B.SN,B.NOTE,B.EIAC,B.FACHRN,B.RMRPNOAF,B.RMSBSN,"
                                                    + " B.FRMK,B.EMPLYID,B.STAUOCD "
                                    + "  FROM     AMM_UOC A, AMM_UOCD B  "
                                    + "  WHERE    A.RPNOAF = B.RPNOAF  "
                                    + "  AND A.EIAC = B.EIAC "
                                    + "  AND A.EI_LCN = B.EI_LCN "
                                    + "  AND A.EI_ALC = B.EI_ALC "
                                    + "  AND A.NHA_LCN = B.NHA_LCN "
                                    + "  AND A.NHA_ALC = B.NHA_ALC "
                                    + "  AND A.LCN = B.LCN "
                                    + "  AND A.ALC = B.ALC  "
                                    + "   and   B.EFF='Y'  ";
                    //交修單號 
                    if (!myfunc.checkisnull(Tmp_RPNOAF))
                    {
                        Tmp_Sql = Tmp_Sql + " AND    A.RPNOAF  =" + myfunc.AA(Tmp_RPNOAF);
                    };
                    dt2 = myfunc.SqlOpen(dt2, Tmp_Sql);
                    Tmp_cnt2 = dt2.Rows.Count;
                    for (int j = 0; j < dt2.Rows.Count; j++)
                    {
                        //Detail   AMM_UOC,AMM_UOCD
                        Tmp_FIG = dt2.Rows[j]["FIG"].ToString();
                        Tmp_IND = dt2.Rows[j]["IND"].ToString();
                        Tmp_TMNOXX = dt2.Rows[j]["TMNOXX"].ToString();
                        Tmp_WP = dt2.Rows[j]["WP"].ToString();
                        Tmp_FACPN = dt2.Rows[j]["FACPN"].ToString();
                        Tmp_RQCAGE = dt2.Rows[j]["RQCAGE"].ToString();
                        Tmp_Sql = "  SELECT   C_NM  "
                                       + "  FROM     SP_BASE@TLS_245 "
                                       + "  WHERE   PN=" + myfunc.AA(Tmp_FACPN)
                                       + "  AND        CAGE=" + myfunc.AA(Tmp_RQCAGE);
                        Tmp_C_NM_ = myfunc.SqlValue(Tmp_Sql);
                        Tmp_ITMUOCD = dt2.Rows[j]["ITMUOCD"].ToString();
                        Tmp_NQTYAH = dt2.Rows[j]["NQTYAH"].ToString();
                        Tmp_C_UNIT = dt2.Rows[j]["C_UNIT"].ToString();
                        Tmp_RSTHAH = dt2.Rows[j]["FIG"].ToString();
                        //public static string get_KEYCODE_NM(string par_TBLNM, string par_KEY_NAME, string par_KEY_CODE)
                        Tmp_RSTHAH_ = myfunc.get_KEYCODE_NM("AMM_UOCD", "RSTHAH", Tmp_RSTHAH);
                        Tmp_OVERAHD = dt2.Rows[j]["OVERAHD"].ToString();
                        Tmp_FRNOAF_S = dt2.Rows[j]["FRNOAF_S"].ToString();
                        Tmp_SN = dt2.Rows[j]["SN"].ToString();
                        Tmp_NOTE = dt2.Rows[j]["NOTE"].ToString();
                        Tmp_EIAC = dt2.Rows[j]["EIAC"].ToString();
                        Tmp_FACHRN = dt2.Rows[j]["FACHRN"].ToString();
                        Tmp_RMRPNOAF = dt2.Rows[j]["RMRPNOAF"].ToString();
                        Tmp_RMSBSN = dt2.Rows[j]["RMSBSN"].ToString();
                        Tmp_FRMK = dt2.Rows[j]["FRMK"].ToString();
                        Tmp_EMPLYID = dt2.Rows[j]["EMPLYID"].ToString();
                        Tmp_EMPLYID_ = myfunc.getEmp_NM(Tmp_EMPLYID);
                        Tmp_STAUOCD = dt2.Rows[j]["STAUOCD"].ToString();
                        Tmp_STAUOCD_ = myfunc.get_KEYCODE_NM("AMM_UOCD", "STAUOCD", Tmp_STAUOCD);

                        //寫入 EXCEL檔案
                        row = row + 1;
                        ws.Range[myfunc.GetExcelPos(0, row)].Text = Tmp_OGONOAF;
                        ws.Range[myfunc.GetExcelPos(1, row)].Text = Tmp_RPNOAF;
                        ws.Range[myfunc.GetExcelPos(2, row)].Text = Tmp_MRPNOAF;
                        ws.Range[myfunc.GetExcelPos(3, row)].Text = Tmp_SAPNO_;
                        ws.Range[myfunc.GetExcelPos(4, row)].Text = Tmp_SEQOAF;
                        ws.Range[myfunc.GetExcelPos(5, row)].Text = Tmp_PN;
                        ws.Range[myfunc.GetExcelPos(6, row)].Text = Tmp_C_NM;
                        ws.Range[myfunc.GetExcelPos(7, row)].Text = Tmp_FIG;
                        ws.Range[myfunc.GetExcelPos(8, row)].Text = Tmp_IND;
                        ws.Range[myfunc.GetExcelPos(9, row)].Text = Tmp_TMNOXX;
                        ws.Range[myfunc.GetExcelPos(10, row)].Text = Tmp_WP;
                        ws.Range[myfunc.GetExcelPos(11, row)].Text = Tmp_FACPN;
                        ws.Range[myfunc.GetExcelPos(12, row)].Text = Tmp_C_NM_;
                        ws.Range[myfunc.GetExcelPos(13, row)].Text = Tmp_ITMUOCD;
                        ws.Range[myfunc.GetExcelPos(14, row)].Text = Tmp_NQTYAH;
                        ws.Range[myfunc.GetExcelPos(15, row)].Text = Tmp_C_UNIT;
                        ws.Range[myfunc.GetExcelPos(16, row)].Text = Tmp_RSTHAH_;
                        ws.Range[myfunc.GetExcelPos(17, row)].Text = Tmp_OVERAHD;
                        ws.Range[myfunc.GetExcelPos(18, row)].Text = Tmp_FRNOAF_S;
                        ws.Range[myfunc.GetExcelPos(19, row)].Text = Tmp_SN;
                        ws.Range[myfunc.GetExcelPos(20, row)].Text = Tmp_NOTE;
                        ws.Range[myfunc.GetExcelPos(21, row)].Text = Tmp_EIAC;
                        ws.Range[myfunc.GetExcelPos(22, row)].Text = Tmp_FACHRN;
                        ws.Range[myfunc.GetExcelPos(23, row)].Text = Tmp_RMRPNOAF;
                        ws.Range[myfunc.GetExcelPos(24, row)].Text = Tmp_RMSBSN;
                        ws.Range[myfunc.GetExcelPos(25, row)].Text = Tmp_FRMK;
                        ws.Range[myfunc.GetExcelPos(26, row)].Text = Tmp_EMPLYID_;
                        ws.Range[myfunc.GetExcelPos(27, row)].Text = Tmp_STAUOCD_;                        
                    }  // for j=
                }  // for i=
                wk.SaveToStream(mstream, FileFormat.Version2007);
                wk.SaveToFile(FileName1, FileFormat.Version2007);
            }  //try
            catch (Exception e)
            {
                Console.WriteLine(e);
                Tmp_Str = "錯誤:匯出檔案失敗,訊息如下:<br>"
                               + e.Message;
                MyCookie = new HttpCookie("Rtn_Msg", HttpUtility.UrlEncode(Tmp_Str));
                HttpContext.Current.Response.Cookies.Add(MyCookie);
                HttpContext.Current.Response.End();
            }
            finally
            {
                wk.Dispose();
                fs.Close();
                fs.Dispose();
            }

            //Tmp_Cnt = 6;
            Tmp_Str = "已匯出完成!!(" + row.ToString() + "筆)<br>"
                            + "檔案名稱(" + FileName + ")";
            MyCookie = new HttpCookie("Rtn_Msg", HttpUtility.UrlEncode(Tmp_Str));
            HttpContext.Current.Response.Cookies.Add(MyCookie);
            HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8) + "\"");
            HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
            HttpContext.Current.Response.BinaryWrite(mstream.ToArray());
            HttpContext.Current.Response.End();
        }


Web V20301 – 複製 -目前勾選的資料, 非目前所在資料 - 移除原本Template eventhandler - 複製 Array -跳至最後一頁

 目的: Web V20301 – 複製 -目前勾選的資料, 非目前所在資料

處理說明:1>將[複製]鈕 - Template 程式. disable
                     Ext.getCmp('btn_copy').setVisible(true);
                     Ext.getCmp('btn_copy').setText("複製");
             Ext.getCmp('btn_copy').un("click", Ext.getCmp('btn_copy').events.click.listeners[0].fn);

                2>處理勾選的資料s
                     if (CHK_PK_OBJ.PK_LIST.length == 0) {
                          buttonModel.modelType = 0;
                          mywarnalert('請先勾選要複製的資料!!');
                   }
                   else {
                    copy_recs = Array.from(CHK_PK_OBJ.ALL_LIST);
                    for (let i = 0; i <= CHK_PK_OBJ.PK_LIST.length - 1; i++) {
                        console.log("i:", i);                        
                        copy_rec = copy_recs[i];
                        Tmp_NEXT_FMNO = get_NEXT_FMNO();
                        var Tmp_cur_DT = DatetoStr(now, "Y/m/d");
                        var Tmp_MDDT = DatetoStr(copy_rec["MDDT"], "Y/m/d");
                        copy_rec["FMNO"]=Tmp_NEXT_FMNO;                        

               3>複製後,停留在最新的一筆資料           
                    gridstore.on('load', function (me, records, successful, eOpts) {
                        var Tmp_index = gridstore.find("FMNO", Tmp_NEXT_FMNO);
                        var sel_rec = gridstore.getAt(Tmp_index);
                        Ext.getCmp('grid_Single').getView().getSelectionModel().select(sel_rec);
                        //locate 後, reset load function 
   gridstore.un("load", gridstore.events.load.listeners[gridstore.events.load.listeners.length-1].fn);
                    })  // end of Ext.getCmp('grid_Single')..on("load")
    



1>*.js

Ext.getCmp("btn_copy").on('click', function (me, e, eOpts) {
        //原始的Grid 選擇資料
         //var cur_recs = Ext.getCmp('grid_Single').getSelectionModel().getSelection();
        var cur_recs = [];
        var cur_rec;
        console.log("before copy_rec");
        var copy_recs,copy_rec;  //?? 如何產生另一 copy_rec 不和 cur_rec 相同
        var np = {};
        if (CHK_PK_OBJ.PK_LIST.length == 0) {
            buttonModel.modelType = 0;
            mywarnalert('請先勾選要複製的資料!!');
        }
        else {
            me.delMessage = "確定複製勾選的資料嗎?";
            Ext.Msg.confirm('提醒', me.delMessage, callBackFunc);
            function callBackFunc(id) {
                if (id == 'yes') {
                    gridstore.on('load', function (me, records, successful, eOpts) {
                        var Tmp_index = gridstore.find("FMNO", Tmp_NEXT_FMNO);
                        console.log("Tmp_index:", Tmp_index);
                        var sel_rec = gridstore.getAt(Tmp_index);
                        console.log("sel_rec:", sel_rec);
                        Ext.getCmp('grid_Single').getView().getSelectionModel().select(sel_rec);
                        console.log("gridstore.events:", gridstore.events);
    gridstore.un("load", gridstore.events.load.listeners[gridstore.events.load.listeners.length-1].fn);
                    })  // end of Ext.getCmp('grid_Single')..on("load")
                    console.log("cur_recs.length:", cur_recs.length);
                    //複製 新的  Array , 不覆蓋原本的 Array
                    copy_recs = Array.from(CHK_PK_OBJ.ALL_LIST);
                    for (let i = 0; i <= CHK_PK_OBJ.PK_LIST.length - 1; i++) {
                        copy_rec = copy_recs[i];
                        Tmp_NEXT_FMNO = get_NEXT_FMNO();
                        var Tmp_cur_DT = DatetoStr(now, "Y/m/d");
                        //var Tmp_MDDT = DatetoStr(copy_rec.data["MDDT"], "Y/m/d");
                        var Tmp_MDDT = DatetoStr(copy_rec["MDDT"], "Y/m/d");
                        console.log("Tmp_NEXT_FMNO:", Tmp_NEXT_FMNO);
                        copy_rec["FMNO"]=Tmp_NEXT_FMNO;                        
                        copy_rec["BTDT"] = Tmp_cur_DT;        
                        copy_rec["MDDT"] = Tmp_cur_DT;        
                        copy_rec["STATFM"] = "A";        
                        copy_rec["DTSOR"] = "A";        
                        copy_rec["OSM"] = "";                    
                        copy_rec["PAMMNO"] = "";                    
                        copy_rec["FRNOAF"] = "";                    
                        //新增資料庫資料
                        Copy_FMNO(copy_rec);
                    } //  end of for (let i=0,)                    
                    //因為複製後, 按[顯示資料]鈕, 並不會顯示刪才新增的資料,& Local 新增的資料                    
                    Ext.getCmp('btn_Show').fireHandler();
                    Ext.getCmp('grid_Single').getView().refresh();
                    //跳至最後一頁
                    var Tmp_ptb = Ext.getCmp('grid_ptb');
                    Tmp_ptb.moveLast();                    
                    buttonModel.modelType = 0;
                }  // end    if (id == 'yes')             
            }  // end of callbackfunc
        }  //end of else {}       
    }
    );

2025年2月25日 星期二

V20305 – 零件需求登錄 –[編輯]鈕 - 前端取得 KEYCODE 名稱 -V120202A- 取得人員姓名

目的: V20305  – 零件需求登錄 –[編輯] - 前端取得 KEYCODE 名稱 - 取得人員姓名

處理說明: 1> 前端取得 KEYCODE 名稱
                                             Tmp_RSTHAH = nulltoStr(cur_rec.data['RSTHAH']).toString();
                                            Tmp_RSTHAH_ = get_KEY_CODE_NM("AMM_UOCD","RSTHAH",Tmp_RSTHAH);

                                    2> 前端取得 人員姓名
                       Tmp_LoginId = loginInfo.id;
                       Tmp_LoginNM = getEmp_NM(loginInfo.id);



1>*.js
      //V20305A.js
     Tmp_RSTHAH = nulltoStr(cur_rec.data['RSTHAH']).toString();
     Tmp_RSTHAH_ = get_KEY_CODE_NM("AMM_UOCD","RSTHAH",Tmp_RSTHAH);

     //V120202A.js
     Tmp_LoginId = loginInfo.id;
     Tmp_LoginNM = getEmp_NM(loginInfo.id);

2>myfunc.js   - get_KEY_CODE_NM      - getEmp_NM
* 傳入參數:   par_TBL_NAME:  Table名稱
 *                       par_KEY_NAME:  KEYCODE欄位名稱  
 *                       par_KEY_CODE:   KEYCODE欄位值
SELECT KEY_CODE, DESCPT
FROM   KEYCODE
WHERE  TBL_NAME = 'AMM_UOCD'
AND    KEY_NAME = 'RSTHAH'
AND    KEY_CODE = 'A';
 */
function get_KEY_CODE_NM(par_TBL_NAME,par_KEY_NAME,par_KEY_CODE) {
    var obj = '';
    var Tmp_KEY_CODE_NM = "";
    if ( (par_TBL_NAME.length > 0) && (par_KEY_NAME.length > 0) && (par_KEY_CODE.length > 0) ){
        Ext.Ajax.request({
            method: "POST",
            //url: "../api/V20302AAPI/getEmp_NM?EMPLYID=" + par_EMPLYID,
            url: "../api/myAPI/get_KEY_CODE_NM?TBL_NAME=" + par_TBL_NAME+"&KEY_NAME="+par_KEY_NAME+"&KEY_CODE="+par_KEY_CODE,
            async: false,
            success: function (response, opts) {
                obj_Temp = Ext.decode(response.responseText);
                //console.log("obj_Temp:", obj_Temp);
                if (obj_Temp.T1.length > 0) {
                    obj = obj_Temp;
                    Tmp_KEY_CODE_NM = obj.T1[0]["DESCPT"].toString();
                    return Tmp_KEY_CODE_NM;
                }
            }
        }
        )
    }
    return Tmp_KEY_CODE_NM;
};


// function名稱 : getEMP_NM
// 參數 : par_EMPLYID  : 員工編號
// 傳回值:   傳入員工.姓名
function getEmp_NM(par_EMPLYID) {
    var obj = '';
    var Tmp_EMPLYNM = "";
    if (par_EMPLYID.length > 0) {
        Ext.Ajax.request({
            method: "POST",
            //url: "../api/V20302AAPI/getEmp_NM?EMPLYID=" + par_EMPLYID,
            url: "../api/myAPI/getEmp_NM?EMPLYID=" + par_EMPLYID,
            async: false,
            success: function (response, opts) {
                obj_Temp = Ext.decode(response.responseText);
                //console.log("obj_Temp:", obj_Temp);
                if (obj_Temp.T1.length > 0) {
                    obj = obj_Temp;
                    Tmp_EMPLYNM = obj.T1[0]["EMPLYNM"].toString();
                    return Tmp_EMPLYNM;
                }
            }
        }
        )
    }
    return Tmp_EMPLYNM;
};


3>myAPI.cs  - get_KEY_CODE_NM
//取得  TABLE.KEYCODE 的名稱
        [HttpPost]
        public dynamic get_KEY_CODE_NM(string TBL_NAME,string KEY_NAME, string KEY_CODE)
        {
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            string Tmp_Sql = " SELECT   KEY_CODE,DESCPT "
                                       + "   FROM    KEYCODE "
                                       + "   WHERE   1=1   "
                                       +"    AND        TBL_NAME="+myfunc.AA(TBL_NAME)
                                       +"    AND        KEY_NAME=" + myfunc.AA(KEY_NAME)
                                       + "    AND        KEY_CODE=" + myfunc.AA(KEY_CODE);
            if (myfunc.checkisnull(TBL_NAME)  || myfunc.checkisnull(KEY_NAME)  || myfunc.checkisnull(KEY_CODE))
            { return null; }
            //else
            //{ Tmp_Sql = Tmp_Sql + "  AND    EMPLYID=" + myfunc.AA(EMPLYID); }
            try
            {
                OracleConnection conn = new OracleConnection(DBService.ConnectionString("AMMEU"));
                OracleCommand cmd = new OracleCommand(Tmp_Sql, conn);

                OracleDataAdapter da = new OracleDataAdapter(cmd);
                DataSet ds = new DataSet();

                conn.Open();
                da.Fill(ds, "T1");
                conn.Close();
                return ds;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }  // end of GetEmp_NM

2025年2月24日 星期一

V20305A – 零件需求編輯 – 子畫面編輯 – 唯讀/挑選/Memo欄位 - 按鈕隱藏 - 視窗最大化- New

目的: V20305A – 零件需求編輯 子畫面編輯 唯讀/挑選/Memo欄位

處理說明: 1>呼叫 Call_V20305A - 開啟子畫面
                      var win = getMyWindow("零件需求登錄", sub_V20305A_Flds, Btns_V20305A, "A");
                      //win.width = 600;
                      //win.height =300;
                      win.show();

                      win.maximize();
                      setFieldsCls('mySubFormA',..);
                      show_Data_V20305A();

                   2>設定 [必填]/[唯讀]欄位

                      setFieldsCls('mySubFormA',
                          [],  //required
                   ["sub_RPNOAF", "sub_AMMNO", "sub_TMNOXX", "sub_WP", "sub_FIG", "sub_IND",
                    "sub_NHA_PN_", "sub_NHA_QTY_", "sub_PN", "sub_CAGE", "sub_RQPN",                  
                    "sub_RQCAGE",
                   //"sub_C_UNIT",   //[C_UNIT]預設可編輯
                   "sub_QPA_TAL_", "sub_S_UNIT_",
                   "sub_SPN_", "sub_FACQTY_", "sub_ONLY_TLS",
                   "sub_EMPLYID",
                   "sub_EIAC", "sub_EI_LCN", "sub_EI_ALC", "sub_NHA_LCN", "sub_NHA_ALC",          
                   "sub_LCN", "sub_ALC",
                   ],  //readonly

                3>依欄位值,設定唯讀 , 按鈕隱藏
                     if (Tmp_C_UNIT.trim() != "") {  
                         Ext.getCmp("sub_C_UNIT").setReadOnly(true);
                         Ext.getCmp("sub_C_UNIT").inputEl.addCls('readonly');
                         Ext.getCmp("sub_btn_C_UNIT").setVisible(false);               
                     }







1>*.js

function Call_V20305A() {
console.log(" 1 inside - Call_V20305A 編輯: ");
//panel11
//交修單號(RPNOAF)
var cmp_sub_RPNOAF = get_cmp_txt1('交修單號', 'sub_RPNOAF', 100, 130);
var cmp_sub_AMMNO = get_cmp_txt1('AMM單號', 'sub_AMMNO', 100, 130);

//挑選欄位 - 料號 - 傳入 PN+CAGE挑選
 var cmp_sub_NSN = get_cmp_txt1('料號', 'sub_NSN', 100, 130);
    var cur_recs = Ext.getCmp('grid_D').getSelectionModel().getSelection();
    if (cur_recs.length == 0)
        return;
    var cur_rec = cur_recs[0];
    var Tmp_PN = nulltoStr(cur_rec.data['PN']).toString();
    var Tmp_CAGE = nulltoStr(cur_rec.data['CAGE']).toString();    
    var Tmp_urlStr = '../api/V20305AAPI/get_sub_NSNPick?isComplete=0&par_PN=' + Tmp_PN
        + '&par_CAGE=' + Tmp_CAGE;
    var cmp_sub_pick_NSN = get_pick_btn0('挑選料號', 'sub_btn_NSN',
        Tmp_urlStr ,
        ['NSN'], ['sub_NSN'],
        J_models_V20305A_NSN, J_columns_V20305A_NSN);
    cmp_sub_NSN.items.push(cmp_sub_pick_NSN);  
   
//Memo欄位
 var cmp_sub_OVERAHD = get_cmp_txtarea1('超量原因', 'sub_OVERAHD', 120, 600, 5);
 var cmp_sub_FRMK = get_cmp_txtarea1('故障現象', 'sub_FRMK', 120, 600, 5);


var sub_V20305A_Flds = [
        {
            type: 'panel', bodyStyle: "background-color:transparent;", border: 5, padding: "1",
            layout: 'border',
            items: [
                {
                    xtype: 'panel', id: 'sub_panel1', region: 'north', 
                    height: 300, layout: { type: 'hbox', align: 'stretch' },
                    items: [
                        { 
                            xtype: 'panel', id: 'sub_panel11', layout: 'vbox', flex: 10,                            
                            items: [cmp_sub_RPNOAF, cmp_sub_AMMNO, cmp_sub_TMNOXX, cmp_sub_WP, cmp_sub_FIG,
                                cmp_sub_IND, cmp_sub_NHA_PN_, cmp_sub_NHA_QTY_,
                            ]
                        },
:
:
     {
                    xtype: 'panel', id: 'sub_panel2', region: 'center',
                    layout: { type: 'vbox'},
                    border: 1,
                    items: [cmp_sub_OVERAHD,
                        cmp_sub_FRMK,
                        cmp_sub_FACHRN,
                        cmp_sub_NOTE,
                    ],
                },
            ]

      //若[需求單位]有值, 則 [需求單位]唯讀, 不可挑選  , 按鈕隱藏 
       if (Tmp_C_UNIT.trim() != "") {  
                Ext.getCmp("sub_C_UNIT").setReadOnly(true);
                Ext.getCmp("sub_C_UNIT").inputEl.addCls('readonly');
                Ext.getCmp("sub_btn_C_UNIT").setVisible(false);               
            }


2>*.cs
//過濾條件 [料號(NSN)]挑選
        [HttpPost]
        public dynamic get_sub_NSNPick(string NSN = "", string par_PN = "", string par_CAGE = "", int isComplete = 0)
        {
            //列出所有申請單(NSN)
            string Tmp_Sql ="  SELECT  NSN   "
                                       +" FROM     SP_NSN@TLS_245  "
                                       +" WHERE   PN = "+myfunc.AA(par_PN)
                                       +" AND        CAGE ="+ myfunc.AA(par_CAGE)
                                       +" ORDER  BY   NSN  ";
            string n = funId + "_sub_NSN";
            DataSet ds = setupPickDs(n, Tmp_Sql, new string[] { "AMM_FM" });
            if (NSN != null && !NSN.Equals(""))
            {
                if (isComplete == 1)
                {
                    ds = getPickDsbyCondi(n, "NSN='" + NSN + "'");
                }
                else
                {
                    ds = getPickDsbyCondi(n, "NSN  LIKE '%" + NSN + "%'");
                }
            }
            return ds;
        }  // end of  get_V20305A_NSNPick


        

2025年2月20日 星期四

V20304A – [工時提列] – Grid.欄位 設為唯讀,不可修改 , Grid欄位設為可編輯

 目的: V20304A – [工時提列] – 若工時已登錄,則Grid 設為唯讀,不可修改

處理說明:
1.Grid 欄位,允許編輯
    {
      header: "備註", dataIndex: "REMARK", width: 250, sortable: false, TMType: "string",
      editor: { xtype: 'textfield', allowBlank: true }, //允許空白
    },
   
2>Grid 欄位的編輯模式
 var sub_Grid = Ext.create('TMGrid', {
            grid_id: 'sub_Grid',
            columns: sub_Columns,
            //autoScroll: true,
            flex: 1,
            store: Ext.create('gridstore', { model: sub_model }),
            plugins: [                
                Ext.create('Ext.grid.plugin.CellEditing', { // 不會出現[Update][Cancel]鈕, 直接編輯 
                    clicksToEdit: 1,                           // 按一下進行編輯,預設為按兩下
                    clicksToMoveEditor: 1,   //在編輯模式下切換編輯另一行的行為1表示點選一就切換;                                                                  //2表示點2下才切換。
                })],
            //})],
        }); 

3>Grid 欄位唯讀
  Ext.getCmp("sub_Grid").on("beforeedit", function (editor, context) {
            return false; // 禁止編輯
        });        




1>V20304A_JSON.js
var sub_Columns = [
    { header: "", xtype: "rownumberer", width: 40, align: "center", sortable: false },
    //{ header: "系統件單號", dataIndex: "FMNO", width: 130, sortable: false, TMType: "string" },
    { header: "AMM項次", dataIndex: "AMINO", width: 80, sortable: false, TMType: "string" },
    //{ header: "流水序號", dataIndex: "ITM", width: 50, sortable: false, TMType: "string" },
    { header: "項次", dataIndex: "ITMNO", width: 70, sortable: false, TMType: "string" },
    { header: "工作項目", dataIndex: "WKDESC", width: 150, sortable: false, TMType: "string" },
    {
        header: "標準工時", dataIndex: "STDHR", width: 70, sortable: false, align: "right", TMType: "float",
        renderer: Ext.util.Format.numberRenderer('0,000.00')
    },
    {
        header: "需求工時", dataIndex: "RQHR", width: 70, sortable: false, align: "right", TMType: "float",
        renderer: Ext.util.Format.numberRenderer('0,000.00'),
        editor: { xtype: 'numberfield', allowBlank: true }, //允許空白        

    },
    {
        header: "備註", dataIndex: "REMARK", width: 250, sortable: false, TMType: "string",
        editor: { xtype: 'textfield', allowBlank: true }, //允許空白
        },
    //{ header: "件號專用表單編號", dataIndex: "PNSHTNO", width: 500, sortable: false, TMType: "string" }
];


2>V20304.js
1>> Grid 欄位可編輯
 var sub_Grid = Ext.create('TMGrid', {
            grid_id: 'sub_Grid',
            columns: sub_Columns,
            //autoScroll: true,
            flex: 1,
            store: Ext.create('gridstore', { model: sub_model }),
            plugins: [                
                Ext.create('Ext.grid.plugin.CellEditing', { // 不會出現[Update][Cancel]鈕, 直接編輯 
                    clicksToEdit: 1,                           // 按一下進行編輯,預設為按兩下
                    clicksToMoveEditor: 1,   //在編輯模式下切換編輯另一行的行為1表示點選一就切換;                                                                  //2表示點2下才切換。
                })],
            //})],
        });
        
2>> Grid 欄位唯讀, 不可編輯
//2025/02/21 , OPHR='N',仍列出工時,以便使用者查詢,但唯讀,不可修改
    if (par_OPHR == "N") {
        Ext.getCmp("sub_V20304A_OkBtn").setVisible(false);        
         //Ext.getCmp("sub_Grid").plugins = [];
        //var grid = new Ext.grid.EditorGridPanel({
        Ext.getCmp("sub_Grid").on("beforeedit", function (editor, context) {
            return false; // 禁止編輯
        });        

    }


2025年2月18日 星期二

V20305 – [刪除] – 刪除明細資料,並重新顯示Detail - 不使用 Template [刪除]鈕

 目的:  V20305 – [刪除] – 刪除明細資料,並重新顯示Detail

處理說明: 1>不使用原始的 Template [刪除]功能
                       Ext.getCmp("btn_del").beforeDel = function () {
                             return false;
                         }
                  2>自行定義[刪除]   - 刪除 Detail資料 - GetUrlStr()
                        np["ITMUOCD"] = cur_rec.data["ITMUOCD"];
                       //STEP1: 刪除 Detail 資料 - 明細需求件號
                      var Tmp_url = '../../api/V20305API/Delete_D';
                      var Tmp_RtnStr = getUrlStr(Tmp_url, np, "刪除明細需求件號(AMM_UOCD)");
                       if (!checkRtnOK(Tmp_RtnStr)) {
                          mywarnalert(Tmp_RtnStr);
                          return;
                       }    
                 3>刪除後,重新顯示Detail資料 - fireEvent("selectionchange", ..)
                    var cur_recs = Ext.getCmp('grid_M').getSelectionModel().getSelection();
                    Ext.getCmp('grid_M').fireEvent("selectionchange"
                                                                         Ext.getCmp("grid_M").getSelectionModel(), cur_recs);



1>*.js
Ext.getCmp('btn_del').on("click", function () {
var Tmp_AMMNO = "";
var Tmp_RQPN = "";
var cur_recs = Ext.getCmp('grid_D').getSelectionModel().getSelection();
if (cur_recs.length > 0) {
var cur_rec = cur_recs[0];
Tmp_AMMNO = nulltoStr(cur_rec.data['AMMNO']);
Tmp_RQPN = nulltoStr(cur_rec.data['RQPN']);
}
var Tmp_Str = "確定要刪除本筆需求明細件號資料嗎 ?\n"
        + "[AMM單號(" + Tmp_AMMNO + ") 提料件號(" + Tmp_RQPN + ")]\n";
    var id = confirm(Tmp_Str);
    if (!id)        
        return false;
    //取得目前所勾選資料,再匯出    
    var np = {};
    np["RPNOAF"] = cur_rec.data["RPNOAF"];
    np["EIAC"] = cur_rec.data["EIAC"];
    np["EI_LCN"] = cur_rec.data["EI_LCN"];
    np["EI_ALC"] = cur_rec.data["EI_ALC"];
    np["NHA_LCN"] = cur_rec.data["NHA_LCN"];
    np["NHA_ALC"] = cur_rec.data["NHA_ALC"];
    np["LCN"] = cur_rec.data["LCN"];
    np["ALC"] = cur_rec.data["ALC"];
    np["PN"] = cur_rec.data["PN"];
    np["ITMUOCD"] = cur_rec.data["ITMUOCD"];
    //STEP1: 刪除 Detail 資料 - 明細需求件號
    var Tmp_url = '../../api/V20305API/Delete_D';
    var Tmp_RtnStr = getUrlStr(Tmp_url, np, "刪除明細需求件號(AMM_UOCD)");
    if (!checkRtnOK(Tmp_RtnStr)) {
        mywarnalert(Tmp_RtnStr);
        return;
    }    

    var cur_recs = Ext.getCmp('grid_M').getSelectionModel().getSelection();
    Ext.getCmp('grid_M').fireEvent("selectionchange", Ext.getCmp("grid_M").getSelectionModel(), cur_recs);
    mysuccessalert("刪除完成!!");
});

2>*.cs
//刪除 - 明細資料(AMM_UOCD, AMM_UOC)
        [HttpPost]
        public dynamic Delete_D()
        {
            //取得參數值
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;            
            string Tmp_RPNOAF = nvc["RPNOAF"] ;
            string Tmp_EIAC = nvc["EIAC"] ;
            string Tmp_EI_LCN = nvc["EI_LCN"] ;
            string Tmp_EI_ALC = nvc["EI_ALC"] ;
            string Tmp_NHA_LCN = nvc["NHA_LCN"] ;
            string Tmp_NHA_ALC = nvc["NHA_ALC"] ;
            string Tmp_LCN = nvc["LCN"] ;
            string Tmp_ALC = nvc["ALC"] ;
            string Tmp_PN = nvc["PN"] ;
            string Tmp_ITMUOCD = nvc["ITMUOCD"] ;
            int Tmp_cnt;
            string Tmp_RtnMsg = "";
            string Tmp_Sql = "";
            string n = funId + "_Delete";
            HttpCookie MyCookie;
            DataTable Tmp_dt1 = new DataTable();
            try
            {
                Tmp_Sql = "  DELETE   FROM    AMM_UOCD   "
                                + "  WHERE   1=1 "
                                + "   AND        RPNOAF=" + myfunc.AA(Tmp_RPNOAF)
                                + "   AND        EIAC=" + myfunc.AA(Tmp_EIAC)
                                + "   AND        EI_LCN=" + myfunc.AA(Tmp_EI_LCN)
                                + "   AND        EI_ALC=" + myfunc.AA(Tmp_EI_ALC)
                                + "   AND        NHA_LCN=" + myfunc.AA(Tmp_NHA_LCN)
                                + "   AND        NHA_ALC=" + myfunc.AA(Tmp_NHA_ALC)
                                + "   AND        LCN=" + myfunc.AA(Tmp_LCN)
                                + "   AND        ALC=" + myfunc.AA(Tmp_ALC)
                                + "   AND        PN=" + myfunc.AA(Tmp_PN);
                myfunc.SqlExec(Tmp_Sql);
            }
            catch (Exception e)
            {
                Tmp_RtnMsg = myfunc.Get1ORA(e.Message);
                Tmp_RtnMsg = "錯誤:刪除零件件號("+Tmp_PN+")失敗!!<br>"                                                                                 
                                         + Tmp_RtnMsg;            
            }
            return Tmp_RtnMsg;
        }

Visual Studio 快捷鈕 - 綜整


 https://summer10920.github.io/2020/10-23/article-vscode/