備註
社區興趣小組現在已從 Yammer 轉移到 Microsoft Viva Engage。 若要加入 Viva Engage 社群並參與最新的討論,請填寫 [ 要求存取財務和營運 Viva Engage 社群 表單 」 ,並選擇您要加入的社群。
本文說明 X++ 中的類別程式庫。
類別有兩種: 應用程式類別 和 系統類別。
- 應用程式類別 – 這些類別是在 X++ 中實作的。 它們可在應用程式總管的 [ 程式碼 > 類別 ] 節點中使用。
- 系統類別 — 這些類別有時稱為 核心類別。 它們會列在應用程式總管的 [系統文件 > 類別 ] 節點下。 這些類別的原始程式碼無法使用。 如需系統類別的清單,請參閱 API、類別及表格參考。
應用程式類別的一般結構
下列程式碼區塊類型是應用程式類別的標準:
- 類別和變數宣告:類別宣告包含修飾符,例如 public、 private和 extends。
- 變數宣告:這些是從類別建構之物件的欄位成員。 當您在類別實例變數上輸入關鍵字 this 時,IntelliSense 可以顯示成員清單。
- new method:這個方法會建立類別的實例。 建構函式只能使用 new 關鍵字來呼叫。 衍生類別可以透過呼叫超級方法參照來呼叫其建構函式的新方法。 如需詳細資訊,請參閱 X++ 繼承。
- finalize 方法:這個方法會最終確定類別的實例。 這個方法就是析構函數方法。 不過,它只是慣例上的毀構函數。 系統不會在記憶體回收期間自動呼叫 finalize 方法。
類別的其他方法有下列類型:
- 實例方法
- 靜態方法
- 主要方法
可以在許多類型的項目上建立方法。 以下是一些範例:
- 課程
- Maps
- 瀏覽次數
- 數據集
- 表單
- Queries
以應用程式類別取代系統類別
您應該使用 替代應用程式類別 ,而不是它們延伸的系統類別。
在應用程式總管的 [系統檔 > 類別] 底下,數個核心或系統類別的名稱以小寫 x 開頭。 這些類別稱為 x 系統類別。 這些系統類別的範例包括 xApplication 和 xVersionControl。 其中一些類別由應用程式類別擴充。 例如, Application 類別會擴充 xApplication 系統類別。
衍生自 x-system 類別的類別稱為 替代應用程式類別。 在應用程式總管的 [類別] 節點下,替代應用程式類別旁邊的圖示與標準圖示不同。
X-System 類別
部分替代應用程式類別與代表類別實例的特殊廣域變數相關聯。 例如, appl 變數會參照 Application 類別中的預先實例化物件。 appl 變數的優點是系統會在整個階段作業範圍內維護物件。 如果您的程式碼重複使用 新的 Application() 語法來取得 Application 類別的實例,則效率會降低。 您不應該使用 xApplication 系統類別。 請改用 Application 替代應用程式類別。
您可以使用下列標準語法來參考 Application 類別的靜態成員:Application::checkForNewBatchJobs()。 不過,若要參照 Application 類別的實例成員,您應該使用該類別的 appl 變數 (如果存在的話)。 此模式適用於大多數的 x 系統類別。 Session 替代應用程式類別是一個例外,因為 Session 沒有特殊的廣域變數。
下表列出具有對應替代應用程式類別的 x-system 類別。 對於具有特殊廣域變數的類別,也會顯示特殊廣域變數。
| 應用程式類別 | X-System 類別 | 全域變數 |
|---|---|---|
| 參數 | x引數 | 不適用 |
| Application | x應用 | 應用 |
| 類別工廠 | xClass工廠 | 類別工廠 |
| 公司 | x公司 | 應用公司 |
| 全球 | x全球 | 不適用 |
| Info | x信息 | 資訊日誌 |
| 菜單功能 | xMenu函數 | 不適用 |
| Session | x會話 | 不適用 |
| 版本控制 | x版本控制 | 版本控制 |
x-system 類別的範例
下列範例顯示使用數個特殊變數的語法,這些變數會參照替代應用程式類別的實例。
TreeNode treeNode;
Args args;
FormRun formRun;
// appl variable
info(appl.buildNo());
// company variable
appl.company().reloadRights();
// infolog variable
treeNode = infolog.findNode("\\forms\\custTable");
info(treeNode.AOTgetProperty("Name"));
// Output is "CustTable".
// classFactory variable
args = new Args(formstr(Batch));
formRun = classFactory.formRunClass(args);
formRun.init();
formRun.run();
formRun.detach();
info("Method is ending. This is a message in the Infolog.");
// Output is "Method is ending. This is a message in the Infolog."
批次處理類別
您可以使用批次處理系統,以及擴充 RunBase 和 RunBaseBatch 類別來實作類別。 若要從 [批次處理] 對話方塊中移除 [週期] 按鈕,您可以使用 Args::p armEnum 方法。 建議您將類別指定為伺服器繫結批次方法執行。 伺服器系結批次方法比未繫結伺服器的批次方法更安全,原因如下:
- 方法是使用提交方法之使用者的許可權來執行。
- 此方法只能使用特定的 Info 和 Global 類別方法,與正在處理它的用戶端互動。 此限制限制了與客戶端的互動。
讓類別以伺服器系結批次方法的形式執行
建立擴充 RunBaseBatch 類別的類別。
覆寫 RunBaseBatch.runsImpersonated 方法以傳回 true 值,如下列範例所示。
public boolean runsImpersonated() { return true; }確認類別只呼叫下列 Info 和 Global 類別方法:
- 新增
- 資訊副本
- 資訊剪輯
- 資訊.匯入
- 資訊匯出
- 資訊線
- 資訊.num
- 全域::錯誤
- 全域::info
- 全域::警告
Info.line 和 Info.num 方法繼承自 xInfo 類別。
從批次處理對話方塊中移除 [週期] 按鈕
當您使用批次處理系統實作類別時,您可以呼叫 Args.parmEnum 方法並傳遞 NoYes::Yes 系統列舉值,以移除 [週期] 按鈕。 NoYes 系統列舉會決定是否從對話方塊中移除 [週期性] 按鈕。 預設值為 NoYes::No。
在下列範例中,會實作 InventTransferMultiShip 類別。 BatchDialog::main 方法會建立 [批次處理] 對話方塊。
static void noRecurrenceButton(Args _args)
{
Args a;
InventTransferMultiShip inventTransferMultiShip;
a = new Args();
inventTransferMultiShip = InventTransferMultiShip::construct();
a.caller(inventTransferMultiShip);
a.parmEnum(NoYes::Yes);
BatchDialog::main(a);
}
影像處理類別
兩個系統類別可讓您操作圖形和圖示: Image 和 Imagelist。
- 影像 – 此類別可讓您載入、儲存及操作個別影像。 例如,您可以擷取螢幕並將其儲存為影像、裁剪或旋轉影像,或操作色彩深度。
- Imagelist – 此類別可讓您使用一組具有通用屬性的影像,例如大小和透明度顏色。 您可以檢視 ImageListAppl 應用程式類別中使用的映像清單。
查詢物件模型
查詢物件模型包含用來定義及執行查詢的類別。 查詢物件可用來定義查詢資料來源、傳回的欄位、記錄範圍,以及與子資料來源的關聯性。 當您在程式碼中建立動態查詢時,查詢類別會更明顯,但當您在應用程式總管中建立靜態查詢時,也會在幕後使用查詢類別。
下表說明查詢物件模型中的類別。
| 系統類別 | Description |
|---|---|
| 查詢執行 | 這個類別會執行查詢並擷取資料。 |
| Query | 這個類別會保留一些屬性,並具有一或多個相關的資料來源。 這是查詢定義的最上層。 |
| QueryBuildDataSource | 這個類別會定義查詢中單一資料來源的存取權。 如果查詢中的相同層次有多個資料來源,則會產生個別的 SQL 陳述式,並循序執行。 如果一個資料來源是另一個資料來源的子項,則會在兩個資料來源之間建立聯結。 |
| 查詢建置欄位清單 | 這個類別定義從資料庫傳回的欄位。 依預設,欄位清單是動態的,所有欄位都會從資料來源表格、地圖或檢視傳回。 每個資料來源只有一個 QueryBuildFieldList 物件。 此物件包含所有選取欄位的相關資訊。 您可以在欄位清單物件上指定彙總函數,例如 SUM、 COUNT 和 AVG。 |
| 查詢建置範圍 | 此類別會根據單一欄位定義傳回的記錄子集。 範圍會轉換成查詢 SQL 陳述式中的 WHERE 子句。 如果使用多個欄位來限制查詢 (WHERE 子句) ,則資料來源將包含多個範圍。 |
| 查詢BuildDynalink | 此類別包含與外部記錄關係 (限制) 的相關資訊。 執行查詢時,此資訊會轉換成查詢 SQL 陳述式的 WHERE 子句中的其他項目。 這個類別只能存在於查詢的父資料來源上。 表單會在兩個資料來源同步時使用此功能。 然後,子資料來源會包含父資料來源的一或多個 DLL。 即使兩個資料來源以兩種不同的形式放置,但仍同步,也會使用此功能。 |
| 查詢建置連結 | 這個類別會指定聯結中兩個資料來源之間的關聯性。 這個類別只能存在於子資料來源上。 |
您也可以使用 SysDa API 來查詢資料。
系統類別概觀
系統類別的來源無法使用。 系統類別可以具有下列特性:
- 靜態方法(或類別方法)
- 動態方法
- 屬性 — 這些屬性是用來設定屬性的成員函式。 一個例子是 LeftMargin。
您無法覆寫系統類別方法。 我們無意讓您使用系統類別從頭開始設計應用程式物件。 相反地,請使用它們來擴充或修改應用程式總管中的預設功能。 例如,您可以動態地將額外資訊新增至現有報告。 或者,您可以根據使用者在上一頁上的選擇來變更頁面上可用的選項。
集合物件類別
集合類別可讓您建立清單、集合、結構、對應和陣列。
應用程式物件類別
這些系統類別會保留每當您使用應用程式總管建立應用程式時啟動的函式。 例如,當您在應用程式總管的 [設計] 節點中定義表單的版面配置時,系統會使用 FormDesign 類別。 這些類別也可讓您建立及修改應用程式物件。
整合類別
與環境的整合通常由類別實作。 以下是此類別中類別的一些範例:
- COM – COM 物件上方法的呼叫。
- DLL – Microsoft Windows DLL 函式的呼叫。
- IO – 讀取和寫入外部檔案。
- ODBCConnection — 外部資料庫的開放式資料庫連線 (ODBC) 介面。