On-Demand template 應用程式中的繫結運算式

範本應用程式中的資料繫結可指定來自對應 selection 應用程式的哪些資料用於闡明載入資料到 On-demand 應用程式時發出的查詢。

繫結運算式的基本格式 ($(od_FIELDNAME)) 可以修改,以調整選項並確保範本應用程式正確載入資料。

警告: 最初使用 Qlik Sense 延伸為 On-demand App Generation 建立的範本應用程式應進行修改,以使用下面所示的方法從欄位繫結大量選取項目。

從欄位繫結大量選取項目

Qlik associative engine 限制可在單一 LET 陳述式中串連在一起的值數目。為避免此限制,可使用 INLINE LOAD 陳述式來有效建構逗號分隔的值清單。

首先,必須建立指令碼副程式以處理 INLINE 表格。

SUB BuildValueList(VarName, TableName, ColName, QuoteChrNum) IF $(QuoteChrNum) = 0 THEN LET LOADEXPR = 'Concat($(ColName),' & chr(39) & ',' & chr(39) & ') AS CombinedData'; ELSE LET CHREXPR = ' chr(' & '$(QuoteChrNum)' & ') '; LET LOADEXPR = 'Concat( $(CHREXPR) & $(ColName) & $(CHREXPR)' & ',' & chr(39) & ',' & chr(39) & ') AS CombinedData'; ENDIF _TempTable: LOAD $(LOADEXPR) Resident $(TableName); Let vNoOfRows = NoOfRows('_TempTable'); IF $(vNoOfRows)> 0 THEN LET $(VarName) = Peek('CombinedData',0,'_TempTable'); ENDIF drop table _TempTable; drop table '$(TableName)'; END SUB;
備註: BuildValueList 副程式的呼叫必須為 QuoteChrNum 參數使用特定值。當副程式處理的欄位為數字時,必須將該參數設為 0。對於字元資料,參數必須設定為 39。

然後應使用 INLINE 表格撰寫繫結,以便為將載入的欄位值建立結構 (不管值的數目有多少)。

SET ORIGIN=''; OdagBinding: LOAD * INLINE [ VAL $(odso_ORIGIN){"quote": "", "delimiter": ""} ]; SET ORIGIN_COLNAME='ORIGIN'; CALL BuildValueList('ORIGIN', 'OdagBinding', 'VAL', 39);

$(od_ORIGIN) {"quote": "", "delimiter": "") 運算式將由來自 selection 應用程式的 ORIGIN 欄位值清單取代,這些值以分行符號分隔。如果 ORIGIN 欄位包含三個值 BOSJFKORD,則擴充的 INLINE 表格將如下所示:

SET ORIGIN=''; OdagBinding: LOAD * INLINE [ VAL BOS JFK ORD ]; SET ORIGIN_COLNAME='ORIGIN'; CALL BuildValueList('ORIGIN', 'OdagBinding', 'VAL', 39);

BuildValueList 之呼叫後的 ORIGIN 變數的值將為:

'BOS','JFK’,'JFK'

繫結選用和已排除的值

有時必須在查詢中建立篩選條件,因為 On-demand template app (On-demand 範本應用程式) 的指令碼使用無法在 selection app (選取應用程式) 中直接選取的欄位。例如,銷售記錄可能會使用區域代碼,例如 REGION_CODE,而 selection 應用程式則使用更能夠辨識的 REGION_NAME 欄位,以進行區域選取。Selection 應用程式可採用使用單獨表格將 REGION_CODEREGION_NAME 相關聯的模型,這樣使用者可從 REGION_NAME 選取值來控制選取狀態。

選取 REGION_NAME 的值會導致這些值處於選定狀態,REGION_CODE 的值僅處於可選狀態,即顯示為白色,而不是綠色。此外,如果 selection 應用程式的工作表設計為從其篩選窗格集中排除 REGION_CODE,則無法將 On-demand 應用程式之指令碼中的繫結運算式 $(od_REGION_CODE) 擴充至所選區域清單,因為 REGION_CODE 值實際上永遠不會處於選定狀態,即顯示為綠色。

若要處理此狀況,可以使用其他語法來更精確地控制每個資料繫結中使用的選取狀態值。每個 on-demand 繫結運算式中欄位名稱部分的 od_ 前置詞可以包含字母組合,來指出繫結中要使用的值是否是取自選定狀態和可選狀態的值。有效組合 (使用 REGION_CODE 範例) 包括:

有效組合,使用 REGION_CODE
模式 展開
$(ods_REGION_CODE) REGION_CODE 的選定 (綠色) 值
$(odo_REGION_CODE) REGION_CODE 的可選 (白色) 值
$(odso_REGION_CODE) REGION_CODE 的選定或可選值
$(od_REGION_CODE) (ods_REGION_CODE) 相同,僅 REGION_CODE 的選定 (綠色) 值

在 On-demand 應用程式用於銷售資料範例的情況下,下列資料繫結運算式可確保 REGION_CODE 的選定或可選值包含在 REGION_CODE 繫結中:

$(odso_REGION_CODE)

繫結數值

當要繫結至 On-demand app (On-demand 應用程式) 的資料包含數字而非字串時,停用數值欄位的引號括住行為非常實用。例如,如果銷售記錄包含數值 DAY_OF_WEEK 資料行,且您想要 selection 應用程式的使用者選擇 DAY_OF_WEEK 的任意組合,則您可以增加用於載入 selection 應用程式的彙總查詢,以便將 DAY_OF_WEEK 同時包含在選取清單和組成群組依據清單中。選取 DAY_OF_WEEK 值時,如果其用引號括住,且資料庫不支援自動從字串類型轉換為數值,則會導致執行時間查詢錯誤。

若要處理此狀況,可將語法後置詞新增到繫結運算式的 FIELDNAME 部分的末尾,以強制欄位繫結使用 selection 應用程式中的數值,而不是使用字串值。如下列 WHERE 子句中所示,後置詞為 _n

WHERE DAY_OF_WEEK IN ( $(od_DAY_OF_WEEK_n) );

這將擴充為:

WHERE DAY_OF_WEEK IN ( 1,2 );

需要特定數目的選取項目

在某些情況下,可能必須要求 On-demand 應用程式查詢包含特定欄位的特定數目或範圍的值。例如,如果 On-demand 應用程式的查詢包含 BETWEEN 子句,以便取得開始和結束日期之間的所有銷售,則 YEARQUARTER 欄位的繫結運算式可以採用後置詞語法 [2],這表示將需要針對 YEARQUARTER 正好選取兩個值,亦即:

$(od_YEARQUARTER)[2]

只要不是正好選取兩個 YEARQUARTER 值,selection 應用程式上的 On-demand 應用程式導覽點將保持停用。將顯示一則訊息,指出必須正好選取兩個 YEARQUARTER 值。

選取數量限制可在 selection app (選取應用程式) 和 On-demand app (On-demand 應用程式) 之間建立必要連結。這不同於不使用數量限制式的繫結運算式。例如,template app (範本應用程式) 的指令碼包含沒有數量限制的繫結運算式時,亦即:

$(od_MYFIELD)

不需要 selection 應用程式包含名為 MYFIELD 的欄位,也不需要該欄位有任何選定的值 (如果不存在)。如果 selection 應用程式未包含名為 MYFIELD 的欄位,或者使用者只是忘記做出任何選擇,則當做出其他選擇以滿足記錄限制值條件時,On-demand 應用程式導覽點仍可以變為啟用狀態。

如果是另一種情況,則繫結運算式:

$(od_MYFIELD)[1+]

現在對 selection app (選取應用程式) 設定了兩項需求:

  • Selection 應用程式必須包含名為 MYFIELD 的欄位。
  • 使用者必須針對 MYFIELD 至少選取一個值。

此類型的繫結運算式必須謹慎使用,因為這會限制哪些 selection 應用程式可以搭配範本應用程式使用。您不應在範本應用程式的繫結上使用此數量限制式,除非您確定要強制執行連結至該範本應用程式的所有 selection 應用程式上的選項數量需求。

若要執行資料繫結程序,On-demand 應用程式服務會使用對指令碼中的註解不起作用的字串替代方式。這表示您不應在註解中使用繫結運算式,除非您希望這些註解包含應用程式產生後的繫結值清單。

可以設定其他數量限制。下表概述了不同的選取數量限制組合。

不同的選取數量限制組合
限制模式 選取需求
$(od_YEARQUARTER)[2] 必須選取正好 2 個 YEARQUARTER 值。
$(od_YEARQUARTER)[2-4] 必須選取 2 到 4 個 YEARQUARTER 值。
$(od_YEARQUARTER)[2+] 必須至少選取 2 個 YEARQUARTER 值。
$(od_YEARQUARTER)[2-] 最多可選取 2 個 YEARQUARTER 值。
備註: 檢查可判定應用程式產生程序期間是否已達到範本應用程式中的所有數量限制。若違反了數量限制,產生應用程式的申請將會遭到拒絕,並顯示錯誤訊息。

變更值的引號和分隔符號字元

將 On-demand selection 應用程式中選定欄位中的值清單插入 template 應用程式的指令碼中時,值會以單引號括住並以逗號分隔。這些是引號和分隔符號的預設字元。在附加到每個欄位之繫結陳述式的語法中,這些值可以變更。例如︰

$(odso_ORIGIN){"quote": "|", "delimiter": ";"}

隨後可在制訂從 selection 應用程式取用的繫結值清單時使用這些新的值。例如,若選取的值是該年的前三個月,則清單建構方式如下:

|January|;|February|;|March|

引號和分隔符號的預設值適用於大多數標準 SQL 資料庫。但是,它們可能不適用於某些 SQL 資料庫,且無法用於許多動態資料來源,如 NoSQL 和 REST。針對這些來源,您需要附加此繫結運算式,以變更引號和分隔符號字元。

Bind data containing commas and/or quotation marks

If the data in any of the fields used for bind variables contains commas, you need to change the default behavior of the INLINE load statement to not interpret commas as field separators. 使用格式規格,將分隔符號變更為正在繫結的欄位值中從未發生的字元,如以下例子中伴隨 '|' 所示:

Also, if any of the bound fields contain single quotation marks, you need to add a Replace command to the LOAD statement that will add an extra single quotation mark after each single quotation mark in the value. This prevents the quote characters from being interpreted as the end of the string that is used in the WHERE clause.  Note that database products may use different techniques for escaping single quotation marks.

例如︰

OdagBinding: LOAD Replace(VAL,'''','''''') AS VAL INLINE [ VAL $(odso_ORIGIN){"quote": "", "delimiter": ""} ] (ansi, txt, delimiter is '|', embedded labels);