專刊內文

當前位置:首頁>專刊分享>內文

瀏覽次數 : 2189






iCoder-README (2018-2019)

2019-12(2019-12-20)

* #DE (分隔型日期)除了YYYYMMDD日外,也可以使用 ###日的格式,並會自動判斷是否有民國來決定是否為YYY

* Excel欄位如果沒定義 N參數時,會自動預設為N0

* Word全部使用'#'來做智能辨識時,如果辨識到多個為'#KN'時只會取第一個,已更正。

* Word的常用的電子簽名與日期時間設定#WS#WD,可以簡化使用#W:”來代替,如下:

* Workflow新增一個動態串簽活動組件,與動態會簽活動組件類似,差異的是動態會簽是平行會簽,而動態串簽是垂直的次序簽核;同樣可透過 #CK來選擇多個使用者或角色來簽核流程。如下:

* Word表格中使用# 資料表名稱方式關聯時,通常會被辨識為#R (關聯名稱方式),如果該Word表格中有設定該關聯名稱欄位時,會造成關聯選單與名稱欄位重複顯示的現象。如欄位客戶編號: # 客戶資料表中,如果為#R時輸入客戶編號會顯示客戶名稱,但下一個欄位也是客戶名稱造成欄位重複顯示。所以,iCoder智能辨識時,會判斷因為客戶名稱重複而改用#RV(關聯編號方式)如上例就變成輸入客戶編號顯示也是客戶編號,下一個欄位會自動帶出客戶名稱

* Word讀入後的【欄位設定】中,增加唯讀的設定(Y/N),會從WORD#參數判斷有沒有^R設定自動決定,也可以讀入後在此定義,編程匯出時就會將此欄位設定為ReadOnly,使用者只能在表單中看得到但無法輸入。

* 由於【欄位設定】加入了唯讀的設定,所以EEPCloud中的ReadOnly屬性就更改為隨iCoder改變的屬性(原來 *ReadOnly為二次開發屬性),所以每次iCoder產生EEPCloud RWD頁面時,ReadOnly就會被蓋掉。

* Server端的UpdateComp中,其Detail UpdateCompInsert/Delete/Update命令沒有根據MasterInfoCommand.DataBase來處理,造成如果Master的資料庫名稱有特別設定時,Detail沒有跟著自動改變資料庫名稱。

* Word讀入後的【其他設定】,增加【指定Word套表格式】的設定,可另外上傳一個Word文件,編程匯出的【印表】會自動改用這個Word來套印。

* EEPCloud將提供資料保密功能,可以防止開發者或管理者對於機密資料的洩漏,但需要將保密資料分開到另一個不同的資料庫上(以資料庫密碼來分隔),如下:

1. InfoCommand增加一個RunTimeDataBase,在Runtime時才使用這個資料庫,設計與預覽使用原來的資料庫。

2. 將正常的資料與機密資料分開存放(分成兩個資料庫), 並在EEPCloud的連接密碼設定時,故意設定為空,以保證不會被竊取(無法透過資料庫後端維護竊取數據),如下:

3. Runtime時,刻意讓有權限的使用者在使用機密資料前,另外輸入私密資料庫的密碼即可,如在Client端用一個PromptDialog組件與以下的JS來讓用戶輸入此密碼,然後再去打開有保密的頁面即可:

function setPwd()

{

   $('#PromptDialog1').promptdialog('show', function(row){  //開啟自訂輸入窗口

       $.setVariableValue('databasePwd',row.人資資料庫密碼,true);

   }); 

}

* iCoder'#CK'複選的欄位所產生的Options組件,在其EEPCloudMode屬中,有CheckRadio/Button/Dialog三種外,又增加了一種List,可以比較視覺化的方式來選擇選項內容,如下:

可以用【+】來新增項目(可以一次選多個),每項目有一個【x】可以用來刪除,還可以拖拉方式來調換選中項目的次序。

* iCoder使用ABBYYOCR雲端服務(私有雲如果要使用OCR需另外向ABBYY購買),增加了一個【ABBYY可用次數】來控制雲端服務的費用。

* EXCEL的欄位設定為 #D YYY/MM/DD時,輸出日期格式會不整齊,如: 108/10/1 已改輸出為 108/10/01

* iCoder【流程代理】設定中, 角色與用戶都無法讀取第2頁以後的資料(只能顯示第一頁),已更正。

* Word中的 ##A設定,印表時,其有換行的內容並沒有換行,已經更正。

* WorkFlow的【個人事項】中的欄位參數,如果欄位有設定為"*"開頭者,會自動將" * "去除,方便用戶讀取。

* Word#N數值欄位,如果在DataGrid直接編輯的話,滑鼠的滾輪上下滾動會改變數值內容,已更正。

* EEPCloud中的InfoCommand如果有Group by的話,有時配合SelectPaging資料分頁會有問題,已經更正。

* RWDplace組件定位,經緯度原先是抓到小數第2位,已改成小數第4位。

* Word##P(##2P##3P)套表設定中,圖片沒有印出來,已更正。

* Workflow的通知元件 SendTo 設定為參考角色時無效,已更正。

* Workflow設定了非平行代理人,該非平行代理人登入後,會顯示SQL錯誤,已更正。

 



2019-11(2019-11-27)

* 此版本有重大進展,Word格式中只須讓開發者填入 # ## 即可,不必再學習 # 的欄位類型;Excel格式中同樣只須讓開發者填入 # ## (查詢欄位則填入 #Q)iCoder讀入之後會以人工智能的方式幫你決定各 # ## 的欄位類型,大幅降低開發者的學習成本。當然,原來舊的 # ## 的類型還是可以照原來的規格來使用。

* 使用者主頁中(RunTime),在【查看簽名】中增加一個【上傳】的icon, 讓使用者可以上傳簽名檔案(jpgpng)

* Word支援非制式表格及沒有標題的 # 欄位功能,可以在 # 之後透過 :欄名 及‘@’的終止符號來代表 # 參數的結束。如下例中,合約日期沒有標題所以使用了 :日期 作為欄位名稱,並以 @ 為結尾。

下例中,合約條款中可以插入變數欄位,分別命名為 :教育訓練名額 與 :到場費用等,並可以設定預設值。

* 提供一個新的scanCard()方法,讓你可以透過手機App拍照名片後(一般電腦則可上傳一張名片照片),即可自動辨識名片上的欄位,並透過JS程式回寫到表單中讓使用者確認,如下的範例:

function myScan()

{

    $.scanCard(function(data){

        $('#dfMaster').form('open', {  // 自動打開dataForm並進入Insert狀態

            row: {

                '客戶編號': 0,

                '名稱': data.Company,

                '地址': data.Address,

                '統一編號': data.SerialNumber,

                '聯絡人': data.Name,

                '電話':data.Telephone,

                '電子信箱': data.Email,

                '網站': data.Website,

                '傳真': data.Fax,

                '產品': data.Other

            },

            status: 'inserted',

            keys: ''

        });

    })

}

以上scanCard獲取的data屬性如下:

Name(姓名)

EnglishName(英文姓名)

Title(抬頭)

EnglishTitle(英文抬頭)

Department(部門)

Company(公司名稱)

Email(電子郵件)

Address(地址)

Website(網站)

Telephone(電話)

MobilePhone(手機號碼)

Fax(傳真)

SerialNumber(統一編號)

Other(其他, 如企業標語)

特別注意: 本掃瞄系統使用了第三方 ABBYYOCR,目前只授權在訊光的公有雲中使用,貴客戶如果是使用EEPCloud私有雲者,要另外向ABBYY購買雲端ORC服務才能使用本 scanCard() 功能。

* EEPCloud/Table 打開資料表時, 如果欄位為DateTime類型,資料格式會自動設定為YYYY/MM/DD HH:mm:SS

* EEPCloud/Table的視圖中,可以用右鍵來創建COLDEF資料字典。

* #Z(建檔者)的欄位在DataFormView顯示模式下,如果欄位為空會顯示今天的日期與時間,已更正。

* Refval關聯選單組件中, 如果目前資料表與關聯對方都有建檔者(TypeCreator)或更改者(TypeUpdater)欄位時,目前資料表會被ColumnMatch對應欄位蓋掉,已經更正。

* 更正Word印表時 #E如果有 :CoumnName,會被印出的問題。

* Server端的InfoMail組件提供htmlrow()htmltable()來以HTML表格的方式輸出一筆或多筆資料到eMail內容中。因為EMail發送為非同步的機制, 所以這裡要採用一個 async非同步機制來執行, 可以透過ServerinfoMail這個組件來發送 eMail, 如下的範例, 其中, 可透過InfoMail.htmlrow()以網格形式來輸出欄位內容到Email內容中:

exports.doSendMails = function(param,callback){

    this.echo('do send mail begin');

    var yymm = param.yymm;  // 取得薪資發放月份

    var co = param.co; //取得子公司

    var dm = this;

    var async = this.getModule('async'); // 改用新的方式來引用 async 非同步模組

    this.getComponent('InfoMail1','infomail',function(err,mail){  

        var sql = "SELECT A.薪資年月,A.員工編號,A.部門,A.姓名,A.子公司,A.實發薪資,B.電子郵件 FROM 薪資發放作業 A,員工資料表 B";

        sql = sql + " WHERE A.員工編號=B.員工編號 AND (B.電子郵件 IS NOT NULL AND B.電子郵件<>'') AND A.薪資年月='"+ yymm +"' AND A.子公司='"+ co +"'"; //取得當月員工薪資資料

        dm.queryRaw(dm.clientInfo, dm.clientInfo.database, sql, {},function(err, rows) {

            if(err){

                callback(err);

            }

            else{

                async.eachSeries(rows,function(row,cb){

                    dm.echo(row.電子郵件);

                    var subject = yymm+"月份薪資發放通知";

                    var table1 = mail.HtmlRow(row, [{ field: '薪資年月', title: '薪資年月'},{ field: '員工編號', title: '員工編號'},{ field: '姓名', title: '姓名'},{ field: '子公司', title: '子公司'},{ field: '部門', title: '部門'},{ field: '實發薪資', title: '實發薪資'}]);

                    var param = {'subject':subject,'to':row.電子郵件,'body':table1};

                    mail.Send(param,cb);  // 發送郵件

                },callback);  

            }            

        });

    });

};

* Excel印表時,如果 #NT加總欄位有設定 N1格式但沒有設定加總抬頭時,會把N1給印出來,已更正。

* 為了弭補Word讀入 # 時會有人工智能偏差,可以另外設定例外的KeyWord對照表,優先比對此例外的對照表,找不到再以人工智能方式來決定欄位類型。 例外對照表(ICoder關鍵詞)是可以擴展的,並可由用戶自定義。內容如下:

* Word的明細表除了可以使用 #MD: 來定義明細資料表名稱外,也可以使用 #G: 來設計明細資料表名稱與明細DataGrid的標題。

* EEPCloudTable 預存程序中,增加可以更改 Parameters等傳入傳出參數的功能,之前只有新增才能設定。

* EEPCloud的匯入/匯出功能修正,假如匯出來源為A資料庫,匯入目的為B (兩者有相同的資料表情況下),規則如下:

(1)A有資料,且B沒有該資料表, 會以A的結構與資料導入到B中。

(2)A有資料,且B已經存在有此資料表(不管B有沒有資料),不會導入A的結構與資料給B,如果需要A的結構和資料導入到B的話,需先將B的該資料表刪除,才能導入A的資料表。

(3)A沒有資料(只有結構),且B沒有該資料表,會以A的結構導入到B產生該資料表。

(4)A沒有資料(只有結構),且B已經存在有此資料表(不管B有沒有資料),會以A的結構去導入原來B的資料。

* 使用者的Runtime登入頁面調整,如下:

* RWDDataForm中使用Combobox複選時,新增時會殘留上一條數據的內容,已修正。

 





2019-10(2019-10-18)

* exportWordLoop功能中,如果該Word表頭欄位只須第一頁才要印出,其他頁不印,可以在該欄位後面參數設定 ^F來達到效果;同樣的如果Word的表尾只需最後一頁才要印,其他頁不印者,則設定 ^L 即可。 如 訂單號碼: #KA ^F (第一頁才要印),總計: #N N2 ^L (最後一頁才印出總計值)

* Word增加 #PN,代表PageNumber,專門用來配合 exportWordLoop中的印表頁號,此欄位讀入Word時會被忽略(並非一個欄位),只有在exportWordLoopPdf時,會將頁號填入 #PN之處;頁號如果為單一資料表會從1開始編號,如果是Master/Detail者,更換Master時會每次從1起算。

* 同上,配合之前新提供的 exportWordLoop 套表方案,再提供對應的 exportWordLoopPdf來輸出PDF檔案。

* 使用者執行的RWD主畫面,新提供了【我的最愛】功能,如下圖,可以讓使用者個別保存自己的常用的功能選項。

* 提供新的三階使用介面,三階是指Master(主表)+Detail(明細表),而明細表又對應到另一個明細表(Detail of Detail),構成了一個三階的UI介面。設定方法如下:

1. 必須使用兩個Word的檔案來設計三階介面,第一階使用一個單檔的Word來設計,第二與第三階使用另一個WordMaster/Detail方式來設計(這裡的Master對應到第二階資料表,Detail則對應到第三階資料表)

2. 先讀入第一個Word完成第一階的單檔管理,當然可以新增/更改/刪除,但此頁面並不一定開放給用戶使用。

3. 讀入第二個Word也就是第二三階的Master/Detail,並在Word設定中,其【其他設定】會多一個表格三階的設定,在此可以設定為第一階的資料表與其對應的關鍵欄位,並透過存檔重新產生頁面即可。

4. 這樣的UI結果如下,第一階會在左邊的DataGrid上,可以獨立新增/更改/刪除;第二階為右邊的DataGrid上,會自動與第一階對應上,同樣的也可以獨立新增/更改/刪除,第二階的新增與更改打開DataForm同時也可以編輯第三階的資料。

*之前提供的Openform()獨立打開表單的方法中,增加第三個參數 onClosed方法,可以控制onClose之後所要執行的程式。如下:

function myopen()

{

    $.openForm('開啟表單在交談窗','../bootstrap/客戶資料表3',myclosed);

}

function myclosed()

{

 // your close job

}

* Word#F #P組件增加一個 Filter屬性,可以限定上傳的副檔名, : jpg;png doc;docx;xls;xlsx 等。

*為了配合多數客戶需求,iCoder/EEPCloud的企業版從20個使用者限制,增加到30個使用者;旗艦版也由50個使用者增加到60個使用者,另增加一個無限版代表不限制使用者的數量。

*EEPCloud中,增加了FLComment組件,此組件會自動配合該表單的Workflow自動顯示流程的簽核狀態,包括簽核過程與各個簽核意見等。

*已修正ComboBoxDataGrid中複選時,點開下拉選單後,會影響其他DataGrid的資料內容。

* 更正 Flow "程序元件"(ProcedureActivity)中執行servermethod時,有時會沒有作用的問題。

* 調整手機RWD個人事項版面左右兩側的邊界小一點,好容納更多的版面內容。

* 修正【幫助】/【使用空間狀態】中,Flow模組數計算會多出一倍的問題。

* RWD登入頁面中,增加使用者記住帳號密碼的功能。

*修正後端InfoMail組件發信的方法件,將原來的require()的方法,改寫成this.getModule()的方法,如下:

改為

exports.sendMail = function(param, callback){

//  var async = require('async');// 原來引用 async 非同步模組的寫法

var async = this.getModule('async'); // 改用新的方式來引用 async 非同步模組

this.getComponent('InfoMail1','infomail',function(err,result){

        // 取出infoMail1組件放入result

var tolist = ['andykao@infolight.com.tw'];  //設定 eMail對象的名單

async.eachSeries(tolist,function(to,cb){

        // 依次發送tolist的名單

        var body = "Dear "+to+"<br>";

        body=body="你好這是個郵件測試請不要回復, <br>謝謝你支持 iCoder, 祝你使用愉快!!<br>";  // 設定郵件內容

        var param = {'to':to,'body':body};

        result.Send(param,cb);  // 發送郵件

},callback);

    })

}


2019-09(2019-9-11)


* TimeBox組件在手機操作時無法點選icon選擇時間,已更正。

* Refval開窗選單,增加可以先在輸入框中輸入查詢值再以”Enter”鍵來開窗查詢此條件開頭的選單內容。

* Refval組件增加了AutoQueryColumn=True/False,可讓開窗選單進行全欄位查詢功能。

* DataGridXsBlock=True(小螢幕時會自動改為直排時),如果該DataGrid又沒有編輯DataForm時,編輯版位會沒有欄位標題,已更正。

* Word的欄位中增加 *UID (統一編號),可用來檢查公司的統一編號是否合法。

* Server端的UpdateComp新提供UpdateIfExists屬性(True/False),可以配合前端的importExcel方法從Excel上傳資料來新增,設定UpdateIfExistsTrue時,可以重複導入,沒有重複的資料會以Insert導入,重複的資料會自動以Update的動作進行更新。另前端新增一個importExcelNotApply的方法,與importExcel不同的是,importExcel會直接上傳給後端進行導入,importExcelNotApply則會讓User確認後再另外以submit的方法來存檔。

* Workflow在簽核意見中,開始的第一關的狀態不應該為審核,已更正為上呈才對。

* Word#D/#DT日期格式,可以透過iCoder來統一設定,但如果更改設定,必須重新產生RWD表單(Word無須重新讀入),如下在【工具】/【設定】中設定:



* Word新增 #Z ##Z(建檔者), #U##U(更改者),建檔者包括建檔日期時間,更改者也包括更改日期時間。規則如下 

1. #Z##Z產生表結構時,會產生建檔者建檔日期兩個欄位;#U##U會產生更改者更改日期。如要自定欄位名稱可以透過 Word”:”來定義之,但建檔與更改日期則必須透過【設定】/【系統】來統一設定,如下圖:



2. DataForm中的editor組件增加一個 CreatorUpdaterCreator於新增時自動預設使用者ID與目前時間,Updater於更改時同樣自動抓取使用者ID與目前時間,兩者都是ReadOnly,使用者無法更改。

3. CreatorUpdaterDataGridDataForm顯示都會以複合欄位顯示以節省版位空間。(DataGrid的欄位也會增加CreatorUpdaterFormat格式。

* 新增一個PromptDialog組件,用來打開一個輸入窗口,窗口內可以自由設定變數讓用戶使用所有的查詢元件輸入,通常用在調用前端或後端的JS方法所要輸入的變數窗口,如下例子:

貼入一個PromptDialog組件,設定Columns如下:



year()設定為dateselect,格式為 YYYY

sales(業務員)設定為 refvalRemoteName為員工資料表。

deCost(扣除成本)設定為switch,選項為是/否。

然後利用DataGridToolitems或自行貼入一個Button,執行一個JS來觸發這個PromptDialog,如下:


function exec()

{

   $('#PromptDialog1_sales').refval('setValue',$.getVariableValue('user'));  //設定sales的預設值

    var lastyear=$.getVariableValue('lastdayly');

    $('#PromptDialog1_year').dateselect('setValue',lastyear.substr(0,4));   // 設定年度為去年

    $('#PromptDialog1').promptdialog('show', function(row){  // 開啟輸入窗口

        // 使用 row.變數名稱 取值

        $.callMethod('業績結算','doClose',{sales:row.sales,year:row.year,swt:row.deCost},function(result){ // 執行後端結算方法

            alert('結算成功!');

        });

    });

}


* Word中實現完成印出工作流的所有簽核紀錄,可使用 ##WN##WU##WS##WC##WD(分別代表作業名稱、簽核者、電子簽名、簽核意見、簽核日期),並以表格來呈現,如下的表單實例: