当使用人执行业务逻辑处理器后,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 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字段。