19.11. 異質的設定

當使用人執行業務邏輯處理器後,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。

19.11.1. 異質的設定型態1

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
\.
			

19.11.1.1. 刷新會計分錄編號

現在,使用人在t_220 table輸入一筆記錄,其出貨單#24,然後儲存。然後,也在t_221t_222t_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欄位的搜索欄位

19.11.1.2. 清除會計分錄編號

相反的機制是清除會計分錄編號。

出貨單生成的會計分錄明細應於下述情況發生時刪除(為重複使用分錄編號120,我們不刪除分錄畫面最上層表格t52的紀錄):

  • 修改、刪除t_220記錄

  • 新增、修改、刪除t_221t_222t_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欄位連結的搜索欄位

19.11.2. 異質的設定型態2

f2欄位存放2時,這個機制是要PostERP取用伺服器回傳的值,據以在客戶端刷新指定的table和欄位裡面的值。

沿用Section 19.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欄位。