JS 函式庫

除支援標準的 ECMAScript 外, 我們提供函式庫, 以方便整合我們的框架, 新功能將皆以函式庫為主, 敬請參考。

目前我們 javascript 支援版本 ECMAScript 2016, 此標準的 javascript 可連至此 網站 學習使用。







可以進行變數存取, 可以簡單透過此功能進行資訊的串接或套表, 提供以下的方法使用

別名 global 函式, 有提供 config 別名, 功能相同。


console.info('取得全域變數 CURRENTDATE : ' + global.get('CURRENTDATE'));
console.info('取得全域變數 CURRENTTIME : ' + global.get('CURRENTTIME'));
//使用 {} 套表方式取值(v2.5.02.22後支援), 且不受 javascript 單引號的限制, 還是會被替換
console.info('取得全域變數 CURRENTTIME : {CURRENTTIME}'));
//因使用 ${} 為 javascript 專用的變數功能, 此寫法不會進行套表取值, 會依實際 javscript 變數取值(與 SQLReport 框架無關)
console.info(`取得 javascript 變數值 CURRENTTIME : ${CURRENTTIME}`));


global.set('mykey', 'myvalue');
//注意套表方式須預儲變數才有效, 請勿於執行時間套表 {mykey} 不會被替換
console.log('取得自行設定值(mykey) : '+ global.get('mykey'));


//取得系統 ALLDATA 資料區塊 , 須先使用 [DB][DBNAME][#ALLDATA] SQL方式 取值, 注意變數用單引號指定
console.info('取得 #ALLDATA(getTable) : ' + global.getTable('#ALLDATA')); //注意如無資料回傳 [] 空陣列字串。


//取得系統 ALLDATA 資料區塊 , 須先使用 [DB][DBNAME][#ALLDATA] SQL方式 取值, 注意變數用單引號指定
console.info('取得 #ALLDATA(getTableObject) : ' + JSON.stringify(global.getTableObject('#ALLDATA'))); //注意如無資料回傳空陣列。


//取得區塊變數
var data = JSON.parse(global.getTable('#MYDATA'));
//修改欄位值
data[0].f1 = "TEST";
//設定系統 ALLDATA 資料區塊 ,  注意變數用單引號指定 
global.setTable('#ALLDATA', data);
//資料須符合此格式(陣列記錄), ex : [  {"f1":1,"f2":1},  {"f1":1,"f2":2},  {"f1":1,"f2":3} ]


//移除 ALLDATA 資料區塊
//JS中區塊變數移除後, getTable 就無法再次取回。
global.removeTable('ALLDATA'));

// 取得區塊變數
var data = JSON.parse(global.getTable('#DAYROWDETAIL'));

global.set('MAIL_DAYROWDETAIL', jsonToHtmlTable(["欄位1", "欄位2", "欄位3", "欄位4"], data));

function jsonToHtmlTable(headers, jsonData) {
    // 表格的樣式
    let htmlTable = `
        <table border="1" style="width:1%; border-collapse:collapse;">
            <thead>
                <tr>
    `;

    // 生成表頭欄位
    for (let i = 0; i < headers.length; i++) {
        htmlTable += `<th style="padding:8px; white-space:nowrap; width:1%; text-align:left; border:1px solid #dddddd; background-color:#4CAF50; color:white;">${headers[i]}</th>`;
    }

    // 結束表頭
    htmlTable += '</tr></thead><tbody>';

    // 新增每一列資料
    for (let i = 0; i < jsonData.length; i++) {
        htmlTable += `<tr style="background-color:${i % 2 === 0 ? '#f2f2f2' : 'white'};">`;
        const row = Object.values(jsonData[i]);  // Get the values of the JSON object as an array
        for (let j = 0; j < headers.length; j++) {
            htmlTable += `<td style="padding:8px; white-space:nowrap; width:1%; text-align:left; border:1px solid #dddddd;">${row[j] !== undefined ? row[j] : ''}</td>`;
        }
        htmlTable += '</tr>';
    }

    // 結束表格
    htmlTable += '</tbody></table>';

    return htmlTable;
}

引入 js

別名 require 函式, 有提供 Require 別名(R大寫), 功能相同(使用 VSCode 者, 建議使用小寫, 可讓參考生效)。

require("../../libs/mylib.js");

實作 javascript JSON, 範例與 javascript 相同。




var myobj = { 
  a : '12',  
  b :'345' 
}; 

var myobjstr = JSON.stringify(myobj); 
console.info('JSON.parse 還原物件 : ' + JSON.stringify(JSON.parse(myobjstr)));  


var myobj = { 
  a : '12',  
  b :'345' 
}; 

var myobjstr = JSON.stringify(myobj); console.info('JSON.stringify 回傳值 : ' + myobjstr);

實作 HTTP 存取, 例如利用它進行 Restful API 的功能介接

別名 HttpRequest 函式, 有提供 JSONRequest 別名, 功能相同。

// 使用封装的 HttpRequest (GET Sample), JSON使用時皆用字串進出
var url = 'https://jsonplaceholder.typicode.com/posts/1';

// http header 單元測試
var headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer token123'
};

// 呼叫 HTTP GET Method
HttpRequest(url, 'GET', null, headers, function(response) {
    console.log('Response Title (GET) : ' +  JSON.parse(response).title);
    config.set('Response', response.title);
});

// 使用封装的 HttpRequest 发送 POST 请求, JSON使用時皆用字串進出
var url2 = 'https://jsonplaceholder.typicode.com/posts';
var data = {
    title: 'YourTitle',
    body: 'bar',
    userId: 1
};

// 发送 POST 请求 , 使用 alias name : JSONRequest
JSONRequest(url2, 'POST', data, headers, function(response) {
    sleep(100);
    console.log('POST Sample Response: ' + response);
    console.log('Response Title (POST) : ' +  JSON.parse(response).title);
    // 如有套表會以最後這個結果為主(會複寫上一個結果)
    config.set('Response', JSON.parse(response).title);
});





實作 database 存取功能

別名 db 函式, 有提供 database 別名, 功能相同。

// 支援 SQL 存取 database, 提供.query 及 execute 使用 
var result = database.query('SQLReportDB', 'SELECT * FROM PARAMS_DETAIL WHERE REFCODE=?', ['Common']); 
console.log('DB records: ' + result.data);  
console.log('Count: ' + result.count); 
if(result.count  < 0){ //-1 error 
    console.info('SQL QUERY ERROR'); 
}else if(result.count>0){ 
    var data = JSON.parse(result.data); 
    // use alias name : db 
    // var result2 = db.execute('DB2', 'YOUR UPDATE/DELETE STATEMENT', [data[0].SUBCODE, data[0].OUTWARDNO]); 
    // console.log('Count: ' + result2.count); 
} 
    
//代入區塊 #MYDATA1 變數時, 注意使用單引號, 以免造成 JS 轉碼 
var result1 = database.querydata("SQLReportDB", '#MYDATA1', "SELECT 'MYSQLDATA1'",[]); 
//代入區塊 &MYDATA2 變數時, 注意使用單引號, 以免造成 JS 轉碼 
var result2 = database.querydata("SQLReportDB", '&MYDATA2', 'SELECT MYSQLDATA2'",[]); 

load 可以載入外掛, 你可以自行設定 dll 程式庫進行功能擴充, 並利用此函式即可載入它進行使用。

別名 load 另外提供一個別名 library, 功能相同。



// 呼叫外部程式庫, 先載入利用 load 來載入 DLL , 須指定 Class 及 Methods
var myobj = load('./plugins/DLLSample.dll', 'Operation', ['Merge', 'Merge2']); // alias : library

myobj.Invoke('Merge', ['AB', 'CDE']).then(function(data) {
    console.log('Merge result : ' + data);
    // 呼叫同一個函式庫的方式, 建議使用串連方式, 以免有資源互搶問題(皆為非同步呼叫)
    myobj.Invoke('Merge2', ['AB', 'CDE']).then(function(data) {
        console.log('Merge2 result : ' +  data);
    });
});

上述 DLLSample.dll C# 範例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DLLSample
{
    public class Operation
      {
        //必須是靜態的
        public static string Merge(string x, string y)
        {
          return x + y;
        }
        public static string Merge2(string x, string y)
          {
          return x + y + '2';
        }
      }
}

注意 外掛程式庫必須為靜態(static)函式方能使用。

fs 可以簡單的寫檔及讀檔。

別名 fs 另外提供一個別名 filesystem, 功能相同。


// 檢查目錄是否存在
let result = fs.DirectoryExists('C:/temp/testdir');
if (!result.Success) {
    console.log('檢查目錄存在時出錯: ' + result.ErrorMessage);
} else if (result.Data) {
    console.log('目錄存在');
} else {
    console.log('目錄不存在');
}


// 創建目錄
let result = fs.CreateDirectory('C:/temp/testdir');
if (!result.Success) {
    console.log('創建目錄錯誤: ' + result.ErrorMessage);
} else {
    console.log('目錄創建成功');
}


// 刪除目錄
result = fs.DeleteDirectory('C:/temp/testdir_copy', true);
if (!result.Success) {
    console.log('刪除目錄錯誤: ' + result.ErrorMessage);
} else {
    console.log('目錄刪除成功');
}


// 檢查檔案是否存在
result = fs.FileExists('C:/temp/testdir/test1.txt');
if (!result.Success) {
    console.log('檢查檔案存在時出錯: ' + result.ErrorMessage);
} else if (result.Data) {
    console.log('檔案存在');
} else {
    console.log('檔案不存在');
}


// 創建檔案並寫入內容
result = fs.WriteFile('C:/temp/testdir/test1.txt', 'Hello, World!', 'utf-8');
if (!result.Success) {
    console.log('寫入檔案錯誤: ' + result.ErrorMessage);
} else {
    console.log('檔案寫入成功');
}


// 讀取檔案內容
result = fs.ReadFile('C:/temp/testdir/test1.txt', 'utf-8');
if (!result.Success) {
    console.log('讀取檔案錯誤: ' + result.ErrorMessage);
} else {
    console.log('檔案內容: ' + result.Data);
}


// 移動檔案
result = fs.MoveFile('C:/temp/testdir/test1.txt', 'C:/temp/testdir/test2.txt');
if (!result.Success) {
    console.log('移動檔案錯誤: ' + result.ErrorMessage);
} else {
    console.log('檔案移動成功');
}


// 重新命名檔案
result = fs.RenameFile('C:/temp/testdir/test2.txt', 'test_renamed.txt');
if (!result.Success) {
    console.log('重新命名檔案錯誤: ' + result.ErrorMessage);
} else {
    console.log('檔案重新命名成功');
}


// 刪除檔案
result = fs.DeleteFile('C:/temp/testdir/test_renamed.txt');
if (!result.Success) {
    console.log('刪除檔案錯誤: ' + result.ErrorMessage);
} else {
    console.log('檔案刪除成功');
}         


// 複製檔案
result = fs.CopyFile('C:/temp/testdir/test_renamed.txt', 'C:/temp/testdir/test_copy.txt', true);
if (!result.Success) {
    console.log('複製檔案錯誤: ' + result.ErrorMessage);
} else {
    console.log('檔案複製成功');
}


// 複製目錄
result = fs.CopyDirectory('C:/temp/testdir', 'C:/temp/testdir_copy', true);
if (!result.Success) {
    console.log('複製目錄錯誤: ' + result.ErrorMessage);
} else {
    console.log('目錄複製成功');
}


// 列出目錄中的所有檔案
result = fs.GetFiles('C:/temp');
if (!result.Success) {
    console.log('獲取檔案錯誤: ' + result.ErrorMessage);
} else {
    console.log('目錄中的檔案:');
    result.Data.forEach(file => {
        console.log(file);
    });
}


// 取得目錄中的所有子目錄清單
result = fs.GetDirectories('C:/temp');
if (!result.Success) {
    console.log('取得目錄清單時出錯: ' + result.ErrorMessage);
} else {
    console.log('目錄中的子目錄:');
    result.Data.forEach(dir => {
        console.log(dir);
    });
}


// 讀取檔案內容的每一行
result = fs.ReadFileLines('C:/temp/testdir/test1.txt', 'utf-8');
if (!result.Success) {
    console.log('讀取檔案行錯誤: ' + result.ErrorMessage);
} else {
    console.log('檔案內容行:');
    result.Data.forEach((line, index) => {
        console.log(`行 ${index + 1}: ${line}`);
    });
}


// 追加內容到檔案
result = fs.AppendToFile('C:/temp/testdir/test1.txt', '\nAppended text.', 'utf-8');
if (!result.Success) {
    console.log('追加檔案錯誤: ' + result.ErrorMessage);
} else {
    console.log('檔案追加成功');
}


// 獲取檔案資訊
result = fs.GetFileInfo('C:/temp/testdir/test_copy.txt');
if (!result.Success) {
    console.log('獲取檔案資訊錯誤: ' + result.ErrorMessage);
} else {
    const fileInfo = result.Data;
    console.log('檔案資訊:');
    console.log('檔案名稱: ' + fileInfo.Name);
    console.log('檔案路徑: ' + fileInfo.FullName);
    console.log('檔案大小: ' + fileInfo.Length);
}


// 獲取目錄資訊
result = fs.GetDirectoryInfo('C:/temp');
if (!result.Success) {
    console.log('獲取目錄資訊錯誤: ' + result.ErrorMessage);
} else {
    const dirInfo = result.Data;
    console.log('目錄資訊:');
    console.log('目錄名稱: ' + dirInfo.Name);
    console.log('目錄路徑: ' + dirInfo.FullName);
    console.log('目錄創建時間: ' + dirInfo.CreationTime);
}


// 讀取檔案為位元組陣列
result = fs.ReadFileAsBytes('C:/temp/testdir/test_copy.txt');
if (!result.Success) {
    console.log('讀取檔案為位元組錯誤: ' + result.ErrorMessage);
} else {
    console.log('檔案內容 (位元組): ' + new Uint8Array(result.Data));
}


// 從位元組陣列寫入檔案
const byteData = new Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]); // "Hello World"
result = fs.WriteFileFromBytes('C:/temp/testdir/test_from_bytes.txt', byteData);
if (!result.Success) {
    console.log('寫入位元組檔案錯誤: ' + result.ErrorMessage);
} else {
    console.log('位元組檔案寫入成功');
}

// 創建目錄
let result = fs.CreateDirectory('C:/temp/testdir');
if (!result.Success) {
    console.log('創建目錄錯誤: ' + result.ErrorMessage);
} else {
    console.log('目錄創建成功');
}

// 創建檔案並寫入內容
result = fs.WriteFile('C:/temp/testdir/test1.txt', 'Hello, World!', 'utf-8');
if (!result.Success) {
    console.log('寫入檔案錯誤: ' + result.ErrorMessage);
} else {
    console.log('檔案寫入成功');
}

// 讀取檔案內容
result = fs.ReadFile('C:/temp/testdir/test1.txt', 'utf-8');
if (!result.Success) {
    console.log('讀取檔案錯誤: ' + result.ErrorMessage);
} else {
    console.log('檔案內容: ' + result.Data);
}

// 追加內容到檔案
result = fs.AppendToFile('C:/temp/testdir/test1.txt', '\nAppended text.', 'utf-8');
if (!result.Success) {
    console.log('追加檔案錯誤: ' + result.ErrorMessage);
} else {
    console.log('檔案追加成功');
}

// 讀取檔案內容的每一行
result = fs.ReadFileLines('C:/temp/testdir/test1.txt', 'utf-8');
if (!result.Success) {
    console.log('讀取檔案行錯誤: ' + result.ErrorMessage);
} else {
    console.log('檔案內容行:');
    result.Data.forEach((line, index) => {
        console.log(`行 ${index + 1}: ${line}`);
    });
}

// 移動檔案
result = fs.MoveFile('C:/temp/testdir/test1.txt', 'C:/temp/testdir/test2.txt');
if (!result.Success) {
    console.log('移動檔案錯誤: ' + result.ErrorMessage);
} else {
    console.log('檔案移動成功');
}

// 重新命名檔案
result = fs.RenameFile('C:/temp/testdir/test2.txt', 'test_renamed.txt');
if (!result.Success) {
    console.log('重新命名檔案錯誤: ' + result.ErrorMessage);
} else {
    console.log('檔案重新命名成功');
}

// 複製檔案
result = fs.CopyFile('C:/temp/testdir/test_renamed.txt', 'C:/temp/testdir/test_copy.txt', true);
if (!result.Success) {
    console.log('複製檔案錯誤: ' + result.ErrorMessage);
} else {
    console.log('檔案複製成功');
}

// 刪除檔案
result = fs.DeleteFile('C:/temp/testdir/test_renamed.txt');
if (!result.Success) {
    console.log('刪除檔案錯誤: ' + result.ErrorMessage);
} else {
    console.log('檔案刪除成功');
}

// 列出目錄中的所有檔案
result = fs.GetFiles('C:/temp');
if (!result.Success) {
    console.log('獲取檔案錯誤: ' + result.ErrorMessage);
} else {
    console.log('目錄中的檔案:');
    result.Data.forEach(file => {
        console.log(file);
    });
}

// 複製目錄
result = fs.CopyDirectory('C:/temp/testdir', 'C:/temp/testdir_copy', true);
if (!result.Success) {
    console.log('複製目錄錯誤: ' + result.ErrorMessage);
} else {
    console.log('目錄複製成功');
}

// 刪除目錄
result = fs.DeleteDirectory('C:/temp/testdir_copy', true);
if (!result.Success) {
    console.log('刪除目錄錯誤: ' + result.ErrorMessage);
} else {
    console.log('目錄刪除成功');
}

// 獲取檔案資訊
result = fs.GetFileInfo('C:/temp/testdir/test_copy.txt');
if (!result.Success) {
    console.log('獲取檔案資訊錯誤: ' + result.ErrorMessage);
} else {
    const fileInfo = result.Data;
    console.log('檔案資訊:');
    console.log('檔案名稱: ' + fileInfo.Name);
    console.log('檔案路徑: ' + fileInfo.FullName);
    console.log('檔案大小: ' + fileInfo.Length);
}

// 獲取目錄資訊
result = fs.GetDirectoryInfo('C:/temp');
if (!result.Success) {
    console.log('獲取目錄資訊錯誤: ' + result.ErrorMessage);
} else {
    const dirInfo = result.Data;
    console.log('目錄資訊:');
    console.log('目錄名稱: ' + dirInfo.Name);
    console.log('目錄路徑: ' + dirInfo.FullName);
    console.log('目錄創建時間: ' + dirInfo.CreationTime);
}

// 讀取檔案為位元組陣列
result = fs.ReadFileAsBytes('C:/temp/testdir/test_copy.txt');
if (!result.Success) {
    console.log('讀取檔案為位元組錯誤: ' + result.ErrorMessage);
} else {
    console.log('檔案內容 (位元組): ' + new Uint8Array(result.Data));
}

// 從位元組陣列寫入檔案
const byteData = new Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]); // "Hello World"
result = fs.WriteFileFromBytes('C:/temp/testdir/test_from_bytes.txt', byteData);
if (!result.Success) {
    console.log('寫入位元組檔案錯誤: ' + result.ErrorMessage);
} else {
    console.log('位元組檔案寫入成功');
}

// 取得目錄中的所有子目錄清單
result = fs.GetDirectories('C:/temp');
if (!result.Success) {
    console.log('取得目錄清單時出錯: ' + result.ErrorMessage);
} else {
    console.log('目錄中的子目錄:');
    result.Data.forEach(dir => {
        console.log(dir);
    });
}

// 檢查檔案是否存在
result = fs.FileExists('C:/temp/testdir/test1.txt');
if (!result.Success) {
    console.log('檢查檔案存在時出錯: ' + result.ErrorMessage);
} else if (result.Data) {
    console.log('檔案存在');
} else {
    console.log('檔案不存在');
}

// 檢查目錄是否存在
result = fs.DirectoryExists('C:/temp/testdir');
if (!result.Success) {
    console.log('檢查目錄存在時出錯: ' + result.ErrorMessage);
} else if (result.Data) {
    console.log('目錄存在');
} else {
    console.log('目錄不存在');
}            



可以暫停程式執行(ms)



sleep(500); // 停留 0.5 秒

執行外部命令, 並等待執行結果返回



// 使用 shell 命令,等待執行完畢後輸出結果
var shellResult = shell('echo', ['Hello, World!']);
console.log('Shell result : ' + shellResult);
//Shell result : { output = Hello, World!, error =  }

sftp工具



//free sftp server test site
if(sftp.connect('test.rebex.net', 22, 'demo', 'password')){
    console.info("成功連線");
    console.info(`列出檔案清單 : ${sftp.list('/pub/')}`);
    // 列出檔案清單 : {"success":true,"files":[{"Name":".","FullName":"/pub/.","IsDirectory":true,"Size":0,"LastWriteTime":"2023-03-31T23:52:01+08:00"},{"Name":"..","FullName":"/pub/..","IsDirectory":true,"Size":0,"LastWriteTime":"2023-03-31T23:52:02+08:00"},{"Name":"example","FullName":"/pub/example","IsDirectory":true,"Size":0,"LastWriteTime":"2023-03-31T23:52:02+08:00"}]}
    
    // rebex read only
    // if(sftp.upload('d:\\temp\\index.html', '/pub/index.html', )){
    //     console.info("成功上傳!");
    // }else{
    //     console.info("上傳失敗!");
    // }
    
    if(sftp.download('./readme.txt', 'c:\\temp\\readme.txt', )){
        console.info("成功下載!");
    }else{
        console.info("下載失敗!");
    }
    
    sftp.disconnect();
}else{
    console.info("連線失敗");
}


執行外部命令, 不等待執行結果(程式會繼續執行)



// 使用 system 命令,啟動後不等待執行
system('notepad.exe');
console.log('Notepad started.');

system('cmd.exe', ['/c', 'echo java system test > d:\\temp\\test.txt']);
console.log('Command executed.');

強制中止程式



exit(); // 中止程式

壓縮及解壓縮工具(支援加解密)



 //當報表完成後, 進行動作
report.on('finished', function(report) {
    var detail = JSON.parse(report);
    console.info(detail);

    var zipname = "output.zip"
    var zipfilename =  'D:\\temp\\'+zipname;
    var zippasswd =  null;
    var emailbox =  'yourmailbox@xxx.com.tw';
    var zipSuccess = zip.zipfiles(detail.AttachFiles, zipfilename, zippasswd);
    if (zipSuccess) {
        console.log('壓缩成功');
        var unzipSuccess = zip.unzipfiles(zipfilename, 'D:\\temp\\', zippasswd);
        if (unzipSuccess) {
            console.log('解壓缩成功');
        } else {
            console.log('解壓缩失败');
        }
    } else {
        console.log('壓缩失败');
    }

});

寄信工具



var attachfiles="path";
var success = sendmail(
            'yourmailbox@gmail.com',
            '這是JS 的 sendmail 測試信',
            '支援html的郵件內容' ,
            attachfiles //可用 [attachfiles] 物件陣列, 也可以是JArray (附加檔案)
);

report.on 事件處理



report.on('finished', function(report) {
    console.log(
        'finished data: ' + report
    );
    // report output like:
    // {
    //   "ProjectFolder": "D:\\\\report\\\\js\\",
    //   "ProjectName": "js",
    //   "Mail": [],
    //   "AttachFiles": [],
    //   "EmailFiles": [],
    //   "EmailGroupFiles": [],
    //   "ScriptFiles": [
    //     "D:\\\\report\\\\js\\[DB][SQLReportDB] ][#ALLDATA] 測試資料.SQL",
    //     "D:\\\\report\\\\js\\[JS] b.event.js"
    //   ]
    // }
});