建立第一個自訂 Window:從 Table 到 Menu 全流程實作
想在 iDempiere 中建立自己的功能模組?本文以「圖書借閱系統」為例,帶你一步步完成從 Table 定義到 Menu 上線的完整流程。這是 iDempiere 開發的基礎功,學會後就能自由擴充系統功能。
一、需求情境
我們要建立一個簡單的圖書借閱系統 Z_BookLoan,包含:
- 書名 (Name)
- 是否已借出 (IsBorrow)
- 借出日期 (LoanDate)
- 借閱人 (AD_User_ID)
二、Step 1:建立 Table
路徑:Application Dictionary → Table and Column
必要欄位(系統自動處理)
| 欄位 | 類型 | 說明 |
|---|---|---|
| Z_BookLoan_ID | ID | 主鍵 |
| AD_Client_ID | Table Direct | 租戶 |
| AD_Org_ID | Table Direct | 組織 |
| IsActive | Yes-No | 啟用 |
| Created / Updated | DateTime | 建立/更新時間 |
| CreatedBy / UpdatedBy | Table | 建立/更新者 |
自訂欄位
| 欄位 | 類型 | Reference |
|---|---|---|
| Name | String(100) | – |
| IsBorrow | Yes-No | – |
| LoanDate | Date | – |
| AD_User_ID | Table Direct | AD_User |
建立 Table SQL
CREATE TABLE Z_BookLoan (
Z_BookLoan_ID NUMERIC(10) NOT NULL,
AD_Client_ID NUMERIC(10) NOT NULL,
AD_Org_ID NUMERIC(10) NOT NULL,
IsActive CHAR(1) DEFAULT 'Y',
Created TIMESTAMP DEFAULT NOW(),
CreatedBy NUMERIC(10),
Updated TIMESTAMP DEFAULT NOW(),
UpdatedBy NUMERIC(10),
Name VARCHAR(100),
IsBorrow CHAR(1) DEFAULT 'N',
LoanDate DATE,
AD_User_ID NUMERIC(10),
PRIMARY KEY (Z_BookLoan_ID)
);
三、Step 2:在 AD 註冊 Table
在 Table and Column 視窗:
- 新增記錄,輸入 Table Name:
Z_BookLoan - 勾選 Create Columns from DB
- 執行 Synchronize Column 按鈕
系統會自動從資料庫讀取欄位並建立 AD_Column 記錄。
四、Step 3:建立 Window
路徑:Application Dictionary → Window, Tab & Field
- 新增 Window,Name:
Book Loan - Window Type: Maintain
- 儲存
五、Step 4:建立 Tab
在剛建立的 Window 下:
- 新增 Tab,Name:
Book Loan - Table: 選擇
Z_BookLoan - Tab Level:
0(主表) - 勾選 Single Row Layout(單筆顯示)
- 儲存後執行 Create Fields
六、Step 5:調整 Field
在 Tab 下的 Field 子頁籤:
- Sequence:調整欄位顯示順序
- Displayed:是否顯示
- Read Only:唯讀
- Mandatory:必填(會影響 UI 驗證)
七、Step 6:建立 Menu
路徑:Application Dictionary → Menu
- 新增 Menu,Name:
Book Loan - Action: Window
- Window: 選擇剛建的
Book Loan - Parent Menu: 選擇要放的位置
- 儲存
八、Step 7:設定權限
路徑:Role 視窗
- 選擇目標 Role
- 在 Window Access 子頁籤加入新 Window
- 設定 Read/Write 權限
九、測試與驗證
- 登出再登入(或清除 Cache)
- 在選單找到 Book Loan
- 測試新增、修改、刪除功能
十、常見錯誤排解
| 問題 | 解決方案 |
|---|---|
| 選單看不到 | 檢查 Role 的 Window Access 權限 |
| 欄位沒顯示 | 檢查 Field 的 Displayed 是否勾選 |
| 存檔失敗 | 檢查必填欄位、資料庫 constraint |
| Create Fields 沒反應 | 確認 Tab 有選對 Table |
常見問題 FAQ
Q1: 自訂 Table 命名規則是什麼?
建議使用 Z_ 或 XX_ 前綴,避免與系統表衝突。主鍵欄位命名為 TableName_ID。
Q2: 如何建立主從表關係?
在子表加入父表的 ID 欄位(如 Z_BookLoan_ID),建立 Tab 時設定 Parent Column 和 Link Column。
Q3: 可以用 UI 建立 Table 嗎?
可以!在 Table and Column 視窗建立 Table 和 Column 後,執行 Synchronize Column 會自動在資料庫建立表。
Q4: 如何讓欄位顯示下拉選單?
設定 Column 的 Reference 為 Table 或 Table Direct,並指定參照的表。
Q5: 修改後要重啟 iDempiere 嗎?
大部分情況不用,執行 Role → Reset Cache 或重新登入即可。但修改核心設定可能需要重啟。
發佈留言