找回密码
 立即注册

QQ登录

只需一步,快速开始

spencer

注册会员

9

主题

24

帖子

85

积分

注册会员

积分
85
spencer
注册会员   /  发表于:2020-3-7 23:30  /   查看:11010  /  回复:15
1金币
在华融案例中,郭工提到,最简单的做法就是把整个sheet的数据存成JSON,一整块都保存进数据库里。下次需要时也是整块提取出来再渲染到sheet里。
可是,如果需要对保存的数据,比如链接wyn enterprise进行进一步报表分析,或者仪表板设计。那么在SpreadJS保存时势必要进行数据拆分保存。
但是如果每个表都单独开发基于这个表的数据保存逻辑,势必就太麻烦了,失去了SpreadJS的一大亮点。
华融的郭工似乎介绍了一种解决方案,他提到分三个层面进行数据库保存,一个层面是保存维度,第二个层面是保存指标名,第三个维度是保存指标值。
这样就能实现不用聚焦某个表进行开发,而是所有表都是按这个格式进行数据保存。但是需要用数据的时候又能解析进行分析。
但是还不是太理解,他的这个思路,
是怎么能高效的去对整块JSON数据进行解析后存数据库,同时后续需要对数据进一步分析处理时,又是怎么解析出来的?
能否请版主详细帮展开解释一下?谢谢!

15 个回复

正序浏览
Fiooona
论坛元老   /  发表于:2020-7-7 10:15:28
16#
组件化表格编辑器(预览版)试用进行中,点击了解详情!
请点击评分,对我的服务做出评价!5分为非常满意!
回复 使用道具 举报
adongguo讲师达人认证
金牌服务用户   /  发表于:2020-7-7 09:18:39
15#
spencer 发表于 2020-7-6 16:05
郭经理您好,我在编写程序的时候,还遇到一个问题,还需要请教一下。
在视频里,您说每个模板配套的js文件 ...

示例代码放到了下面,思路上就是处理不同的模板上一些特定的校验或者解析成后端通用的数据格式;
至于具体如何实现,其实都是灵活的,只要能解决您的问题都是可以的,不必完全拘泥于具体格式。

  1. var finacePage = {

  2.     /*
  3.     * 组装财报结构化数据
  4.     * */
  5.     assembleFinanceDto: function (spread) {
  6.         // 财报页面维度拼接 gxd
  7.         // {指标名:xx,指标值:xx,维度:xx,系统标识:xx}

  8.         var dataSources = spreadJSUtil.getDataSourceForSheets("ss");

  9.         // 资产负债表-金融-非合并
  10.         var bindData = dataSources[0].dataSource;
  11.         var dataOne = _assembleHelper(bindData, "CustFiRE", "ZCFZB");
  12.         // 利润表-金融-非合并
  13.         bindData = dataSources[1].dataSource;
  14.         var dataTwo = _assembleHelper(bindData, "CustFiRE", "LRB");
  15.         // 现金流量表-金融-非合并
  16.         bindData = dataSources[2].dataSource;
  17.         var dataThree = _assembleHelper(bindData, "CustFiRE", "XJLLB");

  18.         return  dataOne.concat(dataTwo, dataThree);
  19.     },
  20.     /**
  21.      * 对spread进行验证
  22.      * @param spread spreadjs的spread对象
  23.      */
  24.     validation: function (spread) {
  25.         var sheetCount = spread.getSheetCount();
  26.         var result = {};
  27.         var isValid = true;
  28.         for (var i = 0; i < sheetCount; i++) {
  29.             var sheet = spread.getSheet(i);
  30.             var rowCount = sheet.getRowCount();
  31.             var colCount = sheet.getColumnCount();
  32.             for (var j = 0; j < rowCount; j++) {
  33.                 for (var k = 0; k < colCount; k++) {
  34.                     var dataValidator = sheet.getDataValidator(j, k);
  35.                     isValid = (dataValidator !== undefined) ? sheet.isValid(j, k, sheet.getValue(j, k)) : isValid;
  36.                     if(!isValid){
  37.                         result['isValid'] = isValid;
  38.                         result['isForce'] = true;
  39.                         return result;
  40.                     }
  41.                 }
  42.             }
  43.         }
  44.         result['isValid'] = isValid;
  45.         result['isForce'] = false;
  46.         return result;
  47.     }
  48. };

  49. function _assembleHelper(bindData, systemFlag, sheetName) {
  50.     var dataArray = [];
  51.     // 维度信息:编制单位,编制日期,财报值类型(包含本期金额,上期金额)
  52.     var dimension = {};
  53.     dimension["makeOrg"] = bindData["makeOrg"];
  54.     dimension["makeDate"] = bindData["makeDate"];
  55.     dimension["sheetName"] = sheetName;

  56.     var bindingNames = Object.keys(bindData);
  57.     for (var i = 0; i < bindingNames.length -2; i++) {
  58.         if (bindingNames[i].indexOf("indicator") !== -1
  59.             && (bindingNames[i + 1].indexOf("filed") !== -1
  60.                 || bindingNames[i + 1].indexOf("field") !== -1)) {
  61.             dimension["valueType"] = "bqje";
  62.             dataArray.push({
  63.                 "quotaName": bindingNames[i].substr(10),
  64.                 "dimension": JSON.stringify(dimension),
  65.                 "systemFlag": systemFlag,
  66.                 "quotaValue": bindData[bindingNames[i+1]]
  67.             });
  68.             dimension["valueType"] = "sqje";
  69.             dataArray.push({
  70.                 "quotaName": bindingNames[i].substr(10),
  71.                 "dimension": JSON.stringify(dimension),
  72.                 "systemFlag": systemFlag,
  73.                 "quotaValue": bindData[bindingNames[i+2]]
  74.             });
  75.             i += 2;
  76.         }
  77.     }

  78.     return dataArray;

  79. }
复制代码

评分

参与人数 1金币 +2000 收起 理由
Clark.Pan + 2000 很给力!

查看全部评分

回复 使用道具 举报
Fiooona
论坛元老   /  发表于:2020-7-6 17:20:08
14#
问题已收到,会替您联系郭经理。
组件化表格编辑器(预览版)试用进行中,点击了解详情!
请点击评分,对我的服务做出评价!5分为非常满意!
回复 使用道具 举报
spencer
注册会员   /  发表于:2020-7-6 16:05:11
13#
郭经理您好,我在编写程序的时候,还遇到一个问题,还需要请教一下。
在视频里,您说每个模板配套的js文件,里面主要处理该表格的样式和数据的解析。
但是,样式已经存在模板JSON数据里面,按理不用存储在js文件里。
而解析数据这块,应该能够通过遍历处理对象中的每一个数据,然后实现从数据库到js对象的转换,并通过spreadjs路径绑定将数据一一赋值到表格中的单元格里。
所以,这个配套模板的js为什么要单独写,我还是有点不明白。但是,我想里面一定是需要做一些每个表格不同的差异化处理,所以才需要配套相应的js文件。
能否分享一下这个js里面大致需要处理的内容?
这个js是自动生成,还是每个模板都要单独手写?
如方便能否贴一些大概的代码举例?不然这个问题的确很困扰我,十分感谢郭经理!
回复 使用道具 举报
Fiooona
论坛元老   /  发表于:2020-3-12 16:46:30
12#
组件化表格编辑器(预览版)试用进行中,点击了解详情!
请点击评分,对我的服务做出评价!5分为非常满意!
回复 使用道具 举报
spencer
注册会员   /  发表于:2020-3-12 16:24:05
11#
谢谢郭经理!谢谢版主!
回复 使用道具 举报
Fiooona
论坛元老   /  发表于:2020-3-12 11:24:30
10#
谢谢回复
组件化表格编辑器(预览版)试用进行中,点击了解详情!
请点击评分,对我的服务做出评价!5分为非常满意!
回复 使用道具 举报
adongguo讲师达人认证
金牌服务用户   /  发表于:2020-3-11 18:19:23
9#
您好  针对每个模板对应的一个js文件,用来出来定制化的操作;维度的理解是正确的。
回复 使用道具 举报
adongguo讲师达人认证
金牌服务用户   /  发表于:2020-3-11 18:19:20
8#
您好  针对每个模板对应的一个js文件,用来出来定制化的操作;维度的理解是正确的。
回复 使用道具 举报
spencer
注册会员   /  发表于:2020-3-10 23:14:02
7#
十分感谢郭经理!
不好意思,可能我还要补充请教两个问题
1、这个动态加载的js文件,是每个模板都是一样的吗?还是根据每个模板拖拽进来的模板标签单独编写处理的js文件?
因为如果不是单独针对某个模板编写处理该模板的JS文件的话,似乎js文件无法获知此模板里有哪些变量需要进行JSON的三段式处理,不知道我这样理解对不对?


2、能不能请您再讲解一下维度?因为我看到好像您忘记回答我对维度的提问了,所以可能还请您帮解答一下,或者说我提问中对维度的理解是否正确呢?谢谢!
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部