2026年5月27日 星期三

V1060302-實體定更定檢清單-匯出 –後端錯誤時,出現黑畫面 --> 不用 Response.End(); -->改用 CompleteRequest()

 目的: V1060302-實體定更定檢清單-匯出 –後端錯誤時,出現黑畫面 
           --> Exception :不用 Response.End();  -->改用 CompleteRequest()
           --> 寫入檔案  : 用 Response.End(); 不用 CompleteRequest();

處理說明:  1> catch (e:Message){                          
                        不可用 HttpContext.Current.Response.End();               
                        à改用HttpContext.Current.ApplicationInstance.CompleteRequest();
                       }
                 2> 寫入檔案時,要用 Response.End();
                       不可用 HttpContext.Current.ApplicationInstance.CompleteRequest();   
                      //檔案會無法開啟
                       
                HttpContext.Current.Response.Cookies.Add(MyCookie);
                HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + HttpUtility.UrlEncode(Tmp_FName1, System.Text.Encoding.UTF8) + "\"");
                HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
                HttpContext.Current.Response.BinaryWrite(mstream.ToArray());
                HttpContext.Current.Response.End();
                HttpContext.Current.ApplicationInstance.CompleteRequest();   //檔案會無法開啟



1>*.cs
          try{
                wk.SaveToStream(mstream, FileFormat.Version2007);
                wk.SaveToFile(Tmp_pFName1, FileFormat.Version2007);
                Tmp_Str = "已匯出完成!!(" + row.ToString() + "筆)<br>"
                            + "檔案名稱(" + Tmp_FName1 + ")";
                MyCookie = new HttpCookie("Rtn_Msg", HttpUtility.UrlEncode(Tmp_Str));
                HttpContext.Current.Response.Cookies.Add(MyCookie);
                HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=\"" + HttpUtility.UrlEncode(Tmp_FName1, System.Text.Encoding.UTF8) + "\"");
                HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
                HttpContext.Current.Response.BinaryWrite(mstream.ToArray());
                HttpContext.Current.Response.End();
                HttpContext.Current.ApplicationInstance.CompleteRequest();   //檔案會無法開啟

         
}         catch (Exception e)
            {
                //Console.WriteLine(e);
                Tmp_Str = "錯誤:匯出檔案失敗,訊息如下:<br>"
                               + e.Message;
                MyCookie = new HttpCookie("Rtn_Msg", HttpUtility.UrlEncode(Tmp_Str));
                HttpContext.Current.Response.Cookies.Add(MyCookie);
                //HttpContext.Current.Response.End();                
                HttpContext.Current.ApplicationInstance.CompleteRequest();
            }


2>*.js
 Ext.getCmp('s_form').submit({
        //Ext.Ajax.request({
        url: '../../api/V1060302CAPI/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');  //Exception 時, 若用 Response.End() , 則會抓不到 Cookie
        //console.log("r_cookies=", r);
        if (!checkisnull(r)) {
            mysuccessalert(r);
            clearInterval(timer);
            mask.hide();
            timer = null;
        }
    }, 1000);  //1000ms = 1sec

V1060302-實體定更定檢清單- [編輯][存檔]後, Query的高度變大 - Query高度亂掉 - CheckBox

 目的: V1060302-實體定更定檢清單- [編輯][存檔], Query的高度變大
                      如何處理

處理說明:  1> Query的高度設為固定
                        var Query = new Ext.FormPanel({
                                              id: 's_form',
                                             height:100,
                                             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',
        layout: { type: 'hbox', align: 'stretch' },
        fieldDefaults: { labelAlign: 'right' },
        defaults: { margin: { top: 3 } },
        height: 100,
        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_PROJID, cmp_TYPE,],
                    },  // end of panel11
                    {


//按存檔後,重新顯示資料
   Ext.getCmp('btn_save').setFormValue = function () {
        Ext.getCmp('btn_Show').fireHandler();
        return true;
    };

V1060302-實體定更定檢清單 – 編輯欄位(AMM_CHKCHG_ASN)+CaluField(AMM_CHKCHG) -[存檔]錯誤

目的:V1060302-實體定更定檢清單 – 單檔維護 - 編輯欄位 - SQL多個Table
        (AMM_CHKCHG_ASN)+CaluField(AMM_CHKCHG)
        --> SQL 不用 CaluField, SQL用FROM AMM_CHKCHG_ASN A ,AMM_CHKCHG B
        -->[編輯][存檔]時,更新的欄位不正確(Ex: AMM_CHKCHG.PTMVAL1,PTMVAL2)

處理說明:  1>Template.SQL 必需單一Table(AMM_CHKCHG_ASN), 
                       將參考顯示欄位(AMM_CHKCHG)設為 CaluField   
                   2>若 SQL 多個 Table(AMM_CHKCHG_ASN ,AMM_CHKCHG ) 時,
                        當[存檔]時,抓 Update 欄位會有問題







2026年5月26日 星期二

V1060302 –實體定更定檢清單 - Item 挑選後 – change event 沒觸發

目的: V1060302 –實體定更定檢清單 - Item 挑選後 – change event 沒觸發
          --> Item挑選後,顯示該Item的定更定檢資料


處理說明:  1>[Item] 挑選欄位值, 挑選後未觸發 change event 

                        -->   var win = EditPickx('ITEM', '../api/V1060302API/get_ITEMPick', ['ITEM'],            
                                                ['ITEM'], J_pickstore_ITEM, J_pickcolumns_ITEM,true,false);
                                 win.show();
                        --> EditPickx 預設會 Disable change event 
                  2>呼叫 EditPickx 時,將 isSuspendEvent 設為 false
                      --> 不 Disable change event 
                        

1>*.js
//ITEM
Ext.getCmp('btn_ITEM').on("click", function () {
var win = EditPickx('ITEM', '../api/V1060302API/get_ITEMPick', ['ITEM'], ['ITEM'],  
                                  J_pickstore_ITEM, J_pickcolumns_ITEM,true,false);
win.show();
});
--> 將  EditPickx 的 isSuspendEvent 設為 false , 不 suspend change event 


 var Tmp_ITEM = Ext.getCmp("ITEM");
    console.log("Tmp_ITEM:", Tmp_ITEM);
    //若change 沒觸發 ,必需將   EditPickx 的 isSuspendEvent =false,
    Ext.getCmp("ITEM").on('change', function (me, newValue, oldValue, eOpts) {
    //Ext.getCmp("ITEM").on('blur', function (me, eOpts) {
        var Tmp_PROJID = Ext.getCmp("PROJID").getValue();
        var Tmp_TYPE = Ext.getCmp("TYPE").getValue();
        var Tmp_ITEM = Ext.getCmp("ITEM").getValue();
        if ((!checkisnull(Tmp_PROJID)) && (!checkisnull(Tmp_TYPE)) && (!checkisnull(Tmp_ITEM)))
            Show_AMM_CHKCHG_Data(Tmp_PROJID, Tmp_TYPE, Tmp_ITEM);
    });

2026年5月25日 星期一

V1060301- 專案定更定檢件清單 - 單檔維護(新增/修改/刪除/挎貝) - 下載匯入格式/匯入/匯出

 目的: V1060301- 專案定更定檢件清單 - 單檔維護(新增/修改/刪除/挎貝) - 匯入/匯出

處理說明: 1>單檔維護(新增/修改/刪除/挎貝)
                       var S_DB = Ext.create('S_DB', {
                                              apiName: 'V1060301'
                                          });
                        呼叫 ..\V1060301API\Update() , Insert()
                 2>編輯欄位挑選:
                     {
xtype: "fieldcontainer", fieldLabel: "分類", labelWidth: 160, layout: "hbox", items: [
{ id: "TYPE", name: "TYPE", xtype: "textfield", width: 30, padding: "0 4 0 0", maxLength: 1 },
{ id: "TYPE_", name: "TYPE_", xtype: "textfield", width: 60, fieldCls: "calculate", readOnly: true, padding: "0 4 0 0" },
{
  id: "btn_TYPE", name: "btn_TYPE", xtype: "button", text: "...",
  //handler: function () {
// var win = EditPickx('挑選分類', '../api/V1060301API/get_TYPEPick',
// ['TYPE', 'DESCPT'], ['TYPE', 'TYPE_'],
// J_pickstore_TYPE, J_pickcolumns_TYPE);
// win.show();
//}
}
], labelStyle: "font-size:11pt;"
}, 

    //分類 - on 不可用 handler -屬性名稱, click 才是event 名稱
    Ext.getCmp('btn_TYPE').on("click", function () {
        var win = EditPickx('分類', '../api/V1060301API/get_TYPEPick', ['TYPE', 'DESCPT'], ['TYPE', 'TYPE_'], J_pickstore_TYPE, J_pickcolumns_TYPE);
        win.show();
    });

               3>下載匯入格式/匯入/匯出 
   {  // checkbox 方式 - 分頁勾選
            xtype: 'button', text: '下載匯入格式', id: 'DownloadBtn_1',
            listeners: {
                click: function () {
                    document.location = "../api/VUTLAPI/dnloadSS_File?FNAME=V1060301_專案定更定檢清單_匯入.xlsx";
                }
            }
        },
        {  //以 checkbox 分頁勾選方式 , 由 cbxArr1()  至後端取得資料匯入 
            xtype: 'button', text: '匯入', id: 'XlsInBtn_1',
            listeners: {
                click: function () {                    
                    CALL_V1060301B();
                }
            }
        },




1>*.js

{  // checkbox 方式 - 分頁勾選
            xtype: 'button', text: '下載匯入格式', id: 'DownloadBtn_1',
            listeners: {
                click: function () {
                    //DownloadBtn_1_click();
                    document.location = "../api/VUTLAPI/dnloadSS_File?FNAME=V1060301_專案定更定檢清單_匯入.xlsx";
                }
            }
        },
        {  //以 checkbox 分頁勾選方式 , 由 cbxArr1()  至後端取得資料匯入 
            xtype: 'button', text: '匯入', id: 'XlsInBtn_1',
            listeners: {
                click: function () {                    
                    //XlsInBtn_1_click();                     
                    CALL_V1060301B();
                }
            }
        },
        {  //以 checkbox 分頁勾選方式 , 由 cbxArr1()  至後端取得資料匯出 
            xtype: 'button', text: '匯出', id: 'XlsOutBtn_1',
            listeners: {
                click: function () {                    
                    Ext.Ajax.request({
                        url: '../api/V1060301API/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_V1060301C(Tmp_DataAry1); //排程資料匯出
                        }
                    });
                }
            }
        },
        {  //以 checkbox 分頁勾選方式 , 由 cbxArr1()  至後端取得資料匯出 
            xtype: 'button', text: '撤銷', id: 'RemoveBtn_1',
            listeners: {
                click: function () {
                    var Tmp_Str;
                    var Tmp_CHKCHG_NM;
                    var cur_recs = Ext.getCmp('grid_Single').getSelectionModel().getSelection();
                    var cur_rec = null;
                    if (cur_recs.length == 0)
                    {
                        Tmp_Str = "請先選擇要撤銷的定更定檢項目!!";
                        myalert(Tmp_Str);
                    }
                    else {
                        console.log("cur_recs:", cur_recs);
                        cur_rec = cur_recs[0];
                        console.log("cur_rec:", cur_rec);
                        Tmp_CHKCHG_NM = nulltoStr(cur_rec.data['CHKCHG_NM']).toString();
                        Tmp_Str = "確定將本定更定檢項目(" + Tmp_CHKCHG_NM + ")\r\n"
                            + "撤銷嗎?\r\n";
                        var id = confirm(Tmp_Str);
                        if (id) {
                            CALL_V1060301D();
                        };
                    }
                    
                }
            }
        },

2026年5月24日 星期日

V1060302 – 專案定更檢清單 - 分類 – Runtime 設定挑選欄位 - click - 不可用handler

 目的: V1060302 – 專案定更檢清單 - 分類 – Runtime 設定挑選欄位

處理說明:  1> click 才是 event 名稱, 不可用 handler

                        handler 是屬性名稱,不是 event name , 所以不可用在 on('handler', function(){


1>*.js
//設定[編輯]畫面 - 欄位挑選(DoubleClick)設定    
    Ext.getCmp('btn_TYPE').on("click", function () {
        var win = EditPickx('分類', '../api/V1060301API/get_TYPEPick', 
                   ['TYPE', 'DESCPT'], ['TYPE', 'TYPE_'], J_pickstore_TYPE, J_pickcolumns_TYPE);
        win.show();
    });

--> 不可用 on("handler",function(){


2026年5月7日 星期四

按[F12]鈕 - Network Debug 的範例 - 當前端發出一個 Url Request 時(../API/V80E01AAPI/get_sub_TreeData1) , Debug 資料是否正確

目的: 按[F12]鈕  - Network Debug 的範例
           當前端發出一個 Url Request 時(../API/V80E01AAPI/get_sub_TreeData1) , 
           Debug 資料(url/Request method/傳入參數/傳回值/..)是否正確
           -Ex: V80E01A - 展開節點時, 按 F12 ,可以看到 URL , FormData 及傳回資料

處理說明: 1>當呼叫後端Request(url) 時,按 [F12]鈕, 
                      可以看到[Network]頁 列出後端的 URL
                  2>於 [Network]頁, 點[Header]Sheet, 看到 Request method: Post/Get
                  3>點[Payload]Sheet, 看到 傳入參數: Form Data
                  4>點[PreView]Sheet,看到傳回的資料(DataSet/Table)
                  5>點[Respons]Sheet,看到傳回的資料(json結構)



1>[Network]頁: URL
2>[Header]Sheet: Request method

3>[Payload]Sheet: 傳入參數(Form Date)


4>[Preview]Sheet : 傳回結果(dataset/datatable)


5>[Response]Sheet: 顯示 json結構



好的,我來示範一個「Network Debug 範例」,讓你能在瀏覽器 F12 檢查 TreeStore 的請求是否真的送出到後端:


🔧 步驟

  1. 打開瀏覽器開發者工具

    • 在 Chrome/Edge 按 F12Ctrl+Shift+I
    • 切換到 Network 面板。
  2. 展開節點觸發請求

    • 在你的 Ext.tree.Panel 裡點擊某個節點。
    • 如果 TreeStore 正常設定,這時候應該會送出一個 HTTP 請求。
  3. 檢查請求細節

    • 在 Network 面板找到對應的請求 (通常 URL 是 ../api/V80E01AAPI/get_sub_TreeData1)。
    • 點擊該請求,檢查:
      • Request Method:是否為 POST(如果後端是 [HttpPost])。
      • Request Payload / Form Data:是否有帶上 cur_DEPID
      • Response:後端是否回傳 JSON,格式是否正確。
  4. 常見錯誤排查

    • 如果請求沒有出現 → 代表 TreeStore 沒有觸發 Proxy,檢查 beforeload 是否正確設定。
    • 如果請求出現但狀態碼是 405 Method Not Allowed → 前端用 GET,後端只允許 POST。
    • 如果狀態碼是 404 Not Found → URL 路徑不匹配。
    • 如果狀態碼是 200 OK 但沒有資料 → 後端查詢邏輯或回傳格式不符。

範例截圖檢查重點

  • Request URL: http://localhost:xxxx/api/V80E01AAPI/get_sub_TreeData1
  • Request Method: POST
  • Form Data:
    cur_DEPID: AIDC
    
  • Response JSON:
    [
      { "id":"A001", "text":"A001:部門", "leaf":false },
      { "id":"E001", "text":"E001:員工", "leaf":true }
    ]
    

👉 這樣你就能快速判斷:到底是 前端沒送出,還是 後端沒接到,或是 資料格式不符

要不要我幫你寫一個「最小可測試範例」的 TreeStore + Controller,讓你可以直接跑起來測試 Network 面板?