JAVA与财务数据库Essbase连接并取数

废话不多说直接开始

首先Essbase连接分几种,我所知的有2种一种是使用Excel的com插件根据对应的科目加载数据至Excel 表格,另外一种呢就是使用JAVA代码连接Essbase的JAPI接口。

1.配置相关

server.username=username
server.password=password
essbase.address=localhost
essbase.provider=http://localhost:19000/aps/JAPI

首先连接Essbase需要账号密码,其次需要知道JAPI的接口地址以及需要连接的实际数据库所在的机器

ps:以上address和provider一般在正式的环境下这2个不在一台机器上。

2. 代码部分

我们连接取数的时候,类似于使用Excel的模式先构建出一个带门店带科目的表头信息。

左边呢是门店,上面呢是科目相当于2021年的工资数据,可能工资里面有细分到A,B,C,D等等,中间部分呢就是待取的数据

JAVA与财务数据库Essbase连接并取数

好我们开始

首先是公共的抽数方法

 /**
     *  最终的抽数方法 传入科目信息 以及appname cubename
     * @param columns  科目信息
     * @param s_appName  appName
     * @param s_cubeName cubeName
     * @return
     * @throws Exception
     */
public Map<String, List<Double>> getEssbaseData(List<List<String>> columns, String s_appName, String s_cubeName) throws Exception {
        properties = CommonUtils.getProperties("config.properties");
        s_userName = properties.getProperty("server.username");
        s_password = properties.getProperty("server.password");
        s_provider = properties.getProperty("essbase.provider");
        s_analyticSvrName = properties.getProperty("essbase.address");

        IEssbase ess = IEssbase.Home.create(IEssbase.JAPI_VERSION);
        IEssDomain dom = ess.signOn(s_userName, s_password, false, null, s_provider);
        IEssCubeView cv = dom.openCubeView("Data Query Example", s_analyticSvrName, s_appName, s_cubeName);
        cv.setRepeatMemberNames(true);
        cv.setIncludeSelection(false);
        cv.setSuppressMissing(true);
        cv.setSuppressZero(true);
        cv.setDrillLevel(IEssOpZoomIn.EEssZoomInPreference.BOTTOM_LEVEL);
        cv.updatePropertyValues();
        //这里获取你的门店集合 我这里就用new一个新的
        List<String> stores = new ArrayList<>();
        Map<String, List<Double>> essbaseDataMap = performCubeViewOperation(ess, cv, stores, columns);
        return essbaseDataMap;
    }


 public Map<String, List<Double>> performCubeViewOperation(IEssbase ess, IEssCubeView cv, List<String> stores, List<List<String>> columns) throws EssException {
        IEssGridView grid = cv.getGridView();
        setEssvaseGridView(grid, stores, columns);
        IEssOperation op = null;
        op = cv.createIEssOpRetrieve();
        cv.performOperation(op);
        int cntRows = grid.getCountRows(), cntCols = grid.getCountColumns();

        Map<String, List<Double>> essbaseResultMap = new HashMap<>();
        for (int r = columns.get(0).size(); r < cntRows; r++) {
            String store = grid.getStringValue(r, 0).trim();
            List<Double> datas = new ArrayList<>();
            for (int j = 1; j < cntCols; j++) {
                String value = grid.getStringValue(r, j);
                if ("#Missing".equals(value)) {
                    value = "";
                }
                datas.add("".equals(value) ? 0.0 : Double.parseDouble(value));
            }
            essbaseResultMap.put(store, datas);
        }
        return essbaseResultMap;
    }




 public void setEssvaseGridView(IEssGridView grid, List<String> stores, List<List<String>> columns) throws EssException {
//        //设置grid 表格大小  多少行 多少列
        grid.setSize(columns.get(0).size() + stores.size(), 1 + columns.size());
//        //设置 表头
        int titleRow = 0;
        for (int i = 1; i <= columns.size(); i++) {

            for (int j = 0; j < columns.get(i - 1).size(); j++) {
                titleRow = columns.get(i - 1).size();
                //设置 表格 表头  行 列 数值
                grid.setValue(j, i, columns.get(i - 1).get(j));
            }
        }
        //设置门店列
        for (int i = 0; i < stores.size(); i++) {
            String storeStr = stores.get(i);
            //设置 门店   行 列  门店编码   行 为 表头下第一行  列为 0
            grid.setValue(titleRow + i, 0, storeStr);
        }
    }

 

然后是在其他地方构建一个科目list调用抽数方法 

String[] codes= {"NumberA","NumberC","NumberD","NumberE","NumberF","NumberG"}
//构建cells
List<List<String>> columns = new ArrayList<>();
for (String item : codes) {
            List<String> column = new ArrayList<>();
            //年
            column.add(2021);
            column.add("wage");
            column.add(item);
            columns.add(column);
        }

Map<String, List<Double>> map = getEssbaseData(columns, "appName", "cubeName");

最终返回的这个map的格式是这样子的,key呢是每个门店 value是科目的值,就跟下面的excel表格一样前面的门店是key,后面的值1000-1006是一个有序的list,从1000-1006,当然正常数据不是这样子的只是做一个演示。 

JAVA与财务数据库Essbase连接并取数 

 

以上就是本次全部内容。

 

 

上一篇:MongoDB shell 命令


下一篇:冲刺博客Day5