報表、業務邏輯處理器、資料速查等功能都附掛在畫面之下。
PostERP是low-code(低程式碼)資訊系統框架。資訊人員在PostERP上面開發Create, Read, Update, Delete(CRUD)畫面,不需要撰寫程式。 |
樣品:
--sales - master-- CREATE TABLE t_220 ( CONSTRAINT f0 FOREIGN KEY (f0) REFERENCES t45 (f1), CONSTRAINT f3 FOREIGN KEY (f3) REFERENCES t_46 (f1), CONSTRAINT f4 FOREIGN KEY (f4) REFERENCES t9 (f1), CONSTRAINT f6 FOREIGN KEY (f6) REFERENCES t43 (f1), CONSTRAINT f9 FOREIGN KEY (f9) REFERENCES t189 (f1), f0 VARCHAR(15), --company# f1 INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, --sale# f2 TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, --sale date time f3 INTEGER, --customer# f4 VARCHAR(3) NOT NULL, --currency# f5 NUMERIC(9,5) CHECK(f5 > 0) NOT NULL, --exchange rate f6 VARCHAR(12), --salesperson# f7 INTEGER, --sales revenue received in advance# f8 DATE, --A/R due date f9 SMALLINT, --tax# f99 VARCHAR(12) ); --sales - item-- CREATE TABLE t_221 ( CONSTRAINT f1 FOREIGN KEY (f1) REFERENCES t_220 (f1) ON UPDATE CASCADE ON DELETE CASCADE, CONSTRAINT f2 FOREIGN KEY (f2) REFERENCES t_133 (f1), CONSTRAINT f3 FOREIGN KEY (f3) REFERENCES t_130 (f1), CHECK(verify_unit(f2,f3)) NOT VALID, PRIMARY KEY (f1,f2), f1 INTEGER, --sale# f2 VARCHAR(20), --item# f3 VARCHAR(3) NOT NULL, --unit# f99 VARCHAR(12) ); |
資料表裏的f0欄位區隔組織(例如:集團企業的個別公司)資料。
如果某一個table有f0欄位,則凡是f0含1的記錄,是公司編號1的資料,其餘類推。設計SQL或function時,應謹慎過濾這個欄位裏的值。同時,請務必加上連結到t45.f1的constraint以做為其foreign key。
table的每一筆資料在欄位f99(如果有的話)記錄其擁有者。PostERP在用戶輸入新記錄的時候自動在f99填入該用戶的帳號以註記該筆記錄的擁有者。參見Section 6.3資料記錄權限。只有記錄的擁有者才有權更改或刪除該筆記錄。
如果某table沒有f99這個欄位,則全部使用者都可以更改這個table。
如果某table含有f100這個欄位,且其資料型態是BIGINT,則該table自動接受使用人附掛任何檔案在此table。每一筆記錄接受最多32767個附掛檔案。
各table如果有f100欄位,則務必設定DEFAULT NEXTVAL('unique_int_seq')
一旦在某table設置了f100欄位,務必也設計rule或trigger。這個rule或trigger的作用是:一旦使用人刪除某記錄,則這個rule或trigger就自動刪除該附掛檔案。例如:
樣品:
--inventory items-- CREATE TABLE t_133 ( CONSTRAINT f2 FOREIGN KEY (f2) REFERENCES t_130 (f1) ON UPDATE CASCADE, f1 VARCHAR(20) PRIMARY KEY, --item# f2 VARCHAR(3) NOT NULL, --Finest Unit Of Measure (FUOM) f3 SMALLINT NOT NULL, --valid number of decimals for quantity f99 VARCHAR(12), f100 BIGINT DEFAULT NEXTVAL('unique_int_seq') ); CREATE OR REPLACE RULE r_133d AS ON DELETE TO t_133 DO ALSO DELETE FROM t61 WHERE f1=OLD.f100; |
也必須設計機制,於使用者刪除紀錄後,系統也同步自檔案系統刪除附掛檔案。備份資料庫時,也必須備份對應的附掛檔案。
對metadata table增加的欄位,請務必加上_做為欄位名。例如新增這些欄位:f_1、f_97、f_103。
對新table的命名,必須附帶_。例如:t_120、t_143、d_143。
對新view的命名,必須附帶_。例如:v_120、v1_43。
由於桌面版客戶軟體的限制,請用VARCHAR,避免使用TEXT。如果桌面版客戶軟體發生「access violation」錯誤或默默當掉的話,請嘗試縮短顯示的VARCHAR欄位,看看能否消除該錯誤。2048個字元以內的寬度似乎都正常。
如果某table的INSERT、UPDATE、和DELETE有trigger要生成會計分錄,而該卻沒有SERIAL欄位做其primary key的話,請加入SERIAL欄位做其surrogate key。請參見應用系統#2裏的t_33以及其trigger。
請使用TIMESTAMPTZ,避免TIMESTAMP。後者似乎與瀏覽器不相容。
避免在BOOLEAN欄位存入NULL這個值。因為該值容易造成混淆。設定DEFAULT以改善這種情況。
如果應用伺服器仍在運轉中而且系統開發人員用Data Definition Language,DDL,對任何metadata(或稱之為資料字典)的table定義(例如:欄位的資料型態、欄位、新欄位、被刪掉的欄位)做過修改,則必須connect到同一個資料庫,執行這一道SQL:
NOTIFY "DDLExecuted" |
其目的是:通知應用伺服器更新其cache。
換言之,在應用伺服器運行中,如果執行過任何Data Definition Language(DDL),一定要儘速通知應用伺服器。如果未能即時這樣做,則使用到這些table的客戶程式可能開始發生異常。