2024年10月3日 星期四

V80202L – 工單資料查詢 – [SAP單況比對] – 依[工號]排序 - Sort - datatable - 且相同工號不重複列出明細

 目的:V80202L – 工單資料查詢 – [SAP單況比對] – [工號]排序 ,- Sort - datatable

處理說明: 1>datatable 依 [工號]排序
                       dt1.DefaultView.Sort = "SAPNO";
                       dt1 = dt1.DefaultView.ToTable();
                       for (var i = 0; i < dt1.Rows.Count; i++)
         




1>*.js

                dt1.DefaultView.Sort = "SAPNO";
                dt1 = dt1.DefaultView.ToTable();

                string Tmp_old_SAPNO="";
                int Tmp_row = 0;
                for (var i = 0; i < dt1.Rows.Count; i++)
                {
                    Tmp_SAPNO = dt1.Rows[i]["SAPNO"].ToString();                    
                    if (Tmp_SAPNO == "TEST")
                        Tmp_SAPNO = "TEST";
                    if (Tmp_old_SAPNO == Tmp_SAPNO)
                        continue;
                    Tmp_SAPNO1 = myfunc.get_SAPNO(Tmp_SAPNO);
                    Tmp_Sql =" SELECT b.AUFNR,UDATE ,UTIME,USNAM,STAT  "
                                +" FROM SAPR3.JCDS@SAP a,SAPR3.AUFK@SAP b  "
                                +" WHERE  a.MANDT = '999'   "
                                +"  AND b.MANDT = '999'  "
                                +"  AND a.INACT = ' '  "
                                +"  AND a.OBJNR = b.OBJNR  "
                                +" AND b.AUFNR ="+ myfunc.AA(Tmp_SAPNO1)
                                +" ORDER BY  AUFNR,UDATE ,UTIME ,STAT  ";                
                dt2 = myfunc.SqlOpen(dt2, Tmp_Sql);
                for (var j = 0; j < dt2.Rows.Count; j++)
                {
                        Tmp_row = Tmp_row + 1;
                        //string  Tmp_SAPNO,Tmp_UDATE,Tmp_UTIME,Tmp_UDID,Tmp_STAT;
                        Tmp_UDATE = dt2.Rows[j]["UDATE"].ToString();
                        Tmp_UTIME = dt2.Rows[j]["UTIME"].ToString();
                        Tmp_UDID = dt2.Rows[j]["USNAM"].ToString();
                        Tmp_SAPSTAT = dt2.Rows[j]["STAT"].ToString();
                        //單況說明
                        Tmp_Sql = "  SELECT TXT04, TXT30  "
                                       + "  FROM    SAPR3.TJ02T @SAP d  "
                                       + "  WHERE   1 = 1  "
                                       + "   AND       SPRAS = 'M'   "
                                       + "   AND       ISTAT =" + myfunc.AA(Tmp_SAPSTAT);
                        Tmp_Str = myfunc.SqlValue(Tmp_Sql);
                        Tmp_TXT04 = myfunc.StrExtract(Tmp_Str, 1, ";");
                        Tmp_TXT30 = myfunc.StrExtract(Tmp_Str, 2, ";");
                        ws1.Range[myfunc.GetExcelPos(0, Tmp_row)].Text = Tmp_SAPNO;
                        ws1.Range[myfunc.GetExcelPos(1, Tmp_row)].Text = Tmp_UDATE;
                        ws1.Range[myfunc.GetExcelPos(2, Tmp_row)].Text = Tmp_UTIME;
                        ws1.Range[myfunc.GetExcelPos(3, Tmp_row)].Text = Tmp_UDID;
                        ws1.Range[myfunc.GetExcelPos(4, Tmp_row)].Text = Tmp_SAPSTAT;
                        ws1.Range[myfunc.GetExcelPos(5, Tmp_row)].Text = Tmp_TXT04;
                        ws1.Range[myfunc.GetExcelPos(6, Tmp_row)].Text = Tmp_TXT30;
                    };  //end of for (var j = 0; j < dt2.Rows.Count; i++)                    
                    Tmp_old_SAPNO = Tmp_SAPNO;
                } //end of for (var i = 0; i < dt1.Rows.Count; j++)                    
                wk.ActiveSheetIndex = 0;
                wk.SaveToStream(mstream, FileFormat.Version2007);
                wk.SaveToFile(FileName1, FileFormat.Version2007);

2024年9月30日 星期一

V80202E – 工單附檔瀏覽 – 唯讀 – 底色:灰色 - 下載檔案 - - 清除 cookie - loadMask - cookie -timer

 目的: V80202E – 工單附檔瀏覽 唯讀 底色:灰色

處理說明:    1>欄位設為唯讀 , 底色設為灰色
                                     Ext.getCmp("sub_AMMNO").setReadOnly(true);    
                                    Ext.getCmp("sub_AMMNO").inputEl.addCls('readonly');
                               2>inputEI 必需在 已顯示畫面(win.show()),才可設定
                               3>清除 cookie
                                    //Ext.util.Cookies.clear("Rtn_Msg"); 
                        //先清除 cookies 欄位值 
                        Ext.util.Cookies.set("Rtn_Msg", "");


1>*.js
  var Tmp_AMMNO, Tmp_SAPNO, Tmp_PN;
    Tmp_AMMNO = nulltoStr(par_rec.data['AMMNO']).toString();    
    Tmp_SAPNO = nulltoStr(par_rec.data['SAPNO']).toString();    
    Tmp_PN = nulltoStr(par_rec.data['PN']).toString();            
        Ext.getCmp("sub_AMMNO").setValue(Tmp_AMMNO);
        Ext.getCmp("sub_SAPNO").setValue(Tmp_SAPNO);
    Ext.getCmp("sub_PN").setValue(Tmp_PN);              
    Ext.getCmp("sub_AMMNO").setReadOnly(true);    
    Ext.getCmp("sub_SAPNO").setReadOnly(true);
    Ext.getCmp("sub_PN").setReadOnly(true);    
    win1.show();
    Ext.getCmp("sub_AMMNO").inputEl.addCls('readonly');
    Ext.getCmp("sub_SAPNO").inputEl.addCls('readonly');
    Ext.getCmp("sub_PN").inputEl.addCls('readonly');

    //檔案下載
 try {            
            var Tmp_url = "../api/myAPI/downloadFile2?aTbl=" + Tmp_TblNM + "&Flds=" + Tmp_Flds + "&aCnd=" + Tmp_Cnd;
            document.location = Tmp_url;        
            var mask = new Ext.LoadMask(Ext.getBody(), {
                msg: '檔案下載中, 請稍待...'
            });
            mask.show();//使用 mask 需手動呼叫show() 方法下        
            var timer = setInterval(function () {
                //timer = null;     
                //若資料庫已更新完成, 則 Email 委約==6  &  Email 委約<>6
                var Tmp_Str = r_cookies('Rtn_Msg');
                console.log("cookies Rtn_Msg =", Tmp_Str);
                if (!checkisnull(Tmp_Str)) {
                    mask.hide();
                    mysuccessalert(Tmp_Str);
                    clearInterval(timer);  //不再重覆執行                                     
                }
            }, 1000)  // end of timer                    
        }  // end of try
        catch (e) {
            var Tmp_Str = "下載檔案失敗!!<br>"
                + "AMM單號(" + cur_rec.data["AMMNO"] + ")<br>"
                +"錯誤訊息:"+ e.message;
            mywarnalert(Tmp_Str);        
        }   //檔案無法讀取,仍會下載 byte=0

//若下載完成,則不再顯示 LoadMark
   Ext.getCmp('grid_Single').store.on("load", 
                                  function (me, records, successful, eOpts) {
                                      Proc_Msg.hide();  //若顯示完成,則不再顯示訊息
                                });

V80202D – 下載撤銷附加檔 - downloadFile2 – Cookie - 並顯示下載完成/失敗訊息 - loadMask - cookie - timer

 目的: V80202D – 下載撤銷附加檔 - downloadFile2 – Cookie  - 並顯示下載完成/失敗訊息

處理說明: 1>下載檔案(AMM_DFILES.DBLOB) 

var Tmp_url = "../api/myAPI/downloadFile2?aTbl=" + Tmp_TblNM + "&Flds=" + Tmp_Flds + "&aCnd=" + Tmp_Cnd;

            document.location = Tmp_url;        

                2> 下載完成,顯示訊息 
                        var mask = new Ext.LoadMask(Ext.getBody(), {
                             msg: '檔案下載中, 請稍待...'
                         });
                       -  var Tmp_Str = r_cookies('Rtn_Msg');



1>*.js
    /*
     *SELECT   AMMNO,DFNAME,DBLOB
       FROM   AMM_DFILES
       WHERE  1=1;
     */
    var Tmp_TblNM = "AMM_DFILES";
    var Tmp_Flds = "DFNAME,DBLOB"
    var Tmp_Cnd = "  AND       AMMNO=" + AA(cur_rec.data["AMMNO"]);
    try {
        var Tmp_url = "../api/myAPI/downloadFile2?aTbl=" + Tmp_TblNM + "&Flds=" + Tmp_Flds + "&aCnd=" + Tmp_Cnd;
        document.location = Tmp_url;
        var mask = new Ext.LoadMask(Ext.getBody(), {
            msg: '檔案下載中, 請稍待...'
        });
        mask.show();//使用 mask 需手動呼叫show() 方法下        
        var timer = setInterval(function () {
            //timer = null;     
            //若資料庫已更新完成, 則 Email 委約==6  &  Email 委約<>6
            var Tmp_Str = r_cookies('Rtn_Msg');
            console.log("cookies Rtn_Msg =", Tmp_Str);
            if (!checkisnull(Tmp_Str)) {
                mask.hide();
                mysuccessalert(Tmp_Str);
                clearInterval(timer);  //不再重覆執行                                     
            }
        }, 1000)  // end of timer                    
    }  // end of try
    catch (e)
    {
        var Tmp_Str = "下載檔案失敗!!<br>"
            + "AMM單號(" + cur_rec.data["AMMNO"] + ")<br>";     
        throw  Tmp_Str; 
    }   //檔案無法讀取,仍會下載 byte=0


2>*.cs

//取得  Table 的 FILEBODY 欄位值  - 不含 SQL
        [HttpGet]
        public void downloadFile2(string aTbl, string Flds, string aCnd)
        {
            string[] Ary = Flds.Split(',');
            string fnm = Ary[0];   //檔案名 稱
            string fbdy = Ary[1];  //檔案內容

            string cnd = Repltag_vch(aCnd);
            string Strsql = "select " + Flds + "  from " + aTbl + " where 1=1 " + cnd;
            string Tmp_CntSql = "select count(*)  from " + aTbl + " where 1=1 " + cnd;
            string Tmp_Str;
            int Tmp_cnt;
            HttpCookie MyCookie;
            try
            {
                Tmp_cnt = int.Parse(myfunc.SqlValue(Tmp_CntSql));
                if (Tmp_cnt>=0)
                {
                    //必需先加入 Cookie , 再 downloadFile 
                    //--> 因 downloadFile 會 HttpContext.Current.Response.End(); , 
                    //所以 要先加 Cookie , 再 downloadFile
                    Tmp_Str = "檔案下載完成!!<br>";
                    MyCookie = new HttpCookie("Rtn_Msg", HttpUtility.UrlEncode(Tmp_Str));
                    HttpContext.Current.Response.Cookies.Add(MyCookie);
                    HttpContext.Current.ApplicationInstance.CompleteRequest();
                    downloadFile(Strsql, fnm, fbdy);
                }
                else
                {
                    Tmp_Str = "檔案不存在,請檢核!!<br>";
                    MyCookie = new HttpCookie("Rtn_Msg", HttpUtility.UrlEncode(Tmp_Str));
                    HttpContext.Current.Response.Cookies.Add(MyCookie);
                    HttpContext.Current.ApplicationInstance.CompleteRequest();
                } 
            }
            catch (Exception ex)
            {
                Tmp_Str = ex.Message;
                if (Tmp_Str.IndexOf("DBNull") > -1)
                    Tmp_Str = "檔案內容為空白,敬請檢核!!<br>";
                MyCookie = new HttpCookie("Rtn_Msg", HttpUtility.UrlEncode(Tmp_Str));
                HttpContext.Current.Response.Cookies.Add(MyCookie);
                HttpContext.Current.ApplicationInstance.CompleteRequest();
              //  throw ex; 
            }   //檔案無法讀取,仍會下載 byte=0
            finally
            { }
        }

2024年9月27日 星期五

V80202 – 工單物料查詢 – 勾選[V]專案報價,則 專案別=’F16V’ 唯讀, 工單類別=’DTXX’ 唯讀

 目的: V80202 – 工單物料查詢 勾選[V]專案報價, 專案別=’F16V’ 唯讀(底色: 灰色)

處理說明:  1> 欄位設為唯讀:
                         Ext.getCmp("s_PROJID").setReadOnly(true);
                   2>欄位唯讀 , 底色: 灰色
                       Ext.getCmp("s_PROJID").inputEl.addCls('readonly');             
                       --> Ext.getCmp("s_PROJID").inputEl.addCls
                       --> 必需在畫面已顯示(win.show())後,才可設定 


1>*.js
// // 若勾選[v]專案報價-->則 [專案別]='F16V' & [工單類別]='DTXX' 唯讀 & 機號必填
Ext.getCmp("s_chk_OTHR").items.items[5].on('change', function (me, newValue, oldValue, eOpts) {
if (newValue) { //
     Ext.getCmp("s_PROJID").setValue("F16V"); 
     Ext.getCmp("s_PROJID").setReadOnly(true);
     Ext.getCmp("s_PROJID").inputEl.addCls('readonly');
     Ext.getCmp("s_SROTP").setValue("DTXX");
     Ext.getCmp("s_SROTP").setReadOnly(true);
     Ext.getCmp("s_SROTP").inputEl.addCls('readonly');
}
else {
     Ext.getCmp("s_PROJID").setValue("");
     Ext.getCmp("s_PROJID").setReadOnly(false);
     Ext.getCmp("s_PROJID").inputEl.removeCls('readonly');
     Ext.getCmp("s_SROTP").setValue("");
     Ext.getCmp("s_SROTP").setReadOnly(false);
     Ext.getCmp("s_SROTP").inputEl.removeCls('readonly');
}




2024年9月26日 星期四

V80202 -顯示工號 – [V]子件工單 - UNION 用法 - 日期起迄 - 分成2行 - 過濾條件

 目的: V80202 -顯示工號 – [V]子件工單  

處理說明: 1>子件工單的定義: 共3類
   1>>AMM單號含 -x : AMMNO 長度>13 且 SUBSTRING(AMMNO,1,13) IN (AMM單號)
   2>>QDR工單且 PSAPNO 符合條件的工單 : 為QDR工單,且 PSAPNO IN (工號)
   3>>TP工單且PSAPNO符合條件的QDR工單: 為 TP工單,且 PSAPNO IN ( 如上2>>的QDR工單)


1>*.cs
string Tmp_sWhere = "";  //過濾條件SQL - 不含 Select   from 
string Tmp_sFlds = "  AMMNO, PJER, PCODE, CST_NO, BM146NO, SAPNO,  TESTHR, OSM   ";
string Tmp_Sql = " SELECT  RNK,     "+ Tmp_sFlds                                                    
                          + "  FROM  ( "
                                  + "   SELECT   dense_rank()  over(order by  AMMNO) as RNK,  "+ Tmp_sFlds
                                  +"    FROM  ( "
                                                        + "  SELECT "+ Tmp_sFlds
                                                        + "  FROM      AMM_SRO  A "
                                                        + "    WHERE   1=1 ";
            if (!myfunc.checkisnull(Tmp_AMMNO))
            {
                Tmp_Sql = Tmp_Sql + " AND   AMMNO=" + myfunc.AA(Tmp_AMMNO);
                Tmp_sWhere = Tmp_sWhere + " AND   AMMNO=" + myfunc.AA(Tmp_AMMNO);
            }
            if (!myfunc.checkisnull(Tmp_SAPNO))
            {
                Tmp_Sql = Tmp_Sql + " AND   SAPNO=" + myfunc.AA(Tmp_SAPNO);
                Tmp_sWhere = Tmp_sWhere + " AND   SAPNO=" + myfunc.AA(Tmp_SAPNO);
            }

//顯示: DISP    6 :  6子件工單
//顯示 [子件工單] 
1>AMM單號含 -x :AMMNO 長度>13 且 SUBSTRING(AMMNO,1,13) IN (符合條件的 AMM單號)
2>QDR工單且 PSAPNO 符合條件的工單  : 為QDR工單,且 PSAPNO  IN (符合條件的工號)
3>TP工單且PSAPNO符合條件的QDR工單: 為 TP工單,且 PSAPNO IN ( 如上2>的QDR工單)

  if (!myfunc.checkisnull(Tmp_chk_DISP))
  {
     if (Tmp_chk_DISP.IndexOf("6") > -1)   //顯示6子件工單 - 顯示目前工單的子件工單
     {
         Tmp_Sql = Tmp_Sql
                         + " UNION  "
                                           + " SELECT  " + Tmp_sFlds
                                           + " FROM     AMM_SRO "
                                           + " WHERE  1=1 "
                                           + "  AND      AMMNO IN (  SELECT  AMMNO FROM  AMM_SRO "
                                                                                     +" WHERE  LENGTH(AMMNO)>13  "
         +" AND SUBSTR(AMMNO,1,13) IN (SELECT AMMNO FROM AMM_SRO WHERE   1=1   " + Tmp_sWhere + " ) )"
                       + "   UNION  "
                                           + "  SELECT  " + Tmp_sFlds
                                           + "   FROM     AMM_SRO  "
                                           + "   WHERE   1=1 "
                                           + "  AND        ISQDR = 'Y'   "
                         + "  AND         PSAPNO IN  ( SELECT SAPNO FROM AMM_SRO  WHERE   1 = 1   " + Tmp_sWhere + ")"
                        + "   UNION  "
                                           + "  SELECT  " + Tmp_sFlds
                                           + "   FROM     AMM_SRO  "
                                           + "   WHERE   1=1 "
                                           + "  AND        ISTP = 'Y'   "
                                           + "  AND  PSAPNO IN ( SELECT SAPNO  FROM  AMM_SRO  WHERE  ISQDR='Y'   AND  PSAPNO IN ( SELECT SAPNO FROM AMM_SRO  WHERE   1=1  " + Tmp_sWhere + " )  )  ";
                    }
                }  //end of  if (!myfunc.checkisnull(Tmp_chk_DISP))

            Tmp_Sql = Tmp_Sql + "   )   ";   // UNION , 不含 RNK
            Tmp_Sql = Tmp_Sql + "   )   ";  //  RNK

2024年9月24日 星期二

V80202 - 工單資料查詢 - 依目前資料 , 設定 Grid 的字體顏色 - 設定 Grid.行字體顏色 - getRowClass - 載入css - head - style

 目的: V80202 - 工單資料查詢 - 依目前資料 , 設定 Grid 的字體顏色

處理說明: 1>設定 Cell 字體顏色依目前資料 , 設定 Grid 的字體顏色
{header:"是否曾展BOM",dataIndex:"ISBOMIN",width:100,sortable:false,TMType:"string"},
{header: "停工中", dataIndex: "ISSTOP", width: 60, sortable: false, TMType: "string",
  renderer: function (value) 
                      {
      if (value == "Y") { return "<span  style='color:red'>" + value + "</span>"; }
                            else  {  return value;            }
                      } },

                 2>設定 row 字體顏色 依目前資料 , 設定 Grid 的字體顏色  - getRowClass    Ext.getCmp('grid_Single').getView().getRowClass = function (record, rowIndex, rowParams, store) {   
if (record.data.ISSTOP == "Y") {
      return "my-red-color";
}






1>*.js
{header:"是否曾展BOM",dataIndex:"ISBOMIN",width:100,sortable:false,TMType:"string"},
{
header: "停工中", dataIndex: "ISSTOP", width: 60, sortable: false, TMType: "string",
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"},





2>*.js
  2.1>>載入 mycss.css
             var Tmp_Str = "<link type='text/css' rel='stylesheet' href='../JsFunction/mycss.css'  >";
             $('head').append(Tmp_Str);

mycss.css 內容
.my-red-color {
    color: red;
}

.my-black-color {
    color: black;
}


 2.2>>設定 Grid.行字體顏色  - getRowClass
    Ext.getCmp('grid_Single').getView().getRowClass = function (record, rowIndex, rowParams, store) {
        if (record.data.ISSTOP == "Y") {
            return "my-red-color";
        }
        else
            return "my-black-color";
    }
         
 


2024年9月22日 星期日

V80202 – 工單資料查詢 –畫面開啟時, combo1 預設值 :生產工廠(PROCWC)

 目的: V80202 – 工單資料查詢 畫面開啟時, combo1 預設值 :生產工廠(PROCWC)

處理說明:  1> 畫面開啟時,  combo1 預設值 :"生產工廠"  , value="PROCWC"
                         Ext.getCmp("s_filter1").setValue("PROCWC");
                       selectedValues["s_filter1"] = "PROCWC";            
                       Ext.getCmp("s_filter1_txt").setValue("7100");
                  2> checkbox 預設值為  true, checked
                       var cmp_chk_TP5 = get_cmp_chk0('排除QDR工單', 's_chk_TP', 50, '5');
                       cmp_chk_TP5.checked = true;





1>*.js
    //combo:  s_filter1 預設為 '生產工廠'   過濾值='7100'
    Ext.getCmp("s_filter1").setValue("PROCWC");
    selectedValues["s_filter1"] = "PROCWC";            
    Ext.getCmp("s_filter1_txt").setValue("7100");

//工單:  1/2/3/4/5/6/ALL  : 1TP工單/2非TP工單/3子件工單/4機務工單/5排除QDR工單/6無PDM物料需求
    var cmp_chk_TP = get_cmp_chkgrp1('工單', 's_chk_TP', 30);
    var cmp_chk_TP1 = get_cmp_chk0('TP工單', 's_chk_TP', 50, '1');
    var cmp_chk_TP2 = get_cmp_chk0('非TP工單', 's_chk_TP', 50, '2');
    var cmp_chk_TP3 = get_cmp_chk0('子件工單', 's_chk_TP', 50, '3');
    var cmp_chk_TP4 = get_cmp_chk0('機務工單', 's_chk_TP', 50, '4');
    var cmp_chk_TP5 = get_cmp_chk0('排除QDR工單', 's_chk_TP', 50, '5');
    var cmp_chk_TP6 = get_cmp_chk0('無PDM物料需求', 's_chk_TP', 50, '6');
    var cmp_chk_TP7 = get_cmp_chk0('QDR完工&TP未完工', 's_chk_TP', 50, '7');    
    cmp_chk_TP.items.push(cmp_chk_TP1, cmp_chk_TP2, cmp_chk_TP3, cmp_chk_TP4, cmp_chk_TP5, cmp_chk_TP6,
        cmp_chk_TP7,
    );
    cmp_chk_TP5.checked = true;