在TM1中使用DimensionDeleteAllElements()是否存在限制,其中它不能与从包含DimensionDeleteAllElements()的TI调用的维度更新过程协同工作?
我有一个TI,它使用DimensionDeleteAllElements()删除维度的所有元素,然后通过调用另一个TI进程来重建它,该进程使用数据库中的元素更新维度。这有助于清除不必要的元素。
成功执行此TI后,我发现维度中的元素已被清除。但维度无法重建。但是,根据tm1server日志,使用数据库元素更新维度的辅助TI会正常完成其执行。此外,手动运行维度更新TI可以正常工作,并使用数据库中的元素更新维度。
我应该在此TI中使用维度更新过程的内容而不是调用它吗?
答案 0 :(得分:2)
让我明白地说明一下......你应该强调 不 ,在任何情况下,都要做你正在做的事情。
TM1专家普遍认为,除了非常非常特殊的情况(例如创建未在任何立方体中使用的参考尺寸)之外,DimensionDeleteAllElements()太危险而无法使用。 (Example 1,Example 2。)如果TI流程失败,您可能会丢失元素。丢失你的元素,你就会丢失数据。
您尚未指定要进行该调用的选项卡,但让我解释元数据更新(当前)的工作原理。 (对于像DimensionElementInsertDirect这样的新函数,或者是无状态的新Restful API,它的工作方式略有不同,但是对于本练习而言,它仍然适用。)
然而,在第二个事件发生之前,系统的其余部分不知道维度的副本。它们类似于只有TI进程本身知道的私有对象。
所以你的情况是这样的:
解决方案?如果您打算调用DimensionDeleteAllElements(通常不应该这样),那么 必须 在重建维度的同一进程的Prolog中执行此操作。通过这种方式,元素删除和数据源中元素的重新添加发生在维度的 相同 副本中,然后注册生成的维度。 / p>
您不应该删除包含多维数据集中数据的N或S元素。这些永远不应该是“被淘汰”的“不必要的元素”。这样做可能导致很难解释多维数据集值的变化(因为数据随元素消失),从审计的角度来看这是有毒的。
C级元素是另一回事。如果您的目的是删除所有这些并允许从源重建当前层次结构,最好使用DimSiz和DimNm函数迭代维度元素(向后),并使用DType函数返回元素类型,以便您可以识别和删除合并。这显然是在Prolog中完成的。