顯示具有 SS_FILES 標籤的文章。 顯示所有文章
顯示具有 SS_FILES 標籤的文章。 顯示所有文章

2022年8月25日 星期四

V20306 - 套表列印 - 依勾選的資料匯出 - 將目前所選的資料,當成 np參數 , 傳至後端 - SS_FILES

 目的: 畫面的欄位值,直接匯出至套表, 不分頁

處理說明: 1>讀取套表檔案 SS_FILES

                  2>讀取 store 資料匯出至 XLS



1>*.js , 依所勾選的資料匯出轉成 JSONString 當參數, 傳至後端
//查詢  - 將目前所選的資料,匯出成報表
    function LookBtn_click() {
        var Tmp_Grid = Ext.getCmp('grid_Single');
        var cur_recs,cur_rec;
        var Tmp_SAPNO, Tmp_PN, Tmp_QTY, Tmp_EOCND, Tmp_RMK;
        var Tmp_data_JSON = "";  //將store資料轉成 JSON 的字串
        var Tmp_sub_np = {};
        let Tmp_DataAry1 = [];
        var Tmp_Str = "";
        cur_recs = Tmp_Grid.getView().selModel.getSelection();
        console.log("cur_recs:", cur_recs);
        if (cur_recs.length == 0) {
            mywarnalert("請先選擇要查詢的資料");
            return;
        }
        for (var i = 0; i < cur_recs.length; i++) {
            cur_rec = cur_recs[i];
            console.log(Tmp_Str + "cur_rec:", cur_rec);
            Tmp_DataAry1.push(cur_rec.data);
        }

        console.log("Tmp_DataAry1:", Tmp_DataAry1);
        // 將目前子畫面的資料(Table)轉成 JSON字串
        let Tmp_DataString1 = JSON.stringify(Tmp_DataAry1);
        console.log("Tmp_DataString1:", Tmp_DataString1);        
        var np = {};
        np = {
            DataString1: Tmp_DataString1,            
        };
        //Ext.Ajax.request   --> 傳送檔案至前端,不可使用 Ext.Ajax, 必需使用 Form.submit
        Ext.getCmp('s_form').submit({
            url: '../../api/V20306API/DoPRNLIST',
            method: 'POST',
            async: false,
            standardSubmit: true, //若要傳送檔案至前端, standardSubmit必需設為 true  
            params: np,
        });

        //顯示結果訊息..
        var mask = new Ext.LoadMask(Ext.getBody(), {
            msg: '處理中,請稍待...'
        });
        mask.show();//使用 mask 需手動呼叫show() 方法下
        var timer = setInterval(function () {
            clearInterval(timer);
            mask.hide();
            timer = null;
            var r = r_cookies('EX_DFile');
            console.log("r_cookies=", r);
            if (!checkisnull(r)) {
                mysuccessalert(r);
            }
        }, 5000);  //3000ms = 3sec
    }  // end of  function LookBtn_click() {





2>*.cs - 依傳入的資料參數, 匯出至 XLS

//加入JSON格式轉換參考 , JsonConvert 必需使用如下  library
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

//查詢 - 將所選的資料匯出至 xls - 套表
[HttpPost]

public void DoPRNLIST()
        {
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            // 1>將 SS_FILES.FBOLD 存成 Local檔案
            //取得目前子畫面的欄位值
string Tmp_DataString1 = nvc["DataString1"];  //取得目前子畫面的資料. JSON字串   
            //將 table 字串轉成 DataTable
            //DataTable DataTable1 = (DataTable)JsonConvert.DeserializeObject(Tmp_DataString1, (typeof(DataTable)));
            DataTable DataTable1 = myfunc.JSON2dt(Tmp_DataString1);
            
            OracleConnection conn = new OracleConnection(DBService.ConnectionString(DBLINK));//
            OracleCommand cmd = new OracleCommand();
            //OracleDataAdapter adp = new OracleDataAdapter();
            //DataSet ds = new DataSet();
            //var response = Request.CreateResponse();
            conn.Open();
            conn.ClientInfo = User.Identity.Name;
            conn.ModuleName = BaseSYS + "_" + BaseMODID;
            conn.ActionName = ActionName;
            cmd.Connection = conn;
            string Tmp_Sql = "";
            string Tmp_Str = "";
            string Tmp_Str1 = "";
            string Tmp_RtnMsg;
            string Tmp_FName = "V20306_列印報表.xlsx";      //套表的檔案名稱 , 
            string documentPath = HttpContext.Current.Server.MapPath("~") + "document\\";  // 取得實實的路徑            
            string pathFName = documentPath + Tmp_FName;
            //需要擷取大量資料時,DataReader 是很好的選擇,因為資料不會快取至記憶體。
            OracleDataReader reader;
            Workbook wk = null;
            MemoryStream mstream = new MemoryStream();
            string FileName = "V20306_列印報表_" + DateTime.Now.ToString("yyyyMMdd") + ".xlsx";
            string FileName1 = documentPath + FileName;
            try
            {
                wk = new Workbook();
                //1>將  SS_FILES. FBODY , 存至Local目錄.檔案                 
                if (File.Exists(pathFName))
                {
                    File.Delete(pathFName);
                }
                Tmp_Sql = " SELECT  FNAME,FBODY "
                                + " FROM     SS_FILES   "
                                + "   WHERE   1 = 1  "
                                + "  AND         FNAME = " + myfunc.AA(Tmp_FName);
                cmd.CommandText = Tmp_Sql;
                reader = cmd.ExecuteReader();
                byte[] file = null;
                //FileMode.OpenOrCreate: 開啟檔案若無檔案則新增
                //FileAccess.ReadWrite: 允許檔案讀取/寫入
                FileStream fs = File.Open(pathFName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
                BinaryWriter bw = new BinaryWriter(fs);
                if (reader.HasRows)
                {
                    if (reader.Read())
                    {
                        file = (byte[])reader["FBODY"];
                        //fs.Write(file,0,50000);
                        bw.Write(file);
                        wk.LoadFromStream(fs);
                        bw.Close();
                        fs.Close();
                    }
                }
                //2 > 主機.Local檔案 XLS 讀入  FStream
                Worksheet ws = wk.Worksheets[0];//獲取第一個工作表
                //寫入[SAPNO][PN][QTY][EOCND][RMK]
                string Tmp_ASPNO, Tmp_RPNOAF, Tmp_LCNO, Tmp_LRWET_;
                string Tmp_MCNM, Tmp_ORDID_, Tmp_PCTP, Tmp_FICNMA, Tmp_STLCT;
                string Tmp_PCQTY,Tmp_ASLV,Tmp_ASPRMK,Tmp_NGONOAF,Tmp_PN;
                string Tmp_LCITM, Tmp_LCETDT, Tmp_LCCHID_, Tmp_LCORAO, Tmp_LRULT;
                string Tmp_LRUWT, Tmp_LRUHG,Tmp_WTLV,Tmp_ITPR;                
                //每筆資料列印後, 不分頁列印下一筆
                for (var i = 0; i < DataTable1.Rows.Count; i++)
                {
                    Tmp_ASPNO = DataTable1.Rows[i]["ASPNO"].ToString();
                    Tmp_RPNOAF = DataTable1.Rows[i]["RPNOAF"].ToString();
                    Tmp_LCNO = DataTable1.Rows[i]["LCNO"].ToString();
                    //直接取得畫面.CaluField欄位值        
                    Tmp_LRWET_ = DataTable1.Rows[i]["LRWET_"].ToString();//系統件重量說明

                    Tmp_ORDID_ = DataTable1.Rows[i]["ORDID_"].ToString();  //訂購者姓名
                    Tmp_MCNM = DataTable1.Rows[i]["MCNM"].ToString();
                    Tmp_PCTP = DataTable1.Rows[i]["PCTP"].ToString();
                    Tmp_FICNMA = DataTable1.Rows[i]["FICNMA"].ToString();
                    Tmp_STLCT = DataTable1.Rows[i]["STLCT"].ToString();
                    Tmp_PCQTY = DataTable1.Rows[i]["PCQTY"].ToString();
                    Tmp_ASLV = DataTable1.Rows[i]["ASLV"].ToString();
                    Tmp_ASPRMK = DataTable1.Rows[i]["ASPRMK"].ToString();
                    Tmp_NGONOAF = DataTable1.Rows[i]["NGONOAF"].ToString();
                    Tmp_PN = DataTable1.Rows[i]["PN"].ToString();
                    Tmp_LCITM = DataTable1.Rows[i]["LCITM"].ToString();
                    Tmp_LCETDT = DataTable1.Rows[i]["LCETDT"].ToString();
                    Tmp_LCCHID_ = DataTable1.Rows[i]["LCCHID_"].ToString();
                    Tmp_LCORAO = DataTable1.Rows[i]["LCORAO"].ToString();
                    Tmp_LRULT = DataTable1.Rows[i]["LRULT"].ToString();
                    Tmp_LRUWT = DataTable1.Rows[i]["LRUWT"].ToString();
                    Tmp_LRUHG = DataTable1.Rows[i]["LRUHG"].ToString();
                    Tmp_WTLV = DataTable1.Rows[i]["WTLV"].ToString();
                    Tmp_ITPR = DataTable1.Rows[i]["ITPR"].ToString();
                    //GetExcelPos(欄, 行) 以 0 開始, 
                    ws.Range[myfunc.GetExcelPos(0, i+1)].Text = Tmp_ASPNO;
                    ws.Range[myfunc.GetExcelPos(1, i+1)].Text = Tmp_RPNOAF;
                    ws.Range[myfunc.GetExcelPos(2, i + 1)].Text = Tmp_LCNO;
                    ws.Range[myfunc.GetExcelPos(3, i + 1)].Text = Tmp_LRWET_;                    
                    ws.Range[myfunc.GetExcelPos(4, i + 1)].Text = Tmp_MCNM;
                    ws.Range[myfunc.GetExcelPos(5, i + 1)].Text = Tmp_ORDID_;
                    ws.Range[myfunc.GetExcelPos(6, i + 1)].Text = Tmp_PCTP;
                    ws.Range[myfunc.GetExcelPos(7, i + 1)].Text = Tmp_FICNMA;
                    ws.Range[myfunc.GetExcelPos(8, i + 1)].Text = Tmp_STLCT;
                    ws.Range[myfunc.GetExcelPos(9, i + 1)].Text = Tmp_PCQTY;
                    ws.Range[myfunc.GetExcelPos(10, i + 1)].Text = Tmp_ASLV;
                    ws.Range[myfunc.GetExcelPos(11, i + 1)].Text = Tmp_ASPRMK;
                    ws.Range[myfunc.GetExcelPos(12, i + 1)].Text = Tmp_NGONOAF;
                    ws.Range[myfunc.GetExcelPos(13, i + 1)].Text = Tmp_PN;
                    ws.Range[myfunc.GetExcelPos(14, i + 1)].Text = Tmp_LCITM;
                    ws.Range[myfunc.GetExcelPos(15, i + 1)].Text = Tmp_LCETDT;
                    ws.Range[myfunc.GetExcelPos(16, i + 1)].Text = Tmp_LCCHID_;
                    ws.Range[myfunc.GetExcelPos(17, i + 1)].Text = Tmp_LCORAO;
                    ws.Range[myfunc.GetExcelPos(18, i + 1)].Text = Tmp_LRULT;
                    ws.Range[myfunc.GetExcelPos(19, i + 1)].Text = Tmp_LRUWT;
                    ws.Range[myfunc.GetExcelPos(20, i + 1)].Text = Tmp_LRUHG;
                    ws.Range[myfunc.GetExcelPos(21, i + 1)].Text = Tmp_WTLV;
                    ws.Range[myfunc.GetExcelPos(22, i + 1)].Text = Tmp_ITPR;
                }
                
                wk.SaveToStream(mstream, FileFormat.Version2007);
                wk.SaveToFile(FileName1, FileFormat.Version2007);
                //wk.SaveToStream(mstream, FileFormat.Version2013);
                //wk.SaveToFile(FileName1, FileFormat.Version2013);                
            }
            catch (Exception e)
            {
                var Tmp_ErrMsg = e.Message;
            }
            finally
            {                
                wk.Dispose();
                conn.Close();
            }
            HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + HttpUtility.UrlEncode((string)FileName, System.Text.Encoding.UTF8) + "\"");
            HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
            HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            HttpContext.Current.Response.BinaryWrite(mstream.ToArray());
            //包裝標籤檔產生完成
            Tmp_Str = "產生包裝匯出檔案成功<br>"
                            + "(" + FileName + ")<br>";
            HttpCookie MyCookie = new HttpCookie("EX_DFile", HttpUtility.UrlEncode(Tmp_Str));
            HttpContext.Current.Response.Cookies.Add(MyCookie);
            HttpContext.Current.Response.End();
        }  // end of public void DoPRNLIST()

2022年8月18日 星期四

V120402D - xls套表列印 - 請稍候訊息 - Cookie - xls欄位格式設定 - 欄位合併, 插入圖片 - JSON2dt - 開啟檔案

 目的: xls套表列印, 分頁處理- Cookie - xls欄位格式設定 - 欄位合併, 插入圖片

處理說明: 1>由 SS_FILES 讀取套表檔案 , 存至 Server檔案目錄
                  2>xls分頁處理
                  3> xls欄位合併, 插入圖片                  




1>*.js  - V120402D.js

//[列印]鈕  - 列印套表  - Txxxx 技令借用登記表    - Dxxx 文件借用登記簿
    function sub_LookFlds_OkBtn() {
         //1>將子畫面 store 的資料轉成 JSON 字串,當參數傳至後端 Ext.Ajax
        var Tmp_sub_store = Ext.getCmp("sub_Grid").store;
        var Tmp_JSONString = store2JSON(Tmp_sub_store);
        var np = {};
        np["JSONString"] = Tmp_JSONString;
        //子畫面 submit
        Ext.getCmp('mySubForm').submit({
            //Ext.Ajax.request({
            url: '../../api/V120402DAPI/DoPRNLIST',
            method: 'POST',
            async: false,
       standardSubmit: true,// 非 Ajax 的方式  //若要傳送檔案至前端, standardSubmit必需設為 true 
            params: np,  //把目前 store資料轉成JSON, 當成處理參數 np
        });

        //顯示訊息 - 請稍候
        var mask = new Ext.LoadMask(Ext.getBody(), {
            msg: '處理中,請稍待...'
        });

        mask.show();//使用 mask 需手動呼叫show() 方法下
        var timer = setInterval(function () {
            clearInterval(timer);
            mask.hide();
            timer = null;
            //讀取 cookie的訊息 
            var r = r_cookies('EX_DFile');
            console.log("r_cookies=", r);
            if (!checkisnull(r)) {
                mysuccessalert(r);
            }
        }, 5000);  //3000ms = 3sec
    };  // end of function mySub1_OkBtn_click()


2>*.cs  - SS_FILES 轉成 xls 處理, xls欄位格式設定, 加入圖片

//套表列印 - 借閱記錄 - 列印文件借閱登記簿
        [HttpPost]
        public void DoPRNLIST()
        {
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            // 1>將 SS_FILES.FBOLD 存成 Local檔案
            //取得目前子畫面的欄位值            
  string Tmp_JSONString = nvc["JSONString"];//Tmp_DataJSON:  將目前子畫面的資料. JSON字串  
            DataTable Tmp_dt = myfunc.JSON2dt(Tmp_JSONString);
            //DataTable DataTable1 = (DataTable)JsonConvert.DeserializeObject(Tmp_DataString1, (typeof(DataTable)));
            
            OracleConnection conn = new OracleConnection(DBService.ConnectionString(DBLINK));//
            OracleCommand cmd = new OracleCommand();

            conn.Open();
            conn.ClientInfo = User.Identity.Name;
            conn.ModuleName = BaseSYS + "_" + BaseMODID;
            conn.ActionName = ActionName;
            cmd.Connection = conn;
            string Tmp_Sql = "";
            string Tmp_Str = "";
            string Tmp_Str1 = "";
            string Tmp_RtnMsg;
            string Tmp_FName = "V120402_文件借閱登記簿.xlsx";      //套表的檔案名稱 , 
            string documentPath = HttpContext.Current.Server.MapPath("~") + "document\\";  // 取得實實的路徑            
            string pathFName = documentPath + Tmp_FName;
            //需要擷取大量資料時,DataReader 是很好的選擇,因為資料不會快取至記憶體。
            OracleDataReader reader;
            Workbook wk = null;
            MemoryStream mstream = new MemoryStream();
            string FileName = "V120402_文件借閱登記簿" + DateTime.Now.ToString("yyyyMMdd") + ".xlsx";
            string FileName1 = documentPath + FileName;
            try
            {
                wk = new Workbook();
                //1>將  SS_FILES. FBODY , 存至Local目錄.檔案                 
                if (File.Exists(pathFName))
                {
                    File.Delete(pathFName);
                }
                Tmp_Sql = " SELECT  FNAME,FBODY "
                                + " FROM     SS_FILES   "
                                + "   WHERE   1 = 1  "
                                + "  AND         FNAME = " + myfunc.AA(Tmp_FName);
                cmd.CommandText = Tmp_Sql;
                reader = cmd.ExecuteReader();
                byte[] file = null;
                //FileMode.OpenOrCreate: 開啟檔案若無檔案則新增
                //FileAccess.ReadWrite: 允許檔案讀取/寫入
                FileStream fs = File.Open(pathFName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
                BinaryWriter bw = new BinaryWriter(fs);
                if (reader.HasRows)
                {
                    if (reader.Read())
                    {
                        file = (byte[])reader["FBODY"];
                        //fs.Write(file,0,50000);
                        bw.Write(file);
                        wk.LoadFromStream(fs);
                        bw.Close();
                        fs.Close();
                    }
                }

                //2 > 主機.Local檔案 XLS 讀入  FStream
                //FileStream fs = File.Open(pathFName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)                
                Worksheet ws = wk.Worksheets[0];//獲取第一個工作表
                                                //寫入[SAPNO][PN][QTY][EOCND][RMK]

                //int RowCnt = 0;  //每頁 行                    
                int PageRowIndex = 0;  //本頁啟始 rowindex
                int PageSize = 29;            //每頁29行 , 含 頁首 行數                        
                int DataSize = 21;           //資料行數 , 資料row 行數
                int PageTitleRows = 6;  //頁首行數 (含資料標題行)
                string Tmp_DOCNO, Tmp_STLCT, Tmp_BRP_, Tmp_TELNO;
                string Tmp_BRDT, Tmp_RTDT, Tmp_REMARK;
                string Tmp_PicName = "V120402_Pic.jpg";
                string Tmp_pathPicName = documentPath + Tmp_PicName;
                int Pages = 0;
                int PageRow = -1;


                //每筆資料列印後, 分頁印下一筆
                for (var i = 0; i < Tmp_dt.Rows.Count; i++)
                {
                    //每筆資料均分頁 & 複製樣板 rows      
                    //每21筆資料,則分頁
                    if ((i % DataSize) ==0)
                    {
                        Pages = Pages + 1;
                        PageRow = -1;                        
                        if (Pages == 2)
                            Console.WriteLine("Pages", Pages);
                        PageRowIndex = PageRowIndex + PageSize;
                        //分頁
                        ws.HPageBreaks.Add(ws.Range[myfunc.GetExcelPos(0, PageRowIndex)]);
                        string Tmp_Range = "A" + string.Format("{0:D}", PageRowIndex + 1) + ":H" + string.Format("{0:D}", PageRowIndex + 1 + (PageSize - 1));
                        ws.Copy(ws.Range["A1:H29"], ws.Range[Tmp_Range], true);
                        Tmp_Range = "D" + string.Format("{0:D}", PageRowIndex + 2) + ":F" + string.Format("{0:D}", PageRowIndex + 2);
                        //文件借閱登記簿 merge - 欄位合併
                        //ws.Range[D2: F2].Merge();
                        ws.Range[Tmp_Range].Merge();
                        //設定列高度
                        ws.SetRowHeight(PageRowIndex + 2, 30);
                        //(Document On-loan Records)  merge
                        Tmp_Range = "D" + string.Format("{0:D}", PageRowIndex + 3) + ":F" + string.Format("{0:D}", PageRowIndex + 3);
                        //ws.Range[D3: F3].Merge();
                        ws.Range[Tmp_Range].Merge();
                        ws.SetRowHeight(PageRowIndex + 3, 25);
                        //加入圖片
                        int Tmp_row = PageRowIndex + 1;


                        //string Tmp_pathPicName = "C:\\Users\\611292\\Desktop\\demo.jpg";
                       //將 SS_FILES 存成檔案(Tmp_PathFName)
                        Tmp_pathPicName = myfunc.SS_FILES2PathFName(Tmp_PicName, DBLINK);  
                        ws.Pictures.Add(Tmp_row, 1, Tmp_pathPicName);
                    }
                    PageRow = PageRow + 1;
                    Tmp_DOCNO = Tmp_dt.Rows[i]["DOCNO"].ToString();
                    Tmp_STLCT = Tmp_dt.Rows[i]["STLCT"].ToString();
                    Tmp_BRP_ = Tmp_dt.Rows[i]["BRP_"].ToString();
                    Tmp_TELNO = Tmp_dt.Rows[i]["TELNO"].ToString();
                    if (Tmp_dt.Rows[i]["BRDT"].ToString().Length > 0)
        Tmp_BRDT = DateTime.Parse(Tmp_dt.Rows[i]["BRDT"].ToString()).ToString("yyyy/MM/dd");
                    else
                        Tmp_BRDT = "";
                    if (Tmp_dt.Rows[i]["RTDT"].ToString().Length > 0)
        Tmp_RTDT = DateTime.Parse(Tmp_dt.Rows[i]["RTDT"].ToString()).ToString("yyyy/MM/dd");
                    else
                        Tmp_RTDT = "";
                    Tmp_REMARK = Tmp_dt.Rows[i]["REMARK"].ToString();                    
ws.Range[myfunc.GetExcelPos(1, PageRowIndex + PageTitleRows + PageRow)].Text =Tmp_DOCNO;
ws.Range[myfunc.GetExcelPos(2, PageRowIndex + PageTitleRows + PageRow)].Text = Tmp_STLCT;
ws.Range[myfunc.GetExcelPos(3, PageRowIndex + PageTitleRows + PageRow)].Text = Tmp_BRP_;
ws.Range[myfunc.GetExcelPos(4, PageRowIndex + PageTitleRows + PageRow)].Text = Tmp_TELNO;
ws.Range[myfunc.GetExcelPos(5, PageRowIndex + PageTitleRows + PageRow)].Text = Tmp_BRDT;
ws.Range[myfunc.GetExcelPos(6, PageRowIndex + PageTitleRows + PageRow)].Text = Tmp_RTDT;
ws.Range[myfunc.GetExcelPos(7, PageRowIndex + PageTitleRows + PageRow)].Text = Tmp_REMARK;                    
                }
                //刪除樣板  rows                            
                ws.DeleteRow(1, PageSize);
                ws.Activate();
                wk.SaveToStream(mstream, FileFormat.Version2007);
                wk.SaveToFile(FileName1, FileFormat.Version2007);
                
                //開啟 xls file
                System.Diagnostics.Process.Start(FileName1);
                //wk.SaveToFile(FileName, ExcelVersion.Version2007);       
                /* 開啟 Local xls 檔案
                 * using System.Diagnostics;
                    Process process = new Process();
                   process.StartInfo.FileName = "WINWORD.EXE";
                   process.StartInfo.Arguments = @"C:\Users\Shani\Desktop\process.docx";
                   process.Start();
                 */
            }
            catch (Exception e)
            {
                var Tmp_ErrMsg = e.Message;                
                Tmp_Str = "開啟XLS檔案 , 錯誤訊息如下<br>"
                                + "(" + FileName + ")報表<br>"
                                + Tmp_ErrMsg;
                HttpCookie MyCookie1 = new HttpCookie("EX_DFile", HttpUtility.UrlEncode(Tmp_Str));
                HttpContext.Current.Response.Cookies.Add(MyCookie1);
                //HttpContext.Current.Response.End();
                //throw;                
            }
            finally
            {
                //reader.Close();
                //bw.Close();
                //fs.Close();
                wk.Dispose();
                conn.Close();
                //wk.close();

            }

            HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + HttpUtility.UrlEncode((string)FileName, System.Text.Encoding.UTF8) + "\"");
            HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
            //HttpContext.Current.Response.BinaryWrite(file);
            //HttpContext.Current.Response.ContentType = "application/ms-excel";
            HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            HttpContext.Current.Response.BinaryWrite(mstream.ToArray());
            //包裝標籤檔產生完成
            Tmp_Str = "請開啟如下XLS檔案<br>"
                            + "(" + FileName + ")列印<br>";                             
            HttpCookie MyCookie = new HttpCookie("EX_DFile", HttpUtility.UrlEncode(Tmp_Str));
            HttpContext.Current.Response.Cookies.Add(MyCookie);
            HttpContext.Current.Response.End();
        }  // end of public void DoPRNLIST()


2022年7月26日 星期二

V120502 - [列印包裝貼紙]鈕 - 1>下載 SS_FILES樣板檔, 2>填寫欄位值, 3>將該檔案傳送至前端

目的: 將資料內容印至標籤印表機

處理說明 : 1>Browser前端無法取得本機的印表機清單, 也無法設定本機印表機的頁面長寬

                   2>將資料寫入 xls檔案, 傳送至本機前端, 由使用者自行選擇標籤印表機後,列印

                       --> 如何將前端store的 3筆資料,送至後端去處理,將這3筆資料填入樣板檔

                   3>將檔案寫入 pdf檔案網頁 , 由使用者按右鍵列印, 仍要選擇印表機





一.自訂 class , 將store 資料變成 JSON字串, 再由 JSON字串轉成 Object,
      -JSON Serialize  & DeSerialize
1>js 將 store 的資料轉成  JSON String  - *.js  
   var Tmp_data_JSON = "";  //將store資料轉成 JSON 的字串
        var Tmp_sub_np = {};
        let Tmp_DataAry = [];
        var Tmp_Str="";
        for (i = 0; i < Tmp_sub_store.getCount(); i++) {
            cur_rec = Tmp_sub_store.getAt(i);
            Tmp_Str = "第" + i.toString() + "筆";
            console.log(Tmp_Str+"cur_rec:", cur_rec);
            Tmp_SAPNO = cur_rec.data['SAPNO'];
            Tmp_PN = cur_rec.data['PN'];
            Tmp_QTY = cur_rec.data['QTY'];
            Tmp_EOCND = cur_rec.data['EOCND'];
            Tmp_RMK = cur_rec.data['RMK'];  
            Tmp_sub_np = {
                SAPNO: Tmp_SAPNO,
                PN: Tmp_PN,
                QTY: Tmp_QTY,
                EOCND: Tmp_EOCND,
                RMK: Tmp_RMK,
            }
            console.log(Tmp_Str + "Tmp_sub_np:", Tmp_sub_np);
            Tmp_DataAry.push(Tmp_sub_np);
        }
        console.log("Tmp_DataAry:", Tmp_DataAry);
        let Tmp_DataString = JSON.stringify(Tmp_DataAry);
        console.log("Tmp_DataString:", Tmp_DataString);

        var np = {};
        np = {
            DataString: Tmp_DataString  //Tmp_DataString:  將目前子畫面的資料轉成 JSON字串
        };        

        Ext.getCmp('mySubForm').submit({
            //Ext.Ajax.request({
            url: '../../api/V120502API/DoPRNLIST',
            method: 'POST',
            async: false,
            standardSubmit: true, // 非 Ajax 的方式  //若要傳送檔案至前端, standardSubmit必需設為 true  
            params: np,
        });


2>c# - 將 np 參數的  JSON 字串, 轉 Object 
       public class DataCls
        {
            public string SAPNO { get; set; }         //SAP工號
            public string PN { get; set; }             //件號
            public int  QTY { get; set; }          //數量
            public string EOCND { get; set; }             //EO+CND
            public string RMK { get; set; }             //備註
        }

   [HttpPost]
        public void DoPRNLIST()
        {
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            // 1>將 SS_FILES.FBOLD 存成 Local檔案
            //取得目前子畫面的欄位值
            string Tmp_DataString = nvc["DataString"];    
List<DataCls> DataObjList = (List<DataCls>) JsonConvert.DeserializeObject(Tmp_DataString, (typeof(List<DataCls>)));

            string Tmp_SAPNO, Tmp_PN, Tmp_EOCND, Tmp_RMK;
            int Tmp_QTY;
            DataCls DataObj;
            for (var i=0;i<DataObjList.Count;i++)
            {
                DataObj = DataObjList[i];
                Tmp_SAPNO=DataObj.SAPNO;
                Tmp_PN = DataObj.PN;
                Tmp_EOCND= DataObj.EOCND;
                Tmp_RMK = DataObj.RMK;
            }



二.利用現有Table class,將 Table 資料(Object)轉成 JSON字串, 再將 JSON字串轉成 Table(Object)
1>js , 將Object資料(Table)轉成   JSON String , 當參數傳至後端
        let Tmp_DataAry1 = [];
        var Tmp_Str="";
        for (i = 0; i < Tmp_sub_store.getCount(); i++) {
            cur_rec = Tmp_sub_store.getAt(i);
            console.log(Tmp_Str + "cur_rec:", cur_rec);
            Tmp_DataAry1.push(cur_rec.data);
       }
        let Tmp_DataString1 = JSON.stringify(Tmp_DataAry1);
        var np = {};
        np = {
        DataString1: Tmp_DataString1  //Tmp_DataString:  將目前子畫面的資料(Table)轉成 JSON字串
        };        

        Ext.getCmp('mySubForm').submit({
            //Ext.Ajax.request({
            url: '../../api/V120502API/DoPRNLIST',
            method: 'POST',
            async: false,
     standardSubmit: true, // 非 Ajax 的方式  //若要傳送檔案至前端, standardSubmit必需設為 true 
            params: np,
        });



2>cs , 將參數(JSON String)轉成 Table(Object) , 讀取 Object 屬性值
//加入JSON格式轉換參考  , JsonConvert.DeserialObject(,)
using Newtonsoft.Json; 


public void DoPRNLIST()
        {
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            //取得目前子畫面的欄位值
string Tmp_DataString1 = nvc["DataString1"];//Tmp_DataString:  將目前子畫面的資料. JSON字串  DataTable DataTable1=(DataTable)JsonConvert.DeserializeObject(Tmp_DataString1, (typeof(DataTable)));

 string Tmp_SAPNO, Tmp_PN, Tmp_EOCND, Tmp_RMK;
            int Tmp_QTY;
            for (var i=0; i<DataTable1.Rows.Count;i++)
            {
                Tmp_SAPNO = DataTable1.Rows[i]["SAPNO"].ToString();
                Tmp_PN = DataTable1.Rows[i]["PN"].ToString();
                Tmp_QTY = int.Parse(DataTable1.Rows[i]["QTY"].ToString());
                Tmp_EOCND = DataTable1.Rows[i]["EOCND"].ToString();
                Tmp_RMK = DataTable1.Rows[i]["RMK"].ToString();
            }




2022年7月7日 星期四

Web改版 V120902 1>xls檔案未下載至前端Browser 2>TMGrid_高度設定_分頁控制Bar置於下方 3>主機下載檔案目錄權限設定

 1>[列印點名表] – 檔案下載至前端  -  standardSubmit: true, 且 必需以  form.submit, 不可用 Ext.Ajax


1>*.js

Ext.getCmp('mySubForm').submit({   

                url: '../../api/V120902API/DoPRNLIST',

                method: 'POST',

//  Ajax 的方式  //若要傳送檔案至前端, standardSubmit必需設為 true , 才會開新視窗,傳送 Binary檔案

//否則 Binary 檔案會放在原本的  Response

                standardSubmit: true,      

                params: np,             

        });

//顯示處理中..請稍待的訊息

var mask = new Ext.LoadMask(Ext.getBody(), {

                msg: '處理中,請稍待...'

        }); 

        mask.show();//使用 mask 需手動呼叫show() 方法下

        var timer = setInterval(function () {

                clearInterval(timer);

                mask.hide();

                timer = null;

                var r = r_cookies('EX_DFile');

                mysuccessalert(r);

        },1000);  //1000ms = 3sec

};  // end of function mySub1_OkBtn_click()







2>[缺點現況維護] -  TMGrid 的頁次未置於最下方 - Panel2 自動充滿畫面   - page


//panel2 的高度必需設定, 否則  panel2的高度會隨 Grid而變化
win.on('resize', function (me, width, height, eOpts) {
            //console.log("win.resize height=",height);
            var Tmp_okpanel_Height = Ext.getCmp('mySub2_OkBtn').getHeight() + 20;            
            var Tmp_rHeight = Ext.getCmp('mySubForm').getHeight() - Ext.getCmp('sub2_panel1').getHeight() - Tmp_okpanel_Height;            
            Ext.getCmp('sub2_panel2').setHeight(Tmp_rHeight);
            //console.log("win.resize Tmp_rHeight=", Tmp_rHeight);            
        });

// [缺勤記錄維護] - 開啟子視窗, 所有的變數在 子視窗開啟時, 要重新宣告,

    //                            --> 因為關閉子視窗時, 變數記憶體會被收回, 不重新宣告變數, 該變數會不存在

    function RollEditBtn_click() {

        var checkbox_id = 1;

        //按鈕 : [確認] [取消]  - [缺勤記錄維護]

        var mySub2_Btns = [

            {

                xtype: 'button', text: '確定', id: 'mySub2_OkBtn',

                listeners: {

                    click: function () {

                        mysuccessalert("mysub2_確定 ");

                        mySub2_OkBtn_click();

                    }

                }

            },

        ];

 

        var sub2_Columns = [

            { header: "員工編號", dataIndex: "EMPLYID", width: 150, TMType: "string" },

            { header: "姓名", dataIndex: "EMPLYID_", width: 100, TMType: "string" },

            { header: "缺勤", dataIndex: "NWK", width: 50, TMType: "string" },

            { header: "備註", dataIndex: "NOTE", width: 200, TMType: "string" },

            {

                header: '缺勤1',

                dataIndex: 'NWK',

                xtype: 'checkcolumn',               

                width: 60,

                editor: {

                    xtype: 'checkbox',

                    cls: 'x-grid-checkheader-editor',

                    inputValue: 'Y',

                    uncheckedValue: 'N'

                },           

                renderer: function (value, metadata, record, rowIndex, colIndex, store) {

                    console.log("1 renderer value:", value);

                    var tempVal = '';

                    if ((value === 'Y') || (value === true)) { tempVal = 'checked'; }     

                    var Tmp_Str = "<input  type='checkbox'  name=" + DatetoStr(record.get('DT')) + "_" + record.get('DEP') + "_" + record.get('EMPLYID') + "   " + tempVal + " >";

                    console.log("1 renderer return Tmp_Str:", Tmp_Str);

                    checkbox_id = checkbox_id + 1;

                    return Tmp_Str;

                },                               

                listeners: {

                    beforecheckchange: function (me, rowIndex, checked, eOpts) {

                        mysuccessalert("2 befoercheckchange !!");                       

                        console.log("2 befoercheckchange checked 1:", checked);                    

                        if (checked) { checked = false;checkVal = 'N'; }

                        else { checked = true; checkVal = 'Y'; }

                        Ext.getCmp('sub2_Grid').store.getAt(rowIndex).set('NWK', checkVal);

                        console.log("2 befoercheckchange checked 2:", checked);                    

                        return true;

                    },

                    click: function () { mysuccessalert("1 click event !!") }, 

                    // cellclick                   

                    checkchange: function (me, rowIndex, checked, eOpts) {

                         mysuccessalert("3 checkchange !!");

                        console.log(" 3 checkchange  checked :", checked);                           

                        var checkVal = '';

                        if (checked) {

                            checkVal = 'Y';                           

                            console.log("3  checkchange 目前 checked= Y !!  checkVal:", checkVal );

                        }

                        else {

                            checkVal = 'N';

                            console.log(" 3 checkchange 目前 checked= N !!  checkVal:", checkVal);

                        }                       

                        Ext.getCmp('sub2_Grid').store.getAt(rowIndex).set('NWK', checkVal);

                        console.log(" 4 checkchange Ext.getCmp(sub2_Grid).store.getat(rowIndex)", Ext.getCmp('sub2_Grid').store.getAt(rowIndex));                           

                        }

                    }

                },                               

        ];

 

 

        // [缺勤記錄維護]  - 子畫面欄位

        var mySub2 = [

            {

 type:'panel', bodyStyle: "background-color:transparent;", border: false, layout: { type: 'vbox', align: 'stretch' }, padding: "5",

                items: [

                    {

                        xtype: 'panel',

                        id: 'sub2_panel1',

                        layout: { type: 'hbox', align: 'stretch' },

                        flex: 5,

                        border: 1,

                        items: [

                        ]

                    },  //end of panel1                   

                    {

                        xtype: 'panel',

                        id: 'sub2_panel2',

                        //title: 'sub2_panel2',

                        layout: { type: 'vbox', align: 'stretch' },

                        //layout: 'fit',

                        flex: 10,

                        border: 1,                                               

                        items: [ sub2_Grid ]

                    },

                ] // end of   layout: "vbox", padding: "5", items: [

            }  //end of  my_Sub2 , items[{

        ]      //end of  my_Sub2 , items[

        var win = getMyWindow("缺勤記錄維護", mySub2, mySub2_Btns);       

        //Ext.getCmp('mySubForm').autoScroll = true;       

       

            var Tmp_Sql = " SELECT  EMPLYNM    "

                + "  FROM   HR_EMPLYM  "

                + " WHERE  EMPLYID=" + AA(Ext.getCmp('sub2_LDMAN').getValue());

            var Tmp_Str = SqlValue(Tmp_Sql);

            Ext.getCmp('sub2_LDMAN_').setValue(Tmp_Str);

        };

        //console.log("2  win: ", win);       

        win.width = 700;

        win.height = 400;

        win.show();

//Runtime 設定 Panel2 :  items[Sub2_Grid] 的高度, 以便充滿整個畫面

var Tmp_okpanel_Height = Ext.getCmp('mySub2_OkBtn').getHeight()+20;

var Tmp_rHeight =Ext.getCmp('mySubForm').getHeight()-Ext.getCmp('sub2_panel1').getHeight()-Tmp_okpanel_Height;

        Ext.getCmp('sub2_panel2').setHeight(Tmp_rHeight);

    };


3>V120902 – 在主機端無法正常下載檔案



Ans:    發佈至主機時,  web.config  檔案必需設定   user/password , 以便存取主機端的目錄
                    若沒設定,則無法存取主機端的目錄的權限,以致無法下載SS_FILES至主機目錄
1>web.config
 <system.web>
    <!--server端帳密,發行時請取消註解-->
    <!-- identity impersonate="true" userName="webadmin" password="Aidc@856+123" /-->
  -->  發佈至測試區/正式區時,  如上web.config 檔案   必需  remark 
<identity impersonate="true" userName="webadmin" password="Aidc@856+123" />