复杂公式编辑器的设计

2015-09-16 08:22黄红玲
现代计算机 2015年12期
关键词:编辑器字段原理

陈 艳,黄红玲

复杂公式编辑器的设计

陈艳,黄红玲

(中山大学新华学院,广州510520)

提出一种复杂公式编辑器的设计原理,详细描述采用“XML+数据库”方式存储公式的原理,深入讨论公式和SQL查询语句的XML模型以及嵌入函数和SQL查询的复杂公式的XML模型。

XML;公式编辑器

0 引言

随着网络的不断发展,软件在各行各业得到了更普遍的应用,软件技术也得到了前所未有的挑战,软件不再仅仅是解决工作中简单的手工工作问题,已经越来越深入到各行各业核心业务的实现,简单的软件实现技术应用已经不能满足各类核心业务的需要,当前软件发展的趋势已经更加贴近实际工作业务,功能越来越傻瓜化,因此就要求软件实现原理越来越复杂化。例如以前的软件中嵌入公式编辑器的较少,但随着用户对软件功能的需求越来越高,复杂的公式编辑器就很有必要了。应开发实际复杂软件的需要,笔者设计了一套复杂的公式编辑器。

公式编辑器已经不是一个陌生的名词了,如Windows自带的计算器就有公式编辑功能,但如何将公式编辑器嵌入各类软件当中,为各类专业软件所应用,并且要求嵌入的公式编辑器不能是简单的加减乘除或简单的函数计算,而是要能灵活地满足软件功能的需求。如公式中嵌套函数和SQL查询结果,函数中又嵌套SQL查询等复杂的公式,计算的结果作为一个条件判断的值,或者嵌入鉴别模型当中作为路由选择的条件。这样的公式编辑器就不再是简单的计算功能了。本文将详细描述复杂公式编辑器的设计原理,包括公式模型存储原理以及公式编辑器的实现原理。

1 数据存储原理

数据的存储主要借助于“XML+数据库”的方式完成。系统中定义的公式以XML的方式进行封装,存储于数据库中,系统调用时从数据库中读出来,将XML进行解析呈现到页面。之所以采用XML+数据库相结合而没有直接用XML文件存储的原因,主要是考虑到读取性能方面,文件输入输出的速度比读取数据库要慢。数据存取模型如图1所示。

图1 数据存取模型

公式编辑器定义的公式按照语法定义规则SDR(Syntax Definition Rule)通过XML转化器转换成数据库能够存储的Document类型,然后存入数据库中,当定义的公式需要被调用时,XML解析器按照SDR规则进行解析,解析成XML树,通过代理显示。

2 公式编辑器的实现原理

2.1公式实现原理

公式的数据形态是以XML的方式存储,存储公式的XML代码框架如下:

〈FORMULA FORMULA_NAME="TRY_FROM"LIBID=" 7582945"〉

〈SET OPERATOR="110"SID="0"〉

〈NUMBER OPERATOR="110"SID="6698"VALUE=" 1.0"/〉

〈SET OPERATOR="110"SID="8633"〉

〈FUNCTION FN_TYPE="120"OPERATOR="110" SID="9615"〉

〈PARAM OPERATOR="115"SID="2514"〉

〈SQL LIBID="1784351"OPERATOR="110"SID="944"/〉

〈/PARAM〉

〈/FUNCTION〉

〈NUMBER OPERATOR="113"SID="5455"VALUE=" 17.0"/〉

〈/SET〉

〈/SET〉

〈/FORMULA〉

公式的定义以标签〈FORMULA〉为开始。FORMULA_NAME属性表示公式定义的名称,LIBID属性表示公式的ID。

公式的结构以其公式表达式自身的逻辑结构来决定,元素与元素之间没有特定的顺序,整个公式可以被拆卸成为一个树状结构。下面介绍构成公式定义的各种XML元素。

所有这些标签都会有一个属性OPERTOR,这个属性的意思是操作符。操作符包括加、减、乘、除、求模、逗号。操作符在一个元素之中的意思是当前这个元素与它的前文元素的关系,这个前文元素有可能是同级的前一个元素,也有可能是直接的父结点元素。例如元素B的操作符号是“+”那么它和前文元素A的关系就是A+B。

另外一个元素的操作数如果是正数,但它的操作符是“-”,同时它无前文元素,那么这个元素在计算的时候被视为负数。反之则遵守负负得正的原理。

逗号操作符是一个比较特殊的操作符。它主要用来表示连续但无关系的元素组合,例如函数的参数列表。在公式函数调用的情况下,例如,FUN(A,B)元素A与B之间的关系就应当是逗号。因为它们之间没有关系,且无层级区别。此时A与B默认应该是正数。

〈SET〉标签,这个标签实际上就是表示这个公式到这里开始需要一个括号运算符。括号运算符一般用来表示需要优先计算的一组表达式,它的下面可以包含各种其他类型的标签。这个元素用来表述“(A+B)”。

〈NUMBER〉标签,表示这个元素是个实数元素,属性value表示为一个浮点数。这个元素的表达式一般用来表达“1+2-3”。

〈FUNCTION〉标签,表示这里开始调用函数,这里的函数指的是公式系统自带的一系列函数。FN_TYPE属性表示为函数的类型,SID表示这个标签在当前的结点下的编号。

〈PARAM〉标签,用来表示函数标签下的参数列表。一个〈FUNCTION〉标签下面可以有多个PARAM标签作为参数列表。〈PARAM〉标签之间的操作符必须是逗号操作符。〈PARAM〉标签下面的元素没有限制,因为按照规则这个标签的效力和〈SET〉标签是一样的,在其下依然可以组织完整的公式表达式。这样就可以实现函数的复杂调用,或者是调用其他的公式,并以其他的公式运算结果为参数。

XML文档通过XML解析器,生成树状结构。例如公式A*B+(C*D-E)+FUN_A,通过XML解析后,生成如下树:

图2公式树模型图

图2中,FUN_A表示调用系统自定义函数,如求平均值函数。通过定义一组优先级运算规则,自动计算表达式结果。

2.2SQL查询分析器实现原理

同公式实现原理一样,SQL查询分析器原理大致相同,SQL语句的XML代码框架如下:

〈SQL LIBID="1784351"SQLTYPE="20"〉

〈QUERY QUERYKEY="emplID"QUERYVALUE="emplName"queryFields="emplName;emplID"tableName="tb_employee"/〉

〈SET HSID="0"〉

〈SET HSID="6239"RELATION="30"〉

〈CONDITION COMPAIR="42"HSID="849"RELATION="30"fieldName="emplID"〉〈VALUEL LIBID="0"VALUE="0"/〉〈VALUER LIBID="0"VALUE=""/〉〈/CONDITION〉

〈CONDITION COMPAIR="43"HSID="3007"RELATION="30"fieldName="emplID"〉

〈VALUEL LIBID="0"VALUE="99999999"/〉

〈VALUER LIBID="0"VALUE=""/〉

〈/CONDITION〉

〈/SET〉

〈/SET〉

〈/SQL〉

SQL查询定义以〈SQL〉标签开始,LIBID属性表示这个SQL语句的ID。

在〈SQL〉标签下面有且仅有一个〈QUERY〉标签,这个标签用来存储设置查询的必要信息。tableName属性用来指定查询的表名。queryFields属性用来指定查询的字段。这些字段必须来自于tableName属性对应的表中。QUERYKEY属性表示查询的键字段,这个字段将作为结果集中的标识符而存在,且这个字段必须来源于queryFields的字段列表中。QUERYVALUE属性表示查询的值字段,这个字段将作为结果集中的值而存在。这个字段必须来源于queryFields的字段列表中。

前面由〈QUERY〉标签给出的信息就已经完成了SQL语句前面部分的定义,也就是说明了从哪个表中,查询哪些字段的信息。

如:SELECT A,B,C FROM TB_ABC

在SQL查询定义中,where子句实际上与公式定义是相似的,因为where子句也可以拆分成一个树状结构的表达式。

不同的是,所有的where子句包含在一个〈SET〉标签下。在前文的公式定义中所描述的,〈SET〉标签作为括号运算符而存在。在SQL语句中,SQL的where子句无论后面接的元素是多是少,都可以看作被放置在括号之中,因为计算的结果直接被SQL查询所使用。

在公式定义中,每个结点都有一定的算术功能,但是在SQL定义中,位于where子句后的元素,多数都是条件运算符。在这里计算不是重点,计算可以通过引用公式的方式来进行,或者直接让数据库服务器通过SQL语句来计算。在这里,条件运算使用〈CONDITION〉标签来定义。

〈CONDITION〉标签的属性包括:COMPARE属性,指定当前条件的判断方式是什么,包括“+、-、*、/”等,RELATION表示与前文条件的关系运算符,包括与(AND)、或(OR)、非(NOT),fieldName属性表示这个条件所判断的字段名,这个字段必须是〈QUERY〉标签所定义的表中的,但不一定是queryFields属性所指定的字段。

〈VALUEL〉〈VALUER〉在〈CONDITION〉下面,用来表示左值和右值。LIBID属性表示这个值所引用的公式,如果为0,则表示不引用公式。VALUE属性则表示这个值标签的具体值。

通过这个树状的结构,就可以生成带层级where子句的查询语句。

例如查询语句SQL_1:select a,b from tb_a where c =0 and(d=‘s’or e=1),通过XML解析后,生成如下树:

图3 SQL树模型图

2.3复杂公式的应用原理

复杂公式是指带有函数和SQL查询的公式,这种公式的XML代码框架如下:

〈FORMULA FORMULA_NAME="TRY_FROM"LIBID=" 7582945"〉

〈SET OPERATOR="110"SID="0"〉

〈NUMBER OPERATOR="110"SID="6698"VALUE=" 1.0"/〉

〈SET OPERATOR="110"SID="8633"〉

〈FUNCTION FN_TYPE="120"OPERATOR="110"SID=" 9615"〉

〈PARAM OPERATOR="115"SID="2514"〉

〈SQL LIBID="1784351"OPERATOR="110"SID=" 944"/〉

〈/PARAM〉

〈/FUNCTION〉

〈NUMBER OPERATOR="113"SID="5455"VALUE=" 17.0"/〉

〈/SET〉

〈/SET〉

〈/FORMULA〉

〈SQL〉标签,表示引用SQL查询的定义。LIBID属性表示SQL查询语句的ID。

XML代码中,下划线虚线部分表示函数的调用,下划线为实线部分表示SQL查询的调用。

图4 复杂公式树模型图

图4中虚线大框区域表示SQL查询的引用,FUN_A表示函数的引用。通过将函数和SQL查询嵌入公式中,实现了比较灵活的公式应用。

3 结语

笔者设计的公式编辑器应用Java语言来实现。目前编辑器已经应用于工作流的定义中,用于嵌入鉴别模型当中作为路由选择的条件。公式编辑器的应用,让软件变得更加灵活适用,提高了企业的办公效率。

[1]Extensible Markup Language(XML)1.0(Second Edition).W3C Recommendation.http://www.w3c.org/TR/REC-xml,2000-10-06

[2]Mathmatical Markup Language(MathML)1.01 Specification.W3C Recommendation.http://www.w3c.org/TR/REC-MathML,1999-07

[3]刘琼华.采用标记语言构造数学公式编辑器的方法.计算机工程,2003,29(18):82~84

[4]张滨.实现Web下公式符号在线操作的可视化编辑器系统的设计.计算机科学,2007,34(6):286~288

XML;Formula Editor

Design of the Complex Formula Editor

CHEN Yan,HUANG Hong-ling

(Xinhua College,Sun Yat-Sen University,Guangzhou 510520)

Presents the conception of a complex embedded formula editor,expatiates the concept of formula storage by“XML+Database”,discusses the XML model of formula,SQL sentence and complex formula embedded SQL sentence and function.

1007-1423(2015)12-0083-05

10.3969/j.issn.1007-1423.2015.12.019

陈艳(1979-),女,湖北人,硕士,讲师,研究方向为软件工程

黄红玲(1987-),女,广东人,硕士,助教,研究方向为电子信息技术

2015-02-26

2015-03-12

猜你喜欢
编辑器字段原理
图书馆中文图书编目外包数据质量控制分析
基于包络解调原理的低转速滚动轴承故障诊断
司空见惯感觉烦 锁屏画面快走开
了解咳嗽祛痰原理,有效维护健康
平均场正倒向随机控制系统的最大值原理
你距离微信创作达人还有多远?
车辆段收发车运行图编辑器的设计与实现
化学反应原理全解读
CNMARC304字段和314字段责任附注方式解析
无正题名文献著录方法评述