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 – [主按鈕]列如何分成兩行

處理說明:





2025年4月24日 星期四

V20305D – [批次匯入]資料-先檢核匯入資料,全部都沒問題 ,才更新資料庫 - XLS匯入 - 檢核資料後,更新資料庫

目的: V20305D – [批次匯入]資料-先檢核匯入資料,全部都沒問題 ,才更新資料庫

處理說明: 1>*.cs  
                                              -   CHECK2INS_AMM_UOC_UOCD()
                                             先檢核匯入資料,若全部資料檢核OK,才   更新資料庫
                                            Tmp_RtnMsg = CHECK_XLSDATA();
                                           if (!myfunc.checkisnull(Tmp_RtnMsg))
                                         {
                                            ws.Range[myfunc.GetExcelPos(44, cur_row)].Value = Tmp_RtnMsg;
                                            Tmp_isOk = false;
                                            continue;
                                        }

                              2>//STEP2 若匯入資料全部正確, 才更新資料
                                       if (Tmp_isOk)
                                    {
                                           //重新讀取匯入資料 , 更新資料庫
                                          cur_row = 1;
                                          for (int i = 0; i < RowsCount; i++)
                                      {  }
                                             
 




1>*.cs
//檢核標題是否正確
  if ((Tmp_OGONOAF != "提領編號") || (Tmp_RPNOAF != "交修單號") || (Tmp_MRPNOAF != "維修交修單號") || 
{


//檢核資料是否正確
 ws.Range[myfunc.GetExcelPos(44, 0)].Value = "匯入結果說明";
 ws.AutoFitRow(1);
 //STEP2 取得xls.[目前件號].報工資料                    
 // Transaction SQL List - 存放  Transaction 的 SQL 
 List<string> SQL_List_A = new List<string>();

 int RowsCount = ws.LastRow;
 bool Tmp_isOk = true;
 
 //STEP 1   : 檢核匯入的全部資料是否正確 , 資料全部正確 , 才執行資料更新
 for (int i = 0; i < RowsCount; i++)
{
}

 //STEP2 若匯入資料全部正確, 才更新資料
 if (Tmp_isOk)
 {
      //重新讀取匯入資料 , 更新資料庫
      cur_row = 1;
     for (int i = 0; i < RowsCount; i++)
   {  //更新資料庫
    }
}

2025年4月15日 星期二

V20305K1 –[確認]鈕 – 顯示訊息(myalert) 未顯示在最上層視窗 – 非TLS品項單筆提料 - 以
, /n 分行 - replace replaceAll

 目的: V20305K1 –[確認]鈕 – 顯示訊息(myalert) , – 非TLS品項單筆提料 
           --> myalert 未顯示在最上層視窗 (以<br>分行)
           --> 改用 alert (以/n分行)

處理說明:  1>V20305K1  - 主畫面2子畫面2子子畫面 (V20305 到 V20305K 到 V20305K1).顯示訊息
                        以 myalert 顯示訊息, 該訊息未顯示在最上層視窗, 無法點[確認]鈕
                        -->必需先關掉V20305K1 ,才可看到訊息 & 點[確認]鈕  
                   2>改用 alert 顯示訊息, 才看到該訊息,按[確認]鈕
                   3>alert 訊息,以 /n 分行
                       myalert 訊息,以 <br> 分析
                   4>replace只換第一次match字串, 傳回新字串,但原字串不變
                       replaceAll換所有match字串,傳回新字串,但原字串不變





1>*.js
     if (Tmp_Str.length > 0) {
            Tmp_Str = Tmp_Str + " 敬請檢核 !!<br>";
            //mywarnalert(Tmp_Str);   // myalert無法在最上層顯示訊息, 改用 alert 顯示
            //myalert(Tmp_Str);
            //window.alert(Tmp_Str);
            //將<br>轉成 /n      //replace 只換第一次字串, replaceAll 換所有的字串
            Tmp_Str=Tmp_Str.replaceAll("<br>", "\n");
            //Tmp_Str.replace("< br >", "\n");
            alert(Tmp_Str);   //alert 以 /n 換行,  myalert 以 <br> 換行
            is_ok = false;            
        }

2025年4月14日 星期一

V20305K – 子畫面簡單Grid – [V]加入另一SQL的資料至Grid (dt1 --> dt0) - T1C -重設 ds 的筆數

目的: V20305K – 子畫面簡單Grid – [V]加入另一SQL的資料至Grid

處理說明: 1>取得原始SQL 的資料 - ds.dt0
                      DataSet ds = getDataTable(cmd, countSql, false);
                      Tmp_RNK = ds.Tables["T1"].Rows.Count;
                  2>取得額外 SQL 的資料 , 並加入 dt0
                       Tmp_dt1 = myfunc.SqlOpen(Tmp_dt1, Tmp_Sql);
                       Tmp_cnt1 = Tmp_dt1.Rows.Count;
                       for (int j = 0; j < Tmp_cnt1; j++)
                      {                        
                        DataRow dr0 = ds.Tables["T1"].Rows.Add();
                        DataRow dr1 = Tmp_dt1.Rows[j];
                        Tmp_RNK = Tmp_RNK + 1;
                        dr0["RNK"] = Tmp_RNK.ToString();
                        dr0["EIAC"] = dr1["EIAC"].ToString();
                        dr0["EI_LCN"] = dr1["EI_LCN"].ToString();
                      }
                   3>重設 dt0 的筆數
                        ds.Tables["T1C"].Rows[0]["TOTAL"] = Tmp_RNK;


1>*.cs
try
            {
                DataSet ds = getDataTable(cmd, countSql, false);
                Tmp_RNK = ds.Tables["T1"].Rows.Count;
                //若[V]含膠漆料,則找出膠漆料的資料
                if (Tmp_sub_chk_INCCLUE=="true") 
                {
                    Tmp_Sql = " SELECT     LCN   "
                                   + "  FROM       PAP @TLS_245  "
                                   + "  WHERE     PN = " + myfunc.AA("MATERIAL REQUIREMENT")
                                    + "  AND         EFF = 'Y'    "
                                   + "   AND         EIAC = " + myfunc.AA(Tmp_EIAC);
                    Tmp_ROOT_LCN = myfunc.SqlValue(Tmp_Sql);
                    Tmp_Sql= "  SELECT  a.EIAC,a.LCN,a.ALC,  "
                                                    +" a.PN,a.CAGE,a.SPN,a.SCAGE,a.QPA,  "
                                                    +" b.EI_LCN,b.EI_ALC,b.NHA_LCN,b.NHA_ALC,  "
                                                    +" c.TMNOXX,c.WP,c.FIG,c.IND  "
                                    +" FROM    PAP @TLS_245 a,N_EI_UOC @TLS_245 b,(select * from PAPTOMD @TLS_245 where STAT = 'Y') c  "
                                    +" WHERE  a.EIAC = b.EIAC  "
                                    +"  AND      a.LCN = b.LCN  "
                                     +" AND      a.ALC = b.ALC  "
                                     +" AND      a.EIAC = c.EIAC(+)   "
                                     +" AND       a.LCN = c.LCN(+)  "
                                     +" AND       a.ALC = c.ALC(+)   "
                                     +" AND       a.PN = c.PN(+)   "
                                     +" AND       a.EFF = 'Y'   "
                                     +" AND       b.EFF = 'Y'   "
                                     +"  AND      a.LCN like "+ myfunc.AA(Tmp_ROOT_LCN+"%")
                                     +" AND       a.EIAC = "+myfunc.AA(Tmp_EIAC)
                                     +" ORDER   BY a.PN ";
                    Tmp_dt1 = myfunc.SqlOpen(Tmp_dt1, Tmp_Sql);
                    Tmp_cnt1 = Tmp_dt1.Rows.Count;
                    for (int j = 0; j < Tmp_cnt1; j++)
                    {                        
                        DataRow dr0 = ds.Tables["T1"].Rows.Add();
                        DataRow dr1 = Tmp_dt1.Rows[j];
                        Tmp_RNK = Tmp_RNK + 1;
                        dr0["RNK"] = Tmp_RNK.ToString();
                        dr0["EIAC"] = dr1["EIAC"].ToString();
                        dr0["EI_LCN"] = dr1["EI_LCN"].ToString();
                        dr0["EI_ALC"] = dr1["EI_ALC"].ToString();
                        dr0["NHA_LCN"] = dr1["NHA_LCN"].ToString();
                        dr0["NHA_ALC"] = dr1["NHA_ALC"].ToString();
                        dr0["LCN"] = dr1["LCN"].ToString();
                        dr0["ALC"] = dr1["ALC"].ToString();
                        dr0["PN"] = dr1["PN"].ToString();
                        dr0["CAGE"] = dr1["CAGE"].ToString();
                        dr0["TMNOXX"] = dr1["TMNOXX"].ToString();
                        dr0["WP"] = dr1["WP"].ToString();
                        dr0["FIG"] = dr1["FIG"].ToString();
                        dr0["IND"] = dr1["IND"].ToString();                        
                    };
                }

                ds.Tables["T1C"].Rows[0]["TOTAL"] = Tmp_RNK;
                ds.Tables["T1"].Columns.Add("NHA_PN_", typeof(object));           //上層件號
                ds.Tables["T1"].Columns.Add("RQPN_", typeof(object));           //提料件號
                ds.Tables["T1"].Columns.Add("C_NM_", typeof(object));           //物料名稱
                ds.Tables["T1"].Columns.Add("NSN_", typeof(object));           //料號                
                               

                foreach (DataRow row in ds.Tables["T1"].Rows)
                {
                    Tmp_EIAC = row["EIAC"].ToString();
                    Tmp_EI_LCN = row["EI_LCN"].ToString();
                    Tmp_PN = row["PN"].ToString();
                    Tmp_CAGE = row["CAGE"].ToString();

                    Tmp_Sql = " SELECT   NSN  "
                                + "  FROM       SP_NSN@TLS_245 "
                                + "  WHERE    1=1 "
                                + "   AND         PN=" + myfunc.AA(Tmp_PN)
                                + "  AND          CAGE=" + myfunc.AA(Tmp_CAGE)
                                + "   AND         rownum=1  ";
                    Tmp_NSN_ = myfunc.SqlValue(Tmp_Sql);


                    row["RQPN_"] = Tmp_RQPN_;
                    row["NHA_PN_"] = Tmp_NHA_PN_;
                    row["C_NM_"] = Tmp_C_NM_;
                    row["NSN_"] = Tmp_NSN_;                    
                }


V20305K – 非TLS品項單筆提料 – [搜尋]鈕 - 左靠前一元件 - 置左

 目的: V20305K – TLS品項單筆提料 – [搜尋] - 左靠前一元件

處理說明: 1>alignTo();    左靠 且有offset
                                           Ext.getCmp("sub_btn_Search").alignTo("btn_sub_PN", "tr?", [6, 0]);
                                    
                                  2>element, position, [offsets], [animate] ) 
                                          positon 參數值



1>*.js
Ext.getCmp("sub_btn_Search").alignTo("btn_sub_PN", "tr?", [6, 0]);

//panel11 需求件號                
    var cmp_sub_PN = get_cmp_txt1('需求件號', 'sub_PN', 80, 130);
    var cmp_pick_sub_PN = get_pick_btn0('挑選需求件號', 'btn_sub_PN',
        '../api/V20305KAPI/get_sub_PNPick?isComplete=0&par_PN=' + Tmp_PN,
        ['PN'], ['sub_PN'], J_pickstore_sub_PN, J_pickcolumns_sub_PN);
    cmp_sub_PN.items.push(cmp_pick_sub_PN);

    var cmp_sub_btn_Search = get_cmp_btn1('搜尋', 'sub_btn_Search', 5);  
    
        var sub_V20305K_Flds = [
            {
                type: 'panel', bodyStyle: "background-color:transparent;", border: 5, padding: "1",
                layout: 'border',
                items: [
                    {
                        xtype: 'panel', id: 'sub_panel1', region: 'north', layout: 'hbox',
                        height: 30,
                        items: [
                            {
                     xtype: 'panel', id: 'sub_panel11', layout: { type: 'hbox', align: 'stretch' }, flex: 25, border: 0,
                                items: [cmp_sub_PN, cmp_sub_btn_Search],
                            },  // end of sub_panel11                            
                        ]  //end of sub_panel1.items,
                    },  // end of sub_panel1                        
                    {
                        xtype: 'panel',
                        id: 'sub_panel2',
                        region: 'center',
                        layout: 'fit',
                        //flex: 5,
                        border: 1,
                        items: [sub_Grid]
                    },
                ] // end of   layout: "vbox", padding: "5", items: [
            }  //end of  sub_ShowPN_Flds , items[{
        ]      //end of  var sub_ShowPN_Flds           


2025年4月9日 星期三

V20305J - SQL - ON DUPLICATE KEY - MERGE - 寫入資料庫時,若不存在,則 Insert ,若已存在,則Update - INSERT INTO -UPDATE

 目的: 寫入資料庫時,若不存在,則 Insert ,若已存在,則Update
         1> MySQL 語法 : ON DUPLICATE KEY UPDATE :  
               當插入的記錄的主鍵或唯一索引衝突時,執行 UPDATE 操作更新指定欄位
                MySQL語法 :   INSERT INTO table
                        (PK1,PK2,COL1,COL2)  
                        VALUES
                        (PK1_VAL,PK2_VAL,COL1_VAL,COL2_VAL
                                           ON DUPLICATE KEY UPDATE 
                                           COL1=COL1_VAL,
                                                COL2=VOL2_VAL

            2>Oracle  SQL語法 : 改用 MERGE 語法  -Oracle 不支援 ON DUPLICATE KEY UPDATE, 
MERGE INTO AMM_UOC target
USING (SELECT '768F0392571016' AS RPNOAF,
              'IDF' AS EIAC,
              'A' AS EI_LCN,
              '00' AS EI_ALC, 
              'A010L030600901' AS NHA_LCN,
              '00' AS NHA_ALC,
              'A010L03060090105' AS LCN,
              '00' AS ALC,
              '2122540-5' AS PN,
              'A201012300008' AS AMMNO,
              'N' AS EFF,
              'A64547' AS CAGE
        FROM dual) src
ON (   target.RPNOAF = src.RPNOAF 
    AND target.EIAC = src.EIAC 
    AND target.EI_LCN = src.EI_LCN
    AND target.EI_ALC = src.EI_ALC

    AND target.NHA_LCN = src.NHA_LCN
    AND target.NHA_ALC = src.NHA_ALC

    AND target.LCN = src.LCN
    AND target.ALC = src.ALC

    AND target.PN = src.PN
    )

WHEN MATCHED THEN
    UPDATE SET target.AMMNO = src.AMMNO,

               target.EFF = src.EFF,
               target.CAGE = src.CAGE

WHEN NOT MATCHED THEN
    INSERT (RPNOAF, EIAC, EI_LCN, EI_ALC, NHA_LCN, NHA_ALC, LCN, ALC, PN, AMMNO, EFF, CAGE)

    VALUES (src.RPNOAF, src.EIAC, src.EI_LCN, src.EI_ALC, src.NHA_LCN, src.NHA_ALC, src.LCN, src.ALC, src.PN, src.AMMNO, src.EFF, src.CAGE);


-->
MERGE INTO AMM_UOC B
USING (SELECT '768F0392571016' AS RPNOAF,
'IDF' AS EIAC,
'A' AS EI_LCN,
'00' AS EI_ALC,
'A010L030600901' AS NHA_LCN,
'00' AS NHA_ALC,
'A010L03060090105' AS LCN,
'00' AS ALC,
'2122540-5' AS PN,
'A201012300008' AS AMMNO,
'Y' AS EFF,
'A64547' AS CAGE
FROM dual) A
ON (        B.RPNOAF = A.RPNOAF
        AND B.EIAC = A.EIAC
        AND B.EI_LCN = A.EI_LCN
        AND B.EI_ALC = A.EI_ALC
        AND B.NHA_LCN = A.NHA_LCN
        AND B.NHA_ALC = A.NHA_ALC
        AND B.LCN = A.LCN
        AND B.ALC = A.ALC
        AND B.PN = A.PN
)
WHEN MATCHED THEN
              UPDATE SET B.AMMNO = A.AMMNO,
                                     B.EFF = A.EFF,
                                     B.CAGE = A.CAGE
WHEN NOT MATCHED THEN
          INSERT (RPNOAF, EIAC, EI_LCN, EI_ALC, NHA_LCN, NHA_ALC, LCN, ALC, PN, AMMNO, EFF, CAGE)
          VALUES 
(A.RPNOAF, A.EIAC, A.EI_LCN, A.EI_ALC, A.NHA_LCN, A.NHA_ALC, A.LCN, A.ALC, A.PN, A.AMMNO, A.EFF, A.CAGE);