0

在 TM1 中使用 DimensionDeleteAllElements() 是否存在限制,其中它不能与从包含 DimensionDeleteAllElements() 的 TI 调用的维度更新过程协同工作?

我有一个 TI,它使用 DimensionDeleteAllElements() 删除维度的所有元素,然后通过调用另一个 TI 进程来重建它,该进程使用数据库中的元素更新维度。这有助于清除不必要的元素。

成功执行这个TI后,我可以发现维度中的元素都被抹掉了。但是维度无法重建。但是,根据 tm1server 日志,使用数据库元素更新维度的辅助 TI 正常完成其执行。此外,手动运行维度更新 TI 可以正常工作,并使用数据库中的元素更新维度。

我应该在这个 TI 中使用维度更新过程的内容而不是调用它吗?

4

1 回答 1

2

让我清楚地说明这一点……在任何情况下,你都应该强调不要做你正在做的事情。

TM1 专家的普遍共识是,除了在非常非常特殊的情况下(例如创建一个未在任何多维数据集中使用的参考维度),DimensionDeleteAllElements() 太危险而无法使用。(示例 1示例 2。)如果 TI 流程中途失败,您可能会丢失元素。失去你的元素,你就会失去你的数据。

您尚未指定进行调用的选项卡,但让我解释一下元数据更新(当前)是如何工作的。(它与 DimensionElementInsertDirect 等新函数或无状态的新 Restful API 的工作方式略有不同,但就本练习而言,它仍然适用。)

  • 在 Prolog 或 Metadata 选项卡中对维度所做的任何更改都会导致在内存中生成维度的副本。
  • 在元数据选项卡上处理数据源的最后一行(如果有)之后,或者,如果没有数据源,在代码执行通过元数据选项卡到达 Prolog 之后,将检查更改的维度的完整性,如果它们通过该检查,将注册为原始维度对象的替换。

然而,在第二件事发生之前,系统的其余部分并不知道维度的副本。它们类似于只有 TI 进程本身知道的私有对象。

所以你的情况是这样的:

  • 您的第一个进程执行 DimensionDeleteAllElements 命令。这会导致创建维度的副本并删除所有元素。
  • 我猜您正在调用 Prolog 选项卡上的第二个进程。(我希望它不是元数据选项卡,否则您将为记录源中的每一行执行一次调用,如果有的话。)
  • 当调用该过程时,它将重建维度。它将通过在内存中创建自己的维度副本来做到这一点,与第一个进程的副本完全分开,更新该副本,然后在它通过自己的元数据选项卡时将其注册为新维度。
  • 然后控制将返回到第一个进程的 Prolog,您可能还记得,该进程在内存中仍然有自己的维度副本,现在没有元素。一旦第一个进程通过其自己的元数据选项卡的末尾,它将执行完整性检查(缺少元素不会导致检查失败)并将该维度副本注册为更新的维度,从而消除(或更准确地说是覆盖)第二个过程所做的更改。

解决方案?如果您要调用 DimensionDeleteAllElements(通常不应该),那么您必须在重建维度的同一过程的 Prolog 中执行此操作。这样,数据源中元素的删除和元素的重新添加发生在维度的同一个副本上,然后注册生成的维度。

您永远不应该删除包含多维数据集中数据的 N 或 S 元素。这些绝不应该是要“淘汰”的“不必要的元素”。这样做可能会导致难以解释多维数据集值的变化(因为数据随元素一起消失),这从审计的角度来看是有害的。

C级元素是另一回事。如果您的意图是删除所有这些并允许从源重新构建当前层次结构,则最好使用 DimSiz 和 DimNm 函数迭代维度元素(向后),并使用 DType 函数返回元素类型,以便您可以识别和删除合并。这显然是在 Prolog 中完成的。

于 2016-02-13T07:15:07.550 回答