2022年8月3日 星期三

V120103 - 判斷目前編輯的模式(1:新增, 2:編輯,0:瀏覽,..) buttonModel.modelType

1>TMSingleViewEdit.js

var buttonModel = function () {
    this.modelType = 0; //預設檢視模式
    this.getModelType = function () {
        return this.modelType;
    }
}

Ext.define('G_buttonModel', {
getModelType: function () {
return buttonModel.modelType;
},
setModelType: function (type_num) {
buttonModel.modelType = type_num;
}
});


2>V120103.js 

Ext.onReady(function () {
     var TMSingleViewEdit = Ext.create('TMSingleViewEdit');
     var gridstore = Ext.getCmp('grid_Single').store;
     var buttonModel = Ext.create('G_buttonModel'); 
                         :
               Ext.getCmp('btn_save').setFormValue = function () {
               //要判斷 buttonModel 的編輯模式時, 才即時去抓 modelType
               var modelType = buttonModel.getModelType();

               console.log("setFormValue modelType=", modelType);
               //若非[新增]模式,則不設定欄位值
               if (!(modelType == 1))    
                   return true;

        var isOk = true;
        var Tmp_MAX_ITM = "";       
        np = {};
        np["CLS"] = Ext.getCmp('CLS').getValue();        
        Ext.Ajax.request({
            method: "POST",
            url: '../../api/V120103API/GET_MAXITM',
            params: np,
            async: false,
            success: function (response, opts) {
                var Tmp_Obj = Ext.decode(response.responseText);       
                if (Tmp_Obj["success"]) {
                    Tmp_MAX_ITM = Tmp_Obj['MAX_ITM'];
                    Ext.getCmp("ITM").setValue(Tmp_MAX_ITM);
                }
            }, // end of  success 
            failure: function (response, opts) {
                isOk = false;
            }
        });  // end of Ext.Ajax               
       return isOk;

}

 

Ext.syncRequire('TM.TMSingleViewEdit') 和 Ext.Loader.loadScript({ url: '../GUITemplate/TMSingleViewEdit.js', }) 的不同



Ext.Loader.loadScript({

url: '../JsFunction/V120103_JSON.js',

onLoad: function () { 
//load class & depend.class 而已,不是所有 *.js,  不可存取該 *.js 的全域變數
Ext.syncRequire('TM.TMSingleViewEdit');
}
});


Ext.Loader.loadScript({ //load *.js , 可以存取該 *.js 的全域變數
url: '../GUITemplate/TMSingleViewEdit.js',
});


Ex1:  Ext.Loader.loadScript({    url: '../../GUITemplate/TMSingleViewEdit.js',});

1>TMSingleViewEdit.js

var unique="1";

function StrExtract(par_Str, index, par_sper) {
    return ExtractStr(par_Str, index, par_sper);
}


2>V120103.js

Ext.Loader.loadScript({
    url: '../GUITemplate/TMSingleViewEdit.js',
});

Ext.onReady(function () { 
    console.log("unique=", unique);  --> 可以取得 TMSingleViewEdit.js 的全域變數 unique
     :
}

Ex2:  Ext.syncRequire('TM.TMSingleViewEdit');

2>若 V120103.js 
    Ext.syncRequire('TM.TMSingleViewEdit');
    console.log("unique=", unique);  --> 無法取得 TMSingleViewEdit.js 的全域變數 unique

建構子 function() { this.modelType=0; this.getModelType=function{return this.modeltype;}

/*
 * 建構子會如此做動:
 *
 * function MyConstructor(){
 *   // 實際的函式主體碼在這裡
 *   // 在|this| 上創建屬性
 *   // 希望通過分配給他們,如:
 *   this.fum = "nom";
 *   // et cetera...
 *
 *   // 如果函式有返回狀態它將返回一個物件
 *   // 那個物件將是新表達式的結果。
 *   // 換句話來說,表達式的結果是現在綁定 |this| 的物件
 *   // (例如,最常見的常見情況).
 * }
function C(){

this.a = 37; } var o = new C();

console.log(o.a); // logs 37



//static var
var buttonModel = function () {
    this.modelType = 0; //預設檢視模式
    this.getModelType = function () {
        return this.modelType;
    }
}

V120402 – [借閱登記] – 新增 – 取得ITM=最大值+1,

目的: V120402 – [借閱登記] – 新增 – 取得ITM=最大值+1, 

處理說明:  1>新增 - 取得 ITM最大值+1,



1>*.js  取得最大值 +1

Tmp_ITM = get_NEXT_ITM(Tmp_TMNO);

//取得   TMNO 的最大借閱記錄
    function string  get_NEXT_ITM(Tmp_TMNO)
    {
        var isOk = true;
        var Tmp_MAX_ITM = "";
        var  np = {};
        np["TMNO"] = Tmp_TMNO;
        Ext.Ajax.request({
            method: "POST",
            url: '../../api/V120402API/GET_MAXITM',
            params: np,
            async: false,
            success: function (response, opts) {
                var Tmp_Obj = Ext.decode(response.responseText);
                //console.log("Tmp_Obj[success]=", Tmp_Obj["success"]);
                if (Tmp_Obj["success"]) {
                    Tmp_MAX_ITM = Tmp_Obj['MAX_ITM'].toString();
                    if (Tmp_MAX_ITM.length == 0)
                        Tmp_MAX_ITM = '1';
                    console.log("Tmp_MAX_ITM=", Tmp_MAX_ITM);
                    return Tmp_MAX_ITM;
                    //mywarnalert(Tmp_Str);
                    //console.log(" 1 success return false");                    
                }
            }, // end of  success 
            failure: function (response, opts) {
                isOk = false;
            }
        });  // end of Ext.Ajax               
    }  // end of  function string  get_NEXT_ITM(Tmp_TMNO)


2>*.cs  - 
//以 TMNO  至 AMM_TMDWGD  取得  MAX(AMM_TMDWGD.ITM)+1 
        [HttpPost]
        public HttpResponseMessage GET_MAXITM()
        {
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            string Tmp_TMNO = nvc["TMNO"];

            OracleConnection conn = new OracleConnection(DBService.ConnectionString(DBLINK));//
            OracleCommand cmd = new OracleCommand();
            OracleDataReader reader;
            var response = this.Request.CreateResponse();

            conn.Open();
            conn.ClientInfo = User.Identity.Name;
            conn.ModuleName = BaseSYS + "_" + BaseMODID;
            conn.ActionName = ActionName;
            cmd.Connection = conn;

            string Tmp_Str = "";
            string Tmp_Sql = "  SELECT MAX(ITM)+1  as MAX_ITM"
                                       + "  FROM   AMM_TMDWGD "
                                       + "  WHERE TMNO= " + myfunc.AA(Tmp_TMNO);
            cmd.CommandText = Tmp_Sql;
            reader = cmd.ExecuteReader();
            string Tmp_MAX_ITM = "";
            if (reader.Read())
            {
                Tmp_MAX_ITM = reader["MAX_ITM"].ToString();
            }
            Tmp_Str = "{success: true,MAX_ITM:" + myfunc.AA(Tmp_MAX_ITM) + ","
                                        + " }";

            response.Content = new StringContent(Tmp_Str);    // 回應內容
            return response;
            //return Tmp_MAX_ITM;
        }  // end of get_MAX_ITM


//V120201 , *.cs 直接取得最大值, 不傳回前端
//取得  AMM_COMQ.APNO  最大值
        [HttpPost]
public string GET_NEXT_APNO()
  {
          string Tmp_Sql;
          string Tmp_DStr = "Q" + DateTime.Now.ToString("yyyyMMdd"); ;
          string Tmp_MAX_APNO, Tmp_NEXT_APNO;
          Tmp_Sql="  SELECT   MAX(APNO) "
                        +"  FROM     AMM_COMQ "
                        +"  WHERE   APNO LIKE  "+myfunc.AA(Tmp_DStr+'%');      
          Tmp_MAX_APNO=myfunc.SqlValue(Tmp_Sql);
          if (myfunc.checkisnull(Tmp_MAX_APNO)){
             Tmp_NEXT_APNO=Tmp_DStr+"001";
          }
          else {
                    //取流水號(末3碼)+1  
       int Tmp_NextSerno = int.Parse(Tmp_MAX_APNO.Substring(Tmp_MAX_APNO.Length - 3, 3));
                   Tmp_NextSerno=Tmp_NextSerno+1;
                   Tmp_NEXT_APNO =Tmp_DStr+Tmp_NextSerno.ToString("000");
             }
        return Tmp_NEXT_APNO;
    }

2022年8月2日 星期二

Question: V120103 - [新增] --> [存檔]資料後, 重新儲存資料, 並 Focus 在該目前編輯的資料

目的: Grid [新增] --> [存檔]資料後, Locate 至原本的新增的那筆資料

處理說明: 1> Grid 有分頁處理, 若新增的那筆資料, 位置在其他頁,要如何處理
                  2> store 要 如何 Scroll 至該筆資料
                  3> store.findby  用法

--> 若 [存檔]後, store.reload() ,則新增的該筆資料可能不見,
      所以應該由前端 取得 MAXITM 後, 直接設定 store.欄位值, 不重新 reload();





1>store.reload()後, 找出剛才新增的那筆資料
//onclick : 會先執行 partent.click , 才執行 this.click
    Ext.getCmp('btn_save').on('click', function () {
        console.log("btn_save click my");        
        //gridstore.reloadGirdData();
        var cur_recs = Ext.getCmp("grid_Single").getSelectionModel().getSelection();
        var cur_rec = cur_recs[0];
        console.log("cur_rec=", cur_rec);
        var Tmp_CLS, Tmp_DITM,Tmp_REPN;
        var np = {};
        Tmp_CLS = cur_rec.data["CLS"].toString();
        Tmp_DITM = cur_rec.data["DITM"].toString();
        Tmp_REPN = cur_rec.data["REPN"].toString();
        np = {
            CLS: Tmp_CLS,
            DITM: Tmp_DITM,
            REPN: Tmp_REPN,
        }
        console.log("np=", np);
//gridstore.reload(); 必需在 onload event - 讀完資料後, 才 findBy , 找到的index才會準 
        gridstore.reload();
        //gridstore.find("DITM", Tmp_DITM);

        gridstore.on('load', function () {
            console.log("inside onload");
            //若新增的資料在另一分頁, 則 reload()後, 無法找到 
            // --> 所以存檔時,即時更新 store的欄位值 , 不重新 reload() & 不locate 剛才編輯的資料
            var Tmp_index = gridstore.findBy(function (record, id) {
                var Tmp_bol = true;
                //console.log("record.data[CLS].toString()", record.data["CLS"].toString());
                //console.log("record.data[DITM].toString()", record.data["DITM"].toString());
                //console.log("record.data[REPN].toString()", record.data["REPN"].toString());
                Tmp_bol = record.data["CLS"].toString() == Tmp_CLS
                    && record.data["DITM"].toString() == Tmp_DITM
                    && record.data["REPN"].toString() == Tmp_REPN;
                console.log("Tmp_bol=", Tmp_bol);
                return Tmp_bol;   // true : 有找到
            });

            console.log(" index =", Tmp_index);
            cur_rec = gridstore.getAt(Tmp_index);
            Ext.getCmp("grid_Single").getSelectionModel().select(cur_rec);
            console.log(" Ext.getCmp(grid_Single).getSelectionModel().select(cur_rec); " );
        });
        console.log("after  onload ");
        //datastore.ITM欄位值設為 MAXITM
        //mysuccessalert("btn_save click");
    });



2022年7月31日 星期日

V80C02 - 匯出 – c# & js - 格式化小數2位 , 格式化日期, -toString() -color - 粗體文字 - 欄位屬性 - null.length null.toString 均會 Error

 目的: 匯出 XLS檔案, 若 [標準工時][已報工時] – 若空白,則顯示 0.00 , 格式化小數2位

處理說明:  一 *.cs  Substring,ToString()

                         1>Double.Parse(dt.Rows[i]["STDHRS"].ToString("0.00"));

                         2>DateTime.Parse(Tmp_dt.Rows[i]["BRDT"].ToString()).ToString("yyyy/MM/dd"); 

                          --> myfunc.Date2Str(Tmp_dt.Rows[i]["BRDT"].ToString());  

                                //日期格式 yyyy/mm/dd

                             DateTime.Now.ToString("yyyy/MM/dd");
                             string Tmp_TATM = DateTime.Now.ToString("yyyy/MM/dd  hh:mm:ss");

                         3>Tmp_Str.Substring(pos,len);

                              //去除尾碼;   

                               -->    Tmp_Str=Tmp_Str.Substring(Tmp_Str.Length-1,1);

                        4>var Tmp_int=3;   Tmp_int.ToString();

                        5>日期加 1天   Datetime.AddDays
                              DateTime.Now.AddDays(1).ToShortDateString();
  
Tmp_APDT2 = string.Format("{0:yyyy/MM/dd}", DateTime.Parse(nvc["s_APDT2"]).AddDays(1));

                  

二. *.js  substring , substr,toString(), trim()

                        1> par_format = 'Y/m/d  H:i';  //日期格式    yyyy/mm/dd  hh/mm ,                                                                Tmp_DateStr = Ext.Date.format(new Date(par_date), par_format);

{ header: "執行時間", dataIndex: "TATM", width: 150, sortable: false, TMType: "date", renderer: Ext.util.Format.dateRenderer('Y/m/d H:i') },

                       2>Tmp_Str.substring(pos1,pos2);
                           Tmp_Str.substr(pos1,len);        
                                  Ex:  
                                  string  Tmp_Str="goodboy";                              
                                  Tmp_Str=Tmp_Str.substring(0,3);  //  Tmp_Str=good
                                  Tmp_Str=Tmp_Str.substr(0,2);       //  Tmp_Str=go

                       3>var Tmp_int=24;  //將數字轉成字串
                            mysuccessalert(Tmp_int.toString())          ;
                       
                      4>將文字轉成數字  Number(Tmp_Str)
                           var Tmp_Str="24";
                           Tmp_int=Number(Tmp_Str);     
                      
                      5>設定文字顏色                
                               {
                                    xtype: "label", text: "(請刷識別證)", width: 120, border: 2, 
                                    style: "font-size: 12pt; color: blue; background:  gray; ",
                                },             
                    6>  - 粗體字體
                        var cmp_TAMAN_lbl = get_cmp_lbl0("(請刷識別證)", 130);    
                        cmp_TAMAN_lbl.style = "font-size: 12pt; color: blue; ";
                        cmp_TAMAN_lbl.margin = "0 0 0 10";

                    7>判斷是否null
                          if (checkisnull(cur_rec)) {
                            mysuccessalert("空值 ")          ;    
                          } 
                         --.>  undefined
                                if  (par_str == '')  ||
                                    (typeof (par_str) == 'undefined')  ||
                         --.> 判斷空Object {} 
                                if  (typeof (par_str) == 'object') && (Object.keys(par_str).length === 0)
 
                 6> null.toString()  --> Error , rec["MATNR"].toString()  --> Error
                      所以先 rec2str(rec); 將 null 欄位值轉成 ''
                 7> par_str=0 , 則 par_str == '', true,   ---> 需注意 
                      --> 需改成  if (par_str==='') , false --> 正確   
                 8>type of  日期  --> Object 
                     checkisnull(日期)  --> 會傳回 true
                     -->         if ((typeof (par_str) == 'object') && (Object.keys(par_str).length === 0))
                                   return true;
                     --> 所以判斷日期空白,不用 checkisnull , 改用 if  (par_date.length==0)  {}
                    DatetoStr(cnow(),"Y/m/d")  
                    Tmp_DT = DatetoStr(now, "Y/m/d");

                9>設定 HTML欄位屬性  - setFieldsCls
                    setFieldsCls('mySubFormE',
                                           [],  //required
                                            ['sub_DELMAN','sub_TASKNO', 'sub_RQMAN', 'sub_RQDT', 
                                       _RQDEP', 'sub_STLC', 'sub_EDLC', 'sub_TASKREMARK',],//readonly
                                       ['sub_DELCAUSE']);

               10>判斷字串是否為數字: isNaN(Number(par_SAPNO, 10))
                    if (isNaN(Number(par_SAPNO, 10))) {
                          return par_SAPNO;                                           //QDR工單/ICSU工單
                       }
                   else 
                        return par_ORStr + "0000" + par_SAPNO;    //一般工單
              11>string.trim()
                     if (Tmp_C_UNIT.trim() != "")

三.*.js   - null 
      null.toString()  null.length 均會有問題
       所以欄位.toString()  欄位.length 時必需先過濾 欄位值==null 
      
     function DatetoStr(par_date, par_format) {
           if (checkisnull(par_date)) {
              return "";
          }
      }
       
       myfunc.js                              
       nulltoStr(par_Fld) ,

一. c#  *.cs

1>sheet1.Range[myfunc.GetExcelPos(6, i + 1)].Text = 
    Double.Parse(dt.Rows[i]["STDHRS"].ToString("0.00"))
   //另一方法 String.Format("{0:0.00}", Double.Parse(dt.Rows[i]["STDHRS"].ToString()));


if (myfunc.checkisnull(dt.Rows[i]["ALSHR_"].ToString()))
    { sheet1.Range[myfunc.GetExcelPos(7, i + 1)].Text = "0.00"; }
else
    {
      sheet1.Range[myfunc.GetExcelPos(7, i + 1)].Text = 
             Double.Parse(dt.Rows[i]["ALSHR_"].ToString("0.00"));
      //                String.Format("{0:0.00}", Double.Parse(dt.Rows[i]["ALSHR_"].ToString()));
     }


2>格式化日期:
    sheet1.Range[myfunc.GetExcelPos(0, i + 1)].Text =
           DateTime.Parse(dt.Rows[i]["DT"].ToString("yyyy/MM/dd"));
         //另一方法 :String.Format("{0:yyyy/MM/dd}", DateTime.Parse(dt.Rows[i]["DT"].ToString()));


3>格式化時間: 
    Tmp_MKTM = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");

   if (Tmp_dt.Rows[i]["BRDT"].ToString().Length > 0)
       Tmp_BRDT = DateTime.Parse(Tmp_dt.Rows[i]["BRDT"].ToString()).ToString("yyyy/MM/dd");
   else
       Tmp_BRDT = "";

4>NEXT PK: 流水號+1  - string.SubString(pos,length)
     Tmp_NEXT_ASPNO = Tmp_ASPNO + (int.Parse(Tmp_MAX_ASPNO.Substring(11, 3))+1).ToString("000");



二.*.js  - 格式化日期 YYYYMMDD

 1>>*.js   

       Ext.Loader.loadScript({    url: '../Scripts/tlsbase.js'  });  // for  logininfo.id
        np["ASPNO"] = "ASP" + DatetoStr(now, "Ymd");
        var Tmp_cur_DT = DatetoStr(cnow(), "Y/m/d");  
        
        var Tmp_MKER = loginInfo.id;
        var Tmp_MKDT = DatetoStr(now, "Y/m/d");  
        Ext.getCmp("MKER").setValue(Tmp_MKER);
        Ext.getCmp("MKDT").setValue(Tmp_MKDT);

function DatetoStr(par_date,par_format) {
    var Tmp_DateStr;
    if (checkisnull(par_format))
        par_format = 'Y/m/d';  //日期格式    Y/m/d : yyyy/mm/dd   ,       Ymd: yyyymmdd
    Tmp_DateStr = Ext.Date.format(new Date(par_date), par_format);
    return Tmp_DateStr;
}

{ header: "執行時間", dataIndex: "TATM", width: 150, sortable: false, TMType: "date", renderer: Ext.util.Format.dateRenderer('Y/m/d H:i') },


2>Tmp_Str.substring(startpos,endpos)
              .substr(startpos,length)

    string  Tmp_Str="goodboy";
    Tmp_Str=Tmp_Str.substring(0,3);  //  Tmp_Str=good
    Tmp_Str=Tmp_Str.substr(0,2);       //  Tmp_Str=go
  

3>字串轉數字
Number(Tmp_Str);
Number("30");

4>字串是否在長字串中stringObject.indexOf(searchvalue,fromIndex)
     let myStr = "A012";
     myStr.indexOf("[",0); /* -1 沒有找到 */

三. *.cs
1>字串轉數字

int Tmp_cnt=int.Parse(myfunc.SqlValue(Tmp_Sql));

2>trim 字串
var Tmp_Str="ABC  ";
Tmp_Str.Trim();  //--> "ABC"

2>判斷字串是否為數字
public static string get_SAPNO(string par_SAPNO,string par_ORStr="")

 int n;
bool isNum = int.TryParse(par_SAPNO, out n);
 if (isNum)
    return par_SAPNO;
 else 
    return par_ORStr + "0000" + par_SAPNO;

2022年7月29日 星期五

V80C02 - 自訂SQL 取得 CaluField 欄位值

 目的: 自訂SQL 取得 CaluField 欄位值 ,  不用 getKeyCode

 處理說明: 由於 CaluField 欄位不是由單一欄位值取得, CaluField 欄位

                   必需自行組合 SQL , 取得欄位值



1>*.cs 
public dynamic getGridData_M()
{
            
            cmd.CommandText = Tmp_Sql;
            string countSql = " SELECT COUNT(*) as total FROM (" + Tmp_Sql + ")";
            DataSet ds = getDataTable(cmd, countSql);

            //STEP2: ds.Tables["T1"].rows  新增 column欄位值
            //自訂  CaluField 欄位  - [報工工時(ALSHR_)]
            //取得報工工時  -- JCN+DT+EMPLYID+MOSM , 工號+施工日期+ 施工人員+主步序            
            ds.Tables["T1"].Columns.Add("ALSHR_", typeof(object));           //報工工時 ALSHR_
            
            string Tmp_Val = "";  //欄位值 以 ; 分隔
            string Tmp_SAPNO = "",Tmp_DT,Tmp_EMPLYID,Tmp_MOSM;
            string Tmp_ALSHR_;

            foreach(DataRow row in ds.Tables["T1"].Rows)
            {
                Tmp_SAPNO = row["SAPNO"].ToString();
                Tmp_DT = myfunc.DatetoStr(DateTime.Parse(row["DT"].ToString()));
                Tmp_EMPLYID = row["EMPLYID"].ToString();
                Tmp_MOSM = row["MOSM"].ToString();
                //若為一般工單(非 QDR('F') 或  ILIAS工單('V') ), 則 SAP工號+'0000"              \
                if (Tmp_SAPNO.Length > 0)
                {
                    Tmp_SAPNO = myfunc.get_SAPNO(Tmp_SAPNO);                        
                    //自訂 SQL , 取得 CaluField 欄位值 
                    Tmp_Sql = " SELECT  JCN, WORK_ID, round((sum(HOUR_WORK)+sum(HOUR_OT))/60,2)  WCHR  "
                                    + " FROM  "
                                    + "  (  SELECT  JCN, ACT, WC, HOUR_WORK, WORK_ID, HOUR_OT "
                                         + " FROM   HOUR.ALS_HOUR_COMP@ALS_HOUR  "
                                         + " WHERE  JCN = " + myfunc.AA(Tmp_SAPNO)
                                         + " AND       substr(ACT, 1, 1) = " + myfunc.AA(Tmp_MOSM)
                                         + " AND        WORK_ID = " + myfunc.AA(Tmp_EMPLYID)
                                         + " AND        DATA_DATE =" + myfunc.AA(Tmp_DT)
                                         + " UNION  ALL "
                                         + " SELECT  JCN, ACT, WC, HOUR_WORK, WORK_ID, HOUR_OT  "
                                         + "  FROM   HOUR.ALS_HOUR_COMP_HISTORY@ALS_HOUR "
                                         + " WHERE  JCN = " + myfunc.AA(Tmp_SAPNO)
                                         + " AND       substr(ACT, 1, 1) = " + myfunc.AA(Tmp_MOSM)
                                         + " AND        WORK_ID = " + myfunc.AA(Tmp_EMPLYID)
                                         + " AND        DATA_DATE =" + myfunc.AA(Tmp_DT)
                                  + " ) "
                                  + "  GROUP BY  JCN, WORK_ID ";
                    Tmp_Val = myfunc.SqlValue(Tmp_Sql);
                    if (Tmp_Val.Length > 1)
                    {
                        row["ALSHR_"] = myfunc.StrExtract(Tmp_Val, 3);    //報工工時
                    }
                }  // end of   if (Tmp_SAPNO.Length > 0)
            }  // end of  foreach (DataRow row in ds.Tables["T1"].Rows)

            return ds;

}