2023年12月26日 星期二

V30702B –mysuccessalert – firehandle -getUrlStr -顯示訊息,使用者按[確認]鈕後,才重顯示資料

 目的: V30702B –mysuccessalert – firehandle -顯示訊息,使用者按[確認]鈕後,才重顯示資料

處理說明: 1>顯示[確認]訊息,且使用者按[確認]鈕,才重新顯示資料
                       var np = {}
                       np["TASKNO"] = cur_rec.data['TASKNO'].toString();
                       var Tmp_url = '../../api/V30702BAPI/UPDATE_STA';
                       var Tmp_RtnStr = getUrlStr(Tmp_url, np, "結案處理 - 單況更新");
                       if (checkRtnOK(Tmp_RtnStr)) {
                           mysuccessalert(Tmp_RtnStr, function () {
                                          Ext.getCmp('btn_Show').fireHandler(); //重新顯示 Master資料
                                         })
                           }



1>*.js
//[結案]鈕 -  - 只更新資料,無子畫面
function Call_V30702B() {
    var cur_recs = Ext.getCmp('grid_Single').getSelectionModel().getSelection();
    var cur_rec;
    if (cur_recs.length == 0) {
        buttonModel.modelType = 0;
        mywarnalert('請先挑選[結案]的地裝派遣資料!!');
    }
    else {
        cur_rec = cur_recs[0];
        var Tmp_msg = "結案後<br>"
                                 +"目前簽入中的派遣單單況將自動簽出<br>"
                                 +"確定執行[結案]嗎 ?<br>"
                                 +"(地裝派遣單號: " + cur_rec.data['TASKNO'].toString() + ")<br>";
        myconfirmalert(Tmp_msg, callBackFunc);
        function callBackFunc(id) {
            if (id == 'yes') {
                console.log("cur_recs.length:", cur_recs.length);                
                var np = {}
                np["TASKNO"] = cur_rec.data['TASKNO'].toString();
                var Tmp_url = '../../api/V30702BAPI/UPDATE_STA';
                var Tmp_RtnStr = getUrlStr(Tmp_url, np, "結案處理 - 單況更新");
                if (checkRtnOK(Tmp_RtnStr)) {
                    mysuccessalert(Tmp_RtnStr, function () {
                        Ext.getCmp('btn_Show').fireHandler();  //重新顯示 Master資料
                    })                    
                }


V30702C – -focus - blur -識別證刷卡後,加入store 且 輸入欄位,重新FOCUS - blur - store - 新增資料

目的: V30702C – 識別證刷卡後,加入store 輸入欄位,重新FOCUS

處理說明: 1> ( [boolean], [delay] ) : Ext.ComponentCHAINABLE

                         Try to focus this component.                            

                       Ext.getCmp("sub_TAMAN").focus(false, 20);
                           --> true to also select the text in this component
                           -->Delay the focus this number of milliseconds (true for 10 milliseconds).  
                  2> on blue event
                       Ext.getCmp("sub_TAMAN").on('blur', function (me, eOpts) {
                     


1>*.js
    Ext.getCmp("sub_TAMAN").on('blur', function (me, eOpts) {
        //STEP1 將[識別證卡號] 轉成 [員工編號]
        var Tmp_CARDNO = me.getValue();
        console.log("卡號:", Tmp_CARDNO);
        var Tmp_EMPLYID = "";  //所有資料 PK 字串, 以 , 分隔
        var Tmp_EMPLYNM = "";
        var Tmp_url = "../../api/V30702CAPI/get_EMPLYID_EMPLYNM";
        var np = {};
        np["CARDNO"] = Tmp_CARDNO;
        var Tmp_Str = getUrlStr(Tmp_url, np, "識別證編號2員工編號");
        Tmp_EMPLYID = StrExtract(Tmp_Str, 1);
        Tmp_EMPLYNM = StrExtract(Tmp_Str, 2);
        if (checkRtnOK(Tmp_EMPLYID)) {
            me.setValue(Tmp_EMPLYID);
            Ext.getCmp("sub_TAMAN_").setValue(Tmp_EMPLYNM);
        }
        if (Tmp_EMPLYID.length == 0)
            return;
        //STEP2 將[執行人員] [執行人員姓名 ]- 寫入  sub_Grid
        var Tmp_TASKNO = Ext.getCmp('sub_TASKNO').getValue();
        var sub_Store_np = {
            TAMAN: Tmp_EMPLYID,
            TAMAN_: Tmp_EMPLYNM,            
        }
        //Ext.getCmp('sub_Grid').store.add(sub_Store_np);
        var find_rec = Ext.getCmp('sub_Grid').store.findRecord('TAMAN', Tmp_EMPLYID);
        //若目前資料不存在 store , 才加入  store
        if (checkisnull(find_rec)) {            
            //檢查目前使用者是否已在目前派遣單中(TASKNO)簽入
            var Tmp_url = "../../api/V30702CAPI/is_EMPLYID_checkined";
            var np = {};
            np["EMPLYID"] = Tmp_EMPLYID;
            np["TASKNO"] = Tmp_TASKNO;
            var Tmp_YN = getUrlStr(Tmp_url, np, "檢查人員是否已在派遣單checked");            
            if (Tmp_YN == "Y") {
                var Tmp_Str = "員工編號(" + Tmp_EMPLYID + ")<br>"
                    + "員工姓名(" + Tmp_EMPLYNM + ")<br>"
                    + "已在派遣單單號(" + Tmp_TASKNO + ")簽入<br>"
                    + "不可重複簽入<br>"
                    + "敬請檢核!!<br>";
                mywarnalert(Tmp_Str);
            }
            else {
                Ext.getCmp('sub_Grid').store.add(sub_Store_np);
            }                
        }
        else {
            var Tmp_Str = "員工編號(" + Tmp_EMPLYID + ")<br>"
                + "員工姓名(" + Tmp_EMPLYNM + ")<br>"
                + "已挑選<br>"
                + "不可重複挑選<br>"
                + "敬請檢核!!<br>";
            mywarnalert(Tmp_Str);
        }
        Ext.getCmp("sub_TAMAN").setValue("");
        Ext.getCmp("sub_TAMAN_").setValue("");
        Ext.getCmp("sub_TAMAN").focus(false, 20);
    }  // end of function(me,eOpts)
    );        // end of blur function)


2023年12月25日 星期一

V30702A – [收單執行]鈕 – 刷識別證 – store 資料重複,則不允許加入 store

 目的: V30702A – [收單執行]鈕 – 刷識別證 – store 資料重複,則不允許加入 store



處理說明: 1>Ext.getCmp('sub_Grid').store.findRecord(欄位名稱, 欄位值);
                      Ex:
                           var find_rec= Ext.getCmp('sub_Grid').store.findRecord('TAMAN', Tmp_EMPLYID);
                           if (checkisnull(find_rec)) { } else 



1>*.js
//STEP2 將[執行人員] [執行人員姓名 ]- 寫入  sub_Grid
        var sub_Store_np = {
            TAMAN: Tmp_EMPLYID,
            TAMAN_: Tmp_EMPLYNM,            
        }
        var find_rec = Ext.getCmp('sub_Grid').store.findRecord('TAMAN', Tmp_EMPLYID);
        //若目前資料不存在 store , 才加入  store
        if (checkisnull(find_rec)) {
            //var Tmp_find_EMPLYID = find_rec.get("TAMAN");
            Ext.getCmp('sub_Grid').store.add(sub_Store_np);
        }
        else {
            var Tmp_Str = "員工編號(" + find_rec.data["TAMAN"].toString() + ")<br>"
                + "姓名(" + find_rec.data["TAMAN_"].toString() + ")<br>"
                + "已存在<br>"
                +"不可重複挑選<br>"
                + "敬請檢核!!<br>";
            mywarnalert(Tmp_Str);
        }
        Ext.getCmp("sub_TAMAN").setValue("");
        Ext.getCmp("sub_TAMAN_").setValue("");
    }  // end of function(me,eOpts)


2023年12月21日 星期四

V30701A –selectionchange 依目前資料.單況 控制按鈕 - Enabled/Disabled -datachange 時 - 按鈕.Enabled - selectionchange

目的: V30701A –selectionchange 依目前資料.單況 控制按鈕  - Enabled/Disabled 
處理說明:  1>grid.selectionchange Event 
                       Ext.getCmp("grid_Single").on('selectionchange', function (me, eOpts) {
                           var cur_recs = Ext.getCmp('grid_Single').getSelectionModel().getSelection();
                           if (cur_recs.length == 0) {
                                Ext.getCmp('Btn_V30702A').setDisabled(true);  // A:收單執行
                                Ext.getCmp('Btn_V30702B').setDisabled(true);  // B:結單


1>*.js
 Ext.getCmp("grid_Single").on('selectionchange', function (me, eOpts) {
        var cur_recs = Ext.getCmp('grid_Single').getSelectionModel().getSelection();
        if (cur_recs.length == 0) {
            Ext.getCmp('Btn_V30702A').setDisabled(true);  // A:收單執行
            Ext.getCmp('Btn_V30702B').setDisabled(true);  // B:結單
            Ext.getCmp('Btn_V30702C').setDisabled(true);  // C: 派遣單簽入
            Ext.getCmp('Btn_V30702D').setDisabled(true);  // D: 派遣單簽出
        }
        else {
            Ext.getCmp('Btn_V30702A').setDisabled(true);  // A:收單執行
            Ext.getCmp('Btn_V30702B').setDisabled(true);  // B:結單
            Ext.getCmp('Btn_V30702C').setDisabled(true);  // C: 派遣單簽入
            Ext.getCmp('Btn_V30702D').setDisabled(true);  // D: 派遣單簽出
            var cur_rec = cur_recs[0];
            var Tmp_STA = cur_rec.data['STA'].toString();
            switch (Tmp_STA) {            
                case "B": {
                    Ext.getCmp('Btn_V30702A').setDisabled(false);  // A:收單執行
                    break;
                }
                case "C": {
                    Ext.getCmp('Btn_V30702B').setDisabled(false);  // B: 結單
                    Ext.getCmp('Btn_V30702C').setDisabled(false);  // C: 派遣單簽入
                    Ext.getCmp('Btn_V30702D').setDisabled(false);  // D: 派遣單簽出
                    break;
                }   
                default: {
                    if ((Tmp_STA != "A") && (Tmp_STA != "Z") && (Tmp_STA != "X") )
                       Ext.getCmp('Btn_V30702E').setDisabled(false);  // E: 撤銷
                }
            } //  end of switch            

        }
    }); //  // end of datachanged


2>V20305E.js

 Ext.getCmp('grid_M').on("selectionchange", function (view, selections, options) {
        var np = s_JSON('s_form'); //TMFunction.js, 組合form上的查詢條件為json參數傳遞
        //console.log("Ext.getCmp('s_STAT') : ", Ext.getCmp('s_STAT'));
        var gridstore = Ext.getCmp('grid_D').store;        
        var cur_recs = Ext.getCmp('grid_M').selModel.getSelection();
        if (cur_recs.length == 0) {
            //Tmp_Str = "請先選擇要查詢的資料<br>";
            //mywarnalert(Tmp_Str);
            return;
        }
        var Tmp_REQMAF = nulltoStr(cur_rec.data["REQMAF"]).toString();
        if (Tmp_REQMAF == 'Y') {
            Ext.getCmp("btn_V20305E").setDisabled(false);
        }
        else {
            Ext.getCmp("btn_V20305E").setDisabled(true);
        }
}) 



V30701A - 訉息- mysuccessalert - myconfirmalert -mywarmalert – 按[確定]鈕後,再繼續往下執行(關閉子視窗)

 目的: V30701A – 回覆訊息,[確定]鈕後,再繼續往下執行(關閉子視窗 & 主畫面重新顯示)

處理說明:  1> Ext.MessageBox.alert(par_title, par_msg, par_fn())
                       Ext.MessageBox.alert("訊息", rtn_Str, function () {
                            Ext.getCmp("btn_Show").fireHandler();
                            Ext.getCmp("sub_V30702A_CancelBtn").fireHandler();
                          });
                   2> mysuccessalert(rtn_Str, function () {
                             Ext.getCmp("btn_Show").fireHandler();
                             Ext.getCmp("sub_V30702A_CancelBtn").fireHandler();
                         });    
         
                  3> 詢問[確定][取消] 鈕 - Ext.Msg.confirm('提醒', Tmp_msg, callBackFunc); 
                        var Tmp_msg = "確定執行[申請單送出]嗎 ? (派遣申請單號:" 
                                               + cur_rec.data['TASKNO'].toString() + ")";
                        Ext.Msg.confirm('提醒', Tmp_msg, callBackFunc); 
                        function callBackFunc(id) {
                               if (id == 'yes') {
       




1>V30702A.js
    var Tmp_DataString = JSON.stringify(Tmp_DataAry);
    var np = {}; 
    np["sub_TASKNO"] = Ext.getCmp("sub_TASKNO").getValue();
    np["sub_DataString"] = Tmp_DataString;
    //np["DataAry_JSON"] = JSON.stringify(par_DataAry);
    var Tmp_url = "../../api/V30702AAPI/INSERT_AMM_DSPHCARD";  //
    var rtn_Str = getUrlStr(Tmp_url, np, "收單執行");
    console.log("rtn_Str:", rtn_Str);
    if (checkRtnOK(rtn_Str))         
        //顯示訊息&使用者按確定後,才往下執行
        Ext.MessageBox.alert("訊息", rtn_Str, function () {
            Ext.getCmp("btn_Show").fireHandler();
            Ext.getCmp("sub_V30702A_CancelBtn").fireHandler();
        })

   -->精簡寫法
       mysuccessalert(rtn_Str, function () {
        Ext.getCmp("btn_Show").fireHandler();
        Ext.getCmp("sub_V30702A_CancelBtn").fireHandler();
    });    
    
     mywarnalert(rtn_Str, function () {
        Ext.getCmp("btn_Show").fireHandler();
        Ext.getCmp("sub_V30702A_CancelBtn").fireHandler();
    });    


2>V30701A.js
    cur_rec = cur_recs[0];
        var Tmp_msg = "確定執行[申請單送出]嗎 ? (派遣申請單號:" 
                               + cur_rec.data['TASKNO'].toString() + ")";
        //Ext.Msg.confirm('提醒', Tmp_msg, callBackFunc);
        myconfirmalert(Tmp_msg, callBackFunc);

        function callBackFunc(id) {
            if (id == 'yes') {
                console.log("cur_recs.length:", cur_recs.length);        
                var np = {}
                np["TASKNO"] = cur_rec.data['TASKNO'].toString();
                var Tmp_url = '../../api/V30701AAPI/UPDATE_STA',
                var rtn_Str = getUrlStr(Tmp_url, np, "申請單送出");
                console.log("rtn_Str:", rtn_Str);
                if (checkRtnOK(rtn_Str))                    
                    mysuccessalert(rtn_Str, function () {
                        Ext.getCmp("btn_Show").fireHandler();
                        Ext.getCmp("sub_V30701A_CancelBtn").fireHandler();
                    });
                else
                    mywarnalert(rtn_Str);
            }    // end of   if (id == 'yes') {            

2023年12月20日 星期三

V30702A/E – 子畫面 – Grid & Form & - 識別證刷卡

 目的: V30702A – 子畫面 – 含 Grid    &  V30702E – 一般Form

處理說明:  1>產生一般Form欄位:  - 刷[識別證]  - 粗體字體
                        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";

                 2>刷[識別證] 處理 *.cs   - 將[識別證卡號] 轉成 [員工編號]
                       string Tmp_EMPLYID = myfunc.get_CARDNO2EMPLYID(Tmp_CARDNO);

                       - *.js  Ext.getCmp("sub_TAMAN").on('blur', function (me, eOpts) {  .. }

                 3>呼叫 Button.click -  .fireEvent('click');
                     Ext.getCmp('btn_Show').fireHandler();  //重新顯示 Master資料
                     Ext.getCmp('sub_V30702E_CancelBtn').fireEvent('click');  //關閉子視窗
  

    




1>*.js

Ext.getCmp("sub_TAMAN").on('blur', function (me, eOpts) {
        //STEP1 將[識別證卡號] 轉成 [員工編號]
        var Tmp_CARDNO = me.getValue();
        console.log("卡號:", Tmp_CARDNO);
        var Tmp_EMPLYID = ""; //所有資料 PK 字串, 以 , 分隔
         var Tmp_EMPLYNM = "";
         var Tmp_url = "../../api/V30702AAPI/get_EMPLYID_EMPLYNM";
         var np = {};
         np["CARDNO"] = Tmp_CARDNO
         var Tmp_Str = getUrlStr(Tmp_url, np, "識別證編號2員工編號");
          Tmp_EMPLYID = StrExtract(Tmp_Str, 1);
          Tmp_EMPLYNM = StrExtract(Tmp_Str, 2);
          if (checkRtnOK(Tmp_EMPLYID)) {
               me.setValue(Tmp_EMPLYID);
               Ext.getCmp("sub_TAMAN_").setValue(Tmp_EMPLYNM);
          }
          if (Tmp_EMPLYID.length == 0)
              return;

            //STEP2 將[執行人員] [執行人員姓名 ]- 寫入 sub_Grid
           var sub_Store_np = {
                TAMAN: Tmp_EMPLYID,
                TAMAN_: Tmp_EMPLYNM,
            }
            Ext.getCmp('sub_Grid').store.add(sub_Store_np);
            Ext.getCmp("sub_TAMAN").setValue("");
            Ext.getCmp("sub_TAMAN_").setValue("");


2>*.cs
//由識別證號碼取得員工ID        
        [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

} // end of function(me,eOpts)



); // end of blur function)


2023年12月14日 星期四

V30702A - 由識別證卡號取得員工編號 - cardno

目的: V30702A -  由識別證卡號取得員工編號

處理說明: 1>連接資料庫主機 SMS_AIDC (web.config 定義)
<add name="SMS_AIDC" connectionString="Data Source=192.168.99.79; Initial Catalog=SMS_AIDC; User=A856;Password=xHMQ2uQpTz5G;Max Pool Size=5;Connect Timeout=10;" />

                  2>下 SQL :
                                         SELECT    TOP 1 PSNNO 
                                         FROM        SMS_AIDC.dbo.V_CARD 
                                         WHERE     CARDNO=: 識別證卡號






1>*.js
{
     xtype: "fieldcontainer", fieldLabel: "執行人員", labelWidth: 80, flex: 5, border: 2,
     layout: 'hbox',
     items: [
                 {
                id: "sub_TAMAN", name: "sub_TAMAN", xtype: "textfield", width: 120, padding: "0 4 0 0",
                 listeners: {
                                  blur: function (me, eOpts) {
                                            var Tmp_CARDNO = me.getValue();
                                            console.log("卡號:", Tmp_CARDNO);
                                            var Tmp_EMPLYID = "";  //所有資料 PK 字串, 以 , 分隔
                                            var Tmp_EMPLYNM = "";
                                            var Tmp_url = "../../api/V30702AAPI/get_EMPLYID_EMPLYNM";
                                            var np = {};
                                            np["CARDNO"] = Tmp_CARDNO
                                            var Tmp_Str = getUrlStr(Tmp_url, np, "識別證編號2員工編號");
                                            Tmp_EMPLYID = StrExtract(Tmp_Str, 1);
                                            Tmp_EMPLYNM = StrExtract(Tmp_Str, 2);
                                            if (checkRtnOK(Tmp_EMPLYID)) {                                                
                                                me.setValue(Tmp_EMPLYID);
                                                Ext.getCmp("sub_TAMAN_").setValue(Tmp_EMPLYNM);
                                            }
                                        }  // end of blur
                                    },         // end of blur function
                                },// end of listeners                                                    


2>*.cs
//由識別證號碼取得員工ID        
        [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

3>myfunc.cs
//由員工識別證卡號取得員工ID
        /*
         *  連接至 AES   SMS_AIDC  主機(資料庫)
         *  由員工識別證卡號(CARDNO)取得員工ID(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)



SOAP(Simple Object Access Protocol) - WSDL(Web Service Define Language - XML)

 A web service is a function that can be accessed by other programs over the web (Http).


To clarify a bit, when you create a website in PHP that outputs HTML its target is the browser and by extension the human being reading the page in the browser. 


A web service is not targeted at humans but rather at other programs.

So your PHP site that generates a random integer could be a web service if it outputs the integer in a format that may be consumed by another program. It might be in an XML format or another format, as long as other programs can understand the output.

Wsdl is the interface and that's all you need. Good thing is that it is written in xml… so that we can achieve independence of defining data. All the languages have got APIs to read Xmls.(so that's the advantage of xml).

Now…the clients gets the wsdl and generates the stub code… this code is responsible for mediating the request response between server and client.




2023年12月12日 星期二

V30701A: 不出現子畫面,直接更新單況 - Update_STA

 目的: V30701A: 不出現子畫面,直接更新單況

處理說明: 1>呼叫子畫面 *.js
                  2>後端更新資料庫 *.cs
                  3>執行完成,顯示訊息  : 透過 Cookie , 不透過 sucessful
                        var mask = new Ext.LoadMask(Ext.getBody(), {
                               msg: '處理中,請稍待...'
                        });
                      mask.show();//使用 mask 需手動呼叫show() 方法下
                       //每1秒檢核一次,是否已完成, 若已完成,則不再檢核
                     var timer = setInterval(function () {
                     var r = r_cookies('EX_DFile');
                      if (!checkisnull(r)) {
                             mysuccessalert(r);  //顯示訊息
                            clearInterval(timer);
                            mask.hide();
                           timer = null;   
                    Ext.getCmp('btn_Show').fireHandler();  //重新顯示 Master資料
                }
            }, 1000);  //1000ms = 1sec                                   




1>*.js
  //按鈕 : [附檔資料] [批次新增][確認轉發工][下載匯入格式]
    var Btn_Ary = [        
        {
            xtype: 'button', text: '申請單送出', id: 'Btn_V30701A',
            listeners: {
                click: function (me,e,eOpts) {
                    console.log(" 1 申請單送出: ");
                    Call_V30701A();
                }
            }
        },        
    ];
    //於單檔下方新增 Button
    Ext.getCmp('grid_Single').insertBtn(Btn_Ary);


2>V30701A.js
//[申請單送出]鈕 -  - 只更新資料,無子畫面
//[申請單送出]鈕 -  - 只更新資料,無子畫面
function Call_V30701A(id) {
    var cur_recs = Ext.getCmp('grid_Single').getSelectionModel().getSelection();
    var cur_rec;
    if (cur_recs.length == 0) {
        buttonModel.modelType = 0;
        mywarnalert('請先挑選[申請單送出]的資料!!');
    }
    else {
        cur_rec = cur_recs[0];
        var Tmp_msg ="確定執行[申請單送出]嗎?<br>"
                                +"(派遣申請單號: "+ cur_rec.data['TASKNO'].toString() + ")";

        myconfirmalert(Tmp_msg, callBackFunc);

        //Ext.Msg.confirm('提醒', Tmp_msg, callBackFunc);
        function callBackFunc(id) {
            if (id == 'yes') {
                console.log("cur_recs.length:", cur_recs.length);
                var np = {}
                np["TASKNO"] = cur_rec.data['TASKNO'].toString();
                var Tmp_url = '../../api/V30701AAPI/UPDATE_STA';
                var rtn_Str = getUrlStr(Tmp_url, np, "申請單送出");
                console.log("rtn_Str:", rtn_Str);
                if (checkRtnOK(rtn_Str))
                    mysuccessalert(rtn_Str, function () {
                        Ext.getCmp("btn_Show").fireHandler();
                        Ext.getCmp("sub_V30701A_CancelBtn").fireHandler();
                    });
                else
                    mywarnalert(rtn_Str);
            }
        }// end of   if (id == 'yes') {


3>*.cs
// 更新 - UDPATE_STAT  ,  AMM_COMQ
        [HttpPost]
        public dynamic UPDATE_STA()
        {
            //取得參數值
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            string Tmp_TASKNO = nvc["TASKNO"];
            string Tmp_RtnMsg = "";
            string n = funId + "_UPDATE_STA";
            HttpCookie MyCookie;
            try
            {
                var Tmp_Sql = "  UPDATE  AMM_DSPHCAR "
                                      + "   SET        STA='B'   "
                                      + "  WHERE   TASKNO=" + myfunc.AA(Tmp_TASKNO);
                myfunc.SqlExec(Tmp_Sql);
                Tmp_RtnMsg = "派遣申請單號(" + Tmp_TASKNO + ").單況已設定為[B:待執行(派遣申請已送出)]!!";
                MyCookie = new HttpCookie("EX_DFile", HttpUtility.UrlEncode(Tmp_RtnMsg));
                HttpContext.Current.Response.Cookies.Add(MyCookie);

            }
            catch (Exception e)
            {
                Tmp_RtnMsg = myfunc.Get1ORA(e.Message);
                Tmp_RtnMsg = "[申請單送出]失敗 !!  <br>"
                                         + Tmp_RtnMsg;
                MyCookie = new HttpCookie("EX_DFile", HttpUtility.UrlEncode(Tmp_RtnMsg));
                HttpContext.Current.Response.Cookies.Add(MyCookie);
            }
            return Tmp_RtnMsg;
        }


2023年12月7日 星期四

V80405B - Excel 插入長條圖 - 統計圖

 目的: V80405B - Excel 插入長條圖

處理說明: 1>Worksheet ws2 = wk.Worksheets[2];//獲取第三個工作表 - 缺件統計圖表
                  2> Chart 設定

                       Chart chart = ws2.Charts.Add(ExcelChartType.ColumnClustered);                                                       chart.ChartTitle = "件號2缺件量統計表";
                       chart.DataRange = ws2.Range["A1:B4"];
                       chart.SeriesDataFromRange = false;




1>*.cs
  Worksheet ws2 = wk.Worksheets[2];//獲取第三個工作表 - 缺件統計圖表
  //Sheet2 : 統計圖表                
                ws2.Range[myfunc.GetExcelPos(0, 0)].Text = "件號";
                ws2.Range[myfunc.GetExcelPos(1, 0)].Text = "數量";
                ws2.Range[myfunc.GetExcelPos(0, 1)].Text = "PN1";
                //ws2.Range[myfunc.GetExcelPos(1, 1)].Text = "3";
                ws2.Range[myfunc.GetExcelPos(1, 1)].NumberValue = 3;
                ws2.Range[myfunc.GetExcelPos(1, 1)].NumberFormat = "0.00";
                ws2.Range[myfunc.GetExcelPos(0, 2)].Text = "PN2";
                //ws2.Range[myfunc.GetExcelPos(1, 2)].Text = "2";
                ws2.Range[myfunc.GetExcelPos(1, 2)].NumberValue = 2;
                ws2.Range[myfunc.GetExcelPos(1, 2)].NumberFormat = "0.00";
                ws2.Range[myfunc.GetExcelPos(0, 3)].Text = "PN3";
                //ws2.Range[myfunc.GetExcelPos(1, 3)].Text = "1";
                ws2.Range[myfunc.GetExcelPos(1, 3)].NumberValue = 1;
                ws2.Range[myfunc.GetExcelPos(1, 3)].NumberFormat = "0.00";


                //// new Chart
                Chart chart = ws2.Charts.Add(ExcelChartType.ColumnClustered);
                chart.ChartTitle = "件號2缺件量統計表";
                chart.DataRange = ws2.Range["A1:B4"];
                chart.SeriesDataFromRange = false;

                ////指定圖表所在的位置
                chart.LeftColumn = 5;
                chart.TopRow = 2;
                chart.RightColumn = 15;
                chart.BottomRow = 20;


                wk.ActiveSheetIndex = 0;
                wk.SaveToStream(mstream, FileFormat.Version2007);
                wk.SaveToFile(FileName1, FileFormat.Version2007);             


2023年12月4日 星期一

DataTable 以欄位值排序

目的: DataTable  以欄位值排序

處理說明: 1>DataTable 的顯示內容:     DataView  dv1=new DataView();
                                                                  dv1=dt1.DefaultView;
                                                                  dv1.Sort=" Date Asc ";
                                                                  --> dv1=new DataView(dt1);
                                                                        dv1.Sort=" Date Asc";   
                   2>dt.DefaultView.Sort = Date1 ASC ";
                     dt = dt.DefaultView.ToTable();

 

Exampl1:

 DataTable _dt = new DataTable();

_dt.Columns.Add("Date", typeof(DateTime));
_dt.Columns.Add("Preferance", typeof(int));

_dt.Rows.Add("30/07/2011", 0);
_dt.Rows.Add("02/03/2011", 1);
_dt.Rows.Add("10/12/2011", 2);
_dt.Rows.Add("01/12/2011", 3);

DataView _dv = new DataView(_dt);
_dv.Sort = "Date ASC";

for (int i = 0; i < _dv.Count; i++)
{
    Console.WriteLine(Convert.ToDateTime(_dv[i]["Date"]).ToString("dd/MM/yyyy") + "\t" + _dv[i]["Preferance"]);
}

Example2:
dt.DefaultView.Sort = "Parameter_Name";
dt = dt.DefaultView.ToTable();


2023年11月30日 星期四

V120401C - 無子畫面 – call_V120401C()直接執行作業 - SqlOpen -

 目的: V120401C- 無子畫面 – 直接執行作業 - Call_V120401C

處理說明: 


1>V120401.js{  // 技令版期版期 - 無勾選

            xtype: 'button', text: ' 技令版期更新', id: 'Update_Tech_Btn',
            listeners: {
                click: function () {
                    //[條碼編號(TMNO)]第一碼必需為'T'
                    var cur_recs = Ext.getCmp('grid_Single').getSelectionModel().getSelection(); //grid select指向選擇的第一筆        
                    var cur_rec = cur_recs[0];
                    var Tmp_TMNO,Tmp_STAT, Tmp_Str;
                    console.log("cur_rec:", cur_rec);
                    Tmp_TMNO = cur_rec["raw"]["TMNO"];
                    Tmp_STAT = cur_rec["raw"]["STAT"];
                    if (Tmp_TMNO.substr(0, 1) != "T") {
                        Tmp_Str = "條碼編號(" + Tmp_TMNO + ")第一碼必需為 'T' <br>"
                            + "請檢核 !!";
                        myalert(Tmp_Str);
                        return;
                    }
                    if (Tmp_STAT== "Z") {
                        Tmp_Str = "條碼編號(" + Tmp_TMNO + ")的技令現況不可為 Z:已刪除 <br>"
                            + "請檢核 !!";
                        myalert(Tmp_Str);
                        return;
                    }
                    Call_V120401C();
                }
            }
        }, 




2>V120401C.js
function Call_V120401C() {
    console.log(" Call_V120401C  step1");
    var Tmp_NATIXX, Tmp_LGTPXX, Tmp_TMNOXX,Tmp_TMNO;
    var Tmp_Str = "";   
    var cur_recs = Ext.getCmp('grid_Single').getSelectionModel().getSelection(); //grid select指向選擇的第一筆        
    var cur_rec = cur_recs[0];   
    console.log("cur_rec:", cur_rec);
    console.log("cur_rec[raw][TMNOXX]:", cur_rec["raw"]["TMNOXX"]);                                        
    Tmp_TMNO = cur_rec["raw"]["TMNO"];
    Tmp_TMNOXX=cur_rec["raw"]["TMNOXX"];
    Tmp_LGTPXX=cur_rec["raw"]["LGTPXX"];
    Tmp_NATIXX = cur_rec["raw"]["NATIXX"];
    //執行[技令版期更新]
    var np = {};
    np["TMNO"] = Tmp_TMNO;
    np["TMNOXX"] = Tmp_TMNOXX;
    np["LGTPXX"] = Tmp_LGTPXX;
    np["NATIXX"] = Tmp_NATIXX;
        var isOk = true;
        Ext.Ajax.request({
            method: "POST",
            url: '../../api/V120401CAPI/UPDATE_AMM_TMDWGED',
            params: 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) {
                    var Tmp_Rtn_Msg ="技令版期更新完成 !!<br> "
                        + "訊息如下:<br>"
                        + Tmp_Obj["Rtn_Msg"];
                    mywarnalert(Tmp_Rtn_Msg);
                    isOk = true;
                }
                else {
                    var Tmp_Rtn_Msg = "條碼編號("+Tmp_TMNO+")技令編號(" + Tmp_TMNOXX + ")國別碼(" + Tmp_NATIXX + ")中英文別(" + Tmp_LGTPXX + ")<br>"
                                                       +"技令版期更新失敗<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 = "條碼編號("+Tmp_TMNO+")技令編號(" + Tmp_TMNOXX + ")國別碼(" + Tmp_NATIXX + ")中英文別(" + Tmp_LGTPXX + ")<br>"
                    + "更新技令版期失敗<br> "
                    + "錯誤訊息如下:<br>"
                    + Tmp_Obj["Rtn_Msg"];
                mywarnalert(Tmp_Rtn_Msg);
                isOk = false;
            }
        })  //end of Ext.Ajax.Request        
    if (isOk == true) {        
            //資料更新完成, 重新顯示資料
            Ext.getCmp("btn_Show").fireHandler();
        }
} // end of   function Call_V120401C() {


2>V120401C*.cs
/*        // 更新 - UPDATE_AMM_TMDWGED  

        //技令若有最新版本,則更新[技令版期(AMM_TMDWGED)]
            --> [技令版期(AMM_TMDWGED)].CTRL= MAX(CTRL)+1 , 
                 --> 新增 TM_XY@TLS_245 的版本資料(TMNOXX+NATIXX+LGTPXX)
        */
        [HttpPost]
        public HttpResponseMessage UPDATE_AMM_TMDWGED()
        {
            //取得參數值
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            string Tmp_TMNO = nvc["TMNO"];
            string Tmp_TMNOXX = nvc["TMNOXX"];
            string Tmp_LGTPXX = nvc["LGTPXX"];
            string Tmp_NATIXX = nvc["NATIXX"];

            OracleCommand cmd = new OracleCommand();
            var response = this.Request.CreateResponse();
            //STEP 1>比對  TM_XY 的筆數是否和  AMM_TMDWGED的筆數相符
            bool is_update = false;
            string Tmp_RtnMsg;
            string Tmp_MAX_CTRL="";
            int Tmp_NEXT_CTRL=1;
            int Tmp_XY_CNT, Tmp_TMDWGED_CNT;
            string Tmp_Sql = " SELECT  COUNT(*)  "
                                       + "  FROM    TM_XY @TLS_245  "
                                       + "  WHERE  1 = 1  "
                                       + "  AND        OWN_DEP = 'L'   "
                                       + "   AND       TMNOXX = " + myfunc.AA(Tmp_TMNOXX)
                                       + "   AND       NATIXX = " + myfunc.AA(Tmp_NATIXX)
                                       + "   AND       LGTPXX = " + myfunc.AA(Tmp_LGTPXX);
            Tmp_XY_CNT = int.Parse(myfunc.SqlValue(Tmp_Sql));
            //沒有任何版期資料, 則返回, 不需更新
            if (Tmp_XY_CNT == 0)
            {
                is_update = false;
            }
            else
            {
                Tmp_Sql = " SELECT   MAX(B.CTRL)  "
                                + " FROM     AMM_TMDWG A,AMM_TMDWGED B  "
                                + " WHERE  A.TMNO = B.TMNO   "
                                + "  AND      A.OWN_DEP = 'L'   "
                                + "  AND      A.TMNO=" + myfunc.AA(Tmp_TMNO)
                                + "   AND    A.TMNOXX = " + myfunc.AA(Tmp_TMNOXX)
                                + "   AND     A.NATIXX = " + myfunc.AA(Tmp_NATIXX)
                                + "   AND     A.LGTPXX = " + myfunc.AA(Tmp_LGTPXX);
                Tmp_MAX_CTRL = myfunc.SqlValue(Tmp_Sql);                
                Tmp_Sql = " SELECT COUNT(*)  "
                                + " FROM     AMM_TMDWG A,AMM_TMDWGED B  "
                                + " WHERE  A.TMNO = B.TMNO   "
                                + "  AND      A.OWN_DEP = 'L'   "
                                 + "  AND      A.TMNO=" + myfunc.AA(Tmp_TMNO)
                                + "   AND    A.TMNOXX = " + myfunc.AA(Tmp_TMNOXX)
                                + "   AND     A.NATIXX = " + myfunc.AA(Tmp_NATIXX)
                                + "   AND     A.LGTPXX = " + myfunc.AA(Tmp_LGTPXX)
                                + "   AND     B.CTRL =" + myfunc.AA(Tmp_MAX_CTRL);
                Tmp_TMDWGED_CNT = int.Parse(myfunc.SqlValue(Tmp_Sql));
                if (Tmp_TMDWGED_CNT != Tmp_XY_CNT)
                {
                    is_update = true;
                }
                //STEP 2>比對  TM_XY.VNTPXD 的是否存在  AMM_TMDWGED.MAX_CTRL.VNTPXD的筆數相符
                Tmp_Sql = "  SELECT   COUNT(*)  "
                               + "  FROM    TM_XY @TLS_245  "
                               + "  WHERE  1 = 1  "
                               + " AND       OWN_DEP = 'L'   "
                               + "   AND    TMNOXX = " + myfunc.AA(Tmp_TMNOXX)
                               + "   AND    NATIXX = " + myfunc.AA(Tmp_NATIXX)
                               + "   AND    LGTPXX = " + myfunc.AA(Tmp_LGTPXX)
                               + "    AND    VNTPXD NOT IN ( SELECT    B.VNTPXD    "
                                                                             + "  FROM      AMM_TMDWG A, AMM_TMDWGED B  "
                                                                             + "  WHERE    A.TMNO= B.TMNO  "
                                                                             + "  AND        A.TMNO=" + myfunc.AA(Tmp_TMNO)
                                                                             + "   AND       A.TMNOXX = " + myfunc.AA(Tmp_TMNOXX)
                                                                             + "   AND       A.NATIXX = " + myfunc.AA(Tmp_NATIXX)
                                                                             + "   AND        A.LGTPXX = " + myfunc.AA(Tmp_LGTPXX)
                                                                             + "    AND        B.CTRL=" + myfunc.AA(Tmp_MAX_CTRL) + " )";
                Tmp_XY_CNT = int.Parse(myfunc.SqlValue(Tmp_Sql));
                if (Tmp_XY_CNT > 0)
                {
                    is_update = true;
                }
            }// else {} if (Tmp_XY_CNT == 0)
            if (is_update)
            {
                //更新資料 -  insert  AMM_TMDWGED ,
                string Tmp_ITEMXY, Tmp_VNTPXD, Tmp_VNDTXY;
                string Tmp_VNPGXY, Tmp_DOREXY, Tmp_REMKXY, Tmp_VNVFXY;
                string Tmp_MKER, Tmp_MKDT;
                Tmp_MKER = User.Identity.Name;
                Tmp_MKDT = DateTime.Now.ToString("yyyy/MM/dd");
                Tmp_NEXT_CTRL = int.Parse(Tmp_MAX_CTRL) + 1;
                // insert AMM_TMDWGEND
                DataTable dt = new DataTable();
                Tmp_Sql = " SELECT  NATIXX, TMNOXX, LGTPXX, OWN_DEP, ITEMXY, VNTPXD, VNDTXY, "
                                 + " VNPGXY,DOREXY,REMKXY,VNVFXY  "
                                 + "  FROM   TM_XY @TLS_245   "
                                 + "  WHERE  1 = 1  "
                                 + "   AND       OWN_DEP = 'L'   "
                                + "   AND       TMNOXX = " + myfunc.AA(Tmp_TMNOXX)
                                + "   AND       NATIXX = " + myfunc.AA(Tmp_NATIXX)
                                + "   AND        LGTPXX = " + myfunc.AA(Tmp_LGTPXX);
                dt = myfunc.SqlOpen(dt, Tmp_Sql);
                foreach (DataRow dr in dt.Rows)
                {
                    Tmp_ITEMXY = dr["ITEMXY"].ToString();
                    Tmp_VNTPXD = dr["VNTPXD"].ToString();
                    //Tmp_VNDTXY = dr["VNDTXY"].ToString();
                    Tmp_VNDTXY = myfunc.getDateStr(dr["VNDTXY"].ToString());
                    Tmp_VNPGXY = dr["VNPGXY"].ToString();
                    //Tmp_DOREXY = dr["DOREXY"].ToString();
                    Tmp_DOREXY = myfunc.getDateStr(dr["DOREXY"].ToString());
                    Tmp_REMKXY = dr["REMKXY"].ToString();
                    Tmp_VNVFXY = dr["VNVFXY"].ToString();                    
                    Tmp_Sql = "  INSERT  INTO   AMM_TMDWGED  "
                                    + "( TMNO,CTRL,"
                                    + "ITEMXY,VNDTXY,VNTPXD,VNPGXY,DOREXY,"
                                    + "REMKXY,VNVFXY,MKER,MKDT) "
                                    + "  VALUES "
                                    + "(" + myfunc.AA(Tmp_TMNO) + "," + myfunc.AA(Tmp_NEXT_CTRL.ToString()) + ","
                                    + myfunc.AA(Tmp_ITEMXY) + "," + myfunc.AA(Tmp_VNDTXY) + "," + myfunc.AA(Tmp_VNTPXD) + "," + myfunc.AA(Tmp_VNPGXY) + "," + myfunc.AA(Tmp_DOREXY) + ","
                                    + myfunc.AA(Tmp_REMKXY) + "," + myfunc.AA(Tmp_VNVFXY) + "," + myfunc.AA(Tmp_MKER) + "," + myfunc.AA(Tmp_MKDT) + ")";
                    myfunc.SqlExec(Tmp_Sql);
                }  // end of foreach (DataRow dr in dt)
                Tmp_RtnMsg = "技令編號(" + Tmp_TMNOXX + ")國別碼(" + Tmp_NATIXX + ")中英文別(" + Tmp_LGTPXX + ")<br>"
                                     + "版期更新完成 !!  <br>";
                response.Content = new StringContent("{'success': true,'Rtn_Msg':'" + Tmp_RtnMsg + "'}");    // 回應內容
            }
            else
            {
                Tmp_RtnMsg = "技令編號(" + Tmp_TMNOXX + ")國別碼(" + Tmp_NATIXX + ")中英文別(" + Tmp_LGTPXX + ")<br>"
                                        + "無最新版期 , 需要更新 !!  <br>";
                response.Content = new StringContent("{'success': true,'Rtn_Msg':'" + Tmp_RtnMsg + "'}");    // 回應內容
            }
            return response;
            //新增  [AMM_TMDWGED] , CTRL=MAX(CTRL)+1            
        } //  end of  UPDATE_AMM_TMDWGD()



--> 另一寫法
         Tmp_cnt1 = Tmp_dt1.Rows.Count;                
                for (int j = 0; j < Tmp_cnt1; j++)
                {
                    DataRow dr1 = Tmp_dt1.Rows[j];
                    string Tmp_VNTPXD= dr1["VNTPXD"].ToString();