18.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。

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

18.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字段的搜索字段

18.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字段连结的搜索字段

18.11.2. 异质的设定型态2

f2字段存放2时,这个机制是要PostERP取用服务器回传的值,据以在客户端刷新指定的table和字段里面的值。

沿用Section 18.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字段。