2025年4月6日 星期日

已核准的 [網路圖報工] 資料.修改報工年度月份

 目的: 已核准報工.修改報工年度月份

處理說明: 1>挑選報工.[已核准]的資料

                   2>直接修改該筆報工.年度月份即可




Xls欄位換行串換: char(10) , \n (Escape n)

目的: Xls欄位換行串換: char(10)

 處理說明: 1>換行字元:  char(10)

                   2>串接函式: CONCATENATE

                   3>程式寫法:  \n   - Escape n  - V20305D*.cs
                       if (myfunc.checkisnull(Tmp_C_UNIT))
                           Tmp_RtnMsg = Tmp_RtnMsg + "需求單位不可空白!!
\n";

                  4>xls欄位格式: 自動換行,且調整行高
                        // 調整[匯入結果說明]欄位, 自動換行,且調整行高以適應內容
                        ws.Range[myfunc.GetExcelPos(44, cur_row)].Style.WrapText = true;                        
                        ws.AutoFitRow(1);
                    

Tmp_RtnMsg = Tmp_RtnMsg + "更換情況(" + Tmp_RSTHAH + ")代碼不正確!!\n";





2025年3月26日 星期三

V20305I –[附檔瀏覽] – 下載檔案 - downloadFile2 - 子畫面- 簡單 Grid

 目的: V20305I –[附檔瀏覽] – 下載檔案

處理說明: 1>呼叫   downloadFile2
 var Tmp_url = "../api/myAPI/downloadFile2?aTbl=" + Tmp_TblNM + "&Flds=" + Tmp_Flds + "&aCnd=" + Tmp_Cnd;


1>*.js
    var Tmp_url = "../api/myAPI/downloadFile2?aTbl=" + Tmp_TblNM + "&Flds=" + Tmp_Flds + "&aCnd=" + Tmp_Cnd;       document.location = Tmp_url;     

2>*.cs

        public myAPIController()
        {
            //DBTable = "";            
            DBLINK = "AMMEU";
        }   

 [HttpGet]
        public void downloadFile2(string aTbl, string Flds, string aCnd)
        {
            string[] Ary = Flds.Split(',');
            string fnm = Ary[0];   //檔案名 稱
            string fbdy = Ary[1];  //檔案內容
            
            string cnd = aCnd;
            string Strsql = "select " + Flds + "  from " + aTbl + " where 1=1 " + cnd;
            string Tmp_CntSql = "select count(*)  from " + aTbl + " where 1=1 " + cnd;
            string Tmp_Str;
            int Tmp_cnt;
            HttpCookie MyCookie;
            try
            {
                Tmp_cnt = int.Parse(myfunc.SqlValue(Tmp_CntSql));
                if (Tmp_cnt >= 0)
                {
                    //必需先加入 Cookie , 再 downloadFile 
                    //--> 因 downloadFile 會 HttpContext.Current.Response.End(); , 所以 要先加 Cookie , 再 downloadFile
                    Tmp_Str = "檔案下載完成!!<br>";
                    MyCookie = new HttpCookie("Rtn_Msg", HttpUtility.UrlEncode(Tmp_Str));
                    HttpContext.Current.Response.Cookies.Add(MyCookie);
                    HttpContext.Current.ApplicationInstance.CompleteRequest();
                    downloadFile(Strsql, fnm, fbdy); //將 filebody 欄位以 byte[] 傳至 response 
                    // 接收方式:
                    //1>下載檔案  : document.location = Tmp_url;
                    //2>顯示照片檔 : Ext.getCmp('sub_V80403C1_img1').setSrc(Tmp_url);
                }
                else
                {
                    Tmp_Str = "檔案不存在,請檢核!!<br>";
                    MyCookie = new HttpCookie("Rtn_Msg", HttpUtility.UrlEncode(Tmp_Str));
                    HttpContext.Current.Response.Cookies.Add(MyCookie);
                    HttpContext.Current.ApplicationInstance.CompleteRequest();
                }
            }
            catch (Exception ex)
            {
                Tmp_Str = ex.Message;
                if (Tmp_Str.IndexOf("DBNull") > -1)
                    Tmp_Str = "檔案內容為空白,敬請檢核!!<br>";
                MyCookie = new HttpCookie("Rtn_Msg", HttpUtility.UrlEncode(Tmp_Str));
                HttpContext.Current.Response.Cookies.Add(MyCookie);
                HttpContext.Current.ApplicationInstance.CompleteRequest();
                 throw ex; 
            }   //檔案無法讀取,仍會下載 byte=0
            finally
            { }
        }

        



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