2024年12月5日 星期四

V80403 – [匯出EXCEL]鈕,將各頁的資料匯出成Excel檔案 – 將 [HTTP] 函式轉成 static 函式

 目的: V80403 – [匯出EXCEL],將各頁的資料匯出成Excel檔案, [HTTP] 函式轉成 static 函式

處理說明:    1>[HTTP]函式,資料接收傳回前端
                     [HttpPost]
                     public dynamic get_sub_Data1()
           
                            2>static 函式, 供其他模組呼叫 , 不需有  instance      --> 改將 instance 當參數傳入
            public  static DataTable get_sub_Data11(string par_PN ,BaseAPIController me)




1>*. cs
[HttpPost]
        public dynamic get_sub_Data1()
        {
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            string Tmp_PN = nvc["PN"];
            OracleCommand cmd = new OracleCommand();
            var response = this.Request.CreateResponse();
            DataSet ds = null;
            try
            {
                string Tmp_Sql1 = "";  //for 日期起迄
                string Tmp_Sql = "  SELECT  RNK, PN, MITM,   "
                                                                           + "    WITM, EMPID, EMPNM, PV,   "
                                                                           + "    WEANO, QMSNO, DEV_PN, NM, DEVNO  "
                                             + "  FROM   ( SELECT  dense_rank()  over(order by  A.PN,A.MITM,B.WITM,C.WEANO) as RNK,"
                                                                           + "    A.PN, A.MITM,   "
                                                                           + "    B.WITM, B.EMPID, B.EMPNM, B.PV,   "
                                                                           + "    C.WEANO, C.QMSNO, C.PN as DEV_PN,  C.NM, C.DEVNO  "
                                                               + "  FROM   AMM_WKSTP A, AMM_EMPD B, AMM_DEVD C "
                                                               + " WHERE  A.MITM=B.MITM "
                                                               + " AND       A.MITM=C.MITM "
     + " AND       B.WITM= C.WITM "
                                                               + "AND       A.PN =" + myfunc.AA(Tmp_PN);
                Tmp_Sql = Tmp_Sql + ")";
            cmd.CommandText = Tmp_Sql;
            string countSql = " SELECT COUNT(*) as total FROM (" + Tmp_Sql + ")";
            //不分頁
            ds = getDataTable(cmd, countSql, false);
                int Tmp_Cnt = ds.Tables["T1"].Rows.Count;
                ds.Tables["T1"].Columns.Add(new DataColumn("PV_", typeof(string)));//熟練度說明            
                ds.Tables["T1"].Columns.Add(new DataColumn("C_NM_", typeof(string)));//中文名稱            
                ds.Tables["T1"].Columns.Add(new DataColumn("ES_NM_", typeof(string)));//英文簡稱            
                string Tmp_Str = "";
                string Tmp_PV, Tmp_PV_;
                string Tmp_C_NM_, Tmp_ES_NM_;
                for (int i = 0; i < Tmp_Cnt; i++)
                {
                    DataRow dr = ds.Tables["T1"].Rows[i];
                    //1>熟練度說明            
                    Tmp_PV = dr["PV"].ToString();
                    Tmp_PN = dr["PN"].ToString();
                    //熟練度說明
                    Tmp_Sql = "  SELECT    DESCPT "
                                    + "   FROM     KEYCODE "
                                    + "   WHERE   TBL_NAME=" + myfunc.AA("AMM_EMPD")
                                    +"     AND       KEY_NAME=" + myfunc.AA("PV")
                                    +"     AND       KEY_CODE=" + myfunc.AA(Tmp_PV);
                    Tmp_PV_ = myfunc.SqlValue(Tmp_Sql);
                    if (Tmp_PV_ == "Y")
                        Tmp_PV_ = "熟手";
                    else if (Tmp_PV_ == "N")
                        Tmp_PV_ = "生手";
                    dr["PV_"] = Tmp_PV_;
                    //中文名稱  C_NM_, //英文簡稱  ES_NM_
                    Tmp_Sql = "  SELECT    DISTINCT C_NM,ES_NM "
                                    + "   FROM     AMM_FM "
                                    + "   WHERE   PN=" + myfunc.AA(Tmp_PN)
                                    + "     AND       C_NM IS NOT NULL "
                                    + "     AND       ROWNUM=1 ";
                    Tmp_Str = myfunc.SqlValue(Tmp_Sql);
                    Tmp_C_NM_ = myfunc.StrExtract(Tmp_Str,1);
                    Tmp_ES_NM_ = myfunc.StrExtract(Tmp_Str, 2);
                    dr["C_NM_"] = Tmp_C_NM_;
                    dr["ES_NM_"] = Tmp_ES_NM_;
                }  // for (int i = 0; i < Tmp_Cnt; i++)
                return ds;
            } //try
            finally
            {
                cmd.Dispose();
            }                
        }// end of get_sub_Data1();

         //static 函式,供其他 函式呼叫
        public static DataTable get_sub_Data11(string par_PN ,BaseAPIController me)
        {
            //var c = HttpContext.Current;
            //NameValueCollection nvc = c.Request.Form;
            //string Tmp_PN = nvc["PN"];
            string Tmp_PN = par_PN;
            OracleCommand cmd = new OracleCommand();
            //var response = this.Request.CreateResponse();
            DataSet ds = null;
            try
            {
                string Tmp_Sql1 = "";  //for 日期起迄
                string Tmp_Sql = "  SELECT  RNK, PN, MITM,   "
                                                                           + "    WITM, EMPID, EMPNM, PV,   "
                                                                           + "    WEANO, QMSNO, DEV_PN, NM, DEVNO  "
                                             + "  FROM   ( SELECT  dense_rank()  over(order by  A.PN,A.MITM,B.WITM,C.WEANO) as RNK,"
                                                                           + "    A.PN, A.MITM,   "
                                                                           + "    B.WITM, B.EMPID, B.EMPNM, B.PV,   "
                                                                           + "    C.WEANO, C.QMSNO, C.PN as DEV_PN,  C.NM, C.DEVNO  "
                                                               + "  FROM   AMM_WKSTP A, AMM_EMPD B, AMM_DEVD C "
                                                               + " WHERE  A.MITM=B.MITM "
                                                               + " AND       A.MITM=C.MITM "
     + " AND       B.WITM= C.WITM "
                                                               + "AND       A.PN =" + myfunc.AA(Tmp_PN);
                Tmp_Sql = Tmp_Sql + ")";
                cmd.CommandText = Tmp_Sql;
                string countSql = " SELECT COUNT(*) as total FROM (" + Tmp_Sql + ")";
                //不分頁
                ds = me.getDataTable(cmd, countSql, false);
                int Tmp_Cnt = ds.Tables["T1"].Rows.Count;
                ds.Tables["T1"].Columns.Add(new DataColumn("PV_", typeof(string)));//熟練度說明            
                ds.Tables["T1"].Columns.Add(new DataColumn("C_NM_", typeof(string)));//中文名稱            
                ds.Tables["T1"].Columns.Add(new DataColumn("ES_NM_", typeof(string)));//英文簡稱            
                string Tmp_Str = "";
                string Tmp_PV, Tmp_PV_;
                string Tmp_C_NM_, Tmp_ES_NM_;
                for (int i = 0; i < Tmp_Cnt; i++)
                {
                    DataRow dr = ds.Tables["T1"].Rows[i];
                    //1>熟練度說明            
                    Tmp_PV = dr["PV"].ToString();
                    Tmp_PN = dr["PN"].ToString();
                    //熟練度說明
                    Tmp_Sql = "  SELECT    DESCPT "
                                    + "   FROM     KEYCODE "
                                    + "   WHERE   TBL_NAME=" + myfunc.AA("AMM_EMPD")
                                    + "     AND       KEY_NAME=" + myfunc.AA("PV")
                                    + "     AND       KEY_CODE=" + myfunc.AA(Tmp_PV);
                    Tmp_PV_ = myfunc.SqlValue(Tmp_Sql);
                    if (Tmp_PV_ == "Y")
                        Tmp_PV_ = "熟手";
                    else if (Tmp_PV_ == "N")
                        Tmp_PV_ = "生手";
                    dr["PV_"] = Tmp_PV_;
                    //中文名稱  C_NM_, //英文簡稱  ES_NM_
                    Tmp_Sql = "  SELECT    DISTINCT C_NM,ES_NM "
                                    + "   FROM     AMM_FM "
                                    + "   WHERE   PN=" + myfunc.AA(Tmp_PN)
                                    + "     AND       C_NM IS NOT NULL "
                                    + "     AND       ROWNUM=1 ";
                    Tmp_Str = myfunc.SqlValue(Tmp_Sql);
                    Tmp_C_NM_ = myfunc.StrExtract(Tmp_Str, 1);
                    Tmp_ES_NM_ = myfunc.StrExtract(Tmp_Str, 2);
                    dr["C_NM_"] = Tmp_C_NM_;
                    dr["ES_NM_"] = Tmp_ES_NM_;
                }  // for (int i = 0; i < Tmp_Cnt; i++)
                //return ds;
                DataTable Tmp_dt = ds.Tables["T1"];
                return Tmp_dt;
            } //try
            finally
            {
                cmd.Dispose();
            }
        }// end of get_sub_Data1();


2>*.cs

//查詢 - [匯出EXCEL]的資料匯出至 xls  - 套表  - 共5Sheet 套表
        [HttpPost]
        public void XlsOut()
        {
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;

                     //[Sheet5_機具人員]Sheet寫入欄位    - 呼叫 static 函式                                    
                    Tmp_dt = V80403TDAPIController.get_sub_Data11(Tmp_PN, this);
                    for (var j = 0; j < Tmp_dt.Rows.Count; j++)
                    {
                        Tmp_ws5_row = Tmp_ws5_row + 1;
                        ws5.Range[myfunc.GetExcelPos(0, Tmp_ws5_row)].Text = Tmp_PN;
                        ws5.Range[myfunc.GetExcelPos(1, Tmp_ws5_row)].Text = Tmp_C_NM;
                        ws5.Range[myfunc.GetExcelPos(2, Tmp_ws5_row)].Text = Tmp_ES_NM;
                        ws5.Range[myfunc.GetExcelPos(3, Tmp_ws5_row)].Text = Tmp_dt.Rows[j]["MITM"].ToString();
                        ws5.Range[myfunc.GetExcelPos(4, Tmp_ws5_row)].Text = Tmp_dt.Rows[j]["WITM"].ToString();
                        ws5.Range[myfunc.GetExcelPos(5, Tmp_ws5_row)].Text = Tmp_dt.Rows[j]["EMPID"].ToString();
                        ws5.Range[myfunc.GetExcelPos(6, Tmp_ws5_row)].Text = Tmp_dt.Rows[j]["EMPNM"].ToString();
                        ws5.Range[myfunc.GetExcelPos(7, Tmp_ws5_row)].Text = Tmp_dt.Rows[j]["PV_"].ToString();
                        ws5.Range[myfunc.GetExcelPos(8, Tmp_ws5_row)].Text = Tmp_dt.Rows[j]["WEANO"].ToString();
                        ws5.Range[myfunc.GetExcelPos(9, Tmp_ws5_row)].Text = Tmp_dt.Rows[j]["QMSNO"].ToString();
                        ws5.Range[myfunc.GetExcelPos(10, Tmp_ws5_row)].Text = Tmp_dt.Rows[j]["DEV_PN"].ToString();
                        ws5.Range[myfunc.GetExcelPos(11, Tmp_ws5_row)].Text = Tmp_dt.Rows[j]["NM"].ToString();
                    }  //for (var j=
}



3>V80403.js  -  跳頁時,呼叫    [HTTP] 函式
        //[機具人員]頁
        if (newCard.id == "tab_EMPD1") {
            //開啟 store;
            cur_recs = Ext.getCmp("grid_Single").selModel.getSelection();
            if (cur_recs.length == 0) {
                Tmp_Str = "請先選擇要查詢機具人員的資料<br>";
                mywarnalert(Tmp_Str);
                return;
            }
            var np = {};
            cur_rec = cur_recs[0];
            np["PN"] = cur_rec.data["PN"];            
            Ext.getCmp('sub_V80403TD_Grid').store.getProxy().url = '../../api/V80403TDAPI/get_sub_data1',
                Ext.getCmp('sub_V80403TD_Grid').store.getProxy().extraParams = np; //分頁OK,篩選條件OK
            Ext.getCmp('sub_V80403TD_Grid').store.load();
        }



2024年11月12日 星期二

V20304D – 傳送檔案至前端 - 下載 – 檔案名稱

 目的: V20304D – 傳送檔案至前端 -  下載 檔案名稱

處理說明:    
               1>    //傳送檔案至前端的檔案名稱(不含path)
                    HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + HttpUtility.UrlEncode((string)Tmp_out_FName, System.Text.Encoding.UTF8) + "\"");

             2>傳送實體檔案內容(含path)
                    HttpContext.Current.Response.WriteFile(Tmp_out_pFName);  //實體檔案內容(含path)


1>*.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();
                    //傳送檔案至前端的檔案名稱(不含path)
                    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);  //實體檔案內容(含path)
                    HttpContext.Current.Response.End();
                    return;
                }

2024年11月7日 星期四

V80403C1 – 顯示資料庫的照片- Ext.img – FILEBODY - JPG

 目的:V80403C1 – 顯示資料庫的照片- Ext.img – FILEBODY - JPG

處理說明: 
1>建立 Ext.img 元件
    var cur_Image = Ext.create('Ext.Img', {
        id: 'sub_V80403C1_img1',        
     });

var sub_V80403C1_Flds = [
        {
            type: 'panel', bodyStyle: "background-color:transparent;", border: 5, padding: "1",
            layout: 'border',
            items: [
                {
                    xtype: 'panel',
                    id: 'sub_V80403C1_panel1',
                    region: 'center',
                    layout: 'fit',
                    flex: 5,
                    border: 1,
                    items: [sub_V80403C1_Grid]
                },
                {
                    xtype: 'panel',
                    id: 'sub_V80403C1_panel2',
                    region: 'south',
                    height: 400,
                    layout: 'fit',
                    flex: 5,
                    border: 1,
                    items: [cur_Image]
                },
            ],
        },
    ]; // end of   layout: "vbox", padding: "5", items: [


1>  取得照片檔 (byte[]) - 並傳至 response
var Tmp_url = "../api/myAPI/downloadFile2?aTbl=" + Tmp_TblNM + "&Flds=" + Tmp_Flds + "&aCnd=" + Tmp_Cnd;
            Ext.getCmp('sub_V80403C1_img1').setSrc(Tmp_url);



1>*.js
var Tmp_url = "../api/myAPI/downloadFile2?aTbl=" + Tmp_TblNM + "&Flds=" + Tmp_Flds + "&aCnd=" + Tmp_Cnd;
 // 接收方式:
   //1>下載檔案  : document.location = Tmp_url;
   //2>顯示照片檔 : Ext.getCmp('sub_V80403C1_img1').setSrc(Tmp_url);

var cur_Image = Ext.create('Ext.Img', {

        id: 'sub_V80403C1_img1',        
    });

    var sub_V80403C1_Flds = [
        {
            type: 'panel', bodyStyle: "background-color:transparent;", border: 5, padding: "1",
            layout: 'border',
            items: [
                {
                    xtype: 'panel',
                    id: 'sub_V80403C1_panel1',
                    region: 'center',
                    layout: 'fit',
                    flex: 5,
                    border: 1,
                    items: [sub_V80403C1_Grid]
                },
                {
                    xtype: 'panel',
                    id: 'sub_V80403C1_panel2',
                    region: 'south',
                    height: 400,
                    layout: 'fit',
                    flex: 5,
                    border: 1,
                    items: [cur_Image]
                },
            ],
        },
    ]; // end of   layout: "vbox", padding: "5", items: [


Ext.getCmp("sub_V80403C1_Grid").on('selectionchange', function (me, eOpts) {
        V80403C1_OK1();  //顯示[不符照片]
    });

    // change the src of the image programmatically
    //[不符照片附檔瀏覽].[確認]鈕 
    function V80403C1_OK1() {
        var cur_recs = Ext.getCmp('sub_V80403C1_Grid').getSelectionModel().getSelection();
        if (cur_recs.length == 0) {
            //mywarnalert("請先選擇資料");
            return;
        }
        var cur_rec = cur_recs[0];
        var Tmp_FMNO = nulltoStr(cur_rec.data["FMNO"]).toString();
        var Tmp_ITMPH = nulltoStr(cur_rec.data["ITMPH"]).toString();
        var Tmp_FILENAME = nulltoStr(cur_rec.data["FILENAME"]).toString();
        var Tmp_TblNM;
        var Tmp_Flds;
        var Tmp_Cnd;
        //若 FILENO 無值,則瀏覽 AMM_OSMF
        Tmp_TblNM = "AMM_PH";
        Tmp_Flds = "FILENAME,FILEBODY";
        Tmp_Cnd = "  AND       FMNO=" + AA(cur_rec.data["FMNO"])
                          + "  AND       ITMPH=" + AA(cur_rec.data["ITMPH"]);
        try {
var Tmp_url = "../api/myAPI/downloadFile2?aTbl=" + Tmp_TblNM + "&Flds=" + Tmp_Flds + "&aCnd=" + Tmp_Cnd;
            Ext.getCmp('sub_V80403C1_img1').setSrc(Tmp_url);
        }
        catch (e) {
            var Tmp_Str = "不符照片處理失敗!!<br>"
                + "FM單號(" + cur_rec.data["FMNO"] + ")<br>"
                + "檔案名稱(" + cur_rec.data["Tmp_FILENAME"] + ")<br>"
                + "錯誤訊息:" + e.message;
            mywarnalert(Tmp_Str);
        }   //檔案無法讀取,仍會下載 byte=0
    };  //V80403C1_OK1() {



2>*.cs
        //myAPIController.cs 必需先設定  DBLINK 
        public myAPIController()
        {
            //DBTable = "";            
            DBLINK = "AMMEU";
        }

//取得  Table 的 FILEBODY 欄位值  - 不含 SQL
        [HttpGet]
        public void downloadFile2(string aTbl, string Flds, string aCnd)
        {
            string[] Ary = Flds.Split(',');
            string fnm = Ary[0];   //檔案名 稱
            string fbdy = Ary[1];  //檔案內容

            string cnd = Repltag_vch(aCnd);
            string Strsql = "select " + Flds + "  from " + aTbl + " where 1=1 " + cnd;
            string Tmp_CntSql = "select count(*)  from " + aTbl + " where 1=1 " + cnd;
            string Tmp_Str;
            int Tmp_cnt;
            HttpCookie MyCookie;
            try
            {
                Tmp_cnt = int.Parse(myfunc.SqlValue(Tmp_CntSql));
                if (Tmp_cnt>=0)
                {
                    //必需先加入 Cookie , 再 downloadFile 
                    //--> 因 downloadFile 會 HttpContext.Current.Response.End(); , 所以 要先加 Cookie , 再 downloadFile
                    Tmp_Str = "檔案下載完成!!<br>";
                    MyCookie = new HttpCookie("Rtn_Msg", HttpUtility.UrlEncode(Tmp_Str));
                    HttpContext.Current.Response.Cookies.Add(MyCookie);
                    HttpContext.Current.ApplicationInstance.CompleteRequest();
                    downloadFile(Strsql, fnm, fbdy);  //將 filebody 欄位以 byte[] 傳至 response
                }
                else
                {
                    Tmp_Str = "檔案不存在,請檢核!!<br>";
                    MyCookie = new HttpCookie("Rtn_Msg", HttpUtility.UrlEncode(Tmp_Str));
                    HttpContext.Current.Response.Cookies.Add(MyCookie);
                    HttpContext.Current.ApplicationInstance.CompleteRequest();
                } 
            }
            catch (Exception ex)
            {
                Tmp_Str = ex.Message;
                if (Tmp_Str.IndexOf("DBNull") > -1)
                    Tmp_Str = "檔案內容為空白,敬請檢核!!<br>";
                MyCookie = new HttpCookie("Rtn_Msg", HttpUtility.UrlEncode(Tmp_Str));
                HttpContext.Current.Response.Cookies.Add(MyCookie);
                HttpContext.Current.ApplicationInstance.CompleteRequest();
              //  throw ex; 
            }   //檔案無法讀取,仍會下載 byte=0
            finally
            { }
        }
    public byte[] downloadFile(string sql, string fileName, string fileBody,bool inline=false)
        {
            setActionName();
            OracleConnection conn = new OracleConnection(DBService.ConnectionString(DBLINK));
            conn.Open();
            conn.ClientInfo = User.Identity.Name;
            conn.ModuleName = BaseSYS + "_" + BaseMODID;
            conn.ActionName = ActionName;
            OracleCommand cmd = new OracleCommand(sql, conn);
            OracleDataReader reader = cmd.ExecuteReader();
            byte[] file = null;
            if (reader.Read())
            {
                try
                {
                    //clearing the content
                    HttpContext.Current.Response.ClearContent();

                    if (inline)
                    {
                        //直接在網頁上開啟PDF,需搭配前端用submit方式
                        HttpContext.Current.Response.AddHeader("Content-Disposition", "inline; filename=\"" + Uri.EscapeDataString((string)reader[fileName]) + "\"");
                        HttpContext.Current.Response.ContentType = "Application/PDF";                        
                    }
                    else
                    {
                        // adding the headers to file stream
                        HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + Uri.EscapeDataString((string)reader[fileName]) + "\""); //Uri.EscapeDataString才能處理空白字元
                        //HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + HttpUtility.UrlEncode((string)reader[fileName], System.Text.Encoding.UTF8) + "\"");
                    }
                    
                    //BinaryWriter bw = new BinaryWriter(HttpContext.Current.Response.OutputStream);
                    // converting data into bytes
                    file = (byte[])reader[fileBody];
                    //bw.Write(file);
                    //bw.Close();
                    HttpContext.Current.Response.BinaryWrite(file);  //將檔案內容傳回 response
                    HttpContext.Current.Response.End();
                }
                finally
                {
                    reader.Close();
                    conn.Close();
                }
            }
            return file;
        }




V80403C1 - 日期格式處理

 目的: V80403C1 - 日期格式處理

處理說明:  1>var sub_model = [{name: "FILEDATE",} ]
                      var sub_Columns = [
{ header: "附檔上載日期", dataIndex: "FILEDATE", width: 100, sortable: false, 
TMType: "date", renderer: Ext.util.Format.dateRenderer('Y/m/d') },
},

1>*.js
// [物料]頁 - Grid子畫面欄位
var sub_model = [
{ name: "FILENAME" },
{
name: "FILEDATE",
//convert: function (value, record) { return Ext.Date.format(value, 'Y/m/d'); }  //--> 不可加本行
},
{ name: "FILESIZE" },
];
var sub_Columns = [

//AMM_PH
{ header: "", xtype: "rownumberer", width: 40, align: "center", sortable: false },
{ header: "附檔名稱", dataIndex: "FILENAME", width: 200, sortable: false, TMType: "string" },
{ header: "附檔上載日期", dataIndex: "FILEDATE", width: 100, sortable: false, 
TMType: "date", renderer: Ext.util.Format.dateRenderer('Y/m/d') },
{ header: "附檔大小", dataIndex: "FILESIZE", width: 60, sortable: false, align: "right", TMType: "int" },
];






    

2024年11月6日 星期三

V80403C1 – Grid DoubleClick 產生子畫面

 目的: V80403C1 – Grid DoubleClick 產生子畫面

處理說明: 1> itemdblclick event
  Ext.getCmp('sub_V80403C_Grid').on("itemdblclick", function (me, record, item, index, e, eOpts) {

--> 如何偵測到那一Column 被 DoubleClick


1>*.js
//Grid DoubleClick event
//itemdblclick( this, record, item, index, e, eOpts )
Ext.getCmp('sub_V80403C_Grid').on("itemdblclick", function (me, record, item, index, e, eOpts) {
     myalert("Grid Column DoubleClick !! ");
     console.log("Grid Column DoubleClick !! ");
     var Tmp_FMNO = record.data["FMNO"];      
     CALL_V80403C1(Tmp_FMNO);
}



);

2024年11月4日 星期一

Local和測試區主機 - 執行結果不同 - 因電腦日期格式設定不同 - insert 資料庫日期欄位時,產生錯誤 - 非數值字元

 目的 - Local和測試區主機 - 執行結果不同,因為電腦日期格式設定不同

處理說明: 1>Tmp_RRNRAR='2008/10/10 上午 12:00:00'; //實際拆檢完成日期 
                       --> 由資料庫讀取的日期格式含 上午,
                       -->應將日期格式化成 ' 2008/10/10'
             --> Tmp_RRNRAR = myfunc.Date2Str(sheet1.Range[myfunc.GetExcelPos(8,i+1)].Value);  
                   Tmp_RRNRAR = myfunc.Date2Str(Tmp_dt.Rows[j]["RRNRAR"].ToString()) ;                   


1>*.cs

  for (int j = 0; j < Tmp_cnt; j++)
                    {
                        //+ "    B.IRESAK,B.NOTEAR,B.QDEP,B.PRNRAR,B.PMHRAR,B.RRNRAR  "                                  Tmp_PRNRAR = Tmp_dt.Rows[j]["PRNRAR"].ToString();
                        Tmp_PMHRAR = Tmp_dt.Rows[j]["PMHRAR"].ToString();
                        Tmp_RRNRAR = myfunc.Date2Str(Tmp_dt.Rows[j]["RRNRAR"].ToString()) ;


--> SQL : 
                INSERT INTO AMM_TLSAR
                (FMNO,RRNRAR,..)
                VALUES
                ('F202410050002,'2024/10/15 上午 10:15',)
                  



2024年10月31日 星期四

V20304A – 拆檢結果登錄 - 按鈕呼叫函式的方式 ,最後才宣告 / 必需先宣告 - function

 目的: V20304A – 拆檢結果登錄  - 按鈕呼叫函式的方式 ,最後才宣告 / 必需先宣告 - function

處理說明: 1>Ext.getCmp("sub_TALHR_CAL").handler = function () {
                           CALL_TALHR_CAL();
                      }
                       --> CALL_TALHR_CAL 函式可以在最後才宣告,

                  2>Ext.getCmp("sub_TALHR_CAL").handler = CALL_TALHR_CAL;
                 -->  CALL_TALHR_CAL 函式必需先宣告,   
                        否則    CALL_TALHR_CAL= undefined


1>*.js
Ext.getCmp("sub_TALHR_CAL").handler = function () {
        CALL_TALHR_CAL();
    }
    
    win1.show();
    win1.maximize();

var sub_V20304A_Btns = [
            //sub_V20304A_TALHR,
            cmp_sub_RPNOAF_TALHR, cmp_sub_MRPNOAF_TALHR, cmp_sub_TALHR_CAL_btn, '-', cmp_sub_TMP1, cmp_sub_TMP2,
            {
                xtype: 'button', text: '確認', id: 'sub_V20304A_OkBtn', flex: 5,
                listeners: {
                    click: function () {
                        //mysuccessalert("mysub2_確定 ");
                        //檢核 AMM項次的需求工時正確, 若有問題,則 Tmp_isOk=false, 若沒問題, Tmp_isOk=true, 才執行[確認]的處理
                        V20304A_OK();
                    }
                }
            },



//工時合計函式
    var CALL_TALHR_CAL = function () {
        var Tmp_isOk = true;
        //myalert(" click 工時合計");
        //1>判斷主步序(1.xx) 的工時>0 時, 不可以有明細步序(1.xx.xx)        
        var mysubstore = Ext.getCmp('sub_Grid').store;
        var Tmp_cnt = mysubstore.data.length;
        console.log("mysubstore.count : ", Tmp_cnt);
        console.log("mysubstore.data.items : ", mysubstore.data.items);
        var i;
        var Tmp_Str;
        var Tmp_AMINO, Tmp_ITMNO, Tmp_RQHR, Tmp_ITMNO_NEXT;
        var Tmp_ITMNO_dot_cnt, Tmp_ITMNO_NEXT_dot_cnt;
        var Tmp_rec, Tmp_rec_NEXT;
        for (i = 0; i < Tmp_cnt; i++) {
            if (i == Tmp_cnt - 1)  //若為最後一筆資料,則離開 , 不需再檢查
                break;
            Tmp_rec = mysubstore.getAt(i);
            Tmp_AMINO = nulltoStr(Tmp_rec.data["AMINO"]);
            Tmp_ITMNO = nulltoStr(Tmp_rec.data["ITMNO"]);
            //Tmp_ITMNO = nulltoStr(mysubstore.data.items[i].data["ITMNO"]);
            console.log("i: ", i);
            console.log("Tmp_ITMNO: ", Tmp_ITMNO);
            Tmp_ITMNO_dot_cnt = Tmp_ITMNO.split(".").length - 1;
            console.log("Tmp_ITMNO_dot_cnt: ", Tmp_ITMNO_dot_cnt);
            if (checkisnull(Tmp_rec.data["RQHR"])) {
                Tmp_Str = "AMM項次(" + Tmp_AMINO + ")的需求工時不可為空白<br>"
                    + "敬請檢核 !!";
                mywarnalert(Tmp_Str);
                Tmp_isOk = false;
                return Tmp_isOk;
            }
            //1>>若為主步序(1.xx)且需求工時>0  ,且有子步序,則顯示訊息, 主步序工時>0 , 不可有子步序           
            if (Tmp_ITMNO_dot_cnt == 1) {  //為主步序
                Tmp_RQHR = Number(nulltoStr(Tmp_rec.data["RQHR"]));
                //Tmp_RQHR = Number(nulltoStr(mysubstore.data.items[i].data["RQHR"]));
                console.log("Tmp_RQHR : ", Tmp_RQHR);
                if (Tmp_RQHR > 0) {   //為主步序,且[需求時數]>0, 判斷是否有明細步序
                    Tmp_rec_NEXT = mysubstore.getAt(i + 1);
                    Tmp_ITMNO_NEXT = nulltoStr(Tmp_rec_NEXT.data["ITMNO"]);
                    //Tmp_ITMNO_NEXT = nulltoStr(mysubstore.data.items[i + 1].data["ITMNO"]);
                    console.log("Tmp_ITMNO_NEXT : ", Tmp_ITMNO_NEXT);
                    Tmp_ITMNO_NEXT_dot_cnt = Tmp_ITMNO_NEXT.split(".").length - 1;
                    console.log("Tmp_ITMNO_NEXT_dot_cnt: ", Tmp_ITMNO_NEXT_dot_cnt);
                    if (Tmp_ITMNO_NEXT_dot_cnt >= 2) { //有明細步序
                        Tmp_Str = "目前主步序(項次:" + Tmp_ITMNO + ")的需求工時(" + Tmp_RQHR.toString() + ")<br>"
                            + "因本主步序有子步序(項次:" + Tmp_ITMNO + ".xx)<br> "
                            + "則本主步序的需求工時必需為 0 或 空白 <br>"
                            + "敬請檢核 !!<br>";
                        mywarnalert(Tmp_Str);
                        Tmp_isOk = false;
                        return Tmp_isOk;
                    }
                }
            }
        }        // end of for (i=0)        
        //2>檢核 [需求工時] 不可大於 [標準工時] , 若大於,則[備註]欄位不可空白
        //var mysubstore = Ext.getCmp('sub_Grid').store;
        //var Tmp_cnt = mysubstore.data.length;
        var Tmp_REMARK;
        var Tmp_RQ_HR = 0, Tmp_STD_HR = 0;
        for (i = 0; i < Tmp_cnt; i++) {
            Tmp_rec = mysubstore.getAt(i);
            Tmp_ITMNO = nulltoStr(Tmp_rec.data["ITMNO"]);
            Tmp_RQ_HR = Number(nulltoStr(Tmp_rec.data["RQHR"]));
            Tmp_STD_HR = Number(nulltoStr(Tmp_rec.data["STDHR"]));
            Tmp_REMARK = nulltoStr(Tmp_rec.data["REMARK"]);
            if (Tmp_ITMNO == "1.04.04")
                mywarnalert("項次:1.04.04");
            if (Tmp_RQ_HR > Tmp_STD_HR) {
                if (checkisnull(Tmp_REMARK)) {
                    Tmp_Str = "步序(項次:" + Tmp_ITMNO + ")的[需求工時(" + Tmp_RQ_HR + ")]<br>"
                        + "大於[標準工時(" + Tmp_STD_HR + ")]<br>"
                        + "[備註]欄位必需說明原因<br>"
                        + "不可空白 !!";
                    mywarnalert(Tmp_Str);
                    Tmp_isOk = false;
                    return Tmp_isOk;
                }
            } // end of  if (Tmp_RQ_HR > Tmp_STD_HR) {
        }  // end of  for (i = 0; i < Tmp_cnt; i++) {


        //2>>累加拆解工時 & 維修工時(因尚未存入資料庫,所以必需在前端小計時數)
        var Tmp_ITMNO_14;
        var Tmp_TAL_RPNOAF_HR = 0, Tmp_TAL_MRPNOAF_HR = 0;
        for (i = 0; i < Tmp_cnt; i++) {
            Tmp_rec = mysubstore.getAt(i);
            Tmp_ITMNO = nulltoStr(Tmp_rec.data["ITMNO"]);
            Tmp_ITMNO_14 = Tmp_ITMNO.substr(0, 4);
            Tmp_RQHR = Number(nulltoStr(Tmp_rec.data["RQHR"]));
            switch (Tmp_ITMNO_14) {
                case '1.01': case '1.02': case '1.03': case '1.04': case '1.05':
                case '1.06': case '1.07': case '1.08': case '1.09': case '1.10':
                case '3.01':
                    Tmp_TAL_RPNOAF_HR = Tmp_TAL_RPNOAF_HR + Tmp_RQHR;
                    break;
                case '2.01': case '2.02': case '2.03': case '2.04': case '2.05':
                case '2.06': case '2.07': case '2.08': case '2.09': case '2.10':
                    Tmp_TAL_MRPNOAF_HR = Tmp_TAL_MRPNOAF_HR + Tmp_RQHR;
                    break;
                default:
                    Tmp_TAL_MRPNOAF_HR = Tmp_TAL_MRPNOAF_HR + Tmp_RQHR;
                    break;
            }
        }  // end of for (i=0,)
        Ext.getCmp("sub_RPNOAF_TALHR").setValue(Tmp_TAL_RPNOAF_HR);
        Ext.getCmp("sub_MRPNOAF_TALHR").setValue(Tmp_TAL_MRPNOAF_HR);
        mysuccessalert("工時合計完成 !!");
        return Tmp_isOk;  //return true
    };  // end of CALL_TALHR_CAL


        //[工時提列].[確認]鈕 
        function V20304A_OK() {
            //1>檢核欄位是否有輸入        
            var Tmp_sub_RPNOAF = Ext.getCmp("sub_RPNOAF").getValue();
            var Tmp_sub_RRNRAR = Ext.getCmp("sub_RRNRAR").getValue();
            var Tmp_sub_QDEP = Ext.getCmp("sub_QDEP").getValue();
            var Tmp_sub_IRESAK = Ext.getCmp("sub_IRESAK").getValue();
            var Tmp_sub_NOTEAR = Ext.getCmp("sub_NOTEAR").getValue();
            var Tmp_Str;
            if (checkisnull(Tmp_sub_RRNRAR)) {
                Tmp_Str = "TLS實際拆檢完工日不可空白<br>"
                    + "敬請檢核<br>";
                mywarnalert(Tmp_Str);
                return false;
            }
            if (checkisnull(Tmp_sub_QDEP)) {
                Tmp_Str = "品保單位不可空白<br>"
                    + "敬請檢核<br>";
                mywarnalert(Tmp_Str);
                return false;
            }
            if (checkisnull(Tmp_sub_NOTEAR)) {
                Tmp_Str = "檢測結果說明不可空白<br>"
                    + "敬請檢核<br>";
                mywarnalert(Tmp_Str);
                return false;
            }

            //直接呼叫[合計]鈕函式,  - 檢核 主步序&子步序是否有問題, 若有問題,則顯示訊息,不寫入 AMM_TLSAR & AMM_AR
            //[確認]時, 不重複寫檢核程式
            if (CALL_TALHR_CAL()==false) {
                return;
            }
            ////1>判斷主步序(1.xx) 的工時>0 時, 不可以有明細步序(1.xx.xx)        
            var mysubstore = Ext.getCmp('sub_Grid').store;
            var Tmp_cnt = mysubstore.data.length;            

            //3>> 寫入  AMM_AR(寫入明細步序所有工時)  &  AMM_TLSAR(只寫主步序 & 拆檢小計工時 &  維修小計工時)
            //將子畫面資料寫入 np , 以便新增 AMM_AR  &  AMM_TLSAR
            let Tmp_DataAry1 = [];
            for (var i = 0; i < Tmp_cnt; i++) {
                Tmp_rec = mysubstore.getAt(i);
                Tmp_DataAry1.push(Tmp_rec.data);
            }
            // 將目前子畫面的資料(Table)轉成 JSON字串
            let Tmp_DataString1 = JSON.stringify(Tmp_DataAry1);
            var np = {};
            np = {
                FMNO: Tmp_FMNO,
                RPNOAF: Tmp_sub_RPNOAF,
                IRESAK: Tmp_sub_IRESAK,
                RRNRAR: Tmp_sub_RRNRAR,
                QDEP: Tmp_sub_QDEP,
                NOTEAR: Tmp_sub_NOTEAR,
                DataString1: Tmp_DataString1,  //目前子畫面的資料
            };
            var Tmp_url = "../../api/V20304AAPI/UPDATE_AMM_AR_TLSAR";
            //取得挑選資料的 dt2JSON 字串 
            //getUrlStr : 必需傳回字串( dt.JSON字串) , 非 ds
            var rtn_Str = getUrlStr(Tmp_url, np, "工時提列");
            console.log("rtn_Str:", rtn_Str);
            if (checkRtnOK(rtn_Str)) {
                mysuccessalert(rtn_Str);                
                console.log("win1.closeAction:", win1.closeAction);
                win1.close();
                win1.destroy();   //必需寫 destroy() , 不然畫面會亂掉
            }
            else
                mywarnalert(rtn_Str);
        }  // end of  function V20304A_OK() {
    // }  // end of abc()

};  // end of function Call_V20304A() {