分类目录功能是指需要进行分级编码的单表数据的输入功能,主要用于基础资料,如客户目录、部门目录、存货目录、会计科目等。
一、功能模型设计内容
·按窗口内容设置好项目内容。
·字段列表中要包括所编辑数据集中的所有字段,不管是否在其他项目中出现。编码字段、上级字段和本级字段应排列在前。
·目录字段列表是指在目录树中显示的字段。除编码和名称字段外可在目录树中直接编辑
·编辑条件用SQL条件表达式表示(不含WHERE字样)。其中条件变量用大括号({})括上。确定后在载入条件栏中可以看到相关条目会自动生成,在此输入默认值。这样在使用时,用户初次打开功能窗口时是按默认条件载入数据,再次按载入按钮时,会弹出条件输入窗口,重置条件后载入。
·唯一字段。输入时可限制在当前载入范围内不允许重复。
·目录字段列表。树形目录使用的字段列表。未列出的将不在目录树中显示。编码字段为第一个显示字段,上级和本级字段不需要在目录树中显示。其他字段根据用户需要。
·级次字段。便于自动填写目录级次,以便在特定需要时使用。
·启用字段。启用标记字段。标记后不能编辑。
·参考条件字段。输入参考时作为关联条件的字段。
·查询条件。查询条件表达式。包含载入条件变量。用于载入数据时可选择载入表中的部分数据,避免一次载入的数据量过大。
·更新字段列表。启用后仍可更新字段列表。
·是否复制。添加时是否复制当前记录内容。
·提交提示。提交时应给予操作者的提示,如重新登录等。
·可以设置多个打印模板,在实际打印时选择。
二、分类目录定义窗口的必要操作
·复制功能定义。功能定义可复制,操作时输入目标功能编号即可。目标功能编号可不在本类功能中(不推荐)。
·删除功能面板。删除当前功能的输入表单设计面板。表单输入面板可在设计器中运行时进行设计(右键菜单)并保存,当项目内容发生变化时应在此删除。
·数据字典。设计数据字典是指设计功能所用数据表的字典。系统数据字典是指系统功能使用的数据字典。功能数据字典是指当前功能所用数据表的字典。数据字典的任务是确定项目输入输出时的标题、控件、格式等事项。
·计算公式。可以像单据一样设计计算公式,用于计算字段值或完成记录验证。
三、分类目录的后台接口设计
1、载入条件初始
载入数据时,初始化载入条件。设计器中输入的值为公共默认值。以后每个用户(操作员)保存自己的载入条件。需要一个后台程序。
本例使用mssql。
--初始化载入条件示例代码 SQL SERVER ALTER PROCEDURE [dbo].[X9_ZRTJCS] (@GNBH VARCHAR(20), --功能编号 @YHMC VARCHAR(20)) --用户名称 AS BEGIN TRY SET NOCOUNT ON; DECLARE @DYID INT,@GNMC NVARCHAR(20),@TJXH INT,@TJMC VARCHAR(20),@TJJG VARCHAR(80),@RXKZ VARCHAR(10),@TJSM NVARCHAR(100), @TJEDIT VARCHAR(100); DECLARE Zrtj_cursor CURSOR LOCAL FOR SELECT GNMC,TJXH,TJMC,TJJG,RXKZ,TJSM,TJEDIT FROM X9_GN_0ZRTJ WHERE GNBH=@GNBH AND YHMC=''; OPEN Zrtj_cursor; FETCH FROM Zrtj_cursor INTO @GNMC,@TJXH,@TJMC,@TJJG,@RXKZ,@TJSM,@TJEDIT; WHILE @@FETCH_STATUS=0 BEGIN IF NOT EXISTS(SELECT * FROM X9_GN_0ZRTJ WHERE GNBH=@GNBH AND TJMC=@TJMC AND TJSM=@TJSM AND YHMC=@YHMC) BEGIN SELECT @RXKZ=CASE WHEN @RXKZ='1' THEN '1' ELSE '0' END ; EXEC DBO.X9_DJMID 'X9_GN_0ZRTJ','DYID',1,@DJMID=@DYID OUTPUT; INSERT INTO X9_GN_0ZRTJ (DYID,GNBH,GNMC,TJXH,TJMC,TJJG,RXKZ,TJSM,YHMC,TJEDIT) VALUES(@DYID,@GNBH,@GNMC,@TJXH,@TJMC,@TJJG,@RXKZ,@TJSM,@YHMC,@TJEDIT) END FETCH NEXT FROM Zrtj_cursor INTO @GNMC,@TJXH,@TJMC,@TJJG,@RXKZ,@TJSM,@TJEDIT; END CLOSE Zrtj_cursor; DEALLOCATE Zrtj_cursor END TRY BEGIN CATCH DECLARE @ErrorMessage NVARCHAR(4000); DECLARE @ErrorSeverity INT; DECLARE @ErrorState INT; SELECT @ErrorMessage =ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE(); RAISERROR (@ErrorMessage, -- Message text. @ErrorSeverity, -- Severity. @ErrorState ); -- State. END CATCH;
2、载入前存储过程
用于载入数据前处理相关数据。(代码略)。
3、提交后存储过程
ALTER PROCEDURE [dbo].[X9_TJ_1FLML] (@DQYH NVARCHAR(10), --用户名称 @GNNAME NVARCHAR(30), --功能名称 @TBNAME NVARCHAR(30), --数据表名 @BMSTR NVARCHAR(MAX)) --提交的主键字符串,使用 @BMSTR LIKE '%(' + CHDH + ')%' 表达式做为条件; AS --分类目录 提交后主要处理底层明细和计算助记码 BEGIN TRY IF @GNNAME='账套用户角色维护' OR @GNNAME='账套用户设置' OR @GNNAME='功能列表定义' BEGIN --select * from x9_gn --删除多余行 DELETE X9_GNYHQX WHERE (YHJS NOT IN (SELECT YHJS FROM X9_GNYHJS )); DELETE X9_GNYHQX WHERE (GNBH NOT IN (SELECT GNBH FROM X9_GN WHERE JC=2 AND SFQY=0)) ; DELETE X9_GNYHQX WHERE (SSMK NOT IN (SELECT MKMC FROM X9_GN_GNMK WHERE SFYY=1)); --DELETE X9_GNYHQX WHERE YHJS='系统管理员'; --增加缺少行 DECLARE @MAXID INT; SELECT @MAXID =1+MAX(QXID) FROM X9_GNYHQX ; IF @MAXID IS NULL SET @MAXID=1; WITH YH (YHJS) AS (SELECT DISTINCT YHJS FROM X9_GNYHJS where YHJS<>'系统管理员') INSERT INTO X9_GNYHQX (QXID,YHJS,GNBH,GNMC,GNLY,GNLB,SSMK,JZZD,SFSQ,Xzbj,Xzdy,Xzck,Xzwj,Xzdc,XZQX,SFYC) SELECT @MAXID+(ROW_NUMBER() OVER(ORDER BY YH.YHJS, GN.GNBH)), YH.YHJS, GN.GNBH, GN.GNMC, GN.GNLY, GN.GNLB, GN.SSMK,'' AS JZZD, 0 AS SFSQ,1 AS XZBJ,1 AS XZDY,1 AS XZCK, 1 AS XZWJ,1 AS XZDC ,'111111' AS XZQX,GN.SFYC FROM YH CROSS JOIN X9_GN GN WHERE GN.JC=2 AND SFQY=0 AND GN.SSMK IN (SELECT MKMC FROM X9_GN_GNMK WHERE SFYY=1) AND (YH.YHJS+GN.GNBH) NOT IN(SELECT YHJS+GNBH FROM X9_GNYHQX); UPDATE QX SET GNMC = GN.GNMC, GNLY = GN.GNLY, SSMK = GN.SSMK, GNLB = GN.GNLB, SFYC = GN.SFYC FROM X9_GNYHQX AS QX INNER JOIN X9_GN AS GN ON QX.GNBH = GN.GNBH; SELECT '用户权限初始检查已经完成'; END --SELECT DISTINCT YHJS,'' AS SJBH, ROW_NUMBER() OVER(ORDER BY YHJS) AS YHBH FROM X9_GNYH --UPDATE X9_GNYHQX SET SFSQ =1; --select * from X9_GNYHQX IF @GNNAME='客户目录' BEGIN EXEC X9_REZJM @TBNAME; EXEC X9_DCMX @TBNAME; UPDATE MLWL SET ZKL=0 WHERE ZKL<0 OR ZKL>100; SELECT '客户目录提交后处理已完成'; RETURN END IF @GNNAME='供应商目录' BEGIN EXEC X9_REZJM @TBNAME; EXEC X9_DCMX @TBNAME; SELECT '供应商目录提交后处理已完成'; RETURN END IF @GNNAME='部门目录' BEGIN EXEC X9_REZJM @TBNAME; EXEC X9_DCMX @TBNAME; SELECT '部门目录提交后处理已完成' RETURN END IF @GNNAME='会计科目' BEGIN EXEC X9_REZJM @TBNAME; EXEC X9_DCMX @TBNAME; SELECT '会计科目提交后处理已完成' RETURN END IF @GNNAME='数据字典' BEGIN SELECT '数据字典提交后处理已完成' RETURN END END TRY BEGIN CATCH DECLARE @ErrorMessage NVARCHAR(4000),@ErrorSeverity int,@ErrorState INT; SELECT @ErrorMessage = ERROR_MESSAGE(),@ErrorSeverity = ERROR_SEVERITY(),@ErrorState = ERROR_STATE(); RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState ); END CATCH;
4、打印数据提供程序。
用于打印时可以需要打印当前载入数据以外的其他数据。
四、前端设计
前端设计即可根据上述设计,建立固定的程序执行不数据(分类目录)的处理。以实现低代码和通用。