您可以在巨集中使用下列類型的變數。
如果您將字串指定給 Net.Data 以某種方式 (如 ENVVAR、LIST、條件列示變數) 定義的變數, 變數將不再以定義的方式運作。換言之,變數將變成含有字串的簡單變數。
請參閱 Net.Data 參考手冊,以取得每一變數的語法及範例。
透過類似於 IF THEN 結構的方法,條件式變數可讓您為變數定義一個條件值。 定義條件式變數時,您可以設定兩個可能的變數值。 若所參照的第一個變數存在,則條件式變數會取得第一個值, 否則,條件式變數取得第二個值。 條件變數的語法為:
varA = varB ? "value_1" : "value_2"
若 varB 已定義,則 varA="value_1", 否則為 varA="value_2"。 這與使用 IF 區塊是相同的,如下列範例所示:
%IF ($(varB)) varA = "value_1" %ELSE varA = "value_2" %ENDIF
關於使用條件式變數與列示變數,請參閱列示變數中的範例。
一旦 Web 伺服器使環境變數可供正在執行您 Net.Data 要求的處理或緒使用, 您便可以參照這些環境變數。 當參照 ENVVAR 變數時,Net.Data 會以相同名稱傳回環境變數的現行值。
定義環境變數的語法如下:
%DEFINE var=%ENVVAR
其中 var 是將定義的環境變數的名稱。
例如,變數 SERVER_NAME 可定義為環境變數:
%DEFINE SERVER_NAME=%ENVVAR
然後被參考到:
伺服器是 $(SERVER_NAME)
其輸出結果如下:
伺服器是 www.ibm.com
請參閱 Net.Data 參考手冊,以取得 ENVVAR 陳述式的詳細資訊。
透過執行變數,可讓您從一個變數參照呼叫其它程式。
使用 DEFINE 區塊中的 EXEC 語言結構,在 Net.Data 巨集中定義執行變數。 有關 EXEC 語言元素的詳細資訊, 請參閱 Net.Data 參考手冊中有關語言結構的章節。 在下列範例中,變數 runit 被定義來執行可執行的程式 testProg:
%DEFINE runit=%EXEC "testProg"
runit 變成執行變數。
Net.Data 在 Net.Data 巨集中發現有效變數參照時,會執行可執行程式。 例如,若 Net.Data 巨集中對變數 runit 有一個有效變數參照, 則會執行 testProg 程式。
最簡單的方法是從另一個變數定義中來參照執行變數。 下列範例示範這個方法。變數 date 將定義為可執行的變數, 且 dateRpt 含有可執行變數的參照。
%DEFINE date=%EXEC "date" %DEFINE dateRpt="Today is $(date)"
不論 $(dateRpt) 位於 Net.Data 巨集中的何處, Net.Data 會搜尋可執行程式 date,一旦發現,即傳回:
今天是 Tue 11-07-1999
若 Net.Data 在巨集中發現執行變數,則會使用下列方法來尋找被參考到的可執行程式:
限制:請勿將執行變數設定為其呼叫之可執行程式輸出的值。 在前一個範例中,變數 date 的值是 NULL (空值)。 若您在 DTW_ASSIGN 函數呼叫中使用此變數,來指定其值給另一個變數, 則指定後新變數的值也會是 NULL (空值)。執行變數的唯一目的,是呼叫其定義的程式。
您也可以藉由在變數定義中指定參數及程式名稱,然後將參數傳給要執行的程式。 在本範例中,distance 和 time 的值被傳遞給程式 calcMPH。
%DEFINE mph=%EXEC "calcMPH $(distance) $(time)"
下一範例會傳回系統日期作為報表的一部份:
%DEFINE database="celdial" %DEFINE tstamp=%EXEC "date" %FUNCTION(DTW_SQL) myQuery() { SELECT CUSTNO, CUSTNAME from dist1.customer %REPORT{ %ROW{ <a href="/cgi-bin/db2www/exmp.d2w/report?value1=$(V1)&value2=$(V2)"> $(V1) $(V2) </a> <br /> %} %} %} %HTML(report){ <h1>Report made: $(tstamp) </h1> @myQuery() %}
每一個報表都有日期,以便於追蹤。本範例中, 亦會替另一個 Net.Data 巨集,在鏈結中加入客戶號碼和名稱。 在報表中按一下任何客戶,即呼叫 exmp.d2w Net.Data 巨集, 並將編號和名稱傳給 Net.Data 巨集。
您可以使用隱藏變數,來隱藏變數的實際名稱, 讓使用 Web 瀏覽器來顯示網頁原始碼的應用程式使用者無法看見。若要定義隱藏變數:
%HTML(INPUT) { <form ...> <p>Select fields to view: shanghai<select name="field"> <option value="$$(name)"> Name <option value="$$(addr)"> Address ... </form> %} %DEFINE { name="customer.name" addr="customer.address" %} %FUNCTION(DTW_SQL) mySelect(){ SELECT $(Field) FROM customer %} ...
當 Web 瀏覽器顯示 HTML 套表時, $$(name) 和 $$(addr) 會分別置換成 $(name) 和 $(addr), 因此,實際的表格和直欄名稱永遠不會出現在 HTML 套表上。 應用程式使用者無從得知真正變數名稱已隱藏。 當使用者提出該套表時,會呼叫 HTML(REPORT) 區塊。 當 @mySelect() 呼叫 FUNCTION 區塊時, SQL 陳述式中的 $(Field), 會置換成 SQL 查詢中的 customer.name 或 customer.addr。
使用列示變數可讓您建置一串以分隔符號區隔的值。 這特別有助於您建立多項目的 SQL 查詢 (例如,常見於某些 WHERE 或 HAVING 子句中)。 列示變數語法如下:
%LIST " value_separator " variable_name
建議值:空白是有意義的。在大部份的情況下, 請在值分隔字元的前後各插入一個空格。 大部份的查詢在值區隔符號上, 會使用布林或算術運算子 (例如,AND、OR 或 >)。 下列範例舉例說明如何使用條件、隱藏、以及列示變數:
%HTML(INPUT) { <form method="post" action="/cgi-bin/db2www/example2.d2w/report"> <h2>Select one or more cities:</h2> <input type="checkbox" name="conditions" value="$$(cond1)" />Sao Paolo<br /> <input type="checkbox" name="conditions" value="$$(cond2)" />Seattle<br /> <input type="checkbox" name="conditions" value="$$(cond3)" />Shanghai<br /> <input type="submit" value="submit query" /> </form> %} %DEFINE{ DATABASE="custcity" %LIST " OR " conditions cond1="cond1='Sao Paolo'" cond2="cond2='Seattle'" cond3="cond3='Shanghai'" whereClause= ? "WHERE $(conditions)" %} %FUNCTION(DTW_SQL) mySelect(){ SELECT name, city FROM citylist $(whereClause) %} %HTML(REPORT){ @mySelect() %}
在 HTML 套表中,若未勾選出任何勾選框,則 conditions 為 NULL (空值), 因此查詢中的 whereClause 亦為 NULL (空值)。否則, whereClause 有 OR 所分隔的選取值。 例如,若三個都市皆選取,則 SQL 查詢如下:
SELECT name, city FROM citylist WHERE cond1='Sao Paolo' OR cond2='Seattle' OR cond3='Shanghai'
本範例顯示選取了 Seattle,其產生的 SQL 查詢如下:
SELECT name, city FROM citylist WHERE cond1='Seattle'
表格變數可以定義一套相關資料。它含有一組包括一列直欄表頭的橫列及直欄。 在 Net.Data 巨集中定義表格的方式,如下列陳述式所示:
%DEFINE myTable=%TABLE(30)
位在 %TABLE 後面的數字會限制這個表格變數可含有的列數。 如果您想指定一個沒有列數限制的表格, 您可以如下列範例所示,使用預設值或指定 ALL:
%DEFINE myTable2=%TABLE %DEFINE myTable3=%TABLE(ALL)
定義表格時,並無橫列與直欄。把值移入表格內的唯一方法,是將它當作 OUT 或 INOUT 參數來傳給函數, 或使用 Net.Data 提供的內建表格函數。 DTW_SQL 語言環境自動地將 SELECT 陳述式的結果放入表格中。
對於非資料庫語言環境,例如 DTW_REXX 或 DTW_PERL, 語言環境也會負責設定表格值。不過,語言環境 script 或 program 會依一個資料格接著一個資料格來定義表格值。 請參閱使用語言環境,以取得語言環境如何使用表格變數的詳細資訊。
您可以參照表格變數名稱,在函數之間傳遞表格。 在函數的 REPORT 區塊中可以參照表格的個別元素, 或使用 Net.Data 表格函數來參照它們。請參閱表格處理程序變數,以瞭解如何在 REPORT 區塊內, 存取表格中的個別元素,以及參閱表格函數, 以瞭解如何使用表格函數來存取表格的個別元素。 表格變數通常是在 SQL 函數中移入值,然後當作參數傳遞給 SQL 函數或另一個函數, 以用來當作報表的輸入。 您可以將表格變數當作 IN、OUT 或 INOUT 參數,傳遞給任何非 SQL 函數。 表格只能當作 OUT 參數傳給 SQL 函數。
如果您參照一個表格變數,將依據 DTW_HTML_TABLE 變數的設定, 來顯示表格內容並製作它的格式。 在下列範例中,將顯示 myTable 的內容:
%HTML (output) { $(myTable) }
表格中的直欄名稱和欄位值,是以 1 起始的陣列元素來定址。
這些變數是 Net.Data 定義的變數,用途如下:
雜項變數可以有 Net.Data 決定的預定值,或您所設定的值。 例如,Net.Data 基於目前所處理的檔案,來決定 DTW_CURRENT_FILENAME 變數值, 而您可以設定 Net.Data 是否要除去定位字元和換行字元所造成的額外空白。
預設變數可用來當作巨集內的變數參照,並提供有關檔案現行狀態、日期、 或函數呼叫狀態之資訊。例如,若要取回目前的檔案名稱,您可以使用:
%REPORT { <p>This file is <i>$(DTW_CURRENT_FILENAME)</i>.</p> }
可更改的變數值通常是使用 DEFINE 陳述式或 @DTW_ASSIGN() 函數來設定, 且可讓您影響 Net.Data 處理巨集的方式。例如,若要設定是否除去空白,您可以使用下列 DEFINE 陳述式:
%DEFINE DTW_REMOVE_WS="YES"
Net.Data 定義表格處理變數乃是為了用於 REPORT 及 ROW 區塊。請使用這些變數來參照來自 SQL 查詢和函數呼叫的值。
表格處理變數具有 Net.Data 決定的預設值。 這些變數可讓您根據直欄、橫列或被處理欄位,參照來自 SQL 查詢的結果集合或函數呼叫的值。 您也可以存取有關被處理的橫列數或所有直欄名稱的列表。
例如,當 Net.Data 處理 SQL 查詢的結果集時, 它會針對每一個現行直欄名稱指定變數 Nn 的值,例如指定 N1 給第一直欄、 N2 給第二個直欄,依此類推。 您可以參照網頁輸出的現行直欄名稱。
使用表格處理程序變數,作為巨集內的變數參照。 例如,若要取回被處理之現行直欄的名稱,您可以使用:
%REPORT { <p>Column 1 is <i>$(N1)</i>.</p> }
表格處理程序變數亦提供有關查詢結果的資訊。 您可以參照巨集中的變數 TOTAL_ROWS,來顯示 SQL 查詢傳回的列數, 如下列範例所示:
所找到的名稱:$(TOTAL_ROWS)
有些表格處理程序變數,會被其它變數或內建式函數所影響。 例如,TOTAL_ROWS 需要啟用 DTW_SET_TOTAL_ROWS SQL 語言環境變數, 以便 Net.Data 在處理 SQL 查詢的結果集或函數呼叫時,能夠指定 TOTAL_ROWS 的值, 如下列範例所示:
%DEFINE DTW_SET_TOTAL_ROWS="YES" ... 所找到的名稱:$(TOTAL_ROWS)
Net.Data 會以預設報表格式顯示巨集所產生的網頁輸出。在 HTML 區塊中,預設報表格式使用 <pre> </pre> 標籤顯示表格, 在 XML 區塊中,使用 <RowSet>、<Row> 和 <Column> 標籤。 您可以經由下列方式置換預設報表:以顯示輸出的指示來定義 REPORT 區塊, 或使用其中一個報表變數來阻止預設報表的產生。
報表變數協助您如何自訂顯示網頁輸出,以及如何搭配使用預設報告和 Net.Data 表格。您必須先使用 DEFINE 陳述式或 @DTW_ASSIGN() 函數來定義這些變數,才能使用它們。
報表變數指定間隔,置換預設報表格式,指定是否使用 HTML 或固定寬度字元顯示表格輸出,以及指定其它顯示特性。例如,您可以使用 ALIGN 變數,來控制表格處理程序變數的前端和尾端空間。 下列範例使用 ALIGN 變數,對查詢所傳回的列示,以空格來分隔其中每一個直欄名稱。
%DEFINE ALIGN="YES" ... <p>您的查詢是針對這些直欄: $(NLIST)
START_ROW_NUM 報表變數可讓您決定從何列開始顯示查詢的結果。 例如,下列變數值指定 Net.Data 從第三列開始顯示查詢的結果。
%DEFINE START_ROW_NUM = "3"
您也可以決定 Net.Data 是否要對預設格式使用 HTML 標籤。 若 DTW_HTML_TABLE 設為 YES,則會產生 HTML 表格, 而不是文字格式的表格。
%DEFINE DTW_HTML_TABLE="YES" %FUNCTION(DTW_SQL){ SELECT NAME, ADDRESS FROM $(qTable) %}
這些變數與語言環境一同使用,並影響語言環境處理要求的方式。
透過這些變數,您可以執行如下的作業:建立資料庫連線、提供 Java applet 的替代文字、啟用 NLS 支援, 以及決定是否已順利執行 SQL 陳述式。
例如,您可以使用 SQL_STATE 變數,來存取或顯示資料庫傳回的 SQL 狀態值。
%FUNCTION (DTW_SQL) val1() { select * from customer %REPORT { ... %ROW { ... %} SQLSTATE=$(SQL_STATE) %}
下一範例顯示如何定義將存取的資料庫。
%DEFINE DATABASE="CELDIAL"