當使用人執行業務邏輯處理器後,PostERP參考table t127,並且比對你設計的PostgreSQL function傳回值來刷新CRUD畫面上的欄位值。
CREATE TABLE t127 ( CONSTRAINT f1 FOREIGN KEY (f1) REFERENCES t13 (f1) ON UPDATE CASCADE ON DELETE CASCADE, PRIMARY KEY (f1,f2,f3,f4), f1 SMALLINT, --screen# f2 SMALLINT CHECK(f2 > 0), --type code f3 VARCHAR(10), --target table name f4 VARCHAR(4), --target column name f5 BOOLEAN DEFAULT FALSE, --enabled? f6 VARCHAR(2048), --content f99 VARCHAR(12) ); |
f6欄位存放JSON string。
f2欄位存放1時,這個機制是要PostERP客戶端取用伺服器回傳的會計分錄編號以刷新CRUD畫面上的欄位。
以製造業版或進銷存版的[銷貨]CRUD畫面為例,說明如下:
COPY t127 FROM stdin; 6091 1 t_220 f1 t ["t_220","t_221","t_222","t_223"] tw \. |
畫面編號6091是出貨畫面。table t_220的欄位f1是出貨單#,其型態是INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY。
這個畫面附掛一個PostgreSQL function post_delivery(),其功能是把出貨單生成會計分錄。
我們希望使用人執行PostgreSQL post_delivery() function之後,引用post_delivery()傳回的值,據以刷新與t_220.f1連結的分錄編號搜索欄位。
t_220.f1的搜索欄位這樣設定:
COPY t63 FROM stdin; t_220 f1 t52 f5 f1 184 f4=6091 AND EXISTS (SELECT 1 FROM t53 WHERE f1=t52.f1) f \N \N tw \. |
現在,使用人在t_220 table輸入一筆記錄,其出貨單#為24,然後儲存。然後,也在t_221、t_222、t_223等下層table各輸入一或多筆記錄並分別儲存。
使用人現在執行post_delivery()以生成一筆會計分錄(假設其分錄#為120)。
雖然post_delivery()已經生成120分錄#,但是,它是在資料庫上面操作。使用人畫面上的這筆出貨單t_220.f1欄位右側的搜索欄位並不知道資料庫已經發生改變,所以仍顯示空白。
post_delivery()必須在執行最後回傳必要資料如下:
CREATE OR REPLACE FUNCTION post_delivery(company TEXT,TxId INT8,ro TEXT) RETURNS VARCHAR AS $$ DECLARE jid INT8; ... BEGIN ... RETURN '{"msg":"@185:' || jid || '","hs":[{"type":1,"jid":' || jid || '}]}'; END $$ LANGUAGE PLPGSQL VOLATILE; |
這樣一來,post_delivery()傳回{"msg":"@185:120","hs":[{"type":1,"jid":120}]}。PostERP把@185:120轉成分錄#:120後,顯示在業務邏輯處理器客戶端軟體的對話盒中。客戶端的程式取用"hs":[{"type":1,"journal":120}]的JSON value120以刷新CRUD畫面上連結t_220.f1欄位的搜索欄位。
相反的機制是清除會計分錄編號。
出貨單生成的會計分錄明細應於下述情況發生時刪除(為重複使用分錄編號120,我們不刪除分錄畫面最上層表格t52的紀錄):
修改、刪除t_220記錄
新增、修改、刪除t_221、t_222、t_223記錄
所以,必須設計PostgreSQL的trigger或rule,於發生上述事件後刪除該出貨單所生成的會計分錄。例如:
CREATE OR REPLACE FUNCTION tf_220u() RETURNS TRIGGER AS $$ BEGIN ... DELETE FROM t52 WHERE f0=OLD.f0 AND f4=6091 AND f5=OLD.f1; RETURN NEW; END $$ LANGUAGE PLPGSQL VOLATILE; CREATE TRIGGER t_220u BEFORE UPDATE ON t_220 FOR EACH ROW EXECUTE PROCEDURE tf_220u(); |
PostgreSQL的trigger或rule雖然自資料庫刪除了該出貨單所生成的會計分錄,系統仍必須設置機制以清除客戶端與t_220.f1欄位連結的搜索欄位。這就是["t_220","t_221","t_222","t_223"]的設置目的所在:它通知客戶端程式於適當時機自動清除與t_220.f1欄位連結的搜索欄位。
f2欄位存放2時,這個機制是要PostERP取用伺服器回傳的值,據以在客戶端刷新指定的table和欄位裡面的值。
沿用Section 17.11.1製造業版或進銷存版的[銷貨]CRUD畫面舉例,並且開立發票,說明如下。
我們希望使用人執行PostgreSQL post_delivery() function之後,PostERP客戶端引用post_delivery()傳回的值,據以在CRUD畫面的t_226.f2填入開立的發票號碼。
COPY t127 FROM stdin; 6091 1 t_220 f1 t ["t_220","t_221","t_222","t_223"] tw 6091 2 t_226 f2 t \N tw \. |
post_delivery()必須在執行最後回傳資料如下:
RETURN '{"msg":"@185:' || jid || '","hs":[{"type":1,"jid":' || jid || '},{"type":2,"value":"' || InvoicePrefix || invoice || '"}]}'; |
這樣一來,post_delivery()傳回{"msg":"@185:120","hs":[{"type":1,"jid":120},{"type":2,"value":"TY58329700"}]}。PostERP客戶端的程式取用"hs":[{"type":2,"value":"TY58329700"}]的JSON valueTY58329700以填充在CRUD畫面上的t_226.f2欄位。