2023年8月15日 星期二

V120401 - 設定 Query高度 - Query 高度亂掉 - radio - 字折行

 目的: V120401 - 編輯後 - Query 高度亂掉 - radio

處理說明:  1> Query的高度設為固定
                        var Query = new Ext.FormPanel({
                                              id: 's_form',
                                             height:120,
                                             layout: { type: 'hbox', align: 'stretch' },
                  2> 按[存檔]後,重新顯示資料                      
                       Ext.getCmp('btn_save').setFormValue = function () {
                               Ext.getCmp('btn_Show').fireHandler();        
                               return true;        
                         };





 
1>*.js
//篩選條件畫面
    var Query = new Ext.FormPanel({
        id: 's_form',
        height:120,
        layout: { type: 'hbox', align: 'stretch' },
        fieldDefaults: { labelAlign: 'right' },
        defaults: { margin: { top: 3 } },
        items: [
            {
                xtype: 'panel',  id: 'panel1',  layout: { type: 'hbox', align: 'stretch' },   flex: 14,  border: 0,
                items: [
                    {
                        xtype: 'panel',  id: 'panel11',  layout: { type: 'vbox', align: 'stretch' }, flex: 25,   border: 0,
                        items: [cmp_TMNOXX, cmp_DOCNO, cmp_TMNO],
                    },  // end of panel11
                    {
                        xtype: 'panel',  id: 'panel12', layout: { type: 'vbox', align: 'stretch' }, flex: 30, border: 0,
                        items: [cmp_VOL, cmp_STLCT,  cmp_MKDT],                        
                    },   // end of panel12 , flex:16                    
                    {
                        xtype: 'panel',  id: 'panel13', layout: { type: 'vbox', align: 'stretch' },  flex: 20, border: 0,
                        items: [cmp_STAT],
                    },   // end of panel13 , flex:16              
                    {
                        xtype: 'panel', id: 'panel14', layout: { type: 'vbox', align: 'stretch' }, flex: 20, border: 0,
                        items: [cmp_TYPE],
                    },   // end of panel13 , flex:16                               
                    {
                        xtype: 'panel', id: 'panel15', layout: { type: 'vbox', align: 'stretch' }, flex: 20, border: 0,
                        items: [],
                    },   // end of panel13 , flex:16                               
                ]
            },  // end of panel1            
            {
                //xtype: 'toolbar',
                xtype: 'panel',
                id: 'panel2',
                layout: { type: 'vbox', align: 'right' },
                flex: 1,
                border: 0,
                items: [
                    {
                        xtype: 'button',
                        id: 'btn_Show',
                        flex: 2,
                        border: 1,
                        text: '資料顯示',
                        iconCls: 'icon-search',
                        handler: function () {
                            var np = s_JSON('s_form'); //TMFunction.js, 組合form上的查詢條件為json參數傳遞                                                       
                            np["s_STAT"] = Ext.getCmp('s_STAT').getValue();
                            np["s_TYPE"] = Ext.getCmp('s_TYPE').getValue();                            
                            //console.log('1 gridstore: ', gridstore);
                            //var gridstore = Ext.getCmp('grid_Single').store;                            
                            gridstore.getProxy().url = '../api/V120401API/getGridData_M';
                            gridstore.getProxy().extraParams = np; //分頁OK,篩選條件OK                            
                            Ext.getCmp('grid_Single').store.pageSize = 30;
                            Ext.getCmp('grid_Single').reloadGridData();       
                            CHK_PK_OBJ.PK_LIST = [];
                            CHK_PK_OBJ.ALL_LIST = [];                                                        
                        }
                    },  // end of 顯示資料
                    {
                        xtype: 'button',
                        id: 'btn_clear',
                        flex: 2,
                        border: 1,
                        text: '清除條件',
                        iconCls: 'icon-clear',
                        handler: function () {
                            var f = Query.getForm();
                            f.reset();
                        }
                    },  // end of 清除條件                    
                   { xtype: 'label', id: 'label151', flex: 2, border: 0, text: '', },  // end of label                    
                ]  // end of items of [顯示資料][清除條件]
            }   // end of panel2  //顯示按鈕
        ]  // end of  items of Query
    });

    Ext.getCmp('grid_Single').addDocked({
        dockedItems: [{
            items: [Query]
        }]
    });

 //存檔.設定欄位值, 重新顯示資料, 以便畫面顯示正常
    //若沒重新顯示,則 radiobox 間距會加大,  畫面顯示不正常
    Ext.getCmp('btn_save').setFormValue = function () {
        Ext.getCmp('btn_Show').fireHandler();        
        return true;        
    };

 // panel11  
    var cmp_TMNOXX = get_cmp_txt1('技令編號', 's_TMNOXX', 80, 130);    
    var cmp_pick_TMNOXX = get_pick_btn0('挑選技令編號', 's_btn_TMNOXX',
        '../api/V120401API/get_s_TMNOXXPick?isComplete=0',
        ['TMNOXX'], ['s_TMNOXX'], J_pickstore_s_TMNOXX, J_pickcolumns_s_TMNOXX);
    cmp_TMNOXX.items.push(cmp_pick_TMNOXX);
    cmp_TMNOXX.items[0].value = '11P10-6-7';
    // DOCNO
    var cmp_DOCNO = get_cmp_txt1('文件編號', 's_DOCNO', 80, 130);
    var cmp_pick_DOCNO = get_pick_btn0('挑選文件編號', 's_btn_DOCNO',
        '../api/V120401API/get_s_DOCNOPick?isComplete=0',
        ['DOCNO'], ['s_DOCNO'], J_pickstore_s_DOCNO, J_pickcolumns_s_DOCNO);
    cmp_DOCNO.items.push(cmp_pick_DOCNO);
    // TMNO
    var cmp_TMNO = get_cmp_txt1('條碼編號', 's_TMNO', 80, 130);
    var cmp_pick_TMNO = get_pick_btn0('挑選條碼編號', 's_btn_TMNO',
        '../api/V120401API/get_s_TMNOPick?isComplete=0',
        ['TMNO'], ['s_TMNO'], J_pickstore_s_TMNO, J_pickcolumns_s_TMNO);
    cmp_TMNO.items.push(cmp_pick_TMNO);


    //panel12
    // 冊號(VOL)
    var cmp_VOL = get_cmp_txt1('冊號', 's_VOL', 80, 130);
    var cmp_pick_VOL = get_pick_btn0('挑選冊號', 's_btn_VOL',
        '../api/V120401API/get_s_VOLPick?isComplete=0',
        ['VOL'], ['s_VOL'], J_pickstore_s_VOL, J_pickcolumns_s_VOL);
    cmp_VOL.items.push(cmp_pick_VOL);
    //儲位(STLCT)
    var cmp_STLCT = get_cmp_txt1('儲位', 's_STLCT', 80, 130);
    var cmp_pick_STLCT = get_pick_btn0('挑選儲位', 's_btn_STLCT',
        '../api/V120401API/get_s_STLCTPick?isComplete=0',
        ['STLCT'], ['s_STLCT'], J_pickstore_s_STLCT, J_pickcolumns_s_STLCT);
    cmp_STLCT.items.push(cmp_pick_STLCT);
    //建檔日期
    var cmp_MKDT = get_cmp_dt1('建檔日期', 's_MKDT1', 80, 100);
    var cmp_MKDT_lbl = get_cmp_lbl0(" ~ ", 20);
    var cmp_MKDT2 = get_cmp_dt0('s_MKDT2', 100);
    cmp_MKDT.items.push(cmp_MKDT_lbl, cmp_MKDT2);    
    
     // panel13            
    var cmp_STAT = get_cmp_rdgrp1('現況', 's_STAT', 80);    
    var cmp_STAT1 = get_cmp_rd0('全部(不含刪除)', 's_STAT', 50, 'ALL');
    cmp_STAT1.checked = true;
    var cmp_STAT2 = get_cmp_rd0('可借閱', 's_STAT', 50, 'A');
    var cmp_STAT3 = get_cmp_rd0('已借出', 's_STAT', 50, 'B');
    var cmp_STAT4 = get_cmp_rd0('已刪除', 's_STAT', 50, 'Z');
    cmp_STAT.items.push(cmp_STAT1, cmp_STAT2, cmp_STAT3, cmp_STAT4);
    
        
    var cmp_TYPE = get_cmp_rdgrp1('類別', 's_TYPE', 80);
    var cmp_TYPE1 = get_cmp_rd0('全部', 's_TYPE', 50, 'ALL');
    cmp_TYPE1.checked = true;
    var cmp_TYPE2 = get_cmp_rd0('藍圖', 's_TYPE', 50, 'D');
    var cmp_TYPE3 = get_cmp_rd0('技令', 's_TYPE', 50, 'T');    
    cmp_TYPE.items.push(cmp_TYPE1, cmp_TYPE2, cmp_TYPE3);


2>myfunc.js
function get_cmp_chk0(par_caption, par_name, par_l_width, par_value, par_margin) {
    if (checkisnull(par_margin))
        par_margin='0  0  0 0 '
    var rtn_cmp =
    {
        xtype: 'checkbox', boxLabel: par_caption, name: par_name, labelWidth : par_l_width,
        inputValue: par_value,
        margin: par_margin,
        width: '100%',  //避免 radio字折行
    }
    return rtn_cmp;
}

2023年8月14日 星期一

V120401 - 按[存檔]鈕 - 未觸發後端的 Update() , Insert() 函式

 目的: V120401 - 按[存檔]鈕 - 未觸發後端的 Update()  , Insert() 函式

處理說明: 1> 按[存檔]鈕 , 會執行  beforeEdit  & beforeInsert 函式, 
                    所以必需設定  beforeEdit & beforeInsert 函式,以便執行後端 Update() & Insert() 函式
                       Ext.getCmp('btn_save').beforeEdit = function () {
                                isCheck = S_DB.doSave('Update');
                                return isCheck;
                       }
                             

1>*.js
               var S_DB = Ext.create('S_DB', {
                                   apiName: 'V120401'
                 });

                       //修改的存檔
                         Ext.getCmp('btn_save').beforeEdit = function () {
                         isCheck = S_DB.doSave('Update');
                         return isCheck;
                         };

                      //新增的存檔
                        Ext.getCmp('btn_save').beforeInsert = function () {
                        isCheck = S_DB.doSave('Insert');
                        return isCheck;
                         };

                      //刪除 - 資料庫刪除資料
                        Ext.getCmp('btn_del').afterDel = function () {
                        return S_DB.afterDel();
                        };


2>*.cs
 public class V120401APIController : BaseAPIController
    {
        string funId = "V120401";
        public V120401APIController()
        {
            DBTable = "AMM_TMDWG";
            setParam(DBTable);
        }

[HttpPost]
        public string[] getPK()
        {
            return base.getPK();
        }
        
        [HttpPost]
        public void Insert()
        {
            var c = System.Web.HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            excuteInsert(nvc, DBTable);
        }

        [HttpPost]
        public void Update()
        {
            var c = System.Web.HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            string[] arrCondition = getPK();
            excuteUpdate(nvc, DBTable, arrCondition);
        }

        [HttpPost]
        public void Delete()
        {
            var c = System.Web.HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            //string[] arrCondition = new string[] { "" };
            string[] arrCondition = getPK();
            excuteDelete(nvc, DBTable, arrCondition);
        }

-->更新時, 自動 Assign 建檔人員 & 建檔日期
        [HttpPost]
        public void Update()
        {
            var c = System.Web.HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            NameValueCollection nvc1 = new NameValueCollection();
            foreach (string k in nvc.Keys)
            {
                nvc1[k] = nvc[k];
            }            
            nvc1["MKER"] =User.Identity.Name;
            nvc1["MKDT"] = DateTime.Now.ToString("yyyy/MM/dd");
            string[] arrCondition = getPK();            
            excuteUpdate(nvc1, DBTable, arrCondition);
        }

V120401 - DataTable 用法介紹 - 1

 目的:  V120401  - DataTable 的用法介紹

參考網址: http://www.aspphp.online/bianchen/dnet/cxiapu/cxprm/201701/188855.html


1>Create  Table
DataTable dt= new DataTable("T1");

2>Create Columns
int Tmp_Cnt = ds.Tables["T1"].Rows.Count;
ds.Tables["T1"].Columns.Add(new DataColumn("VNDTXY_", typeof(string)));
dt.Columns.Add(new DataColumn("VNTPXD_", typeof(string)));
dt.Columns.Add(new DataColumn("MKER_", typeof(string)));

3>Add row     DataRow dr = dt.NewRow();
dr["VNDTXY_"] = "AX";

4>SeletRows
    DataRow[] drs = dt.Select("column0 = 'AX'");

5>Copy DataTable include data
     DataTable dt1 = dt.Copy();

6>Copy DataTable only scheme
    DataTable dt2 = dt.Clone();  



V120401 - SqlOpen - 傳回 DataTable - C#

 目的: V120401  -   SqlOpen  - 傳回 DataTable   - C#

處理說明:  1>利用 myfunc.SqlOpen(par_dt1, par_Sql) , 傳回  DataTable

                   2> Tmp_dt1=SqlOpen(Tmp_dt1,Tmp_Sql);  //必需接收 DataTable


1>*.cs

DataTable Tmp_dt1= new DataTable();
Tmp_Cnt=Tmp_dt1.Rows.Count();

 for (int i = 0; i < Tmp_Cnt; i++)
            {
                DataRow dr = ds.Tables["T1"].Rows[i];
                //取得  發工人員/管制人員(SAPMAN/CREMPLYID).姓名
                Tmp_MKER_ = myfunc.getEmp_NM(dr["MKER"].ToString());                
                dr["MKER_"] = Tmp_MKER_;

                //取得  [最新版期(VNDTXY)] [最新版別(VNTPXD)] , 
                Tmp_TMNOXX = dr["TMNOXX"].ToString(); //技令編號
                Tmp_NATIXX = dr["NATIXX"].ToString();     //國別
                Tmp_LGTPXX = dr["LGTPXX"].ToString();   //中英文
                Tmp_Sql = " SELECT   VNTPXD,VNDTXY  "
                               + "  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)
                               + "  ORDER    BY VNTPXD   ";  //依[版別]排序
                Tmp_dt1=myfunc.SqlOpen(Tmp_dt1, Tmp_Sql);
                Tmp_cnt1 = Tmp_dt1.Rows.Count;                
                for (int j = 0; j < Tmp_cnt1; j++)
                {
                    DataRow dr1 = Tmp_dt1.Rows[j];
                    Tmp_VNDTXY_ = Tmp_VNDTXY_ + DateTime.Parse(dr1["VNDTXY"].ToString()).ToString("yyyy/MM/dd")+";";
                    Tmp_VNTPXD_ = Tmp_VNTPXD_+ dr1["VNTPXD"].ToString() + ";";
                }
                dr["VNDTXY_"] = Tmp_VNDTXY_;
                dr["VNTPXD_"] = Tmp_VNTPXD_;
            }  // end of for (int i = 0; i < Tmp_Cnt; i++)            
           





V120401 - radio 文字折行, checkbox

 目的: V120401 - radio 文字折行, checkbox

處理說明: 1>將 radio.width ='100%' 即可



1>*.js
// panel13            
    var cmp_STAT = get_cmp_rdgrp1('現況', 's_STAT', 80);    
    var cmp_STAT1 = get_cmp_rd0('全部(不含刪除)', 's_STAT', 50, 'ALL');
    cmp_STAT1.checked = true;
    var cmp_STAT2 = get_cmp_rd0('可借閱', 's_STAT', 50, 'A');
    var cmp_STAT3 = get_cmp_rd0('已借出', 's_STAT', 50, 'B');
    var cmp_STAT4 = get_cmp_rd0('已刪除', 's_STAT', 50, 'Z');
    cmp_STAT.items.push(cmp_STAT1, cmp_STAT2, cmp_STAT3, cmp_STAT4);
    
2>myfunc.js
//get_cmp_rd0 取得 check 元件 , 加入 rdgrp ,  name: par_name
function get_cmp_rd0(par_caption, par_name, par_l_width, par_value, par_margin) {
    if (checkisnull(par_margin))
        par_margin = '0  0  0 0 '
    var rtn_cmp =
    {
        xtype: 'radiofield', boxLabel: par_caption,
        name: par_name,
        labelWidth: par_l_width,
        inputValue: par_value,
        margin: par_margin,        
        //width: '100%',
        width: 120,
        flex: 20,
    }
    return rtn_cmp;
}





2023年8月6日 星期日

V80201 WebService 錯誤訊息: 找到多個該合約的端點組態。請以名稱指示偏好的端點組態區 - WS定義的網址 – 記錄在 Web.config 內

 目的: WebService定義的網址 記錄在 Web.config

處理說明: 1>由  web.config  查詢最新的   WebService   IP

                  2>[加入服務參考]設定後 , web.config 會有重覆的 WebService名稱

                      必需將重覆的 WebService名稱(PLM04) 刪除

                      否則會有錯誤訊息(xx 多個該合約的端點組態)


若呼叫 WebService 時,出現如下錯誤訊息: 
-->無法載入合約 'AMM_PLM04.ServiceSoap' 的端點組態區段,因為找到多個該合約的端點組態。請以名稱指示偏好的端點組態區
-->
  



2023年8月2日 星期三

V40AA – SAP工單狀態異動 – 傳回 TXT檔至前端 - dt2JSON - JSON2dt - Cookie - 勾選資料

 目的: V40A – [SAP工單狀態異動] 傳回 TXT檔至前端

處理說明: 1>將勾選的資料傳至後端  (JSON2dt)
                 2>後端開啟TXT檔案
                3>依每筆資料呼叫 WebService , 並將傳回訊息寫入檔案
                4>將TXT檔案   傳至前端
                5>將訊息加入 Cookie 




1>將勾選的資料傳至後端
   1>>*.js
                     var Tmp_DataAry = [];
                     var cur_rec;
                     for (let i = 0; i < CHK_PK_OBJ.PK_LIST.length; i++) {                        
                        cur_rec = CHK_PK_OBJ.ALL_LIST[i];
                        Tmp_DataAry.push(cur_rec);
                    }  // for i=0 to 
                    //將 DataAry轉成 JSON
                    var Tmp_DataString = JSON.stringify(Tmp_DataAry);
                    var np = {}; //TMFunction.js, 組合form上的查詢條件為json參數傳遞                                            np["sub_DataString"] = Tmp_DataString;  //存入目前勾選的資料

      -->後端處理 *.cs  ,  將 JSON 轉成 table
           string Tmp_DataString = nvc["sub_DataString"];   
           DataTable dt1 = myfunc.JSON2dt(Tmp_DataString);  //目前子畫面所勾選的資料

2>後端開啟TXT檔案
     1>>*.cs
          using System.Text;
          string Tmp_out_FName = "V40A_SAP工單單況異動_log.txt";      //處理_log.txt
            string documentPath = HttpContext.Current.Server.MapPath("~") + "document\\";  // 取得實實的路徑            
            string Tmp_out_pFName = documentPath + Tmp_out_FName;    //含 path 的Filename
                                                                     //清除檔案內容
            if (File.Exists(Tmp_out_pFName))
            { File.Delete(Tmp_out_pFName); }
            File.WriteAllText(Tmp_out_pFName, String.Empty);
            Tmp_Str = " 工單號碼                     工單異動說明                         " +"\r\n";;
            File.AppendAllText(Tmp_out_pFName, Tmp_Str);


3>依每筆資料呼叫 WebService , 並將訊息寫入TXT檔案
    1>>*.cs
          //處理每筆工單
            for (var i = 0; i < dt1.Rows.Count; i++)
                {
                    Tmp_SAPNO = dt1.Rows[i]["SAPNO"].ToString();
                    //呼叫 WebService , 取得傳回 ds
                    Tmp_ds = myfunc.set_SAPSTAT(Tmp_SAPNO, Tmp_STAT, Tmp_EMPLYID);
                    var Tmp_dr = Tmp_ds.Tables[0].Rows[0];
                    Tmp_Str = Tmp_dr["AUFNR"].ToString() + "                " + Tmp_dr["MSG"].ToString()+ "\r\n";              
                     File.AppendAllText(Tmp_out_pFName, Tmp_Str);
                }//  end of  for (var i = 0; i < dt1.Rows.Count; i++)       
          
      2>>呼叫 WebService
public static dynamic set_SAPSTAT(string par_SAPNO, string par_STAT,string par_EMPLYID)
        {            
            string Tmp_Str = "";
            DataSet ds=new DataSet(); 

            if ((!checkisnull(par_SAPNO))  && (!checkisnull(par_STAT)))
            {
                ZCO02.ZRFC_ZCO02SoapClient ZCO02_cls = new ZCO02.ZRFC_ZCO02SoapClient();
                try
                {
                    ds = ZCO02_cls.PROCESS_TRANS_WEB_CO02(par_SAPNO, par_STAT, par_EMPLYID);                    
                }
                catch (Exception ex)
                { }  //throw ex;  可能回傳 null
                finally
                { };
            }
            return ds;
        }  


4>將TXT檔案   傳至前端
      HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + HttpUtility.UrlEncode((string)Tmp_out_FName, System.Text.Encoding.UTF8) + "\"");
      HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
      HttpContext.Current.Response.ContentType = "text/plain";
      HttpContext.Current.Response.WriteFile(Tmp_out_pFName);
      HttpContext.Current.Response.End();



5>訊息加入 Cookie
     //記錄 " 已執行完成 Cookie "
    var Tmp_finished_str = "已執行完成!!";
    MyCookie = new HttpCookie("UPDATE_SAPSTAT_finished", HttpUtility.UrlEncode(Tmp_finished_str));
    HttpContext.Current.Response.Cookies.Add(MyCookie);