Simon.hu 发表于 2020-11-5 16:24:39

帮你打开活字格更神奇的功能:八十八,表格内的公式互算

本帖最后由 Simon.hu 于 2020-11-5 18:36 编辑

最近听到了很多的表格内公式互算的问题,今天咱以一个小例子,让大家了解一下怎么玩
先看一下问题描述哈
页面上有一个表,表格中有3列,分别是【单价】,【数量】,【总价】;我们希望用户任意输入2个值就能自动把第三个值计算出来
这样描述言简意赅,但是细细品味以后,我们需要将这个问题分解,在一点一点考虑,其实问题分解完了以后就是这样的

    新增时:

[*]随便填写2个字段的值,第三个都能自动计算出来

修改时:

[*]修改单价,总价变
[*]修改总价,单价变
[*]修改数量,没效果(这个我专门和几个大佬确定过,确实是这个需求,因为一般数量很少修改,大部分为单价和总价的修改)

清楚了问题以后,我想先给大家看一下期望效果
如下图所示

那么如何来解决问题呢?
活字格自带的功能确实没有,不过这个需要我们的代码来做了,能写代码基本等于万能;P
废话不多说了,先来一个代码吓吓人
// JavaScript source code
Forguncy.Page.ready(function () {

    var priceColIndex = 1;
    var countColIndex = 2;
    var totalColIndex = 3;
    var isSettingValue = false;

    var listview = Forguncy.Page.getListView("表格1");

    var updateCount = function (row) {
      var total = listview.getValue(row, totalColIndex);
      if (total == null) {
            return false
      }
      var price = listview.getValue(row, priceColIndex);
      if (price == null) {
            return false
      }

      var count = total / price;
      isSettingValue = true;
      listview.setValue(row, countColIndex, count);
      isSettingValue = false;

      return true;
    }

    var updatePrice = function (row) {
      var total = listview.getValue(row, totalColIndex);
      if (total == null) {
            return false
      }
      var count = listview.getValue(row, countColIndex);
      if (count == null) {
            return false
      }

      var price = total / count;
      isSettingValue = true;
      listview.setValue(row, priceColIndex, price);
      isSettingValue = false;

      return true;
    }

    var updateTotal = function (row) {
      var price = listview.getValue(row, priceColIndex);
      if (price == null) {
            return false
      }
      var count = listview.getValue(row, countColIndex);
      if (count == null) {
            return false
      }

      var total = price * count;
      isSettingValue = true;
      listview.setValue(row, totalColIndex, total);
      isSettingValue = false;

      return true;
    }

    listview.bind(Forguncy.ListViewEvents.ValueChanged, function (arg1, arg2) {
      if (isSettingValue) {
            return;
      }

      var row = arg2.CellRanges.Row;
      var col = arg2.CellRanges.Column;
      if (row >= 0 && col >= 0) {
            if (col === priceColIndex) {
                if (!updateTotal(row)) {
                  updateCount(row);
                }
            }
            else if (col === countColIndex) {
                if (!updateTotal(row)) {
                  updatePrice(row);
                }
            }
            else if (col === totalColIndex) {
                if (!updatePrice(row)) {
                  updateCount(row);
                }
            }
      }
    });
});
把这个代码搞到页面的这个位置,就行了

这里是我的工程文件,你可以拿去玩玩


如何举一反三呢?
大家的场景中,

[*]可能表格中有很多的列,只是其中需要那么几列来计算
[*]也可能表格的名字不是【表格1】
[*]也可能不是一个A*B=C的计算逻辑
[*].....
那么这些情况应该怎么处理呢?
那我来给大家大致的将一下这个代码中比较重要的点,也是大家需要灵活应变的点,这次来点一般人听不懂的,当然大神除外
代码重点第一处:

对于1:列序号

如果你的单价列是第5列,那么

对于3:表格的名字就是他了

对于2:这个机智的标识
var isSettingValue = false;其实,他是为了防止死循环,就是说不能出现更新了单价他顺带就会更新总价,但是总价变了又会反过来影响单价,这个是一个死循环啊,所以我们要做一个标识,我在修改的时候,我会把这个门关上,别人即使值修改了,也不能这个时候反影响,能我修改完了以后,我在把门看看
大致就是这样意思

代码重点2:计算方式如何修改?这次例子中的是:单价*数量=总价;那么万一我们的需求是:单价*(数量+1)=总价呢?
或者我们压根不是单价数量这几个的关系,而是长*宽*高=体积呢?
其实这里怎么算全部在这里控制
>如何执行更新

>更新的公式,如何加减乘除都在这里控制了(这里只是拿总价作为例子,其他的几个都一样类比)



页: [1]
查看完整版本: 帮你打开活字格更神奇的功能:八十八,表格内的公式互算