2025年8月10日 星期日

V80203 -[匯出使用物料]鈕 -PK_LIST - myfunc.JSON2dt - 判斷欄位值為 null 時, row[prop.Name] = prop.Value?.ToObject(); --> 會Error -

目的: 將目前所勾選的資料匯出成 xls 檔案

處理說明: 1> JSON2dt
                       DataTable dt1 = myfunc.JSON2dt(Tmp_DataString1);
                   2>prop.Value.Type==JTokenType.Null
                          if (prop.Value.Type == JTokenType.Null)
                              row[prop.Name] = DBNull.Value;
                          else
                               row[prop.Name] = prop.Value?.ToObject<double>();



1>myfunc.cs
 public static DataTable JSON2dt(string par_JSONString)
        {
            // 反序列化 JSON 字符串為 JArray
            try
            {
                JArray jsonArray = JArray.Parse(par_JSONString);
                // 創建 DataTable
                DataTable Tmp_dt = new DataTable();
                // 動態添加欄位
                foreach (JObject obj in jsonArray.Children<JObject>())
                {
                    foreach (JProperty prop in obj.Properties())
                    {
                        if (!Tmp_dt.Columns.Contains(prop.Name))
                        {
                            // 根據值的類型動態設置欄位類型
                            Type columnType = typeof(string); // 默認為 string
                            if (prop.Value.Type == JTokenType.Float || prop.Value.Type == JTokenType.Integer)
                            {
                                columnType = typeof(double);
                            }
                            Tmp_dt.Columns.Add(prop.Name, columnType);
                        }
                    }
                }
                // 將 JSON 數據添加到 DataTable 中
                foreach (JObject obj in jsonArray.Children<JObject>())
                {
                    DataRow row = Tmp_dt.NewRow();
                    foreach (JProperty prop in obj.Properties())
                    {
                        if (Tmp_dt.Columns[prop.Name].DataType == typeof(double))
                        {
                            //2025/08/11 micro edit , 排除 null .ToObject<double> 
                            if (prop.Value.Type == JTokenType.Null)
                                     //if (prop.Value == nulll)
                                    //prop.Value = null;    // prop.Value.ToObject<double>(); --> error
                                    row[prop.Name] = DBNull.Value;
                            else
                                row[prop.Name] = prop.Value?.ToObject<double>();
                        }
                        else
                        {
                            row[prop.Name] = prop.Value?.ToString();
                        }
                    }
                    Tmp_dt.Rows.Add(row);
                }
                //Tmp_dt = (DataTable)JsonConvert.DeserializeObject(par_JSONString, (typeof(DataTable)));
                //// 使用 DataSet 反序列化 JSON 字串 DataSet ds = JsonConvert.DeserializeObject<DataSet>(par_JSONString);
                return Tmp_dt;
            }  // end of try{ }


2>*.js
var Tmp_DataAry = [];
    var isOk = true;
    var np = {};
    var Tmp_Str = "";
    if (CHK_PK_OBJ.PK_LIST.length == 0) {
        mywarnalert("請先選擇要匯出使用物料的AMM單號s");
        return false;
    }
    var cur_rec;
    for (let i = 0; i <= CHK_PK_OBJ.PK_LIST.length - 1; i++) {
        cur_rec = CHK_PK_OBJ.ALL_LIST[i];
        console.log("cur_rec:", cur_rec);
        console.log("CHK_PK_OBJ.ALL_LIST[i]:", CHK_PK_OBJ.ALL_LIST[i]);            
        Tmp_DataAry.push(cur_rec);
    } //  end of for (let i=0,)                
    // 將目前子畫面的資料(Table)轉成 JSON字串
    var Tmp_DataString1 = JSON.stringify(Tmp_DataAry);
    //詢問  "此筆資料來源為 AMM,請問是否將[拆檢交修單號(RPNOAF)]異動為 [AMM單號]?   
    var np = {};
    np["FName"] = "V80203_使用物料明細統計表_檔案格式.xlsx";
    np["DataString1"] = Tmp_DataString1;        
    f_downloadFile('EX_DFile', '../api/V80203AAPI/XlsOut', np, 'POST', function () {
        var r = r_cookies('EX_DFile');
        mysuccessalert(r);
    });

3>*.cs
public void XlsOut()
        {
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            // 1>將 SS_FILES.FBOLD 存成 Local檔案
            //取得目前子畫面的欄位值
            string Tmp_DataString1 = nvc["DataString1"];    //Tmp_DataString:  將目前子畫面的資料. JSON字串   

            //將 table 字串轉成 DataTable
            //DataTable DataTable1 = (DataTable)JsonConvert.DeserializeObject(Tmp_DataString1, (typeof(DataTable)));
            DataTable dt1 = myfunc.JSON2dt(Tmp_DataString1);
            




 

沒有留言:

張貼留言