2023年10月23日 星期一

V120602C - var np = s_JSON('mySubForm',2); - 取得子畫面所有欄位值傳至後端

 目的: V120602C - var np = s_JSON('mySubForm',2);  - 取得子畫面所有欄位(s_xxx)值傳至後端      

處理說明: 1> var np=s_JSON('mySubForm');   --> 只取畫面中, s_開頭的欄位值

                  2> var np=s_JSON('mySubForm',2);-> 取畫面中, 所有欄位值(包含*_ ,Ex s_ACNO_欄位)

var np1 = s_JSON_my('mySubFormA'); //TMFunction.js, 組合form上的查詢條件為json參數傳遞    , type=2, 所有欄位值 , 均傳至後端(不排除_  CaluField)



1>*.js

  var Tmp_Str = "";
                console.log("存檔");
                var Tmp_mySubForm = Ext.getCmp("mySubForm");
                console.log("Tmp_mySubForm:", Tmp_mySubForm);
                //s_JSON : 只取畫面(form_id)中欄位以 s_開頭的欄位值
                var np = s_JSON('mySubForm',2); //取得本子畫面的所有欄位值為np參數傳遞        
                np["sub_QDRNO"] = par_QDRNO;
                var Tmp_url = "../../api/V120602CAPI/UPDATE_AMM_QDR_DNF";
                var rtn = getUrlStr(Tmp_url, np, "存檔");
                if (checkRtnOK(rtn)) {
                    mysuccessalert("存檔完成 !!");





V120602C - DataAdapter - 利用 DataTable(dt1) 更新後端資料庫

 目的: V120602C - DataAdapter -利用 DataTable(dt1) 更新後端資料庫 - DataAdapter - 不透過 SQL

處理說明: 1>利用 Tmp_dt1 來更新資料庫, 不用 INSERT / UPDATE SQL 來更新資料庫
                                   2> 透過   Adapter   來更新後端資料庫    
                              OracleDataAdapter adapter = new OracleDataAdapter(command);
                      3> 由 adapter 取得 Tmp_dt1 的資料
                            adapter.Fill(Tmp_dt1);
                      4> 建立 adapter 相關 Script (Insert/Update/Delete) : OracleCommandBuilder
                           OracleCommandBuilder scb = new OracleCommandBuilder(adapter);   
                      5>將 dt 的資料更新回資料
                           adapter.Update(Tmp_dt1);
                           Tmp_dt1.AcceptChanges(); 
                        

1>*.cs
OracleCommand command = new OracleCommand(Tmp_Sql);
OracleConnection conn = new OracleConnection(DBService.ConnectionString(DBLINK));
command.Connection = conn;
OracleDataAdapter adapter = new OracleDataAdapter(command);
adapter.Fill(Tmp_dt1);
OracleCommandBuilder scb = new OracleCommandBuilder(adapter);
int Tmp_cnt = Tmp_dt1.Rows.Count;
-->
DataRow Tmp_dr = Tmp_dt1.NewRow();
Tmp_dr["QDRNO"] = Tmp_QDRNO;
Tmp_dr["PSAPNO"] = Tmp_PSAPNO;
Tmp_dt1.Rows.Add(Tmp_dr);
adapter.Update(Tmp_dt1);
Tmp_dt1.AcceptChanges();



                    

2023年10月18日 星期三

V120504A - 名牌標籤列印 - SPIRE.XLS -

 目的: V120504A - 名牌標籤列印 - SPIRE.XLS

處理說明: 1>讀取 xls 樣板檔

                  2>填寫 xls 欄位值 

                  3>將 xls 存成檔案, 並download至前端


1>*.js
var cmpA_rdgExp = get_rdogrp_cmp1('rdg_Exp_a', 'rdg_Exp_a', 'rdgExp_a',
              ['(多張)小標籤', '(多張)大標籤', '(單張)小標籤', '(單張)大標籤', '(單張)大標籤+小標籤'],
                                                                        [5, 0], [700], ['標籤', 30],
                                                                        mgT, 50);

    var Panel_Top = new Ext.Panel({
        frame: false, layout: 'hbox', enableTabSrocll: false, labelStyle: "font-size:11pt;",
        items: [ cmpA_SAPNO, cmpA_rdgExp ]
    })

2>*.cs
             string fext = ".xlsx";   // xls 只輸出 200 row
            string fileName = "V120504_小標籤套表";            
            int rdo = Convert.ToInt32(nvc["Rdo"]);
            if (rdo == 1) { fileName = "V120504_大標籤套表"; }
            else if (rdo == 2) { fileName = "V120504_小標籤套表_單張"; }
            else if (rdo == 3) { fileName = "V120504_大標籤套表_單張"; }
            else if (rdo == 4) { fileName = "V120504_小標籤_大標籤_單張";}

                Workbook wk = new Workbook();
                try
                {
                    wk.LoadFromFile(newFileName);
                    //Template樣板檔案 index 可能從1開始
                    Worksheet ws = wk.Worksheets[wk.ActiveSheetIndex];  


2023年10月16日 星期一

AMM.EXE - 建置嘉珍的 Delphi 環境 - 問題排除說明

 目的: AMM.EXE  - 建置嘉珍的 Delphi 環境 - 問題排除說明

處理說明: 1>modrptdl.dcu not found   
                     --> 修改 modrptdl.pas 的Project Source 的目錄 , C:\AIDC\MDP\TLSMDPLib\
                  2>xlsrwii4.bpl 找不到 - 元件 Search 路徑
                      -->  Tools -> Options ->  Library path 
                      --> 加入C:\AIDC\MDP\02_XLSWRITER\Package\DXE2\
                 3> Web改版程式, 由功能選項點選後, 出現錯誤訊息,無 Web畫面
                       --> login.pas &dfm 改成 嘉珍版本的 Login程式


1>    呼叫 Web改版程式 必需先Login , Login畫面必需使用嘉珍.新版程式(2020/07/xx)

è 才可正常執行 Web改版程式, 不然點選Web改版子功能,會有錯誤訊息




2023年10月12日 星期四

Get & Post - 網頁傳遞參數的方式 - 1>編碼 & 解碼處理 2>序列化 & 反序列化

目的: 網頁傳遞參數的方式 - Get & Post -

處理說明:
一.編碼 & 解碼處理
1>在網頁上提交內容時,可以將內容作為參數傳遞透過GET或POST請求方式到後端。
這些有中文或特殊符號的參數(非ASCII碼)會自動進行編碼,以便它們可以在網絡上進行傳輸。
2>中文字符會以UTF8轉成16進制去做編碼,
     若遇特殊情況(&#)就沒額外處理,則導致參數無法正確傳輸或解析
--> 透過params可以將中文和符號進行編碼,
      但是&# (代表Unicode編碼開頭) 的組合是無法進行編碼,會有錯誤

二.序列化  & 反序列化
序列化:將物件狀態轉換為可傳輸格式
反序列化:將資料流轉換成物件



一.編碼 & 解碼處理

[HttpPost]
public string send()
{
     HttpContext c = HttpContext.Current;
     NameValueCollection nvc =                                                        
     c.Request.Form;               
     string english_tf = nvc["english_tf"];
     string chinese_tf = nvc["chinese_tf"];
     string text = english_tf + " ; " + chinese_tf;
     return text;
}

[HttpGet]
public string send()
{
    NameValueCollection nvc = 
    c.Request.QueryString;
    string english_tf = nvc["english_tf"];
    string chinese_tf =nvc["chinese_tf "];
    string text = english_tf + " ; " + chinese_tf;
    return text;
}


解決方法:
    1>前端先編碼,再送至後端(encodeURIComponent)
    2>後端先解碼,再取得原始欄位值(HttpUtility.UrlDecode)



二.序列化  & 反序列化












2023年10月10日 星期二

V120602E – 取得/設定RadioGroup欄位值(Ext.getCmp("sub_PRN").getValue()) 為 Object {sub_PRN: ‘A’} - V20305

目的: V120602E –取得/設定RadioGroup欄位值(Ext.getCmp("sub_PRN").getValue())為Object {sub_PRN: ‘A’} 

處理說明: 1>前端 RadioGroup欄位值(Ext.getCmp("sub_PRN").getValue())為Object

                  2>前端取得 RadioGroup欄位值必需 Object.sub_PRN

                  3>設定 RadioGroup checked
                      Ext.getCmp("s_STAUOCD").items.items[2].setValue(true); 


 1>*.js
        //更新單況   
                    var Tmp_url = "";
                        var np1 = {};
                    np1["sub_PRE_DATE"] = Ext.getCmp("sub_PRE_DATE").getValue();                        
                    np1["sub_PRN"] = (Ext.getCmp("sub_PRN").getValue()).sub_PRN;                        
                    if (np1["sub_PRN"] == 'A')  ////列印 & 儲存目前 QDR現況
                        Tmp_url = '../../api/V120602EAPI/UPDATE_PRN_QDR';
                    else //僅列印
                        Tmp_url = '../../api/V120602EAPI/XlsOut';
                    f_downloadFile('EX_DFile', Tmp_url, np1, 'POST', function () {
                        var r = r_cookies('EX_DFile');
                        if (!checkisnull(r))
                            mysuccessalert(r);
                    });


var cmp_PRN = get_cmp_rdgrp1('列印選項', 'sub_PRN', 80);
    var cmp_PRN1 = get_cmp_rd0('列印並儲存目前QDR現況', 'sub_PRN', 250, 'A');
    var cmp_PRN2 = get_cmp_rd0('僅列印', 'sub_PRN', 250, 'B');
    cmp_PRN.items.push(cmp_PRN1, cmp_PRN2);
    cmp_PRN.flex = 10;
    cmp_PRN1.width = 200;  //避免 radio字折行
    cmp_PRN1.checked = true;

    // [Call_V120602E]鈕  - 子畫面欄位
    var J_formFields_V120602E = [
        {
            bodyStyle: "background-color:transparent;", border: false, layout: { type: 'vbox', align: 'stretch' }, padding: "5",
            items: [cmp_PRE_DATE, 
                          {
                    xtype: 'panel', id: 'sub_panel1', layout: { type: 'vbox', align: 'stretch' }, flex: 20, border: 0,
                              items: [cmp_PRN,],
                },  // end of sub_panel1
                {
                    xtype: 'panel', id: 'sub_panel2', layout: { type: 'vbox', align: 'stretch' }, flex: 10, border: 0,
                    items: [],
                },  // end of sub_panel1
            ],
        }  //end of  J_formFields_Sub1 , items[{
    ]      //end of  J_formFields_Sub1 , items[


Sample: V20305 - 設定 checkboxgroup  為true


 //請料提出   checkboxgroup - STAUOCD
    var cmp_STAUOCD = get_cmp_rdgrp1('請料狀態', 's_STAUOCD', 80);    
    var cmp_STAUOCD1 = get_cmp_rd0('未提出', 's_STAUOCD', 50, 'A');
    var cmp_STAUOCD2 = get_cmp_rd0('已提出', 's_STAUOCD', 50, 'B');
    var cmp_STAUOCD3 = get_cmp_rd0('全部', 's_STAUOCD', 50, 'ALL');
    cmp_STAUOCD1.checked = true;
    cmp_STAUOCD.items.push(cmp_STAUOCD1, cmp_STAUOCD2, cmp_STAUOCD3);
Ext.getCmp("s_STAUOCD").items.items[2].setValue(true);



2>*.cs
 //查詢 - 列印並儲存目前QDR現況
        [HttpPost]
        public void UPDATE_PRN_QDR()
        {
            var c = HttpContext.Current;
            NameValueCollection nvc = c.Request.Form;
            string Tmp_Str;
            string Tmp_PRE_DATE = nvc["sub_PRE_DATE"];
            string Tmp_sub_PRN = nvc["sub_PRN"];
            if (Tmp_sub_PRN == "A")
                Tmp_Str = "列印並儲存目前QDR現況";
            else
                Tmp_Str = "僅列印";