2025年7月29日 星期二

使用者介面考量重點: UI

 目的:  UI 使用者介面考量重點: UI




2025年7月24日 星期四

V30102 - 日期格式只取時間 - Oracle SQL - 日期格式轉成 yyyy/mm/dd

目的: V30102 - 日期格式只取時間  - Oracle SQL - 日期格式轉成 yyyy/mm/dd

處理說明: 1>日期格式只取時間
                             to_char(TFTM, 'HH24:mi')
                  2>日期格式 : yyyy/mm/dd
                         TO_CHAR(EXC_INSDATE,'yyyy/mm/dd')




1>SQL如下:
     SELECT    TFTM, to_char(TFTM, 'HH24:mi'),CLTM ,to_char(CLTM, 'HH24:mi'),FYTM,FLTOTM,NARPNUM
      FROM       AMM_AFD
      WHERE     ASSNO='A20240320001'
       AND rownum=1
      ORDER BY AFDNO DESC;


2>將日期欄位格式轉成 yyyy/mm/dd
SELECT  CTRLNO,WBS,MTER,BATCH,
                TO_CHAR(EXC_INSDATE,'yyyy/mm/dd') as EXC_INSDT,
                EXC_INSDATE,EXC_UPDDATE
FROM      AMM_MTRM
WHERE   BATCH IS NOT NULL
AND         TO_CHAR(EXC_INSDATE,'yyyy/mm/dd')='2025/07/24'
ORDER   BY EXC_INSDATE DESC;


V20305 – grid_M加入 ToolBar 且放在分頁的下方 - AddDocked

 目的: V20305零件需求登錄 – grid_M加入 ToolBar 且放在分頁的下方 - AddDocked

處理程序: 1> Ext.getCmp('grid_M').addDocked({:Toolbar元件},index);
                        Ext.getCmp('grid_M').addDocked({
                                       xtype: 'toolbar',
                                       dock: 'bottom',
                                       items: [cmp_myToolBar]
                                       },1);




1>*.js
    Ext.getCmp('grid_M').addDocked({
        xtype: 'toolbar',
        dock: 'bottom',
        items: [cmp_myToolBar]
    },1);

2025年7月23日 星期三

V20305F – 單筆提料 – [搜尋]鈕 – 顯示SBOM節點(N_EI_UOC).件號=需求件號(Tmp_dt1.Select(PN=’xx’)) -ds2T1C

 目的: V20305F – 單筆提料 – [搜尋] 
            – 顯示SBOM節點(N_EI_UOC).件號=需求件號(Tmp_dt1.Select(PN=’xx’))

處理程序:  1>取得 SBOM所有節點(N_EI_UOC)
                     2>過濾 SBOM所有節點中,件號=需求件號的節點
                          Tmp_Dr_Ary=Tmp_dt1.Select(PN=’xx’);


1>*.cs
      DataRow[] Tmp_dr_Ary;
      DataTable Tmp_F_dt1 = new DataTable();
      string Tmp_F_Str = "PN = " + myfunc.AA(Tmp_sub_RQPN);
      Tmp_dr_Ary = Tmp_dt1.Select(Tmp_F_Str);
      if ( !(Tmp_dr_Ary.Length == 0) )                
             Tmp_F_dt1= Tmp_dr_Ary.CopyToDataTable();   //若  null.CopyToDataTable() 會 Error
     DataSet ds = new DataSet();            
     try
        {
           ds.Tables.Add(Tmp_F_dt1);
           ds = myfunc.ds2T1C(ds);

2025年7月20日 星期日

V20305F – [單筆提料]鈕 - 挑選按鈕 – get_pick_btn

 目的: V20305F – [單筆提料]  - 挑選按鈕 – get_pick_btn 

處理說明: 1> *.js     
    var cmp_sub_RQPN = get_cmp_txt1('需求件號', 'sub_RQPN', 80, 130);
    var cmp_pick_sub_RQPN = get_pick_btn0('挑選需求件號', 'btn_sub_RQPN',
        '../api/V20305FAPI/get_sub_RQPNPick?isComplete=0&par_PN=' + Tmp_PN + '&par_OGONOAF='+ Tmp_OGONOAF,
        ['RQPN'], ['sub_RQPN'], J_pickstore_sub_RQPN, J_pickcolumns_sub_RQPN);
    cmp_sub_RQPN.items.push(cmp_pick_sub_RQPN);
--> 傳回欄位名稱,當成挑選子畫面.過濾欄位

               2>*.cs
//過濾條件 [需求件號(RQPN)]挑選
        [HttpPost]
        public dynamic get_sub_RQPNPick(string par_PN, string par_OGONOAF, string RQPN = "", int isComplete = 0)
        {
            string Tmp_Sql = "  SELECT  DISTINCT A.RQPN  "
                                        +"   FROM    AMM_UOC A, CSM_AF @TLS_245 B   "
                                        +"  WHERE   A.RPNOAF = B.RPNOAF  "
                                        +"   AND        B.PN ="+myfunc.AA(par_PN)
                                        +"   AND         B.GONOAF ="+myfunc.AA(par_OGONOAF)
                                         +"  AND         A.RQPN IS NOT NULL   "
                                         +"  ORDER    BY RQPN   ";
            string n = funId + "sub_PN";
            DataSet ds = setupPickDs(n, Tmp_Sql, new string[] { "AMM_UOC" });
            if (RQPN != null && !RQPN.Equals(""))
            {
                if (isComplete == 1)
                {
                    ds = getPickDsbyCondi(n, "RQPN='" + RQPN + "'");
                }
                else
                {
                    ds = getPickDsbyCondi(n, "RQPN  LIKE '%" + RQPN + "%'");
                }
            }
            return ds;
        }  // end of  get_sub_PNPick





1>*.js
  //panel11 需求件號               
    var cmp_sub_RQPN = get_cmp_txt1('需求件號', 'sub_RQPN', 80, 130);
    var cmp_pick_sub_RQPN = get_pick_btn0('挑選需求件號', 'btn_sub_RQPN',
        '../api/V20305FAPI/get_sub_RQPNPick?isComplete=0&par_PN=' + Tmp_PN + '&par_OGONOAF='+          
 Tmp_OGONOAF,
        ['RQPN'], ['sub_RQPN'], J_pickstore_sub_RQPN, J_pickcolumns_sub_RQPN);
cmp_sub_RQPN.items.push(cmp_pick_sub_RQPN);

--> 過濾欄位名稱 = 傳回欄位名稱




2>*.cs

//過濾條件 [需求件號(RQPN)]挑選
        [HttpPost]
        public dynamic get_sub_RQPNPick(string par_PN, string par_OGONOAF, string RQPN = "", int isComplete = 0)
        {
            string Tmp_Sql = "  SELECT  DISTINCT A.RQPN  "
                                        +"   FROM    AMM_UOC A, CSM_AF @TLS_245 B   "
                                        +"  WHERE   A.RPNOAF = B.RPNOAF  "
                                        +"   AND        B.PN ="+myfunc.AA(par_PN)
                                        +"   AND         B.GONOAF ="+myfunc.AA(par_OGONOAF)
                                         +"  AND         A.RQPN IS NOT NULL   "
                                         +"  ORDER    BY RQPN   ";
            string n = funId + "sub_PN";
            DataSet ds = setupPickDs(n, Tmp_Sql, new string[] { "AMM_UOC" });
            if (RQPN != null && !RQPN.Equals(""))
            {
                if (isComplete == 1)
                {
                    ds = getPickDsbyCondi(n, "RQPN='" + RQPN + "'");
                }
                else
                {
                    ds = getPickDsbyCondi(n, "RQPN  LIKE '%" + RQPN + "%'");
                }
            }
            return ds;
        }  // end of  get_sub_PNPick

 

2025年7月11日 星期五

V20305C – 匯出(SBOM) – 簡單子畫面 - 使用者確認後, 才開啟子畫面 - get_cmp_xxxx - New

 目的: V20305C – 匯出(SBOM) – 簡單子畫面  - 確認後,執行

處理說明: 1>使用者確認後,才開啟子畫面
                   var Tmp_AMMNO = "", Tmp_PN = "", Tmp_Str = "";
                    var cur_recs = Ext.getCmp('grid_M').getSelectionModel().getSelection();
                    var cur_rec = null;
                    if (cur_recs.length > 0) {
                        cur_rec = cur_recs[0];
                        Tmp_AMMNO = nulltoStr(cur_rec.data['AMMNO']).toString();
                        Tmp_PN = nulltoStr(cur_rec.data['PN']).toString();
                        Tmp_Str = "確定將AMM單號(" + Tmp_AMMNO + ")\r\n"
                                        +"件號(" + Tmp_PN + ") \r\n"
                                        + "的SBOM資料匯出成*.xls嗎?\r\n";
                        var id = confirm(Tmp_Str);
                        if (id) {
                            Call_V20305C()
                        };

          2>開啟子畫面
                var cmp_sub_SRU_PN = get_cmp_txt1('SRU件號', 'sub_SRU_PN', 100, 130);
                var Tmp_urlStr = '../api/V20305CAPI/get_sub_SRU_PNPick?isComplete=0';
                 var cmp_sub_pick_SRU_PN = get_pick_btn0('挑選SRU件號', 'sub_btn_SRU_PN',  Tmp_urlStr,
                                                                                                       ['SRU_PN'], ['sub_SRU_PN'],
                                                                                                      J_models_V20305C_SRU_PN, J_columns_V20305C_SRU_PN);
               cmp_sub_SRU_PN.items.push(cmp_sub_pick_SRU_PN);


1>*.js
function Call_V20305C() {
console.log(" 1 inside - Call_V20305C 編輯: ");
//panel11
//交修單號(RPNOAF)
var cmp_sub_ROOT_PN = get_cmp_txt1('展BOM件號', 'sub_ROOT_PN', 100, 130);
var cmp_sub_ROOT_PN_lbl = get_cmp_lbl0('(根件號)', 130);
cmp_sub_ROOT_PN.items.push(cmp_sub_ROOT_PN_lbl);
var cmp_sub_LRU_PN = get_cmp_txt1('LRU件號', 'sub_LRU_PN', 100, 130);
var cmp_sub_EIAC = get_cmp_txt1('機種', 'sub_EIAC', 100, 130);
var cmp_sub_RPNOAF = get_cmp_txt1('交修單號', 'sub_RPNOAF', 100, 130);
var cmp_sub_SRU_PN = get_cmp_txt1('SRU件號', 'sub_SRU_PN', 100, 130);
var Tmp_urlStr = '../api/V20305CAPI/get_sub_SRU_PNPick?isComplete=0';
var cmp_sub_pick_SRU_PN = get_pick_btn0('挑選SRU件號', 'sub_btn_SRU_PN',
Tmp_urlStr,
['SRU_PN'], ['sub_SRU_PN'],
J_models_V20305C_SRU_PN, J_columns_V20305C_SRU_PN);
cmp_sub_SRU_PN.items.push(cmp_sub_pick_SRU_PN);

var sub_V20305C_Flds = [
{
type: 'panel', bodyStyle: "background-color:transparent;", border: 5, padding: "1",
layout: 'border',
items: [
{
xtype: 'panel', id: 'sub_panel1', region: 'center',
height: 300, layout: { type: 'vbox', align: 'stretch' },
items: [
cmp_sub_ROOT_PN, cmp_sub_LRU_PN, cmp_sub_EIAC, cmp_sub_RPNOAF, cmp_sub_SRU_PN,
],
},
]
}
];


2025年7月9日 星期三

V20305 - 零件需求登錄 - [匯出] - 匯出交修件件號的上下層BOM結構 - SQL - START WITH ... CONNECT BY - 取得上下層結構的資料

 目的: V20305 - 零件需求登錄  - [匯出] - 匯出交修件件號的BOM結構 
           - 利用SQL語法 - START WITH  ... CONNECT BY  - 取得上下層結構的資料

處理說明: 
1>SQL : START WITH  ..  CONNECT BY 
在 Oracle SQL 中,START WITH ... CONNECT BY 是用來進行階層式查詢的語法,特別適合處理像是員工上下屬、產品分類、組織架構等具有父子關係的資料結構。這種查詢方式可以遞迴地找出某個節點的所有子節點或父節點。


START WITH:指定查詢的起始節點(根節點),例如某個員工或分類。
CONNECT BY:定義父子節點之間的關係。使用 PRIOR 關鍵字來表示上一層的欄位。

2>
Select PLA, LA, NHA_LCN,NHA_ALC, LCN,ALC 
from ( Select ( Case When NHA_LCN||NHA_ALC=LCN||ALC   then ''   else NHA_LCN||NHA_ALC   end ) as PLA, 
      LCN||ALC as LA, 
      NHA_LCN,NHA_ALC, LCN,ALC 
      from N_EI_UOC@TLS_245 
      Where EIAC='IDF' 
      and EI_LCN='A' 
      and EI_ALC='00' 
      and EFF='Y' 
      order by PLA, LA ) 
Start With PLA='A010L030600900' 
Connect by Prior LA=PLA;



2025年7月3日 星期四

V20305 – 零件需求登錄 - 新增的ToolBar 如何放在最後 ????

 目的: V20305 – 零件需求登錄 - 新增的ToolBar 如何放在最後 ??

處理說明:



1>*.js


//AddDocked , 不加入 index 參數, 即放在最後
//但是無作用, 仍在 分頁 Toolebar 之前  ???
Ext.getCmp('grid_M').addDocked({
        xtype: 'toolbar',
        dock: 'bottom',
        items: [cmp_myToolBar]
    });

//AddDocked , 加入 index 參數, 即放在 index 之後
const dockedItems = grid.getDockedItems();
    let bbarIndex = dockedItems.findIndex(item =>
        item.dock === 'bottom' &&
        item.isXType('toolbar')   精準對照 bbar
    );
    console.log("bbarIndex : ", bbarIndex);
    Ext.getCmp('grid_M').addDocked({
        xtype: 'toolbar',
        dock: 'bottom',
        items: [cmp_myToolBar]
    }, bbarIndex);