2023年11月30日 星期四

V120401C - 無子畫面 – call_V120401C()直接執行作業 - SqlOpen -

 目的: V120401C- 無子畫面 – 直接執行作業 - Call_V120401C

處理說明: 


1>V120401.js{  // 技令版期版期 - 無勾選

            xtype: 'button', text: ' 技令版期更新', id: 'Update_Tech_Btn',
            listeners: {
                click: function () {
                    //[條碼編號(TMNO)]第一碼必需為'T'
                    var cur_recs = Ext.getCmp('grid_Single').getSelectionModel().getSelection(); //grid select指向選擇的第一筆        
                    var cur_rec = cur_recs[0];
                    var Tmp_TMNO,Tmp_STAT, Tmp_Str;
                    console.log("cur_rec:", cur_rec);
                    Tmp_TMNO = cur_rec["raw"]["TMNO"];
                    Tmp_STAT = cur_rec["raw"]["STAT"];
                    if (Tmp_TMNO.substr(0, 1) != "T") {
                        Tmp_Str = "條碼編號(" + Tmp_TMNO + ")第一碼必需為 'T' <br>"
                            + "請檢核 !!";
                        myalert(Tmp_Str);
                        return;
                    }
                    if (Tmp_STAT== "Z") {
                        Tmp_Str = "條碼編號(" + Tmp_TMNO + ")的技令現況不可為 Z:已刪除 <br>"
                            + "請檢核 !!";
                        myalert(Tmp_Str);
                        return;
                    }
                    Call_V120401C();
                }
            }
        }, 




2>V120401C.js
function Call_V120401C() {
    console.log(" Call_V120401C  step1");
    var Tmp_NATIXX, Tmp_LGTPXX, Tmp_TMNOXX,Tmp_TMNO;
    var Tmp_Str = "";   
    var cur_recs = Ext.getCmp('grid_Single').getSelectionModel().getSelection(); //grid select指向選擇的第一筆        
    var cur_rec = cur_recs[0];   
    console.log("cur_rec:", cur_rec);
    console.log("cur_rec[raw][TMNOXX]:", cur_rec["raw"]["TMNOXX"]);                                        
    Tmp_TMNO = cur_rec["raw"]["TMNO"];
    Tmp_TMNOXX=cur_rec["raw"]["TMNOXX"];
    Tmp_LGTPXX=cur_rec["raw"]["LGTPXX"];
    Tmp_NATIXX = cur_rec["raw"]["NATIXX"];
    //執行[技令版期更新]
    var np = {};
    np["TMNO"] = Tmp_TMNO;
    np["TMNOXX"] = Tmp_TMNOXX;
    np["LGTPXX"] = Tmp_LGTPXX;
    np["NATIXX"] = Tmp_NATIXX;
        var isOk = true;
        Ext.Ajax.request({
            method: "POST",
            url: '../../api/V120401CAPI/UPDATE_AMM_TMDWGED',
            params: np,
            async: false,
            success: function (response, opts) {
                console.log("0 response.responseText=", response.responseText);
                var Tmp_Obj = Ext.decode(response.responseText);
                console.log("1  Tmp_Obj=", Tmp_Obj);
                if (Tmp_Obj["success"] == true) {
                    var Tmp_Rtn_Msg ="技令版期更新完成 !!<br> "
                        + "訊息如下:<br>"
                        + Tmp_Obj["Rtn_Msg"];
                    mywarnalert(Tmp_Rtn_Msg);
                    isOk = true;
                }
                else {
                    var Tmp_Rtn_Msg = "條碼編號("+Tmp_TMNO+")技令編號(" + Tmp_TMNOXX + ")國別碼(" + Tmp_NATIXX + ")中英文別(" + Tmp_LGTPXX + ")<br>"
                                                       +"技令版期更新失敗<br> "
                                                       +"錯誤訊息如下:<br>"
                                                      + Tmp_Obj["Rtn_Msg"];
                    mywarnalert(Tmp_Rtn_Msg);
                    isOk = false;
                }
            },  //end of success                
            failure: function (response, opts) {
                var Tmp_Obj = Ext.decode(response.responseText);
                var Tmp_Rtn_Msg = "條碼編號("+Tmp_TMNO+")技令編號(" + Tmp_TMNOXX + ")國別碼(" + Tmp_NATIXX + ")中英文別(" + Tmp_LGTPXX + ")<br>"
                    + "更新技令版期失敗<br> "
                    + "錯誤訊息如下:<br>"
                    + Tmp_Obj["Rtn_Msg"];
                mywarnalert(Tmp_Rtn_Msg);
                isOk = false;
            }
        })  //end of Ext.Ajax.Request        
    if (isOk == true) {        
            //資料更新完成, 重新顯示資料
            Ext.getCmp("btn_Show").fireHandler();
        }
} // end of   function Call_V120401C() {


2>V120401C*.cs
/*        // 更新 - UPDATE_AMM_TMDWGED  

        //技令若有最新版本,則更新[技令版期(AMM_TMDWGED)]
            --> [技令版期(AMM_TMDWGED)].CTRL= MAX(CTRL)+1 , 
                 --> 新增 TM_XY@TLS_245 的版本資料(TMNOXX+NATIXX+LGTPXX)
        */
        [HttpPost]
        public HttpResponseMessage UPDATE_AMM_TMDWGED()
        {
            //取得參數值
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            string Tmp_TMNO = nvc["TMNO"];
            string Tmp_TMNOXX = nvc["TMNOXX"];
            string Tmp_LGTPXX = nvc["LGTPXX"];
            string Tmp_NATIXX = nvc["NATIXX"];

            OracleCommand cmd = new OracleCommand();
            var response = this.Request.CreateResponse();
            //STEP 1>比對  TM_XY 的筆數是否和  AMM_TMDWGED的筆數相符
            bool is_update = false;
            string Tmp_RtnMsg;
            string Tmp_MAX_CTRL="";
            int Tmp_NEXT_CTRL=1;
            int Tmp_XY_CNT, Tmp_TMDWGED_CNT;
            string Tmp_Sql = " SELECT  COUNT(*)  "
                                       + "  FROM    TM_XY @TLS_245  "
                                       + "  WHERE  1 = 1  "
                                       + "  AND        OWN_DEP = 'L'   "
                                       + "   AND       TMNOXX = " + myfunc.AA(Tmp_TMNOXX)
                                       + "   AND       NATIXX = " + myfunc.AA(Tmp_NATIXX)
                                       + "   AND       LGTPXX = " + myfunc.AA(Tmp_LGTPXX);
            Tmp_XY_CNT = int.Parse(myfunc.SqlValue(Tmp_Sql));
            //沒有任何版期資料, 則返回, 不需更新
            if (Tmp_XY_CNT == 0)
            {
                is_update = false;
            }
            else
            {
                Tmp_Sql = " SELECT   MAX(B.CTRL)  "
                                + " FROM     AMM_TMDWG A,AMM_TMDWGED B  "
                                + " WHERE  A.TMNO = B.TMNO   "
                                + "  AND      A.OWN_DEP = 'L'   "
                                + "  AND      A.TMNO=" + myfunc.AA(Tmp_TMNO)
                                + "   AND    A.TMNOXX = " + myfunc.AA(Tmp_TMNOXX)
                                + "   AND     A.NATIXX = " + myfunc.AA(Tmp_NATIXX)
                                + "   AND     A.LGTPXX = " + myfunc.AA(Tmp_LGTPXX);
                Tmp_MAX_CTRL = myfunc.SqlValue(Tmp_Sql);                
                Tmp_Sql = " SELECT COUNT(*)  "
                                + " FROM     AMM_TMDWG A,AMM_TMDWGED B  "
                                + " WHERE  A.TMNO = B.TMNO   "
                                + "  AND      A.OWN_DEP = 'L'   "
                                 + "  AND      A.TMNO=" + myfunc.AA(Tmp_TMNO)
                                + "   AND    A.TMNOXX = " + myfunc.AA(Tmp_TMNOXX)
                                + "   AND     A.NATIXX = " + myfunc.AA(Tmp_NATIXX)
                                + "   AND     A.LGTPXX = " + myfunc.AA(Tmp_LGTPXX)
                                + "   AND     B.CTRL =" + myfunc.AA(Tmp_MAX_CTRL);
                Tmp_TMDWGED_CNT = int.Parse(myfunc.SqlValue(Tmp_Sql));
                if (Tmp_TMDWGED_CNT != Tmp_XY_CNT)
                {
                    is_update = true;
                }
                //STEP 2>比對  TM_XY.VNTPXD 的是否存在  AMM_TMDWGED.MAX_CTRL.VNTPXD的筆數相符
                Tmp_Sql = "  SELECT   COUNT(*)  "
                               + "  FROM    TM_XY @TLS_245  "
                               + "  WHERE  1 = 1  "
                               + " AND       OWN_DEP = 'L'   "
                               + "   AND    TMNOXX = " + myfunc.AA(Tmp_TMNOXX)
                               + "   AND    NATIXX = " + myfunc.AA(Tmp_NATIXX)
                               + "   AND    LGTPXX = " + myfunc.AA(Tmp_LGTPXX)
                               + "    AND    VNTPXD NOT IN ( SELECT    B.VNTPXD    "
                                                                             + "  FROM      AMM_TMDWG A, AMM_TMDWGED B  "
                                                                             + "  WHERE    A.TMNO= B.TMNO  "
                                                                             + "  AND        A.TMNO=" + myfunc.AA(Tmp_TMNO)
                                                                             + "   AND       A.TMNOXX = " + myfunc.AA(Tmp_TMNOXX)
                                                                             + "   AND       A.NATIXX = " + myfunc.AA(Tmp_NATIXX)
                                                                             + "   AND        A.LGTPXX = " + myfunc.AA(Tmp_LGTPXX)
                                                                             + "    AND        B.CTRL=" + myfunc.AA(Tmp_MAX_CTRL) + " )";
                Tmp_XY_CNT = int.Parse(myfunc.SqlValue(Tmp_Sql));
                if (Tmp_XY_CNT > 0)
                {
                    is_update = true;
                }
            }// else {} if (Tmp_XY_CNT == 0)
            if (is_update)
            {
                //更新資料 -  insert  AMM_TMDWGED ,
                string Tmp_ITEMXY, Tmp_VNTPXD, Tmp_VNDTXY;
                string Tmp_VNPGXY, Tmp_DOREXY, Tmp_REMKXY, Tmp_VNVFXY;
                string Tmp_MKER, Tmp_MKDT;
                Tmp_MKER = User.Identity.Name;
                Tmp_MKDT = DateTime.Now.ToString("yyyy/MM/dd");
                Tmp_NEXT_CTRL = int.Parse(Tmp_MAX_CTRL) + 1;
                // insert AMM_TMDWGEND
                DataTable dt = new DataTable();
                Tmp_Sql = " SELECT  NATIXX, TMNOXX, LGTPXX, OWN_DEP, ITEMXY, VNTPXD, VNDTXY, "
                                 + " VNPGXY,DOREXY,REMKXY,VNVFXY  "
                                 + "  FROM   TM_XY @TLS_245   "
                                 + "  WHERE  1 = 1  "
                                 + "   AND       OWN_DEP = 'L'   "
                                + "   AND       TMNOXX = " + myfunc.AA(Tmp_TMNOXX)
                                + "   AND       NATIXX = " + myfunc.AA(Tmp_NATIXX)
                                + "   AND        LGTPXX = " + myfunc.AA(Tmp_LGTPXX);
                dt = myfunc.SqlOpen(dt, Tmp_Sql);
                foreach (DataRow dr in dt.Rows)
                {
                    Tmp_ITEMXY = dr["ITEMXY"].ToString();
                    Tmp_VNTPXD = dr["VNTPXD"].ToString();
                    //Tmp_VNDTXY = dr["VNDTXY"].ToString();
                    Tmp_VNDTXY = myfunc.getDateStr(dr["VNDTXY"].ToString());
                    Tmp_VNPGXY = dr["VNPGXY"].ToString();
                    //Tmp_DOREXY = dr["DOREXY"].ToString();
                    Tmp_DOREXY = myfunc.getDateStr(dr["DOREXY"].ToString());
                    Tmp_REMKXY = dr["REMKXY"].ToString();
                    Tmp_VNVFXY = dr["VNVFXY"].ToString();                    
                    Tmp_Sql = "  INSERT  INTO   AMM_TMDWGED  "
                                    + "( TMNO,CTRL,"
                                    + "ITEMXY,VNDTXY,VNTPXD,VNPGXY,DOREXY,"
                                    + "REMKXY,VNVFXY,MKER,MKDT) "
                                    + "  VALUES "
                                    + "(" + myfunc.AA(Tmp_TMNO) + "," + myfunc.AA(Tmp_NEXT_CTRL.ToString()) + ","
                                    + myfunc.AA(Tmp_ITEMXY) + "," + myfunc.AA(Tmp_VNDTXY) + "," + myfunc.AA(Tmp_VNTPXD) + "," + myfunc.AA(Tmp_VNPGXY) + "," + myfunc.AA(Tmp_DOREXY) + ","
                                    + myfunc.AA(Tmp_REMKXY) + "," + myfunc.AA(Tmp_VNVFXY) + "," + myfunc.AA(Tmp_MKER) + "," + myfunc.AA(Tmp_MKDT) + ")";
                    myfunc.SqlExec(Tmp_Sql);
                }  // end of foreach (DataRow dr in dt)
                Tmp_RtnMsg = "技令編號(" + Tmp_TMNOXX + ")國別碼(" + Tmp_NATIXX + ")中英文別(" + Tmp_LGTPXX + ")<br>"
                                     + "版期更新完成 !!  <br>";
                response.Content = new StringContent("{'success': true,'Rtn_Msg':'" + Tmp_RtnMsg + "'}");    // 回應內容
            }
            else
            {
                Tmp_RtnMsg = "技令編號(" + Tmp_TMNOXX + ")國別碼(" + Tmp_NATIXX + ")中英文別(" + Tmp_LGTPXX + ")<br>"
                                        + "無最新版期 , 需要更新 !!  <br>";
                response.Content = new StringContent("{'success': true,'Rtn_Msg':'" + Tmp_RtnMsg + "'}");    // 回應內容
            }
            return response;
            //新增  [AMM_TMDWGED] , CTRL=MAX(CTRL)+1            
        } //  end of  UPDATE_AMM_TMDWGD()



--> 另一寫法
         Tmp_cnt1 = Tmp_dt1.Rows.Count;                
                for (int j = 0; j < Tmp_cnt1; j++)
                {
                    DataRow dr1 = Tmp_dt1.Rows[j];
                    string Tmp_VNTPXD= dr1["VNTPXD"].ToString();
 
                    

SQL語法 CASE 的用法 - CASE .. WHEN .. THEN .. END 的用法 - SUBSTR

 目的: SQL 語法 - CASE 的用法

處理說明:  1>SELECT 
           CASE compare_value
             WHEN condition1 THEN result1
             WHEN condition2 THEN result2
             WHEN conditionN THEN resultN
             ELSE result
             END;
                   2>SUBSTR (str, pos, len) : pos 由 1 開始
                   3>LENGTH(AUFNR) : 欄位值的長度




SQL:
1>CASE    WHEN    THEN    ELSE  END
SELECT  AUFNR,MATNR,BUDAT
FROM    SAPR3.AUFM@SAP
WHERE   MANDT='999'
AND     WERKS IN ('5100','7100')
AND     AUFNR IN (SELECT   CASE 
                                                WHEN (SUBSTR(SAPNO,1,1)='F')  OR (SUBSTR(SAPNO,1,1)='V')  THEN  SAPNO
                                                ELSE    LPAD(SAPNO,12,'0')
                                                END     as SAPNO_
                  FROM     AMM_SRO 
                  WHERE    SAPNO IN ('FA210121','V47246049','20006541')
                  )
ORDER  BY AUFNR;

2> SUBSTR(str,pos,len)  :   pos  以 1 開始



SQL1 用法:
     SELECT   AUFNR,MATNR,BUDAT
     FROM      SAPR3.AUFM@SAP
     WHERE   MANDT='999'
      AND        WERKS IN ('5100','7100')
      AND        AUFNR IN (SELECT CASE     SUBSTR(SAPNO,1,1)
                                                           WHEN  'F'  THEN  SAPNO
                                                           ELSE    LPAD(SAPNO,12,'0')
                                                        END as SAPNO_

                                          FROM AMM_SRO
                                          WHERE SAPNO IN ('FA210121','13194980','20006541')
                                          )
     ORDER  BY AUFNR;

SQL2 用法:
     SELECT  AUFNR,MATNR,BUDAT
      FROM    SAPR3.AUFM@SAP
      WHERE   MANDT='999'
       AND     WERKS IN ('5100','7100')
AND     AUFNR IN (SELECT   CASE 
                           WHEN (SUBSTR(SAPNO,1,1)='F')  OR (SUBSTR(SAPNO,1,1)='V') THEN  SAPNO
                           ELSE LPAD(SAPNO,12,'0')
                           END   as SAPNO_
                  FROM     AMM_SRO 
                  WHERE    SAPNO IN ('FA210121','V47246049','20006541')
                  )
ORDER  BY AUFNR;
 


 

2023年11月28日 星期二

ShellExecute 執行檔案列印功能 & Email功能 - print & Email

 目的: ShellExecute 執行檔案列印功能

處理說明:


Uses ShellAPI;

Var

lpHwnd: HWND;
lpOperation, lpFile, lpParameters, lpDirectory: String;
Begin
lpHwnd:= GetDesktopWindow();
lpOperation:= 'open';
lpFile:= 'mailto:' + 'Maple119@263.net' + '?' //主郵件地址後以'?'結束
+ '&cc=' + 'balaba960808@163.com' //抄送
+ '&bcc=' + 'lyf.kibosoft.com' //暗送
+ '&subject=' + '主題'
+ '&body='+ '第一行內容' + '%0d' + '第二行內容' //主題內容以 '%0d' 轉行
+ '&File=' + 'D:\Help.rtf'; //附件只對 Outlook Express 有效
lpParameters:= '';
lpDirectory:= '';
ShellExecute(lpHwnd, pChar(lpOperation),
pChar(lpFile), pChar(lpParameters),
pChar(lpDirectory), SW_SHOWNORMAL);
End;
二、打開一個網頁
ShellExecute(0, 'open', 'http://www.google.com', '', '', SW_SHOWNORMAL);

三、打印文檔
ShellExecute(0, 'print', 'D:\Help.rtf', '', '', SW_SHOWNORMAL)

四、利用系統默認的程序打開指定的文件
ShellExecute(0, 'open', 'D:\Help.rtf', '', '', SW_SHOWNORMAL))
五、用指定的程序打開指定的文件
ShellExecute(0, 'open', 'notepad.exe', 'D:\Help.rtf', '', SW_SHOWNORMAL)
六、執行快捷方式(.LNK)
ShellExecute(handle,'open','c:\windows\desktop\aaa.lnk','', '', sw_hide); 

WinExec主要運行EXE文件。如:WinExec(’Notepad.exe Readme.txt’, SW_SHOW);
ShellExecute不僅可以運行EXE文件,也可以運行已經關聯的文件

首先必須引用shellapi.pas單元:uses ShellAPI;

1.標准用法
ShellExecute函數原型及參數含義如下:
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall;


●hWnd:用於指定父窗口句柄。當函數調用過程出現錯誤時,它將作為Windows消息窗口的父窗口。例如,可以將其設置為應用程序主窗口句柄,即Application.Handle,也可以將其設置為桌面窗口句柄(用GetDesktopWindow函數獲得)。
●Operation:用於指定要進行的操作。

“open” : 打開由FileName參數指定的文件或文件夾;

“print” : 列印由FileName參數指定的文件;

“explore” : 操作表示浏覽由FileName參數指定的文件夾。當參數設為nil時,表示執行默認操作“open”。


●FileName:用於指定要打開的文件名、要執行的程序文件名或要浏覽的文件夾名。
●Parameters:若FileName參數是一個可執行程序,則此參數指定命令行參數,否則此參數應為nil或PChar(0)。
●Directory:用於指定默認目錄。
●ShowCmd:若FileName參數是一個可執行程序,則此參數指定程序窗口的初始顯示方式,否則此參數應設置為0。


若ShellExecute函數調用成功,則返回值為被執行程序的實例句柄。

若返回值小於32,則表示出現錯誤。
上述僅僅是ShellExecute函數的標准用法,下面將介紹它的特殊用法。


2.特殊用法
如果將FileName參數設置為“http:”協議格式,那麼該函數將打開默認浏覽器並鏈接到指定的URL地址。若用戶機器中安裝了多個浏覽器,則該函數將根據Windows 9x/NT注冊表中http協議處理程序(Protocols Handler)的設置確定啟動哪個浏覽器。
格式一:http://網站域名。
如:ShellExecute(handle, ‘open’, http:// ; www.neu.edu.cn’, nil, nil, SW_SHOWNORMAL);
格式二:http://網站域名/網頁文件名。
如:ShellExecute(handle, ‘open’, http:// ; , SW_SHOWNORMAL);



如果將FileName參數設置為“mailto:”協議格式那麼該函數將啟動默認郵件客戶程序,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若用戶機器中安裝了多個郵件客戶程序,則該函數將根據Windows 9x/NT注冊表中mailto協議處理程序的設置確定啟動哪個郵件客戶程序。

格式一:mailto:
如:ShellExecute(handle,‘open’, ‘mailto:’, nil, nil, SW_SHOWNORMAL);打開新郵件窗口。


格式二:mailto:用戶賬號@郵件服務器地址
如:ShellExecute(handle, ‘open’,‘ , nil, nil, SW_SHOWNORMAL);打開新郵件窗口,並自動填入收件人地址。若指定多個收件人地址,則收件人地址之間必須用分號或逗號分隔開(下同)。


格式三:mailto:用戶賬號@郵件服務器地址?subject=郵件主題&body=郵件正文
如:ShellExecute(handle, ‘open’, ‘ ?subject=Hello&Body=This is a test’, nil, nil, SW_SHOWNORMAL);打開新郵件窗口,並自動填入收件人地址、郵件主題和郵件正文。若郵件正文包括多行文本,則必須在每行文本之間加入換行轉義字符%0a。



例子(delphi):

在一個應用程序調用c:Project1.exe;
ShellExecute(handle, ’open’,’c:Project1.exe’,’字串內容’,nil, SW_SHOWNORMAL);
在Project1.exe裡可以調用:
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
for i:=1 to paramcount do
if ParamStr(i)〈〉’’ then showmessage(ParamStr(i));
end;

最後的那個參數,為窗口指定可視性方面的一個命令。
請用下述任何一個常數
SW_HIDE 隱藏窗口,活動狀態給令一個窗口
SW_MINIMIZE 最小化窗口,活動狀態給令一個窗口
SW_RESTORE 用原來的大小和位置顯示一個窗口,同時令其進入活動狀態
SW_SHOW 用當前的大小和位置顯示一個窗口,同時令其進入活動狀態
SW_SHOWMAXIMIZED 最大化窗口,並將其激活
SW_SHOWMINIMIZED 最小化窗口,並將其激活
SW_SHOWMINNOACTIVE 最小化一個窗口,同時不改變活動窗口
SW_SHOWNA 用當前的大小和位置顯示一個窗口,不改變活動窗口
SW_SHOWNOACTIVATE 用最近的大小和位置顯示一個窗口,同時不改變活動窗口
SW_SHOWNORMAL 與SW_RESTORE相同

2023年11月22日 星期三

V80E02 – DataTable 搜尋值 .Select(“EMPLYID LIKE ‘3125672%’); -dt1.Select(:過濾條件);

 目的: V80E02 – DataTable 搜尋值 .Select(“EMPLYID LIKE  ‘3125672%’);

處理說明: 1>由 SQL 取得 DataTable
                  2> DataRow[] dr_Ary=DataTable.Select (:過濾條件) ;
                  3>dr_Ary.length>0 ,則欄位值設為 'V'


1>*.js
DataRow[] dr_Ary;
 Tmp_Sql = "   SELECT  "+myfunc.AA2("CourseOfferingName") 
                                + "    FROM    AIDviewTrainingRecords_Y40@AMM_F16V_SOI  "                                  
                                +"     WHERE  1=1 "                                   
                                + "   AND    " + myfunc.AA2("EmployeeID") + "=" + myfunc.AA(Tmp_EMPLYID); 
Tmp_dt2 = myfunc.SqlOpen(Tmp_dt2, Tmp_Sql);
Tmp_condSqlStr = " CourseOfferingName  LIKE " + myfunc.AA(Tmp_DOCMT + "%");
dr_Ary = Tmp_dt2.Select(Tmp_condSqlStr);
if (dr_Ary.Length>0)
      dr[Tmp_DOCMT] = "V";
else
     dr[Tmp_DOCMT] = "";


2023年11月20日 星期一

V80E01 - Runtime 新增欄位 - 依 SQL 資料(N筆) 新增 Grid 顯示欄位

 目的: V80E01 - 依 SQL 資料(N筆) 新增 Grid 顯示欄位

處理說明: 1> 欄位名稱 [SQL 資料(N筆)] 透過 Cookie 由後端傳至前端

                  2> Grid 的 model 及 column 必需重新設定

                       Ext.define('GridModel1', {
                                    extend: 'Ext.data.Model',
                                    fields: J_gridmodel
                                });
                       Ext.getCmp('grid_Single').store.getProxy().setModel(GridModel1, true);
                       Ext.getCmp('grid_Single').reconfigure(Ext.getCmp('grid_Single').store, J_columns);

                       Ext.getCmp('grid_Single').reloadGridData(); 



1>*.js
 items: [
                    {
                        xtype: 'button',
                        id: 'btn_Show',
                        flex: 5,
                        border: 1,
                        text: '資料顯示',
                        iconCls: 'icon-search',
                        handler: function () {
                            var Tmp_PITM = Ext.getCmp("s_PITM").getValue();
                            if (checkisnull(Tmp_PITM)) {
                                var Tmp_Str = "[受訓專業]過濾條件不可空白<br>"
                                                         + "請先輸入!!";
                                mywarnalert(Tmp_Str);
                                return;
                            }                           
                            var np = s_JSON('s_form'); //TMFunction.js, 組合form上的查詢條件為json參數傳遞                                                                                                               
                            gridstore.getProxy().url = '../api/V80E01API/getGridData_M';
                            gridstore.getProxy().extraParams = np; //分頁OK,篩選條件OK                            
                            Ext.getCmp('grid_Single').store.pageSize = 30;
                            Ext.getCmp('grid_Single').reloadGridData();    
                            Ext.getCmp('grid_Single').store.on('load', function (me, records, successful, operation, eOpts) {
                                settrue("grid_Single");
                            })
                            waittrue("grid_Single", AddFields);
                            function AddFields() {                                
                                //讀取 新增的欄位s字串 ["COSCStr"]
                                var Tmp_COSCStr = r_cookies('COSCStr');
                                //console.log("r_cookies=", r);
                                if (!checkisnull(Tmp_COSCStr)) {
                                    //先恢愎至原本的欄位 Array - J_gridmodel (7筆)  &  J_columns(8筆) , 
                                    //以免每按[顯示資料], COSC欄位一直累加
                                    while (J_gridmodel.length > 7) 
                                        J_gridmodel.pop();
                                    while (J_columns.length > 8)
                                        J_columns.pop();
                                    var Tmp_COSC_Ary = Tmp_COSCStr.split(',');
                                    var Tmp_cur_COSC = "";
                                    var Tmp_COSC_Obj = {};
                                    var Tmp_COSC_Obj1 = {};
                                    for (var i = 0; i < Tmp_COSC_Ary.length; i++) {
                                        Tmp_cur_COSC = Tmp_COSC_Ary[i];
                                        //var J_gridmodel = [
                                        //    { name: "EMPLYID" },
                                        //    { name: "EMPLYNM" },
                                        //    ]
                                        //將 Tmp_cur_COSC 加入 J_gridmodel
                                        Tmp_COSC_Obj = { name: Tmp_cur_COSC };
                                        J_gridmodel.push(Tmp_COSC_Obj);
                                        Tmp_COSC_Obj1 = { header: Tmp_cur_COSC, dataIndex: Tmp_cur_COSC, width: 60, TMType: "string" };
                                        J_columns.push(Tmp_COSC_Obj1);
                                    }
                                    console.log("J_gridmodel:", J_gridmodel);
                                    console.log("J_columns:", J_columns);
                                }
                                //Ext.getCmp('grid_Single').getView().refresh();
                                //重設 store 的 model & columns
                           Ext.define('GridModel1', {
                                    extend: 'Ext.data.Model',
                                    fields: J_gridmodel
                                });
                           Ext.getCmp('grid_Single').store.getProxy().setModel(GridModel1, true);
                           Ext.getCmp('grid_Single').reconfigure(Ext.getCmp('grid_Single').store, J_columns);
                           Ext.getCmp('grid_Single').reloadGridData();

                            }  // end of AddFields
                        }
                    },  // end of 顯示資料







2023年11月19日 星期日

V80E01 - TreeView挑選人員 - 利用Get_pickTree_btn0

 目的: V80E01 - TreeView挑選人員 - 利用Get_pickTree_btn0

 處理說明: 1> 利用  Get_pickTree_btn0  - 產生 TreeView挑選人員 Button
                   2>var cmp_pick_EMPLYID 
           = get_pickTree_btn0('挑選員工編號', 's_btn_EMPLYID', 's_EMPLYID', 's_EMPLYID_');
              //get_pickTree_btn0(挑選視窗標題,按鈕id,傳回員工編號欄位(s_EMPLYID),
                                                                                          傳回員工姓名欄位(s_EMPLYID_),  )


1>*.js

 // panel11  
    var cmp_EMPLYID = get_cmp_txt1('員工編號', 's_EMPLYID', 80, 100);
    var cmp_EMPLYID_ = get_cmp_cal0('s_EMPLYID_', 100);
    //取得 TreeView 人員挑選
    var cmp_pick_EMPLYID = get_pickTree_btn0('挑選員工編號', 's_btn_EMPLYID',                                                                                                's_EMPLYID', 's_EMPLYID_');
    cmp_EMPLYID.items.push(cmp_EMPLYID_,cmp_pick_EMPLYID);


    //篩選條件畫面
    var Query = new Ext.FormPanel({
        id: 's_form',
        layout: { type: 'hbox', align: 'stretch' },
        fieldDefaults: { labelAlign: 'right' },
        defaults: { margin: { top: 3 } },
        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_EMPLYID,],
                    },  // end of panel11
                    {
                        xtype: 'panel', id: 'panel12', layout: { type: 'vbox', align: 'stretch' }, flex: 30, border: 0,
                        items: [],
                    },   // end of panel12 , flex:16                                        
                ]
            },  // end of panel1            

2023年11月9日 星期四

V80203 – 計算日期差異天數 - Days

 目的: V80203 – 計算日期差異天數

處理說明: 1> (Tmp_DT1 - Tmp_DT2).Days


1>*.js
DateTime Tmp_STARTDT;
int Tmp_Days;
Tmp_STARTDT = DateTime.Parse(dr["STARTDT"].ToString());
Tmp_Days = (DateTime.Today - Tmp_STARTDT).Days;
dr["DAYIN_"] = Tmp_Days.ToString();

2023年11月8日 星期三

V80203 – checkbox –勾選[V]已完工,則 [ ]未完工 不勾選 - onChangeEvent - V80202 -[V]TP工單,則[ ]非 TP工單不勾選

目的 : V80203 – checkbox –勾選[V]已完工, [ ]未完工  -–勾選[V]未完工, [ ]已完工 

           V80202 -[V]TP工單,則[ ]非 TP工單不勾選

處理說明: 1>get_cmp_xxx - s_chk_AMMSTS Object - 為一般Objext - 沒有 Ext onchange屬性
                      var cmp_chk_AMMSTS1 = get_cmp_chk0('已完工', 's_chk_AMMSTS', 50, '1');
                      --> Object  cmp_chk_AMMSTS1  - 為一般Object,並沒有 onchange event 的屬性
    
              2>get_cmp_XXX --> 加入 Query(Ext.FormPanel) 後, 才有 Ext 的各種屬性(onchange/.. )
                  var Query = new Ext.FormPanel({
                  id: 's_form',
                  items: [
                 {
                xtype: 'panel', id: 'panel1', layout: { type: 'hbox', align: 'stretch' }, flex: 14, border: 0,
                items: [                  
                   {
                        xtype: 'panel', id: 'panel15', layout: { type: 'vbox', align: 'stretch' }, flex: 15, border: 0,
                        items: [cmp_chk_AMMSTS, cmp_ISROOT, cmp_ISBOMIN, cmp_ISWAITNSN],
                    },   // end of panel15 , flex:16                        

           3> [V]已完工 [ ]未完工的 true/false 控制
    Ext.getCmp("s_chk_AMMSTS").items.items[0].on('change', function (me, newValue, oldValue, eOpts) {
        if (newValue) {
            Ext.getCmp("s_chk_AMMSTS").items.items[1].setValue(false);
        }
    }
    );  // end of  cmp_chk_AMMSTS.items[0].on("change"
    Ext.getCmp("s_chk_AMMSTS").items.items[1].on('change', function (me, newValue, oldValue, eOpts) {
        if (newValue) {
            Ext.getCmp("s_chk_AMMSTS").items.items[0].setValue(false);
        }
    }
    );  // end of  cmp_chk_AMMSTS.items[0].on("change"



1>*.js
    //單況: 已完工/未完工
    var cmp_chk_AMMSTS = get_cmp_chkgrp1('單況', 's_chk_AMMSTS', 50);    
    var cmp_chk_AMMSTS1 = get_cmp_chk0('已完工', 's_chk_AMMSTS', 50, '1');
    var cmp_chk_AMMSTS2 = get_cmp_chk0('未完工', 's_chk_AMMSTS', 50, '2');
    cmp_chk_AMMSTS.items.push(cmp_chk_AMMSTS1, cmp_chk_AMMSTS2);
    cmp_chk_AMMSTS1.checked = true;    

  var Query = new Ext.FormPanel({
        id: 's_form',
        layout: { type: 'hbox', align: 'stretch' },
        fieldDefaults: { labelAlign: 'right' },
        defaults: { margin: { top: 3 } },
        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_EOECN, cmp_ACNO,cmp_AMMNO, cmp_AMMSTS, cmp_PN1, cmp_EM_SN,],
                    },  // end of panel11
                    {
                        xtype: 'panel', id: 'panel12', layout: { type: 'vbox', align: 'stretch' }, flex: 25, border: 0,
                        items: [cmp_RMK, cmp_PROJID, cmp_SAPNO, cmp_SAPMAN, cmp_STARTVAL, cmp_CHARG,],
                    },   // end of panel12 , flex:16                    
                    {
                        xtype: 'panel', id: 'panel13', layout: { type: 'vbox', align: 'stretch' }, flex: 25, border: 0,
                        items: [cmp_PN, cmp_PROCWC, cmp_MKDT,  cmp_SROTP, cmp_FACWC,],
                    },   // end of panel13 , flex:16              
                    {
                        xtype: 'panel', id: 'panel14', layout: { type: 'vbox', align: 'stretch' }, flex: 30, border: 0,
                        items: [cmp_WBSNO, cmp_ACAREA, cmp_LWA, cmp_MK,cmp_SAPDT1,],
                    },   // end of panel14 , flex:16                               
                    {
                        xtype: 'panel', id: 'panel15', layout: { type: 'vbox', align: 'stretch' }, flex: 15, border: 0,
                        items: [cmp_chk_AMMSTS, cmp_ISROOT, cmp_ISBOMIN, cmp_ISWAITNSN],
                    },   // end of panel15 , flex:16                            

    console.log("cmp_chk_AMMSTS2:", cmp_chk_AMMSTS2);
    console.log("Ext.getCmp('s_chk_AMMSTS').items.items[1]", Ext.getCmp('s_chk_AMMSTS').items.items[1]);
    Ext.getCmp("s_chk_AMMSTS").items.items[0].on('change', function (me, newValue, oldValue, eOpts) {
        if (newValue) {
            Ext.getCmp("s_chk_AMMSTS").items.items[1].setValue(false);
        }
    }
    );  // end of  cmp_chk_AMMSTS.items[0].on("change"
    Ext.getCmp("s_chk_AMMSTS").items.items[1].on('change', function (me, newValue, oldValue, eOpts) {
        if (newValue) {
            Ext.getCmp("s_chk_AMMSTS").items.items[0].setValue(false);
        }
    }
    );  // end of  cmp_chk_AMMSTS.items[0].on("change"




1>*.js
   //若按[TP工單],則 [非TP工單].checked=false;
    Ext.getCmp("s_chk_TP").items.items[0].on('change', function (me, newValue, oldValue, eOpts) {
        if (newValue) {
            Ext.getCmp("s_chk_TP").items.items[1].setValue(false);
        }
    }
    );  // end of  cmp_chk_TP.items[0].on("change"
    Ext.getCmp("s_chk_TP").items.items[1].on('change', function (me, newValue, oldValue, eOpts) {
        if (newValue) {
            Ext.getCmp("s_chk_TP").items.items[0].setValue(false);
        }
    }

V80203- 子畫面 – Grid -顯示 Grid子畫面 - store.onload - load - store - proxy - cur_rec

 目的: V80203- 工單需求物料查詢 顯示 Grid子畫面

處理說明: 1>呼叫子畫面函式: Call_V80203B();
                  2>子畫面處理:
    var win = getMyWindow("顯示原始需求物料", sub_BackFlds, sub_BackFlds_Btns);
    Ext.getCmp('sub_Grid').store.getProxy().url = '../../api/V80203BAPI/get_sub_data1',
    Ext.getCmp('sub_Grid').store.getProxy().extraParams = np; //分頁OK,篩選條件OK    
    Ext.getCmp('sub_Grid').store.load();                
                                
    win.show();    





1>V80203.js
{
            xtype: 'button', text: '顯示原始需求物料', id: 'Call_V80203B_Btn',
            listeners: {
                click: function () {
                    //mysuccessalert(" call BatAddBtn_click() ");
                    Call_V80203B();
                }
            }
        },        


2>V80203B.js
function Call_V80203B() {
    //按鈕 : [離開]  
    var sub_BackFlds_Btns = [
        {
            xtype: 'button', text: '離開', id: 'sub_BackFlds_CancelBtn',
            listeners: {
                click: function () {
                    //mysuccessalert("mysub2_取消");
                    var Tmp_win = this.up("window");
                    if (Tmp_win == undefined) {
                        Ext.Msg.alert("取消時未取到Window Object");
                    }
                    this.up("window").close();
                    this.up("window").destroy();
                }
            }
        },
    ];
    
    //sub_ Grid
    var sub_Grid = Ext.create('TMGrid', {
        grid_id: 'sub_Grid',
        columns: sub_B_Columns,
        autoScroll: true,
        flex: 1,
        store: Ext.create('gridstore', { model: sub_B_Fields }),
    });
    console.log("step2.5");

    // [顯示原始需求物料]鈕  - 子畫面欄位
    var sub_BackFlds = [
        {
            type: 'panel', bodyStyle: "background-color:transparent;", border: 0, padding: "5",
            flex: 100,
            //layout: { type: 'vbox', align: 'stretch' }, 
            layout: 'border',
            items: [
                {
                    xtype: 'panel',
                    id: 'sub_panel1',
                    region: 'north',
                    layout: { type: 'hbox', align: 'stretch' },
                    //flex: 0,
                    //border: 1,
                    items: []
                },  //end of panel1                    
                {
                    xtype: 'panel',
                    id: 'sub_panel2',
                    //title: 'sub_panel2',
                    region: 'center',
                    layout: 'fit',
                    //flex: 60,
                    //border: 20,
                    items: [sub_Grid]
                },
            ] // end of   layout: "vbox", padding: "5", items: [
        }  //end of  my_Sub2 , items[{
    ]      //end of  my_Sub2 , items[

    Ext.getCmp('sub_Grid').store.on("load", function (me, records, successful, eOpts) {
        if (successful) {
            console.log("Ext.getCmp('sub_Grid').store", Ext.getCmp('sub_Grid').store);
            console.log("Ext.getCmp('sub_Grid').store.data", Ext.getCmp('sub_Grid').store.data);
        }
    }
    );

    var win = getMyWindow("顯示原始需求物料", sub_BackFlds, sub_BackFlds_Btns);
    //var win = getMyWindow("歸還登記", sub_BackFlds);
    win.width = 800;
    win.heigh = 400;
    var cur_recs = Ext.getCmp('grid_M').getSelectionModel().getSelection();
    if (cur_recs.length == 0) {
        var Tmp_Str = "請先選擇資料";
        mywarnalert(Tmp_Str);
        return ;
    }
    var cur_rec = cur_recs[0];
    var Tmp_AMMNO = cur_rec.data['AMMNO'].toString();
    var np = {};
    np["AMMNO"] = Tmp_AMMNO;    
    var is_Ok = true;
    //顯示 store 的資料
    Ext.getCmp('sub_Grid').store.getProxy().url = '../../api/V80203BAPI/get_sub_data1',
    Ext.getCmp('sub_Grid').store.getProxy().extraParams = np; //分頁OK,篩選條件OK    
    Ext.getCmp('sub_Grid').store.load();               
                                
    win.show();    
    console.log("step6");
} // end of   function LendBtn_click() {