2025年6月8日 星期日

PadRight1 :根據字元的顯示寬度來補齊字串右側 - PadRight

 目的: 根據字元的顯示寬度來補齊字串右側。
           一個中文字元通常視為佔用兩個英文字元的寬度。

處理說明: 1>根據字元的顯示寬度來補齊字串右側 , PadRight1()






1>myfunc.cs  PadRight1(Tmp_Str, length , par_fill_char)

Tmp_Str = myfunc.PadRight1(Tmp_PN1, 16) + myfunc.PadRight1(Tmp_PN2, 16) 
              + myfunc.PadRight1(Tmp_PN3, 16) + myfunc.PadRight1(Tmp_RPN1, 16)
              + myfunc.PadRight1(Tmp_CONFIDENCE, 10) + myfunc.PadRight1(Tmp_TP, 6) + "\r\n";

Tmp_Str= myfunc.PadRight1("件號1", 16) + myfunc.PadRight1("件號2", 16) + myfunc.PadRight1("件號3", 16) 
              +myfunc.PadRight1("關聯件號", 16)+myfunc.PadRight1("關聯程度", 10) + myfunc.PadRight1("類別", 6)+"\r\n"
             + myfunc.PadRight1("=", 16,'=') + myfunc.PadRight1("=", 16, '=') + myfunc.PadRight1("=", 16, '=') 
             + myfunc.PadRight1("=", 16,  '=') + myfunc.PadRight1("=", 10, '=') + myfunc.PadRight1("=", 6, '=') + "\r\n"
             + Tmp_Str;



2> 原本函式    Tmp_Str.PadRight(length , par_fill_char);
//Tmp_Str = Tmp_PN1.PadRight(16, '_') + "台中市".PadRight(16, '+') + "123".PadRight(16, '_') + Tmp_RPN1.PadRight(16, '+')
                //               +Tmp_CONFIDENCE.PadRight(10, '_') + Tmp_TP.PadRight(6, '+') + "\r\n";

2025年6月5日 星期四

HTML : Request & Response 機制

HTML 的 Request(請求)和 Response(回應)是網頁運作的核心機制,主要透過 HTTP(超文本傳輸協定)來進行溝通。

Request(請求)

當使用者在瀏覽器輸入網址或點擊連結時,瀏覽器會向伺服器發送 HTTP Request,請求特定的網頁或資源。請求通常包含:

  • 方法(Method):例如 GET(取得資料)、POST(提交資料)、PUT(更新資料)、DELETE(刪除資料)。

  • URL(網址):指定要請求的資源位置。

  • 標頭(Headers):包含額外資訊,如瀏覽器類型、語言偏好等。

  • 請求主體(Body):通常用於 POSTPUT,包含要傳送的資料。

Response(回應)

伺服器收到請求後,會處理並回應 HTTP Response,回應通常包含:

  • 狀態碼(Status Code):例如 200 OK(成功)、404 Not Found(找不到資源)、500 Internal Server Error(伺服器錯誤)。

  • 標頭(Headers):包含回應的額外資訊,如內容類型、編碼方式等。

      Content-Disposition 是 HTTP 標頭之一,主要用來指定伺服器如何處理回應內容,
           特別是在檔案下載時
          它可以決定內容是否應該顯示在瀏覽器內,或是強制下載到使用者的裝置
  • 回應主體(Body):通常是 HTML、JSON、圖片或其他資源。

這個機制讓瀏覽器能夠與伺服器溝通,取得網頁內容並顯示給使用者。


參考內容: 網址

https://ithelp.ithome.com.tw/articles/10299957









V20305E-[請料提出]鈕 –1>有問題時,輸出Log檔案&顯示cookie訊息 2>沒問題時,直接顯示cookie訊息,沒輸出HTML/檔案 - cookie 清成空白 - Response.End()

 目的:V20305E-[請料提出]鈕 
          1>有問題時,輸出Log檔案&顯示cookie訊息   (Response 輸出 *.txt)
          2>沒問題時,直接顯示cookie訊息,沒輸出HTML/檔案( Response無內容)
              --> 不可執行 Response.End() , 否則畫面會呈現空白(黑螢幕)
          3>Request & Response 說明 

處理說明:  
         0>cookie 清成空白
             Ext.util.Cookies.set("Rtn_Msg", "");
         1>檢核有問題時,直接顯示cookie訊息無任何html/檔案輸出
              --> 不可用 Response.End()
              1.1>*.cs
                    Tmp_Str = "成功: [請料提出]鈕,檢核完成!!<br>";
                    MyCookie = new HttpCookie("Rtn_Msg", HttpUtility.UrlEncode(Tmp_Str));
                    HttpContext.Current.Response.Cookies.Add(MyCookie);        
                    --> 不可用Response.End(); 因為沒有輸出內容(html/檔案)
              1.2>*.js
                   if (r.indexOf("成功") > -1) {
      mysuccessalert(r);
                Call_V20305E_T_Update();
                Call_V20305E_T_Email(cur_rec);
                return;
            }
         

         2>檢核有問題時,輸出Log檔案&顯示 cookie訊息
                        2.1> *.cs 
                      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((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();
                    HttpContext.Current.ApplicationInstance.CompleteRequest();

            2.2>*.js
var r = r_cookies('Rtn_Msg');
 //若有傳回值,則執行下一步驟
 if (!checkisnull(r)) {
     mask.hide();            
     clearInterval(timer);    
      if (r.indexOf("錯誤") > -1) {
                mywarnalert(r);


    





 1>*.js
Ext.util.Cookies.set("Rtn_Msg", "");
    var np = {};
    np["AMMNO"] = nulltoStr(Tmp_AMMNO);
    np["PN"] = nulltoStr(Tmp_PN);
    Tmp_url = '../../api/V20305EAPI/CHECK_TLS';
    //因為會下載檔案,所以用 submit 
    Ext.getCmp('s_form').submit({
        method: "POST",
        url: Tmp_url,  //更新資料庫單況            
        standardSubmit: true,
        params: np,
        async: false,
    });  //end of Ext.Ajax.Request               

    var mask = new Ext.LoadMask(Ext.getBody(), {
        msg: '[請料提出]鈕,資料檢核中, 請稍待...'
    });
    mask.show();//使用 mask 需手動呼叫show() 方法下            
    var timer = setInterval(function () {
        var r = r_cookies('Rtn_Msg');
        console.log("cookies Rtn_Msg =", r);
        //若有傳回值,則執行下一步驟
        if (!checkisnull(r)) {
            mask.hide();            
            clearInterval(timer);    
            if (r.indexOf("錯誤") > -1) {
                mywarnalert(r);
                return;  //若有錯誤,則顯示錯誤訊息, 不再執行下一步騳
            }
            if (r.indexOf("成功") > -1) {
                mysuccessalert(r);
                Call_V20305E_T_Update();
                Call_V20305E_T_Email(cur_rec);
                return;
            }
        } 
    }, 1000)  // end of timer            

}  // end of function Call_V20305E_A() {
     

2>*.cs
[HttpPost]
public void CHECK_TLS()
{
  //匯出文字
            string Tmp_out_FName = "V20305_請料提出_log.txt";      //處理_log.txt
            string documentPath = HttpContext.Current.Server.MapPath("~") + "document\\"; //取得實實的路徑
            string Tmp_out_pFName = documentPath + Tmp_out_FName;    //含 path 的Filename
            HttpCookie MyCookie;
            MyCookie = new HttpCookie("Rtn_Msg", HttpUtility.UrlEncode(""));  //cookie 清成空白
            if (File.Exists(Tmp_out_pFName))
            {
                File.Delete(Tmp_out_pFName);
            }
                    Tmp_Sql = " SELECT   FIXNO   "
                                    + "  FROM    AMM_SRO   "
                                    + "  WHERE   1 = 1  "
                                    + "  AND        AMMNO = " + myfunc.AA(Tmp_AMMNO);
                    Tmp_FIXNO = myfunc.SqlValue(Tmp_Sql);
                    if (myfunc.checkisnull(Tmp_FIXNO))
                    {
                        Tmp_Str = "錯誤: "
                                                 + "AMM單號(" + Tmp_AMMNO + ")\r\n"
                                                + "的交修單號空白(AMM_SRO.FIXNO)\r\n"
                                                + "敬請檢核 !!\r\n";                                                
                        File.AppendAllText(Tmp_out_pFName, Tmp_Str);  
                        break;
                    }


   if (myfunc.checkisnull(Tmp_Str))
                {
                    Tmp_Str = "成功: [請料提出]鈕,檢核完成!!<br>";
                    MyCookie = new HttpCookie("Rtn_Msg", HttpUtility.UrlEncode(Tmp_Str));                    
                    HttpContext.Current.Response.Cookies.Add(MyCookie);                    
                    // 不可用   HttpContext.Current.Response.End(); , 因為無輸 HTML/檔案
                    // 否則會螢幕空白,黑螢幕 
                }
                else
                {   //若有錯誤,則下載  *.txt & 加入  cookie
                    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((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();  //輸出 HTML/檔案
                    HttpContext.Current.ApplicationInstance.CompleteRequest();
                }

2025年5月14日 星期三

V20305M – 匯入PDM_BOM需求物料 –呼叫WebService WS_PDM02 –傳回文字檔*.TXT -*.TXT文字格式(左靠/右靠)

 目的: V20305M – 匯入PDM_BOM需求物料 
                            –呼叫WebService WS_PDM02 
                            –傳回文字檔*.TXT  
                            -*.TXT文字格式(左靠/右靠)

處理說明:  1>呼叫 WebService  - myfunc.getWS_PDM02
                       DataSet ds = myfunc.getWS_PDM02(Tmp_PN, Tmp_ECNO, Tmp_CDCODE,..);
                       DataTable Tmp_dt1 = ds.Tables["T1"];
                   2>*.TXT 檔 文字格式 - 固定長度_左靠
                        Tmp_Str = "AMM單號".PadRight(16, ' ')+"件號".PadRight(16,' ')+..+ "\n\r";
                        File.AppendAllText(Tmp_out_pFName, Tmp_Str);  
                        Tmp_Str = "=============================================" + "\n\r";
                        File.AppendAllText(Tmp_out_pFName, Tmp_Str);  
                   3>傳回 *.TXT 檔 -下載 *.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();





1>myfunc.cs    呼叫WebService  WS_PDM02  - getWS_PDM02
/*
        // 函式名稱: getWS_PDM02
        1>傳入參數:
                        itm_id: 件號        ec_id:  ECNO           status:   情況碼
                        prodid:  機種       numberS:  機號        config:   專案配置      workloc:     生產工廠

        2>傳回參數:  ds 
                                    cmp_id:  子件號      itm_name:  子件號           qty:   需求數量
                                       units:    單位         mroutinetype:  製程          mroutinetype_name:  製程名稱
        
        */
        public static dynamic getWS_PDM02(string par_itm_id, string par_ec_id,string par_status,string par_prodid,string par_numberS, string  par_config,string par_workloc)
        {
            //DataSet ds=new DataSet();
            DataSet ds = null;  //接收 WebService 的回傳值
            if (!myfunc.checkisnull(par_itm_id))
            {
                PLM_WS.ServiceSoapClient PLM_WS = new PLM_WS.ServiceSoapClient();
                try
                {
                    ds = PLM_WS.AMM_PDM02(par_itm_id, par_ec_id, par_status, par_prodid, par_numberS, par_config, par_workloc);
                    myfunc.ds2T1C(ds);
                }
                catch (Exception ex)
                {
                    throw ex;
                }                //throw ex;            
                finally
                { };
            }
            return ds;
        }


2>*.cs
      DataSet ds = myfunc.getWS_PDM02(Tmp_PN, Tmp_ECNO, Tmp_CDCODE,..);
      DataTable Tmp_dt1 = ds.Tables["T1"];
//匯出文字
            string Tmp_out_FName = "V20305_匯入PDM_BOM結果_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);
            }

            string Tmp_Str;
            Tmp_Str = "AMM單號".PadRight(16, ' ')+"件號".PadRight(16,' ')
                             +"匯入情況(Y/N)".PadRight(16,' ')+"匯入說明".PadRight(40,' ')
                             + "\n\r";
            File.AppendAllText(Tmp_out_pFName, Tmp_Str);  //不用 sw , 改用 File.AppendAllText
            Tmp_Str ="==================================================" + "\n\r";
            File.AppendAllText(Tmp_out_pFName, Tmp_Str);  //不用 sw , 改用 File.AppendAllText

3>*.js
//匯入PDM_BOM資料
    function V20305M_OK() {
        var cur_recs = Ext.getCmp('grid_M').getSelectionModel().getSelection();
        if (cur_recs.length == 0) {
            mywarnalert("請先選擇要匯入PDM_BOM的資料");
            return false;
        }
        var cur_rec;
        let Tmp_DataAry1 = [];
        for (let i = 0; i <= cur_recs.length - 1; i++) {
            console.log("i:", i);
            cur_rec = cur_recs[i];
            Tmp_DataAry1.push(cur_rec.data);
        }  // for i=0 to 
        let Tmp_DataString1 = JSON.stringify(Tmp_DataAry1);
        var np1 = {};
        np1["DataString1"] = Tmp_DataString1;
        np1["AMMNO"] = Tmp_AMMNO;
        np1["RPNOAF"] = Tmp_RPNOAF;
        np1["EIAC"] = Tmp_EIAC;

        np1["sub_PN"] = Ext.getCmp("sub_PN").getValue();   //件號
        //np1["sub_EONO"] = Ext.getCmp("sub_EONO").getValue();   //EONO
        //np1["sub_CDCODE"] = Ext.getCmp("sub_CDCODE").getValue();   //情況碼
        //?? 測試用
        np1["sub_EONO"] = "";   //EONO
        np1["sub_CDCODE"] ="";   //情況碼
        np1["sub_PDM_CONFIG"] = Ext.getCmp("sub_PDM_CONFIG").getValue();   //專案配置
        np1["sub_PDMPDTP"] = Ext.getCmp("sub_PDMPDTP").getValue();                //機種
        np1["sub_ACNO"] = Ext.getCmp("sub_ACNO").getValue();                               //機號

        np1["sub_rd_TYPE"] = (Ext.getCmp("sub_rd_TYPE").getValue()).sub_rd_TYPE;
        np1["sub_rd_SYS"] = (Ext.getCmp("sub_rd_SYS").getValue()).sub_rd_SYS;        
        //因為要傳回 *_log.txt ..所以改用 submit , 由 cookie 傳回訊息
        var Tmp_url = '../../api/V20305MAPI/INS_AMM_UOC_AMM_UOCD'
        Ext.getCmp('s_form').submit({
            method: "POST",
            url: Tmp_url,  //更新資料庫單況            
            standardSubmit: true,
            params: np1,
            async: false,
        });  //end of Ext.Ajax.Request               

        //顯示結果訊息..
        var Tmp_Str = '資料處理中..<br>'
                              + '可能需要數十分鐘<br> '
                              + ' 請稍待...<br>';
        var mask = new Ext.LoadMask(Ext.getBody(), {
            msg: Tmp_Str
        });

        mask.show();//使用 mask 需手動呼叫show() 方法下
        //每1秒檢核一次,是否已完成, 若已完成,則不再檢核
        var timer = setInterval(function () {
            var r = r_cookies('Rtn_Msg');
            if (!checkisnull(r)) {
                mysuccessalert(r);
                clearInterval(timer);
                mask.hide();
                timer = null;
            }
        }, 1000);  //1000ms = 1sec    


    } // end of function V20305M_OK()

2025年5月13日 星期二

V20305M – 匯入PDM BOM檔 –sub_Panel – 設定唯讀/填入欄位值 - 子畫面

 目的: V20305M – 匯入PDM BOM –sub_Panel – 設定唯讀/填入欄位值

處理說明:
              1>     Get_cmp_panel1 加入[件號][ECNO][情況碼]欄位
               2>     設定唯讀
               3>     填入欄位值



1>*.js
//設定 [件號] / [ECNO] / [CDCODE情況碼] 欄位
var cmp_sub_panel1 = get_cmp_panel1(200);
var cmp_sub_PN = get_cmp_txt1('件號', 'sub_PN', 110, 100);
var cmp_sub_EONO = get_cmp_txt1('ECNO', 'sub_EONO', 110, 100);
var cmp_sub_CDCODE = get_cmp_txt1('情況碼', 'sub_CDCODE', 110, 100);
cmp_sub_panel1.items.push(cmp_sub_PN, cmp_sub_EONO, cmp_sub_CDCODE);

//設定[機號]欄位
    var cmp_sub_ACNO = get_cmp_txt1('機號', 'sub_ACNO', 110, 100);
    //純粹LABEL欄位,  get_lbl_cmp1(欄位id , 欄位寬度 )
    //function get_cmp_lbl0(par_caption, par_l_width) {
    var cmp_sub_ACNO_lbl = get_cmp_lbl0('(只填一機號)', 110);
    cmp_sub_ACNO.items.push(cmp_sub_ACNO_lbl);


2025年5月7日 星期三

V20305L - 上下層同時提料需求申請 – Email附檔/收件人/副本 - New

 目的: V20305L - 上下層同時提料需求申請 – Email附檔/收件人/副本

處理說明: Email 附加檔案 - 所有資料均列入*.xls檔案 -  收件人/副本
                             1>*.js
                                    1.1>更新[上下層同時提料說明] 欄位值 -   UPDATE_UDRQSN
                                     1.2>Email附檔/收件人/副本
                             2>*.cs  -
                                      using Spire.Xls;                              //*.xls 
                                       using System.Net.Mime;    //Email

                             2.1>加入收件人/副本
                                                   MailMessage ChkMail = new MailMessage();
                                                  string mail_from = "tlsapp@ms.aidc.com.tw";
                                                       ChkMail.From = new MailAddress(mail_from, "AMM系統", System.Text.Encoding.UTF8);//寄件者                                                    
                                                                    ChkMail.To.Add(Tmp_NOTES_MAIL);         
                                                                   ChkMail.CC.Add(Tmp_CC_Email);
                 2.2>產生附件檔
                                        DataSet ds = get_sub_Data1();            
                        DataTable dt1 = ds.Tables[1];
                        for (var i = 0; i < dt1.Rows.Count; i++)
                             {..};
                        string Tmp_FName = "V20305_上下層同時提料申請.xlsx";              
                        Tmp_FName = ExportFile1(Tmp_FName);
                        ContentType ct = new ContentType("application/vnd.openxmlformats-                    
                                                                                 officedocument.spreadsheetml.sheet");
            //Attachment attm = new Attachment(stream, Tmp_FName, System.Net.Mime.MediaTypeNames.Application.Octet);
                        Attachment attm = new Attachment(Tmp_FName, ct);
                        ChkMail.Attachments.Add(attm);
                 2.3>Email 
                        sendMail(subject, content, ChkMail);   


1>*.js

var np = {};    
        np["RPNOAF_Str"] = Tmp_RPNOAF_Str;
        np["AMMNO_Str"] = Tmp_AMMNO_Str;
        np["UDRQSN"] = Ext.getCmp("sub_UPDOWN_DESCP").getValue();
        //np["DataString1"] = Tmp_DataString1;
        var Tmp_url = "../../api/V20305LAPI/UPDATE_UDRQSN";        
        Tmp_RtnMsg = getUrlStr(Tmp_url, np, "更新[上下層需求說明(AMM_UOCD.UDRQSN)].UpdateUDRQSN");
        if (!checkRtnOK(Tmp_RtnMsg)) {
            myalert(Tmp_RtnMsg);
            return;
        }  // end of SelAllBtn_click

        //STEP2 : Email                
        Tmp_url = "../../api/V20305LAPI/DoMAIL";
        Tmp_RtnMsg = getUrlStr(Tmp_url, np, "更新[上下層提料需求申請].DoMail");
        if (!checkRtnOK(Tmp_RtnMsg)) {
            myalert(Tmp_RtnMsg);
            return;
        }  // end of SelAllBtn_click
        Tmp_RtnMsg = "[上下層同時提料需求申請]鈕.執行成功!!<br>"
                                + Tmp_RtnMsg;
        mysuccessalert(Tmp_RtnMsg)



2>*.cs

public dynamic UPDATE_UDRQSN()
{
//取得參數值
var c = HttpContext.Current;
NameValueCollection nvc = c.Request.Form;

string Tmp_UDRQSN = nvc["UDRQSN"];
//匯出時, 不分頁(par_paging=false), 資料全取
//V20305LAPIController V20305L = new V20305LPIController();
DataSet ds = get_sub_Data1();
DataTable dt1 = ds.Tables[1];

for (var i = 0; i < dt1.Rows.Count; i++)
{
     Tmp_RPNOAF = dt1.Rows[i]["RPNOAF"].ToString();
     Tmp_EIAC = dt1.Rows[i]["EIAC"].ToString();

}
 //取得交修單號.[承辦人員].NOTES_MAIL
  MailMessage ChkMail = new MailMessage();            
  string mail_from = "tlsapp@ms.aidc.com.tw";
 ChkMail.From = new MailAddress(mail_from, "AMM系統", System.Text.Encoding.UTF8);//發送者  
         ChkMail.To.Add(Tmp_NOTES_MAIL);         
       ChkMail.CC.Add(Tmp_CC_Email);
          

2025年5月6日 星期二

V20305 – [主按鈕]列如何分成兩行

 目的: V20305 – [主按鈕]列如何分成兩行

處理說明: