0

我正在用 .NET (C#) 编写一个 DLL,它可以作为插件加载到 Excel 中。DLL 将提供许多可用作 Excel 中的公式的函数,以从外部应用程序的数据库中查找某些值。

对于这些公式函数中的每一个,DLL 都需要访问数据库,因此会有太多的数据库调用。例如,如果在 10 个单元格中使用公式 1,在 20 个单元格中使用公式 2,则将调用 30 次数据库

有没有办法可以对数据库的每个公式进行一次调用?有什么实现思路吗?

谢谢。

编辑:

基本上,我正在尝试编写一个通用 DLL(Excel 插件),任何使用 Excel 和特定 3rd 方会计软件的用户都可以使用它。用户插入 Excel 的每个公式,将根据传递的参数查询第 3 方应用程序数据库并返回特定值。

例如,用户可以使用公式查询特定分类帐的分类帐余额,或使用另一个公式查询 SKU 的库存余额等。我将有不同类别的公式,例如基于分类帐的公式,基于 SKU 的公式,等。用户可以设计并排比较报告,在单独的列中显示第一季度和第二季度的分类账余额等。

该插件旨在充当报表设计器(没有任何向导,仅基于公式),用户可以在其中设计自己的 Excel 报表,按照他们想要的方式对其进行格式化,并将会计软件中的值提取到他们想要的任何单元格中。

但是,我不是每次都从数据库中读取来评估每个公式,而是首先设计一个“公式执行计划”,这样我就可以将对数据库的多次调用合并为对单个公式的一次调用,在那里我可以传递所有用户在 Excel 工作表中该公式的所有实例中指定的参数。

否则,Excel 工作表将花费很长时间来评估公式,使其不切实际。我预计一份报告中平均有大约 100 个公式。

4

2 回答 2

0

在不知道您尝试接收什么数据的情况下,您可以在代码中返回数据集并将数据集映射到公式,而不是每次都运行回数据库。因此,如果您说获取股票报价或其他内容,则可以在查询数据库时获取所有“WHERE”项目并将它们放入 IN 子句中。拥有相关更新的数据集后,您可以从数据集而不是数据库发送。Recalcs 将通过一次调用再次抓取运行到数据库。

您可以扩展单元格以获取更新标志,并且仅从这些标志中刷新。

暂停对公式的计算,仅在必要时刷新。

只是大声思考......或任何打字等价物。

编辑:我在我的大脑中深入了解它的机制,我意识到我已经脱离了我的元素。对不起。我从来没有用 VS 创建过 .DLL 或插件,所以这之后的一切都是纯粹的猜测和猜测,可能会也可能不会造成弊大于利。

我认为 UDF 的执行需要重新路由,直到执行计划被执行。

您将需要一些对象。

  1. ExecutionPlan - 此对象将管理您的查询列表。批量交易或单笔交易。您需要一种将请求转换为 sql 的方法。然后一次调用将 sql 传递给数据库。
  2. DataCache - 这将是所有返回数据的记录集。如果它被提取了,我会用一个标志或其他东西来封装它。

该公式将类似于(伪代码)

 if(dataCache.executed)
      formula.returnValue = dataCache.value(valueYouWantToReturn)
 else
      executePlan.add(valueYouWantToGet);
      formula.returnValue = "queued";

然后,您需要强制重新计算(这将导致所有 100 个公式在 dataCache 进入数据库一次后进入数据存储区 (dataCache) 以获取其值。

您的 sql 转换器将基本上构建巨大IN的子句或一堆OR通过字符串构建的 chaned。因此,您有一个 Ledger 值的子句,当调用 ExecutionPlan.Add 方法时,它会将您要检索的值添加到 Ledger 的 select 语句中。

然后当 ExecutionPlan.Execute 被调用时。它将执行 sql 语句,将其放入记录集中供您在调用 dataCache.getValue(value) 时进行索引。您将搜索“值”并将其发送回函数。

我正在解释它,但我认为它会起作用吗?我认为...

于 2012-11-29T15:21:41.757 回答
0

您可能需要考虑在 Excel 中使用 CUBEVALUE 和其他 CUBE 函数。CUBEVALUE 函数已经完成了您的 DLL 打算做的事情——每个函数从外部数据库中提取一个值。问题是源数据需要采用 OLAP 格式并响应 MDX 而不是 SQL。

然而,这并不难设置,尽管它超出了本回复的范围。幸运的是,会计倾向于巧妙地融入 OLAP 多维数据集——您可以为日期、部门、帐户等设置维度。或者对于库存,您可以在项目、位置、状态(订单、发货、库存)上设置维度等等

至少值得研究一下。

于 2012-11-29T19:48:45.347 回答