使用自訂 JavaScript 驗證及封鎖分析查詢

您可以使用 JavaScript 開發驗證命令檔,以用於驗證分析條件和資料欄公式,並且封鎖無效的查詢。

封鎖分析中的查詢

使用分析的使用者可以呼叫自訂 JavaScript,驗證分析條件和資料欄公式。驗證能夠讓您在編輯分析時封鎖查詢。自訂 JavaScript 必須可透過 Web 伺服器存取。若要啟用此功能,管理員需在系統設定值中指定 Web 伺服器的 URL,並將該 Web 伺服器註冊為安全網域。

  1. 以 JavaScript 開發您的自訂驗證命令檔,將命令檔儲存在 Web 伺服器中,然後記下指向內含這些自訂命令檔之 JavaScript (*.JS) 檔案的 URL。
    例如,您可以開發封鎖命令檔並將其儲存在 myblocking.js 中,而此 URL 則可能是:http://example.com:8080/mycustomscripts/myblocking.js
  2. 在系統設定值中指定 Web 伺服器的 URL:
    1. 依序按一下主控台系統設定值
    2. 用於封鎖分析查詢的 URL 中,輸入您在步驟 1 記下來的 URL。
  3. 將 Web 伺服器註冊為安全網域:
    1. 依序按一下主控台安全網域
    2. 新增在步驟 2 指定之 URL 中的網域項目。
      例如,新增:example.com:8080
    3. 對於選項,請選取命令檔連線
  4. 測試您的驗證命令檔:
    1. 開啟一個分析。
    2. 使用有效和無效的條件來執行分析。
    3. 驗證查詢是否如預期般被封鎖。

開發 JavaScript 以根據條件封鎖分析

每當使用者嘗試執行分析時,Oracle Analytics 都會呼叫 validateAnalysisCriteria 函數。您可以自訂 validateAnalysisCriteria 以根據自己的特定條件來驗證與封鎖查詢。如果函數傳回 true,則會執行查詢。如果函數傳回 false 或顯示訊息,則會封鎖查詢。

例如,下列簡單的 JavaScript 程式碼名為 myblocking.js

// This is a blocking function. It ensures that users select what 
// the designer wants them to.
function validateAnalysisCriteria(analysisXml)
{
   // Create the helper object
   var tValidator = new CriteriaValidator(analysisXml);
   // Validation Logic
   if (tValidator.getSubjectArea() != "Sample Sales")
      return "Try Sample Sales?";
   if (!tValidator.dependentColumnExists("Markets","Region","Markets","District"))
   {
      // If validation script notifies user, then return false
      alert("Region and District are well suited, do you think?");
      return false;
   }
   if (!tValidator.dependentColumnExists("Sales Measures","","Periods","Year"))
   return "You selected a measure so pick Year!";
   if (!tValidator.filterExists("Sales Measures","Dollars"))
   return "Maybe filter on Dollars?";
   if (!tValidator.dependentFilterExists("Markets","Market","Markets"))
   return "Since you are showing specific Markets, filter the markets.";
   var n = tValidator.filterCount("Markets","Region");
   if ((n <= 0) || (n > 3))
      return "Select 3 or fewer specific Regions";
   return true;
}

如果函數傳回 false 以外的任何結果,則會將條件視為有效並且執行分析。此函數同時會用於驗證預覽與儲存作業的條件。

開發 JavaScript 以根據公式封鎖分析

每當使用者嘗試輸入或修改資料欄公式,Oracle Analytics 就會呼叫 validateAnalysisFormula 函數來驗證該作業。您可以自訂 validateAnalysisFormula,依自己的特定條件驗證和封鎖公式。若函數傳回 true,公式會被接受。若驗證失敗,函數會傳回 false,該公式會被拒絕並顯示您的自訂訊息。

若要顯示訊息並允許使用者繼續,您的函數必須傳回 true。若要封鎖查詢,您的函數必須傳回 false 或顯示訊息。您可以在函數中使用 JavaScript 字串和正規表示式技術來調查和驗證公式。

查詢封鎖函數可使用協助程式函數檢查篩選、資料欄等。請參閱驗證協助程式函數

例如,下列程式碼顯示若使用者輸入不被接受的公式時,要如何封鎖該查詢。

// This is a formula blocking function. It makes sure the user doesn't enter an unacceptable formula.
function validateAnalysisFormula(sFormula, sAggRule)
{
   // don't allow the use of concat || in our formulas
   var concatRe = /\|\|/gi;
   var nConcat = sFormula.search(concatRe);
   if (nConcat >= 0)
      return "You used concatenation (character position " + nConcat + "). That isn't allowed.";
   // no case statements
   var caseRe = /CASE.+END/gi;
   if (sFormula.search(caseRe) >= 0)
      return "Don't use a case statement.";
   // Check for a function syntax: aggrule(formula) aggrule shouldn't contain a '.'
   var castRe = /^\s*\w+\s*\(.+\)\s*$/gi;
   if (sFormula.search(castRe) >= 0)
      return "Don't use a function syntax such as RANK() or SUM().";
    return true;
}

驗證協助程式函數

JavaScript 檔案提供多種驗證協助程式函數供您使用。

驗證協助程式函數 描述

CriteriaValidator.getSubjectArea()

傳回分析參照的主題區域名稱。通常會在執行其他驗證前,將它用於函數內的 switch 敘述句中。若分析為集合式條件,則會傳回 null

CriteriaValidator.tableExists(sTable)

若內容設計人員已將指定的資料夾 (表格) 新增至分析,會傳回 true,若未新增資料夾,則傳回 false

CriteriaValidator.columnExists(sTable, sColumn)

若內容設計人員已將指定的資料欄新增至分析,會傳回 true,若未新增資料欄,則傳回 false

CriteriaValidator.dependentColumnExists(sCheckTable, sCheckColumn, sDependentTable, sDependentColumn)

若有 checkColumn,檢查以確認 dependentColumn 存在。若 checkColumn 不存在,或 checkColumn 及相依資料欄已存在,會傳回 true。若 checkColumndependentColumnnull,則資料夾為已驗證。若有任何來自 checkTable 的資料欄,則必須有來自 dependentTable 的資料欄。

CriteriaValidator.filterExists(sFilterTable, sFilterColumn)

若指定資料欄中有篩選,會傳回 true,若沒有篩選,則傳回 false

CriteriaValidator.dependentFilterExists(sCheckTable, sCheckColumn, sFilterTable, sFilterColumn)

若輸出清單中有 checkColumn,檢查以確認 dependentFilter 確實存在。若 checkColumn 不存在,或 checkColumn 及相依篩選已存在,會傳回 true

CriteriaValidator.filterCount(sFilterTable, sFilterColumn)

傳回對指定邏輯資料欄指定的篩選值數目。若篩選值為 "equals"、"null"、"notNull" 或 "in",則會傳回所選的值數目。若未在篩選使用資料欄,則傳回零。若資料欄未提示預設值,則會傳回 -1。對於所有其他篩選運算子 (例如,"greater than"、"begins with" 等),會傳回 999,因為無法判斷值的數目。