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

2023年8月2日 星期三

V40AA – SAP工單狀態異動 – 傳回 TXT檔至前端 - dt2JSON - JSON2dt - Cookie - 勾選資料

 目的: V40A – [SAP工單狀態異動] 傳回 TXT檔至前端

處理說明: 1>將勾選的資料傳至後端  (JSON2dt)
                 2>後端開啟TXT檔案
                3>依每筆資料呼叫 WebService , 並將傳回訊息寫入檔案
                4>將TXT檔案   傳至前端
                5>將訊息加入 Cookie 




1>將勾選的資料傳至後端
   1>>*.js
                     var Tmp_DataAry = [];
                     var cur_rec;
                     for (let i = 0; i < CHK_PK_OBJ.PK_LIST.length; i++) {                        
                        cur_rec = CHK_PK_OBJ.ALL_LIST[i];
                        Tmp_DataAry.push(cur_rec);
                    }  // for i=0 to 
                    //將 DataAry轉成 JSON
                    var Tmp_DataString = JSON.stringify(Tmp_DataAry);
                    var np = {}; //TMFunction.js, 組合form上的查詢條件為json參數傳遞                                            np["sub_DataString"] = Tmp_DataString;  //存入目前勾選的資料

      -->後端處理 *.cs  ,  將 JSON 轉成 table
           string Tmp_DataString = nvc["sub_DataString"];   
           DataTable dt1 = myfunc.JSON2dt(Tmp_DataString);  //目前子畫面所勾選的資料

2>後端開啟TXT檔案
     1>>*.cs
          using System.Text;
          string Tmp_out_FName = "V40A_SAP工單單況異動_log.txt";      //處理_log.txt
            string documentPath = HttpContext.Current.Server.MapPath("~") + "document\\";  // 取得實實的路徑            
            string Tmp_out_pFName = documentPath + Tmp_out_FName;    //含 path 的Filename
                                                                     //清除檔案內容
            if (File.Exists(Tmp_out_pFName))
            { File.Delete(Tmp_out_pFName); }
            File.WriteAllText(Tmp_out_pFName, String.Empty);
            Tmp_Str = " 工單號碼                     工單異動說明                         " +"\r\n";;
            File.AppendAllText(Tmp_out_pFName, Tmp_Str);


3>依每筆資料呼叫 WebService , 並將訊息寫入TXT檔案
    1>>*.cs
          //處理每筆工單
            for (var i = 0; i < dt1.Rows.Count; i++)
                {
                    Tmp_SAPNO = dt1.Rows[i]["SAPNO"].ToString();
                    //呼叫 WebService , 取得傳回 ds
                    Tmp_ds = myfunc.set_SAPSTAT(Tmp_SAPNO, Tmp_STAT, Tmp_EMPLYID);
                    var Tmp_dr = Tmp_ds.Tables[0].Rows[0];
                    Tmp_Str = Tmp_dr["AUFNR"].ToString() + "                " + Tmp_dr["MSG"].ToString()+ "\r\n";              
                     File.AppendAllText(Tmp_out_pFName, Tmp_Str);
                }//  end of  for (var i = 0; i < dt1.Rows.Count; i++)       
          
      2>>呼叫 WebService
public static dynamic set_SAPSTAT(string par_SAPNO, string par_STAT,string par_EMPLYID)
        {            
            string Tmp_Str = "";
            DataSet ds=new DataSet(); 

            if ((!checkisnull(par_SAPNO))  && (!checkisnull(par_STAT)))
            {
                ZCO02.ZRFC_ZCO02SoapClient ZCO02_cls = new ZCO02.ZRFC_ZCO02SoapClient();
                try
                {
                    ds = ZCO02_cls.PROCESS_TRANS_WEB_CO02(par_SAPNO, par_STAT, par_EMPLYID);                    
                }
                catch (Exception ex)
                { }  //throw ex;  可能回傳 null
                finally
                { };
            }
            return ds;
        }  


4>將TXT檔案   傳至前端
      HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + HttpUtility.UrlEncode((string)Tmp_out_FName, System.Text.Encoding.UTF8) + "\"");
      HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
      HttpContext.Current.Response.ContentType = "text/plain";
      HttpContext.Current.Response.WriteFile(Tmp_out_pFName);
      HttpContext.Current.Response.End();



5>訊息加入 Cookie
     //記錄 " 已執行完成 Cookie "
    var Tmp_finished_str = "已執行完成!!";
    MyCookie = new HttpCookie("UPDATE_SAPSTAT_finished", HttpUtility.UrlEncode(Tmp_finished_str));
    HttpContext.Current.Response.Cookies.Add(MyCookie);


2023年5月21日 星期日

V20302 –[匯出EXCEL]鈕 - 匯出勾選資料– Cookie - c# - js - JSON - 資料傳至後端

 目的: V20302 –[匯出EXCEL] 

處理說明: 一.前端(*.js)
                        1>將目前所選的資料s, 轉成 JSON字串, 當成 np 參數, 傳至後端
                        2>若要傳送檔案至前端, 1>>必需用 form.submit , 不可用 Ext.Ajax
                                                                  2>>standardSubmit: true, 

                   二.後端(*.cs)
                        1>將資料參數,轉成 Table

                           string Tmp_DataString1 = nvc["DataString1"]; //Tmp_DataString: 子畫面. JSON字串
                           DataTable dt1 = myfunc.JSON2dt(Tmp_DataString1);
                       2>讀取 SS_FILES 的 Template檔案 至 ws
                       3> ws 寫資料 , 存至檔案
                       4>將檔案傳送至前端  



1>*.js
 {
            xtype: 'button', text: '匯出EXCEL', id: 'XlsOutBtn',
            listeners: {
                click: function () {
                    //console.log(" 1 匯出EXCEL: ");
                    XlsOutBtn_click();
                }
            }
        },



//查詢 - 將目前所選的資料,匯出成報表
function XlsOutBtn_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("請先選擇要匯出 EXCEL 的資料");
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.getCmp('s_form').submit({
url: '../../api/V20302API/XlsOut',
method: 'POST',
async: false,
standardSubmit: true, //若要傳送檔案至前端, standardSubmit必需設為 true
params: np,
});

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

mask.show();//使用 mask 需手動呼叫show() 方法下
//若要傳送檔案到前端, 必需用 Cookie 判斷後端是否已完成
 //每1秒檢核一次,是否已完成, 若已完成,則不再檢核
        var timer = setInterval(function () {            
            var r = r_cookies('EX_DFile');
            //console.log("r_cookies=", r);
            if (!checkisnull(r)) {
                mysuccessalert(r);
                clearInterval(timer);
                mask.hide();
                timer = null;
            }
        }, 1000);  //1000ms = 1sec
    }  // end of  function LookBtn_click() {



2>*.cs
 //查詢 - 將所選的資料匯出至 xls  - 套表
        [HttpPost]
        public void 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);

            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 = "V20302_匯出報表.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 = "V20302_匯出報表_" + DateTime.Now.ToString("yyyyMMdd") + ".xlsx";
            string FileName1 = documentPath + FileName;
            HttpCookie MyCookie;
            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];//獲取第一個工作表

                //寫入欄位
                string Tmp_AMMNO, Tmp_RPNOAF, Tmp_MRPNOAF,Tmp_SAPNO_;
                string Tmp_TYPEAF, Tmp_PN_, Tmp_C_NM, Tmp_SEQOAF, Tmp_MB1A;
                string Tmp_RBTHAF, Tmp_OGONOAF, Tmp_NGONOAF, Tmp_WBSNO;
                //系統件單號, 資料來源, 數量 料號 機種 承修工場 工單類型 單況 單況說明
                string Tmp_FMNO, Tmp_DTSOR, Tmp_RQTYAF, Tmp_NSN, Tmp_EIAC_CUS;
                string Tmp_FACWC, Tmp_FRTP, Tmp_STATFM, Tmp_STATFM_;                   


                //每筆資料列印後, 不分頁列印下一筆
                for (var i = 0; i < dt1.Rows.Count; i++)
                {
                    Tmp_AMMNO = dt1.Rows[i]["AMMNO"].ToString();
                    Tmp_RPNOAF = dt1.Rows[i]["RPNOAF"].ToString();
                    Tmp_MRPNOAF = dt1.Rows[i]["MRPNOAF"].ToString();
                    Tmp_SAPNO_ = dt1.Rows[i]["SAPNO_"].ToString();
                    //string Tmp_TYPEAF, Tmp_PN_, Tmp_C_NM, Tmp_SEQOAF, Tmp_MB1A;
                    Tmp_TYPEAF = dt1.Rows[i]["TYPEAF"].ToString();                    
                    Tmp_PN_ = dt1.Rows[i]["PN_"].ToString();
                    Tmp_C_NM = dt1.Rows[i]["C_NM"].ToString();                    
                    Tmp_SEQOAF = dt1.Rows[i]["SEQOAF"].ToString();
                    Tmp_MB1A = dt1.Rows[i]["MB1A"].ToString();
                    //string Tmp_RBTHAF, Tmp_OGONOAF, Tmp_NGONOAF, Tmp_WBSNO;
                    Tmp_RBTHAF = dt1.Rows[i]["RBTHAF"].ToString();
                    Tmp_OGONOAF = dt1.Rows[i]["OGONOAF"].ToString();
                    Tmp_NGONOAF = dt1.Rows[i]["NGONOAF"].ToString();
                    Tmp_WBSNO = dt1.Rows[i]["WBSNO"].ToString();
                    //string Tmp_FMNO, Tmp_DTSOR, Tmp_RQTYAF, Tmp_NSN, Tmp_EIAC_CUS;
                    Tmp_FMNO = dt1.Rows[i]["FMNO"].ToString();
                    Tmp_DTSOR = dt1.Rows[i]["DTSOR"].ToString();
                    Tmp_RQTYAF = dt1.Rows[i]["RQTYAF"].ToString();
                    Tmp_NSN = dt1.Rows[i]["NSN"].ToString();
                    Tmp_EIAC_CUS = dt1.Rows[i]["EIAC_CUS"].ToString();
                    //string Tmp_FACWC, Tmp_FRTP, Tmp_STATFM, Tmp_STATFM_;                   
                    Tmp_FACWC = dt1.Rows[i]["FACWC"].ToString();
                    Tmp_FRTP = dt1.Rows[i]["FRTP"].ToString();
                    Tmp_STATFM = dt1.Rows[i]["STATFM"].ToString();
                    Tmp_STATFM_ = dt1.Rows[i]["STATFM_"].ToString();

                    //GetExcelPos(欄, 行) 以 0 開始, 
                    //string Tmp_AMMNO, Tmp_RPNOAF, Tmp_MRPNOAF, Tmp_SAPNO_;                    
                    ws.Range[myfunc.GetExcelPos(0, i + 1)].Text = Tmp_AMMNO;
                    ws.Range[myfunc.GetExcelPos(1, i + 1)].Text = Tmp_RPNOAF;
                    ws.Range[myfunc.GetExcelPos(2, i + 1)].Text = Tmp_MRPNOAF;
                    ws.Range[myfunc.GetExcelPos(3, i + 1)].Text = Tmp_SAPNO_;
                    //string Tmp_TYPEAF, Tmp_PN_, Tmp_C_NM, Tmp_SEQOAF, Tmp_MB1A;                    
                    ws.Range[myfunc.GetExcelPos(4, i + 1)].Text = Tmp_TYPEAF;
                    ws.Range[myfunc.GetExcelPos(5, i + 1)].Text = Tmp_PN_;
                    ws.Range[myfunc.GetExcelPos(6, i + 1)].Text = Tmp_C_NM;
                    ws.Range[myfunc.GetExcelPos(7, i + 1)].Text = Tmp_SEQOAF;
                    ws.Range[myfunc.GetExcelPos(8, i + 1)].Text = Tmp_MB1A;
                    //string Tmp_RBTHAF, Tmp_OGONOAF, Tmp_NGONOAF, Tmp_WBSNO;
                    ws.Range[myfunc.GetExcelPos(9, i + 1)].Text = Tmp_RBTHAF;
                    ws.Range[myfunc.GetExcelPos(10, i + 1)].Text = Tmp_OGONOAF;
                    ws.Range[myfunc.GetExcelPos(11, i + 1)].Text = Tmp_NGONOAF;
                    ws.Range[myfunc.GetExcelPos(12, i + 1)].Text = Tmp_WBSNO;
                    //string Tmp_FMNO, Tmp_DTSOR, Tmp_RQTYAF, Tmp_NSN, Tmp_EIAC_CUS;                    
                    ws.Range[myfunc.GetExcelPos(13, i + 1)].Text = Tmp_FMNO;
                    ws.Range[myfunc.GetExcelPos(14, i + 1)].Text = Tmp_DTSOR;
                    ws.Range[myfunc.GetExcelPos(15, i + 1)].Text = Tmp_RQTYAF;
                    ws.Range[myfunc.GetExcelPos(16, i + 1)].Text = Tmp_NSN;
                    ws.Range[myfunc.GetExcelPos(17, i + 1)].Text = Tmp_EIAC_CUS;
                    //string Tmp_FACWC, Tmp_FRTP, Tmp_STATFM, Tmp_STATFM_;
                    ws.Range[myfunc.GetExcelPos(18, i + 1)].Text = Tmp_FACWC;
                    ws.Range[myfunc.GetExcelPos(19, i + 1)].Text = Tmp_FRTP;
                    ws.Range[myfunc.GetExcelPos(20, i + 1)].Text = Tmp_STATFM;
                    ws.Range[myfunc.GetExcelPos(21, i + 1)].Text = Tmp_STATFM_;                    
                }

                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;
                //匯出檔產生失敗
                Tmp_Str = "產生匯出檔案失敗<br>"
                                + Tmp_ErrMsg;
                MyCookie = new HttpCookie("EX_DFile", HttpUtility.UrlEncode(Tmp_Str));
                HttpContext.Current.Response.Cookies.Add(MyCookie);
                //HttpContext.Current.Server.ClearError();                
                HttpContext.Current.ApplicationInstance.CompleteRequest();
                return;
            }
            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>";
            MyCookie = new HttpCookie("EX_DFile", HttpUtility.UrlEncode(Tmp_Str));
            HttpContext.Current.Response.Cookies.Add(MyCookie);
            HttpContext.Current.Response.End();
        }  // end of public void DoPRNLIST()

2023年5月19日 星期五

V20302 –Cookie – 如何判斷後端資料已更新完成, 才出現子畫面 -2 - settrue , waittrue - Cookie

 目的: V20302 – [確認除帳] – 如何判斷後端資料已更新完成, 才出現子畫面 -2 
           利用 myfunc.js 的  settrue , waittrue  - 設定Cookie 欄位值 & 取得Cookie欄位

處理說明: 1>當 store.on('load' 時, settrue(par_key) - 設定Cookie 為 true
                  2>waittrue(par_key, AddItem) - 直到 Cookie 為 true 時,才執行函式

1>*.js
    Ext.getCmp('sub1_Grid2').store.getProxy().url = '../api/V20302BAPI/getsubData2';
    Ext.getCmp('sub1_Grid2').store.getProxy().extraParams = np; //分頁OK,篩選條件OK    
    Ext.getCmp('sub1_Grid2').store.load();           
    
    //將 CSM_AF@TLS_245 的專案承辦人(以@分隔人員編號) 加入 副本.人員 [姓名][Notes_Email]
    Ext.getCmp('sub1_Grid2').store.on('load', function (me, records, successful, operation, eOpts) {        
        settrue("sub1_Grid2");
    }
    );

    waittrue("sub1_Grid2", AddItem);
    function AddItem() {
        Add_sub1_Grid2(par_EMPLYIDnot6);        
        Ext.getCmp('sub1_Grid2').getView().refresh();
    }
    



2>myfunc.js  -->   settrue()    waittrue()
/*
//函式名稱 : settrue  
傳入參數: par_key: string
設定 Cookie(par_key) 為 true 時
 */
function settrue(par_key, call_func) {
    Ext.util.Cookies.set(par_key,true);
}

/*
//函式名稱 : waittrue  
   傳入參數 : par_key : string
   若 Cookie(par_key) 為 true 時,才執行函式 call_func
*/
function waittrue(par_key, call_func) {
    console.log("par_key:", par_key);
    var timer = setInterval(function () {
        //var Tmp_loaded = decodeURIComponent(Ext.util.Cookies.get(par_key));
        var Tmp_loaded = Ext.util.Cookies.get(par_key);
        if (Tmp_loaded) {
            Ext.util.Cookies.clear(par_key);
            clearInterval(timer);  //不再重覆執行
            call_func();
            return;
        }
    }, 1000);
    };       // end ot waittrue()
    

2023年5月16日 星期二

http傳送 字串編碼 & 字串解碼 - HttpUtility.UrlEncode(String) , UrlDecode(String) - Cookie

 目的: 在 Http的資料流程, 傳遞空白/標點符號之類的字元, 在接收端可能會錯誤解譯
          所以必需先 URL編碼 , 將URL中不允許的字元(空白,<>,...)編碼
          --> 當字元內嵌在 URL 中傳輸的文字區塊時,
                 這些字元 < and > 會編碼為 %3c 和 %3e

處理說明:  1>TextArea 欄位,以 "\r\n" 換行

                 2>由後端組合好的字串, 必需先 UriEncode ,再送至前端 

                 3>還原後端的字串,必需先 decodeURI , 

                      -->  但空白,可能變成+




1>*.cs
      if (Tmp_TYPEAF == "6")
          { Tmp_content6 = Tmp_content6 + "提領編號:" + Tmp_GONOAF + ",交修單號:" + Tmp_RPNOAF + "\r\n"; }
      else
          { Tmp_contentnot6 = Tmp_contentnot6 + "提領編號:" + Tmp_GONOAF + ",交修單號:" + Tmp_RPNOAF + "\r\n"; }
      MyCookie = new HttpCookie("V20302_content6", HttpUtility.UrlEncode(Tmp_content6));
      HttpContext.Current.Response.Cookies.Add(MyCookie);


2>*.js
   var r_V20302_contentnot6 = r_cookies('V20302_contentnot6');
   var Tmp_sub_contentnot6 = "已經接收器材:\r\n"
        + r_V20302_contentnot6 + "\r\n"
        + "請至 AMM系統 V20303: 進廠檢查資料登錄做後續處理。\r\n";  
    Ext.getCmp("sub_Subjext").setValue(Tmp_sub_Subjectnot6);
    Ext.getCmp("sub_content").setValue(Tmp_sub_contentnot6);    


function r_cookies(i_params) {
    var cookie_token = Ext.util.Cookies.get(i_params);
    return decodeURIComponent(escape(cookie_token));
}

PS1:
在 client 端送資料給 server 端時,若使用 query string 的方式,格式通常是這樣 https://www.sample.com?foo=abc&bar=def,而若當中有空白的話,像是 foo=a b c a、b、c 中間有空白,則會有以下加號(+)和 %20 兩種情況(可參考這裡)。

PS2: https://www.cythilya.tw/2020/07/24/encode-decode/
const encodedStr = encodeURIComponent('這是中文字串'); // encodedStr 得到 %E9%80%99%E6%98%AF%E4%B8%AD%E6%96%87%E5%AD%97%E4%B8%B2
const decodedStr = decodeURIComponent(encodedStr); // decodedStr 得到 這是中文字串

2022年9月7日 星期三

V20306 - 傳送檔案至前端 - 若有錯誤(Exception),則顯示錯誤訊息

 目的: 傳送檔案至前端 - 若有錯誤(Exception),則顯示錯誤訊息

處理說明:  1>*.cs  , 
            將錯誤訊息加入 Cookie & HttpContext.Current.ApplicationInstance.CompleteRequest();

             catch (Exception e)
            {
                var Tmp_ErrMsg = e.Message;
                //包裝標籤檔產生完成
                Tmp_Str = "產生包裝匯出檔案失敗<br>"                                
                                + Tmp_ErrMsg;
                MyCookie = new HttpCookie("EX_DFile", HttpUtility.UrlEncode(Tmp_Str));                
                HttpContext.Current.Response.Cookies.Add(MyCookie);
                HttpContext.Current.ApplicationInstance.CompleteRequest();

                return;
            }




1>*.js
//查詢  - 將目前所選的資料,匯出成報表
    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.getCmp('s_form').submit({
        //Ext.Ajax.request({
            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  -  HttpContext.Current.ApplicationInstance.CompleteRequest();

 HttpCookie MyCookie;
 try
 {

}
 catch (Exception e) {
               var Tmp_ErrMsg = e.Message;
                //包裝標籤檔產生完成
                Tmp_Str = "產生包裝匯出檔案失敗<br>"                                
                                + Tmp_ErrMsg;
                MyCookie = new HttpCookie("EX_DFile", HttpUtility.UrlEncode(Tmp_Str));                
                HttpContext.Current.Response.Cookies.Add(MyCookie);  
                HttpContext.Current.ApplicationInstance.CompleteRequest();
                return;
}
 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>";
            MyCookie = new HttpCookie("EX_DFile", HttpUtility.UrlEncode(Tmp_Str));
            HttpContext.Current.Response.Cookies.Add(MyCookie);
            HttpContext.Current.Response.End();

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