2022年7月31日 星期日

V80C02 - 匯出 – c# & js - 格式化小數2位 , 格式化日期, -toString() -color - 粗體文字 - 欄位屬性 - null.length null.toString 均會 Error

 目的: 匯出 XLS檔案, 若 [標準工時][已報工時] – 若空白,則顯示 0.00 , 格式化小數2位

處理說明:  一 *.cs  Substring,ToString()

                         1>Double.Parse(dt.Rows[i]["STDHRS"].ToString("0.00"));

                         2>DateTime.Parse(Tmp_dt.Rows[i]["BRDT"].ToString()).ToString("yyyy/MM/dd"); 

                          --> myfunc.Date2Str(Tmp_dt.Rows[i]["BRDT"].ToString());  

                                //日期格式 yyyy/mm/dd

                             DateTime.Now.ToString("yyyy/MM/dd");
                             string Tmp_TATM = DateTime.Now.ToString("yyyy/MM/dd  hh:mm:ss");

                         3>Tmp_Str.Substring(pos,len);

                              //去除尾碼;   

                               -->    Tmp_Str=Tmp_Str.Substring(Tmp_Str.Length-1,1);

                        4>var Tmp_int=3;   Tmp_int.ToString();

                        5>日期加 1天   Datetime.AddDays
                              DateTime.Now.AddDays(1).ToShortDateString();
  
Tmp_APDT2 = string.Format("{0:yyyy/MM/dd}", DateTime.Parse(nvc["s_APDT2"]).AddDays(1));

                  

二. *.js  substring , substr,toString(), trim()

                        1> par_format = 'Y/m/d  H:i';  //日期格式    yyyy/mm/dd  hh/mm ,                                                                Tmp_DateStr = Ext.Date.format(new Date(par_date), par_format);

{ header: "執行時間", dataIndex: "TATM", width: 150, sortable: false, TMType: "date", renderer: Ext.util.Format.dateRenderer('Y/m/d H:i') },

                       2>Tmp_Str.substring(pos1,pos2);
                           Tmp_Str.substr(pos1,len);        
                                  Ex:  
                                  string  Tmp_Str="goodboy";                              
                                  Tmp_Str=Tmp_Str.substring(0,3);  //  Tmp_Str=good
                                  Tmp_Str=Tmp_Str.substr(0,2);       //  Tmp_Str=go

                       3>var Tmp_int=24;  //將數字轉成字串
                            mysuccessalert(Tmp_int.toString())          ;
                       
                      4>將文字轉成數字  Number(Tmp_Str)
                           var Tmp_Str="24";
                           Tmp_int=Number(Tmp_Str);     
                      
                      5>設定文字顏色                
                               {
                                    xtype: "label", text: "(請刷識別證)", width: 120, border: 2, 
                                    style: "font-size: 12pt; color: blue; background:  gray; ",
                                },             
                    6>  - 粗體字體
                        var cmp_TAMAN_lbl = get_cmp_lbl0("(請刷識別證)", 130);    
                        cmp_TAMAN_lbl.style = "font-size: 12pt; color: blue; ";
                        cmp_TAMAN_lbl.margin = "0 0 0 10";

                    7>判斷是否null
                          if (checkisnull(cur_rec)) {
                            mysuccessalert("空值 ")          ;    
                          } 
                         --.>  undefined
                                if  (par_str == '')  ||
                                    (typeof (par_str) == 'undefined')  ||
                         --.> 判斷空Object {} 
                                if  (typeof (par_str) == 'object') && (Object.keys(par_str).length === 0)
 
                 6> null.toString()  --> Error , rec["MATNR"].toString()  --> Error
                      所以先 rec2str(rec); 將 null 欄位值轉成 ''
                 7> par_str=0 , 則 par_str == '', true,   ---> 需注意 
                      --> 需改成  if (par_str==='') , false --> 正確   
                 8>type of  日期  --> Object 
                     checkisnull(日期)  --> 會傳回 true
                     -->         if ((typeof (par_str) == 'object') && (Object.keys(par_str).length === 0))
                                   return true;
                     --> 所以判斷日期空白,不用 checkisnull , 改用 if  (par_date.length==0)  {}
                    DatetoStr(cnow(),"Y/m/d")  
                    Tmp_DT = DatetoStr(now, "Y/m/d");

                9>設定 HTML欄位屬性  - setFieldsCls
                    setFieldsCls('mySubFormE',
                                           [],  //required
                                            ['sub_DELMAN','sub_TASKNO', 'sub_RQMAN', 'sub_RQDT', 
                                       _RQDEP', 'sub_STLC', 'sub_EDLC', 'sub_TASKREMARK',],//readonly
                                       ['sub_DELCAUSE']);

               10>判斷字串是否為數字: isNaN(Number(par_SAPNO, 10))
                    if (isNaN(Number(par_SAPNO, 10))) {
                          return par_SAPNO;                                           //QDR工單/ICSU工單
                       }
                   else 
                        return par_ORStr + "0000" + par_SAPNO;    //一般工單
              11>string.trim()
                     if (Tmp_C_UNIT.trim() != "")

三.*.js   - null 
      null.toString()  null.length 均會有問題
       所以欄位.toString()  欄位.length 時必需先過濾 欄位值==null 
      
     function DatetoStr(par_date, par_format) {
           if (checkisnull(par_date)) {
              return "";
          }
      }
       
       myfunc.js                              
       nulltoStr(par_Fld) ,

一. c#  *.cs

1>sheet1.Range[myfunc.GetExcelPos(6, i + 1)].Text = 
    Double.Parse(dt.Rows[i]["STDHRS"].ToString("0.00"))
   //另一方法 String.Format("{0:0.00}", Double.Parse(dt.Rows[i]["STDHRS"].ToString()));


if (myfunc.checkisnull(dt.Rows[i]["ALSHR_"].ToString()))
    { sheet1.Range[myfunc.GetExcelPos(7, i + 1)].Text = "0.00"; }
else
    {
      sheet1.Range[myfunc.GetExcelPos(7, i + 1)].Text = 
             Double.Parse(dt.Rows[i]["ALSHR_"].ToString("0.00"));
      //                String.Format("{0:0.00}", Double.Parse(dt.Rows[i]["ALSHR_"].ToString()));
     }


2>格式化日期:
    sheet1.Range[myfunc.GetExcelPos(0, i + 1)].Text =
           DateTime.Parse(dt.Rows[i]["DT"].ToString("yyyy/MM/dd"));
         //另一方法 :String.Format("{0:yyyy/MM/dd}", DateTime.Parse(dt.Rows[i]["DT"].ToString()));


3>格式化時間: 
    Tmp_MKTM = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");

   if (Tmp_dt.Rows[i]["BRDT"].ToString().Length > 0)
       Tmp_BRDT = DateTime.Parse(Tmp_dt.Rows[i]["BRDT"].ToString()).ToString("yyyy/MM/dd");
   else
       Tmp_BRDT = "";

4>NEXT PK: 流水號+1  - string.SubString(pos,length)
     Tmp_NEXT_ASPNO = Tmp_ASPNO + (int.Parse(Tmp_MAX_ASPNO.Substring(11, 3))+1).ToString("000");



二.*.js  - 格式化日期 YYYYMMDD

 1>>*.js   

       Ext.Loader.loadScript({    url: '../Scripts/tlsbase.js'  });  // for  logininfo.id
        np["ASPNO"] = "ASP" + DatetoStr(now, "Ymd");
        var Tmp_cur_DT = DatetoStr(cnow(), "Y/m/d");  
        
        var Tmp_MKER = loginInfo.id;
        var Tmp_MKDT = DatetoStr(now, "Y/m/d");  
        Ext.getCmp("MKER").setValue(Tmp_MKER);
        Ext.getCmp("MKDT").setValue(Tmp_MKDT);

function DatetoStr(par_date,par_format) {
    var Tmp_DateStr;
    if (checkisnull(par_format))
        par_format = 'Y/m/d';  //日期格式    Y/m/d : yyyy/mm/dd   ,       Ymd: yyyymmdd
    Tmp_DateStr = Ext.Date.format(new Date(par_date), par_format);
    return Tmp_DateStr;
}

{ header: "執行時間", dataIndex: "TATM", width: 150, sortable: false, TMType: "date", renderer: Ext.util.Format.dateRenderer('Y/m/d H:i') },


2>Tmp_Str.substring(startpos,endpos)
              .substr(startpos,length)

    string  Tmp_Str="goodboy";
    Tmp_Str=Tmp_Str.substring(0,3);  //  Tmp_Str=good
    Tmp_Str=Tmp_Str.substr(0,2);       //  Tmp_Str=go
  

3>字串轉數字
Number(Tmp_Str);
Number("30");

4>字串是否在長字串中stringObject.indexOf(searchvalue,fromIndex)
     let myStr = "A012";
     myStr.indexOf("[",0); /* -1 沒有找到 */

三. *.cs
1>字串轉數字

int Tmp_cnt=int.Parse(myfunc.SqlValue(Tmp_Sql));

2>trim 字串
var Tmp_Str="ABC  ";
Tmp_Str.Trim();  //--> "ABC"

2>判斷字串是否為數字
public static string get_SAPNO(string par_SAPNO,string par_ORStr="")

 int n;
bool isNum = int.TryParse(par_SAPNO, out n);
 if (isNum)
    return par_SAPNO;
 else 
    return par_ORStr + "0000" + par_SAPNO;

2022年7月29日 星期五

V80C02 - 自訂SQL 取得 CaluField 欄位值

 目的: 自訂SQL 取得 CaluField 欄位值 ,  不用 getKeyCode

 處理說明: 由於 CaluField 欄位不是由單一欄位值取得, CaluField 欄位

                   必需自行組合 SQL , 取得欄位值



1>*.cs 
public dynamic getGridData_M()
{
            
            cmd.CommandText = Tmp_Sql;
            string countSql = " SELECT COUNT(*) as total FROM (" + Tmp_Sql + ")";
            DataSet ds = getDataTable(cmd, countSql);

            //STEP2: ds.Tables["T1"].rows  新增 column欄位值
            //自訂  CaluField 欄位  - [報工工時(ALSHR_)]
            //取得報工工時  -- JCN+DT+EMPLYID+MOSM , 工號+施工日期+ 施工人員+主步序            
            ds.Tables["T1"].Columns.Add("ALSHR_", typeof(object));           //報工工時 ALSHR_
            
            string Tmp_Val = "";  //欄位值 以 ; 分隔
            string Tmp_SAPNO = "",Tmp_DT,Tmp_EMPLYID,Tmp_MOSM;
            string Tmp_ALSHR_;

            foreach(DataRow row in ds.Tables["T1"].Rows)
            {
                Tmp_SAPNO = row["SAPNO"].ToString();
                Tmp_DT = myfunc.DatetoStr(DateTime.Parse(row["DT"].ToString()));
                Tmp_EMPLYID = row["EMPLYID"].ToString();
                Tmp_MOSM = row["MOSM"].ToString();
                //若為一般工單(非 QDR('F') 或  ILIAS工單('V') ), 則 SAP工號+'0000"              \
                if (Tmp_SAPNO.Length > 0)
                {
                    Tmp_SAPNO = myfunc.get_SAPNO(Tmp_SAPNO);                        
                    //自訂 SQL , 取得 CaluField 欄位值 
                    Tmp_Sql = " SELECT  JCN, WORK_ID, round((sum(HOUR_WORK)+sum(HOUR_OT))/60,2)  WCHR  "
                                    + " FROM  "
                                    + "  (  SELECT  JCN, ACT, WC, HOUR_WORK, WORK_ID, HOUR_OT "
                                         + " FROM   HOUR.ALS_HOUR_COMP@ALS_HOUR  "
                                         + " WHERE  JCN = " + myfunc.AA(Tmp_SAPNO)
                                         + " AND       substr(ACT, 1, 1) = " + myfunc.AA(Tmp_MOSM)
                                         + " AND        WORK_ID = " + myfunc.AA(Tmp_EMPLYID)
                                         + " AND        DATA_DATE =" + myfunc.AA(Tmp_DT)
                                         + " UNION  ALL "
                                         + " SELECT  JCN, ACT, WC, HOUR_WORK, WORK_ID, HOUR_OT  "
                                         + "  FROM   HOUR.ALS_HOUR_COMP_HISTORY@ALS_HOUR "
                                         + " WHERE  JCN = " + myfunc.AA(Tmp_SAPNO)
                                         + " AND       substr(ACT, 1, 1) = " + myfunc.AA(Tmp_MOSM)
                                         + " AND        WORK_ID = " + myfunc.AA(Tmp_EMPLYID)
                                         + " AND        DATA_DATE =" + myfunc.AA(Tmp_DT)
                                  + " ) "
                                  + "  GROUP BY  JCN, WORK_ID ";
                    Tmp_Val = myfunc.SqlValue(Tmp_Sql);
                    if (Tmp_Val.Length > 1)
                    {
                        row["ALSHR_"] = myfunc.StrExtract(Tmp_Val, 3);    //報工工時
                    }
                }  // end of   if (Tmp_SAPNO.Length > 0)
            }  // end of  foreach (DataRow row in ds.Tables["T1"].Rows)

            return ds;

}

2022年7月26日 星期二

V120502 - [列印包裝貼紙]鈕 - 1>下載 SS_FILES樣板檔, 2>填寫欄位值, 3>將該檔案傳送至前端

目的: 將資料內容印至標籤印表機

處理說明 : 1>Browser前端無法取得本機的印表機清單, 也無法設定本機印表機的頁面長寬

                   2>將資料寫入 xls檔案, 傳送至本機前端, 由使用者自行選擇標籤印表機後,列印

                       --> 如何將前端store的 3筆資料,送至後端去處理,將這3筆資料填入樣板檔

                   3>將檔案寫入 pdf檔案網頁 , 由使用者按右鍵列印, 仍要選擇印表機





一.自訂 class , 將store 資料變成 JSON字串, 再由 JSON字串轉成 Object,
      -JSON Serialize  & DeSerialize
1>js 將 store 的資料轉成  JSON String  - *.js  
   var Tmp_data_JSON = "";  //將store資料轉成 JSON 的字串
        var Tmp_sub_np = {};
        let Tmp_DataAry = [];
        var Tmp_Str="";
        for (i = 0; i < Tmp_sub_store.getCount(); i++) {
            cur_rec = Tmp_sub_store.getAt(i);
            Tmp_Str = "第" + i.toString() + "筆";
            console.log(Tmp_Str+"cur_rec:", cur_rec);
            Tmp_SAPNO = cur_rec.data['SAPNO'];
            Tmp_PN = cur_rec.data['PN'];
            Tmp_QTY = cur_rec.data['QTY'];
            Tmp_EOCND = cur_rec.data['EOCND'];
            Tmp_RMK = cur_rec.data['RMK'];  
            Tmp_sub_np = {
                SAPNO: Tmp_SAPNO,
                PN: Tmp_PN,
                QTY: Tmp_QTY,
                EOCND: Tmp_EOCND,
                RMK: Tmp_RMK,
            }
            console.log(Tmp_Str + "Tmp_sub_np:", Tmp_sub_np);
            Tmp_DataAry.push(Tmp_sub_np);
        }
        console.log("Tmp_DataAry:", Tmp_DataAry);
        let Tmp_DataString = JSON.stringify(Tmp_DataAry);
        console.log("Tmp_DataString:", Tmp_DataString);

        var np = {};
        np = {
            DataString: Tmp_DataString  //Tmp_DataString:  將目前子畫面的資料轉成 JSON字串
        };        

        Ext.getCmp('mySubForm').submit({
            //Ext.Ajax.request({
            url: '../../api/V120502API/DoPRNLIST',
            method: 'POST',
            async: false,
            standardSubmit: true, // 非 Ajax 的方式  //若要傳送檔案至前端, standardSubmit必需設為 true  
            params: np,
        });


2>c# - 將 np 參數的  JSON 字串, 轉 Object 
       public class DataCls
        {
            public string SAPNO { get; set; }         //SAP工號
            public string PN { get; set; }             //件號
            public int  QTY { get; set; }          //數量
            public string EOCND { get; set; }             //EO+CND
            public string RMK { get; set; }             //備註
        }

   [HttpPost]
        public void DoPRNLIST()
        {
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            // 1>將 SS_FILES.FBOLD 存成 Local檔案
            //取得目前子畫面的欄位值
            string Tmp_DataString = nvc["DataString"];    
List<DataCls> DataObjList = (List<DataCls>) JsonConvert.DeserializeObject(Tmp_DataString, (typeof(List<DataCls>)));

            string Tmp_SAPNO, Tmp_PN, Tmp_EOCND, Tmp_RMK;
            int Tmp_QTY;
            DataCls DataObj;
            for (var i=0;i<DataObjList.Count;i++)
            {
                DataObj = DataObjList[i];
                Tmp_SAPNO=DataObj.SAPNO;
                Tmp_PN = DataObj.PN;
                Tmp_EOCND= DataObj.EOCND;
                Tmp_RMK = DataObj.RMK;
            }



二.利用現有Table class,將 Table 資料(Object)轉成 JSON字串, 再將 JSON字串轉成 Table(Object)
1>js , 將Object資料(Table)轉成   JSON String , 當參數傳至後端
        let Tmp_DataAry1 = [];
        var Tmp_Str="";
        for (i = 0; i < Tmp_sub_store.getCount(); i++) {
            cur_rec = Tmp_sub_store.getAt(i);
            console.log(Tmp_Str + "cur_rec:", cur_rec);
            Tmp_DataAry1.push(cur_rec.data);
       }
        let Tmp_DataString1 = JSON.stringify(Tmp_DataAry1);
        var np = {};
        np = {
        DataString1: Tmp_DataString1  //Tmp_DataString:  將目前子畫面的資料(Table)轉成 JSON字串
        };        

        Ext.getCmp('mySubForm').submit({
            //Ext.Ajax.request({
            url: '../../api/V120502API/DoPRNLIST',
            method: 'POST',
            async: false,
     standardSubmit: true, // 非 Ajax 的方式  //若要傳送檔案至前端, standardSubmit必需設為 true 
            params: np,
        });



2>cs , 將參數(JSON String)轉成 Table(Object) , 讀取 Object 屬性值
//加入JSON格式轉換參考  , JsonConvert.DeserialObject(,)
using Newtonsoft.Json; 


public void DoPRNLIST()
        {
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            //取得目前子畫面的欄位值
string Tmp_DataString1 = nvc["DataString1"];//Tmp_DataString:  將目前子畫面的資料. JSON字串  DataTable DataTable1=(DataTable)JsonConvert.DeserializeObject(Tmp_DataString1, (typeof(DataTable)));

 string Tmp_SAPNO, Tmp_PN, Tmp_EOCND, Tmp_RMK;
            int Tmp_QTY;
            for (var i=0; i<DataTable1.Rows.Count;i++)
            {
                Tmp_SAPNO = DataTable1.Rows[i]["SAPNO"].ToString();
                Tmp_PN = DataTable1.Rows[i]["PN"].ToString();
                Tmp_QTY = int.Parse(DataTable1.Rows[i]["QTY"].ToString());
                Tmp_EOCND = DataTable1.Rows[i]["EOCND"].ToString();
                Tmp_RMK = DataTable1.Rows[i]["RMK"].ToString();
            }




2022年7月21日 星期四

C# 利用 iTextSharp 產生 PDF檔案

使用ASP .NET (C#) 產生PDF檔的好幫手—iTextSharp library (上)

 https://www.cc.ntu.edu.tw/chinese/epaper/0015/20101220_1509.htm

Question: Web程式 – 如何執行[標籤]的印表機列印 - 產生PDF檔的好幫手—iTextSharp

 

目的: 如何在 Web程式,如何執行[標籤]的印表機列印

說明:  1> 目前 Web程式(Browser端) 無法取得 本機印表機清單
           2>   是否可先產生 XLS檔案下載至前端, 再由使用者自行列印

目前問題: 1>網頁安全的條件下已不允許伺服器後端的程式去控制前端印表機,
                    連下載檔案以關聯方式啟動程式的方式都不被允許,
                    除非你能找到夠舊的IE透過ACTIVEX來做這些事,但....應該會被罵吧


處理說明:
    1>標籤大小: 100mm*60mm
        邊界: 上右下左  : 1.5mm*1.5mm*1.5mm*1.5mm 
    2>試著產生 xls 檔,並由使用者開啟 xls 後, 自行列印    


2022年7月20日 星期三

JSON.Parse 和 Ext.decode 的差異說明

 目的: 說明字串2Object 函式  ,  JSON.Parse   和   Ext.decode的差異

說明: 

          1>若為標準的JSON字串(含字串引號) , JSON.Parse Ext.decode均可正常解碼成 Object
               Ex: var Tmp_ObjAryStr = "{ "Key": "ABC" }";  //實際字串:  "{ \"Key\": \"ABC\" }"
          

         2>若為非標準的JSON字串(不含字串引號) , 
                         則Ext.decode可正常解碼成 Object 
                        JSON.Parse無法正常解碼成 Object 
              Ex: var Tmp_ObjAryStr2 = "{Key:  'ABC' }";  



c# 主機傳回 string vs. Http.StringContent vs. HttpResponseMessage 的差異說明 - Ext.Ajax.reuqest(

目的: 1>說明主機端傳回 string vs Http.StringContent vs  HttpResponseMessage 的不同(主機端)

         2>說明主機端傳回 string  vs Http.StringContent vs HttpResponseMessage , 在前端接收的結果

摘要:  

         1>string : 單純的資料型態 , 傳回至前端會含 字串引號("  ")
         2>StringContent 為 Object 含Header,content  , 真正的內容存在 content(以 byte 方式儲存)
         3>HttpStringMessage: 傳回至前端, response.responseText 不會含字串引號


1> *.cs  c# 主機端 *Controller:  

    1>>String Tmp_RtnStr;   //一般的字串



   2>>StringContent Tmp_StringContent  ;    // HTTP  的字串內容, 含 Header 
1) HTTP  的字串內容, 含 Header (說明 charset) , 
2) 真正的內容存在 [content] 屬性


2> *.js  JavaScript 前端 , 接收主機端(String及 Http.StringContent)的傳回結果

Case1: 接收主機傳回 string
     1>>string : 主機端傳回 string
         *.cs
        [HttpPost]        
        public String get_PRNLIST()
        {
                   String Tmp_RtnStr;         
                  Tmp_RtnStr = "{Key:" + myfunc.AA("ABC") + "}";
                 return Tmp_RtnStr
        }
     
   2>>前端接收 [主機端傳回 string]:




var np = {};
        np["CLS"] = Tmp_CLS;
        np["DITM"] = Tmp_DITM;
        var isOk = true;
Ext.Ajax.request({
            method: "POST",
            url: '../../api/V120103API/CHECK_CLS_DITM',
            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"] == false) {
                    var Tmp_Rtn_Msg = "類別(" + Tmp_CLS + ")排序項次(" + Tmp_DITM + ")已存在拆挪管制標準檔(AMM_FRO3F16STD)<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_CLS + ")排序項次(" + Tmp_DITM + ")已存在拆挪管制標準檔(AMM_FRO3F16STD)<br>"
                    + "請檢核<br>"
                    + Tmp_Obj["Rtn_Msg"];
                mywarnalert(Tmp_Rtn_Msg);
                isOk = false;
            }
        })  //end of Ext.Ajax.Request
        return isOk;
    } // end of CheckFormValue





Case2: 接收主機傳回 StringContent

    1>>string : 主機端傳回 StringContent         *.cs
        [HttpPost]        
        public StringContent get_PRNLIST()
        {
                   String Tmp_RtnStr;         
                  Tmp_RtnStr = "{Key:" + myfunc.AA("ABC") + "}";

                  StringContent Tmp_StringContent;
                 Tmp_StringContent = new StringContent(Tmp_RtnStr);
                 return Tmp_StringContent;              
        }

  2>>前端接收 [主機端傳回 StringContent]:   *.js

       console.log("0 response=", response);     
       var Tmp_ObjAryStr1 = response.responseText;
       console.log("1  response.responseText=", response.responseText);            
       var Tmp_Obj_decode1 = Ext.decode(response.responseText);
       console.log("1  Ext.decode(response.responseText)=", Tmp_Obj_decode1);            
       var Tmp_Obj_decode1_1 = Ext.decode(Tmp_Obj_decode1);
       console.log("1  Ext.decode_2(response.responseText)=", Tmp_Obj_decode1_1);            


Case3: 接收主機傳回 HttpResponseMessage

1>>HttpResponseMessage: 主機端傳回 HttpResponseMessage  
        public HttpResponseMessage get_PRNLIST()
      {
            Tmp_RtnStr = "{Key:" + myfunc.AA("ABC") + "}";
            var response = this.Request.CreateResponse();
            response.Content = new StringContent(Tmp_RtnStr);    // 回應內容
            return response;
         }



 console.log("1  response.responseText=", response.responseText);            
            var Tmp_Obj_decode1 = Ext.decode(response.responseText);
            console.log("1  Ext.decode(response.responseText)=", Tmp_Obj_decode1);            
            var Tmp_Obj_decode1_1 = Ext.decode(Tmp_Obj_decode1);
            console.log("1  Ext.decode_2(response.responseText)=", Tmp_Obj_decode1_1);   



V120502 - 加入本機印表機選項 (非主機端的印表機)

 


1>ComboBox 加入本地印表機選項 :
     *.js

{  //挑選印表機
xtype: "fieldcontainer", fieldLabel: "印表機", labelWidth: 60, layout: "hbox", flex: 15,
items: [
{
xtype: "combobox", id: "sub_PRINTER", name: "sub_PRINTER", width:250, padding: "0 4 0 0",
store: store_PRNLIST,
emptyText: "--請選擇--", displayField: "Name", valueField: "Value"
queryMode: "local"                                                  
},
]
},  // end of 挑選印表機

var np = {};
    Ext.Ajax.request({
        method: "POST",
        url: '../../api/V120502API/Get_PRNLIST',
        params: np,
        async: false,
        success: function (response, opts) {            
            console.log("0 response=", response);
            console.log("0 response.responseText=", response.responseText);            
            var Tmp_Obj = Ext.decode(response.responseText);
            //Ext.decode Array of Object  也可解碼 ,  Tmp_Obj : Array [{},{},..]
            var Tmp_Name, Tmp_Value;
            var cur_rec = {};
            for (i = 0; i <Tmp_Obj.length; i++)
    {        
                Tmp_Name = Tmp_Obj[i]["Key"];
                Tmp_Value = Tmp_Obj[i]["Value"];
                cur_rec = { Name: Tmp_Name, Value: Tmp_Value };
                //cur_rec = { Name: Tmp_Obj[i]["Key"], Value: Tmp_Obj[i]["Value"] };
                console.log("6  cur_rec= ", cur_rec);
                store_PRNLIST.add(cur_rec);                        
    }

//不可再  store_PRNLIST.load();  --> 會載入原始的 data , 後來新增item, 不會顯示


2>*.cs  c# 呼叫 get_PRNLIST() 取得 主機端的 印表機選項
 [HttpPost]
public HttpResponseMessage get_PRNLIST()
{
           String Tmp_PRNNM;
            String Tmp_RtnStr = "";
            for (int i = 0; i < PrinterSettings.InstalledPrinters.Count; i++)
            {
                Tmp_PRNNM = PrinterSettings.InstalledPrinters[i];
                PRNLIST.Add(Tmp_PRNNM, i.ToString());
                Tmp_RtnStr = Tmp_RtnStr
                                     + "{Key:" + myfunc.AA(Tmp_PRNNM) + ",Value:" + i.ToString() + "},";
             }        
             if (Tmp_RtnStr.Length > 0)
            {
                Tmp_RtnStr=Tmp_RtnStr.Substring(0, Tmp_RtnStr.Length-1);
                Tmp_RtnStr = "[" + Tmp_RtnStr + "]";
                    };    
            var response = this.Request.CreateResponse();
            response.Content = new StringContent(Tmp_RtnStr);    // 回應內容
            return response;        
}






2022年7月19日 星期二

store , json , 主機取得資料 以 JSON 格式傳回前端

 var store1 = Ext.create('Ext.data.Store', {

        id: 'store1',

        pageSize: 10,

        fields: par_Fields,

        autoLoad: true,

        proxy: {

            type: 'ajax',

            url: '../api/myAPI/SQLOPEN',

            extraParams: np,

            getMethod: function () { return 'POST'; },            

            async: false,

            reader: {                      // reader: The Ext.data.reader.Reader to use to decode the server's response or data read from client. 

                type: 'json',            //The JSON Reader is used by a Proxy to read a server response that is sent back in JSON format

  root: 'T1',              //The name of the property which contains the data items corresponding to the Model(s) for which this Reader is configured. For JSON reader it's a property name (or a dot-separated list of property names if the root is nested).

               totalProperty: 'T1C[0].TOTAL'   //Name of the property from which to retrieve the total number of records in the dataset.

//T1C必需有 TOTAL 欄位   

            }

            }

        }

    })

   

JSON 的完整語法 - JSON函式 - store2JSON

一.JSON stands for JavaScript Object Notation

JSON 的完整語法如下:

JSON = null

    or true or false
    or JSONNumber
    or JSONString
    or JSONObject
    or JSONArray

JSONNumber = - PositiveNumber
          or PositiveNumber
PositiveNumber = DecimalNumber
              or DecimalNumber . Digits
              or DecimalNumber . Digits ExponentPart
              or DecimalNumber ExponentPart
DecimalNumber = 0
             or OneToNine Digits
ExponentPart = e Exponent
            or E Exponent
Exponent = Digits
        or + Digits
        or - Digits
Digits = Digit
      or Digits Digit
Digit = 0 through 9
OneToNine = 1 through 9

JSONString = ""
          or " StringCharacters "
StringCharacters = StringCharacter
                or StringCharacters StringCharacter
StringCharacter = any character
                  except " or \ or U+0000 through U+001F
               or EscapeSequence
EscapeSequence = \" or \/ or \\ or \b or \f or \n or \r or \t
              or \u HexDigit HexDigit HexDigit HexDigit
HexDigit = 0 through 9
        or A through F
        or a through f

JSONObject = { }
          or { Members }
Members = JSONString : JSON
       or Members , JSONString : JSON

JSONArray = [ ]
         or [ ArrayElements ]
ArrayElements = JSON
             or ArrayElements , JSON
二.JSON函式用法
A common use of JSON is to exchange data to/from a web server.
When sending data to a web server, the data has to be a string.
Convert a JavaScript object into a string with JSON.stringify()

Ex:1
const obj = {name: "John", age: 30, city: "New York"};
const myJSON = JSON.stringify(obj)

Ex2: 畫面的 store 轉成 JSON String
function mySub1_OkBtn_click() {                
        //0 > 將目前畫面的store資料, 存成 np(多筆資料) 當參數, 傳給 處理 url
        console.log("0 mySub1_OkBtn_click - 列印包裝標籤.確定");
        var Tmp_sub_store = Ext.getCmp('sub_Grid').store;
        var cur_rec;
        var Tmp_SAPNO, Tmp_PN, Tmp_QTY, Tmp_EOCND, Tmp_RMK;
        var Tmp_data_JSON = "";  //將store資料轉成 JSON 的字串
        var Tmp_sub_np = {};        
        let Tmp_DataAry1 = [];
        var Tmp_Str="";
        for (i = 0; i < Tmp_sub_store.getCount(); i++) {
            cur_rec = Tmp_sub_store.getAt(i);
            console.log(Tmp_Str + "cur_rec:", cur_rec);
            Tmp_DataAry1.push(cur_rec.data);            
        }
        console.log("Tmp_DataAry1:", Tmp_DataAry1);        
        let Tmp_DataString1 = JSON.stringify(Tmp_DataAry1);
        console.log("Tmp_DataString1:", Tmp_DataString1);

        var Tmp_CHKDT = Ext.getCmp("sub_DT").getValue();
        console.log("Tmp_CHKDT:", Tmp_CHKDT);
        var np = {};
        np = {
            DataString1: Tmp_DataString1,  //將子畫面的資料(store)轉成 JSON字串
            CHKDT: Tmp_CHKDT,
        };        

        Ext.getCmp('mySubForm').submit({
            //Ext.Ajax.request({
            url: '../../api/V120502API/DoPRNLIST',
            method: 'POST',
            async: false,
            standardSubmit: true, // 非 Ajax 的方式  //若要傳送檔案至前端, standardSubmit必需設為 true  
            params: np,
        });