除支援標準的 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';
}
}
}
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"
// ]
// }
});