2025年11月20日 星期四

V20201B- Grid 加外框 – 藍色 - style - css - new -勾選[V]處理 - 子畫面

目的: V20201B- Grid 加外框 – 藍色 - style - css
                          -勾選[V]處理

 
處理說明: 1> 直接設定 : style , 不用 css檔案

                        style: 'border: 4px solid #0066cc; border-radius: 6px;'
                  2> 間接設定: cls , 利用 *.css 檔案
                        // *.js   href   *.css
                        var Tmp_Str = "<link type='text/css' rel='stylesheet' href='../JsFunction/mycss.css'  >";
                        $('head').append(Tmp_Str);

                        cls: 'edit_BC',
                        cls: 'my_Grid',
                  3>*.css
<style type="text/css" >
.my_Grid { border: 4px solid #0066cc; border-radius: 6px;}

.my_bigfont{    font-size:  30px;        color: yellow;}
.my_redcolor {    background: red; }
.my_lightgreen {    background: #CCFF00;}
 </style >

                  4>子畫面[V] 勾選處理




1>*.js  -style - Grid
  //子件明細 sub_Grid2 - AMM_EMPD
    var sub_Grid2 = Ext.create('TMGrid', {
        grid_id: 'sub_Grid2',
        columns: sub_Columns_V20201B_2,        
        flex: 10,
        store: Ext.create('gridstore', { model: sub_model_V20201B_2 }),
        //style: 'border: 4px solid #0066cc; border-radius: 6px;'
    });

    //子件明細 sub_Grid3 - AMM_DEVD
    var sub_Grid3 = Ext.create('TMGrid', {
        grid_id: 'sub_Grid3',
        columns: sub_Columns_V20201B_3,
        flex: 20,
        store: Ext.create('gridstore', { model: sub_model_V20201B_3 }),
        //style: 'border: 4px solid #0066cc; border-radius: 6px;'
    });




2>*.js - style - panel
   var cmp_sub_panel_Grid2 = get_cmp_panel1(200,10);
    cmp_sub_panel_Grid2.id = "sub_panel_Grid2";    
    cmp_sub_panel_Grid2.style = "border: 2px solid #0066cc;";
    cmp_sub_panel_Grid2.items.push(sub_Grid2);
    var cmp_sub_panel_Grid3 = get_cmp_panel1(200, 20);
    cmp_sub_panel_Grid3.id = "sub_panel_Grid3";
    cmp_sub_panel_Grid3.style = "border: 2px solid #0066cc; ";
    cmp_sub_panel_Grid3.items.push(sub_Grid3);

 {
                    xtype: 'panel',
                    id: 'sub_panel3',
                    region: 'south',
                    layout: { type: "hbox", align: 'stretch' },
                    flex: 10,
                    border: 1,
                    //items: [sub_Grid2, sub_Grid3,]    //圖1
                    items: [cmp_sub_panel_Grid2, cmp_sub_panel_Grid3],   //圖2
                },


3>*.js  - [V]勾選 - 子畫面勾選處理
Ext.define('CHK_PK_OBJ1', {
PK_LIST: [], //儲存選項's的  PK欄位值
ALL_LIST: [], //儲存選項's的 所有欄位值
});
var CHK_PK_OBJ1 = Ext.create('CHK_PK_OBJ1');

var sub_Columns_V20201B_1 = [
    { header: "", xtype: "rownumberer", width: 40, align: "center", sortable: false },
{
//2023/07/14 microed , 將 V120201 改成 雅嵐版本 - 分頁勾選
header: "勾選",
dataIndex: "CHECK", width: 40, xtype: 'checkcolumn', menuDisabled: true, sortable: false,
//rec : 目前資料欄位值
renderer: function (value, metadata, rec, rowIndex, colIndex, store) {
//var item = rec.get('AMMNO') + '&' + rec.get('WC') + '&' + rec.get('ITM');
var Tmp_PK = rec.get('AMMNO') + '&' + rec.get('WC') + '&' + rec.get('WITM');
var chkd = '';
if (rec.get('CHECK') === true) {
if (CHK_PK_OBJ1.PK_LIST.indexOf(Tmp_PK) == -1) {
CHK_PK_OBJ1.PK_LIST.push(Tmp_PK);
CHK_PK_OBJ1.ALL_LIST.push(rec.data);
}
chkd = 'checked';
rec.set('CHECK', true);
}
else if (rec.get('CHECK') === false) {
rec.set('CHECK', false);
//將本Tmp_PK ,由 Array 中移除 , 所以不會有 空字串, 空 Object
       CHK_PK_OBJ1.PK_LIST = jQuery.grep(CHK_PK_OBJ1.PK_LIST, function (item) {
var Tmp_cur_PK = item.AMMNO + "&" + item.WC + "&" + item.WITM;
return Tmp_cur_PK != Tmp_PK;
});
CHK_PK_OBJ1.ALL_LIST = jQuery.grep(CHK_PK_OBJ1.ALL_LIST, function (item) {
var Tmp_cur_PK = item.AMMNO + "&" + item.WC + "&" + item.WITM;
return Tmp_cur_PK != Tmp_PK;
});
CHK_PK_OBJ1.ALL_LIST);
}
else if (typeof rec.get('CHECK') === "undefined") { //往上或下一頁
if (CHK_PK_OBJ1.PK_LIST.indexOf(Tmp_PK) > -1) {
chkd = 'checked';
if (CHK_PK_OBJ1.PK_LIST.indexOf(Tmp_PK) == -1) {
CHK_PK_OBJ1.PK_LIST.push(Tmp_PK);
CHK_PK_OBJ1.ALL_LIST.push(rec.data);
console.log("undefined checked CHK_PK_OBJ1.PK_LIST:", CHK_PK_OBJ1.PK_LIST);
console.log("undefined checked CHK_PK_OBJ1.ALL_LIST:", CHK_PK_OBJ1.ALL_LIST);
}
rec.set('CHECK', true);
} else {
rec.set('CHECK', false);
}
}
var cbx = "<input  type='checkbox'  "
+ chkd + " > ";
return cbx;
},
},
{ header: "AMM單號", dataIndex: "AMMNO", width: 120, sortable: false, TMType: "string" },
{ header: "工作中心", dataIndex: "WC", width: 70, sortable: false, TMType: "string" },
{header: "工作步序", dataIndex: "WITM", width: 70, sortable: false, TMType: "string" },
{ header: "步序說明", dataIndex: "STP", width: 120, sortable: false, TMType: "string" },
{ header: "所需人數", dataIndex: "AQTY", width: 70, sortable: false },
{ header: "熟手人數", dataIndex: "PQTY", width: 70, sortable: false },
{ header: "工時", dataIndex: "WHR", width: 60, sortable: false, align: "right", TMType: "float", renderer: Ext.util.Format.numberRenderer('000,000.00') },
{ header: "步序工作中心", dataIndex: "DWC", width: 80, sortable: false, TMType: "string" },
{ header: "是否排程", dataIndex: "STATUS", width: 80, sortable: false, TMType: "string" },
{ header: "工作編號", dataIndex: "MITM", width: 120, sortable: false, TMType: "string" },
];


4>*.js - 子畫面[V]勾選 - 送至後端處理

function V20201B_OK() {
        //1>目前挑選資料 傳送至後端
        var cur_rec;
        let Tmp_DataAry1 = [];
        var Tmp_EMPLYID, Tmp_AMMNO;
        var Tmp_Str;
        for (var i = 0; i < CHK_PK_OBJ1.PK_LIST.length; i++) {
            cur_rec = CHK_PK_OBJ1.ALL_LIST[i];
            //Tmp_PK = cur_rec.AMMNO.toString()+"&"+cur_rec.WC.toString()+"&"+cur_rec.ITM.toString();
            if (!(JSON.stringify(cur_rec) === '{}')) {
                Tmp_DataAry1.push(cur_rec);
            }
        }
        //主畫面勾選資料
        let Tmp_DataString1 = JSON.stringify(Tmp_DataAry1);
        var np = {};
        np["DataString1"] = Tmp_DataString1;

        //新增 AMM_TLSAR & AMM_AR
        //STEP2: 若 AMM_TLSAR & AMM_AR of FMNO 不存在, 則新增該檔案資料(AMM_TLSAR, AMM_AR)
        Tmp_url = '../../api/V20201BAPI/UPDATE_AMM_SCHSTP';
        Tmp_RtnStr = getUrlStr(Tmp_url, np, "[細部資料維護]鈕-更新(AMM_SCHSTP.STATUS)=Y/N");
        if (!checkRtnOK(Tmp_RtnStr)) {
            mywarnalert(Tmp_RtnStr);
            return;
        }
        else {
            mysuccessalert(Tmp_RtnStr);
            //Ext.getCmp("sub_Grid").store.reload();
            Ext.getCmp("sub_btn_V20201B_cancel").fireEvent('click', Ext.getCmp("sub_btn_V20201B_cancel"));
        }
            
    

2025年11月17日 星期一

V20201K – 排程資料匯出 – 套表 - 全部匯出(含CaluField) - New

 目的: V20201K – 排程資料匯出 套表 - 全部匯出(CaluField)

處理說明:  1>*.js  匯出所有的資料
                         Ext.Ajax.request({
                            url: '../api/V20201API/getGridData_M?par_paging=false',
                            method: 'POST',
                            params: { all: 1 },
                            async: false, //將非同步功能關閉
                            failure: function (response, opts) {},
                            success: function (response, opts) {
                                  let Tmp_DataAry1 = [];
                                  var obj = Ext.decode(response.responseText);
                                  obj.T1.forEach(function (item, i) {
                                           Tmp_DataAry1.push(item);
                                  });
                                CALL_V20201K(Tmp_DataAry1); //排程資料匯出
                        }
                        });

                  2>*.cs  - 套表
public void XLSOUT()
        {           
            // 1>將 SS_FILES.FBOLD 存成 Local檔案
            //取得目前子畫面的欄位值
            string Tmp_DataString1 = nvc["DataString1"];    //Tmp_DataString:  將目前子畫面的資料. 

            //將 table 字串轉成 DataTable
            DataTable dt1 = myfunc.JSON2dt(Tmp_DataString1);
            int Tmp_cnt1 = dt1.Rows.Count;
          
            string Tmp_FName = "V20201_排程資料匯出格式.xlsx";      //套表的檔案名稱 , 
            //documentPath = c:\\inetpub\wwwroot\TLS5\TLSWEB_AMM5\document\
            string documentPath = HttpContext.Current.Server.MapPath("~") + "document\\"; 
            string Tmp_pFName = documentPath + Tmp_FName;
            //需要擷取大量資料時,DataReader 是很好的選擇,因為資料不會快取至記憶體。
            //OracleDataReader reader;
            FileStream fs = null;
            Workbook wk = null;

              string Tmp_FName1 = "V20305_物料清單匯出_" + DateTime.Now.ToString("yyyyMMdd") + ".xlsx";
            string Tmp_pFName1 = documentPath + Tmp_FName1;
            MemoryStream mstream = new MemoryStream();
            HttpCookie MyCookie;
            int row = 0;            
            try
            {
                // 取得 Template SS_FILES 
                fs = myfunc.get_SS_FILES(Tmp_FName);
                wk = new Workbook();
                wk.LoadFromStream(fs);

},



1>*.js
{
xtype: 'button', text: '排程資料匯出', id: 'btn_V202K',
iconCls: 'icon-article',
disabled: false,
listeners: {
click: function () {
//將 所有資料.PK 加入 CHK_PK_OBJ.PK_LIST
Ext.Ajax.request({
url: '../api/V20201API/getGridData_M?par_paging=false',

method: 'POST',
params: { all: 1 },
async: false, //將非同步功能關閉
failure: function (response, opts) {
},
success: function (response, opts) {
let Tmp_DataAry1 = [];
var obj = Ext.decode(response.responseText);
obj.T1.forEach(function (item, i) {
Tmp_DataAry1.push(item);
});

CALL_V20201K(Tmp_DataAry1); //排程資料匯出
}
});
},
},
},


function CALL_V20201K(par_DataAry1) {
var Tmp_Grid = Ext.getCmp('grid_M');
var cur_recs, cur_rec;
var Tmp_SAPNO, Tmp_PN, Tmp_QTY, Tmp_EOCND, Tmp_RMK;
var Tmp_data_JSON = ""; //將store資料轉成 JSON 的字串
var Tmp_sub_np = {};
let Tmp_DataAry1 = [];
Tmp_DataAry1 = par_DataAry1;
var Tmp_Str = "";
//將目前子畫面的資料(Table)轉成 JSON字串
let Tmp_DataString1 = JSON.stringify(Tmp_DataAry1);
//因為[備註]欄位 有/n .. 等特殊字元 , JSON.stringify 會 Error
var np = {};
np = {
      DataString1: Tmp_DataString1,
};
Ext.getCmp('s_form').submit({
url: '../../api/V20201KAPI/XLSOUT',
method: 'POST',
async: false,
standardSubmit: true, //若要傳送檔案至前端, standardSubmit必需設為 true
params: np,
});

//顯示結果訊息..
var mask = new Ext.LoadMask(Ext.getBody(), {
      msg: '處理中,請稍待...'
});

mask.show();
//使用 mask 需手動呼叫show() 方法下
//每1秒檢核一次,是否已完成, 若已完成,則不再檢核
var timer = setInterval(function () {
var r = r_cookies('Rtn_Msg');
if (!checkisnull(r)) {
mysuccessalert(r);
clearInterval(timer);
mask.hide();
timer = null;
}
}, 1000); //1000ms = 1sec


2025年11月16日 星期日

V20201G- 排程工單異動查詢 – 簡單子畫面Grid (含[V] - CheckBox)

 目的: V20201G- 排程工單異動查詢 簡單子畫面Grid

處理說明:



1>*.js

        //panel11 工號/件號/序號
    var cmp_sub_SAPNO = get_cmp_txt1('工號', 'sub_SAPNO', 80, 130);
    var cmp_pick_sub_SAPNO = get_pick_btn0('挑選工號', 'btn_sub_SAPNO',
        '../api/V20201GAPI/get_sub_SAPNOPick?isComplete=0',
        ['SAPNO'], ['sub_SAPNO'], J_pickstore_sub_SAPNO, J_pickcolumns_sub_SAPNO);
    cmp_sub_SAPNO.items.push(cmp_pick_sub_SAPNO);
    //件號
        var cmp_sub_PN = get_cmp_txt1('件號', 'sub_PN', 80, 130);
    var cmp_pick_sub_PN = get_pick_btn0('挑選件號', 'btn_sub_PN',
        '../api/V20201GAPI/get_sub_PNPick?isComplete=0',
        ['PN'], ['sub_PN'], J_pickstore_sub_PN, J_pickcolumns_sub_PN);
    cmp_sub_PN.items.push(cmp_pick_sub_PN);
    //序號
    var cmp_sub_SERNO = get_cmp_txt1('序號', 'sub_SERNO', 80, 130);
    var cmp_pick_sub_SERNO = get_pick_btn0('挑選序號', 'btn_sub_SERNO',
        '../api/V20201GAPI/get_sub_SERNOPick?isComplete=0',
        ['SERNO'], ['sub_SERNO'], J_pickstore_sub_SERNO, J_pickcolumns_sub_SERNO);
    cmp_sub_SERNO.items.push(cmp_pick_sub_SERNO);
        //panel12 約別/異動原因/顯示管制品項
    var cmp_sub_TYPEAF = get_cmp_txt1('約別', 'sub_TYPEAF', 80, 130);
    var cmp_pick_sub_TYPEAF = get_pick_btn0('挑選約別', 'btn_sub_TYPEAF',
        '../api/V20201GAPI/get_sub_TYPEAFPick?isComplete=0',
        ['TYPEAF'], ['sub_TYPEAF'], J_pickstore_sub_TYPEAF, J_pickcolumns_sub_TYPEAF);
    cmp_sub_TYPEAF.items.push(cmp_pick_sub_TYPEAF);
    //異動原因    
    var cmp_sub_STAT = get_cmp_txt1('異動原因', 'sub_STAT', 80, 130);
    var cmp_pick_sub_STAT = get_pick_btn0('挑選異動原因', 'btn_sub_STAT',
        '../api/V20201GAPI/get_sub_STATPick?isComplete=0',
        ['STAT'], ['sub_STAT'], J_pickstore_sub_STAT, J_pickcolumns_sub_STAT);
    cmp_sub_STAT.items.push(cmp_pick_sub_STAT);
    var cmp_sub_chk_FAVITEM = get_cmp_chk1('顯示管制品項', 'sub_chk_FAVITEM', 80,"true","0 10 0 50");
    //var cmp_sub_chk_FAVITEM = get_cmp_chk1('顯示管制品項', 'sub_chk_FAVITEM', 80, );
    //panel13
    //異動日期
    var cmp_sub_DT1 = get_cmp_dt1('異動日期', 'sub_DT1', 80, 100);
    var cmp_sub_DT2 = get_cmp_dt1('~', 'sub_DT2', 80, 100);

    var sub_V20201G_Flds = [
        {
            type: 'panel', bodyStyle: "background-color:transparent;", border: 5, padding: "1",
            layout: 'border',
            items: [
                {
                    xtype: 'panel', id: 'sub_panel1', region: 'north', layout: 'hbox',
                    //height: 30,
                    items: [
                        {
                            xtype: 'panel', id: 'sub_panel11', layout: { type: 'vbox', align: 'stretch' }, flex: 40, border: 0,
                            items: [cmp_sub_SAPNO, cmp_sub_PN, cmp_sub_SERNO,],
                        },  // end of sub_panel11                            
                        {
                            xtype: 'panel', id: 'sub_panel12', layout: { type: 'vbox', align: 'stretch' }, flex: 40, border: 0,
                            items: [cmp_sub_TYPEAF, cmp_sub_STAT, cmp_sub_chk_FAVITEM,],
                        },  // end of sub_panel12
                        {
                            xtype: 'panel', id: 'sub_panel13', layout: { type: 'vbox', align: 'stretch' }, flex: 30, border: 0,
                            items: [cmp_sub_DT1, cmp_sub_DT2,],
                        },  // end of sub_panel13
                        {
                            //xtype: 'toolbar',
                            xtype: 'panel',
                            id: 'sub_panel14', layout: { type: 'vbox', align: 'right' },
                            flex: 20, border: 0,
                            items: [
                                {
                                    xtype: 'button',
                                    id: 'btn_sub_Show',
                                    flex: 2,
                                    border: 1,
                                    text: '資料顯示',
                                    iconCls: 'icon-search',
                                    handler: function (btn, e) {
                                        //若按[顯示資料]鈕,則清除 PK_LIST 及 ALL_LIST                                        
                                        CHK_PK_OBJ.PK_LIST = [];
                                        CHK_PK_OBJ.ALL_LIST = [];

                                        //取得子畫面.欄位值 
                                        var Tmp_SAPNO, Tmp_PN, Tmp_SERNO;
                                        var Tmp_TYPEAF, Tmp_STAT, Tmp_chk_FAVITEM;
                                        var Tmp_DT1, Tmp_DT2;

                                        Tmp_SAPNO = Ext.getCmp('sub_SAPNO').getValue();
                                        Tmp_PN = Ext.getCmp('sub_PN').getValue();
                                        Tmp_SERNO = Ext.getCmp('sub_SERNO').getValue();
                                        Tmp_TYPEAF = Ext.getCmp('sub_TYPEAF').getValue();
                                        Tmp_STAT = Ext.getCmp('sub_STAT').getValue();
                                        Tmp_chk_FAVITEM = Ext.getCmp('sub_chk_FAVITEM').getValue();
                                        Tmp_DT1 = Ext.getCmp('sub_DT1').getValue();
                                        Tmp_DT2 = Ext.getCmp('sub_DT2').getValue();

                                        var np = {};
                                        np["sub_SAPNO"] = Tmp_SAPNO;                                        
                                        np["sub_PN"] = Tmp_PN;
                                        np["sub_SERNO"] = Tmp_SERNO;
                                        np["sub_TYPEAF"] = Tmp_TYPEAF;
                                        np["sub_STAT"] = Tmp_STAT;
                                        np["sub_chk_FAVITEM"] = Tmp_chk_FAVITEM;
                                        np["sub_DT1"] = Tmp_DT1;
                                        np["sub_DT2"] = Tmp_DT2;

                                        Ext.getCmp('sub_Grid1').store.getProxy().url = '../../api/V20201GAPI/get_sub_data1',
                                        Ext.getCmp('sub_Grid1').store.getProxy().extraParams = np; //分頁OK,篩選條件OK    
                                        Ext.getCmp('sub_Grid1').store.load();
                                    }
                                },  // end of 顯示資料
                                {
                                    xtype: 'button',
                                    id: 'btn_sub_clear',
                                    flex: 2,
                                    border: 1,
                                    text: '清除條件',
                                    iconCls: 'icon-clear',
                                    handler: function () {
                                        console.log("CHK_PK_OBJ.PK_LIST:", CHK_PK_OBJ.PK_LIST);
                                        console.log("CHK_PK_OBJ.ALL_LIST:", CHK_PK_OBJ.ALL_LIST);
                                        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 sub_panel1.items,
                },  // end of sub_panel1                        
                {
                    xtype: 'panel',
                    id: 'sub_panel2',
                    region: 'center',
                    layout: 'fit',
                    //flex: 5,
                    border: 1,
                    items: [sub_Grid1]
                },
            ] // end of   layout: "vbox", padding: "5", items: [
        }
        ]


2025年11月12日 星期三

V20201E – 批次修改排程資料 – CHECKBOX 欄位值 – *.js , *.cs

 目的: V20201E – 批次修改排程資料 – CHECKBOX 欄位值 – *.js , *.cs
處理說明: 1> *.js
                       checkbox 欄位值: true/false  - boolean
                      var Tmp_sub_chk_SDT1 = Ext.getCmp('sub_chk_SDT1').getValue();
                      var Tmp_sub_SDT2 = "";
                      if (Tmp_sub_chk_SDT1)   //boolean 
                           Tmp_sub_SDT2=Ext.getCmp('sub_SDT2').getValue();
                     var np = {};
                     np = { 
                       DataStr: Tmp_DataStr,
                         sub_chk_SDT: Tmp_sub_chk_SDT2,
                         sub_SDT: Tmp_sub_SDT2,
                    };

                 2>*.cs
                     string Tmp_chk_SDT = nvc["sub_chk_SDT"];
                     string Tmp_SDT = nvc["sub_SDT"];
                     if (Tmp_chk_SDT=="true"){   //string
             
                     }  



1>*.js
     //可開始日期(SDT)
    var cmp_panel_SDT = get_cmp_panel1(220,10);
    var cmp_chk_SDT1 = get_cmp_chk1('可開始日期', 'sub_chk_SDT1', 100, '5', '0 5 0 0');
    //cmp_chk_SDT1.labelAlign = "right";
    var cmp_SDT2 = get_cmp_dt0('sub_SDT2', 100);    
    cmp_panel_SDT.items.push(cmp_chk_SDT1, cmp_SDT2);

        var Tmp_DataStr = JSON.stringify(Tmp_DataAry);
        var Tmp_sub_chk_SDT1 = Ext.getCmp('sub_chk_SDT1').getValue();
        var Tmp_sub_SDT2 = "";
        if (Tmp_sub_chk_SDT1)
            Tmp_sub_SDT2=Ext.getCmp('sub_SDT2').getValue();

        var np = {};
        np = {
            DataStr: Tmp_DataStr,
            sub_chk_SDT: Tmp_sub_chk_SDT1,
            sub_SDT: Tmp_sub_SDT2,
            sub_PROJDT: Tmp_sub_PROJDT2,
            sub_CSDTAF: Tmp_sub_CSDTAF2,
            sub_EDT: Tmp_sub_EDT2,
            sub_PECT: Tmp_sub_PECT2,
            sub_RMK: Tmp_sub_RMK2,
        };


2>*.cs
      string Tmp_chk_SDT = nvc["sub_chk_SDT"];    
      if (Tmp_chk_SDT=="true")
                Tmp_SDT = nvc["sub_SDT"];



2025年11月9日 星期日

V20201 - Query未正常顯示

 目的:  V20201 - Query未正常顯示

處理說明: 1> 因為元件id 重複, 無法正常顯示 
                     {
                        xtype: 'panel', id: 'panel14', layout: { type: 'vbox', align: 'stretch' }, flex: 25, border: 0,
                        items: [cmp_PROJDT1, cmp_PROJDT2, cmp_CSDTAF1, cmp_CSDTAF2],
                        //items: [
cmp_CSDTAF1, cmp_CSDTAF2, cmp_CSDTAF1, cmp_CSDTAF2],
                      },   // end of panel14 , flex:16        

                  2>先大範圍 remark 程式, 正常顯示後,
                      --> 再小範圍 remark 程式, 直到找出錯誤程式

1>*.js  - 因為  component id 重複,所以無法正常顯示
var Query = new Ext.FormPanel({
        id: 's_form',
        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: 30, border: 0,
                        items: [cmp_WC, cmp_FIXNO, cmp_OGONOAF, cmp_NGONOAF,],
                    },  // end of panel11
                    {
                        xtype: 'panel', id: 'panel12', layout: { type: 'vbox', align: 'stretch' }, flex: 30, border: 0,
                        items: [cmp_SERNO, cmp_TYPEAF, cmp_PN, cmp_WBS,],
                    },   // end of panel12 , flex:16                    
                    {
                        xtype: 'panel', id: 'panel13', layout: { type: 'vbox', align: 'stretch' }, flex: 30, border: 0,
                        items: [cmp_CONTAF, cmp_PROJID, cmp_SAPNO, cmp_FACWC,],
                    },   // end of panel13 , flex:16              
                    {
                        xtype: 'panel', id: 'panel14', layout: { type: 'vbox', align: 'stretch' }, flex: 25, border: 0,
                        items: [cmp_PROJDT1, cmp_PROJDT2, cmp_CSDTAF1, cmp_CSDTAF2],
                        //items: [cmp_CSDTAF1, cmp_CSDTAF2, cmp_CSDTAF1, cmp_CSDTAF2],
                    },   // end of panel14 , flex:16                               
                    {
                        xtype: 'panel', id: 'panel15', layout: { type: 'vbox', align: 'stretch' }, flex: 25, border: 0,
                        items: [cmp_chk_SDT, cmp_chk_EDT, cmp_chk_JCNHR, cmp_chk_FAVITEM,],
                    },   // end of panel14 , flex:16                               
                ]
            },  // end of panel1            


2025年11月3日 星期一

V20108F – [匯出(人力資源)] – Excel檔案(含■ , □)

 目的: V20108F – [匯出(人力資源)] – Excel檔案(, )

處理說明:1>取得子畫面的輸入參數
                      Tmp_MITM = Ext.getCmp('sub_MITM').getValue();
                      Tmp_WC = Ext.getCmp('sub_WC').getValue();
                      Tmp_PN = Ext.getCmp('sub_PN').getValue();
                      var np = {};
                       //var np = s_JSON('mySubFormF'); 
                      np["sub_MITM"] = Tmp_MITM;
                      np["sub_WC"] = Tmp_WC;
                     np["sub_PN"] = Tmp_PN;
                     var Tmp_url = "../../api/V20108FAPI/AMM_WKSTPD2XLS";
                     Ext.util.Cookies.set("Rtn_Msg", "");
                     Ext.getCmp('s_form').submit({
                        url: Tmp_url,
                        method: 'POST',
                        async: false,
                        standardSubmit: true, //若要傳送檔案至前端, standardSubmit必需設為 true   
                        params: np,
                   });

                 2>*.cs  - 寫入  *.xls  
                     string Tmp_FName = "V20108_匯出_人力資源設定.xlsx";      //套表的檔案名稱 
                     string documentPath = HttpContext.Current.Server.MapPath("~") + "document\\";
                string Tmp_FName1 = "V20108_匯出_人力資源設定" + DateTime.Now.ToString("yyyyMMdd") + ".xlsx";
                   Tmp_FName1 = documentPath + Tmp_FName1;
                   FileStream fs = null;
                  Workbook wk = null;
                   fs = myfunc.get_SS_FILES(Tmp_FName);
                  wk = new Workbook();
                  wk.LoadFromStream(fs);
                 Worksheet ws = wk.Worksheets[0];//獲取第一個工作表       

                  ws.Range[myfunc.GetExcelPos(2, 0)].Text = Tmp_PN;  //件號
                  ws.Range[myfunc.GetExcelPos(0, cur_row)].Text = "□";  //EMPID     



1>*.js
        Tmp_MITM = Ext.getCmp('sub_MITM').getValue();
        Tmp_WC = Ext.getCmp('sub_WC').getValue();
        Tmp_PN = Ext.getCmp('sub_PN').getValue();

        var np = {};
        //var np = s_JSON('mySubFormF'); //TMFunction.js, 組合form上的查詢條件為json參數傳遞    , type=2, 所有欄位值 , 均傳至後端(不排除_  CaluField)
        np["sub_MITM"] = Tmp_MITM;
        np["sub_WC"] = Tmp_WC;
        np["sub_PN"] = Tmp_PN;
        var Tmp_url = "../../api/V20108FAPI/AMM_WKSTPD2XLS";
        //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() {  //批次新增       
       
2>*.cs
// AMM_WKSTPD2XLS() - 工作步序.人力資源(AMM_WKSTPD) 匯出 XLS
        //若成功,傳回 "[匯出]成功"
        //若失敗, 則傳回"錯誤: [匯出]失敗"
        [HttpPost]
        public dynamic AMM_WKSTPD2XLS()
        {
            //取得參數值
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            string Tmp_RtnMsg = "";
            string Tmp_MITM = nvc["sub_MITM"];
            string Tmp_WC = nvc["sub_WC"];
            string Tmp_PN = nvc["sub_PN"];


            HttpCookie MyCookie;
            int cur_row = 0;

            string Tmp_Str = "";
            string Tmp_FName = "V20108_匯出_人力資源設定.xlsx";      //套表的檔案名稱 
            string documentPath = HttpContext.Current.Server.MapPath("~") + "document\\";
            //string pathFName = documentPath + Tmp_FName;
            string Tmp_FName1 = "V20108_匯出_人力資源設定" + DateTime.Now.ToString("yyyyMMdd") + ".xlsx";
            Tmp_FName1 = documentPath + Tmp_FName1;
            FileStream fs = null;
            Workbook wk = null;
            fs = myfunc.get_SS_FILES(Tmp_FName);
            wk = new Workbook();
            wk.LoadFromStream(fs);
            Worksheet ws = wk.Worksheets[0];//獲取第一個工作表            
            //件號/件號名稱
            DataTable Tmp_dt1 = new DataTable();
            DataTable Tmp_dt2 = new DataTable(); //機具財編/名稱
            DataTable Tmp_dt3 = new DataTable(); //支援工作中心.人員編號+人員姓名
            int Tmp_cnt1;
            int Tmp_cnt2;
            int Tmp_cnt3;
            MemoryStream mstream = new MemoryStream();
            string Tmp_CNM = "", Tmp_WITM = "", Tmp_WHR = "", Tmp_PQTY = "", Tmp_AQTY = "";
            string Tmp_EMPID = "", Tmp_EMPNM = "",Tmp_PV="";
            try
        {         
            string Tmp_Sql = " SELECT    A.MITM,A.WC,A.DEPID,A.PN,A.CNM,"
                                                      + "  B.WITM,B.WHR,B.PQTY,B.AQTY "
                                       + "  FROM    AMM_WKSTP A, AMM_WKSTPD B "
                                       + "  WHERE  A.MITM=B.MITM "
                                       + "  AND       A.MITM=" + myfunc.AA(Tmp_MITM)
                                       + " AND        A.WC=" + myfunc.AA(Tmp_WC)
                                       + "  AND        A.PN=" + myfunc.AA(Tmp_PN);
            Tmp_dt1 = myfunc.SqlOpen(Tmp_dt1, Tmp_Sql);
            Tmp_cnt1 = Tmp_dt1.Rows.Count;
                //進廠檢測
                ws.Range[myfunc.GetExcelPos(1, 3)].Text = "0";  //工時-進廠檢測
                ws.Range[myfunc.GetExcelPos(1, 5)].Text = "0"; //人數-熟手
                ws.Range[myfunc.GetExcelPos(3, 5)].Text = "0"; //人數-生手
                //拆檢
                ws.Range[myfunc.GetExcelPos(5, 3)].Text = "0";  //工時 - 拆檢
                ws.Range[myfunc.GetExcelPos(6, 5)].Text = "0"; //人數-熟手
                ws.Range[myfunc.GetExcelPos(9, 5)].Text = "0"; //人數-生手
                //組裝
                ws.Range[myfunc.GetExcelPos(12, 3)].Text = "0";  //工時 - 組裝
                ws.Range[myfunc.GetExcelPos(12, 5)].Text = "0"; //人數-熟手
                ws.Range[myfunc.GetExcelPos(15, 5)].Text = "0"; //人數-生手
                //完工測試
                ws.Range[myfunc.GetExcelPos(18, 3)].Text = "0";  //工時 - 完工測試
                ws.Range[myfunc.GetExcelPos(18, 5)].Text = "0"; //人數-熟手
                ws.Range[myfunc.GetExcelPos(21, 5)].Text = "0"; //人數-生手

                for (var i = 0; i < Tmp_cnt1; i++)
            {
                Tmp_CNM = Tmp_dt1.Rows[i]["CNM"].ToString();
                Tmp_WITM = Tmp_dt1.Rows[i]["WITM"].ToString();
                Tmp_WHR = Tmp_dt1.Rows[i]["WHR"].ToString();
                Tmp_PQTY = Tmp_dt1.Rows[i]["PQTY"].ToString();
                Tmp_AQTY = Tmp_dt1.Rows[i]["AQTY"].ToString();
                if (Tmp_WITM=="1")  //進廠檢測
                    {
                        ws.Range[myfunc.GetExcelPos(1, 3)].Text = Tmp_WHR;  //工時-進廠檢測
                        ws.Range[myfunc.GetExcelPos(1, 5)].Text = Tmp_PQTY; //人數-熟手
                        ws.Range[myfunc.GetExcelPos(3, 5)].Text = Tmp_AQTY; //人數-生手
                    }
                    if (Tmp_WITM == "2")  //拆檢
                    {
                        ws.Range[myfunc.GetExcelPos(5, 3)].Text = Tmp_WHR;  //工時 - 拆檢
                        ws.Range[myfunc.GetExcelPos(6, 5)].Text = Tmp_PQTY; //人數-熟手
                        ws.Range[myfunc.GetExcelPos(9, 5)].Text = Tmp_AQTY; //人數-生手
                    }
                    if (Tmp_WITM == "3")  //組裝
                    {
                        ws.Range[myfunc.GetExcelPos(12, 3)].Text = Tmp_WHR;  //工時 - 組裝
                        ws.Range[myfunc.GetExcelPos(12, 5)].Text = Tmp_PQTY; //人數-熟手
                        ws.Range[myfunc.GetExcelPos(15, 5)].Text = Tmp_AQTY; //人數-生手
                    }
                    if (Tmp_WITM == "4")  //完工測試
                    {
                        ws.Range[myfunc.GetExcelPos(18, 3)].Text = Tmp_WHR;  //工時 - 組裝
                        ws.Range[myfunc.GetExcelPos(18, 5)].Text = Tmp_PQTY; //人數-熟手
                        ws.Range[myfunc.GetExcelPos(21, 5)].Text = Tmp_AQTY; //人數-生手
                    }
                }
                string Tmp_WEANO="", Tmp_NM="";
                string Tmp_WEANO_Str="", Tmp_NM_Str="";

                Tmp_Sql = " SELECT   DISTINCT    WEANO,NM "
                               + "  FROM    AMM_DEVD  "
                               + "  WHERE  1=1 "
                               + "  AND        MITM=" + myfunc.AA(Tmp_MITM);
                Tmp_dt2 = myfunc.SqlOpen(Tmp_dt2, Tmp_Sql);
                Tmp_cnt2 = Tmp_dt2.Rows.Count;
                for (var i = 0; i < Tmp_cnt2; i++)
                {
                    Tmp_WEANO = Tmp_dt2.Rows[i]["WEANO"].ToString();
                    Tmp_NM = Tmp_dt2.Rows[i]["NM"].ToString();
                    Tmp_WEANO_Str = Tmp_WEANO_Str+Tmp_WEANO+"/";
                    Tmp_NM_Str = Tmp_NM_Str +Tmp_NM+"/";
                }
                ws.Range[myfunc.GetExcelPos(2, 0)].Text = Tmp_PN;  //件號
                ws.Range[myfunc.GetExcelPos(2, 1)].Text = Tmp_CNM;  //名稱
                ws.Range[myfunc.GetExcelPos(13, 0)].Text = Tmp_WEANO_Str;  //關鍵機具財編
                ws.Range[myfunc.GetExcelPos(13, 1)].Text = Tmp_NM_Str;//關鍵機具名稱
                Tmp_Sql = " SELECT   DISTINCT    EMPID,EMPNM "
                               + "  FROM    AMM_EMP  "
                               + "  WHERE  1=1 "
                               + "  AND        SUPWC=" + myfunc.AA(Tmp_WC)
                               +"   ORDER  BY EMPID ";
                Tmp_dt3 = myfunc.SqlOpen(Tmp_dt3, Tmp_Sql);
                Tmp_cnt3 = Tmp_dt3.Rows.Count;
                cur_row = 7;
                for (var i = 0; i < Tmp_cnt3; i++)
                {
                    Tmp_EMPID= Tmp_dt3.Rows[i]["EMPID"].ToString();
                    Tmp_EMPNM = Tmp_dt3.Rows[i]["EMPNM"].ToString();
                    ws.Range[myfunc.GetExcelPos(0, cur_row)].Text = "□";  //EMPID
                    ws.Range[myfunc.GetExcelPos(1, cur_row)].Text = Tmp_EMPID;  //EMPID
                    ws.Range[myfunc.GetExcelPos(2, cur_row)].Text = Tmp_EMPNM;  //EMPNM
                    ws.Range[myfunc.GetExcelPos(3, cur_row)].Text = "□";  //EMPID
                    ws.Range[myfunc.GetExcelPos(4, cur_row)].Text = Tmp_EMPID;  //EMPID
                    ws.Range[myfunc.GetExcelPos(5, cur_row)].Text = Tmp_EMPNM;  //EMPNM
                    ws.Range[myfunc.GetExcelPos(6, cur_row)].Text = "□";  //EMPID
                    ws.Range[myfunc.GetExcelPos(7, cur_row)].Text = Tmp_EMPID;  //EMPID
                    ws.Range[myfunc.GetExcelPos(8, cur_row)].Text = Tmp_EMPNM;  //EMPNM
                    ws.Range[myfunc.GetExcelPos(9, cur_row)].Text = "□";  //EMPID
                    ws.Range[myfunc.GetExcelPos(10, cur_row)].Text = Tmp_EMPID;  //EMPID
                    ws.Range[myfunc.GetExcelPos(11, cur_row)].Text = Tmp_EMPNM;  //EMPNM
                    ws.Range[myfunc.GetExcelPos(12, cur_row)].Text = "□";  //EMPID
                    ws.Range[myfunc.GetExcelPos(13, cur_row)].Text = Tmp_EMPID;  //EMPID
                    ws.Range[myfunc.GetExcelPos(14, cur_row)].Text = Tmp_EMPNM;  //EMPNM
                    ws.Range[myfunc.GetExcelPos(15, cur_row)].Text = "□";  //EMPID
                    ws.Range[myfunc.GetExcelPos(16, cur_row)].Text = Tmp_EMPID;  //EMPID
                    ws.Range[myfunc.GetExcelPos(17, cur_row)].Text = Tmp_EMPNM;  //EMPNM
                    ws.Range[myfunc.GetExcelPos(18, cur_row)].Text = "□";  //EMPID
                    ws.Range[myfunc.GetExcelPos(19, cur_row)].Text = Tmp_EMPID;  //EMPID
                    ws.Range[myfunc.GetExcelPos(20, cur_row)].Text = Tmp_EMPNM;  //EMPNM
                    ws.Range[myfunc.GetExcelPos(21, cur_row)].Text = "□";  //EMPID
                    ws.Range[myfunc.GetExcelPos(22, cur_row)].Text = Tmp_EMPID;  //EMPID
                    ws.Range[myfunc.GetExcelPos(23, cur_row)].Text = Tmp_EMPNM;  //EMPNM
                    for (var j = 0; j <= 3; j++)
                    {
                        Tmp_Sql = " SELECT   DISTINCT    MITM,WITM,EMPID,EMPNM,PV"
                                   + "  FROM        AMM_EMPD  "
                                   + "  WHERE     1=1 "
                                   + "  AND        MITM=" + myfunc.AA(Tmp_MITM)
                                   + "  AND         EMPID=" + myfunc.AA(Tmp_EMPID)
                                   + "   AND        WITM=" + myfunc.AA((j+1).ToString());
                        Tmp_Str = myfunc.SqlValue(Tmp_Sql);
                        Tmp_PV = myfunc.StrExtract(Tmp_Str, 5);
                        if (Tmp_PV == "2")  //熟手
                        {
                            ws.Range[myfunc.GetExcelPos(j*6+0, cur_row)].Text = "■";  //EMPID
                        }
                        if (Tmp_PV == "1") //生手
                        {
                            ws.Range[myfunc.GetExcelPos(j*6+3, cur_row)].Text = "■";  //EMPID
                        }
                    }  // end of  for (var j = 1; j <= 4; j++)
                    cur_row = cur_row + 1;
                }  // end of   for (var i = 0; i < Tmp_cnt3; i++)

                wk.SaveToStream(mstream, FileFormat.Version2007);
            wk.SaveToFile(Tmp_FName1, FileFormat.Version2007);

            string Tmp_Row = "5";
            Tmp_RtnMsg = "已匯出完成!!(" + Tmp_Row.ToString() + "筆)<br>"
                                     + "檔案名稱(" + Tmp_FName + ")";
            MyCookie = new HttpCookie("Rtn_Msg", HttpUtility.UrlEncode(Tmp_RtnMsg));
            HttpContext.Current.Response.Cookies.Add(MyCookie);
            HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + HttpUtility.UrlEncode(Tmp_FName, System.Text.Encoding.UTF8) + "\"");
            HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
            HttpContext.Current.Response.BinaryWrite(mstream.ToArray());
            HttpContext.Current.Response.End();
        }
        catch (Exception e)
            {
                Tmp_RtnMsg = myfunc.Get1ORA(e.Message);
                Tmp_RtnMsg = "錯誤:匯出(人力資源設定-AMM_WKSTPD)失敗!!<br>"
                                        + Tmp_RtnMsg;
                MyCookie = new HttpCookie("Rtn_Msg", HttpUtility.UrlEncode(Tmp_RtnMsg));
                HttpContext.Current.Response.Cookies.Add(MyCookie);
            }
            finally
            {
                wk.Dispose();
                fs.Close();
                fs.Dispose();
            }