删除维度中的元素并在 TM1 中重建它们

Deleting elements in a dimension and rebuilding them in TM1

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

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

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

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

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

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

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

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

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

所以你的情况是这样的:

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

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

您不应该删除包含多维数据集数据的 N 或 S 个元素。这些永远不应 "unnecessary elements" 成为 "weeded out"。这样做会导致难以解释多维数据集值的变化(因为数据随元素一起消失),这从审计的角度来看是有毒的。

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