2026年9月24日 星期四

V60202 - [開啟V003子功能畫面]鈕: - 開啟另一子功能的畫面

 目的: V60202 - [開啟V003子功能畫面]鈕: -  開啟另一子功能的畫面

處處理說明: 1>利用 iframe  - 類似開子視窗 - 獨立的  BOM架構 - 所以不會有 id 相同的問題
                2> var ParamStr = '?FUNID=V003';
                         <iframe id="ifrm" scrolling="auto" frameborder="0" 
                      width="100%" height="100%"  src="/Home/CenterTab' + ParamStr + '">
                   </iframe>'



1>*.js
var ParamStr = '?FUNID=V003';
                var win = new Ext.Window({
                    layout: 'fit',
                    title: 'V003',
                    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: 'btnClose', text: '關閉',
                        handler: function () {
                            this.up('window').close();
                        }
                    }]
                });
                win.setHeight(700);
                win.setWidth(1200);
                win.show();

 

2026年9月23日 星期三

V60202P -[預覽列印] - px 和 pt 的差異 - css margin-left: 3pt

V60202P
在 CSS 裡,px 和 pt 都是長度單位,但用途和效果有些差異:
1> px (像素)
o 表示螢幕上的「畫素」單位。
o 在大多數螢幕顯示環境下,1px 就是 1 個螢幕像素。
o 適合用在 網頁設計,因為它跟螢幕解析度直接相關。
o 例如:margin: 20px; → 在螢幕上留 20 像素的空間。

2> pt (點數)

o 傳統印刷單位,1pt = 1/72 英吋。

o 在列印或排版時比較常用,因為它跟實際物理尺寸有關。

Ex: V60202P - 預覽列印 - margin-left: 3pt



V60202P: 列印標籤 (標籤格式: 10cm*6cm) - HTML 版面配置 - 標籤預覽 - New

 目的: V60202P: 列印標籤 (標籤格式: 10cm*6cm )

處理說明: 1>div_列印:  標籤格式  
                      <div id='div_print_area'  style=’width=10cm;height=5.8cm;font-sizeL9pt;’ >
                  2>div_資料/分頁:   資料/分頁  高度比例
                       <div id = 'div_data'  style='width:100%;height:98%; margin-left: 3px'> 
                       <div id = 'div_break_page'  style='width:100%;height:2%; margin-left: 3px'> 
                  3>div_資料: tbl_1 (height:10%)
                                       tbl_2 (height:90%)
                                           -tbl_21(width:55%)  
                                           -tbl_22(width:45%)  
                 4> 預覽:  $("#div_print_area").printThis();
                 5>載入*.css(橫向/直向列印) 
                                $(Tmp_prn_div_Str).printThis({
                                          loadCSS: "../JsFunction/print_V60202P.css?v=@date",            
                                 });
                6>子畫面-預留 panel 放[預覽列印]  的html內容 BOM
                     以便將 div_print_area 送至 printThis() , 預覽列印







1>*.js
                  {  //純粹放[標籤預覽.html]用 , 所以高度很小
                        xtype: 'panel', id: 'sub_panel4', region: 'south', layout: 'vbox',
                        height:10,
                        //flex: 1,
                        items: [],
                    }


      //[列印標籤]鈕 
    function V60202P_OK() {

        //1>目前挑選資料
        var cur_recs = Ext.getCmp('sub_Grid').getSelectionModel().getSelection();
        if (cur_recs.length == 0) {
            mywarnalert("請先選擇資料");
            return;
        }        
        var cur_rec = cur_recs[0];
        var Tmp_MATNR = "", Tmp_PRNNO = "", Tmp_CHECKID = "", Tmp_CHECKID_ = "";
        var Tmp_MFGBATCH = "", Tmp_MFG_RCBATCH = "", Tmp_VFDAT = "";
        var Tmp_MIXTM = "", Tmp_MIXRATE = "", Tmp_WKTIMELIM = "";
        var Tmp_MIXID = "", Tmp_MIXID_ = "";
        Tmp_MATNR = nulltoStr(cur_rec.data['MATNR']).toString();
        Tmp_PRNNO = nulltoStr(cur_rec.data['PRNNO']).toString();
        Tmp_CHECKID = nulltoStr(cur_rec.data['CHECKID']).toString();
        Tmp_CHECKID_ = nulltoStr(cur_rec.data['CHECKID_']).toString();
        Tmp_MFGBATCH = nulltoStr(cur_rec.data['MFGBATCH']).toString();
        Tmp_MFG_RCBATCH = nulltoStr(cur_rec.data['MFG_RCBATCH']).toString();
        Tmp_VFDAT = nulltoStr(cur_rec.data['VFDAT']).toString();
        Tmp_MIXRATE = nulltoStr(cur_rec.data['MIXRATE']).toString();
        Tmp_WKTIMELIM = nulltoStr(cur_rec.data['WKTIMELIM']).toString();
        Tmp_MIXID = nulltoStr(cur_rec.data['MIXID']).toString();
        Tmp_MIXID_ = nulltoStr(cur_rec.data['MIXID_']).toString();
        //預覽列印的 HTML 內容
        /*
         <!DOCTYPE html>
<html>
<title>Online HTML Editor</title>
<head>
</head>
<body>
    <div id='print_area' style='width:10cm;height:6cm;border:3px solid yellow;font-size:8pt;'>
        <div id='my_div_1' >
            <table id='my_tbl_11' style='width:100%;' border=1 bordercolor='red'>
                <tr>
                    <th>膠漆料混合工作時限管制標簽
                    </th>
                </tr>
            </table> <!-- end of table id='my_tbl_11' -->
 <table id='my_tbl_12' style='width:100%;' border=2 bordercolor='blue'>
  <tr>
   <td style='width:55%;height:100%;'>
     <table id='my_tbl_121' style='width:100%;' border=0 bordercolor='blue' cellspacing=0>
        <tr><td>件號<br>Parts No:</td><td>16VE049011-11</td></tr>
        <tr><td>膠漆料申請調配序號<br>Adheslve/Paint mixed serial No:</td>
            <td>201912301543<br>611292<br>宋喜珍</td>
        </tr>
        <tr><td>製造批號<br>Batch No:</td><td>mkb-1</td></tr>
        <tr><td>接收批號<br>Receiving No:</td><td>recvb-1</td></tr>
      <tr><td>存儲限期<br>Shelf life:</td><td>2026/09/30</td></tr>
     </table> <!-- end of table id='my_tbl_122' -->
  </td> <!-- end of td style='width:60%;'> -->
  <td style='width:45%;'>
     <table id='my_tbl_122' style='width:100%;' border=0 bordercolor='green' cellspacing=0>
        <tr><td>混合時間<br>Mixing time:</td><td>30:20</td></tr>
        <tr><td>混合比例<br>Mixing Rate:</td><td>10:6</td></tr>
        <tr><td>工作時限<br>Working time limiaation:</td><td>2hr</td></tr>
        <tr><td>調合人員(簽章<br>Mixer(Stamp):</td><td></td></tr>
        <tr><td><br></td></tr>
        <tr><td><br></td></tr>
        <tr><td><br></td></tr>
        </tr>
     </table> <!-- end of table id='my_tbl_122' -->
  </td> <!-- end of td style='width:40%;'> -->
 </tr>
 </table>  <!-- end of table id='my_tbl_12' -->
        </div>
        <div class='display' id='break_page1' style='break-after:page'>
        </div>
    </div>  <!-- end of   <div id='print_area' style='border: 5px solid green;'> -->
</body>
</html>
         */
        try
        {
  var pub_print_area_Str1 = "<div id='div_print_area' style = 'width:10cm;height:5.8cm;border:1px solid black;font-size:9pt;' >  "
                + "<div id = 'div_data'  style='width:100%;height:98%; margin-left: 3px'>  "
                + "  <table id='tbl_1' style='width:100%;height:10%;' border=1 bordercolor= 'black'  cellspacing=0>  "
            + "      <tr><th>膠漆料混合工作時限管制標簽</th></tr>"
            + "  </table > <!--end of table id = 'my_tbl_1' --> "
                + "  <table id='tbl_2' style='width:100%;height:90%' border=1 bordercolo = 'black'  cellspacing=0>  "
            + "    <tr>  "
            + "     <td style = 'width:55%;' > "
            + "         <table id='tbl_21' style='width:100%;' border=0 bordercolor='black' cellspacing=0>  "
                + "            <tr><td >件號<br>Parts No:</td><td style = 'font-size:8pt;' >" + Tmp_MATNR + "</td></tr>  "
                + "            <tr><td >膠漆料申請調配序號<br>Adheslve/Paint mixed serial No:</td> "
            + "<td>" + Tmp_PRNNO + "<br>" + Tmp_CHECKID + "<br>" + Tmp_CHECKID_ + "</td></tr>"
                + "             <tr><td >製造批號<br>Batch No:</td><td>" + Tmp_MFGBATCH + "</td></tr>"
                + "            <tr><td >接收批號<br>Receiving No:</td><td>" + Tmp_MFG_RCBATCH + "</td></tr>"
                + "            <tr><td >存儲限期<br>Shelf life:</td><td>" + Tmp_VFDAT + "</td></tr>"
            + "         </table> <!-- end of table id='my_tbl_21' -->  "
            + "     </td> <!-- end of td style='width:55%;'> -->  "
            + "     <td style='width:45%;'>  "
            + "         <table id='tbl_22' style='width:100%;' border=0 bordercolor='black' cellspacing=0>  "
                + " <tr><td >混合時間<br>Mixing time:</td><td>" + Tmp_MIXTM + "</td></tr> "
                + " <tr><td >混合比例<br>Mixing Rate:</td><td>" + Tmp_MIXRATE + "</td></tr> "
                + " <tr><td >工作時限<br>Working time limiaation:</td><td>" + Tmp_WKTIMELIM + "</td></tr>"
                + " <tr><td >調合人員(簽章<br>Mixer(Stamp):</td><td>" + Tmp_MIXID + "<br>" + Tmp_MIXID_ + "</td></tr>"
            + "<tr><td><br></td></tr>"
            + "<tr><td><br></td></tr>"
            + "<tr><td><br></td></tr>"
            + "         </table> <!-- end of table id='tbl_22' --> "
            + "       </td> <!-- end of td style='width:45%;'> --> "
            + "      </tr> "
            + "  </table>  <!-- end of table id='tbl_2' -->  "
            + "  </div>  <!-- <div id = 'div_data' -->"
                + "   <div   id='div_break_page' style='break-after:page;width:100%;height:2%;'>  "
                + "   </div>   <!-- < div id = 'div_break_page' --> "
            + "</div>  <!-- end of   <div id='div_print_area' style='border: 5px solid black;'> -->  ";
            $("#div_print_area").remove();
            var Tmp_sub_panel4 = $('#sub_panel4');            
            Tmp_sub_panel4.append(pub_print_area_Str1);  

            // include print_V60202P.css  - 設定橫向列印  
            //- $('head').append(Tmp_Str)  --> 子畫面.header , 非預覽列印.視窗
            //必需用 printThis(loadCSS:) --> 才是預覽列印時.視窗 css
            //var Tmp_header_Str = "<link type='text/css' rel='stylesheet' href='../JsFunction/print_V60202P.css?v=@date' "
                //+ " media='print'>"
                ;
            //$('head').append(Tmp_Str);
            var Tmp_prn_div_Str = "#div_print_area";
            $(Tmp_prn_div_Str).printThis({

                //importCSS: false, // import parent page css  
                //importStyle: false, // import style tags        
               loadCSS: "../JsFunction/print_V60202P.css?v=@date", 
            });
               
        }  // end of try
        catch (e) {
            var Tmp_Str = "膠漆料管制標籤-查詢失敗!!<br>"
                + "件號(" + Tmp_MATNR + ")<br>"
                + "膠漆料申請調配序號(" + Tmp_PRNNO+")<br>"
                +"錯誤訊息:"+ e.message;
            mywarnalert(Tmp_Str);        
        }   //膠漆料管制標籤-查詢失敗
    }  //end of V60202P_OK


            


2026年9月22日 星期二

標籤印表機無法使用 - 利用 PING 無法 ping 到該IP - 因為太久沒用,被列入 UPAS 黑名單 - 電腦無法使用 - 無法登入

 目的: 標籤印表表無法使用 - (192.10.4.228) - 因為太久未開機,被列入 UPDS 黑名單

處理說明: 1>請資訊處將 該  IP 重新開啟即可








2026年9月21日 星期一

V60202M-[屆期更新]鈕 – 更新後,重新Locate 在目前編輯資料,以便列印資料 - V60202N_CHECK() - findBy

 目的:V60202N-[屆期更新]鈕 – 更新後,重新Locate 在目前編輯資料,以便列印資料

處理說明: 1>reload 時,locate 在目前資料
                       gridstore.on('load', function () {
                       var Tmp_index = gridstore.findBy(function (rec, id) {
                               var Tmp_bol = true;
                               Tmp_bol = rec.data["CPNO"].toString() == Tmp_CPNO
                                           && rec.data["MATNR"].toString() == Tmp_MATNR;
                               return Tmp_bol; // true : 有找到
                     });
                     cur_rec = gridstore.getAt(Tmp_index);
                     Ext.getCmp("grid_M").getSelectionModel().select(cur_rec);

                     });
                 2>更新資料後,列印目前資料
                     CALL_V60202N();  //列印
                   //關閉本子畫面 , 重新顯示資料後, locate 在目前的資料
                    Ext.getCmp("CancelBtn_V60202M").fireEvent("click", 
                   Ext.getCmp("CancelBtn_V60202M")); 




1>*.js

     var Btns_V60202N = [
        {
            xtype: 'button', text: '確定', id: 'OkBtn_V60202N',
            listeners: {
                click: function (me, e, eOpts) {
                    if (V60202N_CHECK())
                        V60202N_OK();                    
                }
            }
        },

function show_Data_V60202N() {        
        Ext.getCmp("sub_PRNNUM").setValue("1");        
    }

    //檢核
    function V60202N_CHECK() {
        //mywarnalert(" Call  V60202N_OK ");                
        var Tmp_PRNNUM = "1";
        Tmp_PRNNUM = Ext.getCmp("sub_PRNNUM").getValue();
        if (parseInt(Tmp_PRNNUM) > 9) {
            var Tmp_Str = "列印張數不可 >9<br>"
                + "若列印張數超過9張<br>"
                +"請重覆列印即可!!<br>";
            mywarnalert(Tmp_Str);
            return false;
        }
        return true;
    }

        //
    function V60202N_OK() {
        //mywarnalert(" Call  V60202N_OK ");        
        var Tmp_CPNO = "", Tmp_MATNR = "";
        var Tmp_NORM = "", Tmp_PROJ = "";
        var Tmp_CHARG = "", Tmp_VFDAT = "";
        var Tmp_BKTXT = "";
        var Tmp_PRNNUM="1";
        var cur_recs = Ext.getCmp('grid_M').getSelectionModel().getSelection();
        var cur_rec = null;
        if (cur_recs.length > 0) {
            cur_rec = cur_recs[0];
            Tmp_CPNO = nulltoStr(cur_rec.data['CPNO']).toString();
            Tmp_MATNR = nulltoStr(cur_rec.data['MATNR']).toString();
            Tmp_NORM = nulltoStr(cur_rec.data['NORM']).toString();
            Tmp_PROJ = nulltoStr(cur_rec.data['PROJ']).toString();
            Tmp_CHARG = nulltoStr(cur_rec.data['CHARG']).toString();
            Tmp_VFDAT = nulltoStr(cur_rec.data['VFDAT']).toString();
            Tmp_BKTXT = nulltoStr(cur_rec.data['BKTXT']).toString();            
        }
        Tmp_PRNNUM = Ext.getCmp("sub_PRNNUM").getValue();

        var np = {};
        //var np = s_JSON('mySubFormF'); //TMFunction.js, 組合form上的查詢條件為json參數傳遞    , type=2, 所有欄位值 , 均傳至後端(不排除_  CaluField)
        np["CPNO"] = Tmp_CPNO;
        np["MATNR"] = Tmp_MATNR;
        np["NORM"] = Tmp_NORM;
        np["PROJ"] = Tmp_PROJ;
        np["CHARG"] = Tmp_CHARG;
        np["VFDAT"] = Tmp_VFDAT;
        np["BKTXT"] = Tmp_BKTXT;
        np["PRNNUM"] = Tmp_PRNNUM;

        
        var Tmp_url = "../../api/V60202NAPI/AMM_COMP2XLS";
        //getUrlStr : 必需傳回字串( dt.JSON字串) , 非 ds
        //var rtn_Str = getUrlStr(Tmp_url, np, "匯出[工作編號-人力資源](AMM_WKSTPD)");
        Ext.util.Cookies.set("Rtn_Msg", "");
        Ext.getCmp('s_form').submit({
            url: Tmp_url,
            method: 'POST',
            async: false,
            standardSubmit: true, //若要傳送檔案至前端, standardSubmit必需設為 true  
            params: np,
        });
        var mask = new Ext.LoadMask(Ext.getBody(), {
            msg: '資料處理中, 請稍待...'
        });
        mask.show();//使用 mask 需手動呼叫show() 方法下        
        //隔兩秒才顯示完成訊息
        var timer = setInterval(function () {
            var cookie_token = Ext.util.Cookies.get("Rtn_Msg");
            var Tmp_Str;
            if (!checkisnull(cookie_token)) {
                clearInterval(timer);
                mask.hide();
                timer = null;
                var rtn_Msg = r_cookies("Rtn_Msg");
                if (checkRtnOK(rtn_Msg)) {
                    Tmp_Str = "匯出[時限器材管制標籤]成功!!";
                    mysuccessalert(Tmp_Str);
                }
                else {
                    Tmp_Str = "匯出[時限器材管制標籤]失敗!!<br>"
                        + rtn_Msg;
                    mywarnalert(Tmp_Str);
                }                
                me.up("window").close();
                me.up("window").destroy();
            }
        }, 2000);  //等待 2000ms =1sec    
    };  // end of Ok_process() {  //批次新增       
        
      {
            xtype: 'button', text: '取消', id: 'CancelBtn_V60202M',
            listeners: {
                click: function () {
                    this.up("window").close();
                    this.up("window").destroy();
                    //3>重新更新 MDBGrid, 並 Loate 在目前資料
                    var cur_recs = Ext.getCmp("grid_M").getSelectionModel().getSelection();
                    var cur_rec = cur_recs[0];                    
                    var Tmp_CPNO, Tmp_MATNR;
                    Tmp_CPNO = cur_rec.data["CPNO"].toString();
                    Tmp_MATNR = cur_rec.data["MATNR"].toString();
                    var gridstore = Ext.getCmp("grid_M").getStore();
                    gridstore.on('load', function () {                        
                        var Tmp_index = gridstore.findBy(function (rec, id) {
                            var Tmp_bol = true;                            
                            Tmp_bol = rec.data["CPNO"].toString() == Tmp_CPNO
                                && rec.data["MATNR"].toString() == Tmp_MATNR;                                                            
                            return Tmp_bol;   // true : 有找到
                        });
                        cur_rec = gridstore.getAt(Tmp_index);
                        Ext.getCmp("grid_M").getSelectionModel().select(cur_rec);                        
                    });
                    Ext.getCmp("btn_Show").fireHandler();
                }
            }
        },

2026年9月20日 星期日

V60202M –透過WebService ZM66 取得件號的屆期日&延測報告編號

 目的:V60202M –透過WebService ZM66 取得件號的屆期日&延測報告編號

處理說明: 1>呼叫  WebService    getWS_ZM66 -  取得  件號+批次   的詳細資料
                                               public static DataTable getWS_ZM66(string par_MATNR,string par_CHARG)
                                     2>呼叫    get_ZM66_VFDAT_TESTRPT  取得 ZM66.VFDAT, TESTRPT


1>myfunc.cs  - getWS_ZM66  - 傳回 dt

 public static DataTable getWS_ZM66(string par_MATNR,string par_CHARG)
        {
            ZRFC_ZM66.ZRFC_ZM66SoapClient sap = new ZRFC_ZM66.ZRFC_ZM66SoapClient();
            if (checkisnull(par_CHARG))
                par_CHARG = null;
            DataSet ds = sap.CALL_Z_RFC_ZM66("1", par_MATNR, null, null, null, null, null, par_CHARG, null, null, null, null, null, null, null);
            DataTable dt = ds.Tables[0];
            return dt;
        }

2>V60202M  - get_ZM66_VFDAT_TESTRPT

[HttpPost]
public dynamic get_ZM66_VFDAT_TESTRPT()
{
//取得參數值
var c = HttpContext.Current;
NameValueCollection nvc = c.Request.Form;
string Tmp_MATNR = nvc["MATNR"];
string Tmp_CHARG = nvc["CHARG"];
string Tmp_VFDAT = "", Tmp_TESTRPT = "";
DataTable Tmp_dt1 = new DataTable();
//Tmp_CHARG = "";
Tmp_dt1 = myfunc.getWS_ZM66(Tmp_MATNR, Tmp_CHARG);
DataRow Tmp_dr1 = Tmp_dt1.Rows[0]; // WebService PDM02 /PLM02 傳回資枓
Tmp_VFDAT = Tmp_dr1["VFDAT"].ToString();
Tmp_TESTRPT = Tmp_dr1["TESTRPT"].ToString();

return Tmp_VFDAT + ";" + Tmp_TESTRPT;
}


2026年9月15日 星期二

V60202- 件號(#50-YCH13MS-220)-庫房(17#)-儲存位置空白-領用 – nvl(SP,’#’)

 目的: V60202- 件號(#50-YCH13MS-220)-庫房(17#)-儲存位置空白-領用 – nvl(SP,’#’)

處理說明: 1>SQL
                       //STEP1>SQL先取得 入庫數量(QTY) , 領用量(QTY_)
                       //STEP2>再取得現有庫存量(TAL_QTY) = 入庫數量(QTY) - 領用量(QTY_)

                   2>因為 AMM_COMPQTY 可能無資料(null), 
                        所以必需  nvl(SELECT SUM(QTY) FROM  AMM_COMPQTY ),0)
                                nvl((SELECT  SUM(QTY)
                                        FROM     AMM_COMPQTY
                                        WHERE  EFF = 'Y'
                                         AND       CPNO = A.CPNO
                                        AND        MATNR = A.MATNR
                                        AND        WH = A.WH
                                       AND         nvl(SP,'#') = nvl(A.SP,'#')), 0)
                  3>AND   nvl(SP,'#') = nvl(A.SP,'#')
                      -->  若 A.SP 空白
                             AND   nvl(SP,'') = nvl(A.SP,'')  --> 無法挑選該資料, 所以改成 nvl(SP,'#')

1
1>*. cs
//STEP1>SQL先取得  入庫數量(QTY) , 領用量(QTY_)
//STEP2>再取得現有庫存量(TAL_QTY) = 入庫數量(QTY) - 領用量(QTY_)
SELECT SUM(QTY - QTY_) as TAL_QTY
FROM ( 
              SELECT   MATNR, WH, SP, QTY, 
                                nvl((SELECT  SUM(QTY)
                                        FROM     AMM_COMPQTY
                                        WHERE  EFF = 'Y'
                                         AND       CPNO = A.CPNO
                                        AND        MATNR = A.MATNR
                                        AND        WH = A.WH
                                       AND         nvl(SP,'#') = nvl(A.SP,'#')), 0) as QTY_
              FROM      AMM_COMP A
              WHERE   1 = 1
              AND         MATNR = '#50-YCH20-120'
              AND         WH ='17#'
              AND SP='LOC1' 
          ) ;









;