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);

2025年6月29日 星期日

V20305E –將訊息中所有 \r\n 字串,改成
- replace - 置換字串 - 替代

 目的: V20305E –將訊息中所有 \r\n 字串,改成 <br>

處理說明: 1>換行:
                        1>>window.訊息 必需以 “\r\n” 換行
                                     2>>Web訊息,必需以 "<br>" 換行
                  2>*.js 置換字串  - replace  - 加入  /g 才會置換所有的字串
                        1>>置換第一次出現的字串
                                r = r.replace("\r\n", "<br>"); //置換第一次出現的  /r/n  --> <br>
                        2>>置換所有出現的字串: /g                         
                             r = r.replace(/\r\n/g, "<br>"); //置換所有  /r/n  --> <br>
                   3>*.cs  - 用 replace 即會置換所有的字串
              string original = "我喜歡貓,但貓不喜歡我";
              string replaced = original.Replace("貓", "狗");
                   



1>*.cs
   if (Tmp_cnt == 0)
     {
      Tmp_Str = "錯誤: "
             + "所選的交修單號(" + Tmp_FIXNO + ")\r\n"
             + "尚無AMM請料明細資料(AMM_UOCD.STAUOCD='A',EFF='Y')\r\n"
          + "敬請檢核 !!\r\n";
      File.AppendAllText(Tmp_out_pFName, Tmp_Str);  //改用 File.AppendAllText
      break;
      }

        c#-->string Tmp_Str = "我喜歡貓,但貓不喜歡我";

             string Tmp_Str = Tmp_Str.Replace("貓", "狗");
 

 
2>*.js
    var timer = setInterval(function () {       
        var r = r_cookies('Rtn_Msg');
        console.log("cookies Rtn_Msg =", r);
        //若有傳回值,則執行下一步驟
        if (!checkisnull(r)) {
            mask.hide();           
            clearInterval(timer);   
            if (r.indexOf("錯誤") > -1) {
                r = r.replace(/\r\n/g, "<br>"); //à Web訊息 , 必需以<br>換行 à 置換所有  /r/n  --> <br>
                mywarnalert(r);
                return;  //若有錯誤,則顯示錯誤訊息, 不再執行下一步騳
            }
            if (r.indexOf("待確認") > -1) {   //高關聯性物料未提 , 詢關是否繼續往下執行                
                var id = confirm(r);  //à window.訊息 必需以 “\r\n” 換行
                if (id) {
                    r = "成功 : 交修件的高關聯性物料未提<br>請使用者確認是否繼續執行[請料提出]作業?<br>";  //設定 r="成功xxxx" , 以便繼續往下執行
                }
            }
            if (r.indexOf("成功") > -1) {
                //mysuccessalert(r);
                CHECK_TLS_8Q1(cur_rec);               
                return;
            }
        }
    }, 1000)  // end of timer            


2025年6月17日 星期二

如何使用 -String[] 及 List

 


目的: 如何使用 -String[]  及  List<String>  

處理說明: 

在 C# 中,string[]List<string> 都可以用來存放字串集合,但它們有一些關鍵的不同:

1>string[](陣列)

  • 固定大小:在宣告時必須指定長度,無法動態增減元素。

  • 存取速度快:陣列的存取比 List<string> 更快,因為它是連續存放在記憶體中。

  • 適用場景:當你確定元素數量不變時,例如處理靜態配置資料。

在 C# 中,string[]List<string> 都可以用來存放字串集合,但它們有一些關鍵的不同:

Ex:
// 宣告並初始化陣列
string[] names = { "Alice", "Bob", "Charlie" };
// 存取元素
Console.WriteLine(names[1]);  // 輸出 "Bob"

// 陣列長度
Console.WriteLine(names.Length);  // 輸出 3


2>List<string>(泛型集合)

  • 動態大小:可以根據需求增加或移除元素,不需預先定義大小

  • 擴充功能豐富:提供許多內建方法,如 Add()Remove()Contains()

  • 適用場景:當元素數量不固定,或需要進行頻繁的新增、刪除操作時。

Ex:
// 宣告並初始化 List
List<string> namesList = new List<string> { "Alice", "Bob", "Charlie" };
// 添加元素
namesList.Add("David");

// 移除元素
namesList.Remove("Bob");

// 迴圈遍歷
foreach (var name in namesList)
{
    Console.WriteLine(name);
}

2025年6月11日 星期三

Word - 選取物料 - 整批移動

 目的: Word - 選取物料 - 整批移動




Word - 設定線條為垂直線/水平線 – 新線條 / 舊線條

 目的:   Word中設定線條為垂直線/水平線 新線條 / 舊線條

處理說明:  1>新線條:
                       按住[Shift]+新線條 , 即可畫面水平線/垂直線
                   2>舊線條:
                       版面配置選項 --> 大小 -->調整寬度/高度=0





2025年6月8日 星期日

PadRight1 :根據字元的顯示寬度來補齊字串右側 - PadRight

 目的: 根據字元的顯示寬度來補齊字串右側。
           一個中文字元通常視為佔用兩個英文字元的寬度。

處理說明: 1>根據字元的顯示寬度來補齊字串右側 , PadRight1()






1>myfunc.cs  PadRight1(Tmp_Str, length , par_fill_char)

Tmp_Str = myfunc.PadRight1(Tmp_PN1, 16) + myfunc.PadRight1(Tmp_PN2, 16) 
              + myfunc.PadRight1(Tmp_PN3, 16) + myfunc.PadRight1(Tmp_RPN1, 16)
              + myfunc.PadRight1(Tmp_CONFIDENCE, 10) + myfunc.PadRight1(Tmp_TP, 6) + "\r\n";

Tmp_Str= myfunc.PadRight1("件號1", 16) + myfunc.PadRight1("件號2", 16) + myfunc.PadRight1("件號3", 16) 
              +myfunc.PadRight1("關聯件號", 16)+myfunc.PadRight1("關聯程度", 10) + myfunc.PadRight1("類別", 6)+"\r\n"
             + myfunc.PadRight1("=", 16,'=') + myfunc.PadRight1("=", 16, '=') + myfunc.PadRight1("=", 16, '=') 
             + myfunc.PadRight1("=", 16,  '=') + myfunc.PadRight1("=", 10, '=') + myfunc.PadRight1("=", 6, '=') + "\r\n"
             + Tmp_Str;



2> 原本函式    Tmp_Str.PadRight(length , par_fill_char);
//Tmp_Str = Tmp_PN1.PadRight(16, '_') + "台中市".PadRight(16, '+') + "123".PadRight(16, '_') + Tmp_RPN1.PadRight(16, '+')
                //               +Tmp_CONFIDENCE.PadRight(10, '_') + Tmp_TP.PadRight(6, '+') + "\r\n";