瀏覽次數: 627316

  • 如何取得登入者的userID?
    前端的方法:
    var userid = $.getVariableValue('user'); 

    後端的方法:
    var userid = this.dataModule.clientInfo.user;

    server method內使用的方法:
    var userid = this.clientInfo.user;













  • 如何在執行JS之前讓USER可以輸入TEXTBOX?
    如以下的JS,先透過 $.prompt讓user輸入年月後再往下執行:
    function Test()
    {
    $.prompt( "確認結帳(格式:YYYYMM)?", new Date().Format("yyyyMM"), function(yymm) { 
    doClose(yymm);
     });
    }

    執行後會先出現一個確認窗體,並讓user輸入內容後再往下執行後面的程式。
    new Date().Format("yyyyMM") -> 預設日期為西元年+月份








  • 如何取得主機的系統變數?
    $.getVariableValue(SystemVar)

    變數名稱 內容           
    user         用戶編號   
    userName 用戶名稱   
    groups 用戶群組  
    database 資料庫名稱   
    solution 方案名稱   
    computer IP地址  
    locale 語言別   
    today 今天日期
    todayc8     今天日期(varchar8)  
    now         今天日期時間
    firstday 本月首日
    lastday 本月末日
    firstdaylm  上月首日
    lastdaylm  上月末日
    firstdayty   本年首日
    lastdayty   本年末日
    firstdayly 去年首日
    lastdayly 去年末日

    var userid = $.getVariableValue('user'); //取得目前userid
    var today = $.getVariableValue('today'); //取得系統日期



























  • 前端執行程式前, 如何讓用戶確認再執行?
    加上 $.confirm()的方法即可,如:

    function sureexec(){
    $.confirm( "確認執行?", function() { 
       alert('確認執行!');
      });
    }









  • 如何自訂全局變量, 在前後端都可以存取?
    * ClientInfo提供自定義變數可讓用戶以全局來使用,可以用 $.setVariableValue('userPara1',value); 來設定內容

    用  $.getVariableValue('userPara1'); 來取得內容。如:

    // 前端設值的方法:
    $.setVariableValue('myvar','andy test');

    // 前端讀值的方法:
    var myvar = $.getVariableValue('myvar');

    //後端設值的方法:
    this.dataModule.setClientInfo("myvar",'andy test');

    //如果是後端的取值, 須改用:
    var myvar = this.dataModule.clientInfo.myvar;

    //後端servermethod的設值的方法:
    this.setClientInfo("myvar",'andy test');

    //如果是後端servermethod的取值,須改用:
    var myvar = this.clientInfo.myvar;
















  • 如果日期的欄位Type並非為Date而是Varchar,如何設定預設值為今天?
    請在Default元件中找到DefaultValue,然後將Type選擇為function,Function取名為test(請自行更改function名稱),並在原始碼處寫下以下function即可。

    function test()
    {
        return new Date().Format('yyyyMMdd');
    }









  • 如何動態控制 #O (Options) 停在哪一個選項?
    如下:

    function setType()
    {
        var hour = new Date().getHours();
        if (hour<10) {
            $('#dfMaster_出勤類別').selectoptions('setValue','上班');
        }
        else if (hour>9 && hour<17) {
            $('#dfMaster_出勤類別').selectoptions('setValue','公出');
        }
        else if (hour>16 && hour<21) {
            $('#dfMaster_出勤類別').selectoptions('setValue','下班');
        }
    }









  • 如何在頁面上顯示動態的目前時間?
    可以貼一個 Label, 如下:
    $(function(){
       showtime();
    })

    function showtime()
    {
        var currtime = new Date().Format('yyyy-MM-dd hh:mm:ss');
        $('#Label1').html(currtime);
        setTimeout('showtime()',1000);
    }









  • 如何讓RWD的頁面開放給不用登入的USER來使用?
    只要在EEPCloud的設計模式中, 按下'右鍵', 打開 '免登入URL',
    將其URL儲存到Server中, 並將本頁面對應InfoCommand.Nonlogin設為True即可,
    這樣這個RWD頁面即可開放給沒有login的user來使用。

    (注意: 如果你的RWD頁面有寫JS程式碼, 必須把程式碼用<script></script>包裝好, 
    另外貼入到 Literal.Html 屬性中, 才能讓免登入URL可以調用)










  • Tree樹狀組件, 如何在別的組件中取得目前選中的節點, 並取出該節點的資訊?
    取得Tree的節點方法如下: 

    function getTree()
    {
        var selnode=($('#tvMaster').tree('getSelected'));
        if (selnode != null) 
            return selnode.row.目錄編號;
        else
            return '';
    }











  • 如何動態控制Schedule(行事曆)的顯示條件?
    可以使用Tree的onNodeSelected事件來控制, 如下:

    function tvMaster_onNodeSelected(event, node)
    {
        var gID = node.row.GROUPID;
        var schedule = $('#Schedule1');
        if (gID == '00') {
            schedule.schedule('setWhere',"1=1");
        }
        else  {
            schedule.schedule('setWhere',"部門='"+gID+"'");
        }
    }









  • 為何 ComBoBox 配合 Default的 Variable['user'] 預設使用者時, 有時後會無效?
    因為User Login的user id是可以不分大小寫的, 但到了 ComBoBox ?件是有區分大小寫的, 
    造成預設值匹配不到ComboBox內容而無效, 所以這種情?下請改用 Refval的選擇 User資料, 不要使用Combo。










  • 如何控制打開工作流查詢模式時,指定顯示條件只顯示該申請者的資料?
    可透過 datagrid的onBeforeLoad事件來控制,如下:
    function dgMaster_onBeforeLoad(param)
    {
        var flowParam = $.getEncryptParameters();  //取得流程的MENU參數
        if (flowParam && flowParam.NAVIGATOR_MODE==0) {
            var user = $.getVariableValue('user'); 
            param.whereStr = "申請人 = '" + user + "'";
        }
    }







  • 如何控制Workflow中, 針對某個活動才能更改某欄位內容值?
    可以在 dataForm的onLoad事件中取得活動名稱(ActivityText), 再控制該欄位是否可以編輯, 如下:
    function dfMaster_onLoad(row)
    {
        var flowParam = $.getEncryptParameters();
        if (flowParam && flowParam.ActivityText=='財務審核') {   
          $('#dpgridDetail_核發金額').setDisabled(false); //財務審核時才能更改
        }
    }





  • 如何透過JS跳彈顯示一個包含QRCode的網址, 給使用者掃描或拷貝?
    可透過 alert()的方法, 將一個 URL的網址以QRCode的方式顯示, 如下的JS程式:
    function dfMaster_onApplied(data)
    {
      key = data[0].inserted[0].報名序號;
      // 組出QRCode的url網址
      var url = "http://eepcloud.infolight.com:3000/cloud_andyeip_bootstrap/%E6%B4%BB%E5%8B%95%E5%A0%B1%E5%90%8D?checkin="+key;
      // 顯示報名成功
      var modal = $.alert('報名成功! 報名序號:'+key, 'info', { 
            small: true,
            content: '<div class="qr" style="width:200px;height:200px;background:red;margin:0 auto" />'
        });
      modal.find('.qr').qrcode({ width: 200,height:200,text: url }); //將URL傳入QRCode的Class
    }





  • Drilldown設定的欄位條件通常都是"AND"的條件,如何透過onClick改成"OR"條件?
    透過onClick來處理, 如下:
    function Drilldown1_onClick(row, whereItems)
    {
        whereItems.forEach(function(wi){
            wi.or = true;
        });
        return true;
    }





  • ClientMove的ColumnMatch中, 如何用JS自定SourceField內抓取內容?
    可以改用SourceValue的方式, 設定Function為要調用的JS方法, 如下:
    function getBeginDate(sourceRow)  //sourceRow會自動傳入
    {
        var onBoardDate = sourceRow.到職日期;  //取到職日期
        var beginDate = addDays(new Date(onBoardDate),183);  //加上 半年
        return beginDate;
    }





  • ClientMove整批新增時, 欄位的對應關係(ColumnMatch), 是否可以有條件控制目的欄位的內容?
    可以的, 在ColumnMatch中, 可以設定SourceValue(原來的SourceField會優先, 所以要先清空), 設定SourrceValue的Type為Function, 然後設定Function對應到JS程式即可, 如下在ColumnMatch的"金額"欄位, 設定一個 getAmt()的JS:
    function getAmt(row)
    {
        var amt = row.金額;
        if (row.稅別=="未稅") {
            amt = row.金額*1.05;
        }
        return amt;
    }





  • EEPCloud的用戶表USERS如何自行新增或與從別的Table中整合進來?
    EEPCloud的帳號是放在USERS表中, 可以用一般的SQL來新增資料, 只有PWD這個欄位為一個加密的欄位, 所以必須使用EEPCloud的後端方法來加密, 達到新增帳號的效果, 如下的Server Method為自行新增User的方法:
    exports.addUser = function(param,callback){
        var dm=this;
        var sql="INSERT INTO [USERS] (USERID,USERNAME,PWD,EMAIL,CREATEDATE) VALUES ";
        this.encryptPassword(param.userid, param.password, function(err, newPassword){  // 此為非同步調用
    sql=sql+"('"+param.userid+"',N'"+param.username+"',N'"+newPassword+"',N'"+param.email+"',N'"+param.date+"')";
            dm.query(dm.clientInfo, dm.clientInfo.database,[sql],{}, function(err){
                callback(err);
            });
        });
    }





  • 如何動態改變行事曆TitleField的顏色(當MonthTitle=True時)?
    舉例:將TitleField改成紅色的字,如下:
    先從工具箱拉出一個Literal,並於html中寫下CSS:
    <style>
    .event-Red > a{
    color: Red !important;
    }
    </style>

    再來,在Schedule的OnRenderItem雙擊添加一個事件,
    並寫入內容如下:

    function Schedule1_onRenderItem(event)
    {
      if(event.row.客戶編號 =='001')
    event.class = 'event-info event-Red';
    }









  • 如何動態控制主畫面的選單項目中字的顏色?
    可以在EEPCloud的”網頁”的”主頁程式碼(JS)”中來設定,例如,當選項的標題包含"流程"時,將文字改為紅色,如下:
    var initMenu = true;
    $(function() {
    setInterval(function() {
      if (initMenu) {
       var menuItems = $('#menu').find('.list-group-item');
       if (menuItems.length) {
    initMenu = false;
    menuItems.each(function() {
         var text = $(this).html();
         if (text.indexOf('流程') > 0) { //判斷是否包含此文字流程
          $(this).css('color', 'red'); //設置顏色
         }
        });
       }
      }
     }, 100);
    });





  • 從Menu打開的表單,如何用JS程式來關閉?
    可以用以下的程式關閉:
    self.parent.closeCurrentTab();





  • 為何使用EEPCloud的免登入網頁,用QRCode或網頁上打開是可以的? 但使用一般的網頁用href連結時會失效(導入登入頁面)?
    這是因為href="https://your.com/..." 這個連結傳入EEPCloud會遺失原來 https://your.com 等這個網址內容, 所以必須改用window.open() 的方式來打開這個免入網頁, 如下的案例:

    1. 將href="https://icoder.infolight.com/cloud_andyeip_bootstrap/活動報名?activity=A1910001" 改成
    onclick="open_window('https://icoder.infolight.com/cloud_andyeip_bootstrap/活動報名?activity=A1910001')" 

    2. 在你的網頁上增加一個js方法, 這樣即可做到免登入的打開網頁, 如下:
    function open_window(full_link){
    window.open('javascript:window.name;', '<script>location.replace("'+full_link+'")<\/script>');
     }




  • 如果頁面呈現的比較複雜,導致在手機上執行時畫面呈現重疊錯亂的現象,該如何處理?
    可以在原始碼最上方寫下以下的code,即可處理此問題。
    $.fn.disableIOSWrapper = true;




  • 如何讓頁面使用免登入的功能?
    1.首先,切換到雲設計的畫面,確讓好畫面左上角的資料庫及方案是正確的(因為免登入設定時會自動記錄下當前的資料庫及方案)。
    2.將Server端中會用到該登入頁面的InfoComand的NonLogon屬性設為True並存檔。
    3.然後將要使用免登入的RWD頁面,在設計畫面的空白處點選右鍵->免登入URL->把網址複製下來使用並按下存檔即可。





  • 為何發行免登入的RWD頁面後,打開畫面會出現”Timeout”的錯誤訊息?
    這是因為該畫面server端主檔的infocommand的nonlogon屬性沒有設為true,設定後將Server端重新存檔一次即可。





  • 如何針對某個頁籤添加onClick事件?
    舉例如下:
    可以透過Runtime頁面的查詢元件以右鍵的'檢查'來得知頁籤的href, 再透過如下的JS來添加該頁籤的onclick事件:
    $('[href="#tabMaster_0"]').on('click', function () {
            alert('1');
        });





  • 如何用js指定開啟某一個頁籤?
    舉例如下:
    可以透過Runtime頁面的查詢元件以右鍵的'檢查'來得知頁籤的href, 再透過如下的JS來開啟該頁籤:
    $('[href="#tabMaster_1"]').tab('show');





  • 如何使用別的網站程式對 EEPCloud或iCoder網站進行SSO一次性登入?
    EEPCloud有提供Single-SignOn的機制,因為SSO都是兩個不同的獨立網站且前端JS的安全性有問題,所以SSO的機制都是必須寫在後端的,你可以用PHP、Node.JS、ASP.NET C#或其他語言來寫SSO的機制,以下為Node.JS的一個實例,請參考:
     
    function iCoderSSO(url,callback)
    {
        var http = require('http');  
        var post_data =''; //定義 EEPCloud的 SSO 變數 (JSON格式)
        post_data = JSON.stringify({
            "deisnger": "andyeip", //EEPCloud設計者ID
            "user":"001",   //用戶ID
            "database": "ERPS",   //資料庫
            "solution": "Solution1", //解決方案
            "password": "123",  //密碼
            "url": url    //EEPCloud的轉向位址, "main"是主頁, 如子頁面可以用 "bootstrap/客戶資料表"
        });
        // 以下定義 EEPCloud的 SSO 網站地址
        var post_options = {
            host: '60.248.34.75',
            port: 3000,
            path: '/sso',
            method: 'POST',
            headers: {
                'Content-Type': 'text/html;charset=utf-8',
                'Content-Length': post_data.length
            }
        };
        // 開始向 EEPCloud SSO 請求
        var post_req = http.request(post_options, function(post_res) {
            var _data = '';
            post_res.on('data', function(chunk) {
                _data += chunk;
            });
            post_res.on('end', function() {
               var key = _data;
              //取得 SSO 金鑰
               var sso_url = 'http://60.248.34.75:3000?p=' + encodeURIComponent(key);
              // 傳回前端可以打開 post_data.url 所指定的網頁
               callback(null,sso_url);             
            });
        });
        // 向 EEPCloud 傳送 post_data
        post_req.write(post_data);
        post_req.end();  // 傳送結束 開始讀取回應
    }





  • 如果想透過ToolItem的importexcel方法匯入資料,且該Table的Key欄位是Identity,該如何處理資料?
    Identity欄位及資料不用出現在excel的資料裡,只需要按格式整理其他欄位及資料即可。



  • 請問統計圖組件如何動態給條件, 即時更新?
    如果你是與DataGrid綁定的話, 可以設定 統計圖的 QueryObj屬性即可, QueryObj的名稱為 DataGrid名稱+"queryObj", 如: "dgMasterqueryObj";如果你是想自行以Where條件來控制統計圖, 如下為Line Chart的控制方法:
     $('#LineChart1').linechart('setWhere',"日期>='2020-01-01'")





  • 點選統計圖中的資料, 是否可以打開視窗來顯示明細資料?
    可以的, 透過 onClick()方式來處理, 如下為LineChart取出Click的統計值與X軸的KEY內容, 即可往下開啟表單或做Where條件控制:
    function LineChart1_onClick(ev, si, pi, data)
    {  // ev:對象, si:數組index(從0開始), pi:數據點index(從0開始), data:陣列(數值內容在[1])
        var Xtext = ev.target.textContent;  //取得X軸整個標題
        var myXdata = Xtext.split('Z');  //分隔X軸標題
        var value = data[1]; // 取出統計值
        $.alert(myXdata[pi],'info');  //取得X軸Key內容
    }





  • 如何透過CSS改變看板管理-選單列類型的選單顏色?
    在網頁->共用樣式表編寫CSS
    舉例如下:
    .info-card .bootstrap-menulist li{
       background: #99BBFF;
    }





  • 如何call API?

    舉例如下:
    前端:
    function void_invoice(){
        var sIndex = $("#dgMaster").datagrid("getSelectedIndex");
        if (sIndex >= 0) {
            var status =  $("#dgMaster").datagrid("getRows")[sIndex].狀態;
            var ivono = $("#dgMaster").datagrid("getRows")[sIndex].發票號碼;  
            var cdate = $("#dgMaster").datagrid("getRows")[sIndex].發票日期;
            cdate = cdate.replace(new RegExp("-", "g"), "").substring(0,8);

            if(status!="開立"){
                $.alert('無法呈送','danger');           
            }else{
                $.callMethod('發票資料','void_invoice',{type:1,ivono:ivono,InvoiceDate:cdate},function(result){
                    $.alert(result,'info');
                    var page = $('#dgMaster').datagrid('options').page;
    $('#dgMaster').datagrid('load', { page: page});  
                }); 
            }
      ;   }else {
            $.alert('請選擇一筆發票','info');
        } 
    }

    後端:
    //作廢發票
    exports.void_invoice = function (param, callback) {
        var datamodule = this;
        var https = datamodule.getModule('https');
        var querystring = datamodule.getModule('querystring');
        var Buffer = datamodule.getModule('buffer').Buffer;
        var clientInfo = this.clientInfo;
        var ivono = param.ivono;
        //發票日期
        var InvoiceDate = param.InvoiceDate;
        var csv = '"InvoiceNumber","InvoiceDate"\n"' + ivono + '","' + InvoiceDate + '"\n"Finish"';
        datamodule.echo("csv:" + csv);
        var post_data = querystring.stringify({
            'id': 'XXXXXXXXX',
            'user': ' XXXXXXXXX',
           'passwd': ' XXXXXXXXX',
            'csv': Buffer.from(csv).toString('base64')
        });
        datamodule.echo("post_data:" + post_data);
        const options = {
            hostname: 'api-test.cxn.com.tw',
           port: 443,
            path: '/c0501.php',
            method: 'POST',
           headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                'Content-Length':Buffer.byteLength(post_data)
            }
       }
        const req = https.request(options, (res) => {
            console.log(`statusCode: ${res.statusCode}`)
           res.on('data', (d) => {
               var errmsg = "";
                var result = Buffer.from(d, 'base64').toString().split("&");
                if (result[0] == "rtcode=0000") {
                   //成功取號後,寫入發票號碼
                    var sql = "update 發票資料 set 狀態 ='作廢' where 流水編號 ='" + ivono + "'"; //SQL條件句
                    this.query(clientInfo,clientInfo.database, [sql], {
                       check: true
                   }, function (err, result) {
                        if (err.message == 'no row effect.') {
                           callback(new Error('請再執行一次')); //修改顯示的 錯誤訊息
                       } else if (err) {
                           callback(err);
                       } else {
                           callback(null, "**完成取號**");//這句不會執行
                       }
                    });
                   callback(null, "完成");
               } else {
                    errmsg = Buffer.from(result[1].split("=")[1], 'base64').toString();
                    callback(null,"錯誤訊息A: " + errmsg + "(" + result[0] + ")");
               }
            })
       })
        req.on('error', (error) => {
            callback(null, "錯誤訊息B: " + errmsg);
        })
        req.write(post_data)
        req.end()
    };

  • 行事曆中, 如何控制不同類型不同顏色?
    透過 onRenderItem事件來處理, 如下:
    function scMaster_onRenderItem(event)
    {
        var style='event-info';
        switch (event.row.行事曆類型) 
        {
            case '活動': style='event-important'; break;
            case '會議': style='event-special'; break;
            case '資源預約': style='event-warning'; break;
            case '公出': style='event-success'; break;
            case '其他': style='event-inverse';
        }    
        event.class = style;
    }





  • Chart元件如何以StoreProcedure傳參數的方式產生圖表?
    有兩個方法。
    第一個方法:
    前端透過CallServerMethod方式去後端Call SP,然後再回傳資料給前端,
    前端再將後端傳回的結果轉成json,
    最後透過loadData的方式將資料呈現在Chart上面,  
    舉例如下:  
     
    前端JS:  
    function callSP()   
    {     
        $.prompt( "輸入日期(格式:YYYY-MM-DD)?", new Date().Format("yyyy-MM-dd"), function(yymmdd) {   
            $.callMethod('出貨單','callSP',{date:yymmdd},function(result){   
                var param = $.parseJSON(result); //傳回result為JSON格式  
                if (param.length != 0){  
                    $('#LineChart1').linechart('loadData', param);  
                    //$('#PieChart1').piechart('loadData', param);  
                    //$('#BarChart1').barchart('loadData', param);  
                }  
            });  
        });  
    }  
     
    後端JS:  
     
    exports.callSP = function(param,callback)   
    {  
        var date = param.date; // 取出編號  
        var clientInfo = this.clientInfo;  
        var sql = "exec 出貨單SP '"+date+"'";  
        var dm = this;  
        dm.queryRaw(clientInfo, clientInfo.database, sql, {}, callback);  
    };  
    第二個方法:  
     
    先將DataGrid的RemoteName來源infocommand改為使用SP  
    並且也讓Chart的RemoteName來源也設定為該infocommand  
     
    DataGrid使用SP的方法參考如下:  
    * InfoCommand的CommandType如果為StoredProcedure時,前端的DataGrid查詢條件送回後端時會自動與StoredProcedure配合。如果在InfoCommand的Parameters中所設定的參數與前端DataGrid欄位名稱一致時,前端送過來的查詢條件會自動寫入Parameters的Value中,這樣就可以透過StoredProcedure的Input變數進行資料查詢與回傳結果。如下:  
    1.  設計一個SP,透過MSSQL或是EEPCloud來新增一個SP,並定義好input參數。  
    2.  原來前端的DataGrid需事先連上一個虛擬或實體的Table,結構與SP要傳會的資料一致。在Server端除了原來的InfoCommand對應到這個虛擬或實體的Table外,還要另外貼一個SP的InfoCommand(CommandType為StoredProcedure),CommandText輸入SP的名稱,並填好與SP對應的Parameters參數。  
    3.  前端的DataGrid.RemoteName改成這個SP的InfoCommand即可,這樣User輸入查詢條件就會送往SP這個InfoCommand,InfoCommand因為為SP的Type,所以會自動用欄位對應Parameters參數。




  • Word套表時,可否支援三階的印表?
    如下的報表格式,有主表(A),與明細表(B),及第三階明細表(C):
     
    Word表單設計時,可以將B設為##,將C設為##2,再以二次開發的方式控制##2(C表)為B的第三階明細;印表時可以另外再設計一個Word表格,##明細表的欄位可以完全由##2來取代(當然##2必須包含##所要印出的欄位),如下:
     
    並在印表前先執行後端程序把C的第二筆之後重複的資料清空,如下JS:
    function exportWord2()
    {
       var sIndex = $("#dgMaster").datagrid("getSelectedIndex");
       if (sIndex >= 0) {
           var no = $("#dgMaster").datagrid("getRows")[sIndex].生產編號;
           $.callSyncMethod('生產實施方案','prepare',{no:no}); //清除重複的群組資料
           $(this).datagrid('exportWord','生產實施方案印表');  // 更換格式為"生產實施方案印表.doc"
       }
    }





  • 如何透過js打開別的表單?
    舉例:
    //在瀏覽器開啟一個新網頁(RWD表單)
    window.open('員工資料表');//RWD表單名稱
     
    //在瀏覽器開啟一個新的頁籤(RWD表單)
    window.top.addTab('員工資料表','員工資料表', 'bootstrap/員工資料表');
    // 參數分別代表RWD的: 表單ID,表單標題,表單位置。




  • 用戶Login之後,  是否可以指定打開某個網頁?
    可以透過 後台 '網頁'/'主頁原始碼(JS)'中, 來設定以下的JS即可:
    $(function(){
        window.location.replace('bootstrap/你的表單');   //跳轉到你的RWD表單   
    })
    但如果要打開在主頁之下, 則改用以下的JS:
    $(function(){
        window.top.addTab('你的表單ID','你的表單標題','bootstrap/你的表單');   //打開你的RWD表單
    });




  • 為何有時Default元件為何無效?
    有可能是將Default元件放置到其他DataForm或DataPanel的元件裡面了,
    移出到最外層即可。






  • 如何透過servermethod自動產生流程起單?
    舉例如下:
    前端JS:
    function callflow(){ 
        var rows = $('#dgMaster').datagrid('getRows'); 
        var index = $('#dgMaster').datagrid('getSelectedIndex');
        var row = rows[index];
        $.callMethod('出貨單','callflow',{no:row.出貨編號},function(result){
            alert('執行成功!');
        });

    後端JS:
    //* 後端提供了submitFlow方法來自動產生流程實例,如下:
    //(如果工作流活動中有用到條件運算式的欄位時,該欄位內容必須放資料對象中)
    //也就是說流程中會用到的欄位都要放置到資料對象裡面
    exports.callflow = function(param, callback) {
        this.submitFlow({            //資料對象, 放KEY欄位即可
            出貨編號: param.no,
        }, {
            url: 'http://localhost:3000',      //email ?接
            FlowID: '出貨申請',               //流程名稱
            Remark: '自動起單',               //起單訊息
            WEBFORM_NAME: '出貨單',           //表單名稱
            FORM_KEYS: '出貨編號',            //表單主鍵
            FORM_PRESENTATION:"出貨編號='"+param.no+"'", //表單主鍵內容
            FORM_PRESENTATION_CT: '出貨編號:'+param.no, //表單欄位呈現
            PROVIDER_NAME: '出貨單.出貨單',   //RemoteName名稱
            tabTitle: '出貨單',                     //頁籤名稱
        }, callback);
    };











  • 如何改變私有雲或執行雲網址的port?
    如果希望改變網址的port,可以改變run.bat 或 start.bat裡的內容,如下:
    改變預設的3000port為3001port
     
    內容:
    @echo off
    pushd "%~dp0"
    start redis/3.2.100/redis-server.exe redis/3.2.100/redis.windows.conf
    start cmd /k " set PORT=3001&&node bin/www_cluster"
    start cmd /k node bin/schedule 
    start http://localhost:3001/design




  • 如果重新開機後,run.bat或start.bat開啟後私有雲或執行雲無法正常使用(重新啟動前是正常的),該如何處理?
    因為當前windows登入者為非管理者,因此可以如下處理,
    在run.bat 或 start.bat添加一行,如下:
    pushd "%~dp0"
    這句的目的是更改當前目錄為批處理本身的目錄
     
    舉例:
    @echo off
    pushd "%~dp0"
    start redis/3.2.100/redis-server.exe redis/3.2.100/redis.windows.conf
    start cmd /k " set PUBLISH=true&&node bin/www_cluster"
    start http://localhost:3000/?designer=test&database=ERPS&solution=SOLUTION1




  • 在 Flow 預備模式中,為何已呈送的資料可以修改內容,內容改變後呈送卻會被系統擋住,告知流程已存在?
    當資料尚未呈送或已結案,才可以進行修改或作廢並且重新起單。可以在datagrid的OnUpdate事件,添加程式碼判斷此流程目前的狀態
    參考範例如下:
    function dgMaster_onUpdate(row)
    {
            var flowflag = row.FlowFlag.substring(0,1);
        if (!flowflag || flowflag == 'Z' || flowflag == ‘z’){ 
        //空白表示尚未起單,等於Z或z表示已結案
            return true;}
        else{
            alert('此流程已存在');
            return false;
        }
    }
    FLOWFLAG狀態代表意思如下:
    'N':新流程建立.
    'P':流程過程中.
    'Z':流程結案.
    'X':流程作廢. 
    'B' 流程暫停 




  • 用戶打開主畫面時, 如何讓Menu自動隱藏?
    可以在EEPCloud的 "網頁"/"主頁程式碼JS"中設定以下程式即可:
    $(function() {
        $('#menu').toggleClass('min');
        $('#tab').toggleClass('max');
        $('#favoricon').toggleClass('hide');
    });







  • 當日期欄位類型為varchar8,如何取得當日前七天日期?
    function time(){
        var today = $.getVariableValue('today'); //取得系統今日日期
        var addDate = addDays(today,-20);        //取得前二十天
        var date = addDate.substr(0,10);         //取出年月日
        date = new Date(date).Format('yyyyMMdd');    //轉為varchar8
        return date;
    }




  • 使用後端Infocommand的RuntimeDatabase來設定保密的資料庫時, 前端頁面如何控制資料庫密碼的輸入?
    密碼輸入可以使用 PromptDialog組件來設計, 設定一個欄位即可, Editor設定為password:
         這個表單加入以下JS:
    $(function(){   // 打開表單就執行
       if (! $.getVariableValue('setPwd'))  // 沒設過Pwd的話
        {
            $('#PromptDialog1').promptdialog('show', function(row){     // 開啟輸入窗口
                $.setVariableValue('databasePwd',row.人資資料庫密碼);
                $.callMethod('員工資料表','checkPwd',{pwd:row.人資資料庫密碼},function(result){ // 執行後端檢查方法
                    var param = $.parseJSON(result); //傳回result為JSON格式
                    if (param.length != 0) 
                    { $.alert('密碼正確','info');
                     $.setVariableValue('setPwd',"Yes",true);  // 避免重設  
                     $('#dgMaster').datagrid('options').remoteName = '員工資料表.員工資料表';  // 可以打開保密資料庫的資料表了
                     $('#dgMaster').datagrid('load'); 
                    }
                    else  $.alert('密碼正確','info');
                });
            });  
        }
    })
    function dgMaster_onBeforeLoad(param)
    {
      if (! $.getVariableValue('setPwd')) //尚未輸入過密碼時
        {
            $('#dgMaster').datagrid('options').remoteName = '';  // 避免DataGrid下載資料
            $.loaded($(this).closest('div'));  // 關閉 "下載中…" 訊息
        }
    }
    Server端的保密資料庫的密碼檢查程式, 可以這樣寫:
    exports.checkPwd = function(param,callback){
        var pwd = param.pwd;  // 取得密碼
        var clientInfo = this.clientInfo;
        clientInfo.database='HR'; // 要保密的資料庫
        var sql="select * from 員工資料表 "; // 保密資料庫任一個資料表皆可
        this.queryRaw(clientInfo, clientInfo.database, sql, {databasePwd:pwd}, callback);    
        // 如果密碼正確將傳回資料內容
    };





  • 流程呈送時可以設定傳遞的參數嗎?
    可以在選單中的參數裡進行設定,參考如下:



  • 當HTML頁面要超連結到免登入網址頁面,該如何處理?
    不可以使用<a>標籤 因為免登入網址需要轉址 因此可以改用下列的方式:
     
    onclick="open_new_window
      ("https://icoder.infolight.com/cloud_andyhome_bootstrap/WEBHOME";)"
     
    onclick時另外呼叫open_new_window這個方法開啟網頁:
    function open_new_window(full_link){ 
      window.open('javascript:window.name;', '<script>location.replace("'+full_link+'")<\/script>');
     }