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

时间:2016-02-11 09:43:01

标签: cognos-tm1

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

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

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

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

1 个答案:

答案 0 :(得分:2)

让我明白地说明一下......你应该强调 ,在任何情况下,都要做你正在做的事情。

TM1专家普遍认为,除了非常非常特殊的情况(例如创建未在任何立方体中使用的参考尺寸)之外,DimensionDeleteAllElements()太危险而无法使用。 (Example 1Example 2。)如果TI流程失败,您可能会丢失元素。丢失你的元素,你就会丢失数据。

您尚未指定要进行该调用的选项卡,但让我解释元数据更新(当前)的工作原理。 (对于像DimensionElementInsertDirect这样的新函数,或者是无状态的新Restful API,它的工作方式略有不同,但是对于本练习而言,它仍然适用。)

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

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

所以你的情况是这样的:

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

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

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

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