目的: Word - 選取物料 - 整批移動
2025年6月11日 星期三
Word - 設定線條為垂直線/水平線 – 新線條 / 舊線條
目的: Word中設定線條為垂直線/水平線 – 新線條 / 舊線條
處理說明: 1>新線條:
按住[Shift]鈕+新線條 , 即可畫面水平線/垂直線
按住[Shift]鈕+新線條 , 即可畫面水平線/垂直線
2>舊線條:
版面配置選項 --> 大小 -->調整寬度/高度=0
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):通常用於
POST
或PUT
,包含要傳送的資料。
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)
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文字格式(左靠/右靠)
-*.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][情況碼]欄位
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);
訂閱:
文章 (Atom)