# 多数据源

当不同类型系统之间(例如MES和ERP)需要传递数据时,同一个页面中可能存在多个Grid,并且数据源来自多个不同的数据库,可以使用SQL语句+第三方数据源的方式绑定数据源。

# 添加第三方数据源

在界面中为组件绑定第三方数据源之前,首先要在二次开发模块下的数据源界面中添加第三方数据

datasource-third-add

各部分说明:

  • 名称:自定义名称
  • 数据库驱动:不同数据库对应的驱动如下
    • MySql:com.mysql.jdbc.Driver
    • SqlServer:com.microsoft.sqlserver.jdbc.SQLServerDriver
    • Oracle:oracle.jdbc.OracleDriver
  • 数据库方言:不同数据库对应的数据库方言如下
    • MySql:org.hibernate.dialect.MySQL5InnoDBDialect
    • SqlServer:org.hibernate.dialect.SQLServer2008Dialect
    • Oracle:org.hibernate.dialect.Oracle10gDialect
  • URL:数据库的连接地址;
  • 用户名/密码:数据库的用户名和密码;
  • 最大/最小连接数:允许连接的最大/最小用户数;

数据源添加完成后,查看状态是否是已激活,只有激活的数据源才可以在配置数据源时显示

# 设置数据源

# 选择数据库

datasource-third-bind

# 输入SQL语句

如果SQL语句正确,Grid下的Column组件的数据源选项中可以选到查询的字段

datasource-third-sql

# SQL语句说明

通过SQL语句为组件绑定数据源时,如果使用一般的SQL语句,是没有过滤属性的, <#if></#if>语句的作用是为该数据源添加过滤属性和过滤条件

select * from ut_material
<#if matDesc??  && matDesc!=''>where MT_DESC=:matDesc</#if>

以上面例子中的SQL语句为例,各部分含义如下:

  • matDesc 数据源过滤属性
  • matDesc?? 表示matDesc不为空时,才执行<#if></#if>之间的语句
  • MT_DESC 表示数据库中与过滤属性绑定的字段名
  • =: 将运算符两边的变量绑定,在执行过滤时判断两边是否相等

其他判断条件语法格式如下:

  • 左匹配
select * from ut_material where 1=1
<#if matDesc??  && matDesc!=''>and MT_DESC like:matDesc%</#if>
  • 右匹配
select * from ut_material where 1=1
<#if matDesc??  && matDesc!=''>and MT_DESC like%:matDesc</#if>
  • 包含
select * from ut_material where 1=1
<#if matDesc??  && matDesc!=''>and MT_DESC like%:matDesc%</#if>

matDesc!=''判空语句,这里写 空字符串 '' 是因为数据库中的MT_DESC字段是字符串类型,其他数据类型写法可能不同,long类型写法如下;

select * from ut_material
<#if matId?? && matId!=-1>where MT_ID=:matId</#if>

# 过滤功能

# 使用输入框+按钮的方式过滤数据

在按钮的点击事件中设置流程,首先获取输入框的输入值,然后添加过滤器, 过滤目标设置成上面绑定好数据源的Grid,在过滤属性下拉框中出现的matDesc就是上面SQL语句中写的过滤属性,表达式直接填入在"获取组件值"中取的别名即可。

datasource-third-filter1-expression

# 多个表之间的过滤功能

要实现的效果如下图所示,当选中表A一行数据后,自动使用版本号过滤表B:

datasource-third-filter2-result

# 为表A绑定数据源

# 为表B绑定数据源

# 添加过滤器

在表A的选中事件中添加流程,首先获取表A的值,然后添加过滤器,输入表达式:

获取Grid某个列的值表达式写法和TextField不同,因为对Grid使用获取组件值功能,拿到的是当前选中的一整条记录(未选择数据则为null),如果想拿到特定字段的值,需要使用平台定义好的get方法,为Grid绑定不同类型的数据源时,获取到值的类型和写法也略有不同,当使用SQL设置数据源时, 获取类型是java中的HashMap类型,以字段名为键,字段值作为值,具体类型和写法如下:

  • SYSTEM_OBJECT 平台为每个系统表都提供了对应的原生类,类中为每个字段封装了get和set方法 完整类型名一般为驼峰命名法的数据库表名称,例如用户User表对应的完整类名如下。
com.ags.meperframework.suites.appbase.sdk.base.domain.User

示例

edition.getEdition()
  • CUSTOMIZED_TABLE 平台为所有自定义表统一定义了一个CustomizedObjectSupport类,公共字段的获取方法和系统表写法相同,自定义字段写法getValue("字段名") 完整类型名
com.ags.meperframework.suites.appbase.sdk.base.domain.CustomizedObjectSupport

示例

edition.getValue("Edition")
  • SQL 获取到的数据类型是HashMap,使用HashMap提供的get(“字段名”)方法;
    • key:字段名(全大写);
    • value:字段值;
java.util.HashMap

示例

edition.get("Edition")
数据源类型 “获取组件值”的类型名 获取字段值表达式 示例
SYSTEM_OBJECT com.ags.meperframework.suites.appbase.sdk.base.domain.表名称 getXxx(); Xxx-字段名 edition.getEdition()
CUSTOMIZED_TABLE com.ags.meperframework.suites.appbase.sdk.base.domain.CustomizedObjectSupport 公共字段同上;自定义字段getValue("字段名"); edition.getValue("Edition")
SQL+第三方数据源 java.util.HashMap get("字段名"); edition.get("EDITION")