2023年12月14日 星期四

SOAP(Simple Object Access Protocol) - WSDL(Web Service Define Language - XML)

 A web service is a function that can be accessed by other programs over the web (Http).


To clarify a bit, when you create a website in PHP that outputs HTML its target is the browser and by extension the human being reading the page in the browser. 


A web service is not targeted at humans but rather at other programs.

So your PHP site that generates a random integer could be a web service if it outputs the integer in a format that may be consumed by another program. It might be in an XML format or another format, as long as other programs can understand the output.

Wsdl is the interface and that's all you need. Good thing is that it is written in xml… so that we can achieve independence of defining data. All the languages have got APIs to read Xmls.(so that's the advantage of xml).

Now…the clients gets the wsdl and generates the stub code… this code is responsible for mediating the request response between server and client.




2023年12月12日 星期二

V30701A: 不出現子畫面,直接更新單況 - Update_STA

 目的: V30701A: 不出現子畫面,直接更新單況

處理說明: 1>呼叫子畫面 *.js
                  2>後端更新資料庫 *.cs
                  3>執行完成,顯示訊息  : 透過 Cookie , 不透過 sucessful
                        var mask = new Ext.LoadMask(Ext.getBody(), {
                               msg: '處理中,請稍待...'
                        });
                      mask.show();//使用 mask 需手動呼叫show() 方法下
                       //每1秒檢核一次,是否已完成, 若已完成,則不再檢核
                     var timer = setInterval(function () {
                     var r = r_cookies('EX_DFile');
                      if (!checkisnull(r)) {
                             mysuccessalert(r);  //顯示訊息
                            clearInterval(timer);
                            mask.hide();
                           timer = null;   
                    Ext.getCmp('btn_Show').fireHandler();  //重新顯示 Master資料
                }
            }, 1000);  //1000ms = 1sec                                   




1>*.js
  //按鈕 : [附檔資料] [批次新增][確認轉發工][下載匯入格式]
    var Btn_Ary = [        
        {
            xtype: 'button', text: '申請單送出', id: 'Btn_V30701A',
            listeners: {
                click: function (me,e,eOpts) {
                    console.log(" 1 申請單送出: ");
                    Call_V30701A();
                }
            }
        },        
    ];
    //於單檔下方新增 Button
    Ext.getCmp('grid_Single').insertBtn(Btn_Ary);


2>V30701A.js
//[申請單送出]鈕 -  - 只更新資料,無子畫面
//[申請單送出]鈕 -  - 只更新資料,無子畫面
function Call_V30701A(id) {
    var cur_recs = Ext.getCmp('grid_Single').getSelectionModel().getSelection();
    var cur_rec;
    if (cur_recs.length == 0) {
        buttonModel.modelType = 0;
        mywarnalert('請先挑選[申請單送出]的資料!!');
    }
    else {
        cur_rec = cur_recs[0];
        var Tmp_msg ="確定執行[申請單送出]嗎?<br>"
                                +"(派遣申請單號: "+ cur_rec.data['TASKNO'].toString() + ")";

        myconfirmalert(Tmp_msg, callBackFunc);

        //Ext.Msg.confirm('提醒', Tmp_msg, callBackFunc);
        function callBackFunc(id) {
            if (id == 'yes') {
                console.log("cur_recs.length:", cur_recs.length);
                var np = {}
                np["TASKNO"] = cur_rec.data['TASKNO'].toString();
                var Tmp_url = '../../api/V30701AAPI/UPDATE_STA';
                var rtn_Str = getUrlStr(Tmp_url, np, "申請單送出");
                console.log("rtn_Str:", rtn_Str);
                if (checkRtnOK(rtn_Str))
                    mysuccessalert(rtn_Str, function () {
                        Ext.getCmp("btn_Show").fireHandler();
                        Ext.getCmp("sub_V30701A_CancelBtn").fireHandler();
                    });
                else
                    mywarnalert(rtn_Str);
            }
        }// end of   if (id == 'yes') {


3>*.cs
// 更新 - UDPATE_STAT  ,  AMM_COMQ
        [HttpPost]
        public dynamic UPDATE_STA()
        {
            //取得參數值
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            string Tmp_TASKNO = nvc["TASKNO"];
            string Tmp_RtnMsg = "";
            string n = funId + "_UPDATE_STA";
            HttpCookie MyCookie;
            try
            {
                var Tmp_Sql = "  UPDATE  AMM_DSPHCAR "
                                      + "   SET        STA='B'   "
                                      + "  WHERE   TASKNO=" + myfunc.AA(Tmp_TASKNO);
                myfunc.SqlExec(Tmp_Sql);
                Tmp_RtnMsg = "派遣申請單號(" + Tmp_TASKNO + ").單況已設定為[B:待執行(派遣申請已送出)]!!";
                MyCookie = new HttpCookie("EX_DFile", HttpUtility.UrlEncode(Tmp_RtnMsg));
                HttpContext.Current.Response.Cookies.Add(MyCookie);

            }
            catch (Exception e)
            {
                Tmp_RtnMsg = myfunc.Get1ORA(e.Message);
                Tmp_RtnMsg = "[申請單送出]失敗 !!  <br>"
                                         + Tmp_RtnMsg;
                MyCookie = new HttpCookie("EX_DFile", HttpUtility.UrlEncode(Tmp_RtnMsg));
                HttpContext.Current.Response.Cookies.Add(MyCookie);
            }
            return Tmp_RtnMsg;
        }


2023年12月7日 星期四

V80405B - Excel 插入長條圖 - 統計圖

 目的: V80405B - Excel 插入長條圖

處理說明: 1>Worksheet ws2 = wk.Worksheets[2];//獲取第三個工作表 - 缺件統計圖表
                  2> Chart 設定

                       Chart chart = ws2.Charts.Add(ExcelChartType.ColumnClustered);                                                       chart.ChartTitle = "件號2缺件量統計表";
                       chart.DataRange = ws2.Range["A1:B4"];
                       chart.SeriesDataFromRange = false;




1>*.cs
  Worksheet ws2 = wk.Worksheets[2];//獲取第三個工作表 - 缺件統計圖表
  //Sheet2 : 統計圖表                
                ws2.Range[myfunc.GetExcelPos(0, 0)].Text = "件號";
                ws2.Range[myfunc.GetExcelPos(1, 0)].Text = "數量";
                ws2.Range[myfunc.GetExcelPos(0, 1)].Text = "PN1";
                //ws2.Range[myfunc.GetExcelPos(1, 1)].Text = "3";
                ws2.Range[myfunc.GetExcelPos(1, 1)].NumberValue = 3;
                ws2.Range[myfunc.GetExcelPos(1, 1)].NumberFormat = "0.00";
                ws2.Range[myfunc.GetExcelPos(0, 2)].Text = "PN2";
                //ws2.Range[myfunc.GetExcelPos(1, 2)].Text = "2";
                ws2.Range[myfunc.GetExcelPos(1, 2)].NumberValue = 2;
                ws2.Range[myfunc.GetExcelPos(1, 2)].NumberFormat = "0.00";
                ws2.Range[myfunc.GetExcelPos(0, 3)].Text = "PN3";
                //ws2.Range[myfunc.GetExcelPos(1, 3)].Text = "1";
                ws2.Range[myfunc.GetExcelPos(1, 3)].NumberValue = 1;
                ws2.Range[myfunc.GetExcelPos(1, 3)].NumberFormat = "0.00";


                //// new Chart
                Chart chart = ws2.Charts.Add(ExcelChartType.ColumnClustered);
                chart.ChartTitle = "件號2缺件量統計表";
                chart.DataRange = ws2.Range["A1:B4"];
                chart.SeriesDataFromRange = false;

                ////指定圖表所在的位置
                chart.LeftColumn = 5;
                chart.TopRow = 2;
                chart.RightColumn = 15;
                chart.BottomRow = 20;


                wk.ActiveSheetIndex = 0;
                wk.SaveToStream(mstream, FileFormat.Version2007);
                wk.SaveToFile(FileName1, FileFormat.Version2007);             


2023年12月4日 星期一

DataTable 以欄位值排序

目的: DataTable  以欄位值排序

處理說明: 1>DataTable 的顯示內容:     DataView  dv1=new DataView();
                                                                  dv1=dt1.DefaultView;
                                                                  dv1.Sort=" Date Asc ";
                                                                  --> dv1=new DataView(dt1);
                                                                        dv1.Sort=" Date Asc";   
                   2>dt.DefaultView.Sort = Date1 ASC ";
                     dt = dt.DefaultView.ToTable();

 

Exampl1:

 DataTable _dt = new DataTable();

_dt.Columns.Add("Date", typeof(DateTime));
_dt.Columns.Add("Preferance", typeof(int));

_dt.Rows.Add("30/07/2011", 0);
_dt.Rows.Add("02/03/2011", 1);
_dt.Rows.Add("10/12/2011", 2);
_dt.Rows.Add("01/12/2011", 3);

DataView _dv = new DataView(_dt);
_dv.Sort = "Date ASC";

for (int i = 0; i < _dv.Count; i++)
{
    Console.WriteLine(Convert.ToDateTime(_dv[i]["Date"]).ToString("dd/MM/yyyy") + "\t" + _dv[i]["Preferance"]);
}

Example2:
dt.DefaultView.Sort = "Parameter_Name";
dt = dt.DefaultView.ToTable();


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相同