页面树结构
转至元数据结尾
转至元数据起始

正在查看旧版本。 查看 当前版本.

与当前比较 查看页面历史

« 前一个 版本 28 下一个 »

1、概述

接口查询主要场景是客户不想或者没有办法连接到数据源,需要通过接口的方式获取数;更多的是作为数据集的存在,并且返回的数据是基本都是一个大宽表。

Smartbi 数据模型支持添加 2 种接口查询:Java查询、脚本查询.

Java查询、脚本查询只支持抽取模式, 如果模型原先是直连模式,加入了Java查询会强制变成抽取模式!

详情可查阅:直连&抽取


2 Java查询

Java查询是指由用户通过二次开发,自定义JavaQueryData接口实现类,以实现自定义数据结构;

Java查询允许没有一个物理数据库存储其字段和数据,比如可以通过类将任意一个含有数据的文件或报表通过解析后,运用到Smartbi中,当然它也允许对数据库中的数据查询出来通过Java代码进行二次计算加工后返回给Smartbi。

支持以下几种方式:

  • 读取客户放在服务器上文件:CSV查询、Txt查询
  • 通过http方式获取数据:WebService作为数据源
  • 需要写java代码从接口获取不开放数据库取数的场景:自定义类

2.1 示例说明

2.1.1 获取文件数据

下面示例演示通"CSV查询"获取文件数据。

刘老师想基于把学生的每个月的考试分数进行一个趋势分析,所以把线下数据上传到服务器上进行分析。

下载示例数据:StudentScore.xls

具体步骤如下:

1)需要先把CSV格式的文件上传到部署Smartbi war包的服务器上,以Linux服务器为例,可以把文件上传到home目录下:路径不限,存放的文件夹可以是自己新建的,也可以是已有的文件夹中。

2)存放好之后再去模型中建【Java查询】,选择”CSV查询“,操作如下图:

  • 文件存放路径:绝对路径(即指目录下的绝对位置,直接到达目标位置,通常是从盘符开始的路径),如果不是绝对路径,会查找不到文件;
  • 编码:一般GBK或UTF-8,也可以根据需求填写其他的编码比如Unicode、ASCII
  • 上传的文件如果没有列头,则默认第一行数据为列头;
  • “TXT查询”与”CSV查询“操作逻辑是一致的,不再另写示例说明;其中“TXT查询”需要写“分割符”,分隔符需要与文件保持一致,才能正常取数。

3)获取到数据,想回到数据模型,建议先点击【保存】之后再点击【回到模型】;

回到模型,可以选中该查询,右键菜单可以对该进行进行更多的操作比如编辑、复制等,具体可查看:设置及修改查询


2.1.2 通过Java代码自定义类获取数据

对于技术能力比较强的客户,Smartbi提供了灵活的接口,方便用户自定义Java文件,实现某些业务需求。

为了方便举例,本文用产品内置的”smartbi.session.SessionQueryData“即获取”每日会话信息“为例。

具体的操作如下:

1)创建模型并在里面添加“Java查询”

  • 自定义类名:在输入自定义类名之前,需要先参考二次开发文档,编写IJavaQueryData接口实现类,实现自己的JAVABean逻辑,并将编译好的class文件添加到系统中。相关内容请参考:IJavaQueryData
  • 输入了自定义类名之后,点击右侧的“获取默认配置”,在配置信息中会出现java类中定义的一些配置信息,对此进行配置,如果没有则无需进行配置.
  • 配置完毕之后,需要点击工具栏的“执行”按钮或鼠标离开,获取到根据配置项和java类代码,得到的参数和结果字段数据

2)如果要回到模型,建议先点击保存,然后再回到模型,更多操作可查看设置及修改查询


3 脚本查询

脚本查询是指通过编写代码脚本获取数据结果;

目前“脚本查询”支持的语言只有JavaScript,因此适用于熟悉JavaScript的技术人员,相关接口文档可参考IJavaQueryData

为了方面理解,以产品自带的数据源“northwind”中的【产品表】为目标资源,展示了如何通过编写JavaScript脚本获取指定节点ID的数据源表数据的例子来进行说明。

具体操作如下:

1)左侧 “系统导航栏”中的“数据连接” ,选择  “数据连接” > “northwind” > “产品表” ,右键打开扩展菜单,点击“属性”,找到【产品表】资源的节点ID,并且记录下来

2)去模型中建【脚本查询】,把刚记录下来的资源节点复制下图的变量中,如下图, 并且写好获取数据的代码,执行成功之后可以看到已经获取【产品表】的数据

示例代码·读取指定节点资源的表数据
importPackage(Packages.smartbi.freequery.client.datasource);

var datasourceService = DataSourceService.getInstance();
var tableId = "TAB.northwind.null.products";   //目标资源的节点ID
var table = datasourceService.getTable(tableId);
var sql = "select";
var data;

function init() {
    var fieldList = table.getFields();
    var fields = [];
    for (var i = 0; i < fieldList.size(); i++) {
        var field = fieldList.get(i);
        sql = sql + " " + field.getName();
        fields[i] = {
            id: field.getId(), //字段ID
            name: field.getName(), //字段名称
            alias: field.getAlias(), //字段别名
            desc: field.getDesc(), //字段描述
            valueType: parseValueType(field.getDataType().getSQLType()) //字段数据类型:INTEGER | DOUBLE | LONG | STRING | DATETIME
        }
        if (i < fieldList.size() - 1) {
            sql = sql + ",";
        }
    }
    sql = sql + " from " + table.getName();
    return {
		// //参数列表
		// params: [{
			// id: 'Param.northwind.null.products', //参数ID
			// name: 'ParamName', //参数名称
			// alias: 'ParamAlias', //参数别名
			// desc: 'ParamDesc', //参数描述
			// nullable: true, //参数是否允许是空
			// valueType: 'STRING' //参数数据类型:INTEGER | DOUBLE | LONG | STRING | DATETIME
		// }],
		//输出字段
        fields: fields
    };
}

function getGridData(paramValues, from, count) {
    data = datasourceService.executeNoCacheable(table.getDataSource().getId(), sql);
    return data;
}


function getRowCount() {
    return data.getRowsCount();
}


/**
  关闭查询对象
*/
function close() {}

function parseValueType(type) {
    switch ("" + type) {
        case "LONG":
            return "LONG";
        case "BIGINT":
        case "INTEGER":
            return "INTEGER";
        case "BIGDECIMAL":
        case "DOUBLE":
            return "DOUBLE";
        case "TIME":
        case "DATE":
        case "DATETIME":
            return "DATETIME";
        default:
            return "STRING";
    }
}

单击 保存 按钮,系统提示保存成功后,当前脚本查询会以表的输出节点方式保存在数据模型的”表关系区“中,如下图:

可以在模型修改数据类型、修改别名设置与其他查询的关系或者构建数据模型


  • 无标签