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


沒有留言:

張貼留言