编程与数学 03-008 《看潮企业管理软件》项目开发 06 数据库 3-2
摘要:本文档详细阐述了《看潮企业管理软件》的数据库架构设计与初始化方案。基于PostgreSQL 16构建的kc01账套采用"无触发器、无外键、全函数"设计哲学,通过PL/pgSQL函数实现业务逻辑与数据完整性控制。系统支持多组织、多账期、多币种业务模式,涵盖从需求计划到财务总账的全流程工业版ERP功能。文档重点介绍了账套初始化函数x9_start的实现机制,以及静态基础数据(科目、物料、往来单位等)的预置要求,为企业ERP系统上线提供了完整的技术实施指南。
关键词:ERP系统、PostgreSQL、数据库架构、账套初始化、管理软件开发、PL/pgSQL、企业信息化
人工智能助手:DeepSeek、Kimi
三、主要表结构
sql
-- Table: public.djcho
-- DROP TABLE IF EXISTS public.djcho;
CREATE TABLE IF NOT EXISTS public.djcho
(
oid character varying(30) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
djmc character varying(60) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
ny character(6) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::bpchar,
rq date,
dqbz character varying(40) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
ywlb character varying(40) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
wldw character varying(200) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
jswb character varying(40) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
scbm character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
ckmc character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
htbh character varying(50) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
jfrq date,
ywy character varying(60) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
glbj character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
tzrq timestamp without time zone,
shrq timestamp without time zone,
djrq timestamp without time zone,
bz character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
tzr character varying(20) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
shr character varying(20) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
djr character varying(20) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
CONSTRAINT djcho_pkey PRIMARY KEY (oid)
)
TABLESPACE pg_default;
ALTER TABLE IF EXISTS public.djcho
OWNER to postgres;
-- Table: public.djchm
-- DROP TABLE IF EXISTS public.djchm;
CREATE TABLE IF NOT EXISTS public.djchm
(
mid integer NOT NULL DEFAULT 0,
oid character varying(30) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
djmc character varying(60) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
ny character(6) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::bpchar,
dqbz character varying(40) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
chxh character varying(20) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
chdh character varying(30) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
chmc character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
xh1 character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
xh2 character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
xh3 character varying(400) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
gg1 character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
gg2 character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
gg3 character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
bzdw character varying(40) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
mjsl numeric(16,2) NOT NULL DEFAULT 0,
jldw character varying(20) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
bzjs integer NOT NULL DEFAULT 0,
xqsl numeric(16,2) NOT NULL DEFAULT 0,
xqdj numeric(16,2) NOT NULL DEFAULT 0,
xqje numeric(16,2) NOT NULL DEFAULT 0,
jhsl numeric(16,2) NOT NULL DEFAULT 0,
jhdj numeric(16,2) NOT NULL DEFAULT 0,
jhje numeric(16,2) NOT NULL DEFAULT 0,
rksl numeric(16,2) NOT NULL DEFAULT 0,
rkdj numeric(16,2) NOT NULL DEFAULT 0,
rkje numeric(16,2) NOT NULL DEFAULT 0,
cksl numeric(16,2) NOT NULL DEFAULT 0,
ckdj numeric(16,2) NOT NULL DEFAULT 0,
ckje numeric(16,2) NOT NULL DEFAULT 0,
jgsl numeric(16,2) NOT NULL DEFAULT 0,
jgdj numeric(16,2) NOT NULL DEFAULT 0,
jgje numeric(16,2) NOT NULL DEFAULT 0,
cgsl numeric(16,2) NOT NULL DEFAULT 0,
cgdj numeric(16,2) NOT NULL DEFAULT 0,
cgje numeric(16,2) NOT NULL DEFAULT 0,
xssl numeric(16,2) NOT NULL DEFAULT 0,
xsdj numeric(16,2) NOT NULL DEFAULT 0,
xsje numeric(16,2) NOT NULL DEFAULT 0,
wbje numeric(16,2) NOT NULL DEFAULT 0,
zzsl numeric(16,2) NOT NULL DEFAULT 0,
zzse numeric(16,2) NOT NULL DEFAULT 0,
wbse numeric(16,2) NOT NULL DEFAULT 0,
tp1 character varying(400) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
clyt character varying(20) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
djrq timestamp without time zone,
bz character varying(400) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
mhh integer NOT NULL DEFAULT 0,
sfsh boolean NOT NULL DEFAULT false,
sfdj boolean NOT NULL DEFAULT false,
CONSTRAINT djchm_pkey PRIMARY KEY (mid)
)
TABLESPACE pg_default;
ALTER TABLE IF EXISTS public.djchm
OWNER to postgres;
-- Table: public.mlch
-- DROP TABLE IF EXISTS public.mlch;
CREATE TABLE IF NOT EXISTS public.mlch
(
chdh character varying(30) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
bjdh character varying(5) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
sjdh character varying(30) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
chmc character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
ggxl character varying(40) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
gymc character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
xh1 character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
xh2 character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
xh3 character varying(400) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
gg1 character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
gg2 character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
gg3 character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
bzdw character varying(40) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
jldw character varying(40) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
mllb character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
ckmc character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
zjm character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
jc smallint NOT NULL DEFAULT 0,
dcmx boolean NOT NULL DEFAULT false,
sfqy boolean NOT NULL DEFAULT false,
CONSTRAINT mlch_pkey PRIMARY KEY (chdh)
)
TABLESPACE pg_default;
ALTER TABLE IF EXISTS public.mlch
OWNER to postgres;
-- Table: public.mlchxm
-- DROP TABLE IF EXISTS public.mlchxm;
CREATE TABLE IF NOT EXISTS public.mlchxm
(
chxh character varying(20) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
sjdh character varying(20) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
bjdh character varying(20) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
jc integer NOT NULL DEFAULT 0,
chdh character varying(30) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
chmc character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
xh1 character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
xh2 character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
xh3 character varying(400) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
gg1 character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
gg2 character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
gg3 character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
bzdw character varying(40) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
mjsl numeric(16,2) NOT NULL DEFAULT 0,
jldw character varying(40) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
jhjj numeric(16,2) NOT NULL DEFAULT 0,
jhsj numeric(16,2) NOT NULL DEFAULT 0,
bzcl numeric(16,2) NOT NULL DEFAULT 0,
jgdj numeric(16,2) NOT NULL DEFAULT 0,
jhpl numeric(16,2) NOT NULL DEFAULT 0,
mllb character varying(20) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
zjm character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
ckmc character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
scdw character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
ghdw character varying(200) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
sydw character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
sxyzbj character varying(10) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
sxsh boolean NOT NULL DEFAULT false,
sxshry character varying(40) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
jgyzbj character varying(10) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
jgsh boolean NOT NULL DEFAULT false,
jgshry character varying(40) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
clyzbj character varying(10) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
clsh boolean NOT NULL DEFAULT false,
clshry character varying(40) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
xmsh boolean NOT NULL DEFAULT false,
xmshry character varying(40) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
sfsd boolean NOT NULL DEFAULT false,
sfqy boolean NOT NULL DEFAULT false,
CONSTRAINT mlchxm_pkey PRIMARY KEY (chxh)
)
TABLESPACE pg_default;
ALTER TABLE IF EXISTS public.mlchxm
OWNER to postgres;
-- Table: public.mlny
-- DROP TABLE IF EXISTS public.mlny;
CREATE TABLE IF NOT EXISTS public.mlny
(
ny character(6) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::bpchar,
CONSTRAINT mlny_pkey PRIMARY KEY (ny)
)
TABLESPACE pg_default;
ALTER TABLE IF EXISTS public.mlny
OWNER to postgres;
-- Table: public.utzzch
-- DROP TABLE IF EXISTS public.utzzch;
CREATE TABLE IF NOT EXISTS public.utzzch
(
id integer NOT NULL DEFAULT nextval('utzzch_id_seq'::regclass),
ny character(6) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::bpchar,
ckmc character varying(100) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
chxh character varying(20) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
jldw character varying(20) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
qcjs integer NOT NULL DEFAULT 0,
qcsl numeric(16,2) NOT NULL DEFAULT 0,
qcdj numeric(16,2) NOT NULL DEFAULT 0,
qcje numeric(16,2) NOT NULL DEFAULT 0,
xqjs integer NOT NULL DEFAULT 0,
xqsl numeric(16,2) NOT NULL DEFAULT 0,
xqje numeric(16,2) NOT NULL DEFAULT 0,
jhjs integer NOT NULL DEFAULT 0,
jhsl numeric(16,2) NOT NULL DEFAULT 0,
jhje numeric(16,2) NOT NULL DEFAULT 0,
srjs integer NOT NULL DEFAULT 0,
srsl numeric(16,2) NOT NULL DEFAULT 0,
srje numeric(16,2) NOT NULL DEFAULT 0,
fcjs integer NOT NULL DEFAULT 0,
fcsl numeric(16,2) NOT NULL DEFAULT 0,
fcje numeric(16,2) NOT NULL DEFAULT 0,
jcjs integer NOT NULL DEFAULT 0,
jcsl numeric(16,2) NOT NULL DEFAULT 0,
jcdj numeric(16,2) NOT NULL DEFAULT 0,
jcje numeric(16,2) NOT NULL DEFAULT 0,
CONSTRAINT utzzch_pkey PRIMARY KEY (id)
)
TABLESPACE pg_default;
ALTER TABLE IF EXISTS public.utzzch
OWNER to postgres;
-- Table: public.utmxch
-- DROP TABLE IF EXISTS public.utmxch;
CREATE TABLE IF NOT EXISTS public.utmxch
(
id integer NOT NULL DEFAULT nextval('utmxch_id_seq'::regclass),
ny character(6) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::bpchar,
rq character varying(20) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
oid character varying(30) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
zy character varying(400) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
jldw character varying(20) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
rksl numeric(18,2) NOT NULL DEFAULT 0,
rkdj numeric(18,2) NOT NULL DEFAULT 0,
rkje numeric(18,2) NOT NULL DEFAULT 0,
cksl numeric(18,2) NOT NULL DEFAULT 0,
ckdj numeric(18,2) NOT NULL DEFAULT 0,
ckje numeric(18,2) NOT NULL DEFAULT 0,
jcsl numeric(18,2) NOT NULL DEFAULT 0,
jcdj numeric(18,2) NOT NULL DEFAULT 0,
jcje numeric(18,2) NOT NULL DEFAULT 0,
pcxh character varying(10) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
zzxh integer NOT NULL DEFAULT 0,
CONSTRAINT utmxch_pkey PRIMARY KEY (id)
)
TABLESPACE pg_default;
ALTER TABLE IF EXISTS public.utmxch
OWNER to postgres;
四、主要函数
SQL
-- FUNCTION: public.x9_chxh_dj(character varying, character varying, character varying)
-- DROP FUNCTION IF EXISTS public.x9_chxh_dj(character varying, character varying, character varying);
CREATE OR REPLACE FUNCTION public.x9_chxh_dj(
ssdqyh character varying,
ssdjmc character varying,
ssdjoid character varying)
RETURNS boolean
LANGUAGE 'plpgsql'
COST 100
VOLATILE PARALLEL UNSAFE
AS $BODY$
-- Description: 审核存货序号
-- 1、返回值为货号是否非法
-- 2、直接改单据行中的CHXH。
-- 3、只要有一行非法单据不应通过审核。本版将以前版本中的数值改为字符。如遇不足8位的,直接改为8位字符串。
-- 4、生成货号
-- 5、每次审核一张单据
-- 6、每件数据即包装大小应在规格中加以区别
DECLARE
ssmsg text;ssdet text;sstname text;sshint text;ssctt text; --错误处理
rs bool;
sssfzj bool;
ssscdw varchar(50);
ssghdw varchar(100);
rd record;
cs_djm refcursor;
ssixh int;
ssichxh varchar(20);
BEGIN
-- 声明游标
rs:=false;
IF $2 = '销售订单' OR $2 = '采购订单' OR $2 = '委外订单' OR
$2 = '盘点入库单' OR $2 = '采购入库单' OR $2 = '完工入库单' OR $2 = '委外入库单' THEN
OPEN cs_djm FOR
SELECT mid, chxh, chdh, xh1,xh2,xh3, gg1, gg2, gg3,jldw,bzdw,mjsl
FROM djchm WHERE (oid = $3);
sssfzj:=true;
END IF;
IF $2 = '销售出库单' OR $2 = '领用出库单' OR $2 = '委外出库单' OR $2 = '生产计划单' OR $2 = '需求计算单' THEN
OPEN cs_djm FOR
SELECT mid, chxh, chdh, xh1,xh2,xh3, gg1, gg2, gg3,jldw,bzdw,mjsl
FROM djchm WHERE (oid = $3);
sssfzj:=false;
END IF;
IF $2 = '成本核算单' THEN
OPEN cs_djm FOR
SELECT mid, chxh, chdh, xh1,xh2,xh3,gg1, gg2, gg3,jldw,'' AS bzdw,0 AS mjsl
FROM djcbhsm WHERE (oid = $3);
sssfzj:=false;
END IF;
IF $2 = '工序统计单' THEN
OPEN cs_djm FOR
SELECT mid, chxh, chdh, xh1,xh2,xh3,gg1, gg2, gg3,jldw ,'' AS bzdw,0 AS mjsl
FROM djgxtjm WHERE (oid = $3);
sssfzj:=false;
END IF;
IF $2 = '质量检验单' THEN
OPEN cs_djm FOR
SELECT mid, chxh, chdh, xh1,xh2,xh3,gg1, gg2, gg3,jldw,'' AS bzdw,0 AS mjsl
FROM djjym WHERE (oid = $3);
sssfzj:=false;
END IF;
LOOP
FETCH cs_djm INTO rd;
EXIT WHEN NOT FOUND;
-- 这里使用的是全部型号规格字段,根据需要可以减少
IF exists(SELECT chxh FROM mlchxm WHERE chdh = rd.chdh AND
xh1 = rd.xh1 AND xh2 = rd.xh2 AND xh3 = rd.xh3 AND
gg1 = rd.gg1 AND gg2 = rd.gg2 AND gg3 = rd.gg3 AND jldw = rd.jldw) THEN
-- 正确无误。启用存货目录。不需要对当前单据内容做出更改。
UPDATE mlch SET sfqy = true WHERE rd.chdh LIKE (chdh || '%') AND sfqy = false;
-- 启用目录
ELSE
-- 允许增加
IF sssfzj = true THEN
ssixh:=NULL;
ssixh:=x9_djmid('mlchxm','chxh');
IF NOT ssixh IS NULL THEN
ssichxh:=to_char(ssixh,'FM00000000');
SELECT scdw,ghdw INTO ssscdw,ssghdw FROM mlchxm WHERE chdh = rd.chdh ORDER BY chxh DESC LIMIT 1;
INSERT INTO mlchxm (chxh,sjdh,bjdh,chdh,chmc,xh1,xh2,xh3,gg1,gg2,gg3,
jldw,bzdw,mjsl,ckmc,mllb,ghdw,scdw,zjm,sfsd,jc)
SELECT ssichxh AS chxh,'' AS sjdh,ssichxh AS bjdh,chdh,chmc,rd.xh1,rd.xh2,rd.xh3,
rd.gg1,rd.gg2,rd.gg3,jldw,bzdw,rd.mjsl,ckmc,mllb,ssghdw,ssscdw,zjm,true AS sfsd,1 as jc
FROM mlch WHERE (chdh = rd.chdh);
UPDATE mlch SET sfqy = TRUE WHERE rd.chdh LIKE (chdh || '%') AND sfqy=false; -- 启用目录
END IF;
END IF;
END IF;
ssichxh:=NULL;
IF exists(SELECT chdh FROM mlch WHERE chdh = rd.chdh AND dcmx = true) THEN
SELECT chxh INTO ssichxh FROM mlchxm
WHERE chdh = rd.chdh AND xh1 = rd.xh1 AND xh2 = rd.xh2 AND xh3 = rd.xh3 AND
gg1 = rd.gg1 AND gg2 = rd.gg2 AND gg3 = rd.gg3 AND jldw = rd.jldw;
END IF;
IF ssichxh IS NULL THEN
ssichxh:='';
rs:=true;
END IF;
IF ssichxh <> rd.chxh OR ssichxh = '' THEN
IF $2 = '销售订单' OR $2 = '需求计算单' OR
$2 = '采购订单' OR $2 = '委外订单' OR $2 = '生产计划单' OR
$2 = '盘点入库单' OR $2 = '采购入库单' OR $2 = '完工入库单' OR $2 = '委外入库单' OR
$2 = '销售出库单' OR $2 = '领用出库单' OR $2 = '委外出库单' THEN
UPDATE djchm SET chxh = ssichxh WHERE mid = rd.mid;
END IF;
IF $2 = '成本核算单' THEN
UPDATE djcbhsm SET chxh = ssixh WHERE mid = rd.mid;
END IF;
IF $2 = '工序统计单' THEN
UPDATE djgxtjm SET chxh = ssixh WHERE mid = rd.mid;
END IF;
IF $2 = '质量检验单' THEN
UPDATE djjym SET chxh = ssixh WHERE mid = rd.mid;
END IF;
END IF;
END LOOP;
CLOSE cs_djm;
RETURN rs;
EXCEPTION WHEN others THEN
GET stacked DIAGNOSTICS ssmsg = MESSAGE_TEXT,ssdet = pg_exception_detail,
sstname = TABLE_NAME, sshint = pg_exception_hint, ssctt = pg_exception_context;
CALL x9_jlproc(ssmsg, ssdet, sstname, sshint, ssctt);
RETURN false;
END;
$BODY$;
ALTER FUNCTION public.x9_chxh_dj(character varying, character varying, character varying)
OWNER TO postgres;
-- FUNCTION: public.x9_djdj(character varying, character varying, character varying, character varying)
-- DROP FUNCTION IF EXISTS public.x9_djdj(character varying, character varying, character varying, character varying);
CREATE OR REPLACE FUNCTION public.x9_djdj(
ssdqyh character varying,
ssbjmc character varying,
ssdjmc character varying,
ssdjoid character varying)
RETURNS character varying
LANGUAGE 'plpgsql'
COST 100
VOLATILE PARALLEL UNSAFE
AS $BODY$
-- Description: 单据登记
-- 完成返回登记人,否则返回错误信息
DECLARE
sssfdj bool;
ssdjjg varchar; -- 登记结果
rsxx varchar;
ssglbj varchar(30);
BEGIN
-- 一、非账项登记类单据,直接标记登记并返回当前用户,也可反登记
IF $3 = '质量检验单' THEN
RETURN $1;
END IF;
IF $3 = '工序统计单' THEN
RETURN $1;
END IF;
-- 二 、登记前验证 可以多次验证 只验证当前单据涉及物料
IF $3 = '销售订单' OR $3 = '需求计算单' OR
$3 = '采购订单' OR $3 = '委外订单' OR $3 = '生产计划单' OR
$3 = '完工入库单' OR $3 = '委外入库单' OR $3 = '委外订单' OR
$3 = '销售出库单' OR $3 = '领用出库单' OR $3 = '委外出库单' THEN
IF exists(SELECT chxh FROM mlchxm WHERE (chxh IN (SELECT chxh FROM djchm WHERE oid = $4))
AND (sxyzbj <> '' OR clyzbj <> '' OR jgyzbj <> '')) THEN
rsxx:='各类存货单据登记之前,请确定:' || chr(13) || chr(10)
|| chr(13) || chr(10) || '正确设置物料的仓库名称、供货单位、生产单位;'
|| chr(13) || chr(10) || '正确设置物料的标准存量、计划批量、具有包装单位物料的每件数量;'
|| chr(13) || chr(10) || '正确设置物料的计划进价、计划售价、加工单价;'
|| chr(13) || chr(10) || '单据名称:' || $3 || ',单据号:' || $4;
RETURN rsxx;
END IF;
END IF;
IF $3 = '盘点入库单' THEN
IF exists(SELECT chxh FROM djchm WHERE oid = $4 AND (rkdj = 0 OR rkje = 0)) THEN
rsxx:= $3 || $4 || ',单据要求输入入库单价和金额!' ;
RETURN rsxx;
END IF;
END IF;
IF $3 = '采购入库单' THEN
IF exists(SELECT chxh FROM djchm WHERE oid = $4 AND (cgdj = 0 OR cgje = 0)) THEN
rsxx:=$3 || $4 || ',单据要求输入入库单价和金额!' ;
RETURN rsxx;
END IF;
END IF;
IF $3 = '需求计算单' THEN
SELECT glbj INTO ssglbj FROM djcho WHERE oid = $4;
IF exists(SELECT oid FROM djcho WHERE djmc = '销售订单' AND oid = ssglbj AND glbj <> '') THEN
rsxx:='销售订单' || ssglbj || ',已经登记过关联的需求计算单,本单不能重复登记!';
RETURN rsxx;
END IF;
END IF;
-- 三、登记
-- 存货单据 需求、计划、完成、交付
IF $3 = '销售订单' OR $3 = '需求计算单' OR
$3 = '采购订单' OR $3 = '委外订单' OR $3 = '生产计划单' OR
$3 = '盘点入库单' OR $3 = '采购入库单' OR $3 = '完工入库单' OR $3 = '委外入库单' OR
$3 = '销售出库单' OR $3 = '领用出库单' OR $3 = '委外出库单' THEN
SELECT CASE WHEN djr <> '' OR shr = '' THEN true ELSE false END INTO sssfdj FROM djcho WHERE oid = $4;
IF sssfdj = true THEN
rsxx:=$3 || $4 || '已经登记或未经审核,本单据不支持反登记!';
ELSE
IF $3 = '销售订单' OR $3 = '需求计算单' THEN
ssdjjg:=x9_djdj_01xq($1,$3,$4);
END IF;
IF $3 = '采购订单' OR $3 = '委外订单' OR $3 = '生产计划单' THEN
ssdjjg:=x9_djdj_02jh($1,$3,$4);
END IF;
IF $3 = '采购入库单' OR $3 = '完工入库单' OR $3 = '委外入库单' OR $3 = '盘点入库单' THEN
ssdjjg:=x9_djdj_03wc($1,$3,$4);
END IF;
IF $3 = '销售出库单' OR $3 = '领用出库单' OR $3 = '委外出库单' THEN
ssdjjg:=x9_djdj_04jf($1,$3,$4);
END IF;
IF ssdjjg = '登记完成' THEN
UPDATE djcho SET djrq = CURRENT_DATE WHERE oid = $4;
rsxx:=$1;
ELSE
rsxx:= $3 || $4 || '登记未能完成'|| chr(10)||ssdjjg ;
END IF;
END IF;
RETURN rsxx;
END IF;
IF $3 = '计件工作量统计表' THEN
IF exists(SELECT oid FROM gzjjo WHERE shr = '' AND oid = $4) THEN
rsxx:=$3 || $4 || '未经审核';
ELSE
rsxx = $1;
END IF;
RETURN rsxx;
END IF;
IF $3 = '收款单' OR $3 = '付款单' THEN
SELECT CASE WHEN djr <> '' OR shr = '' THEN true ELSE false END into sssfdj FROM djcno WHERE oid = $4;
IF sssfdj = true THEN
rsxx:= $3 || $4 || '已经登记或未经审核';
ELSE
ssdjjg:=x9_djdj_06cn($1,$3,$4);
IF ssdjjg = '登记完成' THEN
rsxx:= $1;
ELSE
rsxx:= $3 || $4 || '登记未能完成'|| chr(10)||ssdjjg ;
END IF ;
END IF;
RETURN rsxx;
END IF;
IF $3 = '记账凭证' THEN
SELECT CASE WHEN djr <> '' THEN true ELSE false END INTO sssfdj FROM djjzpzo WHERE oid = $4;
IF sssfdj = true THEN
-- 反记账
ssdjjg:=x9_djdj_05jzfx($1,$3,$4);
IF ssdjjg = '登记完成' THEN
rsxx:= $1;
ELSE
rsxx:= $3 || $4 || '反记账未能完成'|| chr(10)||ssdjjg ;
END IF ;
ELSE
ssdjjg:=x9_djdj_05jz($1,$3,$4);
IF ssdjjg = '登记完成' THEN
rsxx:= $1;
ELSE
rsxx:= $3 || $4 || '登记未能完成'|| chr(10)||ssdjjg ;
END IF ;
END IF;
RETURN rsxx;
END IF;
IF $3 = '成本归集单' THEN
SELECT CASE WHEN djr <> '' THEN true ELSE false END INTO sssfdj FROM djcbgjo WHERE oid = $4;
IF sssfdj = true THEN
DELETE FROM djcbgjs where oid=$4;
END IF;
rsxx:=$1;
RETURN rsxx;
END IF;
IF $3 = '成本核算单' THEN
SELECT CASE WHEN djr <> '' THEN true ELSE false END INTO sssfdj FROM djcbhso WHERE oid = $4;
IF sssfdj = true THEN
update djcbhsm set cpcb=0,zjcl=0,zjrg=0,jjcl=0,jjrg=0,zzfy=0,glfy=0,cpml=0,dwcb=0 where oid=$4;
END IF;
rsxx:=$1;
RETURN rsxx;
END IF;
END;
$BODY$;
ALTER FUNCTION public.x9_djdj(character varying, character varying, character varying, character varying)
OWNER TO postgres;
-- FUNCTION: public.x9_djdj_01xq(character varying, character varying, character varying)
-- DROP FUNCTION IF EXISTS public.x9_djdj_01xq(character varying, character varying, character varying);
CREATE OR REPLACE FUNCTION public.x9_djdj_01xq(
ssdqyh character varying,
ssdjmc character varying,
ssdjoid character varying)
RETURNS character varying
LANGUAGE 'plpgsql'
COST 100
VOLATILE PARALLEL UNSAFE
AS $BODY$
-- Description: 单据登记 需求:销售订单、需求计算单
DECLARE
ssmsg text;ssdet text;sstname text;sshint text;ssctt text; --错误处理
rd record;
ssny char(6);ssjhjj decimal(16,2);ssjcdj decimal(16,2);ssglbj varchar(30);
cs_xq CURSOR FOR
SELECT dj.mid,dj.chxh,dj.bzjs,dj.xqsl,dj.xqje,xm.ckmc
FROM djchm dj INNER JOIN mlchxm xm ON dj.chxh = xm.chxh WHERE dj.oid = $3;
BEGIN
-- 单据头数据 单据头不输入仓库名称,直接取自MLCHXM
-- 标记登记\更新单据体日期
ssny:=x9_dqny();
IF $2 = '销售订单' THEN
-- select * from djchm
-- 优先使用结存单价,其次使用计划进价
UPDATE djchm SET xqsl = xssl,sfdj = true,djrq = CURRENT_DATE WHERE oid = $3;
UPDATE djchm dd SET xqdj = zz.jcdj FROM utzzch zz where zz.chxh = dd.chxh
AND zz.jcdj > 0 AND dd.oid = $3 AND zz.ny = ssny;
UPDATE djchm dd SET xqdj = xm.jhjj FROM mlchxm xm where xm.chxh = dd.chxh
AND dd.oid = $3 AND dd.xqdj = 0;
UPDATE djchm SET xqje = xqsl * xqdj WHERE oid = $3;
END IF;
IF $2 = '需求计算单' THEN
SELECT glbj into ssglbj FROM djcho WHERE oid = $3 ;
UPDATE djcho SET glbj = $3 WHERE oid = ssglbj; -- 销售订单中标记需求计算单号
UPDATE djchm SET sfdj = true,djrq = CURRENT_DATE WHERE oid = $3;
UPDATE djchm dd SET xqdj = zz.jcdj FROM utzzch zz where zz.chxh = dd.chxh
AND zz.jcdj > 0 AND dd.oid = $3 AND zz.ny = ssny;
UPDATE djchm dd SET xqdj = xm.jhjj FROM mlchxm xm WHERE xm.chxh = dd.chxh
AND dd.oid = $3 AND dd.xqdj = 0;
UPDATE djchm SET xqje = xqsl * xqdj WHERE oid = $3;
WITH sjxm (chxh,sydw) AS
(SELECT dj.chxh,CASE mllb WHEN '自制' THEN scdw WHEN '外协' THEN ghdw ELSE '' END AS sydw
FROM mlchxm xm INNER JOIN djchm dj ON dj.clyt = xm.chxh
WHERE dj.oid = $3 AND dj.clyt <> '')
UPDATE mlchxm xm SET sydw = sj.sydw FROM sjxm sj where sj.chxh = xm.chxh AND sj.sydw <> '';
END IF;
-- 标记登记
UPDATE djcho SET djr = $1 WHERE oid = $3;
-- 声明游标CS_XQ
OPEN cs_xq;
LOOP
FETCH cs_xq INTO rd;
EXIT WHEN NOT FOUND;
-- 增加新账
IF NOT exists(SELECT * FROM utzzch WHERE ny = ssny AND ckmc = rd.ckmc AND chxh = rd.chxh ) THEN
INSERT INTO utzzch(ny,ckmc,chxh) VALUES (ssny,rd.ckmc,rd.chxh);
END IF;
-- 登记总账
UPDATE utzzch SET xqjs = xqjs + rd.bzjs,xqsl = xqsl + rd.xqsl,xqje = xqje + rd.xqje
WHERE ny = ssny AND ckmc = rd.ckmc AND chxh = rd.chxh;
END LOOP;
CLOSE cs_xq;
RETURN '登记完成';
EXCEPTION WHEN others THEN
GET stacked DIAGNOSTICS ssmsg = MESSAGE_TEXT,ssdet = pg_exception_detail,
sstname = TABLE_NAME, sshint = pg_exception_hint, ssctt = pg_exception_context;
CALL x9_jlproc(ssmsg, ssdet, sstname, sshint, ssctt);
RETURN ssmsg;
END;
$BODY$;
ALTER FUNCTION public.x9_djdj_01xq(character varying, character varying, character varying)
OWNER TO postgres;
-- FUNCTION: public.x9_djdj_02jh(character varying, character varying, character varying)
-- DROP FUNCTION IF EXISTS public.x9_djdj_02jh(character varying, character varying, character varying);
CREATE OR REPLACE FUNCTION public.x9_djdj_02jh(
ssdqyh character varying,
ssdjmc character varying,
ssdjoid character varying)
RETURNS character varying
LANGUAGE 'plpgsql'
COST 100
VOLATILE PARALLEL UNSAFE
AS $BODY$
-- Description: 单据登记 计划: 采购订单、委外订单、生产计划单
DECLARE
ssmsg text;ssdet text;sstname text;sshint text;ssctt text; --错误处理
rd record;
ssny char(6);
ssjhjj decimal(16,2);
ssjcdj decimal(16,2);
cs_jh CURSOR FOR
SELECT dj.mid,dj.chxh,dj.bzjs,dj.jhsl,dj.jhje,dj.jgsl,dj.jgje,dj.cgsl,dj.cgje,dj.zzse,xm.ckmc
FROM djchm dj INNER JOIN mlchxm xm ON dj.chxh = xm.chxh
WHERE dj.oid = $3;
BEGIN
-- 单据头数据 不在单据头中输入仓库名称,直接取自MLCHXM
-- 标记登记\更新单据体日期
UPDATE djchm SET sfdj = true,djrq = CURRENT_DATE WHERE oid = $3;
-- 标记登记
UPDATE djcho SET djr = $1 WHERE oid = $3;
IF $2 = '采购订单' THEN
UPDATE djchm SET jhsl = cgsl,jhdj = (cgje - zzse) / cgsl,jhje = cgje - zzse WHERE oid = $3;
END IF;
ssny:=x9_dqny();
OPEN cs_jh;
LOOP
FETCH cs_jh INTO rd;
EXIT WHEN NOT FOUND;
-- 增加新账
IF NOT exists(SELECT * FROM utzzch WHERE ny = ssny AND ckmc = rd.ckmc AND chxh = rd.chxh ) THEN
INSERT INTO utzzch(ny,ckmc,chxh) VALUES (ssny,rd.ckmc,rd.chxh);
END IF;
-- 登记总账
IF $2 = '采购订单' THEN
UPDATE utzzch SET jhjs = jhjs + rd.bzjs,jhsl = jhsl + rd.jhsl,jhje = jhje + rd.jhje
WHERE ny = ssny AND ckmc = rd.ckmc AND chxh = rd.chxh;
END IF;
IF $2 = '委外订单' THEN
-- 委外订单,输入JGJS,JGSL,JGDJ,JGJE,加工数在总账中不体现,只登记计划数:JHJE,JHSL,JHDJ,JHJE.
-- 计划进价为全价,含加工费。先取结存单价,没有取计划进价,所以计划数不涉及税额
SELECT jhjj INTO ssjhjj FROM mlchxm WHERE chxh = rd.chxh;
SELECT jcdj INTO ssjcdj FROM utzzch WHERE ny = ssny AND ckmc = rd.ckmc AND chxh = rd.chxh;
rd.jhje:=x9_iif(ssjcdj > 0,ssjcdj,ssjhjj) * rd.jgsl;
UPDATE utzzch SET jhjs = jhjs + rd.bzjs,jhsl = jhsl + rd.jgsl,jhje = jhje + rd.jhje
WHERE ny = ssny AND ckmc = rd.ckmc AND chxh = rd.chxh;
UPDATE djchm SET jhsl = jgsl,jhdj = CASE WHEN ssjcdj > 0 THEN ssjcdj ELSE ssjhjj END,
jhje = rd.jhje WHERE mid = rd.mid;
END IF;
IF $2 = '生产计划单' THEN
-- 计划进价为全价,含加工费。先取结存单价,没有取计划进价
SELECT jhjj INTO ssjhjj FROM mlchxm WHERE chxh = rd.chxh;
SELECT jcdj INTO ssjcdj FROM utzzch WHERE ny = ssny AND ckmc = rd.ckmc AND chxh = rd.chxh;
rd.jhje:=x9_iif(ssjcdj > 0,ssjcdj,ssjhjj) * rd.jhsl;
UPDATE utzzch SET jhjs = jhjs + rd.bzjs,jhsl = jhsl + rd.jhsl,jhje = jhje + rd.jhje
WHERE ny = ssny AND ckmc = rd.ckmc AND chxh = rd.chxh;
UPDATE djchm SET jhdj = CASE WHEN ssjcdj > 0 THEN ssjcdj ELSE ssjhjj END,
jhje = rd.jhje WHERE mid = rd.mid;
END IF;
END LOOP;
CLOSE cs_jh;
IF $2 = '生产计划单' THEN
--生成车间作业计划
INSERT INTO utcjzy (mid,oid,ny,rq,chxh,chdh,chmc,xh1,xh2,xh3,gg1,ckmc,scbm,jfrq,jldw,
jhsl,pcsl,pcrq,pcyq,sfsh,shr,mhh)
SELECT m.mid,m.oid,m.ny,o.rq,m.chxh,m.chdh,m.chmc,m.xh1,m.xh2,m.xh3,m.gg1,
o.ckmc,o.scbm,o.jfrq,m.jldw,m.jhsl,m.jhsl AS pcsl,o.rq AS pcrq,'' AS pcyq,sfsh,shr,mid AS mhh
FROM djcho o INNER JOIN djchm m ON o.oid = m.oid WHERE o.oid = $3;
END IF;
RETURN '登记完成';
EXCEPTION WHEN others THEN
GET stacked DIAGNOSTICS ssmsg = MESSAGE_TEXT,ssdet = pg_exception_detail,
sstname = TABLE_NAME, sshint = pg_exception_hint, ssctt = pg_exception_context;
CALL x9_jlproc(ssmsg, ssdet, sstname, sshint, ssctt);
RETURN ssmsg;
END;
$BODY$;
ALTER FUNCTION public.x9_djdj_02jh(character varying, character varying, character varying)
OWNER TO postgres;
-- FUNCTION: public.x9_djdj_03wc(character varying, character varying, character varying)
-- DROP FUNCTION IF EXISTS public.x9_djdj_03wc(character varying, character varying, character varying);
CREATE OR REPLACE FUNCTION public.x9_djdj_03wc(
ssdqyh character varying,
ssdjmc character varying,
ssdjoid character varying)
RETURNS character varying
LANGUAGE 'plpgsql'
COST 100
VOLATILE PARALLEL UNSAFE
AS $BODY$
-- Description: 单据登记 完成:盘点入库、采购入库、完工入库、委外入库
DECLARE
ssmsg text;ssdet text;sstname text;sshint text;ssctt text; --错误处理
rd record;
ssny char(6);ssjhjj decimal(16,2);ssjcdj decimal(16,2);ssrkdj decimal(16,2);
ssjswb varchar(20);ssckmc varchar(50);sswldw varchar(150);
cs_wc CURSOR FOR
SELECT mid,chxh,bzjs,rksl,rkje,jgje,cgje,wbje,zzse
FROM djchm WHERE oid = $3;
BEGIN
-- 单据头数据
SELECT jswb,ckmc,wldw INTO ssjswb,ssckmc,sswldw FROM djcho WHERE oid = $3 ;
-- 标记登记\更新单据体日期
UPDATE djchm SET sfdj = true,djrq = CURRENT_DATE WHERE oid = $3;
IF $2 = '委外入库单' THEN
UPDATE djchm SET rksl = jgsl WHERE oid = $3;
END IF;
IF $2 = '采购入库单' THEN
UPDATE djchm SET rksl = cgsl,rkdj = (cgje - zzse) / cgsl,rkje = cgje - zzse WHERE oid = $3;
END IF;
-- 标记登记
UPDATE djcho SET djr = $1 WHERE oid = $3;
-- 声明变量 单据体数据
ssny:=x9_dqny();
OPEN cs_wc;
LOOP
FETCH cs_wc INTO rd;
EXIT WHEN NOT FOUND;
-- 增加新账
IF NOT exists(SELECT * FROM utzzch WHERE ny = ssny AND ckmc = ssckmc AND chxh = rd.chxh ) THEN
INSERT INTO utzzch(ny,ckmc,chxh) VALUES (ssny,ssckmc,rd.chxh);
END IF;
IF sswldw <> '' AND (NOT exists(SELECT * FROM utzzwl WHERE ny = ssny AND wldw = sswldw)) THEN
INSERT INTO utzzwl(ny,wldw,wbmc) VALUES (ssny,sswldw,ssjswb);
UPDATE mlwl SET sfqy = true WHERE sfqy = false AND sswldw LIKE wldh || '%'; -- 启用目录
END IF;
-- 登记总账
IF $2 = '盘点入库单' THEN
UPDATE utzzch SET srjs = srjs + rd.bzjs,jcjs = jcjs + rd.bzjs,srsl = srsl + rd.rksl,jcsl = jcsl + rd.rksl,
srje = srje + rd.rkje,jcje = jcje + rd.rkje
WHERE ny = ssny AND ckmc = ssckmc AND chxh = rd.chxh;
END IF;
IF $2 = '采购入库单' THEN
-- 金额含税 存货账不含税,往来账含税,外币金额为含税
UPDATE utzzch SET srjs = srjs + rd.bzjs,jcjs = jcjs + rd.bzjs,srsl = srsl + rd.rksl,
jcsl = jcsl + rd.rksl,srje = srje + rd.rkje,jcje = jcje + rd.rkje
WHERE ny = ssny AND ckmc = ssckmc AND chxh = rd.chxh;
UPDATE utzzwl SET dffs = dffs + rd.cgje,ymye = ymye - rd.cgje,
wbdf = wbdf + rd.wbje,wbym = wbym - rd.wbje
WHERE ny = ssny AND wldw = sswldw;
END IF;
IF $2 = '完工入库单' THEN
-- 只输入数量。
-- 计划进价为全价,含加工费。先取结存单价,没有再取计划进价
SELECT jhjj INTO ssjhjj FROM mlchxm WHERE chxh = rd.chxh;
SELECT jcdj INTO ssjcdj FROM utzzch WHERE ny = ssny AND ckmc = ssckmc AND chxh = rd.chxh;
ssrkdj:=x9_iif(ssjcdj > 0,ssjcdj,ssjhjj);
rd.rkje:=ssrkdj * rd.rksl;
UPDATE utzzch SET srjs = srjs + rd.bzjs,jcjs = jcjs + rd.bzjs,srsl = srsl + rd.rksl,jcsl = jcsl + rd.rksl,
srje = srje + rd.rkje,jcje = jcje + rd.rkje
WHERE ny = ssny AND ckmc = ssckmc AND chxh = rd.chxh;
UPDATE djchm SET rkdj = ssrkdj,rkje = rd.rkje WHERE mid = rd.mid;
END IF;
IF $2 = '委外入库单' THEN
-- 计划进价为成本价,不含税,含加工费。先取结存单价,没有取计划进价
-- 加工金额为含税,委外单位无外币结算
SELECT jhjj INTO ssjhjj FROM mlchxm WHERE chxh = rd.chxh;
SELECT jcdj INTO ssjcdj FROM utzzch WHERE ny = ssny AND ckmc = ssckmc AND chxh = rd.chxh;
ssrkdj:=x9_iif(ssjcdj > 0,ssjcdj,ssjhjj);
rd.rkje:=ssrkdj * rd.rksl;
UPDATE utzzch SET srjs = srjs + rd.bzjs,jcjs = jcjs + rd.bzjs,srsl = srsl + rd.rksl,jcsl = jcsl + rd.rksl,
srje = srje + rd.rkje,jcje = jcje + rd.rkje
WHERE ny = ssny AND ckmc = ssckmc AND chxh = rd.chxh;
UPDATE djchm SET rkdj = ssrkdj,rkje = rd.rkje WHERE mid = rd.mid;
UPDATE utzzwl SET dffs = dffs + rd.jgje,ymye = ymye - (rd.jgje)
WHERE ny = ssny AND wldw = sswldw;
END IF;
UPDATE utzzch SET jcdj = jcje / jcsl
WHERE ny = ssny AND ckmc = ssckmc AND chxh = rd.chxh AND jcsl <> 0;
UPDATE mlck SET sfqy = true WHERE sfqy = false AND ssckmc LIKE ckmc || '%'; -- 启用仓库目录
END LOOP;
CLOSE cs_wc;
RETURN '登记完成';
EXCEPTION WHEN others THEN
GET stacked DIAGNOSTICS ssmsg = MESSAGE_TEXT,ssdet = pg_exception_detail,
sstname = TABLE_NAME, sshint = pg_exception_hint, ssctt = pg_exception_context;
CALL x9_jlproc(ssmsg, ssdet, sstname, sshint, ssctt);
RETURN ssmsg;
END;
$BODY$;
ALTER FUNCTION public.x9_djdj_03wc(character varying, character varying, character varying)
OWNER TO postgres;
-- FUNCTION: public.x9_djdj_04jf(character varying, character varying, character varying)
-- DROP FUNCTION IF EXISTS public.x9_djdj_04jf(character varying, character varying, character varying);
CREATE OR REPLACE FUNCTION public.x9_djdj_04jf(
ssdqyh character varying,
ssdjmc character varying,
ssdjoid character varying)
RETURNS character varying
LANGUAGE 'plpgsql'
COST 100
VOLATILE PARALLEL UNSAFE
AS $BODY$
-- Description: 单据登记。交付。委外出库单、领用出库单、销售出库单。
DECLARE
ssmsg text;ssdet text;sstname text;sshint text;ssctt text; --错误处理
rd record;
ssny char(6);ssjcdj decimal(16,2);
ssjswb varchar(20);ssckmc varchar(50);sswldw varchar(150);
cs_jf CURSOR FOR
SELECT mid,chxh,bzjs,cksl,ckje,xssl,xsje,wbje,zzse,wbse
FROM djchm WHERE oid = $3;
BEGIN
-- 单据头数据
SELECT jswb,ckmc,wldw INTO ssjswb,ssckmc,sswldw FROM djcho WHERE oid = $3 ;
-- 标记登记\更新单据体日期
UPDATE djchm SET sfdj = true,djrq = CURRENT_DATE WHERE oid = $3;
-- 标记登记
UPDATE djcho SET djr = $1 WHERE oid = $3;
-- 声明变量 单据体数据
ssny:=x9_dqny();
OPEN cs_jf;
LOOP
FETCH cs_jf INTO rd;
EXIT WHEN NOT FOUND;
-- 增加新账
IF NOT exists(SELECT * FROM utzzch WHERE ny = ssny AND ckmc = ssckmc AND chxh = rd.chxh ) THEN
SELECT jhjj INTO ssjcdj FROM mlchxm WHERE chxh = rd.chxh ;
INSERT INTO utzzch(ny,ckmc,chxh,jcdj) VALUES (ssny,ssckmc,rd.chxh,ssjcdj);
END IF;
IF sswldw <> '' AND (NOT exists(SELECT * FROM utzzwl WHERE ny = ssny AND wldw = sswldw)) THEN
INSERT INTO utzzwl(ny,wldw,wbmc) VALUES (ssny,sswldw,ssjswb);
UPDATE mlwl SET sfqy = true WHERE sfqy = false AND sswldw LIKE wldh || '%'; -- 启用目录
END IF;
-- 登记总账和单据中的出库单价、金额
IF $2 = '领用出库单' THEN
SELECT jcdj INTO ssjcdj FROM utzzch WHERE ny = ssny AND ckmc = ssckmc AND chxh = rd.chxh;
UPDATE utzzch SET fcjs = fcjs + rd.bzjs,jcjs = jcjs - rd.bzjs,fcsl = fcsl + rd.cksl,
jcsl = jcsl - rd.cksl,fcje = fcje + rd.cksl * ssjcdj,jcje = jcje - rd.cksl * ssjcdj
WHERE ny = ssny AND ckmc = ssckmc AND chxh = rd.chxh;
UPDATE djchm SET ckdj = ssjcdj,ckje = rd.cksl * ssjcdj WHERE mid = rd.mid;
END IF;
IF $2 = '委外出库单' THEN
SELECT jcdj INTO ssjcdj FROM utzzch WHERE ny = ssny AND ckmc = ssckmc AND chxh = rd.chxh;
UPDATE utzzch SET fcjs = fcjs + rd.bzjs,jcjs = jcjs - rd.bzjs,fcsl = fcsl + rd.cksl,
jcsl = jcsl - rd.cksl,fcje = fcje + ssjcdj * rd.cksl,jcje = jcje - rd.cksl * ssjcdj
WHERE ny = ssny AND ckmc = ssckmc AND chxh = rd.chxh;
UPDATE djchm SET ckdj = ssjcdj,ckje = rd.cksl * ssjcdj WHERE mid = rd.mid;
END IF;
IF $2 = '销售出库单' THEN
IF NOT exists(SELECT * FROM utzzxs WHERE ny = ssny AND wldw = sswldw AND
jswb = ssjswb AND chxh = rd.chxh ) THEN
-- 增加新账,销售总账
INSERT INTO utzzxs(ny,wldw,jswb,chxh) VALUES (ssny,sswldw,ssjswb,rd.chxh);
END IF;
-- 输入的是XSJS,XSSL,XSJE,需求登记CKJS,CKSL,CKJE和销售账项
rd.cksl = rd.xssl;
SELECT jcdj INTO ssjcdj FROM utzzch WHERE ny = ssny AND ckmc = ssckmc AND chxh = rd.chxh;
UPDATE utzzch SET fcjs = fcjs + rd.bzjs,jcjs = jcjs - rd.bzjs,fcsl = fcsl + rd.cksl,
jcsl = jcsl - rd.cksl,fcje = fcje + ssjcdj * rd.cksl,jcje = jcje - rd.cksl * ssjcdj
WHERE ny = ssny AND ckmc = ssckmc AND chxh = rd.chxh;
UPDATE utzzxs SET xsjs = xsjs + rd.bzjs,xssl = xssl + rd.cksl,xsje = xsje + rd.xsje - rd.zzse,
xsse = xsse + rd.zzse,wbje = wbje + rd.wbje,wbse = wbse + rd.wbse
WHERE ny = ssny AND wldw = sswldw AND chxh = rd.chxh;
UPDATE djchm SET cksl = rd.cksl,ckdj = ssjcdj,ckje = rd.cksl * ssjcdj WHERE mid = rd.mid;
UPDATE utzzwl SET jffs = jffs + rd.xsje,ymye = ymye + rd.xsje,
wbjf = wbjf + rd.wbje,wbym = wbym + rd.wbje
WHERE ny = ssny AND wldw = sswldw;
END IF;
UPDATE utzzch SET jcdj = jcje / jcsl
WHERE ny = ssny AND ckmc = ssckmc AND chxh = rd.chxh AND jcsl <> 0;
UPDATE utzzxs SET xsdj = xsje / xssl
WHERE ny = ssny AND wldw = sswldw AND chxh = rd.chxh AND xssl <> 0;
UPDATE utzzxs xs SET xscbdj = ch.fcje / ch.fcsl,
xscbje = CASE WHEN xs.xssl = ch.fcsl THEN ch.fcje ELSE xs.xssl * (ch.fcje / ch.fcsl) END
FROM utzzch ch WHERE xs.ny = ch.ny AND xs.chxh = ch.chxh
AND xs.ny = ssny AND xs.wldw = sswldw AND xs.chxh = rd.chxh AND ch.fcsl <> 0;
UPDATE mlck SET sfqy = true WHERE sfqy = false AND ssckmc LIKE ckmc || '%'; -- 启用仓库目录
END LOOP;
CLOSE cs_jf;
RETURN '登记完成';
EXCEPTION WHEN others THEN
GET stacked DIAGNOSTICS ssmsg = MESSAGE_TEXT,ssdet = pg_exception_detail,
sstname = TABLE_NAME, sshint = pg_exception_hint, ssctt = pg_exception_context;
CALL x9_jlproc(ssmsg, ssdet, sstname, sshint, ssctt);
RETURN ssmsg;
END;
$BODY$;
ALTER FUNCTION public.x9_djdj_04jf(character varying, character varying, character varying)
OWNER TO postgres;
-- FUNCTION: public.x9_djdj_05jz(character varying, character varying, character varying)
-- DROP FUNCTION IF EXISTS public.x9_djdj_05jz(character varying, character varying, character varying);
CREATE OR REPLACE FUNCTION public.x9_djdj_05jz(
ssdqyh character varying,
ssdjmc character varying,
ssdjoid character varying)
RETURNS character varying
LANGUAGE 'plpgsql'
COST 100
VOLATILE PARALLEL UNSAFE
AS $BODY$
-- Description:记账凭证登记
DECLARE
ssmsg text;ssdet text;sstname text;sshint text;ssctt text; --错误处理
rd record;
ssrq date;
ssny char(6);sssy char(6);sszzxh int;
cs_jz CURSOR FOR
SELECT kmdh,wldw,wlry,hsbm,hbmc,jfje, dfje, slwb,mid
FROM djjzpzm
WHERE (oid = $3) AND sfsh = true
ORDER BY kmdh,wldw,wlry,hsbm,hbmc;
BEGIN
-- 允许登记到本月及上月凭证
-- 登记单据
SELECT rq INTO ssrq FROM djjzpzo WHERE oid = $3 ;
UPDATE djjzpzm SET rq = ssrq WHERE oid = $3;
sssy:=x9_dqsy();
SELECT ny INTO ssny FROM djjzpzo WHERE oid = $3;
sszzxh:=0;
OPEN cs_jz;
LOOP
FETCH cs_jz INTO rd;
EXIT WHEN NOT FOUND;
-- 登记会计总账
IF exists(SELECT * FROM utzzkj WHERE ny = ssny AND kmdh = rd.kmdh AND wldw = rd.wldw
AND wlry = rd.wlry AND hsbm = rd.hsbm AND hbmc = rd.hbmc) THEN
IF rd.slwb <> 0 THEN
IF rd.jfje <> 0 THEN
UPDATE utzzkj SET sljf = sljf + rd.slwb,slym = slym + rd.slwb
WHERE ny = ssny AND kmdh = rd.kmdh AND wldw = rd.wldw AND wlry = rd.wlry
AND hsbm = rd.hsbm AND hbmc = rd.hbmc;
ELSE
UPDATE utzzkj SET sldf = sldf + rd.slwb,slym = slym - rd.slwb
WHERE ny = ssny AND kmdh = rd.kmdh AND wldw = rd.wldw AND wlry = rd.wlry
AND hsbm = rd.hsbm AND hbmc = rd.hbmc;
END IF;
END IF;
UPDATE utzzkj SET jejf = jejf + rd.jfje,jedf = jedf + rd.dfje,jeym = jeym + rd.jfje - rd.dfje ,zzxh = zzxh + 1
WHERE ny = ssny AND kmdh = rd.kmdh AND wldw = rd.wldw AND wlry = rd.wlry
AND hsbm = rd.hsbm AND hbmc = rd.hbmc;
SELECT zzxh INTO sszzxh FROM utzzkj
WHERE ny = ssny AND kmdh = rd.kmdh AND wldw = rd.wldw AND wlry = rd.wlry
AND hsbm = rd.hsbm AND hbmc = rd.hbmc;
UPDATE djjzpzm SET zzxh = sszzxh
WHERE mid = rd.mid;
ELSE
IF rd.jfje <> 0 THEN
INSERT INTO utzzkj(ny,kmdh,wldw,wlry,hsbm,hbmc,slyc,sljf,sldf,slym,jeyc,jejf,jedf,jeym)
VALUES(ssny,rd.kmdh,rd.wldw,rd.wlry,rd.hsbm,rd.hbmc,0 ,rd.slwb,0,rd.slwb,0,rd.jfje,0,rd.jfje);
ELSE
INSERT INTO utzzkj(ny,kmdh,wldw,wlry,hsbm,hbmc,slyc,sljf,sldf,slym,jeyc,jejf,jedf,jeym)
VALUES(ssny,rd.kmdh,rd.wldw,rd.wlry,rd.hsbm,rd.hbmc,0 ,0,rd.slwb,0 - rd.slwb,0,0,rd.dfje,0 - rd.dfje);
END IF;
END IF;
END LOOP;
CLOSE cs_jz;
UPDATE djjzpzo SET djr = $1 WHERE oid = $3 AND shr <> '';
UPDATE djjzpzm SET sfdj = true WHERE oid = $3 AND sfsh = true;
IF ssny = sssy THEN
-- 更新当月会计总账期初数及期末数,即可以登记到上月
WITH syzz (kmdh, hsbm ,wldw,wlry,hbmc, slyc, sljf, sldf, slym, jeyc, jejf, jedf, jeym) AS
(SELECT kmdh, hsbm ,wldw,wlry,hbmc, slyc, sljf, sldf, slym, jeyc, jejf, jedf, jeym
FROM utzzkj WHERE (ny = sssy))
UPDATE utzzkj dyzz SET slyc = syzz.slym,jeyc = syzz.jeym
FROM syzz WHERE (dyzz.kmdh = syzz.kmdh AND
dyzz.hsbm = syzz.hsbm AND dyzz.wldw = syzz.wldw
AND dyzz.wlry = syzz.wlry AND dyzz.hbmc = syzz.hbmc)
AND dyzz.ny = ssny;
UPDATE utzzkj SET slym = slyc + sljf - sldf,jeym = jeyc + jejf - jedf
WHERE ny = ssny;
-- 生成空账
INSERT INTO utzzkj (ny, kmdh, hsbm ,wldw,wlry,hbmc, slyc, sljf, sldf, slym, jeyc, jejf, jedf, jeym, zzxh)
SELECT ssny AS ny, kmdh, hsbm, wldw,wlry, hbmc, slym AS slyc,
0 AS sljf, 0 AS sldf, slym, jeym AS jeyc, 0 AS jejf, 0 AS jedf,
jeym, zzxh
FROM utzzkj AS syzz
WHERE (ny = sssy) AND (kmdh || hsbm || wldw || wlry || hbmc) NOT IN
(SELECT kmdh || hsbm || wldw || wlry || hbmc FROM utzzkj AS dyzz WHERE ny = ssny);
END IF;
RETURN '登记完成';
EXCEPTION WHEN others THEN
GET stacked DIAGNOSTICS ssmsg = MESSAGE_TEXT,ssdet = pg_exception_detail,
sstname = TABLE_NAME, sshint = pg_exception_hint, ssctt = pg_exception_context;
CALL x9_jlproc(ssmsg, ssdet, sstname, sshint, ssctt);
RETURN ssmsg;
END;
$BODY$;
ALTER FUNCTION public.x9_djdj_05jz(character varying, character varying, character varying)
OWNER TO postgres;
-- FUNCTION: public.x9_djdj_05jzfx(character varying, character varying, character varying)
-- DROP FUNCTION IF EXISTS public.x9_djdj_05jzfx(character varying, character varying, character varying);
CREATE OR REPLACE FUNCTION public.x9_djdj_05jzfx(
ssdqyh character varying,
ssdjmc character varying,
ssdjoid character varying)
RETURNS character varying
LANGUAGE 'plpgsql'
COST 100
VOLATILE PARALLEL UNSAFE
AS $BODY$
-- Author: 岳国军
-- Create date: 2022-08-07
-- complete date:2022-09-13
-- Description: 单据登记_记账凭证 反记账
DECLARE
ssmsg text;ssdet text;sstname text;sshint text;ssctt text; --错误处理
rd record;
rdny record;
ssny char(6);
sszzxh INT;
cs_jzfx CURSOR FOR
SELECT kmdh,wldw,wlry,hsbm,hbmc,jfje, dfje, slwb,mid
FROM djjzpzm WHERE (oid = $3) ORDER BY kmdh,wldw,wlry,hsbm,hbmc;
sssyny char(6);
cs_kjny CURSOR FOR
SELECT ny FROM mlny WHERE ny > ssny;
BEGIN
-- 登记单据
SELECT ny INTO ssny FROM djjzpzo WHERE oid = $3;
sszzxh:=0;
OPEN cs_jzfx;
LOOP
FETCH cs_jzfx INTO rd;
EXIT WHEN NOT FOUND;
-- 登记会计总账 反向
IF exists(SELECT * FROM utzzkj WHERE ny = ssny AND kmdh = rd.kmdh AND
wldw = rd.wldw AND wlry = rd.wlry AND hsbm = rd.hsbm AND hbmc = rd.hbmc) THEN
IF rd.slwb <> 0 THEN
IF rd.jfje <> 0 THEN
UPDATE utzzkj SET sljf = sljf - rd.slwb,slym = slym - rd.slwb
WHERE ny = ssny AND kmdh = rd.kmdh AND wldw = rd.wldw AND
wlry = rd.wlry AND hsbm = rd.hsbm AND hbmc = rd.hbmc;
ELSE
UPDATE utzzkj SET sldf = sldf - rd.slwb,slym = slym + rd.slwb
WHERE ny = ssny AND kmdh = rd.kmdh AND wldw = rd.wldw AND
wlry = rd.wlry AND hsbm = rd.hsbm AND hbmc = rd.hbmc;
END IF;
END IF;
UPDATE utzzkj SET jejf = jejf - rd.jfje,jedf = jedf - rd.dfje,jeym = jeym - rd.jfje + rd.dfje ,zzxh = zzxh + 1
WHERE ny = ssny AND kmdh = rd.kmdh AND wldw = rd.wldw AND
wlry = rd.wlry AND hsbm = rd.hsbm AND hbmc = rd.hbmc;
SELECT zzxh INTO sszzxh FROM utzzkj
WHERE ny = ssny AND kmdh = rd.kmdh AND wldw = rd.wldw AND
wlry = rd.wlry AND hsbm = rd.hsbm AND hbmc = rd.hbmc;
UPDATE djjzpzm SET zzxh = sszzxh
WHERE mid = rd.mid;
END IF;
END LOOP;
CLOSE cs_jzfx;
UPDATE djjzpzo SET djr = '' WHERE oid = $3;
UPDATE djjzpzm SET sfdj = false WHERE oid = $3;
-- 更新以后年度总账
IF ssny < x9_dqny() THEN
sssyny:=ssny;
OPEN cs_kjny;
LOOP
FETCH cs_kjny INTO rdny;
EXIT WHEN NOT FOUND;
-- 更新UTZZKJ
WITH syzz (kmdh, hsbm ,wldw,wlry,hbmc, slyc, sljf, sldf, slym, jeyc, jejf, jedf, jeym) AS
(SELECT kmdh, hsbm ,wldw,wlry,hbmc, slyc, sljf, sldf, slym, jeyc, jejf, jedf, jeym
FROM utzzkj WHERE (ny = sssyny))
UPDATE utzzkj dyzz SET slyc = syzz.slym,jeyc = syzz.jeym
FROM syzz WHERE (dyzz.kmdh = syzz.kmdh AND
dyzz.hsbm = syzz.hsbm AND dyzz.wldw = syzz.wldw AND
dyzz.wlry = syzz.wlry AND dyzz.hbmc = syzz.hbmc)
AND dyzz.ny = ssdqny;
UPDATE utzzkj SET slym = slyc + sljf - sldf,jeym = jeyc + jejf - jedf
WHERE ny = ssdqny;
-- 生成空账
INSERT INTO utzzkj (ny, kmdh, hsbm ,wldw,wlry,hbmc, slyc, sljf, sldf, slym, jeyc, jejf, jedf, jeym, zzxh)
SELECT ssdqny AS ny, kmdh, hsbm, wldw,wlry, hbmc, slym AS slyc,
0 AS sljf, 0 AS sldf, slym, jeym AS jeyc, 0 AS jejf, 0 AS jedf,
jeym, zzxh
FROM utzzkj AS syzz
WHERE (ny = sssyny) AND (kmdh || hsbm || wldw || wlry || hbmc) NOT IN
(SELECT kmdh || hsbm || wldw || wlry || hbmc FROM utzzkj AS dyzz WHERE ny = rdny.ny);
sssyny = rdny.ny;
END LOOP;
CLOSE cs_kjny;
END IF;
RETURN '登记完成';
EXCEPTION WHEN others THEN
GET stacked DIAGNOSTICS ssmsg = MESSAGE_TEXT,ssdet = pg_exception_detail,
sstname = TABLE_NAME, sshint = pg_exception_hint, ssctt = pg_exception_context;
CALL x9_jlproc(ssmsg, ssdet, sstname, sshint, ssctt);
RETURN ssmsg;
END;
$BODY$;
ALTER FUNCTION public.x9_djdj_05jzfx(character varying, character varying, character varying)
OWNER TO postgres;
-- FUNCTION: public.x9_djdj_06cn(character varying, character varying, character varying)
-- DROP FUNCTION IF EXISTS public.x9_djdj_06cn(character varying, character varying, character varying);
CREATE OR REPLACE FUNCTION public.x9_djdj_06cn(
ssdqyh character varying,
ssdjmc character varying,
ssdjoid character varying)
RETURNS character varying
LANGUAGE 'plpgsql'
COST 100
VOLATILE PARALLEL UNSAFE
AS $BODY$
-- Description: 单据登记_出纳
DECLARE
ssmsg text;ssdet text;sstname text;sshint text;ssctt text; --错误处理
rd record;
ssrq DATE;sswldw varchar(50);ssjswb varchar(20);
ssny char(6);
cs_skfk CURSOR FOR
SELECT mid,cnkmdh,cnkmmc,skje,skzr,fkje,fkzr,skjewb,skzrwb,fkjewb,fkzrwb
FROM djcnm WHERE oid = $3;
BEGIN
SELECT rq,wldw,jswb INTO ssrq,sswldw,ssjswb FROM djcno WHERE oid = $3 ;
UPDATE djcnm SET rq = ssrq WHERE oid = $3;
UPDATE djcno SET djr = $1 WHERE oid = $3;
UPDATE djcnm SET sfdj = true WHERE oid = $3;
ssny:=x9_dqny();
OPEN cs_skfk;
LOOP
FETCH cs_skfk INTO rd;
EXIT WHEN NOT FOUND;
-- 登记出纳总账
IF NOT exists(SELECT * FROM utzzcn WHERE ny = ssny AND cnkmdh = rd.cnkmdh) THEN
INSERT INTO utzzcn(ny,cnkmdh,cnkmmc,wbmc) VALUES (ssny,rd.cnkmdh,rd.cnkmmc,ssjswb);
END IF;
UPDATE utzzcn SET jffs = jffs + rd.skje,dffs = dffs + rd.fkje,ymye = ymye + rd.skje - rd.fkje,
wbjf = wbjf + rd.skjewb,wbdf = wbdf + rd.fkjewb,wbym = wbym + rd.skjewb - rd.fkjewb
WHERE ny = ssny AND cnkmdh = rd.cnkmdh;
-- 登记往来总账
IF NOT exists(SELECT * FROM utzzwl WHERE ny = ssny AND wldw = sswldw) THEN
INSERT INTO utzzwl(ny,wldw,wbmc) VALUES (ssny,sswldw,ssjswb);
END IF;
UPDATE utzzwl SET
dffs = dffs + rd.skje + rd.skzr,jffs = jffs + rd.fkje + rd.fkzr,ymye = ymye + rd.fkje + rd.fkzr - rd.skje - rd.skzr,
wbdf = wbdf + rd.skjewb + rd.skzrwb,wbjf = wbjf + rd.fkjewb + rd.fkzrwb,
wbym = wbym + rd.fkjewb + rd.fkzrwb - rd.skjewb - rd.skzrwb
WHERE ny = ssny AND wldw = sswldw;
END LOOP;
CLOSE cs_skfk;
RETURN '登记完成';
EXCEPTION WHEN others THEN
GET stacked DIAGNOSTICS ssmsg = MESSAGE_TEXT,ssdet = pg_exception_detail,
sstname = TABLE_NAME, sshint = pg_exception_hint, ssctt = pg_exception_context;
CALL x9_jlproc(ssmsg, ssdet, sstname, sshint, ssctt);
RETURN ssmsg;
END;
$BODY$;
ALTER FUNCTION public.x9_djdj_06cn(character varying, character varying, character varying)
OWNER TO postgres;