2023年4月26日 星期三

V20302 - 單檔維護 - 新建畫面 - 新增

目的: V20302 - 單檔維護 - 新建畫面

處理步驟:  1>利用小工具 - 產生欄位_單檔 -->產生 V20302 的相關欄位資料
                       (V20302.js V20302_JSON.js , 
                         V20302APIController.cs)
                        [Query.欄位s(J_gridmodel),
                         Grid.欄位s(J_columns), 
                         編輯畫面欄位(J_formFields)]
                   2>將檔案加入 Project  , 並試 Run, 可以顯示資料
                   3>編輯[過濾條件(Query)] 加入, 並執行




PS : 若用現有檔案(V80C03)修改, 則需修改 Table 的相關欄位資料, 很花時間
        除非兩檔案的 Table 相同, 


  

2023年4月25日 星期二

V20302 - Query 畫面未顯示 - 不同元件但用同一 id

目的:  V20302 - Query 畫面未顯示 - 且未顯示錯誤訊息(語法結構皆對,但是執行時錯誤)

原因:  不同元件,但用同一 id  (由 V80C03 複製至 V20302,修改 V20302)

處理方法: 1>在 Query 利用 remark 方式, 讓畫面可以正常顯示,再來找問題



GitLab : - 開立分支 V80204 智為測試中, 開發另一支程式 V20302

 目的: GitLab : V80204 智為測試中, 尚未上線, 開發另一支程式 V20302

處理說明: 如下 2 方法均可
      方法 1>由現有分支(V80204) , 再開立分支(V20302) (Source 包含 V20302+V80204)
                   優點: V80204測試中,有問題,以現有分支 V20302修改,
                              不需切回分支 V80204修改,
                   缺點: V80204上版時, V20302必需沒問題,才可 compiler 上版

      方法 2> 由master開立新的分支 V20302 (Source 不包含測試中的 V80204)
                     優點: V80204測試中,有問題,開啟分支 V80204修改, 不會受新分支 V20302的影響











AMM Web 網路目錄 - 正式區 & 測試區

 目的: AMM Web 網路目錄  - 正式區 &  測試區

            正式區: http://192.30.8.210:8421 

           測試區: http://192.30.8.240:8521







2023年4月24日 星期一

gitLab - 找回之前的版本 - V80204C - XLSIN2XLSOUT 函式不見

目的: gitLab  - 找回之前的版本  - V80204C  -  XLSIN2XLSOUT 函式不見 

處理說明: 1>

è [方案總管] à[V80204CAPIController]à按右鍵à檢視記錄à點選分支記錄à [與上一版本比較]

è 找到有該函式的版本à 將該版本函式複製回目前版本





 






2023年4月23日 星期日

V80204 – loadMask - 顯示等待訊息 - Ajas.async必需為 true

 目的: V80204 – WBS報工工時 [顯示資料], 去後端處理, 要顯示等待訊息

處理說明:  1> Ext.Ajax  的處理模式 :   必需  async: true,  - loadMask
                         // 1>> 異步模式  : false,    即會等後端執行完成,才會往下,所以不會顯示等待訊息
                                                                       async: false ,      
                 // 2>> 異步模式  : true,   即會不用等後端執行完成,前端仍會往下, 所以會顯示等待訊息
                                                                       async: true ,    (defaule)  


1>V80201.js
var myMask = new Ext.LoadMask(Ext.getBody(), {
msg: '資料處理中,請稍候...',
});

//顯示訊息
myMask.show();

//隱藏訊息
Ext.getCmp('sub_Grid').store.on("load", function (me, records, successful, eOpts) {
        if (successful) {

            console.log("successful");
            console.log("Ext.getCmp('sub_Grid').store.data", Ext.getCmp('sub_Grid').store.data);
            win1.show();
            //若已載入完成,則            
            myMask.hide();
        }
    }
    );






2023年4月20日 星期四

V80204 - css - 自定 style - 自定字型,顏色,背景顏色

 目的: V80204 - 自定 style  - css  - 自定字型,顏色,背景顏色

處理說明:  1>利用 labelstyle 及 fieldstyle 設定 字型,顏色
                        labelStyle: "font-size: 20pt; color: blue; background:  gray; ",
                        fieldStyle: "font-size: 20pt; background:  yellow; ",
                   2>利用外部 css 檔案, class 設定
                        var Tmp_Str = "<link type='text/css' rel='stylesheet' href='../JsFunction/mycss.css'  >";
                         $('head').append(Tmp_Str);
                   3>利用自定 class 來設定  字型,顏色                          
                         fieldCls: "my_redcolor  my_bigfont",
                   4>設定 panel 的 顏色 - 
                       bodyStyle: 'background:#ffc; ',
                   5>設定標題顏色 & 字型大小
                         var cmp_TITLE = get_cmp_lbl0("試車/飛(前中)登錄", 550);    
                         cmp_TITLE.style = "font-size: 14pt; color: blue;:text-align:center; ";



1>V80204.js
 //包含 mycss.css
 var Tmp_Str = "<link type='text/css' rel='stylesheet' href='../JsFunction/mycss.css'  >";
 $('head').append(Tmp_Str);

var Query1 = new Ext.FormPanel({
        id: 's1_form', flex:1,
        layout: { type: 'hbox', align: 'stretch' },
        fieldDefaults: { labelAlign: 'right' },
        defaults: { margin: { top: 3 } },
        height: 20,
        items: [
            {
                xtype: 'panel',
                id: 'panel1_1',
                layout: { type: 'hbox', align: 'stretch' },
                flex: 14,
                border: 0,
                items: [
                    {
                        xtype: 'panel',
                        id: 'panel1_11',
                        layout: { type: 'hbox', align: 'stretch' },
                        flex: 15,
                        border: 0,
                        items: [{
                            xtype: "fieldcontainer", fieldLabel: "WBS", labelWidth: 100, layout: "hbox", flex: 2,
                            labelStyle: "font-size: 20pt; color: blue; background:  gray; ",
                            items: [{
                                xtype: "textfield", id: "s1_WBS", name: "s1_WBS", width: 150,
                                padding: "0 4 0 0",                                
                                //Style: "font-size: 20pt; background-color:  red; ",
                                fieldStyle: "font-size: 20pt; background:  yellow; ",
                               //fieldCls: "required",
                                //fieldCls: "my_redcolor  my_bigfont",
                                //cls: "edit_BC",
                            },                            
                            {
                                xtype: "button", id: "s1_btn_WBS", name: "s1_btn_WBS", text: "...",
                                handler: function () {
                                    var win = EditPickx('WBS', '../api/V80204API/get_s_WBSPick', ['WBSNO'], ['s1_WBS'], J_pickstore_s_WBS, J_pickcolumns_s_WBS);
                                    win.show();
                                }
                            },
                            ]
                        }, // end of s1_WBS
                        {
                            xtype: "fieldcontainer", fieldLabel: "機種機號", labelWidth: 100, layout: "hbox", flex: 2,
                            items: [
                                { xtype: "textfield", id: "s1_ACNO", name: "s1_ACNO", width: 150, padding: "0 4 0 0" },
                            ]
                            },  // end of s_機種機號             
                            {  //顯示等候訊息
                                id: "s1_PROCMSG", name: "s1_PROCMSG", xtype: "panel", width: 150, height: 20, margin: "0 4 0 4",
                                hidden: false, border: 0, style: 'background-color:#FFFFFF;'
                            },
                        ]
                    },  // end of panel1
                ]
            },


2>mycss.css
<style type="text/css" >
#my_tbl {
    border-width: 9px;
    border-style: solid;    
}

.my_bigfont{
    font-size:  30px;
        color: yellow;
}

.my_redcolor {
    //background-color: red;
    background: red;
}


4>*.js

var DataPanel = Ext.create("Ext.panel.Panel", {
        flex: 4, layout: { type: 'hbox', align: 'stretch' },
        bodyStyle: 'background:#ffc; ',
        //bodyCls: 'my_lightgreen',
        fieldDefaults: { labelAlign: 'right' },  
        items: [
            //{ xtype: "panel", flex: 2, title: "", },
            {
     xtype: "fieldcontainer", fieldLabel: "WBS報工工時(小時)", labelWidth: 130, layout: "hbox", flex: 5,
                items: [{
                   xtype: "textfield", id: "s1_WBS_HR", name: "s1_WBS_HR", width: 150, 
                             padding: "0 4 0 0", fieldCls: "readonly",
                    // value: 'FM20120301001',
                },
                ]
            }], // end of s1_WBS_HR
    });  // end of DataPanel

Extjs 利用 query - 找詢元件的方法

目的: Extjs  利用 query - 找詢元件的方法

 https://ithelp.ithome.com.tw/articles/10134838

var cmp= Ext.ComponentQuery.query('gridpanel');      //找到 gridpanel xtype 的元件 
var cmp= Ext.ComponentQuery.query('.gridpanel');         //找到 class=.gridpanel 

var Tmp_form = Ext.ComponentQuery.query('#s_form');  //找到 id=#_form

var btnOk= Ext.ComponentQuery.query('button[iconCls]'); //找到按鈕含 iconCls 屬性

V80204 –MD檔 - Ext.TabPanel - 1>隱藏[編輯]頁 2>新增[WBS報工工時]頁 - TabSheet -MD

 目的: V80204 –– Ext.TabPanel   1>隱藏[編輯]頁  2>新增[WBS報工工時]頁  

處理說明: 1>隱藏[編輯]頁  & 隱藏 編輯按鈕
                      Ext.getCmp('MDViewEdit_M').setTabVisible(0, false);
                      TMMDViewEdit.setTemplateBtnVisible(false);

                  2>新增[WBS報工工時]頁  
                       Ext.getCmp('MDViewEdit_M').add(Tmp_FormObj);



2>新增[WBS報工工時]頁
var Tmp_FormObj = Ext.create("Ext.form.Panel", {
title: 'WBS報工工時', id: 'tabl3', cls: 'edit_BC', layout: { type: 'vbox', align: 'stretch' }, 
   items: [Query1, DataPanel],
});
Ext.getCmp('MDViewEdit_M').add(Tmp_FormObj);


2023年4月19日 星期三

GitLab 分支多次認可 , 最後一次才認可+推送 的處理流程

 目的: GitLab 分支多次認可 ,  最後一次才認可+推送 的處理流程


1>GitLabà create merge request , 會以最後一次異動的程式為準
2>保留前面認可的目的是本分支可以回復至前面的認可 (必需下指令, 由 VisualStudio有困難)



2023年4月16日 星期日

VS IDE 操作 - 標籤 - 設定標籤, 找上一標籤,找下一標籤 - 書籤

 目的: VS IDE 操作  - 標籤 - 設定標籤, 找上一標籤,找下一標籤

處理說明: 1>設定標籤 :  Ctrl+K , Ctrl+K
                   2>找上一標:  Ctrl_K , Ctrl+P
                   3>找下一標:  Ctrl_K , Ctrl+N




 

V80204 - 呼叫 WebService WS_ALS02_WBS - WebService 匯入及呼叫 - 1>參考 2>Connected Services - getWS_xxxx_

 目的: V80204  - 呼叫 WebService  WS_ALS02_WBS  - 取得 WBS+機號的報工工時

處理說明:  1>呼叫 WebSerivce 函式 = class.function
                       找出 WebService的  class 及 function
                   2>匯入 WebService 網址 - 找出 WS 的 class 及 function
                        [方案總管] --> [參考] -->[加入服務參考]
                        執行後 , [方案總管] --> [Connected Services]  --> 會新增一class
                   3>web.config 將重覆的 WebService名稱 remak ,
                       否則會有錯誤訊息  





1>*.cs
3>呼叫 WebService 函式的方法:  myfunc.getWS_ALS_WBSHR(string par_WBS, string par_ASN)
        //取得 WBS + ACNO.報工工時        
        //傳入參數:  par_WBS, par_ACNO , 若機號空白,則傳回該WBS的所有機號.工作小時
        //傳回參數:  工作小時
        //                     --> WS_ALS02 原本以分鐘傳回, 以小時為計算單位必需 /60 , 取小數2位        
        public static dynamic getWS_ALS_WBSHR(string par_WBS, string par_ASN)
        {
            string Tmp_hour = "0";
            string Tmp_Str = "";
            string Tmp_Str1 = "", Tmp_Str2 = "";
            double Tmp_double1 = 0;
            if (par_WBS != "")
            {
                ws_als_wbshour.ws_als_wbshourSoapClient wbshour_cls
                                       new ws_als_wbshour.ws_als_wbshourSoapClient();
                try
                {
                    Tmp_Str = wbshour_cls.wbshour(par_WBS, par_ASN);
                    //將 [分鐘]字串轉成[小時]字串
                    Tmp_Str1 = Min2Hr(Tmp_Str1);
                    Tmp_hour = Tmp_Str1;
                }
                catch (Exception ex)
                { }  //throw ex;  可能回傳 null
                finally
                { };
            }
            return Tmp_hour;
        }

2>*.js
{
                        xtype: 'button',
                        id: 'btn1_Show',
                        flex: 2,
                        border: 1,
                        text: '報工工時顯示',
                        iconCls: 'icon-search',
                        handler: function () {
                            //s1_form 的所有欄位均加入 np  - type=2
                   var np = s_JSON('s1_form', 2); //TMFunction.js, 組合form上的查詢條件為json參數傳遞
                            np['s1_WBS'] = Ext.getCmp('s1_WBS').getValue();
                            np['s1_ACNO'] = Ext.getCmp('s1_ACNO').getValue();
                            //因為 LoadMask 無作用,所以改用 label 來顯示訊息
                            //Ext.getCmp("waitlbl").setVisible(true);
                            //Ext.getCmp("waitlbl").update;
                            //Ext.getCmp("waitlbl").show();                            
                            var Proc_Msg;
                            try {
                                Proc_Msg = new Ext.LoadMask(Ext.getCmp("s1_PROCMSG"),
                                    { msg: 'WBS報工工時顯示處理中, 請稍候...', }
                                );
                                Proc_Msg.show();//使用 mask 需手動呼叫show() 方法下
                                //getGridData_M --> 轉工只有曾在於工作中心就會列入  , 後來改為  [目前工作中心]=xxxx , 才顯示
                                //gridstore.getProxy().url = '../api/V80205API/getGridData_M';

                                //2022/06/15 ..過濾條件若[目前工作中心]有值,則過濾 [目前工作中心]=xxxx, 其他 工作中心資料不顯示
                                // url 改為 getGridData_M_sub_WC --> 同 [過濾目前工作中心]鈕,的處理方法 ,                                 
                                //gridstore.getProxy().url = '../api/V120102API/getGridData_M';
                                //gridstore.getProxy().extraParams = np; //分頁OK,篩選條件OK
                                //console.log("1 reloadGridData - before");
                                //Ext.getCmp('grid_Single').reloadGridData();
                                //console.log("2 reloadGridData - after");
                                //取得  WBS+ACNO 的 WBS報工工時
                                Ext.Ajax.timeout = 600000; //如果有ajax timeout問題可以加上去       

                                Ext.Ajax.request({
                                    url: '../../api/V80204API/get_WBS_ALS_HR',  //myfunc.getWS_ALS_WBSHR
                                    method: 'POST',
                                    //async: false,
                                    async: true,
                                    timeout: 600000,
                                    //standardSubmit: true, // 非 Ajax 的方式  //若要傳送檔案至前端, standardSubmit必需設為 true 
                                    params: np,
                                    success: function (response, opts) {
                                        console.log('0 get_WBS_ALS_HR sucess!!');
                                        //console.log('0 opts:', opts);
                                        //console.log('0 response:', response);
                                        console.log("success response.responseText:", response.responseText);
                                        var obj = Ext.decode(response.responseText);
                                        var Tmp_WBSHR = "";
                                        //console.log("obj:", obj);
                                        if (obj["success"]) {
                                            Tmp_WBSHR = obj["WBSHR"];
                                            //mysuccessalert(Tmp_WBSHR);
                                            console.log("success=true , Tmp_WBSHR=", Tmp_WBSHR);
                                            Ext.getCmp("s1_WBS_HR").setValue(Tmp_WBSHR);
                                        }
                                        else {
                                            console.log(' 2 get_WBS_ALS_HR obj[sucess]  false !!');
                                            Tmp_Str = "[取得WBS報工工時]失敗 !! <br>"
                                                + obj["Rtn_Msg"];
                                            mysuccessalert(Tmp_Str);
                                        }
                                        Proc_Msg.hide();  //使用 mask 需手動呼叫hide() 方法下
                                        //Ext.getCmp("waitlbl").setVisible(false);                                        
                                    },
                                    failure: function (response, opts) {
                                        //console.log('uploadFileToDB failure !!');
                                        //console.log(" failure opts.response.responseText:", opts.response.responseText);
                                        console.log(' 3 get_WBS_ALS_HR failure !!');
                                        var obj = Ext.decode(response.responseText);
                                        console.log("obj:", obj);
                                        Tmp_Str = "[取得WBS報工工時]失敗!! <br>"
                                                         + obj["Rtn_Msg"];
                                        mywarnalert(Tmp_Str);
                                        //Ext.getCmp("waitlbl").setVisible(false);
                                        Proc_Msg.hide();  //使用 mask 需手動呼叫hide() 方法下
                                    } // end of failure 
                                });  // end of submit


                            }
                            finally {
                                //Proc_Msg.hide();  //使用 mask 需手動呼叫hide() 方法下
                            }

                        }
                    },  // end of 顯示資料



2>WebService 範例: WS_SAP12:  變更勾選工單之SAP工單狀態。

URLhttp://194.1.5.106/sapws/ZRFC_ZCO02.asmx  Method: PROCESS_TRANS_WEB_CO02



4>WebService – [加入服務參考]時 – 會將WebService 網址記錄在 web.config
--> AMM_PLM04可能會重覆 , 以致出現錯誤訊息(xx找到多個該合約的端點組態xx)
-->將其中一個 AMM_PLM04 刪除即可







2023年4月13日 星期四

目的: V80204 - SQL 去除前面的 0

目的: V80204 - SQL 去除前面的 0

處理說明:  1>SELECT LTRIM(AUFNR,0)FROM SAPR3.ZPMA@SAP



1.*.cs

-->  過濾[目前工作中心]
SELECT *
FROM AMM_SRO
WHERE SAPNO IN (SELECT LTRIM(AUFNR,0)FROM SAPR3.ZPMA@SAP WHERE CURR_ARBPL=”:目前工作中心”


V80204 - [發工人員]挑選 - 列出所有的資料,且不顯示[分頁]Toolbar - 傳回多欄位 -搜尋

目的: V80204 - [發工人員]挑選 - 列出所有的資料,且不顯示[分頁]Toolbar - 傳回多欄位 - 搜尋

處理說明: 1> *.js  EditPickx 函式的paging 設為 false
                               var win = EditPickx('發工人員', '../api/V80204API/get_s_SAPMANPick', ['SAPMAN_', 'SAPMAN'], 
                                              ['s_SAPMAN_', 's_SAPMAN'], J_pickstore_s_SAPMAN, J_pickcolumns_s_SAPMAN, false);
                  2>*.cs get_s_SAPMANPick 的寫法相同, 不需修改
                      [HttpPost]
                      public dynamic get_s_SAPMANPick(string SAPMAN_ = "", int isComplete = 0)

 

1>*.js 
{
      xtype: "fieldcontainer", fieldLabel: "發工人員", labelWidth: 70, layout: "hbox", flex: 2,
      items: [
             { xtype: "textfield", id: "s_SAPMAN_", name: "s_SAPMAN_", width: 50, padding: "0 4 0 0" },
             { xtype: "textfield", id: "s_SAPMAN", name: "s_SAPMAN", width: 50, padding: "0 4 0 0" },
             { xtype: "button", id: "s_btn_SAPMAN", name: "s_btn_SAPMAN", text: "...",width:20,
                handler: function () {
                        var win = EditPickx('發工人員', '../api/V80204API/get_s_SAPMANPick', 
                       ['SAPMAN_', 'SAPMAN'], ['s_SAPMAN_', 's_SAPMAN'], J_pickstore_s_SAPMAN,                             J_pickcolumns_s_SAPMAN, false);
                       win.show();
                                        }
                                    }
                                ]
                            },  // end of s_發工人員                      



2>*.cs
       //過濾條件 [發工人員]挑選
        [HttpPost]
        public dynamic get_s_SAPMANPick(string SAPMAN_ = "", int isComplete = 0)
        {
    string Tmp_Sql = " SELECT  DISTINCT B.EMPLYNM as SAPMAN_,B.EMPLYID  as SAPMAN "
                              +"  FROM    AMM_SRO A, HR_EMPLYM B "
                              +"  WHERE  A.SAPMAN = B.EMPLYID  "
                              +"  ORDER  BY  B.EMPLYNM,B.EMPLYID ";
            string n = funId + "s_SAPMAN";
            // public DataSet setupPickDs(string pickKey, string sql, string[] tables, bool paging = true, bool realTime = false)
            DataSet ds = setupPickDs(n, Tmp_Sql, new string[] { "AMM_SRO" });
            if (SAPMAN_ != null && !SAPMAN_.Equals(""))
            {
                if (isComplete == 1)
                {
                    ds = getPickDsbyCondi(n, "SAPMAN_='" + SAPMAN_ + "'");
                }
                else
                {
                    ds = getPickDsbyCondi(n, "SAPMAN_  LIKE '%" + SAPMAN_ + "%'");
                }
            }
            return ds;
        }  // end of  get_s_SAPMANPick

2023年4月12日 星期三

V80204 - Web DataSet 的排序 依 RNK 的 排序, 非 SQL ORDER BY

 目的: V80204 - Web DataSet 的排序

 --> 排序依RNK : SELECT  dense_rank()  over(order by  JCN,ACT,WC,DATA_DATE) as RNK

         SQL ORDER BY 





V80204 - 將[分鐘]字串轉成[小時]字串 - C# 實數: double , 實數顯示小數2位

 目的:  V80204 - 將[分鐘]字串轉成[小時]字串

處理說明:  1>



1> *.cs - c#
//[分鐘]字串轉成[小時]字串]
public static string Min2Hr(string par_MinStr)
        {
            double Tmp_double1 = 0;
            string Tmp_HrStr;           
            Tmp_double1 = Math.Round(double.Parse(par_MinStr) / 60, 2);
            Tmp_HrStr = Tmp_double1.ToString("0.00");           
            return Tmp_HrStr;
        }

AMM系統如何判定 QDR工單 /一般工單 - SAP工單第2碼為英文字/長度8碼,且第2碼不為英文字

目的:  AMM系統如何判定 QDR工單 /一般工單

           - QDR工單 -SAP工單第2碼為英文字    --> JCN 不加 '0000'

           - 一般工單: 工單長度8碼,且第2碼不為英文字         --> JCN 加 '0000' , 不含 ILIAS工單(9碼)


處理說明: 1> AMM_SRO  只挑選 QDR工單及一般工單(不含 ILIAS工單)

SQL如下:

SELECT   AMMNO,SAPNO,PN,PNNAME,QTY,nvl(STARTVAL,ACNO) as ACNO_
FROM      AMM_SRO
WHERE   PROJID='F16V'
AND         AMMSTS<='W'
AND (    (substr(SAPNO, 2, 1) between 'A' and 'Z')
        OR ((LENGTH(SAPNO)=8) AND not (substr(SAPNO, 2, 1) between 'A' and 'Z') )
         )

AND nvl(STARTVAL,ACNO) IN ('A012','B025')
ORDER BY ACNO_,SAPNO;
一般工單 à 長度為 8 碼 且 SAP工單第2碼為英文字 à JCN 加 ‘0000’
è 不含ILIAS工單(9碼)
QDR工單 à SAP工單第2碼為英文字 à JCN 不加 ‘0000’



2023年4月10日 星期一

V80204B -將前端 Array/table/Object 欄位值,傳送至後端處理 -JSON – 將目前 checkboxgroup欄位值(Array),傳送至後端,並處理

 目的: V80204B – 將目前 checkboxgroup欄位值(Array),傳送至後端,並處理

處理說明: 1>若非基本型態(string/int/)的欄位值(Array/table/Object),要傳至後端, 
                       均需先轉成 JSON string型態 ,才可當成np的參數值,傳送至後端
                        *.js                         
                        var Tmp_JSONStr = JSON.stringify(Ext.getCmp('chkboxgrp2').getValue()["rb"]);
                        np["ASN_ARY_JSONStr"]=Tmp_JSONStr;

                  2> 後端接收時,必需先將 JSON string 型態, 再還回原型態(Array/table/Object)
                        *.cs
                        string Tmp_ASN_ARY_JSONStr = nvc["ASN_ARY_JSONStr"];  
                        JArray Tmp_ASN_ARY =      
                     (JArray)JsonConvert.DeserializeObject(Tmp_ASN_ARY_JSONStr, (typeof(JArray)));  


1>*.js

var selectedValues = Ext.getCmp('chkboxgrp2').items;
console.log(selectedValues);
var Tmp_ASNAry = []; //var Tmp_Obj={};
//chkboxgrp2 均設為 true
for (var i = 0; i < selectedValues.length; i++) {
    selectedValues.items[i].setValue(true);
};

var np = {};
//取得 chkboxgrp2 的勾選欄位值
//將 Array 轉成 JSON字串, 以便傳至後端
    var Tmp_JSONStr = JSON.stringify(Ext.getCmp('chkboxgrp2').getValue()["rb"]);
    np["ASN_ARY_JSONStr"]=Tmp_JSONStr;
    console.log("np['ASN_ARY_JSONStr']: ", np["ASN_ARY_JSONStr"]);

2>*.cs    
  string Tmp_ASN_ARY_JSONStr = nvc["ASN_ARY_JSONStr"]; 
  JArray Tmp_ASN_ARY = (JArray)JsonConvert.DeserializeObject(Tmp_ASN_ARY_JSONStr, (typeof(JArray)));
 string Tmp_ASN_ARY_STR = string.Join(",", Tmp_ASN_ARY);
// "A012,B025" -->  'A012','B025'
 Tmp_ASN_ARY_STR = myfunc.AddQuoteStr(Tmp_ASN_ARY_STR); 








PS:
       1>將checkboxgroup2 的項目均設為 勾選(checked)
                 {
                    xtype: 'checkboxgroup',
                    id: 'chkboxgrp1',            // columns: 3,
                    columns: [.35, .35, .35],
                    items: [
                               { boxLabel: 'Item 1', name: 'rb', inputValue: '1' },
                               { boxLabel: 'Item 2', name: 'rb', inputValue: '2' },
                               { boxLabel: 'Item 3', name: 'rb', inputValue: '3' },
                             ]
                  },



}, //end of 待挑選機號

                  2>將checkboxgroup2的項目傳送至後端處理                       



V80204B - F16V報工現況匯出– checkboxgroup 新增checkbox - 多行機號挑選 - [F16V報工現況匯出]鈕

 目的: V80204B – checkboxgroup 新增checkbox – 將目前 checkboxgroup欄位值(Array),傳送至後端

處理說明:  1>必需先  CreateObject  of  checkbox 才可加入 checkboxgroup
                     //var tempObj = new Ext.form.Checkbox({
                       var tempObj = Ext.create('Ext.form.Checkbox',{
                                                           boxLabel: 'checkbox1',
                                                           name: 'rb',
                                                           inputValue: 'checkbox1',});
                  2>將 obj 加入 checkboxgroup , 並更新 Layout , 才會反應最新的 checkboxs 內容
                      Ext.getCmp('chkboxgrp1').items.add(tempObj);
                      Ext.getCmp('chkboxgrp1').updateLayout();    //更新  checkboxgroup
                  3> 取得目前 checkboxgroup 的勾選項目
                        var selectedValues = Ext.getCmp('chkboxgrp2').getChecked();
                           // Returns an Array of all checkboxes in the container which are currently checked
                           for (var i = 0; i < selectedValues.length; i++) {
                                   Ext.getCmp('chkboxgrp2').remove(selectedValues[i]);
                                    var tempObj = new Ext.form.Checkbox(selectedValues[i]);  //必需先 create ,才可加入
                                    Ext.getCmp('chkboxgrp1').items.add(tempObj);
                                }

                        



1>*.js   - V80204B.js
     1>>checkboxgroup1 加入   checkbox
{
xtype: 'button', flex: 1, text: "+1",
handler: function () {
var tempObj = Ext.create('Ext.form.Checkbox',{
boxLabel: 'checkbox1',
name: 'rb',
inputValue: 'checkbox1',
// id: Tmp_ACNO_id,
});
Ext.getCmp('chkboxgrp1').items.add(tempObj);
Ext.getCmp('chkboxgrp1').updateLayout();
}
},// end of 虛 space

   2>>checkboxgroup1 .勾選s 右移至  checkboxgroup2
   {//往右移
                        xtype: 'button',
                            id: 'btn_move1',
                            text: '往右',
                            iconCls: 'icon-right',
                        flex:1,
                        handler: function () {
                            var selectedSuccessValues = Ext.getCmp('chkboxgrp1').getChecked();
                            console.log(selectedSuccessValues);
                            for (var i = 0; i < selectedSuccessValues.length; i++) {
                                Ext.getCmp('chkboxgrp1').remove(selectedSuccessValues[i]);
                                var tempObj = new Ext.form.Checkbox(selectedSuccessValues[i]);
                                Ext.getCmp('chkboxgrp2').items.add(tempObj);
                            }

                            Ext.getCmp('chkboxgrp1').updateLayout();
                            Ext.getCmp('chkboxgrp2').updateLayout();

                        } 
                        },// end of 往右移