在TM1中使用DimensionDeleteAllElements()是否有限制,因为它不能与从包含DimensionDeleteAll Elements(()的TI调用的维度更新过程协同工作?
我有一个TI,它使用DimensionDeleteAllElements()删除维度的所有元素,然后通过调用另一个TI进程来重建它,该进程使用数据库中的元素更新维度。这样可以去除不必要的元素。
在成功执行了这个TI之后,我可以发现维度中的元素被删除了。但尺寸未能重建。然而,根据tm1server日志,用数据库元素更新维度的辅助TI正常完成执行。此外,手动运行维度更新TI工作正常,并使用数据库中的元素更新维度。
我应该在本TI中使用维度更新过程的内容,而不是调用它吗?
让我简单地说明一下。。。在任何情况下,你都应该强调NOT在做你正在做的事情。
TM1专家的普遍共识是,除了在非常非常特殊的情况下(例如创建任何多维数据集中都不使用的引用维度),DimensionDeleteAllElements()太危险了,不能使用。(示例1,示例2。)如果TI过程中途失败,您可能会丢失元素。失去你的元素,你就失去了你的数据。
您还没有指定要调用的选项卡,但让我解释一下元数据更新(当前)是如何工作的。(它与DimensionElementInsertDirect等新函数或无状态的新Restful API的工作方式有点不同,但就本练习而言,它仍然适用。)
- 在Prolog或Metadata选项卡中对维度所做的任何更改都将导致在内存中复制该维度
- 在元数据选项卡上处理数据源的最后一行(如果有)之后,或者如果没有数据源,在代码执行通过元数据选项卡到达Prolog之后,将检查更改维度的副本的完整性,如果通过检查,则将注册为原始维度对象的替换
然而,在第二件事情发生之前,系统的其他部分并不知道维度的副本。它们类似于只有TI进程自己知道的私有对象。
因此,在您的案例中发生的情况是:
- 第一个进程执行DimensionDeleteAllElements命令。这将创建尺寸标注的副本,并删除所有图元
- 我猜您正在调用Prolog选项卡上的第二个进程。(我希望它不是元数据选项卡,否则您将对记录源中的每一行执行一次调用(如果有的话)。)
- 当调用该过程时,它将重新生成维度。它将通过在内存中创建维度的自己的副本来实现这一点,该副本与第一个进程的副本完全分离,更新该副本,然后在通过自己的元数据选项卡后将其注册为新维度
- 然后,控制将返回到第一个进程的Prolog,您可能还记得,该进程在内存中仍然有自己的维度副本,现在没有元素。一旦第一个进程通过了自己的元数据选项卡的末尾,它将进行完整性检查(缺少元素不会导致检查失败),并将该维度副本注册为更新的维度,从而删除(或更准确地说覆盖)第二个进程所做的更改
解决方案?如果要调用DimensionDeleteAllElements(通常不应该调用),则必须在重建维度的同一过程的Prolog中执行。通过这种方式,从数据源中删除元素和重新添加元素发生在维度的相同副本上,然后注册生成的维度。
您不应该删除多维数据集中包含数据的N或S元素。这些永远不应该是"不必要的元素"而被"剔除"。这样做可能会导致多维数据集值的变化难以解释(因为数据随元素一起消失),从审计的角度来看,这是有害的。
C级元素是另一回事。如果您的意图是删除所有这些,并允许从源代码重建当前层次结构,那么最好使用DimSiz和DimNm函数(向后)迭代维度元素,并使用DType函数返回元素类型,以便您可以识别和删除合并。这显然是在Prolog中完成的。