2024年8月14日 星期三

V80201 - V80202 - RadioGroup - CheckboxGroup 處理 - radio - checkbox

 目的: V80201 - V80202 - RadioGroup - CheckboxGroup 處理

處理說明:  1>RadioGrop & CheckboxGroup 在前端欄位值為 Object
                   2>RadioGrop & CheckboxGroup 透過 np 傳至後端,欄位值為 string
                   3>最好先轉成字串,再送至後端 ,   ??有時 Object 送至後端,會有問題   

 np["s_rd_HOST"] = Ext.getCmp('s_rd_HOST').getValue();                      //Object 傳至後端

-->最好傳至 以字串(如下Tmp_HOST)傳至後端
var Tmp_HOST = (Ext.getCmp('s_rd_HOST').getValue()).s_rd_HOST;   //取得字串
np["s_rd_HOST"] = Tmp_HOST ;

1>RadioGroup


 

2>CheckboxGroup:



1>V80201.js
 np["s_rd_HOST"] = Ext.getCmp('s_rd_HOST').getValue();                      //Object 傳至後端
-->最好傳至 以字串(如下Tmp_HOST)傳至後端
var Tmp_HOST = (Ext.getCmp('s_rd_HOST').getValue()).s_rd_HOST;   //取得字串
np["s_rd_HOST"] = Tmp_HOST ;

2>V80202.js
np["s_chk_AMMSTS"] = Ext.getCmp('s_chk_AMMSTS').getValue();      //Object[Array] 傳至後端
var Tmp_AMMSTS = (Ext.getCmp('s_chk_AMMSTS').getValue()).s_chk_AMMSTS[0];   //取得字串


1.2>V80201.cs
string Tmp_rd_HOST= myfunc.null2str(nvc["s_rd_HOST"]);    //'1'

2.2>V80202.cs
string Tmp_chk_AMMSTS = nvc["s_chk_AMMSTS"];    //"1,2,"


2024年8月1日 星期四

V80404 – 計算兩日期差異天數 - TimeSpan - Ext.Date.Format

 目的: V80404 – 計算兩日期差異天數

處理說明:   1>計算兩日期的差異天數

                     int Tmp_Days = new TimeSpan(date1.Ticks - date2.Ticks).Days;

1>*.cs

取得兩個日期之間的「天數」(不足一天者採「無條件刪去法」) 

[code:c#] 

new TimeSpan(date1.Ticks - date2.Ticks).Days

[/code]

取得兩個日期之間的「天數」(回傳型別為 double 雙精確度)

[code:c#] 

new TimeSpan(date1.Ticks - date2.Ticks).TotalDays

[/code]

取得兩個日期之間的「小時數」(回傳型別為 double 雙精確度)

[code:c#] 

new TimeSpan(date1.Ticks - date2.Ticks).TotalHours

[/code]

取得兩個日期之間的「分鐘數」(回傳型別為 double 雙精確度) 

[code:c#] 

new TimeSpan(date1.Ticks - date2.Ticks).TotalMinutes

[/code]

備註事項

 TimeSpan 成員中,只要是 Total 開頭的屬性,都是回傳兩個時間差的「總天數」、「總時數」、「總分鐘數」、「總秒數」、「總豪秒數」,而且以 double 型別回傳,若無法整除都會有小數點出現。

另外 Days 屬性是回傳不足一天者採「無條件刪去法」的天數外 (整數型別),其餘的像是 HoursMinutesSecondsMilliseconds 等屬性都是以用來描述該差異天數中的餘數進行表示。舉個例子說明會比較清楚:

[code:c#]

DateTime date1 = new DateTime(2008, 12,31, 23,59,59, DateTimeKind.Local);
DateTime date2 = new DateTime(2003, 2,13, 23,59,59, DateTimeKind.Local);
TimeSpan s = new TimeSpan(date1.Ticks - date2.Ticks);

[/code]

上述例子中,因為回傳的「差異天數」剛好為「整數」,並沒有時、分、秒、豪秒等餘數,所以 s.Hours, s.Minutes, s.Seconds, s.Milliseconds 等屬性回傳值都會是 0 喔!

 

- Ext.Date

The following is a list of all currently supported formats:

Format      Description                                                               Example returned values
------      -----------------------------------------------------------------------   -----------------------
  d         Day of the month, 2 digits with leading zeros                             01 to 31
  D         A short textual representation of the day of the week                     Mon to Sun
  j         Day of the month without leading zeros                                    1 to 31
  l         A full textual representation of the day of the week                      Sunday to Saturday
  N         ISO-8601 numeric representation of the day of the week                    1 (for Monday) through 7 (for Sunday)
  S         English ordinal suffix for the day of the month, 2 characters             st, nd, rd or th. Works well with j
  w         Numeric representation of the day of the week                             0 (for Sunday) to 6 (for Saturday)
  z         The day of the year (starting from 0)                                     0 to 364 (365 in leap years)
  W         ISO-8601 week number of year, weeks starting on Monday                    01 to 53
  F         A full textual representation of a month, such as January or March        January to December
  m         Numeric representation of a month, with leading zeros                     01 to 12
  M         A short textual representation of a month                                 Jan to Dec
  n         Numeric representation of a month, without leading zeros                  1 to 12
  t         Number of days in the given month                                         28 to 31
  L         Whether it's a leap year                                                  1 if it is a leap year, 0 otherwise.
  o         ISO-8601 year number (identical to (Y), but if the ISO week number (W)    Examples: 1998 or 2004
            belongs to the previous or next year, that year is used instead)
  Y         A full numeric representation of a year, 4 digits                         Examples: 1999 or 2003
  y         A two digit representation of a year                                      Examples: 99 or 03
  a         Lowercase Ante meridiem and Post meridiem                                 am or pm
  A         Uppercase Ante meridiem and Post meridiem                                 AM or PM
  g         12-hour format of an hour without leading zeros                           1 to 12
  G         24-hour format of an hour without leading zeros                           0 to 23
  h         12-hour format of an hour with leading zeros                              01 to 12
  H         24-hour format of an hour with leading zeros                              00 to 23
  i         Minutes, with leading zeros                                               00 to 59
  s         Seconds, with leading zeros                                               00 to 59
  u         Decimal fraction of a second                                              Examples:
            (minimum 1 digit, arbitrary number of digits allowed)                     001 (i.e. 0.001s) or
                                                                                      100 (i.e. 0.100s) or
                                                                                      999 (i.e. 0.999s) or
                                                                                      999876543210 (i.e. 0.999876543210s)
  O         Difference to Greenwich time (GMT) in hours and minutes                   Example: +1030
  P         Difference to Greenwich time (GMT) with colon between hours and minutes   Example: -08:00
  T         Timezone abbreviation of the machine running the code                     Examples: EST, MDT, PDT ...
  Z         Timezone offset in seconds (negative if west of UTC, positive if east)    -43200 to 50400
  c         ISO 8601 date
            Notes:                                                                    Examples:
            1) If unspecified, the month / day defaults to the current month / day,   1991 or
               the time defaults to midnight, while the timezone defaults to the      1992-10 or
               browser's timezone. If a time is specified, it must include both hours 1993-09-20 or
               and minutes. The "T" delimiter, seconds, milliseconds and timezone     1994-08-19T16:20+01:00 or
               are optional.                                                          1995-07-18T17:21:28-02:00 or
            2) The decimal fraction of a second, if specified, must contain at        1996-06-17T18:22:29.98765+03:00 or
               least 1 digit (there is no limit to the maximum number                 1997-05-16T19:23:30,12345-0400 or
               of digits allowed), and may be delimited by either a '.' or a ','      1998-04-15T20:24:31.2468Z or
            Refer to the examples on the right for the various levels of              1999-03-14T20:24:32Z or
            date-time granularity which are supported, or see                         2000-02-13T21:25:33
            http://www.w3.org/TR/NOTE-datetime for more info.                         2001-01-12 22:26:34
  U         Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)                1193432466 or -2138434463
  MS        Microsoft AJAX serialized dates                                           \/Date(1238606590509)\/ (i.e. UTC milliseconds since epoch) or
                                                                                      \/Date(1238606590509+0800)\/
  time      A javascript millisecond timestamp                                        1350024476440
  timestamp A UNIX timestamp (same as U)                                              1350024866            

Example usage (note that you must escape format specifiers with '\' to render them as character literals):

// Sample date:
// 'Wed Jan 10 2007 15:05:01 GMT-0600 (Central Standard Time)'

var dt = new Date('1/10/2007 03:05:01 PM GMT-0600');
console.log(Ext.Date.format(dt, 'Y-m-d'));                          // 2007-01-10
console.log(Ext.Date.format(dt, 'F j, Y, g:i a'));                  // January 10, 2007, 3:05 pm
console.log(Ext.Date.format(dt, 'l, \\t\\he jS \\of F Y h:i:s A')); // Wednesday, the 10th of January 2007 03:05:01 PM

2024年7月31日 星期三

V80404 – [請料提出日期] 格式不對 - 0NaN/NaN/NaN

 目的: V80404 – [請料提出日期] 格式不對  - 0NaN/NaN/NaN

處理說明: 1> *.cs 的欄位格式 - datetime
    //ds.Tables["T1"].Columns.Add(new DataColumn("RDUOCD_", typeof(string))); //請料提出日期
     ds.Tables["T1"].Columns.Add(new DataColumn("RDUOCD_", typeof(DateTime))); //請料提出日期

                  2>*.js 的欄位格
{ header: "請料提出日期", dataIndex: "RDUOCD_", width: 100, TMType: "date", renderer: Ext.util.Format.dateRenderer('Y/m/d') },

--> cs的欄位格式 必需和 js 的欄位格式一致(DateTime)
--> 若為 string 則均為 string


1>*.cs
  ds.Tables["T1"].Columns.Add(new DataColumn("EMPLYID__", typeof(string)));//請料者姓名
  //ds.Tables["T1"].Columns.Add(new DataColumn("RDUOCD_", typeof(string))); //請料提出日期
 ds.Tables["T1"].Columns.Add(new DataColumn("RDUOCD_", typeof(DateTime))); //請料提出日期
 ds.Tables["T1"].Columns.Add(new DataColumn("EINDT_", typeof(string))); //預計交貨日期
ds.Tables["T1"].Columns.Add(new DataColumn("BUDAT_", typeof(string))); //(採保)接收日期


2>*.js
{ header: "請料提出日期", dataIndex: "RDUOCD_", width: 100, TMType: "date", renderer: Ext.util.Format.dateRenderer('Y/m/d') },
{ header: "預計交貨日期", dataIndex: "EINDT_", width: 100, TMType: "string" },
{ header: "(採保)接收日期", dataIndex: "BUDAT_", width: 100, TMType: "string" },



2024年7月29日 星期一

V80404 - DBLINK 設定相關問題 - web.config

 目的: V80404 - DBLINK 設定相關問題 - 畫面有該資料(提領編號GONOAF=’ EC08001L006PE/R040’)

處理說明:1>[提領編號]挑選資料時,卻找不到該資料
                      [顯示資料]時,連至正式區資料庫
                                - (DBLINK=AMMEU5接至正式區, @TLS_245也會接正式區的設定)    
                      [挑選資料]時,連至測試區資料庫(DBLINK='TLSEU') --> web.config --> TLSEU5
                                -(DBLINK=TLSEU5接至測試區)

                 2> [顯示資料]鈕:  CSM_AF@TLS_245  
                      --> 原本接至 AMM 正式資料庫 , @TLS_245 也會接至 TLS正式資料庫   
        --> 顯示資料時, 接至 AMMEU5 , 如下web.config接至 正式區資料庫(TLS2_199) AMM _EU

<add name="AMMEU5" connectionString="Data Source=TLS2_199;User Id=AMM_EU;Password=196YLL7J;Persist Security Info=True;Max Pool Size=5;Connect Timeout=30;" />                       

string Tmp_Sql = " SELECT RNK, " + "RPNOAF,ITEMAH,ITEMAHD,GONOAF,WBSNO,LNM,LPN,SEQOAF,ITEMAH,PN,NSN,C_NM,NQTYAH,C_UNIT,RPN,RSTHAH,EFF, DELAH, ITEMAHD, MSURAHD, NOAHD, "+ " PRMPN, PRQTY, PC_UNIT, PRNO, PRITM, MPN, TRQTY, TC_UNIT, EBELN, EBELP "
+ " FROM ("
+ :

+ " ( SELECT A.RPNOAF, A.GONOAF, A.WBSNO, A.C_NM LNM, A.PN LPN, A.SEQOAF, "
+ " B.ITEMAH, B.PN, B.NSN, B.C_NM, B.NQTYAH, B.C_UNIT, B.RPN, B.RSTHAH, B.EFF, B.DELAH, "
+ " C.ITEMAHD, C.MSURAHD, C.NOAHD "
+ " FROM CSM_AF@TLS_245 A, CSM_AH@TLS_245 B, CSM_AHD@TLS_245 C "
+ " WHERE A.RPNOAF = B.RPNOAF "
+ " AND B.RPNOAF = C.RPNOAF "

          3>[提領編號] : 挑選資料  - DBLINK="TLSEU";   
             --> 依 Web.config 的TLSEU 設定,決定連至TLS正式區/測試區
<add name="TLSEU5" connectionString="Data Source=TLS1_ROB23;User Id=TLS5_EU;Password=206CEB23;Persist Security Info=True;Max Pool Size=5;Connect Timeout=30;" />
            --> 在測試區, 連至 TLSEU5 , web.config TLSEU5 連至測試區資料庫,  
                  非正式區資料(@TLS_245), 所以會找不到資料
//過濾條件 [提領編號]挑選
        [HttpPost]
        public dynamic get_s_GONOAFPick(string GONOAF = "", int isComplete = 0)
        {
            DBLINK = "TLSEU";
            string Tmp_Sql = " SELECT DISTINCT GONOAF   "
                                       + "  from     CSM_AF "
                                       + " ORDER  BY  GONOAF ";
            string n = funId + "s_GONOAF";
            //DataSet ds = setupPickDs(n, Tmp_Sql, new string[] { "CSM_AF@TLS_245" });
            DataSet ds = setupPickDs(n, Tmp_Sql, new string[] { "CSM_AF" });
            if (GONOAF != null && !GONOAF.Equals(""))
            {
                if (isComplete == 1)
                {
                    ds = getPickDsbyCondi(n, "GONOAF='" + GONOAF + "'");
                }
                else
                {
                    ds = getPickDsbyCondi(n, "GONOAF  LIKE '%" + GONOAF + "%'");
                }
            }
            return ds;
        }  // end of  get_s_GONOAFPick



1>web.config
<add name="TLSEU5" connectionString="Data Source=TLS1_ROB23;
 User Id=TLS5_EU;Password=206CEB23;Persist Security Info=True;Max Pool Size=5;Connect Timeout=30;" />

<add name="AMMEU5" connectionString="Data Source=TLS2_199;
User Id=AMM_EU;Password=196YLL7J;Persist Security Info=True;Max Pool Size=5;Connect Timeout=30;" />    


V80404 - 挑選資料 - Cache 是否最新資料的機制 - 若非最新資料,則需重抓資料 - setupPickDs - getPickDsbyCondi

目的: V80404 - 挑選資料 - Cache 是否最新資料的機制 - 若非最新資料,則需重抓資料

處理說明: 1>建立 Cache DataSet
                      DataSet ds = setupPickDs(n, Tmp_Sql, new string[] { "CSM_AF" });
// //public DataSet setupPickDs(string pickKey, string sql, string[] tables, bool paging = true, bool realTime = false)

                  2>由 Cache DataSet 過濾資料
                      ds = getPickDsbyCondi(n, "GONOAF='" + GONOAF + "'");   





1>*.js
[HttpPost]
        public dynamic get_s_GONOAFPick(string GONOAF = "", int isComplete = 0)
        {
            DBLINK = "TLSEU";
            string Tmp_Sql = " SELECT DISTINCT GONOAF   "
                                       + "  from     CSM_AF "
                                       + " ORDER  BY  GONOAF ";
            string n = funId + "s_GONOAF";
             // TableName 有@會Error , 所以先設定 DBLink 
             //public DataSet setupPickDs(string pickKey, string sql, string[] tables, bool paging = true, bool realTime = false)
             //建立 PickDs , 若已存在,則直接取用目前 Cache DataSet
            //DataSet ds = setupPickDs(n, Tmp_Sql, new string[] { "CSM_AF@TLS_245" });  
            DataSet ds = setupPickDs(n, Tmp_Sql, new string[] { "CSM_AF" });
            if (GONOAF != null && !GONOAF.Equals(""))
            {
                if (isComplete == 1)
                {
                     ////由 Cache DataSet 過濾資料  
                     ds = getPickDsbyCondi(n, "GONOAF='" + GONOAF + "'");
                }
                else
                {
                    ds = getPickDsbyCondi(n, "GONOAF  LIKE '%" + GONOAF + "%'");
                }
            }
            return ds;
        }  // end of  get_s_GONOAFPick

2024年7月17日 星期三

V20304A –sub_Grid –[需求工時]欄位,為數字欄位且允許編輯

 目的: V20304A –sub_Grid –[需求工時]欄位,為數字欄位且允許編輯

處理說明:1>Grid 設定為每行編輯模式
                     var sub_Grid = Ext.create('TMGrid', {
                                                  plugins: [
                                                       Ext.create('Ext.grid.plugin.RowEditing', {
                                                       clicksToEdit: 1,
                                                       clicksToMoveEditor: 2,
                                                       autoCancel: false
                                                     })],
                                                    });
                   2>Grid.[需求時數][備註] 欄位設定可編輯   
{
header: "需求工時", dataIndex: "RQHR", width: 70, sortable: false, align: "right", TMType: "float",
renderer: Ext.util.Format.numberRenderer('000.00'),
editor: { xtype: 'numberfield', allowBlank: true }, //允許空白
 },
{
header: "備註", dataIndex: "REMARK", width: 250, sortable: false, TMType: "string",
editor: { xtype: 'textfield', allowBlank: true }, //允許空白
},


1>*.js  - V20304A.js

var sub_Grid = Ext.create('TMGrid', {
grid_id: 'sub_Grid',
columns: sub_Columns,
flex: 1,
store: Ext.create('gridstore', { model: sub_model }),
plugins: [
Ext.create('Ext.grid.plugin.RowEditing', {
clicksToEdit: 1,
clicksToMoveEditor: 2,
autoCancel: false
})],

});


2>V20304A_JSON.js
var sub_Columns = [
{ header: "", xtype: "rownumberer", width: 40, align: "center", sortable: false },
{ header: "AMM項次", dataIndex: "AMINO", width: 80, sortable: false, TMType: "string" },
{ header: "項次", dataIndex: "ITMNO", width: 70, sortable: false, TMType: "string" },
{ header: "工作項目", dataIndex: "WKDESC", width: 150, sortable: false, TMType: "string" },
{
header: "標準工時", dataIndex: "STDHR", width: 70, sortable: false, align: "right", TMType: "float",
renderer: Ext.util.Format.numberRenderer('0,000.00')
},
{
header: "需求工時", dataIndex: "RQHR", width: 70, sortable: false, align: "right", TMType: "float",
renderer: Ext.util.Format.numberRenderer('000.00'),
editor: { xtype: 'numberfield', allowBlank: true }, //允許空白
 },
{
header: "備註", dataIndex: "REMARK", width: 250, sortable: false, TMType: "string",
editor: { xtype: 'textfield', allowBlank: true }, //允許空白
},
//{ header: "件號專用表單編號", dataIndex: "PNSHTNO", width: 500, sortable: false, TMType: "string" }
];






V20304A – 工時提列 –編輯完[需求工時]欄位後,維持在原本的行號,不自動跳至第1筆

 目的: V20304A – 工時提列 編輯完[需求工時]欄位後,維持在原本的行號,不自動跳至第1

處理說明 : 1>






var sub_Grid = Ext.create('TMGrid', {
            grid_id: 'sub_Grid',
            columns: sub_Columns,
            //autoScroll: true,
            flex: 1,
            store: Ext.create('gridstore', { model: sub_model }),
            plugins: [
                //Ext.create('Ext.grid.plugin.CellEditing', {   // 編輯後,會跳至第1筆,若要編輯下一筆,要重新 Scroll
                //    clicksToEdit: 1,                           // 按一下進行編輯,預設為按兩下
                //    clicksToMoveEditor: 1,            //在編輯模式下切換編輯另一行的行為1表示點選一就切換;2表示點2下才切換。
                //})],
            Ext.create('Ext.grid.plugin.RowEditing', { //編輯後,停留在目前行號,不跳至第一筆
                clicksToEdit: 1,
                clicksToMoveEditor: 1,
                autoCancel: false
            })],
        });

var sub_Columns = [
    { header: "", xtype: "rownumberer", width: 40, align: "center", sortable: false },
    //{ header: "系統件單號", dataIndex: "FMNO", width: 130, sortable: false, TMType: "string" },
    { header: "AMM項次", dataIndex: "AMINO", width: 80, sortable: false, TMType: "string" },
    //{ header: "流水序號", dataIndex: "ITM", width: 50, sortable: false, TMType: "string" },
    { header: "項次", dataIndex: "ITMNO", width: 70, sortable: false, TMType: "string" },
    { header: "工作項目", dataIndex: "WKDESC", width: 150, sortable: false, TMType: "string" },
    { header: "標準工時", dataIndex: "STDHR", width: 70, sortable: false, align: "right", TMType: "float", renderer: Ext.util.Format.numberRenderer('0,000.00') },
    {
        header: "需求工時", dataIndex: "RQHR", width: 70, sortable: false, align: "right", TMType: "float",
        renderer: Ext.util.Format.numberRenderer('0,000.00'),
        editor: { xtype: 'textfield', allowBlank: true }, //允許空白
        //editor: 'textfield',
    },
    {
        header: "備註", dataIndex: "REMARK", width: 250, sortable: false, TMType: "string",
        editor: { xtype: 'textfield', allowBlank: true }, //允許空白
        },
    //{ header: "件號專用表單編號", dataIndex: "PNSHTNO", width: 500, sortable: false, TMType: "string" }
];