2026年8月26日 星期三

V20301- [複製]鈕- 複製勾選資料後,停留在最後一筆資料

 目的: V20301- [複製]- 複製勾選資料後,停留在最後一筆資料

處理說明: 1>store.on("load",function(store.records){
store.on('load', function (store, records) { //20260826 yalan 將標記跑到最後一筆 
 if (records.length > 0) {
     var lastRecord = records[records.length - 1];
       // 選取最後一筆
       grid.getSelectionModel().select(lastRecord);

}
}, this, {
single: true
});



1>*.js
                //因為複製後, 按[顯示資料]鈕, 並不會顯示剛才新增的資料,& Local 新增的資料    
                 //20260826 將標記移至最後一筆
                    var grid = Ext.getCmp('grid_Single');
                    var store = grid.getStore();
                    store.on('load', function (store, records) {  //20260826 yalan 將標記跑到最後一筆
                        if (records.length > 0) {
                            var lastRecord = records[records.length - 1];
                            // 選取最後一筆
                            grid.getSelectionModel().select(lastRecord);
                        }
                    }, this, {
                        single: true
                    });

                    Ext.getCmp('btn_Show').fireHandler();

V20301-[刪除]鈕- 刪除目前所勾選的資料 , 必需清空 PK_LIST & ALL_LIST

 目的: V20301-[刪除]- 刪除目前所勾選的資料 , 必需清空 PK_LIST & ALL_LIST

處理說明: 1> var cur_recs = CHK_PK_OBJ.ALL_LIST;
                       for (var i = 0; i < CHK_PK_OBJ.PK_LIST.length; i++) {
                              cur_rec = CHK_PK_OBJ.ALL_LIST[i];
                               Tmp_DataAry1.push(cur_rec);
                        }

                    let Tmp_DataString1 = JSON.stringify(Tmp_DataAry1);
                    var np = {};
                    np["DataString1"] = Tmp_DataString1;
                    Tmp_url = '../../api/V20301API/Delete_1';
                    Tmp_RtnStr = getUrlStr(Tmp_url, np, "刪除 勾選的[交修件單號] 資料");
                    if (!checkRtnOK(Tmp_RtnStr)) {
                        mywarnalert(Tmp_RtnStr);
                        return;
                    }


1>*.js
Ext.getCmp("btn_del").on('click', function (me, e, eOpts) {
        parent.onclick = function () { };
        var cur_recs = CHK_PK_OBJ.ALL_LIST;
        var cur_rec;        
        if (cur_recs.length == 0)
        {
            buttonModel.modelType = 0;
            mywarnalert('請先勾選要刪除的資料!!');
        }
        else {
            me.delMessage = "確定刪除勾選的資料嗎?";
            Ext.Msg.confirm('提醒', me.delMessage, callBackFunc);
            function callBackFunc(id) {
                if (id == 'yes') {
                    console.log("cur_recs.length:", cur_recs.length);
                    var gridstore = Ext.getCmp('grid_Single').store;
                    //刪除勾選.FMNO
                    var Tmp_DataAry1 = [];
                    for (var i = 0; i < CHK_PK_OBJ.PK_LIST.length; i++) {
                        cur_rec = CHK_PK_OBJ.ALL_LIST[i];
                        Tmp_DataAry1.push(cur_rec);
                    }
                    //2026/08/26 刪除後,必需將 PK_LIST & ALL_LIST 清空
                    CHK_PK_OBJ.PK_LIST = [];
                    CHK_PK_OBJ.ALL_LIST = [];
                    let Tmp_DataString1 = JSON.stringify(Tmp_DataAry1);
                    var np = {};
                    np["DataString1"] = Tmp_DataString1;
                    Tmp_url = '../../api/V20301API/Delete_1';
                    Tmp_RtnStr = getUrlStr(Tmp_url, np, "刪除 勾選的[交修件單號] 資料");
                    if (!checkRtnOK(Tmp_RtnStr)) {
                        mywarnalert(Tmp_RtnStr);
                        return;
                    }
                    else
                        mysuccessalert(Tmp_RtnStr);
                    //for (let i = 0; i <= cur_recs.length - 1; i++) {
                    //    console.log("i:", i);                        
                    //    //Ext.getCmp('grid_Single').getSelectionModel().select(cur_recs[i]); //grid select指向所選的資料
                    //    //cur_rec = Ext.getCmp('grid_Single').getSelectionModel().getSelection();
                    //    cur_rec = CHK_PK_OBJ.ALL_LIST[i];
                    //    console.log("cur_rec: ", cur_rec);                        
                    //    if (Ext.getCmp('btn_del').afterDel() == false) {
                    //        return;
                    //    }                                                
                    //} //  end of for (let i=0,)
                    //資料庫均刪除完成後, 才由 gridstore 移除資料
                    //for (let i = 0; i <= cur_recs.length - 1; i++) {
                    //    gridstore.remove(cur_recs[i]); //畫面上隱藏刪除列                     
                    //} //  end of for (let i=0,)
                    var toRemove = [];
                    Ext.getCmp('grid_Single').store.each(function (rec) {
                        if (rec.get('CHECK') == true)
                            toRemove.push(rec);
                            //gridstore.remove(rec); //畫面上隱藏刪除列  -->改成一次 remove all
                    });
                    gridstore.remove(toRemove); // remove all at once

                    Ext.getCmp('grid_Single').getView().refresh();
                    buttonModel.modelType = 0;
                }  // end    if (id == 'yes')             
            }  // end of callbackfunc
        }  //else { of if length>0            
    }) // end of click function 

2026年8月25日 星期二

V20301 - S_DB.add_np[“FMNO”] , 覆蓋原本畫面的 np[“FMNO”] 欄位值 - [新增]鈕 - 設定畫面初始值

目的: V20301 - S_DB.add_np[“FMNO”] , 覆蓋原本畫面的 np[“FMNO”] 欄位值

處理說明: 1>[新增]鈕 - 設定PK欄位(FMNO)起始值,  
                      S_DB.add_np["FMNO"]=Tmp_NEXT_FMNO
                  2>[修改]鈕 - S_DB.add_np 必需清空,以免畫面  PK 欄位值,被 S_DB.add_np[] 覆蓋




1>*.js
Ext.getCmp('btn_save').setFormValue = function () {
        //1>取得 PK= MAX(PK)+1 , 新增時,才設定 PK 欄位值, 編輯時 , 不設定欄位值
        var modelType = buttonModel.getModelType();
        //2026/08/26 , 新增時設定 S_DB.add_np["FMNO"] , 會一直被保留, 
        //下次 UPDATE 時必需清空 S_DB.add_np , 否則   S_DB.add_np["FMNO"] 會一宜被保留,
        //--> np["FMNO"] 會一直被 add_np["FMNO"] 取代
        S_DB.add_np = {};  
        if (!(modelType == 1))
            return true;
        // [新增]時,才執行下面程式
        var Tmp_NEXT_FMNO = get_NEXT_FMNO();        
        Ext.getCmp("FMNO").setValue(Tmp_NEXT_FMNO);       
        Ext.getCmp("STATFM").setValue("A");               
        //2>設定 RadioGroup 欄位值 , 由 S_DB.add_np 設定特別的欄位值
        S_DB.add_np = {};
        S_DB.add_np["FMNO"] = Ext.getCmp("FMNO").getValue();        
        S_DB.add_np["STATFM"] = 'A';
        return true;
    }



2026年8月20日 星期四

UTF-8 vs ANSI(Big-5)

 

你實際使用電腦時,記住這一句就夠了

1>早期系統: Big-5(CP950)   --> ANSI

新檔案 → UTF-8 

尤其是:

  • HTML
  • 網頁
  • CSV
  • TXT
  • JSON
  • 程式碼
  • 資料庫
  • API
  • 跨平台檔案

優先使用 UTF-8。

舊系統 → 可能遇到 ANSI / Big5

例如你在台灣遇到很舊的:

.txt
.csv
.srt
.bat

如果打開變成:

���

很可能就是:

檔案原本是 Big5,但你的程式用 UTF-8 去讀。

反過來也可能發生。

「不是 Unicode 的系統預設文字編碼」

叫做 ANSI

例如:

  • 台灣 Windows → 常見 Big5 / CP950
  • 簡體中文 Windows → GBK / CP936
  • 日本 Windows → Shift-JIS / CP932
  • 西歐 Windows → Windows-1252
  • 所以:

    ANSI 在台灣可能是 Big5,在日本可能是 Shift-JIS。

    這就是 ANSI 最大的問題:

    同一個檔案,在不同國家的電腦上,可能會被解讀成不同文字。


2>UTF-8 - unicode

「亂碼」

UTF-8 的目的就是讓不同系統對同一組 Unicode 字元有一致的表示方式。

因此:

Windows → Mac → Linux → Android → iPhone → 網頁

都可以使用同一套 Unicode。


3>ANSI vs UTF-8 的比較



2026年8月13日 星期四

新版VES: 解壓縮處理 – 2026/08/14

 目的: 新版VES: 解壓縮處理 – 2026/08/14









2026年8月4日 星期二

WINCOMMAND - *.doc;*.docx 搜尋文字時- [V]Unicode

目的: Wincommand  *.doc;*.docx 搜尋文字 - 應勾選[V] Unicode

處理說明: 1>搜尋文字 -  [V]Unicode 






2026年7月28日 星期二

Blogger 的本篇連結範例 - 1>目錄連結 主題A介紹 2>目標Tag:

 目的:  1>目錄連結 <a href="#Topic-A">主題A介紹</a>  , 由目錄連結至實際內容          
            2>目標Tag: <a  id="Topic-A">  </a> , 目錄的內容

處理說明: 1>目錄連結  <a href="#Topic-A">主題A介紹</a>  
                       --> 有時直接寫 href="#topic-A" 會被瀏覽器誤判為相對於網站根目錄的連結,
                             導致點擊後直接跳轉回網誌首頁或分類頁面。
                       --> 改成永久的連結網址 #Topic-A
                             https://smallsun123.blogspot.com/2026/07/html-scroll-behavior-smooth-b-a.html#Topic-A
                            連結時,會連至永久網址#Topic-A目標 
                      
                  2>目標Tag: <a  id="Topic-A">  </a> , 目錄的內容    

文章目錄


一、主題 A 介紹

這裡是主題 A 的詳細內容...

二、主題 B 介紹

這裡是主題 B 的詳細內容...

▲ 回到文章頂端




連結說明: 使用永久網址#目標