# On-demand 範本應用程式中的繫結運算式

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

繫結運算式的基本格式--$(odag\_FIELDNAME)--不是唯一可用於繫結運算式的方法。其他前置詞可用來調整選項並確保範本應用程式正確載入資料。

## 可用繫結前置詞

一般前置詞格式為 odag[s|o][n][cnt]，其中：

* s - 僅包括所選值
* o - 僅包括可選值
* n - 選取數字版本，依預設沒有引號
* cnt - 插入值的數量，而非實際值

下列表格提供可用繫結前置詞的所有版本清單。範例假定一個名為 MyField 的欄位，其中 1、2、3 作為所選值 (綠色值)，而 4 作為選用值 (白色值)。

繫結前置詞

| 前置詞 | 描述 | 範例 | 取代成 |
| --- | --- | --- | --- |
| odag\_ | 以所選 (綠色) 和可選 (白色) 值取代。選取文字版本的值。 這是字串值的標準前置詞。 | $(odag\_MyField) | '1','2','3','4' |
| odagcnt\_ | 在對應的 odag\_ 繫結中以值的數量取代。 此前置詞用於查詢最佳化。 | $(odagcnt\_MyField) | 4 |
| odagn\_ | 以所選 (綠色) 和可選 (白色) 值取代。選取數字版本的值。 這是數值的標準前置詞。<br><br>資訊備註<br><br>若資料模型可以沒有任何所選或可選的欄位值，則必須在運算式中指定 noValue。例如 `$(odagn_MyField){"noValue":"-99999"}`。<br><br>如需詳細資訊，請參閱[變更值的引號和分隔符號字元](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/bind-expressions-OnDemand-template-app.htm#Changing)。 | $(odagn\_MyField) | 1,2,3,4 |
| odagncnt\_ | 在對應的 odagn\_ 繫結中以值的數量取代。 這用於查詢最佳化。 | $(odagncnt\_MyField) | 4 |
| odago\_ | 以可選 (白色) 值取代。選取文字版本的值。 這用於查詢最佳化。<br><br>[為大型資料庫最佳化](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/bind-expressions-OnDemand-template-app.htm#Optimizi)。 | $(odago\_MyField) | '4' |
| odagocnt\_ | 在對應的 odago\_ 繫結中以值的數量取代。 這用於查詢最佳化。 | $(odagocnt\_MyField) | 1 |
| odagon\_ | 以可選 (白色) 值取代。選取數字版本的值。 這用於查詢最佳化。<br><br>[為大型資料庫最佳化](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/bind-expressions-OnDemand-template-app.htm#Optimizi)。 | $(odagon\_MyField) | 4 |
| odagoncnt\_ | 在對應的 odagon\_ 繫結中以值的數量取代。 這用於查詢最佳化。 | $(odagoncnt\_MyField) | 1 |
| odags\_ | 以所選 (綠色) 值取代。選取文字版本的值。 這用於查詢最佳化。<br><br>[為大型資料庫最佳化](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/bind-expressions-OnDemand-template-app.htm#Optimizi)。 | $(odags\_MyField) | '1','2','3' |
| odagscnt\_ | 在對應的 odags\_ 繫結中以值的數量取代。 這用於查詢最佳化。 | $(odagscnt\_MyField) | 3 |
| odagsn\_ | 以所選 (綠色) 值取代。選取數字版本的值。 這用於查詢最佳化。<br><br>[為大型資料庫最佳化](https://help.qlik.com/zh-TW/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/bind-expressions-OnDemand-template-app.htm#Optimizi)。 | $(odagsn\_MyField) | 1,2,3 |
| odagsncnt\_ | 在對應的 odagsn\_ 繫結中以值的數量取代。 這用於查詢最佳化。 | $(odagsncnt\_MyField) | 3 |

資訊備註

文字版本會篩選掉空的值。數字版本會篩選掉非數字和 NaN 值。

## 為大型資料庫最佳化

odags\_ 和 odagsn\_ 前置詞的用途為查詢最佳化。若繫結欄位中沒有選項，則 odag\_ 包括所有值，而 odags\_ 則不包括任何值。在某些情況下，使用 odags\_ 和 odagscnt\_ 前置詞更有效率。這可讓您測試值的集合是否為空。例如，若在 MyField 中沒有進行任何選取，則比起測試 odag\_MyField 中的所有值，下列方式更有效率。

```
WHERE ($(odagscnt_MyField)=0 OR MyColumn IN ($(odags_MyField)))
```

若在不是 on-demand 欄位的 selection 應用程式中，有要選取的替代欄位，則無法使用 odags\_。例如，若使用者在 CountryName 中進行選取，但繫結運算式位於關聯欄位 CountryCode，則無法使用 odags\_。在這些情況下，可以改用 odago\_。若 odago\_ 繫結中沒有任何值，可以表示應納入所有值，或者不應納入任何值。

## 繫結數值

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

若要處理此情況，可以使用數字版本的繫結運算式後置詞。這迫使欄位繫結使用來自 selection 應用程式的數值，而非字串值。下列數字版本可供使用：

* odagn\_
* odagon\_
* odagsn\_

透過使用數字版本，會從儲存所選值之雙值的數字部分選取值，依照預設，值不會加上引號。

## 需要特定數目的選取項目

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

```
$(odag_YEARQUARTER)[2]
```

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

選取數量限制會在 selection 應用程式與 on-demand 應用程式之間建立必要連結。這與繫結運算式不同，後者並不使用數量限制。例如，當範本應用程式的指令碼包含沒有數量限制的繫結運算式時，亦即：

```
$(odag_MYFIELD)
```

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

如果是另一種情況，則繫結運算式：

$(odag\_MYFIELD)[1+]

現在對 selection 應用程式設定了兩項需求：

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

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

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

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

不同的選取數量限制組合

| 限制模式 | 選取需求 |
| --- | --- |
| $(odag\_YEARQUARTER)[2] | 必須選取正好 2 個 YEARQUARTER 值。 |
| $(odag\_YEARQUARTER)[2-4] | 必須選取 2 到 4 個 YEARQUARTER 值。 |
| $(odag\_YEARQUARTER)[2+] | 必須至少選取 2 個 YEARQUARTER 值。 |
| $(odag\_YEARQUARTER)[2-] | 最多可選取 2 個 YEARQUARTER 值。 |

資訊備註檢查可判定應用程式產生程序期間是否已達到範本應用程式中的所有數量限制。若違反了數量限制，產生應用程式的申請將會遭到拒絕，並顯示錯誤訊息。

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

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

$(odag\_ORIGIN){"quote": "|", "delimiter": ";"}

之後，在設定從 selection 應用程式擷取之繫結值清單的格式時，會使用這些新值。例如，如果選取的值為一年的前三個月，則清單將建構為：

|January|;|February|;|March|

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

下列表格概述用於變更引號和分隔符號字元的格式參數。

格式參數

| 參數 | 預設值 | 定義 |
| --- | --- | --- |
| 引號 | ' (單引號) 用於文字前置詞<br><br>空白用於數字前置詞 | 將新增於每個值之前和之後 |
| 分隔符號 | , (逗號) | 將新增於所有值之間 |
| quoteReplace | '' (雙單引號) | 若值不是空白，且引號不是空白，則值內部出現引號的所有地方將會以指定字串取代。<br><br>資訊備註對於 odagn\_ 等數字前置詞，quoteReplace 作為參數不受支援。quoteReplace 被數字前置詞忽略。 |
| noValue | (空白) | 若沒有對欄位選取任何值，將會改用此值。若選項中可以沒有特定欄位的值，此參數十分實用。<br><br>值應設定為不存在於來源資料的值。例如，對於數值，若資料庫中的所有值都是正值，則使用負值。<br><br>資訊備註 對於沒有引號的值，若欄位的所選值可以是空集合，則必須指定 noValue。 |

下列表格概述 odag\_ 和 odagn\_ 的格式規格和產生的值。產生的插入值是根據 VAL1、VAL2 的預設資料值。

odag\_odag\_ 範例格式規格和產生的值

| 格式規格 | 描述 | 產生的插入值 |
| --- | --- | --- |
| 未指定 | 以逗號分隔的值清單，使用 ' 加上引號。 | 'VAL1','VAL2' |
| {"quote": "", "delimiter": ""} | 串連值 | VAL1VAL2 |
| {"quote": "X", "delimiter": "Y"} | 以 X 加上引號並以 Y 分隔的值。 | XVAL1XYXVAL2X |
| {"quote": "XX", "delimiter": "YY"} | 以 XX 加上引號並以 YY 分隔的值。 | XXVAL1XXYYXXVAL2XX |
| {"quote": "X"} | 以 X 加上引號並以 , (預設) 分隔的值。 | XVAL1X,XVAL2X |
| {"delimiter": "YY"} | 以 ' (預設) 加上引號並以 YY 分隔的值 | 'VAL1'YY'VAL2' |
| {"quote": ""} | 以 , 分隔且沒有引號的值。 | VAL1,VAL2 |
| {"quote": "A", "quoteReplace": "\\A"} | 以 A 加上引號並以逗號 (預設) 分隔的值。將以 \A 取代欄位內部的 A 值。<br><br>資訊備註<br><br>在此範例中，需要使用雙 \，因為 \ 在 json 格式中為逸出字元。 | AV\AL1A,AV\AL2A |

odagn\_odagn\_ 範例格式規格和產生的值

| 格式規格 | 描述 | 產生的插入值 |
| --- | --- | --- |
| 未指定 | 以逗號分隔且沒有引號的值清單。請注意，將會使用數值。 | VAL1,VAL2 |
| {"delimiter": "YY"} | 以 YY 分隔且沒有引號的值 | VAL1YYVAL2 |
| {"quote": "A", "quoteReplace": "\\A"} | 相較於 odag\_ 前置詞，將會忽略 quoteReplace 參數。 | AV\AL1A,AV\AL2A |

## 處理個別值

若需要個別處理欄位值，可以使用內嵌方法，以產生變數 Values 中的值，並透過 Replace 或另一個函數執行任意處理。在以下範例中，Replace 搭配預留位置值使用。

MyTempBindingData: LOAD \* INLINE [VAL $(odag\_MyField){"quote": "", "delimiter": "\n"} ]; \_TempTable: LOAD Concat(chr(39) & Replace(text, from\_str, to\_str) & chr(39), ',') as CombinedData Resident MyTempBindingData; LET Values = Peek('CombinedData',0,'\_TempTable'); drop table \_TempTable; drop table MyTempBindingData;