什么是开发平台
当我们最开始接触软件开发的时候,我们大都是采用编程工具来编写程序,运用
JDK、
MFC等提供编写代码来完成想要的功能,编写完之后还要编译成可执行的文件,然后再运行。这种方式虽然通俗,但是一点也不方便,慢慢的,编程人员开始寻求比较方便开发的工具,于是诸如
Visual Studio、
eclipse、
jbuilder、
VC++等等一系列的开发工具便出现在了市面上,这些工具的出现,大大方便了开发人员的编程工作,减少了编程人员很多不必要的麻烦。像包括编译、
异常处理、发布、模拟运行等等操作,都可以在这些开发工具上完成。
但是,随着时间的推移,编程人员发现,即使有这么好的开发工具,在开发的过程中,依然要写很多很多的代码,而且仔细的分析来看,很多代码基本上都是重复的编写,功能大同小异。于是,他们便开始琢磨另一种更为方便高效的开发工具,比如说:我们可以将很多重复的代码封装起来,然后需要用到的时候自行调用?或者是我们可以搭出一个基本的开发框架,然后
编程人员可以在这个框架的基础上进行二次开发?通过编程人员一次一次的实验,最终形成了一种新的开发工具,那就是开发平台。
开发平台,简单的理解就是:以某种编程语言或者某几种编程语言为基础,开发出来的一个软件,而这软件不是一个最终的软件产品,它是一个二次开发软件框架,用户可以在这个产品上进行各种各样的软件产品的开发,并且在这个产品上进行开发的时候,不需要像以往的编程方式那样编写大量的代码,而是只需要针对业务进行一些简单的操作,或者是写极少量的代码便可以完成一个业务系统的开发工作。
度量快速开发平台作为面向构建的SOA中间件产品,提供了完整的企业应用从开发到运行、管理、监控的工具或环境支持,主要包括以下模块:开发框架、权限系统、治理与监控、工作流、智能窗体、自定义报表、门户定制、集成平台等。
度量快速开发平台的两种模式:引擎模式、生成源代码模式。度量基于自主知识产权的智能窗体技术,采用自己的脚本解释引擎,生成源代码模式在度量快速开发平台里面得到了不一样的体现,更大幅度的提高了效率。
首先大家得知道,我们在平台中不管用什么方式构建(在平台中开发我们称之为构建)出来的应用(在平台中我们把根据实际业务构建出来的功能模块称之为应用),最终我们是要让用户使用的,也就是说,用户需要有一个地方能打开我们在平台中构建出来的应用,所以度量快速开发平台的做法是通过配置菜单的方式来实现(当然配置的每个菜单都是受权限控制的),每一个菜单都对应一个应用。
在平台中配置的每一个菜单都是我们在平台中通过不同的模式构建出来的应用,那么我把在平台中的构建模式分为以下5中模式:
对于表单工作流程的开发是不需要书写任何代码的,只需要设置一个模版并通过简单配置,以及可视化的流程图的设计(也就是托拉拽)就能完成。
所谓的智能窗体,是在普通的窗体开发中针对实际业务变得更简单更实用。在智能窗体里面所用到的控件、部件以及需要写代码的地方都是经过加工的,这些东西开发者使用起来更方便、更简单、效率更高,从而显得更智能化。
高级工作流是基于窗体、和表单工作流的一种开发,把窗体和表单工作流整合一起,把自由组合的窗体更具设计好的流程图流转,这样可以更灵活的实现流程性的开发,从而变得更强大。
报表开发是一个单独的报表设计器,在里面可以快速方便的构建各种报表,然后这些报表的构建都只需要写好查询语句,然后经过托拉拽就能实现,一行代码都不用写就能实现。
使用扩展开发的情况一般有两种:
第一种:有在平台中无法完成的需求时,我们可以通过其他开发工具编写一个.NET程序,然后把这个程序的某个界面作为一个主界面配置到平台中来,也就是说在平台中配置一个菜单,然后点击这个菜单的时候打开的就是你用其他开发工具编写的这个程序。
第二种:有在平台中无法完成的某个功能时,我们可以通过其他开发工具编写完成这个功能的方法然后生成DLL(动态库)文件,然后在平台中是可以直接调用的,比如我要与公安局联网查询身份证的真实性,那么就可以自己写一个效验的方法生成DLL(动态库)文件,然后在平台中输入身份证的地方调用这个方法来进行效验。
这里要讲的是平台中构建时涉及到的一些重要的概念整理,是为了让大家对这些概念有所了解后,在后面的讲解中才方便大家更好的理解。以下是我整理的几个比较重要的概念:
在平台的开发工具中有一个菜单的名字叫“数据库维护”,这里显示了平台中所有业务使用到的数据库以及数据表,在这里可以配置连接到不同数据库,也可以对数据库里面的表进行操作,在之里可以进行统一的管理。平台自身使用的数据库在这里面叫“默认(default)”。
PS:如果利用其他工具在数据库中添加了表那么使用起来会有问题,原因就是在这里对表的进行维护包括字段、类型、长度等等这些都是有记录在我们平台的系统表里面的,如果绕过我们的这个数据库维护工具操作的话就会出现问题。
我们对数据库维护下的数据表进行配置时,有两列分别叫“字段名”和“实际名”(如下图)
字段名:也就是数据表字段的别名(Alias),平台构建中有设置业务表的情况时,系统就会显示字段的别名,当然前提是设置的业务表中的SQL语句没有使用例如“AS”这种关键字再次命名别名的。
实际名:也就是数据表字段名称,比如你写一句SQL语句那么就得用这个名称来查询。
对数据库维护里面的数据表进行配置时,有两列分别叫“类型”和“编辑类型”(如下图)
类型:也就是数据表存储数据时使用的类型。例如字符、数字、整数等。类型一旦确定保存后是不能更改的,不同的类型下面有不同的编辑类型。
编辑类型:也就是在界面上编辑的时候需要使用的类型。例如编辑类型是单项选择,那么在平台构建中使用到该字段的时候界面上就会自动出现一个下拉选择的控件。编辑类型是随时都可以更改的,这也是构建界面时系统会自动生成什么控件的依据,不同的编辑类型会生成不同的控件,每个编辑类型也有自己的个性化定义。一处定义多处使用,这也是简化了不少操作的一个重要设计啊。
这个概念是相当重要的,因为在平台的构建中我们肯定会使用的很平凡。有开发经验的人都知道,当我们在使用一些控件开发的时候,有的控件是需要绑定数据源的,例如我们使用的GridView这个网格控件,它就需要指定一个数据源,也就是绑定一个DataTable。在平台里面原理也是差不多的,所有的部件(平台里面需要绑定业务表的称之为部件,非绑定业务表的称之为控件)也需要绑定一个数据源,但是平台叫绑定业务表,每个业务表是一句SQL语句组成,这个SQL语句可以复杂也可以简单,平台会通过这个SQL语句查询得到一个DataTable,然后这个DataTable就会与部件绑定。
也就是说业务表就是一个装SQL语句的容器,部件与业务表绑定,使用时就会根据业务表里面的SQL语句查询出表结构以及内容并且自动生成界面显示出来。
业务表其实还分为“只读业务表”与“读写业务表”。
只读业务表:就是只有查询作用,不能根据这个业务进行写数据操作。比如在绑定只读业务表的部件中使用保存数据的方法(SaveData)就会提示错误。一般这类业务表可以自定更复杂的SQL语句。
读写业务表:可以有查询作用,还有写数据的作用。比如在绑定读写业务表的部件中是可以直接调用保存数据的方法(SaveData),把界面上的数据直接提交到数据库表里面。一般这类业务表都是对一个数据表进行操作,都是通过界面勾选的方式来自动生成SQL,不允许自定义。
理解业务表之后还有一个比较重要的概念就是“业务表变量”,既然上面我们说了业务表好比一个SQL语句的容器,那么对于SQL语句我们都知道有一个WHERE子句,那就是筛选条件时用的。既然要筛选条件那么这个条件一定不能是死的,肯定要从我们界面上灵活的传入一些数据进行筛选这样才实用,所以业务表变量就诞生了。
业务表变量就是在业务表的SQL语句中设置一个变量,这个变量的值是等待我们后续根据实际情况指定的。当然业务表变量不仅仅局限于只能写在WHERE子句后面,写在字段名列表处也是可以很灵活的使用的。
说到这里我多提一句:当我们在构建业务表的时候如果需要把WHERE字句整个的作为业务表变量,那么可以使用“select * from 表名 [:where]”这样的写法,去掉WHERE关键字,直接添加一个业务表变量“[:where]”,这是一个格式化的规定,必须得这样写才行。
在平台里面有一个很实用的东西,就是智能向导。智能向导其实类似于MSDN帮助这个功能,在我们对平台构建不太熟悉的时候一定要多用智能向导。这里面包含了绝大部分的内置方法属性,并且在我们构建的时候,你当前用到了哪个部件那么在这里面就有这个部件的方法说明以及示例,更重要的是里面有个辅助设置的功能,能自动生成相应代码。举个例子,假如你所使用的部件绑定了一个带有业务表变量的业务表,但是你忘记了自己取的业务表变量的名字,那么你可以直接通过智能向导中的辅助设置进行选择设置,智能向导会自动识别这些方法所需要的参数,这就是智能的体现。当然智能是在你任何需要写代码的地方都打开它。
首先给大家说明下度量快速开发平台对代码的解析是中和了VB和C#两种语言,虽然大多数情况我们都可以使用智能向导,但是大家还是要对这两种语言有个基本了解才行。
其次大家还需要注意一点,平台中代码的解析暂时还不支持同行写多条代码,一行只能写一个表达式,并且代码结束时不需要结束符。
再者就是平台中的注释符号是:“’”单引号,并且注释语也只能是单独一行写,不能与其他表达式同行写。
当然平台也有一些比好的设计,如平台中的保留字、内置方法属性是部区分大小写的,定义变量时你可以写:DIM,也可以写:Dim,甚至可以写:dIm都是可以的。还有就是平台是中英文都支持的,所以这就对开发人员的要求降低了许多。
在平台中如果需要自己写代码的时候,定义变量是不许的,平台里定义变量的语法是采用的VB的形式,也就是用Dim关键字,不用专门指定变量的类型,如下图:
在平台中我们常用的逻辑判断语句有4种,分别是:If判断语句、For循环语句、For Each循环语句以及Do While循环语句。
作用:判断条件表达式是否成立。
格式:
If … Then
…
Else
…
End If
示例:
作用:循环判断条件表达式是否成立,如果成立就循环执行相应代码。使用 Exit For关键字可以提前退出循环。
格式:
For … To…
…
Exit For
Next
示例:
说明:示例中的“&”符号是连接字符串的作用,与“+”用法一样,但是在平台里面用“&”符号就不需要把数字类型转换成字符类型再连接。
作用:循环获取一个集合里的成员。使用 Exit For关键字可以提前退出循环。
格式:
For Each … In …
…
Exit For
Next
示例:
说明:上述示例的意思是循环网格部件1的DataTable里的所有行,并且弹出显示框显示每一行的ID值。“row["ID"]”的意思就是获取当前行某列的值,这是C#里面的写法。
作用:循环判断条件表达式是否成立,如果成立就循环执行相应代码。使用 Exit Do关键字可以提前退出循环。与for循环语句类似。
格式:
Do While …
…
Exit Do
Loop
示例:
内置函数就是平台里面封装的各种方法和属性,这些方法和属性都是根据实际的使用而提炼出来的,所以使用起来非常方便,在我们的智能向导里面就能查询得到所有的内置函数。平台里面的内置函数大概分为:窗体环境的内置函数和基础环境的内置函数。窗体环境的内置函数又分为:窗体函数、工作流函数、智能部件函数。基础环境内置函数则又分为:基础函数、客户端函数。根据这样的分类在下面列出了比较重要且常用的具体的函数。
-->窗体环境的内置函数
●设置窗体变量值:Form.SetParam(参数1,参数2)
参数1:字符串类型 自定义变量的名称。
参数2:任意类型 自定义变量的值。
作用及说明:给其它窗体自定义一个变量并赋值,其中Form表示一个窗体对象(也就是前面的‘其它窗体’),如“创建窗体()”方法返回的值就是一个窗体对象。
示例:
●获取窗体变量值:Me.GetParam(参数1)
参数1:字符串类型 自定义变量的名称。
返回值类型:根据获取类容值的类型而定。
作用及说明:获取当前窗体中某个变量的值,其中Me表示当前窗体(类似与C#里的this)。一般该方法都是写在子窗体中。
示例:
●设置部件只读:Me.SetPartReadOnly(参数1, 参数2)
参数1:Contrl类型 部件的名称,意思就是直接写部件名称就可以,不要加引号。
参数2:布尔类型 true表示只读,false表示非只读。
作用及说明:设置本窗体中的部件或者控件是否只读。
示例:
●设置部件可见:Me.SetPartVisible(参数1, 参数2)
参数1:Contrl类型 部件的名称,意思就是直接写部件名称就可以,不要加引号。
参数2:布尔类型 true表示可见,false表示隐藏。
作用及说明:设置本窗体中的部件或者控件是否可见。
示例:
●设置分组可见:Me.SetGroupVisible(参数1, 参数2)
参数1:字符串类型 分组的名称。
参数2:布尔类型 true表示可见,false表示隐藏。
作用及说明:设置本窗体中的分组(群组)是否可见。
示例:
●设置分组选中状态:Me.SetGroupSelected(参数1)
参数1:字符串类型 分组的名称。
作用及说明:设置本窗体中选项卡模式的分组的焦点。
示例:
●设置功能可用:Me.SetFunctionEnabled(参数1, 参数2)
参数1:字符串类型 功能的名称。
参数2:布尔类型 true表示可用,false表示不可用。
作用及说明:设置本窗体的功能按钮是否可用。
示例:
●设置功能可见:Me.SetFunctionVisible(参数1, 参数2)
参数1:字符串类型 功能的名称。
参数2:布尔类型 true表示可见,false表示隐藏。
作用及说明:设置本窗体的功能按钮是否可见。
示例:
●设置功能显示名称:Me.SetFunctionCaption(参数1, 参数2)
参数1:字符串类型 原功能的名称。
参数2:字符串类型 新名称
作用及说明:重新设置本窗体的某个功能的显示名,一般用于同一个功能按钮有多种状态的使用。
示例:
●添加右键菜单:Me.AddContextMenu(参数1, 参数2)
参数1:Contrl类型 部件的名称,意思就是直接写部件名称就可以,不要加引号。
参数2:字符串类型 功能名称,右键菜单执行的代码是直接调用的功能按钮的代码。
作用及说明:在某个部件上添加右键菜单,当鼠标右键点击这个部件时弹出的菜单。
示例:
●获取或设置窗体标题:Me.FormTitle
返回值类型:字符串类型
作用及说明:获取或设置窗体的标题,这是一个属性。
示例:Me.FormTitle="未命名窗体"
●关闭窗体:Me.Close()
作用及说明:关闭当前窗体。
PS:更多的函数在平台中智能向导——窗体环境——智能窗体里查看,并以此为准。
●启动流程:Me.StartFlow(参数1, 参数2)
参数1:字符串类型 流程ID,也就是我们设计的流程图的ID,一般情况是一个GUID。
参数2:任意类型 流程关键值,在流程流转的过程中可以随时调用这个关键值,更具这个值来查询相关内容。
作用及说明:启动一个流程,流程会根据参数1指定的流程图流转。
示例:
●下一步:Me.GoNextNode()
作用及说明:命令流程根据当前的流程图(当前的流程图就是当前窗体的Flow对象里的流程图)走向下一个节点。
示例:Me.GonextNode()
●设置流程变量:Flow.SetParam(参数1, 参数2)
参数1:字符串类型 自定义变量的名称。
参数2:任意类型 自定义变量的值。
作用及说明:向流程添加一个全局变量,直到在该流程结束前都可以调用。
示例:
PS:更多的函数在平台中智能向导——窗体环境——工作流里查看,并以此为准。
智能部件函数在平台中智能向导——窗体环境下会根据当时使用的部件自动显示。
这里需要注意一点的就是:如网格部件、记录部件、树形部件、日程部件、图标部件、分组部件、文档显示部件、文档编辑部件、报表展示部件、office部件这些部件都有一个共同的方法“RefreshData()”,很多人都不明白这个方法到底是什么意思,到底什么时候使用这个方法,这里给大家解释一下,该方法在文档里面是这样注释的:“刷新数据,从服务器获取数据。”,其实说直白一点这个方法就是执行绑定业务表的SQL语句的,执行后把得到的DataTable绑定到部件,这样部件就有了字段结构和数据,刷新一次就重新绑定一次,那么什么时候调用这个方法我想大家应该有个概念了吧。只要需要绑定业务表的部件,肯定都有“RefrshData()”方法。
-->基础环境的内置函数
●转换为字符串:CStr(参数1)
参数1:任意类型。
返回值类型:字符串类型。
作用及说明:把任意类型转换为字符串类型。
●转换为整数:CInt(参数1)
参数1:任意类型。
返回值类型:整数类型。
作用及说明:把任意类型转换为整数类型(int)。
●转换为数字:CDbl(参数1)
参数1:任意类型。
返回值类型:数字类型。
作用及说明:把任意类型转换为数字类型(Double)。
●转换为长整型:CLng(参数1)
参数1:任意类型。
返回值类型:长整型类型。
作用及说明:把任意类型转换为数字类型(long)。
●转换为大写字母:Ucase(参数1)
参数1:字符串类型 需要转换的字符串。
返回值类型:字符串类型。
作用及说明:把一串小写字母转换为大写字母。
●转换为人名币大写:ConvertRMB(参数1)
参数1:数字类型。
返回值类型:字符串类型。
作用及说明:把一个数字转换为人名币大写,如231→贰佰叁拾一。
●判断空值:IsNull(参数1)
参数1:任意类型。
返回值类型:布尔类型,True表示为空值,False表示部位空值。
作用及说明:判断一个值是否为空值(null)。
●执行SQL查询语句:ExecuteSelect(参数1)
参数1:字符串类型 查询的SQL语句。
返回值类型:DataTable类型。
作用及说明:从默认数据库中执行一条查询语句并返回一个DataTable对象,只能是“select”打头查询语句。(有重载函数,详情参看平台中的智能向导)
●执行SQL语句:ExecuteNonQuery(参数1)
参数1:字符串类型 一条SQL语句。
返回值类型:int类型 受有影响的条数(有多少条记录被改变)。
作用及说明:在默认数据库中执行一条SQL语句并返回一个受影响条数,可以是“delete”“update”“insert into”打头的语句。(有重载函数,详情参看平台中的智能向导)
●弹出提示消息:ShowInformation(参数1)
参数1:字符串类型 消息类容。
作用及说明:弹出只有确定按钮的消息提示框。(有重载函数,详情参看平台中的智能向导)。
●打开文件:OpenFile(参数1)
参数1:字符串类型 文件完整路径。
作用及说明:使用Windows默认程序打开指定路径的文件。
PS:更多的函数在平台中智能向导——基础环境——基础函数里查看,并以此为准。
●获取登录用户名:登录用户名 ()
返回值类型:字符串类型 当前登录系统的用户姓名。
作用及说明:获取当前登录系统的用户姓名。
●获取登录用户ID:登录用户ID ()
返回值类型:整数类型 当前登录系统的用户ID。
作用及说明:获取当前登录系统的用户ID,每一个用户ID都是不同的。
●获取登录用户部门名称:登录用户部门名称 ()
返回值类型:字符串类型 当前登录系统的用户所在部门的名称。
作用及说明:获取当前登录系统的用户所在部门的名称。
●获取登录用户部门ID:登录用户部门ID ()
返回值类型:整数类型 当前登录系统的用户所在部门的ID。
作用及说明:获取当前登录系统的用户所在部门的ID。
●获取登录用户部门ID串:登录用户部门串 ()
返回值类型:字符类型 当前登录系统的用户所在的部门ID和所有上级部门ID组成的字符串,以逗号分割。
作用及说明:获取当前登录系统的用户所在的部门ID和所有上级部门ID组成的字符串,以逗号分割,如:“1000,1802,1893”。
●获取登录用户角色名称:登录用户角色名称 ()
返回值类型:字符串类型 当前登录系统的用户所在的角色名称(岗位名称)。
作用及说明:获取当前登录系统的用户所在的角色名称(岗位名称)。
●获取登录用户角色类型:登录用户角色类型 ()
返回值类型:字符串类型 当前登录系统的用户所在的角色的类型,0表示普通类型(普通岗位),1标识领导类型(领导岗位)。
作用及说明:获取当前登录系统的用户所在的角色的类型。
●获取登录用户角色ID:登录用户角色ID ()
返回值类型:整数类型 当前登录系统的用户所在的角色ID(岗位ID),每一个用户的角色ID都是不同的。
作用及说明:获取当前登录系统的用户所在的角色ID(岗位ID)。
●获取组织机构名称:获取机构名称 ()
返回值类型:字符串类型 当前登录系统的用户所属机构的名称。
作用及说明:获取当前登录系统的用户所属机构的名称,也就是在组织机构树里面最上层的名称。
PS:基础环境里面的函数在编写代码的时候是可以直接调出来的,在英文状态下输入”.”可以弹出智能提示,如下图:
但是需要注意的是,目前这个提示智能用键盘的方向键和回车进行选择,不能鼠标点击选择。
这里为什么把DataTable要提出来呢?因为在平台里面对DataTable的操作是比较多的,网格部件、树形部件、记录部件这3大部件是开发中使用最平凡的几个部件,然而这几个部件是与DataTable直接绑定的,(第一章的第三节的业务表里也提到了这个)对DataTable的操作就可以对界面上的数据直接操作。DataTable的用法是和C#完全一样的,大家可以查询相关资料,在下面我列出了DataTable在平台中的一些常用方法属性(大家要注意的是对DataTable的操作是需要区分大小写的):
网格部件、树形部件、记录部件都有一个共同的属性:DataTable,下面这个例子是分别获取这3个部件的DataTable:
PS:当我们在复制DataTable的行(DataRow)时经常会遇到这样的提示:“该DataRow已属于另一个DataTable”或者“该行已属于另一个表”这样的提示,那么使用上面的方法需要用ItemArray属性才行。
本章节以“临时物资采购申请”为例子来讲解在平台中构建表单工作流程的过程,以及构建时的一些技巧与注意事项等。
首先给大家介绍一下表单工作流的概念、用途、实现原理、构建思路。
概念:所谓表单工作流程,字面意思理解就是有一个表按指定的流程流转。一般情况是一系列申请的制式表单,比如请假申请单、物资采购申请单、费用报销单等等,这些表单的格式都是固定的,不会根据每次申请时的情况不同而对格式进行修改的单据。
用途:一般用于格式固定不变并且具有流程性(多个人按照规则参与到同一个表单,就可以说这个表单具有流程性)的表单,而且此类表单大多数的内容都是不超过一页A4纸。
实现原理:一个模版和一张数据表的某条数据按照一个流程图流转。
构建思路:创建表单模版→创建数据表→构建流程图。
创建表单模版我们可以使用WORD或WPS来建立,最后再复制到流程中的模版设计中(在本章第四节处)。如下图所示是WORD建立的一个模版:
上图中方括号“[]”括起来的这种写法是建立模版的格式要求,其实这些方括号括起来的内容就是流程中绑定的数据表中的字段名。也就是说,最后平台会把这个模版中方括号括起来的内容与数据表中的字段进行匹配,再把匹配相同的字段的数据显示在模版中的对应位置。
第一步是创建一个新表,但是在创建的时候一定要注意如下图所示:
创建新表后在默认数据表列表中选中新建的这张表并切换到字段设置,然后会看到如下图所示的界面:
上图显示的这些字段是系统默认的字段,不要修改也不要删除它,但是这些字段是可以使用的。
第二步创建表字段,如下图所示:
建立字段时需要注意一个问题:如果是签名字段的时候,我们需要把这个字段的属性设置多行显 示,并把长度修改为4000,下图是科主任签字字段的属性截图:
设置为多行文本的目的是为了在后面流程图设计的时候,选择签名存放的字段时有这两个字段供 我们选择(必须是多行文本),设置长度为4000是为了有足够的长度来存储签名的内容以及图片。
PS:如需查看类型与编辑类型以及各类型下的相关属性,请查看详细说明:《度量快速开发平台— —类型与编辑类型详解》
第一步创建流程,创建时请选择“创建基于表单的工作流”如下图所示
点击上图中的“下一步”按钮弹出如下图所的界面:
在图显示的界面填写流程名称(自定义填写)、选择使用表(流程存储数据使用的数据表),选择关键信息字段(尽量选择区别每次申请的关键字段),选择其他描述字段(尽量选择区别每次申请的相关信息)后点击节点模版后面的编辑按钮,弹出如下图所示界面:
把WORD中建好的模版复制过来,上图中我已经把模版复制了进来,最后点击上图界面上的确定按钮就创 建好了一个流程。
第二步设计流程图,在工作流管理里面找到刚刚我们新建的流程“临时物资采购申请”,然后选择菜单栏里面的“流程设计”就弹出了下图所示流程图设计的界面:
上图中经过我的托拉拽已经把流程图设计好了,箭头表示的是各个节点的使用情况,右边是 节点的属性列表,在属性列表中我们常用的属性是标题、显示控制、任务主题、执行人员以 及审批参数。
审批参数属性是审批节点独有的属性,单击审批参数属性弹出如下图所示的界面:
单击显示控制属性弹出如下图所示的界面:
PS:一般签名字段都是选择可见,不能选择编辑,因为签名字段的信息不是在表单上直接录 入的,而是在审核签字的时候弹出的一个子窗体里填写已经和签名然后追加到这个字段中保 存,所以部需要选择编辑,也不选择不可见。
第三步运行查看效果,如下图所示:
在上图所示界面填写相关信息后就可以点击下一步交给下一个人处理了。
本章节以构建“人员基本信息管理”为例子来讲解在平台中构建智能窗体的过程,以及构建时的一些技巧与注意事项等。
首先给大家介绍一下智能窗体的概念、用途、构建思路。
概念:智能窗体,智能表现在代码少,操作方便,智能识别,智能提示等方面,所以称之为智能窗体,然后智能窗体里面具有这些特点的控件又被称之为智能部件。
用途:窗体的开发应用很广泛,这个就不用多说了,在平台中还可以利用窗体构建高级工作流,将会在第五章讲解。
构建思路:创建数据表→创建业务表→创建窗体→添加代码
创建一个物理数据表用于存储人员信息。
第一步创建一个新表,但是在创建的时候注意不用勾选任何选项,如下图:
在上图中可以对主键名称和主键类型进行自定义修改,但是“创建为系统流程表单”这个选项就不要勾选了。
第二步创建字段,在默认数据库列表中选择第一步创建的“人员基本信息管理”,然后切换到字段设置,如下图所示(下图中已经把字段设置完成):
对上图中的性别字段和爱好特长字段进行属性设置,如下图:
对性别字段属性设置时,打开选项设置后弹出如下图所示的界面:
选中上图中新增的性别字段并确定就完成了性别字段的单项选择设置。
我们需要创建2张业务表,一张是只读业务表,用于读取所有人员信息。另一张是读写业务表,用于新增一条人员信息并保存,或者读取一条人员信息进行修改并保存。
首先添加只读业务表,如下图所示:
添加完成后在相应的目录下找到该业务表然后单击菜单栏中的内容构建(开始构建SQL语句),如下图所示:
在上图中首选选择默认数据库,然后筛选找到“人员基本信息管理”这个表,再选择所有字段,最后保存。
再添加读写业务表,如下图所示:
添加完成后在相应的目录下找到该业务表然后单击菜单栏中的内容构建(开始构建SQL语句),如下图所示:
上图中选择好数据库、数据表和表的字段后,切换到条件设置,为该业务表添加一个业务表变量(也就是为SQL语句添加一个条件变量),如下图所示:
上图中的“ID=[:变量ID]”的意思是:左边是字段中的ID,右边是自定义的一个变量名称。添加完成后单击上图中的保存按钮会弹出如下窗体:
PS:只读业务表和读写业务表都是可以添加业务表变量的,并且只读业务表可以自定义编辑SQL语句,而读写业务表是不能自定义编辑SQL语句的,只能在SQL构造器中勾选字段。
我们需要创建2个窗体,一个是显示所有人员信息列表的主窗体(人员基本信息管理窗体),从这个窗体上可以打开另一个子窗体(人员基本信息编辑窗体)进行新增或者修改。
创建子窗体:人员基本信息编辑
第一步创建新窗体,修改窗体标题为“人员基本信息编辑”,并拖入一个记录部件到窗体中,如下图:
第二步为记录部件绑定一个业务表,单击上图中左上角的进入设计,然后选择记录部件在右边会出记录部件的属性,如下图所示:
在上图中可以看到记录部件有一个业务表的属性,这个属性就是选择我们需要绑定的业务表,也就是第三节中我们创建的读写业务表,选择后我们可以看到记录部件的变化如下图所示:
注意:这里完成后一定要记得单击保存设计哦,要不然下一步添加代码就不能继续。
PS:对记录部件的字段布局可以查看官方的视频:《记录部件字段布局》、《记录部件分组部件》、《记录部件选项卡布局》
第三步在“事件管理”里面添加代码,在窗体设计器的上方有一个“事件管理”的按钮,如下图所示:
上图中加载事件中的代码的意思是:判断主窗体是操作的是新增,还是修改,然后在子窗体中进行相应代码的执行。
对与上面的代码:me.Input1、me.Input2、记录部件1.AddNewRow()、记录部件1.SetVaribleValue()、
记录部件1.RereshData()在智能向导中都有相应的说明与示例,并都可以通过智能向导生成。
PS:部件刷新方法的使用在第二章第三节的智能部件函数里有单独介绍。
第四步在“功能管理”里面添加代码,在窗体设计器的上方有一个“功能管理”的按钮,如下图所示:
创建主窗体:人员基本信息管理窗体
第一步创建新窗体,修改窗体标题为“人员基本信息管理”,并拖入一个网格部件到窗体中,如下图:
第二步为网格部件绑定一个业务表,单击上图中左上角的进入设计,然后选择网格部件在右边会出现网格部件的属性,如下图所示:
在上图中可以看到网格部件有一个业务表的属性,这个属性就是选择我们需要绑定的业务表,也就是第三节中我们创建的只读业务表,选择和我们可以看到网格部件的变化如下图所示:
注意:这里完成后一定要记得单击保存设计哦,要不然下一步添加代码就不能继续。
PS:对网格部件的布局可以查看官方的视频:《网格部件字段布局》
第三步在“事件管理”里面添加代码,在窗体设计器的上方有一个“事件管理”的按钮,如下图所示:
PS:部件刷新方法的使用在第二章第三节的智能部件函数里有单独介绍。
第四步在“功能管理”里面添加“新增”、“修改”、“删除”这两个功能,如下图一(新增功能)图二(修改功能)图三(刷新功能)所示:
(图一)
(图二)
(图三)
第五步,运行查看效果,如下图所示为修改人员信息时的界面:
高级工作流,其实是结合窗体与流程的一种构建类型。简单的说就是把窗体按照一定的流程流转,在平台中就称之为高级工作流。
下面给大家介绍一下高级工作流的概念、用途、构建思路。
概念:所谓高级工作流,就是比普通的表单工作流程功能更强大,一般表单工作流是使用一个固定的模版来操作数据,而高级工作流是使用的窗体来操作数据,使用窗体来操作数据就更加的灵活了。
用途:一般用于申请内容不是固定不变的 ,例如物资采购申请,每次申请的物资个数都部一样,那么就需要使用高级工作流程来完成。
构建思路:创建数据表→创建业务表→创建窗体→创建流程图
由于高级工作流程的构建步骤相对不太好描述,所以具体的构建操作请参看构建视频:《高级工作开发》
报表一般用于数据的显示,用于汇总统计方面的查询,常用报表一般分为:网格报表、多列报表、套打报表、分组报表等。
网格报表,是最简单的一种报表,就是把数据以网格的形式显示出来,如下图:
多列报表,多列报表常用与卡片类型的数据显示,如下图所示:
套打报表,就是把内容打印到固定格式纸张上的相应位置,如下图所示(背景是一张格式图片):
分组报表,主要是对数据进行一个分组的展示,如下图所示:
使用报表展现数据可以直观明确的对数据进行查看统计,然而在平台中构建这些报表是一件非常简单的事情。
首先说一下构建的思路:构建业务表(查询出相关数据)→构建报表→在窗体中用报表展现部件显示报表。
构建业务表,构建业务表这个和构建智能窗体时一样,但是报表都是只读业务表,因为报表只用于数据的查询,不会写入数据。
构建报表,在平台中有一个专门的报表设计器,在这个可视化的界面里面可以轻松的构建出想要的报表,如下图所示:
点击上图中的“设计报表”会弹出如下图所示的设计报表的界面:
显示报表,显示报表需要在智能窗体中使用报表展现部件来显示,如下图所示:
在报表展现部件中绑定一个事先构建好的报表,那么就可以显示数据并展示给用户。
PS:报表具体构建的步骤请参看《报表构建》系列视频。
在平台中发布一个构建好的应该我们只需要3个步骤:菜单定义→角色管理→授权管理。
菜单定义,就是把我们构建好的应用配置一个菜单,用户可以点击这个菜单进入到这个应用。
角色管理,把同一个角色需要使用到的菜单分配到一起,相当于把菜单分组。当然这里也可以对我们构建的窗体的某些功能进行分配。
授权管理,就是把角色管理里面添加的这些角色分配到相应的人员使用。
PS:这就是我们第一章第二节里面讲到的菜单权限的控制。
在平台中定义一个菜单有四种模式:程序集、智能窗体、表单流程、网页。
程序集:通俗一点将就是可以配置一个菜单出来调用我们外部的程序,包括.exe程序,或者DLL(动态库)文件,这个目的就是为了满足我们平台开发不出来的功能时借助外部工具开发后在放到我们平台中。这也是我们第一章第二节中将扩展开发时候说到的。
例子:
上面这个例子就是配置了一个打开外部程序“文件库”的菜单。
智能窗体,也就是在在平台中开发出来的智能窗体,也就是第四章——智能窗体构建讲到的,可以把某个窗体作为这个应用的主界面配置出来使用。
如下图这个例子:
上面这个例子就是配置一个“知识库”的智能窗体菜单。
表单流程,也就是我们在平台中开发出来的表单流程,也就是第三章表单工作流程构建讲到的,可以把构建出来的表单流程配置到菜单中,但是表单流程有2个类型可以选择,第一个是“申请流程”类型,这个类型的菜单是每个人点开之后只能看到自己申请过的记录,配置如下图:
第2个是“归档查询”类型,这个类型的菜单是能看到所有人申请的记录,并且有删除权限,配置如下图:
网页,网页类型的菜单就是直接输入一个网页连接,那么这个菜单就可以直接打开这个网页,配置如下图:
角色管理,可以理解成把菜单按不同的角色类型进行分组,比如:科主任菜单、管理员菜单、默认菜单等等,并且在角色里可以分配某个窗体的某个功能是否可以使用。这样的分配菜单授权方式就完全能满足我们的权限分配了,如下图是“默认菜单组”角色的菜单定义:
授权管理,就是把配置好的角色分配给某个些部门、岗位、或者人员,如下图是把院长岗位授予设计人员角色的权限:
在平台中构建的智能窗体、表单流程、报表、数据表这些东西都是可以导入导出的,并且有多种方式可以选择导入导出。
对智能窗体和表单工作流程的导入导出我们可以使用开发工具里面的导入导出应用包这个功能,这个相当于批量导入导出窗体和流程相关信息,如下图:
在上图中单击下一步根据提示一步一步操作下去就可以把相应的窗体(业务表)、表单工作流,以及数据表结构一起导出到一个应用包,导入的时候也是相同的操作步骤的。
对于智能窗体、表单流程、数据表、报表也可以单独的导入导出:
智能窗体,在智能窗体菜单中就有导入导出按钮,如下图:
这里导入导出也会把窗体相应的业务表一起导入导出,但是数据表结构需要单独导入导出。
表单工作流,工作流管理菜单中也有导入导出按钮,如下图:
用这里的功能导入导出,那么我们还需要单独导入导出数据表结构。
数据表,数据表结构在数据库维护菜单中也可以单独导入导出,如下图是导出表结构:
那么导入表结构需要选择数据库单击右键,如下图:
报表,报表的导入导出就在报表设计器里面,如下图:
这里导入导出会把相关的业务表一起导入导出,但是所使用到的数据表结构需要单独导入导出。
主窗体指的是平台的主窗体,不是我们构建应用时候的窗体。那么主窗体事件就是官方提供的当主窗体在某些情况下会触发的一些事件。官方目前提供了:主窗体加载事件、主窗体关闭事件、岗位切换事件、一级菜单切换事件。
主窗体事件管理的菜单在开发工具下面就能看到,如下图:
在这些事件中我们可以根据具实际情况做点什么,比如:想在客户端登录的时做一些判断,然后弹出一些提示,那么我们就可以在主窗体加载事件中编写这些代码。其他几个事件以此类推,这些事件的用处是非常多的。
公共函数意思就完全公开的函数,在平台的任意一个角落都可以调用,智能窗体构建时、表单流程的扩展代码中、主页插件配置时、以及主窗体事件中都是可以调用的,但是目前不能调用这些公共函数的只有一个地方,那就是在报表设计器里面设计报表的时候不能调用。
公告函数的菜单在开发工具下面就能看到,如下图:
上图展示的公告函数是把接收到的身份证号计算出年龄,并把计算出来的年龄传回去。
在智能窗体、表单流程中的调用方式:call(“方法名”)。如果是需要传入参数就用call(“方法名”,参数1,参数2,……),在公共函数中接收参数就用this.Input1、this.Input2……对应接收参数1,参数2。如下图所示是调用时候的代码:
主页,一般来说是我们登录平台的第一个页面,通常叫“我的桌面”或“系统首页”,也就是显示待办流程、通知公告、新闻通知的页面,如下图所示:
与上图类似的主页不只是只有登陆首页这么一个,我们可以更具实际情况配置更多的主页。
主页配置管理,在这个菜单里就可以进行主页的配置,如下图所示是配置一个人事主页:
在上图中勾选的这些组件就是我们本章第二节将要讲到的主页插件。
配置主页到菜单,在上图中添加一个主页后并选择主页将要使用到的某些插件后,我们就可以把该主页配置呈菜单但发布出来,在菜单定义中如下图所示配置:
上图中的“传入参数为主页ID”指的是在添加主页的时候自己定义或者系统自动生成的主页ID。
主页插件,也就是每个主页上面显示的模块,主页插件分为:系统插件、表格插件、HTML嵌入式网页插件、HTML扩展插件。
系统插件是无法修改的,而且在主页插件管理里面也看不到的,如待办流程、图片新闻、万年日历等。
表格插件是使用最多的一种插件类型,目前系统上看到的都是使用的表格插件类型。如下图所示是文件中心的插件截图:
在表格插件里面需要设置表格标题、数据行的字符串、SQL语句。
在数据行字符串这一栏里面可以看到用花括号“{}”括起来的数字,如下图所示:
这些内容代表的是SQL语句查询出来的列的下标。
再如下图所示的”javacript:CallFunction4”表示的是调用公共函数(第八章第二节里面有提到):
CallFunction4表示给指定的方法传入4个参数,CallFuntion3表示传入3个参数,以此类推。
数据整合,意思就是我们可以对多个数据库的数据进行操作,目前支持比较流行的两大数据库:Oracle数据库和SqlServer数据库。
如下图所示,在平台的数据库维护中配置一个连接到其他oracle数据库的连接:
当然还有一个重要的问题,在连接大家都知道Oracle数据库是分中英文字符集的,那么通过平台连接查询英文字符集的数据库时怎么办呢?其实这个大家可以放心,度量科技已经解决了这个问题,而且这个方式已经在各大项目场上实践过了,效果非常好。简单的说就是通过平台连接到另一个服务器进行转换,当然这个服务器完全就可以用一个虚拟机,一点都不占用资源。
如下图所示,是在平台的数据库维护中配置一个连接到其他SqlServer数据库的连接:
在平台中是可以调用外部程序的,这个在第一章第二节扩展开发简介中有说到。只是外部程序只能是.NET开发的程序。
第一种调用方式,定义菜单调用平台目录下的其他应用程序,如下图所示:
调用.EXE的程序也是一样的,只需要把程序集的名称的后缀修改为.EXE就行了。
第二种调用方式,实例化一个外部程序的类,如下截图:
在智能向导→公共函数→加载外部程序集,可以查看LoadAssembly方法的使用,使用该方法就可以调用自己用.NET写的方法、属性、窗体等。
在平台中也有短信猫的功能,也就是可以通过平台直接给手机发送短信,也有定时发送的功能,平时我们可以定时查询统计一些数据然后发送到相应的手机上。
在系统维护下面有一个系统任务的菜单,如下截图:
当然执行这些任务在平台发服务器上是需要启动短信猫后台服务程序的,短信猫后台服务程序如下截图:
当然还得有一个短信猫的设备才行哦。