2026年10月5日 星期一

V60202Q – Grid欄位顏色- 欄位允許編輯 –依欄位值,設定字體顏色 -Grid顏色

 目的: V60202Q – Grid欄位顏色- 欄位允許編輯 –依欄位值,設定字體顏色

處理說明: 1>



1>*.js
{
header: "領用數量", dataIndex: "USED_QTY", width: 100, sortable: false, TMType: "string",
style: 'color: blue;',
editor: { xtype: 'textfield',  },
},

var sub_Grid = Ext.create('TMGrid', {
grid_id: 'sub_Grid',
columns: sub_Columns_V60202Q,
//autoScroll: true,
flex: 1,
store: Ext.create('gridstore', { model: sub_model_V60202Q }),
plugins: [
    Ext.create('Ext.grid.plugin.CellEditing', { // 不會出現[Update][Cancel]鈕, 直接編輯
                     clicksToEdit: 1, // 按一下進行編輯,預設為按兩下
                     clicksToMoveEditor: 1, 
            //在編輯模式下切換編輯另一行的行為1表示點選一就切換; //2表示點2下才切換。
})],
});

2>V80202.js -  依欄位值,設定字體顏色

{header:"是否曾展BOM",dataIndex:"ISBOMIN",width:100,sortable:false,TMType:"string"},
{
header: "
停工中", dataIndex: "ISSTOP", width: 60, sortable: false, TMType: "string",

style: 'color: blue;'   ,  // 設定標題文字顏色

// 設定欄位值.顏色
renderer
: function (value) {
if (value == "Y") {
    return "<span style='color:red'>" + value + "</span>";
}
else {
return value;
}}},
{header:"
專案委託人",dataIndex:"PJER",width:100,sortable:false,TMType:"string"},

V60202QA – 新增 store 資料 – store 自行定義欄位 –store.add(np);

 目的:V60202QA – 新增 store 資料 – store 自行定義欄位 –store.add(np);

處理說明: 1>  var np = {};
                        np["MATNR"] = Tmp_MATNR;
                        np["WH"] = Tmp_WH;
                        np["SP"] = Tmp_SP;
                                  :
                  2>Ext.getCmp('sub_Grid').store.add(np)  ;
                       --> 自動依 np 的欄位名稱值, 寫入對應的 store 欄位名稱


1>*.js
{
xtype: 'button', text: '確定', id: 'OkBtn_V60202QA',
listeners: {
click: function (me, e, eOpts) {
//[確定]鈕,將, 將目前 件號 + 庫存 + 儲存位置"不存在 store, 則顯示子視窗,
// { name: "MATNR" }, { name: "WH" }, { name: "SP" }, { name: "NAME" },
//{ name: "SQTY" }, { name: "USED_QTY" },
//{ name: "UNIT" }, { name: "CLASS" }, { name: "CLASS_" },
//出現子畫面, 輸入[領用數量]後,再加入 store
var Tmp_USED_QTY = Ext.getCmp("sub1_QTY").getValue();
var Tmp_MATNR = par_MATNR;
var Tmp_WH = par_WH;
var Tmp_SP = par_SP;
var np = {};
np["MATNR"] = Tmp_MATNR;
np["WH"] = Tmp_WH;
np["SP"] = Tmp_SP;
//STEP1: 檢核 件號.標準工時檔(AMM_PNTMSHT)是否已存在 , 若不存在,則顯示訊息後, 離開
var Tmp_url = '../../api/V60202QAAPI/get_data_MATNR_WH_SP';
var Tmp_RtnStr = getUrlStr(Tmp_url, np, "取得MATNR+WH+SP相關資料(名稱,剩餘數量,單位,類別,類別名稱)");
if (checkRtnOK(Tmp_RtnStr)) {
      np["UNIT"] = StrExtract(Tmp_RtnStr, 4);
      np["SQTY"] = StrExtract(Tmp_RtnStr, 5);
      np["USED_QTY"] = Tmp_USED_QTY; //領用數量
      np["NAME"] = StrExtract(Tmp_RtnStr, 6);
      np["CLASS"] = StrExtract(Tmp_RtnStr, 7);
      np["CLASS_"] = StrExtract(Tmp_RtnStr, 8);
Ext.getCmp('sub_Grid').store.add(np);
Ext.getCmp("sub_MATNR").setValue("");
//離開前,關閉本子畫面
Ext.getCmp("CancelBtn_V60202QA").fireEvent('click', Ext.getCmp("CancelBtn_V60202QA"));
//return ;
}
else {
mywarnalert(Tmp_RtnStr);
//離開前,關閉本子畫面
Ext.getCmp("CancelBtn_V60202QA").fireEvent('click', Ext.getCmp("CancelBtn_V60202QA"));
//return ;
}
} //end of click
} // end of listener
},


//sub_Grid 的欄位名稱 
//--> Ext.getCmp('sub_Grid').store.add(np);  
//--> store.add(np)  , 會自動依 np.欄位名稱 ,填入 store 相對應的欄位值
var sub_model_V60202Q = [
{ name: "MATNR" },
{ name: "WH" },
{ name: "SP" },
{ name: "NAME" },
{ name: "SQTY" },
{ name: "USED_QTY" },
{ name: "UNIT" },
{ name: "CLASS" },
{ name: "CLASS_" },
];

2026年10月4日 星期日

V60202Q – [現場領用] – blue event 被觸發兩次 - 由 eOpts 過濾

目的: V60202Q – [現場領用] – blue event 被觸發兩次    (1>按Enter , 2>開啟子畫面)

處理說明:  1>按[Enter]鍵時, 程式觸發 blur  event   
                        --> 開啟子畫面(輸入領用數量) , eOpts=undefined
                   2>開啟子畫面時,又觸發 blur event 一次  
                       --> 又開啟子畫面,導致子畫面排版不對  , eOpts 非空白
                   3>只需觸發一次(eOpts=undefined) 



1>*.js
//輸入[物料編號]&[庫房]&[儲存位置]後 , 加入  store       
    //blur 會被觸發 2 次,以致 V60202QA 被呼叫兩次, --> 子畫面排版不對
    Ext.getCmp("sub_MATNR").on('blur', function (me, eOpts) {
        ////STEP1 將BarCode碼([物料編號]&[庫房]&[儲存位置]) 轉成 [物料編號],[庫房],[儲存位置]
        var Tmp_Str = Ext.getCmp("sub_MATNR").getValue();
        if (checkisnull(Tmp_Str))
            return;
        //因為 blur 會被呼叫兩次, 子畫面重複出現兩次,所以子畫面排版不對, 
        //  e.getKey() === e.ENTER   --> eOpts = undefined , 才執行, 
        // 若其他的  trigger event , 不重複執行
        if (eOpts != undefined)
            return;
        var Tmp_MATNR = StrExtract(Tmp_Str, 1, "&");
        var Tmp_WH = StrExtract(Tmp_Str, 2, "&");
        var Tmp_SP = StrExtract(Tmp_Str, 3, "&");
        var gridstore = Ext.getCmp("sub_Grid").store;
        //檢核  [物料編號]&[庫房]&[儲存位置]  是否已存在  store
        //若存在,則傳回 index, 否則傳回 -1
        var Tmp_index = gridstore.findBy(function (rec, id) {
            var Tmp_bol = true;
            Tmp_bol = rec.data["MATNR"].toString() == Tmp_MATNR
                && rec.data["WH"].toString() == Tmp_WH
                && rec.data["SP"].toString() == Tmp_SP;
            return Tmp_bol;   // true : 有找到
        });
        //若已存在,則顯示訊息"件號+庫存+儲存位置已存在,不可重覆"
        //若不存在,則將"件號+庫存+儲存位置+..", 加入 store
        if (Tmp_index > -1) {
            Tmp_Str = "件號(" + Tmp_MATNR + ")<br>"
                + "庫房(" + Tmp_WH + ")<br>"
                + "儲存位置(" + Tmp_SP + ")<br>"
                + "已存在,不可重覆挑選<br>"
                + "請檢核!!<br>";
            mywarnalert(Tmp_Str);
            Ext.getCmp("sub_MATNR").setValue("");
            return;
        }
        else {   //將目前 件號+庫存+儲存位置"不存在 store, 則顯示子視窗,
            // { name: "MATNR" },            { name: "WH" },            { name: "SP" },            { name: "NAME" },            
            //{ name: "SQTY" }, { name: "USED_QTY" },
            //{ name: "UNIT" },            { name: "CLASS" },            { name: "CLASS_" },
            //出現子畫面, 輸入[領用數量]後,再加入 store
            console.log("CALL_V60202QA(Tmp_MATNR, Tmp_WH, Tmp_SP)", Tmp_cnt);
            console.log("me", me);
            console.log("eOpts", eOpts);
            CALL_V60202QA(Tmp_MATNR, Tmp_WH, Tmp_SP);
        }
    });  // end of  Ext.getCmp("sub_MATNR").on('blur', function (me, eOpts) {



2026年10月2日 星期五

V60202Q-[現場領用]鈕-識別證2員工編號 -SMS_AIDC -MSSQL -SQLSERVER - 按[ENTER]鍵 - 員工帳號 - CARDNO - SqlConnection - 輸入字元

 目的: V60202Q-[現場領用]鈕-刷識別證2員工編號 -  MSSQL -SQLSERVER - SQL SERVER

處理說明: 1>刷識別證2員工編號
                      myfunc.get_CARDNO2EMPLYID(par_CARDNO);
                   2>由 SQLServer 的 SMS_AIDC 取得資料
                         string Tmp_Sql = "  SELECT  TOP 1 PSNNO  "
                                                   + "  FROM    SMS_AIDC.dbo.V_CARD "
                                                  + " WHERE   CARDNO=" + myfunc.AA(Tmp_CARDNO);
                         DataSet ds = Tmp_BaseController.getDataTable_MSSQL("SMS_AIDC", Tmp_Sql);

                   3>判斷輸入的字元,是否 [ENTER]鍵
                        Ext.getCmp("sub_COMPER").on("specialkey", function (field, e) {
                                 if (e.getKey() === e.ENTER) {
                                 }
                       });  
 


1>*.js

//按[ENTER]時,咷至下一欄位
    Ext.getCmp("sub_COMPER").on("specialkey", function (field, e) {
        if (e.getKey() === e.ENTER) {
            //field.next().focus();            
            //Ext.getCmp("sub_COMPER").setValue("ABC");
            Ext.getCmp("sub_COMPER").fireEvent("blur", Ext.getCmp("sub_COMPER"));
            Ext.getCmp("sub_BKMG").focus();
        }
    });

 Ext.getCmp("sub_COMPER").on('blur', function (me, eOpts) {
        //STEP1 將[識別證卡號] 轉成 [員工編號]
        var Tmp_CARDNO = me.getValue();
        if (Tmp_CARDNO.length > 8) {
            console.log("卡號:", Tmp_CARDNO);
            var Tmp_EMPLYID = "";  //所有資料 PK 字串, 以 , 分隔
            var Tmp_EMPLYNM = "";
            var Tmp_url = "../../api/V60202QAPI/get_EMPLYID_EMPLYNM";
            var np = {};
            np["CARDNO"] = Tmp_CARDNO;
            var Tmp_Str = getUrlStr(Tmp_url, np, "識別證編號2員工編號");
            Tmp_EMPLYID = StrExtract1(Tmp_Str, 1);
            Tmp_EMPLYNM = StrExtract1(Tmp_Str, 2);
            if (checkRtnOK(Tmp_EMPLYID)) {
                me.setValue(Tmp_EMPLYID);
                Ext.getCmp("sub_COMPER_").setValue(Tmp_EMPLYNM);
            }
        }
        else {  //直接輸入帳號 
            Tmp_EMPLYID = Tmp_CARDNO;
            Tmp_EMPLYNM = getEmp_NM(Tmp_EMPLYID);
            Ext.getCmp("sub_COMPER_").setValue(Tmp_EMPLYNM);
        }
    });


2>*.cs  - myfunc.get_CARDNO2EMPLYID
//由識別證號碼取得員工帳號
        [HttpPost]
        public string get_EMPLYID_EMPLYNM()
        {
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            string Tmp_Str;
            string Tmp_CARDNO = nvc["CARDNO"];
            string Tmp_EMPLYID = myfunc.get_CARDNO2EMPLYID(Tmp_CARDNO);
            string Tmp_Sql = " SELECT  EMPLYNM "
                                      + " FROM    HR_EMPLYM "
                                      + " WHERE  EMPLYID=" + myfunc.AA(Tmp_EMPLYID);
            string Tmp_EMPLYNM = myfunc.SqlValue(Tmp_Sql);
            Tmp_Str = Tmp_EMPLYID + ";" + Tmp_EMPLYNM;
            return Tmp_Str;
        }  // end of get_EMPLYID


public static string get_CARDNO2EMPLYID(string par_CARDNO)
        {
            string Tmp_CARDNO = par_CARDNO;
            string Tmp_EMPLYID = "";
            BaseAPIController Tmp_BaseController = new BaseAPIController();
            try
            {
                string Tmp_Sql = "  SELECT  TOP 1 PSNNO  "
                                       + "  FROM    SMS_AIDC.dbo.V_CARD "
                                       + " WHERE   CARDNO=" + myfunc.AA(Tmp_CARDNO);
                DataSet ds = Tmp_BaseController.getDataTable_MSSQL("SMS_AIDC", Tmp_Sql);
                int Tmp_cnt = ds.Tables[0].Rows.Count;
                if (Tmp_cnt > 0)
                {
                    string Tmp_PSNNO = ds.Tables[0].Rows[0]["PSNNO"].ToString();                 
                    Tmp_EMPLYID = Tmp_PSNNO;                    
                }
                return Tmp_EMPLYID;
            }  // end of try 
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return Tmp_EMPLYID;
        }  // end of         public string get_CARDNO2EMPLYID(string par_CARDNO)

2026年10月1日 星期四

V60202Q – [領用人員] – 按[Enter]鍵時,跳至下一欄位 - key - 取得欄位新值(取得識別證的員工編號)

 目的: V60202Q – [領用人員] – 按[Enter]鍵時,跳至下一欄位

處理說明:   1> specialkey event :   有輸入字元時觸發 
                       Ext.getCmp("sub_COMPER").on("specialkey", function (field, e) {
                       if (e.getKey() === e.ENTER) {
                            //field.next().focus();
                            //本元件的欄位值,設成新值 
                            Ext.getCmp("sub_COMPER").setValue("ABC");
                            Ext.getCmp("sub_BKMG").focus();
                       }
                       });


1>*.js
    //按[ENTER]時,咷至下一欄位
    Ext.getCmp("sub_COMPER").on("specialkey", function (field, e) {
        if (e.getKey() === e.ENTER) {
            //field.next().focus();
            Ext.getCmp("sub_BKMG").focus();
        }
    });
 
    Ext.getCmp("sub_BKMG").on("specialkey", function (field, e) {
        if (e.getKey() === e.ENTER) {
            //field.next().focus();
            Ext.getCmp("sub_MATNR").focus();
        }
    });
 
    Ext.getCmp("sub_MATNR").on("specialkey", function (field, e) {
        if (e.getKey() === e.ENTER) {
            //field.next().focus();
            Ext.getCmp("sub_SAPNO").focus();
        }
    });

2026年9月30日 星期三

V80403 – 設定 TextField 的欄位名稱 – 字體大小 – 字體顏色 - font-size

 目的: V80403 – 設定 TextField 的欄位名稱 – 字體大小 – 字體顏色

處理說明: 1> //取得 text欄位(GPASS1).up.fieldcontainer
                          Ext.getCmp("GPASS1").up("fieldcontainer").labelStyle = "color: blue; font-size: 14px";


1>*.js
//取得 text欄位.up.fieldcontainer
Ext.getCmp("GPASS1").up("fieldcontainer").labelStyle = "color: blue; font-size: 14px";


V80403 –[子件無架構發工]鈕 - 呼叫 V20301 子功能畫面 -iframe

 目的: V80403 –[子件無架構發工]鈕   - 呼叫 V20301 子功能畫面
處理說明: 1> 呼叫 V20301  子功能畫面  
                       - 利用  HTML  <iframe src= ?FUNID  > 開啟子功能 Windows 畫面 
                              var ParamStr = "?FUNID=V20301&GAMMNO=" + Tmp_AMMNO + "&GPASS1=" + Tmp_GPASS1;
                         src="/Home/CenterTab' + ParamStr + '">
                  2>利用 location.search 取得傳入參數值(ParamStr)
                      var Values = GetURLParamValues(location.search);    
                  3>嵌入框架:<iframe> 是 HTML 標籤,用來在一個網頁裡嵌入另一個網頁。




1>V80403.js
[子件無架構發工]鈕: 呼叫函式 CALL_V20301_f_V40105(cur_rec);
  var cur_recs = Ext.getCmp('grid_Single').getSelectionModel().getSelection();
                    if (cur_recs.length == 0) {
                        mywarnalert("請先選擇資料(母AMM單號-AMMNO)");
                        return false;
                    }
                    cur_rec = cur_recs[0];
                    var Tmp_Str = "確認要新增目前AMM號(" + cur_rec.data["AMMNO"].toString() + ")<br>"
                        + "件號(" + cur_rec.data["AMMNO"].toString() + ")<br>"
                        + "的子件發工資料嗎?";
                    Tmp_Str=Tmp_Str.replace(/<br>/g, "\n");
                    var id = confirm(Tmp_Str);
                    if (id) {
                        CALL_V20301_f_V40105(cur_rec);
                    }    }          }


function CALL_V20301_f_V40105(cur_rec) {

     var Tmp_AMMNO = nulltoStr(cur_rec.data['AMMNO']).toString();
     var Tmp_GPASS1 = 'GPASS1'; //傳回AMMNO字串的欄位名稱
var ParamStr = "?FUNID=V20301&GAMMNO=" + Tmp_AMMNO + "&GPASS1=" + Tmp_GPASS1;
var win = new Ext.Window({
layout: 'fit',
id: 'win_V20301',
title: 'V20103',
closable: false,
closeAction: 'destroy',
modal: true, //有pick視窗時,下面的不能按
html: '<iframe id="ifrm" scrolling="auto" frameborder="0" width="100%" height="100%" src="/Home/CenterTab' + ParamStr + '"></iframe>',
buttons: [
{
id: 'btnClose1', text: '關閉',
handler: function () {
this.up('window').close();
}}]
});
win.setHeight(700);
win.setWidth(1200);
win.show();
};

2>V20301.js
[確認轉發]鈕 : 傳回 新產生的子AMM單號至 GPASS1 元件
//傳回V40105
var AMMNOStr; // ex: 格式要為'NO1'+','+'NO2', 不要是 AA('NO1')+','+AA('NO2')
if (Tmp_isV40105) {
Tmp_AMMNO_Str = Tmp_Obj["Rtn_Msg"];
AssignParentValue_v([Tmp_GPASS1], [Tmp_AMMNO_Str]); //傳回的 AMMNOStr 至 GPASS1元件 CloseChildWin();
}