2024年6月25日 星期二

V80203 - win.query 用法 – Runtime 新增按鈕 – 多筆勾選 – 多選

 目的:V80203  - win.query 用法 – Runtime 新增按鈕 – 多筆勾選 – 多選

處理說明:1>win.query( xtype), class: "button","gridpanel" ,'button[text="關閉"]'
                     Ex:  var Tmp_gridid = win.query("gridpanel")[0].id;
                             var Tmp_button = win.query('button[text="關閉"]')[0]; 
                             var Tmp_toolbar = Tmp_button.up('toolbar');
                 2>取得多筆勾選欄位值
                       var Tmp_gridid = win.query("gridpanel")[0].id;
                       var Tmp_items = Ext.getCmp(Tmp_gridid).getView().selModel.selected.items;
                        for (i = 0; i < Tmp_items.length; i++) {
                                        //Tmp_Str = Tmp_Str+Tmp_items[i].data["LWA"] + ",";
                                        Tmp_Str = Tmp_Str + Tmp_items[i].data[par_r_fld] + ",";
                                    }

query 用法參考網址 : https://ithelp.ithome.com.tw/articles/10134838


1>*.js
var Tmp_btn=win.query(‘button[text=”關閉”]’)[0];
var Tmp_toolbar=Tmp_btn.up(“toolbar”);
Tmp_toolbar.insert(0,[
{xtype:”button”, text:”確定”, handler:function(){
      var Tmp_gridid = win.query("gridpanel")[0].id;
      var Tmp_items = Ext.getCmp(Tmp_gridid).getView().selModel.selected.items;
      for (i = 0; i < Tmp_items.length; i++) {
         Tmp_Str = Tmp_Str + Tmp_items[i].data[par_r_fld] + ",";
       }
if (Tmp_Str.length > 0) {
     Tmp_Str = Tmp_Str.substr(0, Tmp_Str.length - 1);
}
}},
{xtype:”button”, text:”取消”, handler:function(){
win.close();
}},
]);






2024年6月24日 星期一

V80203 – 多筆挑選 – 如何取得[V]勾選的多筆欄位值 - 多筆勾選 - 多選 - [V]精準

 目的: V80203 – 多筆挑選 如何取得[V]勾選的多筆欄位值

處理說明: 1>多筆挑選的設定: get_pick_btn1 --> EditPickx(  ,isUseCheckBox=true); 允許多筆勾選
                                                    get_pick_btn0 : 只可挑選一筆
                        var cmp_LWA = get_cmp_txt1('LWA', 's_LWA', 80, 130);
                        var cmp_pick_LWA = get_pick_btn1('挑選LWA', 's_btn_LWA',
                                                             '../api/V80203API/get_s_LWAPick?isComplete=0',
                                                          ['LWA'], ['s_LWA'], J_pickstore_s_LWA, J_pickcolumns_s_LWA);
                         var cmp_prc_LWA = get_cmp_chk1('精準', 's_prc_LWA', 50, '3');
                        cmp_LWA.items.push(cmp_pick_LWA, cmp_prc_LWA);

                  2>如何取得 多筆挑選的欄位值 
                     var id = win.query('gridpanel')[0].id;
                      var Tmp_items = Ext.getCmp(gridpanel_id).getView().selModel.selected.items;
                       for (i = 0; i < Tmp_items.length ; i++) {
                            Tmp_Str = Tmp_Str+Tmp_items[i].data["LWA"] + ",";
                        }

                        


1>*.js
 //LWA    
    var cmp_LWA = get_cmp_txt1('LWA', 's_LWA', 80, 130);
   //多筆勾選用 get_pick_btn1  ,  單筆選取  get_pick_btn0
    var cmp_pick_LWA = get_pick_btn1('挑選LWA', 's_btn_LWA',
        '../api/V80203API/get_s_LWAPick?isComplete=0',
        ['LWA'], ['s_LWA'], J_pickstore_s_LWA, J_pickcolumns_s_LWA);
    //var cmp_prc_LWA = get_cmp_chk1('精準', 's_prc_LWA', 50, '3');    
    //cmp_LWA.items.push(cmp_pick_LWA, cmp_prc_LWA);
    cmp_LWA.items.push(cmp_pick_LWA,);


myfunc.js
//get_pick_btn1(欄位名稱,欄位id , 呼叫url ,傳回欄位名稱s,傳回填入欄位s,   ) : 允許多筆挑選
function get_pick_btn1(par_title, par_id, par_url, par_r_fld, par_r_id, par_model, par_columns) {
    var rtn_cmp =
    {
        xtype: "button", id: par_id, name: par_id, text: "...",
        handler: function () {
            //var win = EditPickx('AMMNO', '../api/V40AAPI/get_s_AMMNOPick?isComplete=0', ['AMMNO'], ['s_AMMNO'], J_pickstore_s_AMMNO, J_pickcolumns_s_AMMNO);
                                            //                                                                                                                
//EditPickx(.. ,paging,suspendevent,stripsrows,ischeckbox)   - ischeckbox=true 多筆勾選
            var win = EditPickx(par_title, par_url, par_r_fld, par_r_id, par_model, par_columns, false, false, true, true);
            win.show();
            //win.beforeclose = beforeclose1;  //本行指令無法作用
            //win.on('close', beforeclose1);
            //function beforeclose1(par_me, par_eOpts) {
            //    mywarnalert("離開前 before close  event!!");
            //};
            //加入[確認][取消]鈕
            var pop_grid_id = win.query("gridpanel")[0].id;
            var bar = Ext.getCmp(pop_grid_id).down("toolbar");
            //var bar = Ext.getCmp(pop_grid_id).down("buttons");
            console.log("win: ", win);
            //var bar = win.query("buttons");
            //console.log("bar - win.buttons", bar);
            bar.insert(bar.items.length, [
                { xtype: "tbfill" },
                {
                    xtype: "button", text: "確認", handler: function () {
                        //console.log(emObj.emList); //取得勾選的紀錄
                        var id = win.query('gridpanel')[0].id;
                        var Tmp_items = Ext.getCmp(id).getView().selModel.selected.items;
                        console.log("Tmp_items:", Tmp_items); //取得勾選的紀錄
                        var Tmp_Str = "";
                        for (i = 0; i < Tmp_items.length ; i++) {
                            Tmp_Str = Tmp_Str+Tmp_items[i].data["LWA"] + ",";
                        }
                        if (Tmp_Str.length > 0) {
                            Tmp_Str = Tmp_Str.substr(0, Tmp_Str.length-1);
                        }
                        console.log("Tmp_Str=", Tmp_Str);                        
                        mywarnalert("按[確認]鈕 !! - Tmp_Str=" + Tmp_Str);
                        Ext.getCmp(par_r_id).setValue(Tmp_Str);
                        win.close();
                    }
                },
                {
                    xtype: "button", text: "取消", handler: function () {
                        win.close();
                    }
                }
            ]);           
            
        }
    };
    return rtn_cmp;
};
2>*.cs
if (!myfunc.checkisnull(Tmp_LWA))
            {
                if (Tmp_prc_LWA == "true")
                    Tmp_Sql = Tmp_Sql + " AND  LWA=" + myfunc.AA(Tmp_LWA);
                else  //將 0011,0012  -->  '0001','0012'
                    Tmp_Sql = Tmp_Sql + " AND  LWA  IN (" + myfunc.AddQuoteStr(Tmp_LWA)+")";
                //else
                //    Tmp_Sql = Tmp_Sql + " AND  LWA  LIKE  " + myfunc.AA("%" + Tmp_LWA + "%");
            };

2024年6月3日 星期一

V20304D– [確認轉TLS]鈕– 顯示執行訊息 & 下載檔案至前端- Cookie- 檢查2更新,多筆- 文字檔案(TXT)

 目的:V20304D – [確認轉TLS]鈕 – 顯示執行訊息 & 下載檔案至前端  - Cookie    - 文字檔案

處理說明:  1>將目前勾選的資料,存成  Tmp_DataAry  
                       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             
                  2>將 DataAry 轉成 JSON 語法, 傳至後端
                       var Tmp_DataString = JSON.stringify(Tmp_DataAry);
                       var np = {}; //TMFunction.js, 組合form上的查詢條件為json參數傳遞                                                    np["sub_DataString"] = Tmp_DataString;  //存入目前勾選的資料 
                 3>呼叫 form.submit  , 以便下載檔案至前端
                      Tmp_url = "../../api/V20304DAPI/Check2CSM_AR";
                       Ext.getCmp('s_form').submit({
                             method: "POST",
                             url: Tmp_url,
                            standardSubmit: true,
                             params: np,
                             async: false,
                       });
                  4>利用 Cookie ,顯示執行結果訊息(*.cs)
                        if (!is_Ok)
                       {
                             //訊息加入 Cookie
                            Tmp_Str = "[確認轉TLS]執行失敗!!<br>"
                                            +"請參閱附件檔("+ Tmp_out_FName+")";
                            MyCookie = new HttpCookie("V20304D", HttpUtility.UrlEncode(Tmp_Str));
                            HttpContext.Current.Response.Cookies.Add(MyCookie);
                            HttpContext.Current.ApplicationInstance.CompleteRequest();
                                :
                    }
 


1>*.js
[確認轉TLS]鈕:
  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             
            //for (var i = 0; i < CHK_PK_OBJ.ALL_LIST.length; i++) {
            var Tmp_DataString = JSON.stringify(Tmp_DataAry);
            var np = {}; //TMFunction.js, 組合form上的查詢條件為json參數傳遞                                                                   
            np["sub_DataString"] = Tmp_DataString;  //存入目前勾選的資料
            var Tmp_url = "";
            //STEP1> 檢核勾選資料, 是否正確 , 傳回 txt 檔案, 不可以用 getUrlStr 
            Tmp_url = "../../api/V20304DAPI/Check2CSM_AR";
            Ext.getCmp('s_form').submit({
                method: "POST",
                url: Tmp_url,
                standardSubmit: true,
                params: np,
                async: false,
            });

            var mask = new Ext.LoadMask(Ext.getBody(), {
                msg: '確認轉TLS中, 請稍待...'
            });
            mask.show();//使用 mask 需手動呼叫show() 方法下        
            var timer = setInterval(function () {
                //timer = null;     
                //若資料庫已更新完成, 則 Email 委約==6  &  Email 委約<>6
                var r = r_cookies('V20304D');
                console.log("cookies V20304D =", r);
                if (!checkisnull(r)) {
                    mask.hide();
                    mysuccessalert(r);
                    clearInterval(timer);  //不再重覆執行                     
                    if (r.indexOf("完成") > -1) {
                        // 不可return & 函式寫在下方, 
                        //因為 js 會直譯code,會一直往下執行 (不管是否成功)
                        UPDATE_CSM_AR();  
                    }

                    //me.up("window").close();
                    //me.up("window").destroy();
                }
            }, 1000)  // end of timer            


//更新資料庫 update_CSM_AR()
    function UPDATE_CSM_AR() {
        mysuccessalert("STEP2 :  檢核資料OK, 執行更新  CSM_AR 流程!!");
        //2.1>> 若 CSM_AR@TLS_245 已存在, 則先刪除再 iNSERT  , 以 AMM_TLSAR新增
        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             
        //for (var i = 0; i < CHK_PK_OBJ.ALL_LIST.length; i++) {
        var Tmp_DataString = JSON.stringify(Tmp_DataAry);
        var np = {}; //TMFunction.js, 組合form上的查詢條件為json參數傳遞                                                                   
        np["sub_DataString"] = Tmp_DataString;  //存入目前勾選的資料
        var Tmp_url = "";
        //STEP1> 檢核勾選資料, 是否正確 , 傳回 txt 檔案, 不可以用 getUrlStr 
        Tmp_url = "../../api/V20304DAPI/Update2CSM_AR_AMM_FM";
        Ext.getCmp('s_form').submit({
            method: "POST",
            url: Tmp_url,
            standardSubmit: true,
            params: np,
            async: false,
        });

        var mask = new Ext.LoadMask(Ext.getBody(), {
            msg: '[確認轉TLS].更新資料中, 請稍待...',
        });
        mask.show();//使用 mask 需手動呼叫show() 方法下        
        var timer = setInterval(function () {
            //timer = null;     
            //若資料庫已更新完成, 則 Email 委約==6  &  Email 委約<>6
            var r = r_cookies('V20304D1');
            console.log("cookies V20304D1 =", r);
            if (!checkisnull(r)) {
                mask.hide();
                //2025/01/03 microed  若成功,則重新顯示資料
                mysuccessalert(r, function () {
                    Ext.getCmp("btn_Show").fireHandler();
                })
                //mysuccessalert(r);
                ////2025/01/03 microed  若成功,則重新顯示資料
                //Ext.getCmp('btn_Show').fireHandler(); //重新顯示 Master資料
                clearInterval(timer);  //不再重覆執行                     
                //若執行資料庫更新的處理OK,則檢核是否通知品保維護品保工時 Email QC
                if (r.indexOf("完成") > -1) {
                    if (CHECK_ISEMAIL_QC() == 'Y')
                        ;
                }
                //me.up("window").close();
                //me.up("window").destroy();
            }
        }, 1000)  // end of timer                            
    }  // UPDATE_CSM_AR()       



2>*.cs
  [HttpPost]
        public void Check2CSM_AR()
        {
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            HttpCookie MyCookie;
            //var response = this.Request.CreateResponse();            
            string Tmp_DataString = nvc["sub_DataString"];    //Tmp_DataString:  取得目前勾選的資料. JSON字串                           

            
            DataTable dt1 = myfunc.JSON2dt(Tmp_DataString);  //目前子畫面所勾選的資料            
            string Tmp_FMNO="", Tmp_AMMNO, Tmp_RPNOAF;
            string Tmp_STATFM, Tmp_OPHR;
            string Tmp_Str = "";
            bool is_Ok = true;
            try
            {
                string Tmp_out_FName = "V20304B_確認轉TLS_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);
                }
                //using (StreamWriter sw = new StreamWriter(Tmp_out_pFName))   //小寫TXT     


                    //處理每筆工單 
                
                string Tmp_RowStr = "";
                string Tmp_RtnMsg = "";
                for (var i = 0; i < dt1.Rows.Count; i++)
                {
                    Tmp_RowStr = "";
                    Tmp_FMNO = dt1.Rows[i]["FMNO"].ToString();
                    Tmp_AMMNO = dt1.Rows[i]["AMMNO"].ToString();
                    Tmp_RPNOAF = dt1.Rows[i]["RPNOAF"].ToString();
                    //Check1 : 檢核 STATFM  in  ('C','E','F','J','L','G')  &&  OPHR='Y'
                    Tmp_STATFM = dt1.Rows[i]["STATFM"].ToString();
                    Tmp_OPHR = dt1.Rows[i]["OPHR"].ToString();
                    if  ("C,E,F,J,L,G".IndexOf(Tmp_STATFM)==-1)
                    {
                        Tmp_RowStr = Tmp_RowStr+ "[目前交修單況("+ Tmp_STATFM + ")]必需在 C,E,F,J,L,G;";
                    }
                    if (Tmp_OPHR != "Y")
                    {
                        Tmp_RowStr = Tmp_RowStr + "[目前開放工時("+ Tmp_OPHR + ")]必需為 Y;";
                    }
                if (Tmp_RowStr.Length > 0)
                   {
                       is_Ok = false;
                      Tmp_RowStr = "系統件單號(" + Tmp_FMNO + ")" + Tmp_RowStr+ "\r\n"; 
                      File.AppendAllText(Tmp_out_pFName, Tmp_RowStr);  //不用 sw , 改用 File.AppendAllText
                    }
                    //sw.WriteLine(Tmp_Str);
                };//  end of  for (var i = 0; i < dt1.Rows.Count; i++)                
             // sw.Close才會實際寫入檔案(Tmp_out_pFName)
            //sw.Close();            
                if (!is_Ok)
                {
                    //訊息加入 Cookie
                    Tmp_Str = "[確認轉TLS]執行失敗!!<br>"
                                    +"請參閱附件檔("+ Tmp_out_FName+")";
                    MyCookie = new HttpCookie("V20304D", HttpUtility.UrlEncode(Tmp_Str));
                    HttpContext.Current.Response.Cookies.Add(MyCookie);
                    HttpContext.Current.ApplicationInstance.CompleteRequest();
                    //若約別不符, 傳送 檔案至前端
                    HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + HttpUtility.UrlEncode((string)Tmp_out_pFName, 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();
                    return;
                }
                Tmp_Str = "勾選資料.[確認轉TLS]完成!!<br>";
                MyCookie = new HttpCookie("V20304D", HttpUtility.UrlEncode(Tmp_Str));
                HttpContext.Current.Response.Cookies.Add(MyCookie);
                HttpContext.Current.ApplicationInstance.CompleteRequest();
            }// end of try
            catch (Exception e)
            {
                Tmp_Str = e.Message;
                Tmp_Str = "[確認轉TLS]執行失敗!!<br>"
                                + Tmp_Str;
                MyCookie = new HttpCookie("V20304D", HttpUtility.UrlEncode(Tmp_Str));
                HttpContext.Current.Response.Cookies.Add(MyCookie);
                HttpContext.Current.ApplicationInstance.CompleteRequest();
                return;
                //throw e;
                //Tmp_Str = "{success: false ,  Rtn_Msg:" + "錯誤訊息如下:"+myfunc.AA(Tmp_ErrMsg) + "," + " }";
                //Tmp_Str = "{success: false ,  Rtn_Msg:" + myfunc.AA(Tmp_RtnMsg) + "}";
                //response.Content = new StringContent(Tmp_Str);    // 回應內容
                //return response;
            }
            finally
            {
                //conn.Close();
            }
        }  // end of UPDATE_SAPSTAT

2024年6月2日 星期日

V20304B – [單筆工時匯出]鈕 – getUrlStr - 檢核及更新資料分成 2 url 執行 & 匯出xls - .submit -CHECK2INS

 目的: V20304B – [單筆工時匯出] – getUrlStr - 錯誤訊息

處理說明: 1>設定 np={} - 傳入參數值
                  2>呼叫 getUrlStr( Tmp_url, np, )
                  3>url函式 : 傳回 Str -
                      [HttpPost]

                      public dynamic CHECK_AMM_PNTMSHT()



1>*.js
cur_recs = Tmp_Grid.getView().selModel.getSelection();
//console.log("cur_recs:", cur_recs);
if (cur_recs.length == 0) {
   mywarnalert("請先選擇要匯出的系統件單號");
   return;
}

//取得目前所勾選資料,再匯出
cur_rec = cur_recs[0];
var np = {};

np["FMNO"] = cur_rec.data["FMNO"];
np["PN"] = cur_rec.data["PN"];

//STEP1: 檢核 件號.標準工時檔(AMM_PNTMSHT)是否已存在 , 若不存在,則顯示訊息後, 離開
var Tmp_url = '../../api/V20304BAPI/CHECK_AMM_PNTMSHT';
var Tmp_RtnStr = getUrlStr(Tmp_url, np, "檢核 件號.標準工時檔(AMM_PNTMSHT)是否已存在");
if (!checkRtnOK(Tmp_RtnStr)) {
     mywarnalert(Tmp_RtnStr);
    return;
}

//STEP2: 若 AMM_TLSAR & AMM_AR of FMNO 不存在, 則新增該檔案資料(AMM_TLSAR, AMM_AR)
np["TYPEAF"] = cur_rec.data["TYPEAF"]; //約別
np["RPNOAF"] = cur_rec.data["RPNOAF"];
np["MRPNOAF"] = cur_rec.data["MRPNOAF"];
Tmp_url = '../../api/V20304BAPI/INSERT_AMM_TLSAR_AMM_AR';
Tmp_RtnStr = getUrlStr(Tmp_url, np, "檢核 AMM_TLSAR,AMM_AR 若不存在則新增");
if (!checkRtnOK(Tmp_RtnStr)) {

    mywarnalert(Tmp_RtnStr);
    return;
}

//STEP3: 匯出 Excel
Ext.getCmp('s_form').submit({
//Ext.Ajax.request({
url: '../../api/V20304BAPI/XlsOut',

method: 'POST',
async: false,
standardSubmit: true, //若要傳送檔案至前端, standardSubmit必需設為 true
params: np,
});
//顯示結果訊息..


2>*.cs

// CHECK_AMM_PNTMSHT() - 檢核目前 PN 是否存在[件號標準工時檔(AMM_PNTMSHT)]

//若存在,傳回 "件號(xxxx)存在[件號標準工時檔(AMM_PNTMSHT)]
//若不存在, 則傳回"錯誤: 件號(xxxx)不存在[件號標準工時檔(AMM_PNTMSHT)] , 敬請檢核 !1"
[HttpPost]
public dynamic CHECK_AMM_PNTMSHT()
{
//取得參數值
var c = HttpContext.Current;
NameValueCollection nvc = c.Request.Form;
string Tmp_PN = nvc["PN"];
int Tmp_cnt;
string Tmp_RtnMsg = "";
string Tmp_Sql = "";
string n = funId + "_CHECK_AMM_PNTMSHT";
HttpCookie MyCookie;
DataTable Tmp_dt1 = new DataTable();
try
{
Tmp_Sql = " SELECT * "
                 + " FROM AMM_PNTMSHT "
                 + " WHERE PN=" + myfunc.AA(Tmp_PN)
                 + " AND PNSHTSTS='B' ";
Tmp_dt1 = myfunc.SqlOpen(Tmp_dt1, Tmp_Sql);
Tmp_cnt = Tmp_dt1.Rows.Count;
if (Tmp_cnt > 0){
       Tmp_RtnMsg = "件號(" + Tmp_PN + ")<br>"
                               + "存在件號維修工時主檔(AMM_PNTMSHT)<br>";
}
else
{
Tmp_RtnMsg = "錯誤: 件號(" + Tmp_PN + ")<br>"
                        + "不存在[件號維修工時主檔(AMM_PNTMSHT)]<br>"
                         +"請先到[V4080201-件號專用表單維護]子功能維護<br>"
                         +"敬請檢核 !!<br>";

}
}
catch (Exception e)
{
Tmp_RtnMsg = myfunc.Get1ORA(e.Message);
Tmp_RtnMsg = "錯誤:判斷件號是否存在<br>"
                        +"件號維修工時主檔(AMM_PNTMSHT)<br>"
                        + "失敗!!"
                        + Tmp_RtnMsg;
}
return Tmp_RtnMsg;
}

2024年5月30日 星期四

V20301 –[確認轉發工]鈕 – 勾選資料處理 - JSON

 目的: V20301 –[確認轉發工] 勾選資料處理

處理說明:  1>判斷目前勾選的資料筆數 : 
                      CHK_PK_OBJ.PK_LIST.length
                  2>取得目前勾選資料
                     var Tmp_DataAry = [];
                     for (let i = 0; i <= CHK_PK_OBJ.PK_LIST.length - 1; i++) {
                          cur_rec = CHK_PK_OBJ.ALL_LIST[i];
                          Tmp_DataAry.push(cur_rec);
                      }
                  3>將勾選的資料轉成 JSON字串, 送至後端處理 , 
                     // 將目前子畫面的資料(Table)轉成 JSON字串
                     var Tmp_DataStr = JSON.stringify(Tmp_DataAry);
                     var np = {};
                     np = {
                         DataStr: Tmp_DataStr,
                         isRPNOAF2AMMNO: Tmp_isRPNOAF2AMMNO,
                     };
                     Ext.Ajax.request({
                        method: "POST",
                        url: '../../api/V20301API/FM2AMM',
                        params: np,
         
                  4>後端資料庫, 將 JSON 轉成 DataTable  以便處理 (*.cs)                       
                       string Tmp_DataStr = nvc["DataStr"];  
                       DataTable dt_np = myfunc.JSON2dt(Tmp_DataStr);
                       for (var i = 0; i < dt_np.Rows.Count; i++)
                      {
                         Tmp_AMMNO = get_NEXT_AMMNO1(Tmp_pre_AMMNO);
                         Tmp_PN = dt_np.Rows[i]["PN"].ToString();
  


1>*.js
function FM2AMM()
    {
       if (CHK_PK_OBJ.PK_LIST.length == 0) {
            mywarnalert("請先選擇要除帳的資料");
            return false;
        }


   var gridstore = Ext.getCmp('grid_Single').store;
            var Tmp_Msg = "確定將勾選的資料轉發工嗎?";
            Ext.Msg.confirm('確認', Tmp_Msg, callBackFunc);
        function callBackFunc(id) {
            console.log("1 callBackFunc : 確定將勾選的資料轉發工嗎?");
            if (id == 'yes') {
                console.log("CHK_PK_OBJ.PK_LIST.length:", CHK_PK_OBJ.PK_LIST.length);
                var Tmp_DataAry = [];
                var isOk = true;
                var np = {};
                var Tmp_Str = "";
                console.log("CHK_PK_OBJ.ALL_LIST:", CHK_PK_OBJ.ALL_LIST);
                for (let i = 0; i <= CHK_PK_OBJ.PK_LIST.length - 1; i++) {
                    cur_rec = CHK_PK_OBJ.ALL_LIST[i];
                    console.log("cur_rec:", cur_rec);
                    console.log("CHK_PK_OBJ.ALL_LIST[i]:", CHK_PK_OBJ.ALL_LIST[i]);
                    console.log("cur_rec.STATFM.toString():", cur_rec.STATFM.toString());
                    if (cur_rec.STATFM.toString() != "A") {
                        Tmp_Str = "交修件單號(" + cur_rec.FMNO.toString() + ")資料已轉待發工<br> "
                            + "請點選[複製]鈕, 建立資料<br>";
                        mywarnalert(Tmp_Str);
                        return;
                    }
                    Tmp_DataAry.push(cur_rec);
                } //  end of for (let i=0,)                
                // 將目前子畫面的資料(Table)轉成 JSON字串
                var Tmp_DataStr = JSON.stringify(Tmp_DataAry);
                console.log("Tmp_DataStr:", Tmp_DataStr);
           //詢問  "此筆資料來源為 AMM,請問是否將[拆檢交修單號(RPNOAF)]異動為 [AMM單號]?
                var Tmp_isRPNOAF2AMMNO = "false";
                var Tmp_Msg = "此筆資料來源為 AMM<br>"
                    + "請問是否將[拆檢交修單號(RPNOAF)]異動為 [AMM單號] ? <br>";
                Ext.Msg.confirm('詢問', Tmp_Msg, callBackFunc1);
                function callBackFunc1(id) {
                    console.log("2 callBackFunc1 : 此筆資料來源為 AMM, 請問是否將[拆檢交修單號(RPNOAF)]異動為 [AMM單號] ?");
                    if (id == 'yes') {
                        Tmp_isRPNOAF2AMMNO = "true";
                    }
                    var np = {};
                    np = {
                        DataStr: Tmp_DataStr,
                        isRPNOAF2AMMNO: Tmp_isRPNOAF2AMMNO,
                    };
                    Ext.Ajax.request({
                        method: "POST",
                        url: '../../api/V20301API/FM2AMM',
                        params: np,
                        //params: Ary_np,
                        async: false,
                        success: function (response, opts) {
                            console.log("0 response.responseText=", response.responseText);
                            var Tmp_Obj = Ext.decode(response.responseText);
                            console.log("1  Tmp_Obj=", Tmp_Obj);
                            if (Tmp_Obj["success"] == true) {
                                mysuccessalert("確認轉發工成功!!");
                                //資料更新完成, 重新顯示資料
                                Ext.getCmp("btn_Show").fireHandler();
                            }
                            else {
                                var Tmp_Rtn_Msg = "[轉發工]失敗!! <br>"
                                    + "請檢核<br> "
                                    + Tmp_Obj["Rtn_Msg"];
                                mywarnalert(Tmp_Rtn_Msg);
                                isOk = false;
                            }
                        },  //end of success                
                        failure: function (response, opts) {
                            var Tmp_Obj = Ext.decode(response.responseText);
                            var Tmp_Rtn_Msg = "[轉發工]失敗!! <br>"
                                + "請檢核<br>"
                                + Tmp_Obj["Rtn_Msg"];
                            mywarnalert(Tmp_Rtn_Msg);
                            isOk = false;
                        }
                    })  //end of Ext.Ajax.Request                            
                }  // end of callbackfunc1
            }  // end    if (id == 'yes')           // end of 確定轉發工      
        }// end of callBackFunc
    }  // end of  FM2AMM


2024年5月28日 星期二

V20304H – [維護附檔]鈕 – [新增附檔] [刪除附檔] [瀏覽附檔] - 資料庫檔案.[上傳][下載][刪除] - 下載檔案

 目的: V20304H – [新增附檔] [刪除附檔] [瀏覽附檔]  - 資料庫檔案.[上傳][下載][刪除]

處理說明:  1>  [新增附檔]鈕 - 選擇檔案後上傳
                          1>>*.js  
                                 SelectFile(Ok_process);   
                          2>>*.cs   - 將 檔案上傳至 Request.Files[0], 並將檔案內容存入 byte[]
                               Stream file_Strm = Request.Files[cur_FName].InputStream;
                                //byte[] fileRcrd = new byte[fileSize];
                               BinaryReader br = new BinaryReader(file_Strm);
                               byte[] fileBody = br.ReadBytes((Int32)file_Strm.Length);
                          3>將檔案寫入資料庫
                               Tmp_Sql = " INSERT  INTO  AMM_AKFL "
                                               + "  ( AMMNO,"
                                               + " ITM,FILENAME,FILESIZE,FILEDATE,FILEBODY )"
                                               + "  VALUES "
                                               + "(" + myfunc.AA(Tmp_AMMNO) + ","
                                                        + myfunc.AA(Tmp_NEXT_ITM) + "," 
                                                       + myfunc.AA(Tmp_FILENAME) + "," 
                                                       + myfunc.AA(Tmp_FILESIZE) + "," 
                                                       + myfunc.AA(Tmp_FILEDATE) 
                                                       + ", :FILEBODY "
                                              + ") ";
                              cmd.CommandText = Tmp_Sql;
                              cmd.Parameters.Add("FILEBODY", OracleDbType.Blob, fileBody.Length);
                              cmd.Parameters["FILEBODY"].Value = fileBody; 
                              cmd.ExecuteNonQuery();

                    2>[刪除附檔]鈕  - 一般的 Del SQL 即可
                           Tmp_Sql = "   DELETE  AMM_AKFL "
                                           + "  WHERE  AMMNO=" + myfunc.AA(Tmp_AMMNO)
                                           + "  AND      ITM=" + myfunc.AA(Tmp_ITM);
                          cmd.CommandText = Tmp_Sql;
                          cmd.ExecuteNonQuery();

3>[瀏覽檔案]鈕 : 利用VUTLAPI/dnloadFile_Cnd?
   var Tmp_Flds = "FILENAME,FILEBODY"
  var Tmp_Cnd = "  AND       AMMNO=" + AA(cur_rec.data["AMMNO"])
                        + "  AND       ITM=" + AA(cur_rec.data["ITM"]);
var Tmp_url = "../api/VUTLAPI/dnloadFile_Cnd?aTbl=AMM_AKFL&Flds=" + Tmp_Flds + "&aCnd=" + Tmp_Cnd;
document.location = Tmp_url;



1>*.js

var sub1_Btns = [
{
xtype: 'button', text: '新增附檔', id: 'sub1_AddBtn',
listeners: {
click: function () {
//mysuccessalert("新增附檔");
SelectFile(Ok_process);
}}},




2>*.cs
// sub1.[新增附檔] 鈕 , 新增一筆 AMM_AKFL資料 (上傳檔案)
[HttpPost]
public void uploadFile2AMM_AKFL()
{
HttpContext c = HttpContext.Current;
NameValueCollection nvc = c.Request.Form;
string FName = nvc["FName"];
string Tmp_AMMNO = nvc["AMMNO"];
HttpCookie MyCookie; //將訊息傳至前端
HttpRequest Request = HttpContext.Current.Request;
var response = this.Request.CreateResponse();
string file_Name = FName;
string FILEDT = DateTime.Now.ToString("yyyy/MM/dd");
string Tmp_RtnMsg = "";
string Tmp_Sql = "", Tmp_Str = "";

OracleConnection conn = new OracleConnection(DBService.ConnectionString(DBLINK));//
OracleCommand cmd = new OracleCommand();
OracleDataReader reader;
conn.Open();
cmd.Connection = conn;
foreach (string cur_FName in Request.Files)
{
string fileType = Request.Files[cur_FName].ContentType;
Stream file_Strm = Request.Files[cur_FName].InputStream;
file_Name = Path.GetFileName(Request.Files[cur_FName].FileName);
int fileSize = Request.Files[cur_FName].ContentLength;
//byte[] fileRcrd = new byte[fileSize];
BinaryReader br = new BinaryReader(file_Strm);
byte[] fileBody = br.ReadBytes((Int32)file_Strm.Length);

string Tmp_FILENAME = file_Name;
string Tmp_NEXT_ITM = get_NEXT_ITM(Tmp_AMMNO);
string Tmp_FILEDATE = FILEDT; // 當天
string Tmp_FILESIZE = fileSize.ToString();

//更新資料庫欄位值
try
{
Tmp_Sql = " INSERT INTO AMM_AKFL "
                + " ( AMMNO,"
                  + " ITM,FILENAME,FILESIZE,FILEDATE,FILEBODY )"
               + " VALUES "
              + "(" + myfunc.AA(Tmp_AMMNO) + ","
+ myfunc.AA(Tmp_NEXT_ITM) + "," + myfunc.AA(Tmp_FILENAME) + "," + myfunc.AA(Tmp_FILESIZE) + "," + myfunc.AA(Tmp_FILEDATE) + ", :FILEBODY "
+ ") ";

cmd.CommandText = Tmp_Sql;
cmd.Parameters.Add("FILEBODY", OracleDbType.Blob, fileBody.Length);
cmd.Parameters["FILEBODY"].Value = fileBody;
cmd.ExecuteNonQuery();

Tmp_RtnMsg = "[新增附檔]成功!!";
MyCookie = new HttpCookie("EX_DFile", HttpUtility.UrlEncode(Tmp_RtnMsg));
HttpContext.Current.Response.Cookies.Add(MyCookie);
HttpContext.Current.Response.End();
return;
}// try
catch (Exception e)
{ //失敗
Tmp_RtnMsg = "[新增附檔]失敗!!<br>"
                        + e.Message + "<br>";
MyCookie = new HttpCookie("EX_DFile", HttpUtility.UrlEncode(Tmp_RtnMsg));
HttpContext.Current.Response.Cookies.Add(MyCookie);
HttpContext.Current.Response.End();
return;
}
finally
{
conn.Close();
}
} //end of foreach (string cur_FName in Request.Files)
return;
} // end of uploadFile2AMM_FMF()


   cur_rec = cur_recs[0];
                        console.log("cur_rec:", cur_rec);
                        console.log("Tmp_sub1_Grid.store:", Tmp_sub1_Grid.store);
                        var Tmp_Flds = "FILENAME,FILEBODY"
                        var Tmp_Cnd = "  AND       AMMNO=" + AA(cur_rec.data["AMMNO"])
                                                 + "  AND       ITM=" + AA(cur_rec.data["ITM"]);
                        var Tmp_url = "../api/VUTLAPI/dnloadFile_Cnd?aTbl=AMM_AKFL&Flds=" + Tmp_Flds + "&aCnd=" + Tmp_Cnd;
                        //document.location = "../api/VUTLAPI/dnloadSS_File?FNAME=V20304H_匯入格式.xlsx  ";                             
                        document.location = Tmp_url;
                        mysuccessalert("瀏覽附檔((下載))成功!!");



目的:V20304F – [批次工時匯入]鈕 – Transaction

目的:V20304F – [批次工時匯入]鈕 – Transaction

處理說明: 1> SQLStringList_A.Add(Tmp_Sql);
                  2> excuteSQLTran(SQLStringList_A);
                       --> 執行 SQLStringList_A 內的 SQL
                             若不成功,則自動 Rollback
                  3>若呼叫executeSqlTran()API函式名稱太長,
                       則會出現錯誤訊息    


1>*.cs

// Transaction SQL List - 存放  Transaction 的 SQL 
   List<string> SQLStringList_A = new List<string>();           

  Tmp_Sql = " DELETE   AMM_AR  "
                  + "  WHERE  FMNO=" + myfunc.AA(Tmp_FMNO);
  SQLStringList_A.Add(Tmp_Sql);

Tmp_Sql = "  UPDATE   AMM_AR  "
                +"   SET   RQHR=" + myfunc.AA(Tmp_PR04AR) 
                + "  WHERE FMNO = " + myfunc.AA(Tmp_FMNO) 
                + "  AND    AMINO=" + myfunc.AA("0400");
SQLStringList_A.Add(Tmp_Sql);

excuteSQLTran(SQLStringList_A);




2>BaseAPIController.cs
public int excuteSQLTran(List<string> SQLStringList, bool sysException = true)
        {
            setActionName();
            int rows = 0;
            OracleConnection conn = new OracleConnection(DBService.ConnectionString(DBLINK));
            conn.Open();
            conn.ClientInfo = User.Identity.Name;
            conn.ModuleName = BaseSYS + "_" + BaseMODID;
            conn.ActionName = ActionName;  //ActionName=API函式名稱 ,不可太長,否則會Error
            OracleTransaction trn = conn.BeginTransaction();
            OracleCommand cmd = new OracleCommand();
            cmd.Connection = conn;
            cmd.Transaction = trn;
            try
            {
                excMsg = "";
                for (int n = 0; n < SQLStringList.Count; n++)
                {
                    string strsql = SQLStringList[n].ToString();
                    cmd.CommandText = strsql;                    
                    //rows += cmd.ExecuteNonQuery();
                    cmd.ExecuteNonQuery();
                    rows = 1;
                }
                trn.Commit();
            }
            catch (Exception ex)
            {
                trn.Rollback();
                rows = -1;
                //Console.WriteLine("error : " + ex.Message);
                excMsg = ex.Message;
                if (sysException)
                {
                    throw ex; //如果沒有另外寫例外訊息的話,以此為主
                }
            }
            finally
            {
                cmd.Cancel();
                conn.Close();
            }
            return rows;
        }

PS: API函式名稱不可太長,否則會出現錯誤訊息