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