1

我有一个包含任务列表的数据库。我正在使用 VSTO 从该数据库中读取数据并从中创建一个新的 Microsoft Project。任务的上限为 3000。

问题是数据库中的记录是随机顺序的。当然,它们在同一个表中以主外键的形式定义了父子关系。但是,有两个限制:

  1. 我必须一口气读完所有的记录。
  2. 读取记录的顺序可以是完全随机的。

第二个问题是真正的问题发生的地方。因为我很可能会OutlineLevel = 1先得到所有记录,然后是一些OutlineLevel = 5记录,然后是一些Outline Level = 2,依此类推(完全随机)。

由于 VSTO API 在做ParentTask.OutlineChildren.Add(<Task>), 将创建该父级的子任务的意义上是奇怪的,但会将 TASK 添加到网格的最后一行!

这迫使我为遇到的每条记录重新计算 ID。与ID,我的意思是在 MS Project 中记录必须去的行号

问题在于,如果我为 3000 个任务重新计算它,它会变得越来越慢。一开始,它每秒可以插入 30-40 个任务,但处理所有 3000 个任务需要 11 个小时!(这当然是不可接受的)。

是否有一些 API 方法可以快速做到这一点?或者是否有另一种方法可以重新计算子任务的 ID。

  • 计算子任务 ID 的代码是迭代的。它从父任务的 ID 开始,并尝试根据子任务的兄弟编号计算子任务将具有的 ID(SiblingNumber存储在我构建的数据结构中,它充当包装器MSProject.Task object)。
4

2 回答 2

1

COM 接口很慢,所以最重要的是在自己的代码中尽可能多地进行处理,并且只有在您拥有按行顺序排列的任务列表后,才能将它们插入到 Project 中。

至于实际的算法,我会创建一个树形结构,当你浏览你的数据库时,我会创建一个新节点,不仅是为了读取的任务,而且如果还没有遇到它的隐含父节点。所以:

阅读每条记录并:查看父项是否已经存在(为此使用字典)。如果没有,请创建它(并添加到字典中)。查看任务是否已经存在(为此使用相同的字典)。如果没有,请创建它(并添加到字典中)。将任务添加到父级的子级列表中。

(首先创建一个顶级任务可能更优雅,然后让任何没有父级的任务成为这个顶级的子级。)

完成后,以深度优先的方式遍历树,然后按行顺序完成任务。

于 2013-03-25T22:00:13.557 回答
0

解决该问题的最简单方法是在 中列出的第一个任务之前插入一个子任务Task.OutlineChildren。但它只有在已经有一些子任务时才有效。

下一个足够快的解决方案是将项目结构读入附加组件中的某些数据结构并扫描它,而不是每次都调用 COM。当您更改项目时,我只需要自己更新结构。

当然,如果您只想在其兄弟姐妹列表的末尾插入几个任务,您可以扫描下一个具有与其父级相同 OutlineLevel 的任务,并在该任务之前插入。

但无论如何,在批量插入/更新时缓存项目结构是最合理的解决方案。

于 2012-12-19T19:49:58.153 回答