2022年10月20日 星期四

V20107D - reader & Email OracleDataReader - try catch finally

 目的: 讀取 SQL 的欄位值 &  Email 處理

處理說明: 1>OracleDataReader   reader;
                       cmd.CommandText = Tmp_Sql;
                      reader = cmd.ExecuteReader();
                      if (reader.HasRows)
                     {
                          while (reader.Read())
                          {
                                ChkMail.To.Add(reader["NOTES_MAIL"].ToString());
                          }
                      };  

                 2>Email 處理
                     MailMessage ChkMail = new MailMessage();
                     string mail_from = "tlsapp@ms.aidc.com.tw";
                    ChkMail.From = new MailAddress(mail_from, "AMM系統", System.Text.Encoding.UTF8);//發送者 
                    string subject = "AMM V20107 工作步序資料維護 - 工時不完整(=0)";
                   string content = "附檔內的件號工作步序資料不完整<br>"
                                           + "請至 AMM V20107維護工作步序資料<br>";
                  sendMail(subject, content, ChkMail);
                  //ChkMail.Subject = subject;    //主題
                  //ChkMail.Body = content;       //內容  
                  //SmtpClient Smtp = new SmtpClient();   //建立SMTP連線  
                  //Smtp.Send(ChkMail);   //發送

     

1>*.js

//[MAIL通知]鈕
function MAILNotifyBtn_click() {    
    var np = {};
    np = {        
    };
    Ext.Ajax.request({
        url: '../../api/V20107DAPI/DoMAIL',
        method: 'POST',
        async: false,
        //standardSubmit: true, //若要傳送檔案至前端, standardSubmit必需設為 true  
        params: np,
        success: function (response, opts) {
            var Tmp_Obj = Ext.decode(response.responseText);
            if (Tmp_Obj["success"] == false) {
                var Tmp_Rtn_Msg = "EMAIL通知人員失敗!!<br>"
                    + "請檢核<br>"
                    + Tmp_Obj["Rtn_Msg"];
                mywarnalert(Tmp_Rtn_Msg);
                return;
            }
            else {
                var Tmp_Rtn_Msg = "EMAIL通知人員成功!!<br>";
                mysuccessalert(Tmp_Rtn_Msg);                
            }
        }

    });
}  // end of function MAILNotifyBtn_click() {


2>*.cs
// [MAIL通知] - DoMAIL
        [HttpPost]
        public HttpResponseMessage DoMAIL()
        {
            //取得參數值
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            
            string Tmp_USERID = LoginUserModel.LoginUserId;            
            string Tmp_RtnMsg = "";
            string To_Adr = "";

            string n = funId + "_DoMAIL";
            OracleConnection conn = new OracleConnection(DBService.ConnectionString(DBLINK));
            OracleCommand cmd = new OracleCommand();
            OracleDataReader reader;
            var response = Request.CreateResponse();
            MailMessage ChkMail = new MailMessage();
            try
            {
                conn.Open();
                conn.ClientInfo = User.Identity.Name;
                conn.ModuleName = BaseSYS + "_" + BaseMODID;
                conn.ActionName = ActionName;
                cmd.BindByName = true;
                cmd.Connection = conn;
                string Tmp_Sql;
                int Tmp_cnt=0;
                Tmp_Sql = "  SELECT COUNT(*)  "
                                +"   FROM   AMM_WKSTP A, AMM_WKSTPD B  "
                                +"   WHERE A.MITM = B.MITM  "
                                +"   AND      (B.WHR = '0' OR B.WHR IS NULL)  "
                                +"  AND        SUBSTR(DEPID,1,2) = ( SELECT SUBSTR(DEPID, 1, 2)  "
                                +                                                        "   FROM   HR_EMPLYM  "
                                +                                                        "  WHERE  EMPLYID = "+myfunc.AA(Tmp_USERID)+") ";
                Tmp_cnt = int.Parse(myfunc.SqlValue(Tmp_Sql));
                if (Tmp_cnt==0)
                {
                    Tmp_RtnMsg = "目前登入使用者(" + Tmp_USERID + ")的部門相關工作步序資料<br>"
                                             + "工時資料均完整 ( 工時>0 ) <br>"
                                             + "不需 MAIL 通知相關人員";                                             
                    response.Content = new StringContent("{'success': false,'Rtn_Msg':'" + Tmp_RtnMsg + "'}");    // 回應內容
                    return response;
                }
                //填寫 Email.From, To, subject, BODY
                Tmp_Sql= "  SELECT A.EMPLYID,B.NOTES_MAIL  "
                               +"   FROM AMM_MAILIST A, HR_EMPLYM B  "
                               +"   WHERE A.EMPLYID = B.EMPLYID  "
                               +"   AND A.DEPID = ( SELECT   SUBSTR(DEPID, 1, 2)  "
                               +                               "   FROM    HR_EMPLYM  "
                               +                               "   WHERE  EMPLYID ="+myfunc.AA(Tmp_USERID)+" ) ";
                cmd.CommandText = Tmp_Sql;
                reader = cmd.ExecuteReader();
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        ChkMail.To.Add(reader["NOTES_MAIL"].ToString());
                    }
                };                
                string mail_from = "tlsapp@ms.aidc.com.tw";
                ChkMail.From = new MailAddress(mail_from, "AMM系統", System.Text.Encoding.UTF8);//發送者 
                string subject = "AMM V20107 工作步序資料維護 - 工時不完整(=0)";
                string content = "附檔內的件號工作步序資料不完整<br>"
                                          + "請至 AMM V20107維護工作步序資料<br>";
                sendMail(subject, content, ChkMail);
                  //ChkMail.Subject = subject;    //主題
                  //ChkMail.Body = content;       //內容  
                  //SmtpClient Smtp = new SmtpClient();   //建立SMTP連線  
                  //Smtp.Send(ChkMail);   //發送

                response.StatusCode = HttpStatusCode.OK;
                Tmp_RtnMsg = "已 Email 通知相關人員 !!  <br>";
                response.Content = new StringContent("{'success': true,'Rtn_Msg':'" + Tmp_RtnMsg + "'}");    // 回應內容
                return response;
                //excuteSQLTran
            }  //try
            catch (Exception e)
            {
                string Tmp_msg;
                Tmp_msg = myfunc.Get1ORA(e.Message);
                Tmp_RtnMsg = "Email 通知失敗<br>"
                                         + Tmp_msg;
                response.Content = new StringContent("{'success': false,'Rtn_Msg':'" + Tmp_RtnMsg + "'}");    // 回應內容
                return response;
            }
            finally
            {
                conn.Close();
            }
        }  // end of DoMAIL


V120201 - Email 通知人員 - – [申請撤銷] –物料申請撤銷時, Email 通知撿料人員 - V30702E

 目的: V120201 - EMail 通知人員

處理說明:




1>V120201.js  - Email 通知

//按鈕 : [物料申請] [申請撤銷]
    var BtnAry = [
        {
            xtype: 'button', text: '物料申請', id: 'ApyBtn',
            listeners: {
                click: function () {
                    ApyBtn_click();
                }
            }
        },
        {
            xtype: 'button', text: '申請撤銷', id: 'CancelBtn',
            listeners: {
                click: function () {
                    console.log(" 1 inside 申請撤銷: " );
                    //若目前物料申請單號已有領料記錄,則不允許執行[申請撤銷]鈕
                    var cur_recs = Ext.getCmp('grid_Single').getSelectionModel().getSelection(); //grid select指向選擇的第一筆        
                    var cur_rec = cur_recs[0];
                    var Tmp_STAT = cur_rec['raw']['STAT'];                    
                    var Tmp_APNO = cur_rec['raw']['APNO'];
                    if (Tmp_STAT == 'Z') {                    
                        Tmp_Str = " 目前物料申請單( " + Tmp_APNO + ") 的單況為 Z: 撤銷 <br>"
                                        + " 無法再次撤銷 !! <br>"
                                        + " 請檢核 ";
                        mywarnalert(Tmp_Str);
                        return;
                    }
                    var Tmp_PN = cur_rec['raw']['PN'];
                    var Tmp_MPKUPP = cur_rec['raw']['MPKUPP'];
                    var Tmp_MPKUPP_ = cur_rec['raw']['MPKUPP_'];
                    var Tmp_Str = "";
                    var Tmp_Sql = " SELECT   nvl(SUM(QTY),0)  as  PQTY "
                        + "  FROM    AMM_COMPQTY "
                        + "   WHERE  EFF='Y'  "
                        + "   AND        APNO=" + AA(Tmp_APNO);
                    console.log("Tmp_Sql: ", Tmp_Sql);
                    var Tmp_PQTY_Str = SqlValue(Tmp_Sql);
                    console.log("0 Tmp_STAT=", Tmp_STAT);
                    console.log("1 Tmp_PQTY_Str=", Tmp_PQTY_Str);                    
                    var Tmp_PQTY = Number(Tmp_PQTY_Str);
                    console.log("2 Tmp_PQTY=", Tmp_PQTY.toString());
                    var Tmp_PQTY = Number(SqlValue(Tmp_Sql));                    
                    console.log("3 Tmp_PQTY= Number(SqlValue(Tmp_Sql))", Tmp_PQTY.toString());
                    if ((Tmp_STAT == 'D') && (Tmp_PQTY > 0)) {
                        Tmp_Str = " 目前物料申請單( " + AA(Tmp_APNO) + "<br>"
                            + " 已有領用記錄<br>"
                            + " 無法撤銷 !! <br>"
                            + " 請先將物料退回 BenchStock ";
                        mywarnalert(Tmp_Str);
                        return;
                    }
                    var win = getMyWindow("申請撤銷", mySub2, mySub2_Btns);
                    Ext.getCmp('sub_APNO').setValue(Tmp_APNO);
                    Ext.getCmp('sub_PN').setValue(Tmp_PN);
                    Ext.getCmp('sub_MPKUPP').setValue(Tmp_MPKUPP);
                    Ext.getCmp('sub_MPKUPP_').setValue(Tmp_MPKUPP_);
                    Ext.getCmp('sub_DELTP').setValue(loginInfo.id);
                    Tmp_Sql = " SELECT  EMPLYNM "
                        + "   FROM    HR_EMPLYM "
                        + " WHERE   EMPLYID=" + AA(loginInfo.id);
                    Tmp_Str = SqlValue(Tmp_Sql);
                    Ext.getCmp('sub_DELTP_').setValue(Tmp_Str);
                    console.log("2  win: ", win);
                    win.width = 600;
                    win.height = 400;
                    win.show();
                }
            }
        },        
        ];
    

//按鈕 : [物料申請] [申請撤銷]
var mySub2_Btns = [
{
xtype: 'button', text: '確定', id: 'OkBtn_mySub2',
listeners: {
click: function () {
//mysuccessalert("press ok");
mySub2_OkBtn_click();
}
}
},
{
xtype: 'button', text: '取消', id: 'CancelBtn_mySub2',
listeners: {
click: function () {
//mysuccessalert("press cancel");
var Tmp_win = this.up("window");
if (Tmp_win == undefined) {
Ext.Msg.alert("取消時未取到Window Object");
}
this.up("window").close();
this.up("window").destroy();
}
}
},
];

// [申請撤銷]鈕 - 子畫面欄位
var mySub2 = [
{
bodyStyle: "background-color:transparent;", border: false, layout: "vbox", padding: "5", items: [
{
xtype: "fieldcontainer", fieldLabel: "申請單號", labelWidth: 80, layout: "hbox", items: [
{ id: "sub_APNO", name: "sub_APNO", xtype: "textfield", width: 200, padding: "0 4 0 0", readOnly: true, fieldCls: "readonly", },
]
}, //end of 申請單號
{
xtype: "fieldcontainer", fieldLabel: "申請件號", labelWidth: 80, layout: "hbox", items: [
{ id: "sub_PN", name: "sub_PN", xtype: "textfield", width: 200, padding: "0 4 0 0", readOnly: true, fieldCls: "readonly", },
]
}, // end of 申請件號
{
xtype: "fieldcontainer", fieldLabel: "撿料人員", labelWidth: 80, layout: "hbox", items: [
{ id: "sub_MPKUPP", name: "sub_MPKUPP", xtype: "textfield", width: 100, padding: "0 4 0 0", readOnly: true, fieldCls: "readonly", },
{ id: "sub_MPKUPP_", name: "sub_MPKUPP_", xtype: "textfield", width: 100, padding: "0 4 0 0", readOnly: true, fieldCls: "readonly", },
]
}, // end of 申請件號
{
xtype: "fieldcontainer", fieldLabel: "撤銷人員", labelWidth: 80, layout: "hbox", items: [
{ id: "sub_DELTP", name: "sub_DELTP", xtype: "textfield", width: 100, padding: "0 4 0 0", fieldCls: "required", },
{ id: "sub_DELTP_", name: "sub_DELTP_", xtype: "textfield", width: 100, padding: "0 4 0 0", readOnly: true, fieldCls: "readonly", },
{
id: "btn_sub_DELTP", name: "btn_sub_DELTP", xtype: "button", text: "...",
//員工編號挑選 , TreeView 挑選
handler: function () {
console.log(" btn_sub_DELTP on click");
var treepanel = Ext.create('EmployeeTree', {
id: 'myEmployeeTree',
listeners: {
itemclick: function (view, record, item, index, e) {
if (record.raw.leaf) {
var info = record.raw.text;
var newStr = info.split(":");
Ext.getCmp('sub_DELTP').setValue(newStr[0]);
Ext.getCmp('sub_DELTP_').setValue(newStr[1]);
win_tree.close();
}
}
}
});
var win_tree = getWindow('撤銷人員挑選', treepanel);
win_tree.height = 400;
win_tree.show();
} // end of handler of btn_sub_APER
}, // end of btn_sub_APER
{
id: "btn_sub_DELTP1", name: "btn_sub_DELTP1", xtype: "button", text: "切換人員",
//切換人員 , 欄位清成空白
handler: function () {
Ext.getCmp('sub_DELTP').setValue("");
Ext.getCmp('sub_DELTP_').setValue("");
Ext.getCmp('sub_DELTNOTE').setValue("");
}
},
]
}, // end of 申請人
{
xtype: "fieldcontainer", fieldLabel: "撤銷原因", labelWidth: 80, layout: "hbox", items: [
{
id: "sub_DELTNOTE", name: "sub_DELTNOTE", xtype: "textarea", width: 200, padding: "0 4 0 0", fieldCls: "required",
}
] // end of 撤銷原因.items
}, // end of 撤銷原因
//{ // 多行 Sample
// xtype: 'textareafield',
// grow: true,
// name: 'message',
// fieldLabel: 'Message',
// anchor: '100%'
//},
] // end of layout: "vbox", padding: "5", items: [
} //end of J_formFields_Sub1 , items[{
] //end of J_formFields_Sub1 , items[


// [申請撤銷].[確認]鈕  - 處理
function mySub2_OkBtn_click() {
//判斷 AMM_COMQ.STAT='D'(已領料)        
console.log("  1 inside  mySub2_OkBtn_click ");
var Tmp_Str = "";
var Tmp_Sql = " ";
var cur_recs = Ext.getCmp('grid_Single').getSelectionModel().getSelection(); //grid select指向選擇的第一筆                
var cur_rec = cur_recs[0];
var Tmp_APNO = Ext.getCmp('sub_APNO').getValue();
var np = {};
np['sub_APNO'] = Ext.getCmp('sub_APNO').getValue();
np['sub_PN'] = Ext.getCmp('sub_PN').getValue();
np['sub_MPKUPP'] = Ext.getCmp('sub_MPKUPP').getValue();
np['sub_DELTP'] = Ext.getCmp('sub_DELTP').getValue();
np['sub_DELTNOTE'] = Ext.getCmp('sub_DELTNOTE').getValue();
np['sub_STAT'] = cur_rec['raw']['STAT'];

console.log(" 2 UPDATE  AMM_COMQ, AMM_COMPQTY ");
//1>更新 AMM_COMQ.STAT='Z' 及撤銷人員 & 撤銷原因
Tmp_Sql = "  UPDATE  AMM_COMQ  "
+ "   SET   STAT=" + AA('Z') + ","
+ "     DELTP=" + AA(np['sub_DELTP']) + ","
+ "  DELTNOTE=" + AA(np['sub_DELTNOTE'])
+ "    WHERE  APNO=" + AA(np['sub_APNO']);
SqlExec(Tmp_Sql);
//2>更新 AMM_COMPQTY.EFF='N' 及撤銷人員 & 撤銷原因
Tmp_Sql = "  UPDATE  AMM_COMPQTY  "
+ "   SET   EFF=" + AA('N')
+ "    WHERE  APNO=" + AA(np['sub_APNO']);
SqlExec(Tmp_Sql);
console.log(" 3 Email sendmail2 np['sub_MPKUPP']:", np['sub_MPKUPP']);

//3> Email 通知檢料人員 , 若撿料人員空白,則不 Email 
if (checkisnull(np['sub_MPKUPP'])) {
Tmp_Str = "申請單單號(" + Ext.getCmp('sub_APNO').getValue() +") 已撤銷成功 !! <br> "
          +"因本申請單的撿料人員空白, 無法Email 通知撿料人員!! <br>"
          + "請檢核 !!";
mywarnalert(Tmp_Str);
console.log("3.1 Ext.getCmp(btn_Show)= :", Ext.getCmp("btn_Show"));
Ext.getCmp("btn_Show").fireHandler();
console.log("3.2 after Ext.getCmp(btn_Show).fireHandler()", Ext.getCmp("btn_Show"));
Ext.getCmp("OkBtn_mySub2").up("window").close();
Ext.getCmp("OkBtn_mySub2").up("window").destroy();
return;
}

console.log(" 3.5   Ext.Ajax.request sendmail2 np ", np);
Ext.Ajax.request({
method: 'POST',
params: np,
async: false, //將非同步功能關閉
url: '../../api/V120201API/sendmail2',
success: function (response, opts) {
console.log("4 sendmail2 success!!");
var obj = Ext.decode(response.responseText);
console.log("obj:", obj);
if (obj["failure"]) {
console.log("obj.failure=true, obj[Rtn_Msg] : ", obj["Rtn_Msg"] );
var Tmp_Str = obj["Rtn_Msg"];
mywarnalert(Tmp_Str);
return;
};
console.log("5 show 撤銷成功訊息");
Tmp_Str = " 物料申請單(" + Tmp_APNO + ") 撤銷成功 !!<BR> "
+ "  並已Email 通知撿料人員 ";
mysuccessalert(Tmp_Str);
//重新顯示畫面
console.log("6 Ext.getCmp(btn_Show)= :", Ext.getCmp("btn_Show"));
Ext.getCmp("btn_Show").fireHandler();
console.log("7 after Ext.getCmp(btn_Show).fireHandler()", Ext.getCmp("btn_Show"));
Ext.getCmp("OkBtn_mySub2").up("window").close();
Ext.getCmp("OkBtn_mySub2").up("window").destroy();
},
failure: function (response, opts) {
console.log("6 failure !!");
Tmp_Str = " 物料申請單(" + Tmp_APNO + ") 撤銷失敗<BR> "
+ "  Email 失敗 ";
mywarnalert(Tmp_Str + response.status);
}
});  // end of  Ext.Ajax.Request  for Email

}


2>*.cs  - sendmail
//物料撤銷. Email 
        [HttpPost]
        public HttpResponseMessage sendmail2()
        {
            var c = System.Web.HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            MailMessage ChkMail = new MailMessage();
            TLSWS.TLSWebServiceSoapClient WS = new TLSWS.TLSWebServiceSoapClient();

            //正本收件人:  AMM_MALLIST  , TP='A'
            string Tmp_EmailStr="";
            string Tmp_RtnMsg = "";
            string Tmp_Sql = "  SELECT  A.MPKUPP,B.NOTES_MAIL  "
                                       + "  FROM    AMM_COMQ A,HR_EMPLYM B  "
                                       + "  WHERE  A.MPKUPP = B.EMPLYID  "                                       
                                       + "  AND       A.APNO="+myfunc.AA(nvc["sub_APNO"]);
            OracleCommand cmd = new OracleCommand();
            cmd.CommandText = Tmp_Sql;
            DataSet ds = getDataTable(cmd);
            for (int i = 0; i < ds.Tables["T1"].Rows.Count; i++)
            {
                ChkMail.To.Add(ds.Tables["T1"].Rows[i]["notes_mail"].ToString());
            };           

            string subject = "BenchStock 件號(" + nvc["sub_PN"] + ") 物料申請單撤銷通知";
            string content = "申請單號(" + nvc["sub_APNO"] + ") 申請件號(" + nvc["sub_PN"] + ")的物料申請單已撤銷<br>"
                                      + "若已完成撿料請將物料歸儲 !! <br> "
                                      +" 撤銷人員: " + nvc["sub_DELTP"]+"<br>"
                                      + " 撤銷日期: " + myfunc.cnow() + "<br>"
                                       + "通知原因: " + nvc["sub_DELTNOTE"];
            string mail_from = "tlsapp@ms.aidc.com.tw";

    ChkMail.From = new MailAddress(mail_from, "TLS", System.Text.Encoding.UTF8);//發送者 

            if (ChkMail.To.Count > 0)
            {
                sendMail(subject, content, ChkMail);
                Tmp_EmailStr = "Email 成功 !!  ";
                Tmp_RtnMsg = "{success: true, failure: false, Rtn_Msg: " + myfunc.AA(Tmp_EmailStr) + " }";
            }
            else
            {
                Tmp_EmailStr = "寄件人空白, 無法 Email.. ";
                Tmp_RtnMsg = "{success: false, failure: true, Rtn_Msg: " + myfunc.AA(Tmp_EmailStr) + " }";
            }
            var response = Request.CreateResponse(HttpStatusCode.OK, "success");
            response.StatusCode = HttpStatusCode.OK;            
            response.Content = new StringContent(Tmp_RtnMsg);    // 回應內容
            return response;
        }  // end of  sendmail2()

2022年10月19日 星期三

V20107 - 取得目前 grid 選擇的資料 - Tmp_grid_D.getSelectionModel().getSelection(); - 目前資料 - cur_rec.data["WITM"].toString()

 V20107 - 取得目前 grid 選擇的資料 

處理說明:  1> var d_cur_recs = Ext.getCmp('grid_D').getSelectionModel().getSelection();   
                         var d_cur_rec = d_cur_recs[0];




1>*.js
//Detail.Detail 存檔處理
    //存檔時,myform_D 自動設定欄位值 : PK,
    var D1_buttonModel = Ext.create('G_D_buttonModel');
    var Tmp_grid_D1 = Ext.getCmp('grid_D1');
    console.log(" Tmp_grid_D1: ", Tmp_grid_D1);
    if (!checkisnull(Tmp_grid_D1)) {
        console.log(" 2 Ext.getCmp(grid_D1).beforeShowForm ");
        Ext.getCmp('grid_D1').beforeShowForm = function () {
            //要判斷 buttonModel 的編輯模式時, 才即時去抓 modelType
            var D1_modelType = D1_buttonModel.getModelType();
            console.log("beforeShowForm D1_modelType=", D1_modelType);
            //若非[新增]模式,則不設定欄位值
            if (!(D1_modelType == 1))
                return true;
            //設定 Master.MITM & WITM 欄位值
            var Tmp_MITM = Ext.getCmp('MITM').getValue();
            Ext.getCmp('d1_MITM').setValue(Tmp_MITM);    
            var d_cur_recs = Ext.getCmp('grid_D').getSelectionModel().getSelection();
            if (d_cur_recs.length == 0) {
                mywarnalert("請先選擇要編輯的Detail資料");
                    return false;
            }
            else {
                var d_cur_rec = d_cur_recs[0];
                var Tmp_WITM = d_cur_rec.data['WITM'].toString();
                Ext.getCmp('d1_WITM').setValue(Tmp_WITM);                
                var Tmp_DDITM = get_NEXT_DDITM(Tmp_MITM, Tmp_WITM);
                Ext.getCmp('d1_DDITM').setValue(Tmp_DDITM);
                return true;
            }  // end of else{
        }         // end of     Ext.getCmp('grid_D1').beforeShowForm 
    }  // end of   if (!checkisnull(Tmp_grid_D1)) 

    //取得   DDITM 的下一編號 , 傳入 MITM,WITM
    // Master.[修改],  Detail 新增多筆時, 並未寫回資料庫 , 所以 MAX(WITM)不可取資料庫
    //直接由 前端取 MAX(WITM)
    function get_NEXT_DDITM(par_MITM,par_WITM) {
        var Tmp_MAX_DDITM = 0;
        var Tmp_NEXT_DDITM = 0;
        var Tmp_d1_store = Ext.getCmp("grid_D1").store;
        console.log("Tmp_d1_store:", Tmp_d1_store);
        console.log("Tmp_d1_store.getCount():", Tmp_d1_store.getCount());
        var Tmp_cur_DDITM = 0;
        for (let i = 0; i < Tmp_d1_store.getCount(); i++) {
            console.log("Tmp_d1_store.data.items[i].data[WITM]:", Tmp_d1_store.data.items[i].data["WITM"]);
            Tmp_cur_DDITM = Number(Tmp_d1_store.data.items[i].data["DDITM"]);
            console.log("Tmp_cur_DDITM:", Tmp_cur_DDITM);
            if (Tmp_cur_DDITM > Tmp_MAX_DDITM)
                Tmp_MAX_DDITM = Tmp_cur_DDITM;
            console.log("Tmp_MAX_DDITM:", Tmp_MAX_DDITM);
        }  // end of for 
        Tmp_NEXT_DDITM = Tmp_MAX_DDITM + 1;
        return Tmp_NEXT_DDITM;        
    }  // end of  function string  get_NEXT_WITM(Tmp_MITM)    


2022年10月17日 星期一

V20107 - MDD - 刪除主檔/明細檔/子明細檔處理

 目的: V20107 - Master-Detail-Detail(MDD) - 刪除主檔/明細檔/子明細檔處理

處理說明: 1> //主檔.[刪除]前,先判斷子Table 是否有資料,若有的顯示訊息,請先刪除子Table資枓
                       Ext.getCmp("btn_del").beforeDel = function () {
                             var Tmp_grid_D1 = Ext.getCmp("grid_D1");
                             var Tmp_grid_D = Ext.getCmp("grid_D");
                             var Tmp_Str = "";
                            if (!checkisnull(Tmp_grid_D1) && !checkisnull(Tmp_grid_D)) {
                                 if ((Tmp_grid_D1.store.getCount() > 0) || (Tmp_grid_D.store.getCount() > 0)) {
                            Tmp_Str = "主工作程序還有明細資料(子步序), 不可刪除主工作程序資料<br>"
                                           + "請先刪除主工作程序明細資料(步序說明/子步序說明)<br>"
                                           + "才可刪除主工作程序資料";
                                            mywarnalert(Tmp_Str);
                                     return false;
                         }}}

                    2>明細檔.[刪除]前,先判斷子 Table 是否有資料
                         Ext.getCmp("grid_D").beforeDel = function () {
                         var Tmp_grid_D1 = Ext.getCmp("grid_D1");        
                         var Tmp_Str = "";
                         if (!checkisnull(Tmp_grid_D1) ) {
                         if (Tmp_grid_D1.store.getCount() > 0) {
                          Tmp_Str = "工作步序說明還有明細資料(子步序), 不可刪除步序說明資料<br>"
                                         + "請先刪除工作步序明細資料(子步序說明)<br>"
                                         + "才可刪除工作步序明細資料";
                           mywarnalert(Tmp_Str);
                           return false;
            }        }    }


1>*.js  主檔.[刪除]

                      //主檔.[刪除]前,先判斷子Table 是否有資料,若有的顯示訊息,請先刪除子Table資枓
                       Ext.getCmp("btn_del").beforeDel = function () {
                             var Tmp_grid_D1 = Ext.getCmp("grid_D1");
                             var Tmp_grid_D = Ext.getCmp("grid_D");
                             var Tmp_Str = "";
                            if (!checkisnull(Tmp_grid_D1) && !checkisnull(Tmp_grid_D)) {
                                 if ((Tmp_grid_D1.store.getCount() > 0) || (Tmp_grid_D.store.getCount() > 0)) {
                            Tmp_Str = "主工作程序還有明細資料(子步序), 不可刪除主工作程序資料<br>"
                                           + "請先刪除主工作程序明細資料(步序說明/子步序說明)<br>"
                                           + "才可刪除主工作程序資料";
                                            mywarnalert(Tmp_Str);
                                     return false;
                         }}}

2>Detail檔.[刪除]


    //主檔.[刪除]前,先判斷子Table 是否有資料,
    //若有的顯示訊息,請先刪除子Table資枓
    Ext.getCmp("grid_D").beforeDel = function () {
        var Tmp_grid_D1 = Ext.getCmp("grid_D1");        
        var Tmp_Str = "";
        if (!checkisnull(Tmp_grid_D1) ) {
            if (Tmp_grid_D1.store.getCount() > 0) {
                Tmp_Str = "工作步序說明還有明細資料(子步序), 不可刪除步序說明資料<br>"
                    + "請先刪除工作步序明細資料(子步序說明)<br>"
                    + "才可刪除工作步序明細資料";
                mywarnalert(Tmp_Str);
                return false;
            }
        }
    }

2022年10月13日 星期四

Novell密碼修改後, GitLab認證密碼修改說明 - 上線

 目的:  Novell密碼修改後, GitLab認證密碼修改說明 - 正式區上線

處理說明: 1> 點[控制台] --> 搜尋 --> 認證  --> 選[認證管理員]

                  2>選 [Windows認證]  --> 選[一般認證]  -->  Gitlab  --> 修改密碼

                  3>由GitLab 取得  master Source  - 在 Visual Studio 的 提取

                     master --> Home --> 提取  --> 由 Gitlab 取得最新的  master Source

                    (需登入遠端主機,所以 password 也需跟著改)














3>Visual Studio 2019 操作畫面 - 全部認可 & 推送














2022年10月12日 星期三

V20107 - Master-Detail-Detail - MDD編輯 - 取得store 欄位值 - 取得 MAX+1

 目的: V20107 - Master-Detail-Detail(MDD)  - Detail欄位新增

處理說明: 0>Master & Detail  Table設定
                       var MD_DB = Ext.create('MD_DB', {
                                                                   apiName: 'V20107',
                                                                   table_M: 'AMM_WKSTP',
                                                                   aKey_M: ['MITM'],
                                                                   table_D: ['AMM_WKSTPD', 'AMM_WKSTPDD'],  
                                                                    });
                 --> table_D 的順序需和 tab_D的資料順序相配合
                 1>開啟 Detail &  Detail-Detail
     //開啟 Detail
           Ext.getCmp('grid_M').on("selectionchange", function (view, selections, options) {
                      MD_DB.reloadDetailStore(selections[0]);        
           }    
      //開啟 Detail-Detail
          Ext.getCmp('grid_D').on("selectionchange", function (view, selections, options) {
              MD_DB.reloadDetailStorebyId_P("grid_D1", selections[0], MD_DB.apiName, ['MITM', 'WITM', 'DDITM']); 
          }
 
                  2> Detail 編輯 - Ext.getCmp('grid_D').beforeShowForm() 設定 PK 欄位值 
                       取得 Master.PK  &  Detail 新增 - 最大值+1  
                  3> Detail 設定 PK
                           Ext.getCmp('grid_D').beforeShowForm = function () {
                                     設定 Detail.MAX(WITM)+1
                           }
                      取得 store 欄位值 :  Tmp_WITM=Tmp_d_store.data.items[i].data["WITM"] ; 

                4>Detail-Detail 編輯 - Ext.getCmp('grid_D1').beforeShowForm() 設定 PK 欄位值 
                       取得 Master.PK  &  Detail.PK & Detail.Detail 新增 - 最大值+1  

                5>設定Detail-Detail編輯欄位 ReadOnly
    Ext.getCmp('grid_D').setFieldsCls = function () {
        setFieldsCls('myform_D', ['d_MITM', 'd_WITM',], ['d_MITM',],['d_MITM','d_WITM','d_STP','d_DWC','d_AQTY','d_PQTY','d_WHR','d_WDT','d_ENER','d_ENDT']);
    };

Ext.getCmp('grid_D1').setFieldsCls = function() {
        setFieldsCls('myform_D1', ['d1_MITM', 'd1_WITM', 'd1_DDITM',], ['d1_MITM', 'd1_WITM', 'd1_DDITM',],['d1_MITM','d1_WITM','d1_DDITM','d1_STP','d1_WC','d1_NOTE','d1_CLASS','d1_WHR']);
};


 


0> *.js  Master-Detail-Detail 的 Table 設定
 var MD_DB = Ext.create('MD_DB', {
        apiName: 'V20107',
        table_M: 'AMM_WKSTP',
        aKey_M: ['MITM'],
        table_D: ['AMM_WKSTPD', 'AMM_WKSTPDD'],                
      });

1> *.js  Detail  &  Detail-Detail 的資料顯示
      grid_D = Ext.getCmp('grid_D');
      grid_D.setTitle("工作步序說明");

      var grid_D1 = Ext.create('grid_D', {
grid_id: 'grid_D1',
insert_btn_id: 'btn_add_D1',
columns: J_columns_D1,
title: '子步序說明',
store: Ext.create('gridstore_D', { model: J_gridmodel_D1 }),
form_items: J_formFields_D1,
form_id: 'myform_D1'
});

Ext.getCmp('tab_D').add(grid_D1); 
        //開啟 Detail 
        Ext.getCmp('grid_M').on("selectionchange", function (view, selections, options) {
           MD_DB.reloadDetailStore(selections[0]);        
        });

       //開啟 Detail-Detail  
      Ext.getCmp('grid_D').on("selectionchange", function (view, selections, options) {
  MD_DB.reloadDetailStorebyId_P("grid_D1", selections[0], MD_DB.apiName, ['MITM', 'WITM', 'DDITM']);
    });




1>*.js - Detail 新增 - 畫面 PK 處理
 //Detail 存檔處理
    //存檔時,myform_D 自動設定欄位值 : PK,
    var D_buttonModel = Ext.create('G_D_buttonModel'); 

    var Tmp_grid_D = Ext.getCmp('grid_D');
    console.log(" Tmp_grid_D: ", Tmp_grid_D);
    if (!checkisnull(Tmp_grid_D)) {    
        console.log(" 2 Ext.getCmp(grid_D).beforeShowForm ");
        Ext.getCmp('grid_D').beforeShowForm = function () {
            //要判斷 buttonModel 的編輯模式時, 才即時去抓 modelType
            var D_modelType = D_buttonModel.getModelType();
            console.log("beforeShowForm D_modelType=", D_modelType);
            //若非[新增]模式,則不設定欄位值
            if (!(D_modelType == 1))
                return true;

            //設定 Master.MITM欄位值
            var Tmp_MITM = Ext.getCmp('MITM').getValue();
            Ext.getCmp('d_MITM').setValue(Tmp_MITM);

            console.log("1 MITM:", Tmp_MITM);
            var Tmp_WITM = get_NEXT_WITM(Tmp_MITM);
            Ext.getCmp('d_WITM').setValue(Tmp_WITM);

            return true;
        }
    }
    //取得   WITM 的下一編號 , 傳入 WITM
    // Master.[修改],  Detail 新增多筆時, 並未寫回資料庫 , 所以 MAX(WITM)不可取資料庫
    //直接由 前端取 MAX(WITM)

    function get_NEXT_WITM(par_MITM) {        
        var Tmp_MAX_WITM = 0;
        var Tmp_NEXT_WITM = 0;
        var Tmp_d_store = Ext.getCmp("grid_D").store;
        console.log("Tmp_d_store:", Tmp_d_store);
        console.log("Tmp_d_store.getCount():", Tmp_d_store.getCount());
        var Tmp_cur_WITM=0;
        for (let i = 0; i < Tmp_d_store.getCount(); i++) {
            console.log("Tmp_d_store.data.items[i].data[WITM]:", Tmp_d_store.data.items[i].data["WITM"]);
            Tmp_cur_WITM = Number(Tmp_d_store.data.items[i].data["WITM"]);
            console.log("Tmp_cur_WITM:", Tmp_cur_WITM);
            if (Tmp_cur_WITM > Tmp_MAX_WITM)
                Tmp_MAX_WITM = Tmp_cur_WITM;

            console.log("Tmp_MAX_WITM:", Tmp_MAX_WITM);
        }  // end of for 
        Tmp_NEXT_WITM = Tmp_MAX_WITM + 1;        
        return Tmp_NEXT_WITM;      

    }  // end of  function string  get_NEXT_WITM(Tmp_MITM)    


2>*.cs , Detail 寫入資料庫
[HttpPost]
        public void Insert_D()
        {
            var c = System.Web.HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            //excuteInsert(nvc, "AMM_WKSTPD");
            NameValueCollection nvc1 = new NameValueCollection();
            foreach (string k in nvc.Keys)
            {
                nvc1[k] = nvc[k];
            }            
            nvc1["ENER"] = LoginUserModel.LoginUserId;
            nvc1["ENDT"] = DateTime.Now.ToString("yyyy/MM/dd"); 
            excuteInsert(nvc1, "AMM_WKSTPD");
        }


3>*.js  編輯畫面, 日期欄位值 - 不含時間


2022年10月11日 星期二

V20301 - 複製 - checkboxmodel - 多選複製後, Locate 至複製後的資料

 目的: 複製 - checkboxmodel - 多選複製後, Locate 至複製後的資料

處理說明: 1>複製資料後,重新顯示
                    //複製資料     
                    for (let i = 0; i <= cur_recs.length - 1; i++) {
                        console.log("i:", i);                        
                        cur_rec = cur_recs[i];    
                        //object 不可直接 assign ,指到原本cur_rec會改到原本的 cur_rec                    
                        //copy_rec = cur_rec;   
                        copy_rec = cur_rec.copy();
                        Tmp_NEXT_FMNO = get_NEXT_FMNO();
                        var Tmp_cur_DT = DatetoStr(now, "Y/m/d");
                        var Tmp_MDDT = DatetoStr(copy_rec.data["MDDT"], "Y/m/d");
                        copy_rec.data["FMNO"]=Tmp_NEXT_FMNO;                        
                        copy_rec.data["BTDT"] = Tmp_cur_DT;        
                        copy_rec.data["MDDT"] = Tmp_cur_DT;        
                        copy_rec.data["STATFM"] = "A";        
                        copy_rec.data["DTSOR"] = "A";        
                        copy_rec.data["OSM"] = "";                    
                        //新增資料庫資料
                        Copy_FMNO(copy_rec);
                    } //  end of for (let i=0,)                   
                       //重新顯示資料  
                       Ext.getCmp('btn_Show').fireHandler();
                       Ext.getCmp('grid_Single').getView().refresh();

                  2> 跳至最後一頁
                        var Tmp_ptb = Ext.getCmp('grid_ptb');
                        Tmp_ptb.moveLast();
  


1>*.js  store load完成後 , locate 至最新的資料
     gridstore.on('load', function (me, records, successful, eOpts) {
          var Tmp_index = gridstore.find("FMNO", Tmp_NEXT_FMNO);
          var sel_rec = gridstore.getAt(Tmp_index);
          Ext.getCmp('grid_Single').getView().getSelectionModel().select(sel_rec);
         gridstore.un("load", gridstore.events.load.listeners[gridstore.events.load.listeners.length-1].fn);
       }) // end of Ext.getCmp('grid_Single')..on("load")

2>*.js  複製後, 重新顯示 store
Ext.getCmp("btn_copy").on('click', function (me, e, eOpts) {        
        var cur_recs = Ext.getCmp('grid_Single').getSelectionModel().getSelection();
        var cur_rec;
        console.log("before copy_rec");
        //var copy_rec = Ext.create('Ext.data.Model', {});            
        var copy_rec;  //?? 如何產生另一 copy_rec 不和 cur_rec 相同
        var np = {};
        console.log("after copy_rec");
        if (cur_recs.length == 0) {
            buttonModel.modelType = 0;
            mywarnalert('請先勾選要複製的資料!!');
        }
        else {
            //var gridstore = Ext.getCmp('grid_Single').store;
            me.delMessage = "確定複製勾選的資料嗎?";
            Ext.Msg.confirm('提醒', me.delMessage, callBackFunc);
            function callBackFunc(id) {
                if (id == 'yes') {
                    gridstore.on('load', function (me, records, successful, eOpts) {
                        console.log("grid_Single on load !!")
                        console.log("Tmp_NEXT_FMNO:", Tmp_NEXT_FMNO);
                        var Tmp_index = gridstore.find("FMNO", Tmp_NEXT_FMNO);
                        console.log("Tmp_index:", Tmp_index);
                        var sel_rec = gridstore.getAt(Tmp_index);
                        console.log("sel_rec:", sel_rec);
                        Ext.getCmp('grid_Single').getView().getSelectionModel().select(sel_rec);
                        console.log("gridstore.events:", gridstore.events);
                        gridstore.un("load", gridstore.events.load.listeners[gridstore.events.load.listeners.length-1].fn);
                    })  // end of Ext.getCmp('grid_Single')..on("load")
                    console.log("cur_recs.length:", cur_recs.length);                    
                    for (let i = 0; i <= cur_recs.length - 1; i++) {
                        console.log("i:", i);                        
                        cur_rec = cur_recs[i];                        
                        copy_rec = cur_rec;
                        console.log("0 cur_rec: ", cur_rec);
                        Tmp_NEXT_FMNO = get_NEXT_FMNO();
                        var Tmp_cur_DT = DatetoStr(now, "Y/m/d");
                        var Tmp_MDDT = DatetoStr(copy_rec.data["MDDT"], "Y/m/d");
                        console.log("Tmp_NEXT_FMNO:", Tmp_NEXT_FMNO);
                        copy_rec.data["FMNO"]=Tmp_NEXT_FMNO;                        
                        copy_rec.data["BTDT"] = Tmp_cur_DT;        
                        copy_rec.data["MDDT"] = Tmp_cur_DT;        
                        copy_rec.data["STATFM"] = "A";        
                        copy_rec.data["DTSOR"] = "A";        
                        copy_rec.data["OSM"] = "";                    
                        console.log("1 cur_rec: ", cur_rec);
                        console.log("copy_rec: ", copy_rec);
                        //新增資料庫資料
                        Copy_FMNO(copy_rec);
                    } //  end of for (let i=0,)                    
                    //因為複製後, 按[顯示資料]鈕, 並不會顯示刪才新增的資料,& Local 新增的資料                                Ext.getCmp('btn_Show').fireHandler();
                    Ext.getCmp('grid_Single').getView().refresh();
                    //跳至最後一頁
                    var Tmp_ptb = Ext.getCmp('grid_ptb');
                    Tmp_ptb.moveLast();                    
                    buttonModel.modelType = 0;
                }  // end    if (id == 'yes')             
            }  // end of callbackfunc
        }  //end of else {}       
    }
    );