# Microsoft Office Project 2003 数据参考

Microsoft Office Project 2003 数据参考
总览
Project 2003 数据库的新增功能
关于 Project 数据库
支持的数据库
将旧版本的 Project 加载到数据库
从旧版本升级 Project 数据库
数据库权限及配置
所需权限
配置数据库
性能调整
确保数据完整性
信息在 Project 数据库中的存储方式
日历数据
时间分段数据
备注
自定义域值
拆分任务
任务链接
估计工期值
比较基准
使用 Project 数据库中的项目
创建 Project 数据库结构
DSN 要求和限制
并发使用和项目锁定
将 XML 数据添加到现有项目中
添加和更改数据库中的行
将所需标志设置为允许更新数据库中的项目数据
在指定日期的同时指定时间
工期、工时、费率和成本值
使用文本转换表检索字符串
创建 Project 日程数据
创建新的非企业项目
创建插入项目
创建新的非企业资源
创建新的非企业日历
指定日历的工作时间和例外日期
指定资源可用性
指定资源费率
新建任务
创建周期性任务
创建任务相关性
新建工作分配
创建或修改工作分配实际工时顺序
在排定工时中创建拆分
创建或修改工作分配剩余工时顺序
管理时间分段数据
创建或修改任务完成百分比分布
删除分布
自定义 Project 数据
指定自定义文本域
指定自定义数字（成本）域
指定自定义日期、开始时间和完成时间域
指定自定义工期域
域属性
指定自定义 WBS 代码
指定自定义大纲代码
为自定义域指定自定义别名
为自定义域指定公式
读写 RTF 备注
管理数据库中的其他数据
指定电子邮件地址
检索跨项目链接项目/任务引用
检索共享资源文件名称
用摘要任务和子任务构建大纲结构
编辑摘要任务工作分配的工时
检索工作组消息的状态
指定超链接
数据库处理顺序、规则和缩写
外部编辑数据的处理顺序
标准处理顺序
表命名规则
列命名规则
列名称缩写
数据库表
仅供参考列
加粗列名称
列的数据类型
MSP_ASSIGNMENT_BASELINES
MSP_ASSIGNMENTS
MSP_ASSN_ENTERPRISE
MSP_ATTRIBUTE_STRINGS
MSP_AVAILABILITY
MSP_CALENDAR_DATA
MSP_CALENDARS
MSP_CODE_FIELDS
MSP_CONVERSIONS
MSP_DATE_FIELDS
MSP_DURATION_FIELDS
MSP_FIELD_ATTRIBUTES
MSP_FLAG_FIELDS
MSP_LINKS
MSP_MV_FIELDS
MSP_NUMBER_FIELDS
MSP_OUTLINE_CODES
MSP_PROJ_SECURITY
MSP_PROJECTS
MSP_RESGLOBAL_SECURITY
MSP_RES_GLOBAL_BINARY
MSP_RES_SECURITY
MSP_RESOURCE_BASELINES
MSP_RESOURCE_RATES
MSP_RESOURCES
MSP_STRING_TYPES
MSP_TASK_BASELINES
MSP_TASKS
MSP_TEXT_FIELDS
MSP_TIMEPHASED_DATA

## 总览

本文档提供直接在 Microsoft Office Project 2003 数据库中创建和更新项目数据所需的必要信息，以保持数据的一致性和完整性。

注释 本文档中的信息并不是都可以应用于（可能有所不同）Microsoft Office Project Server 2003 数据库中所存储的企业项目数据。建议只使用“项目数据服务 (PDS)”、Microsoft Office Project Professional 2003 或 Microsoft Office Project Web Access 2003 与 Project Server 数据库中的企业项目数据进行交互。

直接在数据库中创建和维护项目数据具有以下优势：

- 自动创建项目。该功能无需 Project 即可使用其他软件程序自动创建项目。
- 自动记录新任务和实际数据。该功能的一个应用是自动将时间表数据应用到项目。

各章节包含以下信息：

- 使用数据库中的项目，包括创建和维护项目数据库，以及更新时备份现有单个任务、资源和工作分配行。
- 使用 Project 数据库结构，包括在 Project 数据库中存储数据的方式、访问要求和项目引用要求。
- 添加和更改数据库中的行，包括将标志设置为允许更新，指定日期和时间值，指定工期、工时和费率值，检索 Project 字符串，新建项目、任务、任务链接、资源、工作分配和日历以及管理和自定义项目数据。
- 数据库处理顺序、域和表的规则和缩写，以及表和列的定义。
- 数据库表说明，包括列名称、数据类型和说明。

注释 本文档中描述的数据库表是由脚本 PROJTBLS.sql 创建的。可以在 Project Server 2003 CD-ROM 上的 \SUPPORT\DATABASE 文件夹中找到。

页首

### Project 2003 数据库的新增功能

Project 数据库已扩展（1 个新表），并包括下列全面改进的功能：

- 一个支持多值大纲代码的新表。
- 支持时间表实际值和已调整的时间表实际值的新域。
- 支持资源预订类型的新域。

Project 数据库中添加了下列新表：

- MSP_MV_FIELDS

页首

## 关于 Project 数据库

下列部分详细说明 Project 数据库所支持的数据库类型，以及如何在当前版本的 Project 中加载和更新早期的项目。

### 支持的数据库

只有 Project Professional 2003 可以连接到 Project Server 数据库；Project Professional 2003 和 Project Standard 2003 通过“开放式数据库连接 (ODBC)”支持以下数据库：

- Microsoft Access 2000、Access 2002 和 Access 2003。
- Microsoft SQL Server 2000 或更高版本。
- Microsoft Data Engine 2000 或更高版本。
- Oracle 8.0（或更高版本）。

如果在“文件打开”和“文件保存”对话框中直接选择“Project 数据库 (.mpd)”或“Microsoft Access 数据库 (.mdb)”作为文件类型，在向 Microsoft Access 2000、Access 2002 和 Access 2003 数据库中写入数据或从中读取数据时，Project 也可以自动建立 ODBC 连接。

注释 如果 Microsoft Access 中的链接表的数据保存在另一个应用程序或数据库管理系统中，而 Microsoft Access 只是提供连接，将不能保存或加载这些数据。若要访问这些数据，必须将其真正导入 Microsoft Access 或直接连接到数据源。

页首

### 将旧版本的 Project 加载到数据库

可以在 Project 2003 中打开以前用 Microsoft Project 98、Microsoft Project 2000 或 Microsoft Project 2002 保存到数据库中的项目。不过，如果您再次将此项目保存到数据库中，它将使用 Microsoft Project 2003 数据库结构进行保存。对于且只对于 Microsoft Project 98，当更新数据库格式时，将得到两个数据库格式完全不同的项目副本；原始项目数据不会受到影响。

页首

### 从旧版本升级 Project 数据库

可使用“数据库升级工具”COM 加载项将 Microsoft Access 或 SQL Server 数据库中的部分或全部项目从 Microsoft Project 98、Microsoft Project 2000 或 Microsoft Project 2002 数据库结构升级到 Project 2003 数据库结构。若要加载“数据库升级工具”，请在工具栏上单击右键，然后选择“数据库升级工具”。Microsoft Project 2000 或 Microsoft Project 2002 升级过程不需要“数据库升级工具”。

页首

## 数据库权限及配置

### 所需权限

当 Project Standard 或 Project Professional（以脱机模式）连接到 ODBC 数据库时，它可对数据库执行多种类型的操作，每种操作都需要一组相应的对象权限：

- 若要以只读方式打开数据库中的项目并进行查看，用户必须对 Project 数据库中的所有表拥有 SELECT 权限。此外，如果用户不是表的所有者，必须拥有每一个表的视图。在任何情况下都需要有记录了此用户的用户标识号和数据库的数据源名称 (DSN)。
- 若要修改数据库中的已有项目、将新项目保存到数据库中已存在的表中或者从数据库中删除项目，用户必须对所有表拥有下列权限：INSERT、UPDATE 和 DELETE。
- 若要将新项目保存到空数据库中，或者有选择地将数据导出到数据库中，用户必须拥有 CREATE TABLE 权限。
- 除了有效的登录标识号之外，SQL Server 用户还必须拥有访问项目数据库的权限。
- 用户的默认数据库既可以在 DSN 中设置，也可以在 SQL Server 中设置。

在同一个数据库中可以有多个单位的多个项目，而这些项目又彼此独立。这称为项目隔离。若要隔离项目，必须为每个项目所有者创建独立的表结构。由于 Project 使用它在数据库中找到的第一组表，所以每个数据库用户只能看见指定数据库中的一组项目表。任何安全方案都必须考虑这一点。

- 如果项目经理的项目有两组用户，项目经理将需要两个数据库用户标识号，每个标识号拥有一组表。
- 如果项目用户需要查看不属于他或她的表中的数据，必须使用视图或别名来访问这些项目表。如果项目用户需要查看属于两个不同所有者的表中的数据，必须拥有分别用于每组表的不同的用户标识号和视图。
- 还有一种办法，即创建一组视图或别名来完成这两个所有者的表联合操作。为了避免混淆具有相同项目标识号的不同项目，项目标识号在所有各组表之间必须是唯一的。这可以通过在视图中递增每组表的项目标识号实现。以下示例显示如何在一个所有者的表中递增项目标识号：

      Create view MSP_TEXT_FIELDS as
      Select    PROJ_ID,
                TEXT_CATEGORY,
                TEXT_REF_UID,
                TEXT_FIELD_ID,
                TEXT_VALUE
      From      user1.MSP_TEXT_FIELDS
      Union all
      Select    PROJ_ID + 1000,
                TEXT_CATEGORY,
                TEXT_REF_UID,
                TEXT_FIELD_ID,
                TEXT_VALUE
      From      user2.MSP_TEXT_FIELDS

注释

- Project 数据库结构中有 29 个表，必须为除 MSP_STRING_TYPES 和 MSP_CONVERSIONS 之外的每一个表创建一个类似的视图。不能更新通过联合视图访问的项目。
- Project 并不能授予用户权限。必须由数据库管理员或安全管理员授予用户所需的权限。
- 由于要求对 Project 数据库中的所有表拥有 SELECT 权限，或者 SELECT、INSERT、UPDATE 和 DELETE 权限集，所以应当避免授予列级别权限。

页首

### 配置数据库

建立供 Project 使用的数据库有两种方法：

- 最简单的方法是创建一个数据库，并使用 Project 创建表和索引。当没有性能和磁盘使用方面的问题时，该方法是最简单的。
- 第二种建立数据库的方法是手动配置某个数据库以供 Project 使用。随 Project 提供的脚本文件包含用来创建 Project 数据库结构的数据定义语言 (DDL)。

  可以修改这些脚本文件，以指定数据库文件和文件组 (SQL Server) 并配置其他数据库属性。例如，数据库管理员可以修改 DDL，以将表保存在一个磁盘上，而将索引保存在另一个磁盘上。一般来说，如果索引和数据表处在不同的物理磁盘上，可以改善性能，但是，为提高性能而选择不同的磁盘只作为可选项。

建议尽可能将事务日志文件和数据分别保存在不同的磁盘上；在 SQL Server 中执行脚本之前，必须进行下列操作之一：

- 在文本编辑器中打开该文件，然后使用 Project 表所有者的名称替换 PROJTBLS.SQL 中字符串 <dbo> 的 <dbo.object_name> 部分中的所有内容。
- 以这些表的所有者身份登录到数据库。

注释 填充 MSP_STRING_TYPES 和 MSP_CONVERSIONS 表的 SQL Server 语句是用于英语转换值的。因此，需要对它们进行修改之后才能用于其他语言。

若要直接在数据库中修改项目数据，Project 提供了四种存储过程用于备份任务、资源、工作分配和链接数据。有关详细信息，请参阅下面的确保数据完整性部分。

页首

### 性能调整

通常适用于调整 SQL Server 数据库性能的标准过程也同样适用于 Project 数据库。

页首

### 确保数据完整性

由于 Project 需要向特定数据库结构中写入数据和从中读取数据，所以对数据库的某些更改可能会破坏数据库中的项目，并使 Project 无法打开或保存部分或全部项目。以下操作可能会破坏存储于数据库中的项目：

- 更改保留数据列的值。
- 重命名列或表。
- 删除列或表。
- 更改列的数据类型。

Project 在从数据库（或任何其他外部格式）读取项目时将校验某些数据。下列情形可能导致 Project 显示警告、将数据更改为适当值或根本不读取数据：

- 数据类型不兼容。
- 值超出允许范围。
- 值在项目中产生了不一致问题。
- 值是某个关联数学关系的组成部分。
- 值是由 Project 自动计算的。

注释 如果更改的任何数据包含 Project 不能接受的错误，将恢复最初的数据。

若要防止更改的任务、资源、工作分配和链接（任务相关性）数据中的错误导致 Project 数据库中的不一致问题，应当在 MSP_TASKS、MSP_RESOURCES、MSP_ASSIGNMENTS 和 MSP_LINKS 表的 XT_EDIT_REF_DATA 列中分别备份原始数据。Project 使用此数据帮助判断数据库中的哪些列已修改。如果这些修改没有引起上面所列的任何一种情况，将保留修改。

添加新行时，必须将 EXT_EDIT_REF_DATA 的值设置为 1。更改现有行时，值 1 和下列表中所列出的列中的信息必须分别存储到相应表的 EXT_EDIT_REF_DATA 列中。必须按下列顺序列出所有值，以逗号分隔，并且，如果值为空，在分隔该值的逗号之间不应输入任何内容。

任务域 | 资源域 | 工作分配域 | 链接域
--- | --- | --- | ---
实际工时 | 成本累算 | 工作分配单位 | 链接类型
工时 | 开始可用 | 开始时间 | 链接延隔时间
剩余工时 | 可用到 | 完成时间 |
工期 |  | 工作分配延迟 |
实际工期 |  | 资源调配延迟 |
剩余工期 |  | 实际开始时间 |
开始时间 |  | 实际完成时间 |
完成时间 |  | 实际工时 |
限制类型 |  | 剩余工时 |
限制日期 |  | 正常工时 |
实际开始时间 |  | 工时 |
实际完成时间 |  | 实际加班工时 |
停止 |  | 剩余加班工时 |
重新开始 |  | 加班工时 |
完成百分比 |  |  |
成本 |  |  |
固定成本 |  |  |
实际成本 |  |  |
资源调配延迟 |  |  |
工时完成百分比 |  |  |
任务固定成本累算 |  |  |

为了能更轻松地在更新之前备份任务、资源、工作分配和链接数据，Project 提供了存储过程（对于 Microsoft Access 数据库中的项目而言是操作查询）来自动完成该过程。Project 将在创建数据库表时，在 SQL Server 中完成存储过程的创建工作。对于要执行存储过程的非所有者用户，必须授予他们 EXECUTE 权限。如果表是手动创建的，必须运行随 Project 提供的用于创建存储过程的脚本，以创建这些存储过程。

在 Project 数据库表中放置触发器可能导致数据损坏或返回未知结果。请注意下列信息：

- INSERT 或 UPDATE 触发器所启动的任何过程均不会改变 @@identity 属性。
- INSERT 或 UPDATE 触发器所触发的程序不应执行在表中插入“标识”列的 INSERT 操作，否则该程序将生成由 Microsoft SQL Server 2000 创建的“标识”值。

如果为 Project 数据库中所存储的数据使用逗号分隔符，当使用存储过程更新该数据时，逗号分隔符将保存到 EXT_EDIT_REF_DATA 域中。这将影响 Project 数据的完整性。若要使用逗号分隔符，请使用引号将包含逗号的所有数据引起来。以下脚本示例显示如何修改现有的资源、工作分配和任务存储过程，以便在将数据备份到 Project 数据库的 EXT_EDIT_REF_DATA 域中时能够正确地处理小数点和逗号之间的数据转换。

对于工作分配：

    Update    MSP_ASSIGNMENTS
    Set       EXT_EDIT_REF_DATA = '1,' &
              ASSN_UNITS &  ',' &
              ASSN_START_DATE & ',' &
              ASSN_FINISH_DATE & ',' &
              ASSN_DELAY & ',' &
              ASSN_LEVELING_DELAY & ',' &
              ASSN_ACT_START & ',' &
              ASSN_ACT_FINISH & ',' &
              ASSN_ACT_WORK & ',' &
              ASSN_REM_WORK & ',' &
              ASSN_REG_WORK & ',' &
              ASSN_WORK & ',' &
              ASSN_ACT_OVT_WORK & ',' &
              ASSN_REM_OVT_WORK & ',' &
              ASSN_OVT_WORK
    Where     PROJ_ID=[PROJ ID]
    And       ASSN_UID=[ASSN UID];

对于资源：

    Update    MSP_RESOURCES
    Set       EXT_EDIT_REF_DATA = '1,' &
              RES_ACCRUE_AT &  ',' &
              RES_AVAIL_FROM & ',' &
              RES_AVAIL_TO
    Where     PROJ_ID=[PROJ ID]
    And       RES_UID=[RES UID];

对于任务：

    Update    MSP_TASKS
    Set       EXT_EDIT_REF_DATA = '1,' &
              TASK_ACT_WORK & ',' &
              TASK_WORK &  ',' &
              TASK_REM_WORK & ',' &
              TASK_DUR & ',' &
              TASK_ACT_DUR & ',' &
              TASK_REM_DUR & ',' &
              TASK_START_DATE & ',' &
              TASK_FINISH_DATE & ',' &
              TASK_CONSTRAINT_TYPE & ',' &
              TASK_CONSTRAINT_DATE & ',' &
              TASK_ACT_START & ',' &
              TASK_ACT_FINISH & ',' &
              TASK_STOP_DATE & ',' &
              TASK_RESUME_DATE & ',' &
              TASK_PCT_COMP & ',' &
              TASK_COST & ',' &
              TASK_FIXED_COST & ',' &
              TASK_ACT_COST & ',' &
              TASK_LEVELING_DELAY & ',' &
              TASK_PCT_WORK_COMP & ',' &
              TASK_FIXED_COST_ACCRUAL
    Where     PROJ_ID=[PROJ ID]
    And       TASK_UID=[TASK UID];

页首

## 信息在 Project 数据库中的存储方式

本部分简要说明不同类型的数据在数据库中的存储方式。

### 日历数据

Project 将日历信息保存到两个表中：

- MSP_CALENDARS 表所包含的信息用于标识日历和将该日历作为基准日历的资源。
- MSP_CALENDAR_DATA 表包含日历的工作时间、非工作时间和例外时间数据，这些数据应用于日历中指定的一天或几天。标准工作时间和非工作时间由日历定义，因为这是由日历和工作时间选项所限制的。

页首

### 时间分段数据

对时间分段数据的存储进行了优化：单行中最多可包含七个时间段（通常为天）的值，从而减少了所需创建的行数。每行都包含数据值所对应的开始日期和结束日期以及时间刻度单位。这里的数据值是对应于指定时间刻度单位的时间、成本或完成百分比值。例如，如果记录类型为成本而单位为周，每个数据值将包含“￥/周”。

若要在 MSP_TIMEPHASED_DATA 表中以可读格式保存时间分段数据，请执行下列操作：

1 |  | 单击“工具”|“选项”。
2 |  | 选择“保存”选项卡。
3 |  | 选中“将时间同步数据追加到数据库中”，它对应于 MSP_PROJECTS 表中的 PROJ_OPT_EXPAND_TIMEPHASED 列。

页首

### 备注

Project 中简化了备注的存储。现在，备注存储在 MSP_ASSIGNMENTS、MSP_RESOURCES、MSP_TASKS 和各个表的 RTF 列中。

页首

### 自定义域值

自定义域的值存储于下列表中：

- MSP_DATE_FIELDS 包含自定义开始日期和完成日期。
- MSP_DURATION_FIELDS 包含自定义工期。
- MSP_FLAG_FIELDS 包含自定义标志信息。
- MSP_NUMBER_FIELDS 包含自定义成本和数字值。
- MSP_TEXT_FIELDS 包含自定义文本信息。

这些表中的每一行表示一个确定的任务、资源或工作分配以及特定的自定义域（如 MSP_TEXT_FIELDS 中的 TEXT1），并包含指定任务、资源或工作分配中该域的值。

自定义 WBS 代码掩码定义存储于 MSP_ATTRIBUTE_STRINGS 和 MSP_FIELD_ATTRIBUTES 表中。每个任务的工作分解结构 (WBS) 代码存储于 MSP_TASKS 表中。

自定义大纲代码存储于 MSP_OUTLINE_CODES 和 MSP_CODE_FIELDS 表中。与日期、工期、标志、数字和文本自定义域表一样，MSP_CODE_FIELDS 表也会引用特定的任务、资源或工作分配。引用的每个任务、资源或工作分配的大纲代码都从 MSP_OUTLINE_CODES 表中的行进行构造。这些大纲代码的定义存储于 MSP_ATTRIBUTE_STRINGS 和 MSP_FIELD_ATTRIBUTES 表中。

多值大纲代码存储在 MSP_MV_FIELDS 表中。

页首

### 拆分任务

拆分任务的非工作时间存储于 MSP_TIMEPHASED_DATA 表中工时为零小时的行中。

页首

### 任务链接

任务链接（或相关性）存储于 MSP_LINKS 表中。每行定义一个前置任务与后续任务之间的关联。每行只定义一个这样的关联。当任务有多个链接时，每个链接都需要一行来定义。

页首

### 估计工期值

估计工期只是将每个任务的工期以估计值的格式显示出来。如果工期的估计标志设为 1，该工期将显示为估计值。若要将自定义工期域显示为估计值，请将 DUR_FMT 列设为相应值（请参阅下面的使用文本转换表检索字符串）。

页首

### 比较基准

比较基准数据存储于三个表中：MSP_ASSIGNMENT_BASELINES、MSP_RESOURCE_BASELINES 和 MSP_TASK_BASELINES。

页首

## 使用 Project 数据库中的项目

使用 Project 数据库时，不能执行下列任何一种操作：

- 删除由 Project 创建的任何表。
- 删除由 Project 创建的表中的任何列。
- 更改任何列的数据类型。
- 以任何方式改变 MSP_PROJECTS 表中的 RESERVED_BINARY_DATA 列。

您可能已经注意到，Project 中的某些表在其各自的 UID 列中含有大的负数值的记录。这些记录一般显示在 MSP_ASSIGNMENTS、MSP_CALENDARS、MSP_PROJECTS、MSP_RESOURCES 和 MSP_TASKS 表的顶部；这些值为 -65536、-65535、-65534 和 -65533。这些记录在 Project 内部使用，不能编辑和删除。

如果创建自己的表（请参阅下面的创建 Project 数据库结构部分），不能将任何列定义为必需或非空 (NOT NULL)。

注释 以下部分中，代码示例中所提供的代码值可能与数据库中的值不同。请确保按照数据库中的实际值检查代码示例中的所有值。

页首

### 创建 Project 数据库结构

如果您需要从头开始创建一个 Project 数据库，那么最容易的方法是使用 Project 保存一个空项目。创建了数据库之后，您可以在 Project 中将此项目从数据库中删除（请参阅下面的删除数据库中的项目）。

如果不想使用 Project 简化过程，需要通过 ODBC 驱动程序创建空数据库，然后再创建相应的所有表。手动创建所有表的工作很繁杂，因为您要使用本文档作为参考，以保证对每个表都使用完全正确的表名称和列名称，并对每一列使用正确的数据类型。

若要手动创建和配置供 Project 使用的数据库，请参阅下面的配置数据库部分。

页首

### DSN 要求和限制

在用户身份验证过程中，自动将 Project Server 数据库连接信息从 Project Server 传递到 Project Professional。将 Project Professional 连接到 Project Server 不需要“数据源名称 (DSN)”。

如果多个 Project Standard 用户（以及处于脱机模式的 Project Professional 用户）需要使用 ODBC 访问同一数据库中的项目，更改数据的各用户不需要使用相同的 DSN 连接到数据库。Project 使用以下格式将 DSN 和项目名称（或连接字符串）组合存储为项目定位标识符：<DSN>\ProjectName。但是，相互链接的项目（例如，使用跨项目链接）需要使用相同的 DSN。

使用 Project Standard 或处于脱机模式的 Project Professional 用户的 DSN 限制：

- 必须为所有项目链接（例如资源库、共享者文件、跨项目链接和插入的项目）使用相同的 DSN。
- 如果有多个用户修改数据库，这些用户不应通过在“另存为”对话框的“保存类型”列表中选择 .mpd 或 .mdb 文件类型来保存文件。应使用“文件保存”对话框中的“另存为 ODBC”按钮保存文件。
- Project 缓存登录密码和其他连接信息。单台机器上的多个用户标识号不能使用相同的 DSN 同时对数据库进行不同的登录。一旦建立了连接，即使在登录时输入了不同的登录名称和/或密码，也会再次使用该连接。若要用其他用户标识号登录，必须关闭所有用 DSN 打开的项目。如果同时存在多个连接，必须创建其他备选 DSN 才能使用每个用户标识号。
- 任何时候都不应使用 DSN 连接 Project Server 数据库。这将导致数据库冲突，并导致数据放置到无法预料的位置。唯一允许连接到 Project Server 数据库的客户端应用程序为处于联机模式的 Project Professional。

页首

### 并发使用和项目锁定

如果通过 Project Standard 打开数据库中的项目，并且当前没有其他用户使用该项目，您对该项目将具有完全的读/写权限。在您结束对该项目的会话之前，其他用户将只能在 Project 中以只读方式打开该项目。

用于管理并发访问的读/写访问权限和其他一些属性全部由数据库 MSP_PROJECTS 表中的 5 个列来维护。只有当用户使用 Project 读取或更新数据库时，这些管理并发访问的列的使用才生效。用户使用数据库查询程序或其他工具直接读取或更新数据库时，Project 不提供任何类型锁定。因此，用来读取或更新数据库中项目数据的任何程序或工具都应遵照与 Project 中相同的规则，以保证数据访问的一致性。下面将说明管理并发访问的列的使用。

当通过 Project 用“读/写”访问权限打开项目时，Project 在 PROJ_READ_WRITE 和 PROJ_READ_ONLY 列中存储值 1。当完成会话并关闭数据库时，域值将重新设置为 0。当 Project 从数据库中进行加载或写入到数据库时，它也会将 PROJ_LOCKED 和 PROJ_READ_COUNT 列的值设置为 1。当这些域的值为 1 时，使用 Project 的任何用户都不可能（甚至以只读的方式）打开项目。

Project 存储当前打开项目以在 PROJ_MACHINE_ID 列中进行读/写访问的机器名称。当为了更新数据库中的项目数据而将 PROJ_READ_WRITE 设置为 1 时，建议将列 PROJ_MACHINE_ID 设置为您计算机的名称，以便试图通过 Project 打开项目的任何用户都会得到正确的消息，此消息通知他们该项目当前由您打开进行读/写访问。否则，Project 无法识别打开项目进行读/写访问的用户。如果您准备允许再次对项目进行读/写访问，在将这些标志重新设置为 0 时，您应再次将 PROJ_MACHINE_ID 域设置为 NULL。

在直接对数据库进行更新之前，应先检查所有这些标志是否都设置为 0，然后暂时将它们设置为 1，以防止其他用户通过 Project 打开项目。

请复制、修改并执行下列 SQL 更新语句，以锁定要更新的项目：

    Update    MSP_PROJECTS
    Set       PROJ_READ_ONLY = '1',
              PROJ_READ_WRITE = '1',
              PROJ_READ_COUNT = '1',
              PROJ_LOCKED = '1',
              PROJ_MACHINE_ID = 'your computer or application name'
    Where     PROJ_ID = 1

请复制、修改并执行下列 SQL 更新语句，以在完成更新之后解除对项目的锁定：

    Update    MSP_PROJECTS
    Set       PROJ_READ_ONLY = '0',
              PROJ_READ_WRITE = '0',
              PROJ_READ_COUNT = '0',
              PROJ_LOCKED = '0',
              PROJ_MACHINE_ID = null
    Where     PROJ_ID = 1

注释 如果某个用户拥有通过 Project 以读/写方式访问数据库中项目的权限，而另一个用户直接在此数据库中更改了此项目中的数据，那么这些更改不会在 Project 中反映给第一个用户。此外，如果第一个用户将项目数据存回数据库中，这些数据会覆盖第二个用户直接在数据库中所做的更改。

页首

## 添加和更改数据库中的行

### 将所需标志设置为允许更新数据库中的项目数据

当在 Project 之外对数据库中的项目数据进行编辑时，任何情况下，MSP_PROJECTS 表中的 PROJ_EXT_EDITED 列都必须设置为 1。

编辑 MSP_TASKS、MSP_RESOURCES、MSP_ASSIGNMENTS 和 MSP_LINKS 表中的现有行时，必须将 EXT_EDIT_REF_DATA 列设置为 1，其后跟随以下表中所列出的列的值（所有值都以逗号分隔）。但在创建新行时，应将 EXT_EDIT_REF_DATA 列设置为 1。

注释 建议使用 Project 所包含的存储过程来更新含有所需值的列。有关详细信息，请参阅确保数据完整性。

MSP_TASKS | MSP_RESOURCES | MSP_ASSIGNMENTS | MSP_LINKS
--- | --- | --- | ---
TASK_ACT_WORK | RES_ACCRUE_AT | ASSN_UNITS | LINK_TYPE
TASK_WORK | RES_AVAIL_FROM * | ASSN_START_DATE | LINK_LAG
TASK_REM_WORK | RES_AVAIL_TO * | ASSN_FINISH_DATE |
TASK_DUR |  | ASSN_DELAY |
TASK_ACT_DUR |  | ASSN_LEVELING_DELAY |
TASK_REM_DUR |  | ASSN_ACT_START |
TASK_START_DATE |  | ASSN_ACT_FINISH |
TASK_FINISH_DATE |  | ASSN_ACT_WORK |
TASK_CONSTRAINT_TYPE |  | ASSN_REM_WORK |
TASK_CONSTRAINT_DATE |  | ASSN_REG_WORK |
TASK_ACT_START |  | ASSN_WORK |
TASK_ACT_FINISH |  | ASSN_ACT_OVT_WORK |
TASK_STOP_DATE |  | ASSN_REM_OVT_WORK |
TASK_RESUME_DATE |  | ASSN_OVT_WORK |
TASK_PCT_COMP |  |  |
TASK_COST |  |  |
TASK_FIXED_COST |  |  |
TASK_ACT_COST |  |  |
TASK_LEVELING_DELAY |  |  |
TASK_PCT_WORK_COMP |  |  |
TASK_FIXED_COST_ACCRUAL |  |  |

注释 即使备份了 RES_AVAIL_FROM 和 RES_AVAIL_TO 列，也不应对它们进行更新。这些域是针对特定资源从 MSP_AVAILABILITY 表提取出来的，提取方法是：从 MSP_AVAILABILITY 表中该资源的 AVAIL_FROM 值中提取出最早日期值，并从 AVAIL_TO 中提取出最晚日期值。对资源可用性的更改应在 MSP_AVAILABILITY 表中进行。

更新自定义域的数据时，必须在 MSP_PROJECTS 表中设置下列标志：

MSP_PROJECTS 中的标志 | 表标志引用
--- | ---
PROJ_EXT_EDITED_DATE | MSP_DATE_FIELDS
PROJ_EXT_EDITED_DUR | MSP_DURATION_FIELDS
PROJ_EXT_EDITED_FLAG | MSP_FLAG_FIELDS
PROJ_EXT_EDITED_NUM | MSP_NUMBER_FIELDS
PROJ_EXT_EDITED_CODE | MSP_CODE_FIELDS
PROJ_EXT_EDITED_TEXT | MSP_TEXT_FIELDS

更新 MSP_FIELD_ATTRIBUTES 和 MSP_ATTRIBUTE_STRINGS 表时，MSP_FIELD_ATTRIBUTES 表的每个已修改的或新的行中，ATTRIB_EXT_EDITED 列必须设置为 1。更新 MSP_TIMEPHASED_DATA 表时，必须将 TD_EXT_EDITED 列设置为 1。

页首

### 在指定日期的同时指定时间

当您直接在数据库中输入日期值时，应当同时包括时间。如果不指定时间，数据库的日期时间列将使用默认时间，而这可能导致无法预料的结果。数据库列的默认时间一般为午夜 12:00，这对于大多数日历来说通常是非工作时间。当 Project 遇到午夜 12:00，它会将这个时间调整为“下一个”最接近的工作时间（对于开始时间）或“上一个”最接近的工作时间（对于完成时间）。

因此，如果您在指定日期时没有同时指定时间，可能导致下列情形：假定您将任务的开始日期设为星期一的日期，将完成日期设为星期五的日期，从而认为在数据库中创建了一项 5 个工作日的任务。但是数据库中的星期一时间实际为星期一的午夜 12:00，因此 Project 会将它调整为星期一的 8:00 A.M.（根据日历的默认开始时间）。不过对于星期五，默认时间是星期五的午夜 12:00.，因而会被调整到星期四的 5:00 P.M.（日历的默认完成时间）。这样一来，原本安排了 5 个工作日的任务在 Project 中读出后就变得只有 4 个工作日了。如果您总是在每个日期/时间列中明确指定时间，就可以避免出现上述问题。

页首

### 工期、工时、费率和成本值

Project 将所有的工期、工时、成本和费率域保存到数据库中两个不同的列内。第一列是工期值、工时值或费率值，第二列是相应的格式 (FMT) 列（如 TASK_DUR_FMT）。如果更改了数据库的 FMT 列中的值，它不会影响相应工期、工时、费率和成本列的值，Project 将这些值保存为绝对值。FMT 列只是指出 Project 将使用哪个单位标签显示该值。

通过执行下列查询（将 TASK_UID 和 PROJ_ID 替换适当的值）可确定特定任务的任务工期格式：

    Select    TASK_UID, CONV_STRING, TASK_NAME
    From      MSP_TASKS t, MSP_CONVERSIONS c, MSP_STRING_TYPES s
    Where     t.TASK_DUR_FMT = c.CONV_VALUE and
              c.STRING_TYPE_ID = s.STRING_TYPE_ID and
              s.STRING_TYPE = 'Display Units' and
              t.TASK_UID = 4 and
              t.PROJ_ID = 1

因为工期、工时、费率和成本值可以用不同的单位显示，Project 在保存它们时采用一种标准的乘法：

- 工期值保存为分钟 * 10。这样，八小时将保存为 4800（即 8X60X10）。
- 工时值保存为分钟 * 1000。八小时将保存为 480000（即 8X60X1000）。
- 费率值保存为单位/小时。例如，每小时 15 元将保存为 15。
- 成本域保存为单位 * 100。例如，七十元两角五分将保存为 7025。

注释 对于时间分段数据单位，除了 y（或年）以外的所有格式都是有效的。年只能用于“成本费率”。

页首

### 使用文本转换表检索字符串

为了使不同语言版本的 Project 都能读取数据库中的项目，某些列的内容被转换成了数字常数。Project 向数据库中写入了两张包含以下列的转换信息的表：MSP_STRING_TYPES 表包含枚举域类别和域名称之间的映射关系；MSP_CONVERSIONS 表包含数字常数和每个域可能的文本值之间的映射关系。下列域类别将被转换为数字常数：

域类别 | 属于此类别的域 | 来自表
--- | --- | ---
周内日期 | Weekday | MSP_CALENDARS
日程排定开始时间 | ScheduleFromProjectFinish | MSP_PROJECTS
| ScheduleFromProjectStart | MSP_PROJECTS
成本累算 | AccrueAt | MSP_PROJECTS
| FixedCostAccrual | MSP_TASKS
| DefaultFixedCostAccrual | MSP_LINKS
链接类型 | LinkType | MSP_PROJECTS
显示单位 | LinkLagDisplayUnits | MSP_LINKS
| DelayDisplayUnits | MSP_ASSIGNMENTS
| DurationDisplayUnits | MSP_TASKS
| BaselineDurationDisplayUnits | MSP_TASKS
| DelayDisplayUnits | MSP_TASKS
| DurationDisplayUnits | MSP_DURATION_FIELDS
成本费率单位 | StandardRateDisplayUnits | MSP_RESOURCES
| OvertimeRateDisplayUnits | MSP_RESOURCES
| StandardRateDisplayUnits | MSP_RESOURCE_RATES
| OvertimeRateDisplayUnits | MSP_RESOURCE_RATES
工时分布类型 | WorkContour | MSP_ASSIGNMENTS
限制类型 | ConstraintType | MSP_TASKS
任务类型 | Type | MSP_TASKS
| DefaultTaskType | MSP_PROJECTS
日历工作日 | Working | MSP_CALENDAR_DATA
类别类型 | CategoryType | MSP_DATE_FIELDS
| CategoryType | MSP_DURATION_FIELDS
| CategoryType | MSP_NUMBER_FIELDS
| CategoryType | MSP_TEXT_FIELDS
域标识号 | FieldID | MSP_DATE_FIELDS
| FieldID | MSP_DURATION_FIELDS
| FieldID | MSP_NUMBER_FIELDS
| FieldID | MSP_TEXT_FIELDS
| FieldID | MSP_FIELD_ATTRIBUTES
| FieldID | MSP_FIELD_CODES
工作组消息 | Workgroup | MSP_RESOURCES
货币符号位置 | CurrencyPosition | MSP_PROJECTS
域属性 | OutlineCodeName | MSP_OUTLINE_CODES
| WBSMask | MSP_FIELD_ATTRIBUTES
时间分段分布类型 | RemainingWork | MSP_ASSIGNMENTS
| ActualWork | MSP_ASSIGNMENTS
| ActualOvertimeWork | MSP_ASSIGNMENTS
| BaselineWork | MSP_ASSIGNMENTS
| BaselineCost | MSP_ASSIGNMENTS
| ActualCost | MSP_ASSIGNMENTS
| BaselineWork | MSP_RESOURCES
| BaselineCost | MSP_RESOURCES
| BaselineWork | MSP_TASKS
| BaselineCost | MSP_TASKS
| PercentComplete | MSP_TASKS
| Splits | MSP_TIMEPHASED_DATA

可将来自不同语言版本的 Project 中的项目存储到同一个数据库中。在第一次将新语言表示的项目保存到数据库时，Project 会向 MSP_STRING_TYPES 和 MSP_CONVERSIONS 表中添加与该语言对应的值。

注释 保存到数据库时，Project 计算机和数据库服务器的代码页必须相同。

在选择将部分项目数据保存到数据库时，如果 MSP_STRING_TYPES 和 MSP_CONVERSIONS 表中没有转换字符串，Project 将创建转换字符串。

各种语言版本的 Project 数据库中的表名称和列名称都用英文表示。如果更改了数据库中某个表的名称，有可能破坏该数据库，从而导致 Project 不能读取该表乃至整个项目。

页首

## 创建项目日程数据

注释 本部分中的信息并不是都可以应用于（可能有所不同）Project server 数据库中所存储的企业项目数据。建议只使用 PDS、Project Professional 或 Project Web Access 与 Project Server 数据库中的企业项目数据进行交互。

### 创建新的非企业项目

若要在数据库中新建项目，必须向 MSP_PROJECTS 表中添加新行，并在 MSP_TASKS 表中创建项目摘要任务。请参阅下面的新建任务、新建资源和新建工作分配。然后，若要向项目中添加相关的任务、资源和工作分配，必须如下所述创建任务、资源和工作分配行。至少必须为下面指定的列输入值。

表 | 域 | 备注
--- | --- | ---
MSP_PROJECTS | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| PROJ_NAME | 在项目窗口标题栏中显示的项目名称。
| PROJ_INFO_START_DATE | 项目的计划开始日期和时间。
| PROJ_EXT_EDITED | 必须设置为 1，以表示该项目是新项目。
MSP_TASKS | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| TASK_UID | 任务的唯一标识号。
| TASK_ID | 任务列表中该任务的位置标识符。

注释

- 对于数据库中的新建项目而言，所有 Boolean 类型的 Project 选项在默认情况下都设置为 0，而不是通常的 Project 默认值。为了确保打开项目之后，Project 能以所期望的方式工作，应将 MSP_PROJECTS 表中的所有选项值设为所期望的设置。
- 若要创建从项目完成日期开始排定日程的项目，可将 MSP_PROJECTS 表中的 PROJ_INFO_FINISH_DATE 设置为项目的完成日期（而不是将 PROJ_INFO_START_DATE 设为开始日期），并将 PROJ_INFO_SCHED_FROM 设为 0。

页首

### 创建插入项目

在数据库中创建一个插入项目的过程分为两步：即新建一个任务，然后指定自定义文本域的值。必须向 MSP_TASKS 和 MSP_TEXT_FIELDS 表中添加新的记录，至少要为这些记录指定下列域的值，并要设置 MSP_PROJECTS 表中外部编辑的标志：

表 | 域 | 备注
--- | --- | ---
MSP_TASKS | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| TASK_UID | 包含任务的标识号。
| TASK_ID | 任务列表中该任务的位置标识符。
| EXT_EDIT_REF_DATA | 必须设置为 1，以指定该任务为新任务。
MSP_TEXT_FIELDS | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| TEXT_CATEGORY | 设置为 0，以指定一项任务。
| TEXT_REF_UID | 引用 MSP_TASKS 表中的有效标识号。
| TEXT_FIELD_ID | 引用 MSP_CONVERSIONS 表中的有效 CONV_VALUE。
| TEXT_VALUE | 要插入项目的名称。例如：
    <c:\test.mdb>\my project
MSP_PROJECTS | PROJ_EXT_EDITED | 必须设置为 1，以便 Project 处理。
| PROJ_EXT_EDITED_TEXT | 必须设置为 1，以便 Project 处理。

注释 从数据库中删除插入项目时，必须删除上面指定的表中与此插入项目有关的所有行。这样做是为了避免在数据库中留下孤立数据，在 Project 中打开数据库时，其中的孤立数据可能会产生无法预料的结果。

例如，假设在一个数据库中存储了两个项目，现在要将其中一个项目变成另一个项目的插入项目。假定这两个项目存储于一个 .mpd 文件中，并用名为 Projects 的 DSN 来访问该文件，项目名称分别为 Master Project 和 Subproject。首先您必须在 Master Project 中创建一个包容插入项目的任务。这条记录将以如下形式出现在 MSP_TASKS 表中：

域 | 值
--- | ---
PROJ_ID | 1
TASK_UID | 5
TASK_ID | 5
TASK_NAME | My subproject
EXT_EDIT_REF_DATA | 1

此处的 TASK_ID 和 TASK_UID 只是用于演示目的，并无实质意义。重要的是要记住它们在当前项目的所有标识号中必须是唯一的。插入此任务之后，您必须指定此插入项目文件的名称。例如，向 MSP_TEXT_FIELDS 表中添加以下行：

域 | 值
--- | ---
PROJ_ID | 1
TEXT_CATEGORY | 0
TEXT_REF_UID | 5
TEXT_FIELD_ID | 188743706
TEXT_VALUE | 4800

PROJ_ID 的值必须引用 MSP_PROJECTS 表中的有效标识号。本例中，由于我们要设置任务文本域，所以 TEXT_CATEGORY 为 0。TEXT_REF_UID 的值直接从 MSP_TASKS 表中的 TASK_UID 列获取。TEXT_FIELD_ID 的值取自 MSP_CONVERSIONS 表的 CONV_VALUE 列中 CONV_STRING 等于“任务子项目文件”的记录。TEXT_VALUE 域获取实际项目名。

为了使 Project 能够读取此行，必须将 MSP_PROJECTS 表中的 PROJ_EXT_EDITED_TEXT 标志设为 1。

页首

### 创建新的非企业资源

若要在数据库中创建一项新资源，必须向 MSP_RESOURCES 表中添加一个新行，并至少输入以下列的值：

表 | 域 | 备注
--- | --- | ---
MSP_RESOURCES | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| RES_UID | 资源的唯一标识号。
| RES_ID | 资源列表中该资源的位置标识符。
| RES_NAME | 资源名称。
| RES_TYPE | 资源类型，或者为“工时”(0)，或者为“材料”(1)。
| EXT_EDIT_REF_DATA | 必须设置为 1，以便 Project 处理。
MSP_PROJECTS | PROJ_EXT_EDITED | 必须设置为 1，以便 Project 处理。

以下 SQL 插入语句经修改可以用于插入新的工时资源。

    Insert into MSP_RESOURCES (
                  PROJ_ID,
                  RES_UID,

                  RES_ID,
                  RES_NAME,
                  RES_TYPE,
                  EXT_EDIT_REF_DATA )
              values (
                  3,
                  4,
                  4,
                  'John Smith',
                  0,
                  '1' )

页首

### 创建新的非企业日历

可以为项目或非企业资源创建日历。还可以选择将基准日历应用于任务。项目基准日历隐含定义了其他基准日历和资源日历的工作时间。日历数据存储于 MSP_CALENDARS 表中。日历工作时间和例外日期存储于 MSP_CALENDAR_DATA 表中（有关详细信息，请参阅指定日历的工作时间和例外日期）。若要新建日历，必须创建一个新行，并且至少要输入以下列的值：

表 | 域 | 备注
--- | --- | ---
MSP_CALENDAR_DATA | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| CAL_ UID | 引用 MSP_CALENDARS 表中的有效标识号。
| CAL_BASE_UID | 引用其父基准日历的日历。
| CAL_IS_BASE_CAL | 指示此日历是否为基准日历；如果是基准日历，其值为 -1。
| CAL_NAME | 日历名称。
MSP_PROJECTS | PROJ_EXT_EDITED | 必须设置为 1，以便 Project 处理。

若要创建新的基准日历，请复制、修改并执行下列 SQL 插入语句：

    Insert into MSP_CALENDARS (
                  PROJ_ID,

                  CAL_UID,
                  CAL_BASE_UID,
                  CAL_IS_BASE_CAL,
                  CAL_NAME )
              values (
                  3,
                  4,
                  -1,
                  1,
                  'new base calendar' )

若要创建新的资源日历，请复制、修改并执行下列 SQL 插入语句：

    Insert into MSP_CALENDARS (
                  PROJ_ID,
                  CAL_UID,
                  CAL_BASE_UID,
                  RES_UID,
                  CAL_IS_BASE_CAL )
              values (
                  3,
                  5,
                  2,
                  4,
                  0 )

注释

- 删除指定给任务的日历可能会导致应用于该任务的实际工时发生移动。
- 建议不要修改 CAL_UID 值。修改 CAL_UID 值可能会导致数据不一致。
- 指定的日历名称超过 51 个字符可能会导致数据不一致。

页首

### 指定日历的工作时间和例外日期

日历的标准工作时间和例外日期都存储于 MSP_CALENDAR_DATA 表中。必须为每个工作日和非工作日插入一行。此外，必须为每个例外时间段插入一行。若要指定日历的工作日，必须插入一行，并且至少输入以下列的值：

注释 不能使用本示例为企业资源指定日历工作时间和例外日期。

表 | 域 | 备注
--- | --- | ---
MSP_CALENDAR_DATA | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| CD_UID | 日历的工作时间、非工作时间和例外日期数据的唯一标识号。
| CAL_ UID | 引用 MSP_CALENDARS 表中的有效标识号。
| CD_DAY_OR_EXCEPTION | 指示日历是否具有已定义的工作日（1-7 分别将工作日定义为星期日到星期六），或者它是否为例外日期 (0)。
| CD_WORKING | 指示所选日期为工作日 (1) 还是非工作日 (0)。
| CD_FROM_TIME1 | 包含工作日的起始日期和时间。
| CD_TO_TIME1 | 包含工作日的结束日期和时间。
MSP_PROJECTS | PROJ_EXT_EDITED | 必须设置为 1，以便 Project 处理。

注释 如果日历为例外日期（由 CD_DAY_OR_EXCEPTION 判断），将使用 CD_FROM_DATE 和 CD_TO_DATE，而不用 CD_FROM_TIME 和 CD_TO_TIME。

若要指定一个日历的工作日和例外日期，请为每个工作日复制、修改并执行下列插入语句：

    Insert into MSP_CALENDAR_DATA (
                  PROJ_ID,
                  CD_UID,
                  CAL_UID,
                  CD_DAY_OR_EXCEPTION,
                  CD_WORKING,
                  CD_FROM_TIME1,
                  CD_TO_TIME1,
                  CD_FROM_TIME2,
                  CD_TO_TIME2 )
              values (
                  3,
                  1,
                  3,
                  2, -- Monday
                  1, -- Working
                  '7/15/2003 8:00:00 AM',
                  '7/15/2003 12:00:00 PM',
                  '7/15/2003 1:00:00 PM',
                  '7/15/2003 5:00:00 PM' )

注释 如果 CD_WORKING 设置为 0，不用为 CD_FROM_TIMEn 或 CD_TO_TIMEn 指定值。

页首

### 指定资源可用性

若要指定资源的可用性，必须为每个可用时间段向 MSP_AVAILABILITY 表中添加一行，并且输入以下列的值：

注释 不能使用本示例指定企业资源的资源可用性。

表 | 域 | 备注
--- | --- | ---
MSP_AVAILABILITY | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| AVAIL_UID | 资源可用性的唯一标识号。
| RES_UID | 引用 MSP_RESOURCES 表中的有效标识号。
| AVAIL_FROM | 资源对所定义时间段可用的日期；忽略日期的时间部分。
| AVAIL_TO | 对于所定义的时间段，资源不再可用的日期。
| AVAIL_UNITS | 显示的小数部分表示可用时间段的百分比，此时的资源在所定义的时间段内可进行工作。
MSP_PROJECTS | PROJ_EXT_EDITED | 必须设置为 1，以便 Project 处理。

若要指定在从 2003 年 7 月 15 日到 2003 年 7 月 20 日的时间段中资源有 50% 可供使用，请复制、修改并执行下列插入语句：

    Insert into MSP_AVAILABILITY (
                  PROJ_ID,
                  AVAIL_UID,
                  RES_UID,
                  AVAIL_FROM,
                  AVAIL_TO,
                  AVAIL_UNITS )
              values (
                  3,
                  1,
                  5,
                  '7/15/2003',
                  '7/21/2003',
                  0.5 )

页首

### 指定资源费率

若要为某个资源指定单一费率，必须向 MSP_RESOURCE_RATES 表添加一行，并且至少输入以下列的值：

注释 不能使用本示例指定企业资源的资源费率。

表 | 域 | 备注
--- | --- | ---
MSP_RESOURCE_RATES | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| RR_UID | 资源费率的唯一标识号。
| RES_UID | 引用 MSP_RESOURCES 表中的有效标识号。
| RR_RATE_TABLE | 指定工作分配中对资源使用何种成本费率表；0-4 分别代表成本费率表 A-E。
| RR_STD_RATE 或 RR_OVT_RATE 或 RR_PER_USE_COST | 必须在这三列中的一列中设置值。费率以每小时多少元表示，每次使用成本表示为元 * 100。如果指定标准或加班费率，可选择将其格式指定为 RR_STD_RATE_FMT 或 RR_OVT_RATE_FMT。
MSP_PROJECTS | PROJ_EXT_EDITED | 必须设置为 1，以便 Project 处理。

若要定义具有生效（起始）日期的费率，必须在 MSP_RESOURCE_RATES 表中插入两行：一行用于没有生效日期的第一个费率，一行用于有生效日期的费率。若要在成本费率表 B 中为资源指定一定日期范围内的每小时标准成本费率和加班成本费率，请复制、修改并运行以下插入语句：

    -- insert the first rate (from date not required)
    Insert into MSP_RESOURCE_RATES (
                  PROJ_ID,
                  RR_UID,
                  RES_UID,
                  RR_RATE_TABLE,
                  RR_TO_DATE,
                  RR_STD_RATE,
                  RR_STD_RATE_FMT,
                  RR_OVT_RATE,
                  RR_OVT_RATE_FMT )
              values (
                  3,
                  1,
                  5,
                  1, -- table B
                  '2003-03-15', -- rate end date
                  24.00, -- $24/h standard rate
                  2, -- standard rate format = h = hours
                  36.00, -- $36/h overtime rate
                  2 ) -- overtime rate format = h = hours
    -- insert the second rate
    Insert into MSP_RESOURCE_RATES (
                  PROJ_ID,
                  RR_UID,
                  RES_UID,
                  RR_RATE_TABLE,
                  RR_FROM_DATE,
                  RR_TO_DATE,
                  RR_STD_RATE,
                  RR_STD_RATE_FMT,
                  RR_OVT_RATE,
                  RR_OVT_RATE_FMT )
              values (
                  3,
                  2,
                  5,
                  1, -- table B
                  '2003-03-15', -- rate start date
                  '2003-04-15', -- rate end date
                  24.00, -- $24/h standard rate
                  2, -- standard rate format = h = hours
                  36.00, -- $36/h overtime rate
                  2 ) -- overtime rate format = h = hours

若要在表 C 中为资源指定每次使用成本，请复制、修改并执行下列插入语句：

    Insert into MSP_RESOURCE_RATES (
                  PROJ_ID,
                  RR_UID,
                  RES_UID,
                  RR_RATE_TABLE,
                  RR_PER_USE_COST )
              values (
                  3,
                  3,
                  5,
                  2, -- table C
                  5000 ) --'- $50.00 per use cost

若要从指定的资源费率表（A、B、C 等）中删除所有的资源费率，必须删除该资源在该表中现有的所有记录，并创建一项成本为零的记录。

页首

### 新建任务

若要在数据库中创建一项新任务，必须向 MSP_TASKS 表中添加一个新行，并至少输入以下列的值：

表 | 域 | 备注
--- | --- | ---
MSP_TASKS | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| TASK_UID | 任务的唯一标识号。
| TASK_ID | 任务列表中该任务的位置标识符。
| TASK_NAME | 任务名称；子任务无需名称。
| EXT_EDIT_REF_DATA | 必须设置为 1，以指定该任务为新任务。
MSP_PROJECTS | PROJ_EXT_EDITED | 必须设置为 1，以便 Project 处理。

例如，假设您当前的项目具有 22 项任务，它们的 TASK_UID 和 TASK_ID 都为 1 到 22。如果希望创建一个新的、为期一天的名称为“研究竞争对手”的任务，并且希望该任务是此项目中的第八项任务，应将下列行添加到 MSP_TASKS 表中：

域 | 值
--- | ---
PROJ_ID | 3
TASK_UID | 23
TASK_ID | 8
TASK_NAME | 研究竞争对手
TASK_DUR | 4800
EXT_EDIT_REF_DATA | 1

从 MSP_PROJECTS 表中获取正确的 PROJ_ID。对于 TASK_UID，请使用 23，因为它是下一个可用的数字。将 TASK_ID 设置为 8，以使该任务成为列表中的第八项任务。这需要使后面每个记录的 TASK_ID 移动一个单位，以留出空间（因为 TASK_ID 必须是唯一的）。可执行下列 SQL 更新语句对 TASK_ID 进行重新编号：

    Update    MSP_TASKS
    Set       TASK_ID = TASK_ID + 1
    Where     TASK_ID between 8 and 22 and
              PROJ_ID = 3

请记住要将 PROJ_ID 的值更改为要重新对其任务进行编号的项目。在对已有任务进行重新编号之后，可执行下列 SQL 插入语句来创建新任务：

    Insert into MSP_TASKS (
                  PROJ_ID,
                  TASK_UID,
                  TASK_ID,
                  TASK_NAME,

                  TASK_DUR,
                  TASK_OUTLINE_LEVEL,
                  EXT_EDIT_REF_DATA )
              values (
                  3,
                  23,
                  8,
                  'my task',
                  4800,
                  1,
                  '1' )

注释

- 当从文件、表或电子表格中导入任务数据时，将以下面的外部编辑数据的处理顺序部分中指定的顺序处理数据。
- 如果新任务的任务标识号间具有间隔（如 10、20 等），Project 将重新按顺序指定任务标识号。不能在数据库中的任务标识号间创建间隔。
- 在数据库中创建的所有未指定大纲级别的新任务都将插入到 0 级中。如果任务插入在大纲级别较低的两个已有任务之间，那么第二个任务（以及所有后续子任务）都将成为该插入任务的子任务。这可能会改变这些后续任务的大纲级别。
- 若要将工期指定为估计值，必须将 TASK_DUR_FMT 列设置为估计显示值。有关设置工期显示值的详细信息，请参阅上面的工期、工时、费率和成本值。

页首

### 创建周期性任务

虽然可以在数据库中创建周期性任务，但最好还是在 Project 中进行创建。这是因为如果直接在数据库中创建周期性任务，Project 中的“周期性任务信息”对话框不会反映周期性任务的实际设置。在数据库中创建的周期性任务总是默认显示为从当前日期开始在每个星期一重复发生、工期为一天的任务。若要创建周期性任务，必须为摘要任务和周期性子任务的每个实例分别添加一行，并且至少输入以下列的值：

表 | 域 | 备注
--- | --- | ---
MSP_TASKS | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| TASK_UID | 任务的唯一标识号。
| TASK_ID | 任务列表中该任务的位置标识符。
| TASK_NAME | 任务名称；子任务无需名称。
| TASK_OUTLINE_LEVEL | 指定任务的大纲级别；周期性子任务的级别必须比周期性摘要任务低一个级别。
| TASK_IS_RECURRING | 设置为 1，以指定任务是一系列周期性任务中的一部分。
| TASK_IS_RECURRING_SUMMARY | 设置为 1，以指定任务是周期性摘要任务。
| TASK_IS_ROLLED_UP | 设置为 1，以指定摘要任务条形图显示总成型栏，或指定子任务栏上的信息上卷到摘要任务条形图。
| TASK_CONSTRAINT_TYPE | 在排定任务日程时应用的限制类型；对子任务来说这是必需的。
| EXT_EDIT_REF_DATA | 必须设置为 1，以指定该任务为新任务。
MSP_PROJECTS | PROJ_EXT_EDITED | 必须设置为 1，以便 Project 处理。

若要创建一个带有两个周期性子任务的周期性任务，请复制、修改并执行下列三条插入语句：

    -- insert the summary recurring task
    Insert into MSP_TASKS (
                  PROJ_ID,
                  TASK_UID,
                  TASK_ID,
                  TASK_NAME,
                  TASK_OUTLINE_LEVEL,
                  TASK_IS_RECURRING,
                  TASK_IS_RECURRING_SUMMARY,
                  TASK_IS_ROLLED_UP,
                  EXT_EDIT_REF_DATA )
              values (
                  3,
                  9,
                  9,
                  'my recurring summary task',
                  2, -- outline level
                  1, -- is recurring
                  1, -- is recurring summary
                  1, -- is rolled up
                  '1' )

    -- insert the first recurring subtask
    Insert into MSP_TASKS (
                  PROJ_ID,
                  TASK_UID,
                  TASK_ID,
                  TASK_OUTLINE_LEVEL,
                  TASK_IS_RECURRING,
                  TASK_IS_RECURRING_SUMMARY,
                  TASK_IS_ROLLED_UP,
                  TASK_CONSTRAINT_TYPE,
                  EXT_EDIT_REF_DATA )
              values (
                  3,
                  10,
                  10,
                  3, -- outline level
                  1, -- is recurring
                  0, -- is recurring summary
                  1, -- is rolled up
                  4, -- constraint type = 4 = 'Start no earlier than'
                  '1' )

    -- insert the second recurring subtask
    Insert into MSP_TASKS (
                  PROJ_ID,
                  TASK_UID,
                  TASK_ID,
                  TASK_OUTLINE_LEVEL,
                  TASK_IS_RECURRING,
                  TASK_IS_RECURRING_SUMMARY,
                  TASK_IS_ROLLED_UP,
                  TASK_CONSTRAINT_TYPE,
                  EXT_EDIT_REF_DATA )
              values (
                  3,
                  11,
                  11,
                  3, -- outline level
                  1, -- is recurring
                  0, -- is recurring summary
                  1, -- is rolled up
                  4, -- constraint type = 4 = 'Start no earlier than'
                  '1' )

页首

### 创建任务相关性

若要在数据库中创建新的任务链接相关性，必须向 MSP_LINKS 表添加一个新行，并至少输入以下列的值（这样将创建一个简单的无延隔时间的“完成-开始”型链接）：

表 | 域 | 备注
--- | --- | ---
MSP_LINKS | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| LINK_UID | 链接的唯一标识号。
| LINK_PRED_UID | 前置任务的唯一标识号；引用 MSP_TASKS 表中的有效标识号。
| LINK_SUCC_UID | 后续任务的唯一标识号；引用 MSP_TASKS 表中的有效标识号。
| EXT_EDIT_REF_DATA | 必须设置为 1，以指定该链接为新链接。
MSP_PROJECTS | PROJ_EXT_EDITED | 必须设置为 1，以便 Project 处理。

    Insert into MSP_LINKS (
                  PROJ_ID,
                  LINK_UID,
                  LINK_PRED_UID,
                  LINK_SUCC_UID,
                  EXT_EDIT_REF_DATA )
              values (
                  3,
                  1,
                  1,
                  2,
                  0 )

若要指定有别于默认类型的链接类型，请将 LINK_TYPE 列设置为所需的链接类型。可以从 MSP_CONVERSIONS 表的 CONV_VALUE 列中 STRING_TYPE_ID 为 3（代表链接类型）的行中获取链接类型的有效值。有效的链接类型包括：0（完成-完成）、1（完成-开始）、2（开始-完成）和 4（开始-开始）。

若要在创建链接时指定延隔时间，必须指定以下列：

表 | 域 | 备注
--- | --- | ---
MSP_LINKS | LINK_LAG | 指定延隔时间，按工期值（分钟 * 10）指定。
| LINK_LAG_FMT | 指定在 LINK_LAG 中所指定的延隔时间量的格式。
| EXT_EDIT_REF_DATA | 必须设置为 1，以指定该链接为新链接。
MSP_PROJECTS | PROJ_EXT_EDITED | 必须设置为 1，以便 Project 处理。

页首

### 新建工作分配

若要在数据库中创建新的工作分配，必须向 MSP_ASSIGNMENTS 表添加一个新行，并至少输入以下列的值：

表 | 域 | 备注
--- | --- | ---
MSP_ASSIGNMENTS | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| ASSN_UID | 工作分配的唯一标识号。
| TASK_UID | 引用 MSP_TASKS 表中的有效标识号。
| RES_UID | 引用 MSP_RESOURCES 表中的有效标识号。
| ASSN_UNITS | 资源分配给任务的单位百分数，表示为 100% 的百分数（假设资源的 MaxUnits 值为 100%）
| ASSN_WORK | 计划由任务中某个资源完成的总工时量；如果未指定，将为默认值 0。
| EXT_EDIT_REF_DATA | 必须设置为 1，以指定该工作分配是新工作分配。
MSP_PROJECTS | PROJ_EXT_EDITED | 必须设置为 1，以便 Project 处理。

若要创建工作分配，请复制、修改并执行下列插入语句：

    Insert into MSP_ASSIGNMENTS (
                  PROJ_ID,
                  ASSN_UID,
                  RES_UID,
                  TASK_UID,
                  ASSN_UNITS,
                  ASSN_WORK,
                  EXT_EDIT_REF_DATA )
              values (
                  3,
                  11,
                  6,
                  14,
                  0.5, -- 50% of resource 6's available time
                  480000, -- eight hours of work
                  '1' )

若要为数据库中现有的尚未分配的任务新建工作分配，必须从 MSP_ASSIGNMENTS 表中删除引用该任务 TASK_UID 的占位工作分配。若要删除占位工作分配，请复制、修改并执行以下删除语句。

    Delete from MSP_ASSIGNMENTS
    Where TASK_UID = 17
    And RES_UID = -65535 -- unassigned resource ID

注释

- 必须在 MSP_TIMEPHASED_DATA 表而不是 MSP_ASSIGNMENTS 表中指定工作分配的实际成本，以便 Project 进行处理。
- 将材料资源分配给任务时，将忽略任务工期，此时，工期由工作分配中输入的工时决定。

页首

## 管理时间分段数据

时间分段数据存储于 MSP_TIMEPHASED_DATA 表中。数据的存储方式与其在“任务分配状况”视图和“资源使用状况”视图中显示的方式大体相同。该表中的每一行指定：

注释 Project Server 通过存储于 Project Server 数据库中的视图表来维护时间分段数据。可以在 Project Web Access 用户界面中轻松访问视图表。

- 数据类型，即工作分配、任务或资源的工时、完成百分比或成本值。
- 对某个工作分配、任务或资源记录的引用。
- 日期范围。
- 指定日期范围内每个时间段的指定数据类型的一个或多个值。
- 每个值列对应的时间单位（如工作日或周）。

所得数据的类型将被设为 MSP_CONVERSIONS 表（其中字符串类型等于“时间分段分布类型”）中 CONV_VALUE 列的适当的值。可记录的数据类型包括：

- 工作分配剩余工时
- 工作分配实际工时
- 工作分配实际加班工时
- 工作分配比较基准工时
- 工作分配比较基准成本
- 工作分配实际成本
- 资源比较基准工时
- 资源比较基准成本
- 任务比较基准工时
- 任务比较基准成本
- 任务完成百分比

注释 工作分配已完成工时不保存在数据库中。工作分配已完成工时是按工作分配实际工时除以工作分配工期来计算的。

若要记录某个工作分配或任务的时间分段剩余工时、实际工时或成本，必须向 MSP_TIMEPHASED_DATA 表添加一个或多个新行，并且至少输入以下列的值：

表 | 域 | 备注
--- | --- | ---
MSP_TIMEPHASED_DATA | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| TD_UID | 时间分段数据记录的唯一标识号。
| TD_FIELD_ID | 引用 MSP_CONVERSIONS 表中的有效 CONV_VALUE。
| TD_CATEGORY | 设置为 0，以指定一项任务。
| TD_REF_UID | 显示应用时间分段数据的行的相应 TASK_UID、RES_UID 或 ASSN_UID 值。
| TD_START | 将应用工时、完成百分比或成本值的第一个时间段的开始时间。
| TD_FINISH | 将应用工时、完成百分比或成本值的第一个时间段的结束时间。
| TD_UNITS | 应用 TD_VALUE1 - TD_VALUE7 中所指定值的时间单位。
| TD_VALUE1 - TD_VALUE7 | 在 TD_START 列和 TD_FINISH 列中指定的日期范围内，按 TD_UNITS 列所指定的单位，第一到第七时间段的工时、完成百分比或成本的值；只应用位于指定的开始日期和完成日期之间的值。
| TD_EXT_EDITED | 必须设置为 1，以便 Project 处理。
MSP_PROJECTS | PROJ_EXT_EDITED | 必须设置为 1，以便 Project 处理。

下表显示 MSP_TIMEPHASED_DATA 表中存储的数据是如何与任务分配状况视图中某个工作分配的实际工时数据相关联的：

项目域 | 分配状况视图值 | 数据库列 | MSP_TIMEPHASED_DATA 值
--- | --- | --- | ---
项目标识号 | n/a | PROJ_ID | 3
时间分段记录 UID | n/a | TD_UID | 4
详细信息 | 实际工时 | TD_FIELD_ID | 2
类别 | n/a | TD_CATEGORY | 3
工作分配 UID | n/a | TD_REF_UID | 16
时间段 | 时间刻度 | TD_START | 7/15/2003 8:00:00 AM
|  | TD_FINISH | 7/26/2003 8:00:00 AM
| 次要时间刻度 | TD_UNITS | 3
实际工时 | 8h | TD_VALUE1 | 480000
| 4h | TD_VALUE2 | 240000
| 0h | TD_VALUE3 | 0
| 4h | TD_VALUE4 | 240000

页首

### 创建或修改工作分配实际工时顺序

若要为工作分配指定实际工时，请复制、修改并执行下列插入语句：

    Insert into MSP_TIMEPHASED_DATA (
                  PROJ_ID,
                  TD_UID,
                  TD_FIELD_ID,
                  TD_CATEGORY,
                  TD_REF_UID,
                  TD_START,
                  TD_FINISH,
                  TD_UNITS,
                  TD_VALUE1,
                  TD_VALUE2,
                  TD_VALUE3,
                  TD_VALUE4,
                  TD_EXT_EDITED )
              values (
                  3,
                  108,
                  2, -- assignment actual work
                  3, -- category = assignment
                  2, -- assignment UID
                  '7/15/2003 8:00:00 AM', -- start of the first time period
                  '8/26/2003 8:00:00 AM', -- end of the last time period
                  2, -- each value column represents a day,
                  480000, -- day one value = 8h = (480 minutes * 1000)
                  240000, -- day two value = 4h = (240 minutes * 1000)
                  0, -- day three value = 0h = (zero minutes * 1000)
                  240000, -- day three value = 4h = (240 minutes * 1000)
                  1 ) -- externally edited flag

注释 TD_FINISH 的值在 Project 中将显示为 2003 年 7 月 25 日，因为 2003 年 8 月 26 日 08:00 被认为是开始于 8 月 25 日的工作日的结束时间。

页首

### 在排定工时中创建拆分

在排定的工时中创建拆分与指定实际工时很相似。其区别在于：

- “工作分配剩余工时”的 TD_FIELD_ID 设置为 1。
- TD_CATEGORY 设置为 0，以指定一项任务。
- 未排定工时的每个指定时间段的 TD_VALUEn 设置为 0。

页首

### 创建或修改工作分配剩余工时顺序

指定剩余工时与指定实际工时很相似。其区别在于：

- “工作分配剩余工时”的 TD_FIELD_ID 设置为 1。
- TD_CATEGORY 设置为 3，以指定一个工作分配。

页首

### 创建或修改成本分布

若要为八天以上的工作分配指定成本分布，请复制、修改并执行下列插入语句：

    Insert into MSP_TIMEPHASED_DATA (
                  PROJ_ID,
                  TD_UID,
                  TD_FIELD_ID,
                  TD_CATEGORY,
                  TD_REF_UID,
                  TD_START,
                  TD_FINISH,
                  TD_UNITS,
                  TD_VALUE1,
                  TD_EXT_EDITED )
              values (
                  3,
                  109,
                  6, -- assignment actual cost
                  3, -- category = assignment
                  3, -- assignment UID
                  '7/15/2003 8:00:00 AM', -- start of the first time period
                  '8/26/2003 8:00:00 AM', -- end of the last time period
                  3, -- each value column represents a week,
                  10032, -- week one value = $100.32 cost * 100,
                  1 )

本示例为一个为期七天的工作分配创建了一条成本为 ￥100.32 的记录。若要为第八天创建一条记录，请复制和修改下列插入语句：

    Insert into MSP_TIMEPHASED_DATA (
                  PROJ_ID,
                  TD_UID,
                  TD_FIELD_ID,
                  TD_CATEGORY,
                  TD_REF_UID,
                  TD_START,
                  TD_FINISH,
                  TD_UNITS,
                  TD_VALUE1,
                  TD_EXT_EDITED )
              values (
                  3,
                  110,
                  6, -- assignment actual cost
                  3, -- category = assignment
                  3, -- assignment UID
                  '7/15/2003 8:00:00 AM', -- start of the first time period
                  '8/26/20031 8:00:00 AM', -- end of the last time period
                  2, -- days,
                  1650, -- day one value = $16.50 cost * 100,
                  1 )

结合这两组插入语句即可创建指定时间段为八天的成本分布。

注释 如果 MSP_PROJECTS 表中的 PROJ_OPT_CALC_ACT_COSTS 列设置为 1，Project 将忽略所插入的成本数据。

若要清除该标志，请复制、修改并执行下列更新语句：

    Update    MSP_PROJECTS
    Set       PROJ_OPT_CALC_ACT_COSTS = 0
    Where     PROJ_ID = 3

页首

### 创建或修改任务完成百分比分布

若要为任务指定完成百分比分布，请复制、修改并执行下列插入语句：

    Insert into MSP_TIMEPHASED_DATA (
                  PROJ_ID,
                  TD_UID,
                  TD_FIELD_ID,
                  TD_CATEGORY,
                  TD_REF_UID,
                  TD_START,
                  TD_FINISH,
                  TD_UNITS,
                  TD_VALUE1,
                  TD_VALUE2,
                  TD_VALUE3,
                  TD_EXT_EDITED )
              values (
                  3,
                  111,
                  11, -- task percent complete
                  0, -- category = task
                  3, -- TASK_UID
                  '7/15/2003 8:00:00 AM', -- start of the first time period
                  '8/26/2003 8:00:00 AM', -- end of the last time period
                  2, -- days,
                  72, -- day one value = 72 percent * 100,
                  0, -- day two value of zero percent * 100,

                  28, -- day three value = 28 percent * 100,
                  1 )

本示例创建一条如下记录：在开始于 2003 年 7 月 15 日上午 8:00:00 的当天完成任务的 72%，第二天完成 0%，2003 年 8 月 25 日完成 28%。

页首

### 删除分布

若要删除 MSP_TIMEPHASED_DATA 表中的分布，请更新该分布的所有行，将所有的 TD_VALUE 列设置为 0，并将 TD_EXT_EDITED 设置为 1。在更新单独一行时，如果同一分布中在更新行前后存在用于其他时间段的一行或多行，将更新行中所有 TD_VALUE 列的值设置为 0 不会导致删除该行，相反，将会拆分该分布并保留该行。

注释 保存项目后，Project 才会真正删除 MSP_TIMEPHASED_DATA 表中的更新行。

页首

## 自定义 Project 数据

自定义标志域存储于数据库的 6 个特殊表中，每个表对应于一种自定义域类型。若要指定一个自定义域的值，必须向相应的自定义域表中添加一个新行，并在 MSP_PROJECTS 表中设置相应的标志。可使用相同的步骤来指定项目摘要任务的自定义域值，但必须使用值为 0 的特殊 TASK_UID。

注释 本部分中的信息并不是都可以应用于（可能有所不同）Project Server 数据库中所存储的企业项目数据。建议只使用 PDS、Project 或 Project Web Access 与 Project Server 数据库中的企业项目数据进行交互。

页首

### 指定自定义文本域

若要指定自定义文本域，必须在下列数据库域中输入值：

表 | 列 | 备注
--- | --- | ---
MSP_TEXT_FIELDS | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| TEXT_CATEGORY | 指定自定义文本类别为“任务”(0)、“资源”(1) 还是“工作分配”(3)。
| TEXT_REF_UID | 由 TEXT_CATEGORY 判定，引用其各自表中的有效 TASK_UID、RES_UID 或 ASSN_UID。
| TEXT_FIELD_ID | 引用 MSP_CONVERSIONS 表中的有效 CONV_VALUE；对于插入项目，总是使用 188743706。
| TEXT_VALUE | 自定义文本域的值。
MSP_PROJECTS | PROJ_EXT_EDITED | 必须设置为 1，以便 Project 处理。
| PROJ_EXT_EDITED_TEXT | 必须设置为 1，以便 Project 处理。

页首

### 指定自定义数字（成本）域

若要指定自定义数字域，必须在下列数据库列中输入值：

表 | 列 | 备注
--- | --- | ---
MSP_NUMBER_FIELDS | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| NUM_CATEGORY | 指定自定义数字类别为“任务”(0)、“资源”(1) 还是“工作分配”(3)。
| NUM_REF_UID | 由 NUM_CATEGORY 判定，引用其各自表中的有效 TASK_UID、RES_UID 或 ASSN_UID。
| NUM_FIELD_ID | 引用 MSP_CONVERSIONS 表中的有效 CONV_VALUE。
| NUM_VALUE | 自定义数字域的值。
MSP_PROJECTS | PROJ_EXT_EDITED | 必须设置为 1，以便 Project 处理。
| PROJ_EXT_EDITED_NUM | 必须设置为 1，以便 Project 处理。

页首

### 指定自定义日期、开始时间和完成时间域

若要指定自定义日期域，必须在以下数据库列中输入值：

表 | 列 | 备注
--- | --- | ---
MSP_DATE_FIELDS | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| DATE_CATEGORY | 指定自定义日期类别为“任务”(0)、“资源”(1) 还是“工作分配”(3)。
| DATE_REF_UID | 由 DATE_CATEGORY 判定，引用其各自表中的有效 TASK_UID、RES_UID 或 ASSN_UID。
| DATE_FIELD_ID | 引用 MSP_CONVERSIONS 表中的有效 CONV_VALUE。
| DATE_VALUE | 自定义日期域的值。
MSP_PROJECTS | PROJ_EXT_EDITED | 必须设置为 1，以便 Project 处理。
| PROJ_EXT_EDITED_DATE | 必须设置为 1，以便 Project 处理。

页首

### 指定自定义工期域

若要指定自定义工期域，必须在以下数据库列中输入值：

表 | 列 | 备注
--- | --- | ---
MSP_DURATION_FIELDS | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| DUR_CATEGORY | 指出自定义工期类别为“任务”(0)、“资源”(1) 还是“工作分配”(3)。
| DUR_REF_UID | 由 DUR_CATEGORY 判定，引用其各自表中的有效 TASK_UID、RES_UID 或 ASSN_UID。
| DUR_FIELD_ID | 引用 MSP_CONVERSIONS 表中的有效 CONV_VALUE。
| DUR_VALUE | 自定义日期域的值。
| DUR_FMT | 指定在 Project 中显示工期时所使用的单位。
MSP_PROJECTS | PROJ_EXT_EDITED | 必须设置为 1，以便 Project 处理。
| PROJ_EXT_EDITED_DUR | 必须设置为 1，以便 Project 处理。

页首

### 域属性

尽管 Project 的大多数域除实际数据外并无其他属性，但还是有一些域不仅包含数据值，而且包含与该域有关的项目级元数据，元数据会影响到列中的所有值。例如，WBS 域存储每个任务的实际 WBS 代码，但是还有一个可为每个项目定义的代码掩码。与此相似，Project 中的所有自定义域都可以具有特定的属性，如公式或用户定义的名称（别名），而且这种元数据对于整个列只存储一次，并与存储于各行中的实际数据分开存放。

元数据始终存储于数据库中的 MSP_FIELD_ATTRIBUTES 和 MSP_ATTRIBUTE_STRINGS 表中。MSP_FIELD_ATTRIBUTES 表中包含域的标识号、属性的数字值（可通过 MSP_CONVERSIONS 表将数字值还原为字符串），以及实际的属性值或指向该值的指针。对于数字和 Boolean 类型设置，取值将直接存储于 MSP_FIELD_ATTRIBUTES 表中，而字符串类型的取值将存储于 MSP_ATTRIBUTE_STRINGS 表中，并将字符串的索引存储于 MSP_FIELD_ATTRIBUTES 表中。

页首

### 指定自定义 WBS 代码

自定义 WBS 代码在两个表中定义。代码掩码存储于 MSP_ATTRIBUTE_STRINGS 表中。任务的实际 WBS 代码值存储于 MSP_TASKS 表中（TASK_WBS 和 TASK_WBS_RIGHTMOST_LEVEL 列中）。若要定义自定义 WBS 代码，您必须输入以下列的值：

表 | 列 | 备注
--- | --- | ---
MSP_ATTRIBUTE_STRINGS | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| AS_ID | 引用用于标识 WBS 字符串的 MSP_ATTRIBUTE_STRINGS 表中的行。
| AS_VALUE | 公式同 Project 的“公式”对话框中显示的一样。
MSP_PROJECTS | PROJ_EXT_EDITED | 必须设置为 1，以便 Project 处理。

若要创建需要产生 WBS 代码 A.b.01 的自定义 WBS 掩码，请复制、修改并执行下列插入语句：

    Insert into MSP_ATTRIBUTE_STRINGS (
                  PROJ_ID,
                  AS_ID,
                  AS_VALUE )
              values (
                  3,
                  1,
                  '1,1,.,2,1,.,0,0,.' )

在本示例中，AS_VALUE 列中的值指定了三级 WBS 代码：

WBS 代码说明 | WBS 代码 | WBS 代码的最大长度 | WBS 代码分隔符
--- | --- | --- | ---
1,1,. | 大写字母（有序） | 1 | .（句点）
2,1,. | 小写字母（有序） | 1 | .（句点）
0,0,. | 数字（有序） | 任意 | .（句点）

也可指定产生 WBS 代码 proj1-A.b.01 的 WBS 代码前缀，例如 proj1。若要指定 WBS 代码前缀掩码，请复制、修改并执行下列插入语句：

    Insert into MSP_ATTRIBUTE_STRINGS (
                  PROJ_ID,
                  AS_ID,
                  AS_VALUE )
              values (
                  3,
                  2,
                  'proj1-' )

为了在任务中使用上面指定的 WBS 前缀和代码，必须在 MSP_FIELD_ATTRIBUTES 表中添加两行。一行用作 WBS 前缀，另一行用作代码掩码。必须提供以下列的值：

表 | 列 | 备注
--- | --- | ---
MSP_FIELD_ATTRIBUTES | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| ATTRIB_FIELD_ID | 引用 MSP_CONVERSIONS 表 CONV_VALUE 列中的有效“域标识号”。
| ATTRIB_ID | 引用 MSP_CONVERSIONS 表 STRING_TYPE_ID 列中的有效“域属性”。
| ATTRIB_VALUE | 显示属性值；值 -1 表示该值存储于 MSP_ATTRIBUTE_STRINGS 表中。
| AS_ID | 如果 ATTRIB_VALUE 设置为 -1，将引用 MSP_ATTRIBUTE_STRINGS 表中的行。
| ATTRIB_EXT_EDITED | 必须设置为 1，以便 Project 处理。
MSP_PROJECTS | PROJ_EXT_EDITED | 必须设置为 1，以便 Project 处理。

若要创建这些行，请复制、修改并执行下列插入语句：

    Insert into MSP_FIELD_ATTRIBUTES (
                  PROJ_ID,
                  ATTRIB_FIELD_ID,
                  ATTRIB_ID,
                  ATTRIB_VALUE,
                  AS_ID,
                  ATTRIB_EXT_EDITED )
              values (
                  3,
                  188743696, -- TASK_WBS field ID
                  200, -- for 'Outline code and WBS mask'
                  -1, -- the value is specified in MSP_ATTRIBUTE_STRINGS
                  1, -- the ID of the WBS code definition
                  1 ) -- must set for Project to process

    Insert into MSP_FIELD_ATTRIBUTES (
                  PROJ_ID,
                  ATTRIB_FIELD_ID,
                  ATTRIB_ID,
                  ATTRIB_VALUE,
                  AS_ID,
                  ATTRIB_EXT_EDITED )
              values (
                  3,
                  188743696, -- TASK_WBS field ID
                  204, -- for 'WBS Prefix'
                  -1, -- indicates that the value is in MSP_ATTRIBUTE_STRINGS
                  2, -- the ID of the WBS code definition
                  1 ) -- must set for Project to process

插入这两行之后，可以为任务指定自定义 WBS 代码。为任务指定的 WBS 代码必须符合指定的掩码。若要为现有任务指定 WBS 代码，请复制、修改并执行以下更新语句：

    Update    MSP_TASKS
    Set       TASK_WBS = 'A.b.03',
              TASK_WBS_RIGHTMOST_LEVEL = '03'
    Where     PROJ_ID = 3
    And       TASK_UID = 11

创建或修改数据库中的项目时，可以指定在用 Project 创建的新任务中，Project 是否要求 WBS 代码具有唯一性，并自动生成 WBS 代码。为了指定 Project 是否要求任务中的新 WBS 代码具有唯一性，必须在 MSP_FIELD_ATTRIBUTES 表中插入行。若要创建该行，请复制、修改并执行下列插入语句：

    Insert into MSP_FIELD_ATTRIBUTES (
                  PROJ_ID,
                  ATTRIB_FIELD_ID,
                  ATTRIB_ID,
                  ATTRIB_VALUE,
                  ATTRIB_EXT_EDITED )
              values (
                  3,
                  188743696, -- TASK_WBS field ID
                  203, -- for 'Verify uniqueness of new WBS codes'
                  1, -- sets the flag to True
                  1 ) -- must set for Project to process

最后，若要指定 Project 是否为新任务生成 WBS 代码，请复制、修改并执行下列插入语句：

    Insert into MSP_FIELD_ATTRIBUTES (
                  PROJ_ID,
                  ATTRIB_FIELD_ID,
                  ATTRIB_ID,
                  ATTRIB_VALUE,
                  ATTRIB_EXT_EDITED )
              values (
                  3,
                  188743696, -- TASK_WBS field ID
                  205, -- for 'Generate WBS code for new tasks'
                  1, -- sets the flag to True
                  1 ) -- must set for Project to process

页首

### 指定自定义大纲代码

自定义大纲代码是描述、组织和汇集任务信息的强大而灵活的工具。直接在数据库中定义自定义大纲代码时一定要小心。自定义大纲代码在下列五个表中定义：

- MSP_ATTRIBUTE_STRINGS 包含大纲代码掩码和指定大纲代码域的别名（可选）。指定自定义大纲代码掩码的操作与指定自定义 WBS 代码掩码几乎相同。请参阅上面的指定自定义 WBS 代码部分，以获取有关创建自定义 WBS 掩码的信息。同样，参阅下面的为自定义域指定别名部分也可以获取有关为自定义大纲代码域创建别名的信息。
- MSP_FIELD_ATTRIBUTES 将大纲代码掩码与其大纲代码域（例如“大纲代码1”）相关联。该表包含来自 MSP_CONVERSIONS 表 CONV_VALUE 列中的“仅允许查阅表格中列出的大纲代码”和“仅允许带有所有级别的值的新大纲代码”标志的值。此外，还将大纲代码与其别名（如果有的话）相关联。将自定义大纲代码掩码与特定的自定义大纲代码关联的操作几乎与将自定义 WBS 掩码与任务 WBS 域关联相同。只是“域标识号”（可以在 MSP_CONVERSIONS 表中检索到）不同。请参阅上面的指定自定义 WBS 代码部分，以获取有关将代码掩码与自定义域相关联并设置自定义标志的信息。同样，参阅下面的为自定义域指定别名部分也可以获取有关将自定义大纲掩码与自定义大纲域相关联的信息。确保在创建或更改属性字符串值或代码掩码与自定义域之间的关联时，将列 ATTRIB_EXT_EDITED 设置为 1。
- MSP_OUTLINE_CODES 定义各级大纲代码值。每一行包含一个代码值和一个对其父代码的引用。
- MSP_CODE_FIELDS 将定义的代码与应用它们的任务和资源相关联。与自定义 WBS 代码不同的是，自定义大纲代码并不存储于 MSP_TASKS 表中。它们在表 MSP_OUTLINE_CODES 中定义，并与指定的任务和/或资源的某个自定义大纲代码域相关联。
- MSP_MV_FIELDS 将定义的多值大纲代码与应用它们的任务和资源相关联。

若要创建自定义大纲代码，必须至少输入以下列的值：

表 | 列 | 备注
--- | --- | ---
MSP_OUTLINE_CODES | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| CODE_UID | 引用自定义大纲代码，在项目中必须是唯一的。
| OC_PARENT | 引用 MSP_OUTLINE_CODES 表中的有效标识号；对于没有父代码的最高级代码应将其设置为 0。
| OC_FIELD_ID | 引用 MSP_CONVERSIONS 表 CONV_VALUE 列中的有效“域标识号”。
| OC_NAME | 显示自定义大纲代码的名称。
MSP_PROJECTS | PROJ_EXT_EDITED | 必须设置为 1，以便 Project 处理。

定义自定义大纲代码掩码之后，即可定义大纲代码本身。若要指定组成大纲代码 A.x 的两个级别的代码，请复制、修改并执行下列插入语句：

    Insert into MSP_OUTLINE_CODES (
                  PROJ_ID,
                  CODE_UID,
                  OC_PARENT,
                  OC_FIELD_ID,
                  OC_NAME )
              values (
                  3,
                  1,
                  0, -- highest level code, no parent
                  188744096, -- Task Outline Code1
                  'A' ) -- the level 1 code

    Insert into MSP_OUTLINE_CODES (
                  PROJ_ID,
                  CODE_UID,
                  OC_PARENT,
                  OC_FIELD_ID,
                  OC_NAME )
              values (
                  3,
                  2,
                  1, -- parent code UID = 1
                  188744096, -- Task Outline Code1
                  'x' ) -- the level 1 code

若要将代码与特定的自定义大纲代码域和特定的任务或资源相关联，必须输入以下列的值：

表 | 列 | 备注
--- | --- | ---
MSP_CODE_FIELDS | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| CODE_CATEGORY | 指定自定义大纲代码是任务 (0) 还是资源 (1)。
| CODE_REF_UID | 由 CODE_CATEGORY 判定，引用其各自表中的有效 TASK_UID 或 RES_UID。
| CODE_FIELD_ID | 引用 MSP_CONVERSIONS 表 CONV_VALUE 列中的有效“域标识号”。
| CODE_UID | 引用自定义大纲代码，在项目中必须是唯一的。

若要将自定义大纲代码与任务相关联，请复制、修改并执行下列插入语句：

    Insert into MSP_CODE_FIELDS (
                  PROJ_ID,
                  CODE_CATEGORY,
                  CODE_REF_UID,
                  CODE_FIELD_ID,
                  CODE_UID )
              values (
                  3, -- project ID
                  0, -- task category
                  2, -- task UID
                  188744096, -- Task Outline Code1
                  2 ) -- code UID for the code "x"

插入该行的结果：用于“任务 2”的自定义任务 OutlineCode1 的值为 A.x。

注释 从 MSP_OUTLINE_CODES 表中删除自定义大纲代码时，应同时删除所有子代码，以避免产生孤立代码。

页首

### 为自定义域指定别名

自定义域的别名存储于 MSP_ATTRIBUTE_STRINGS 和 MSP_FIELD_ATTRIBUTES 表中。与自定义 WBS 代码一样，别名也是在 MSP_ATTRIBUTE_STRINGS 表中指定的。必须提供以下域的值：

表 | 列 | 备注
--- | --- | ---
MSP_ATTRIBUTE_STRINGS | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| AS_ID | 标识属性字符串，其中包含自定义公式。
| AS_VALUE | 公式同 Project 的“公式”对话框中显示的一样。

将别名与 MSP_FIELD_ATTRIBUTES 表中的特定自定义域相关联。必须提供以下列的值：

表 | 列 | 备注
--- | --- | ---
MSP_FIELD_ATTRIBUTES | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| ATTRIB_FIELD_ID | 引用 MSP_CONVERSIONS 表 CONV_VALUE 列中的有效“域标识号”。
| ATTRIB_ID | 引用 MSP_CONVERSIONS 表 STRING_TYPE_ID 列中的有效“域属性”。
| ATTRIB_VALUE | 显示属性值；值 -1 表示该值存储于 MSP_ATTRIBUTE_STRINGS 表中。
| AS_ID | 如果 ATTRIB_VALUE 设置为 -1，将引用 MSP_ATTRIBUTE_STRINGS 表中的行。
| ATTRIB_EXT_EDITED | 必须设置为 1，以便 Project 处理。
MSP_PROJECTS | PROJ_EXT_EDITED | 必须设置为 1，以便 Project 处理。

若要为自定义域指定别名，请复制、修改并执行下列插入语句：

    Insert into MSP_ATTRIBUTE_STRINGS (
                  PROJ_ID,
                  AS_ID,
                  AS_VALUE )
              values (
                  3,
                  5,
                  'my text column' )

    Insert into MSP_FIELD_ATTRIBUTES (
                  PROJ_ID,
                  ATTRIB_FIELD_ID,
                  ATTRIB_ID,
                  ATTRIB_VALUE,
                  AS_ID,
                  ATTRIB_EXT_EDITED )
              values (
                  3,
                  188743731, -- refers to custom field 'Task Text1'
                  206, -- for 'Field Alias'
                  -1, -- indicates that the value is in MSP_ATTRIBUTE_STRINGS
                  5, -- the ID of the value in MSP_ATTRIBUTE_STRINGS
                  1 ) -- must set for Project to process

页首

### 为自定义域指定公式

与自定义 WBS 前缀和掩码一样，自定义公式也是在 MSP_FIELD_ATTRIBUTES 和 MSP_ATTRIBUTE_STRINGS 表中指定的。若要定义自定义公式，必须输入以下列的值：

表 | 列 | 备注
--- | --- | ---
MSP_ATTRIBUTE_STRINGS | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| AS_ID | 属性字符串的唯一标识号。
| AS_VALUE | 公式同 Project 的“公式”对话框中显示的一样。

例如，若要创建一个自定义公式，以执行计算 (2*[工期])/60，请复制、修改并执行下列插入语句：

    Insert into MSP_ATTRIBUTE_STRINGS (
                  PROJ_ID,
                  AS_ID,
                  AS_VALUE )
              values (
                  3,
                  5,
                  '(2*[Duration])/60' )

为了将自定义公式映射到自定义域，必须提供 MSP_FIELD_ATTRIBUTES 表中以下列的值：

表 | 列 | 备注
--- | --- | ---
MSP_FIELD_ATTRIBUTES | PROJ_ID | 引用 MSP_PROJECTS 表中的有效标识号。
| ATTRIB_FIELD_ID | 引用 MSP_CONVERSIONS 表 CONV_VALUE 列中的有效“域标识号”。
| ATTRIB_ID | 引用 MSP_CONVERSIONS 表 STRING_TYPE_ID 列中的有效“域属性”。
| AS_ID | 如果 ATTRIB_VALUE 设置为 -1，将引用 MSP_ATTRIBUTE_STRINGS 表中的行。
| ATTRIB_EXT_EDITED | 必须设置为 1，以便 Project 处理。
MSP_PROJECTS | PROJ_EXT_EDITED | 必须设置为 1，以便 Project 处理。

若要在自定义公式和“数字1”自定义域之间建立映射，请复制、修改并执行下列插入语句：

    Insert into MSP_FIELD_ATTRIBUTES (
                  PROJ_ID,
                  ATTRIB_FIELD_ID,
                  ATTRIB_ID,
                  AS_ID,
                  ATTRIB_EXT_EDITED )
              values (
                  3,
                  188743767, -- Number1 custom field
                  207, -- for 'Custom Field Formula'
                  5, -- the ID of the custom formula definition
                  1 ) -- must set for Project to process

若要在数据库中查询“数字3”自定义域现有的公式，请复制，编辑并执行下列选择语句：

    Select    PROJ_NAME,
              (select CONV_STRING
                 from MSP_CONVERSIONS
                where CONV_VALUE = fa.ATTRIB_FIELD_ID
                  and STRING_TYPE_ID = 105) as ATTRIB_FIELD -- field name
              (select CONV_STRING
                 from MSP_CONVERSIONS
                where CONV_VALUE = fa.ATTRIB_ID
                  and STRING_TYPE_ID = 106) as ATTRIB -- field attribute name
              AS_VALUE
    From      MSP_FIELD_ATTRIBUTES fa,
              MSP_ATTRIBUTE_STRINGS s,
              MSP_PROJECTS p
    Where     fa.AS_ID = s.AS_ID
    And       fa.PROJ_ID = s.PROJ_ID
    And       fa.PROJ_ID = p.PROJ_ID
    And       fa.ATTRIB_FIELD_ID = 188743769 -- field = Number3
    And       p.PROJ_ID = 3

若要删除公式，请更新 MSP_ATTRIBUTE_STRINGS 表，将定义该公式的行中的 AS_VALUE 值设为 Null。记住将 MSP_FIELD_ATTRIBUTES 表中相关行的 ATTRIB_EXT_EDITED 设置为 1，以便 Project 处理。在 Project 中保存项目之后，将删除该行。

页首

### 读写 RTF 备注

若要从 MSP_TASKS、MSP_RESOURCES 或 MSP_ASSIGNMENTS 表的 RTF 备注列中检索数据，请复制、修改并执行以下 VB 脚本：

    Sub getRtf()
        'This macro extracts RTF data from MSP_TASKS.TASK_RTF_NOTES.  This data can then be written
        'to a file that can be opened with Microsoft Word or displayed in a richedit control.

        Dim cn As New ADODB.Connection
        Dim rs As New ADODB.Recordset
        Dim sql As String, rtf As String, cnString

        'Open the MSP_TASKS table to look for TASK_RTF_NOTES
        cnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\temp\MyProject.mpd"
        sql = "select PROJ_ID, TASK_UID, TASK_RTF_NOTES " & _
              "from MSP_TASKS " & _
              "where TASK_RTF_NOTES is not null" 'can specify a specific PROJ_ID and TASK_UID instead
        cn.Open cnString
        rs.Open sql, cn

        'Enumerate across the recordset looking for notes
        With rs
            Do While Not .EOF
                rtf = StrConv(.Fields("TASK_RTF_NOTES"), vbUnicode) ' Put binary column data into text string
                Debug.Print rtf
                .MoveNext
            Loop
            .Close
        End With
    End Sub

注释 确保为所有对 MSP_TASKS、TASK_RTF_NOTES 和 TASK_UID 的引用检查上面所列的代码。根据从其中获取 RTF 数据的表的不同，需要将 TASKS 修改为 RES 或 ASSN。

若要向 MSP_TASKS、MSP_RESOURCES 或 MSP_ASSIGNMENTS 表的 RTF 备注列中写入数据，请复制、修改并执行以下 VB 脚本：

    Sub writeRtf()
        'This macro writes RTF data to MSP_TASKS.TASK_RTF_NOTES.

        Dim cn As New ADODB.Connection
        Dim cmd As New ADODB.Command
        Dim param As New ADODB.Parameter
        Dim sql As String, rtf As String, cnString As String

        cnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\temp\MyProject.mpd"
        sql = "update MSP_TASKS set TASK_RTF_NOTES = ? where PROJ_ID = 1 and TASK_UID = 1"
        rtf = "{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fcharset0 Arial;}}" & vbNewLine & _
              "\viewkind4\uc1\pard\f0\fs20 What's in a name? That which we call a rose...     \par" & vbNewLine & _
              "}" & vbNewLine & vbLf & Chr(0)   'be sure to specify valid RTF text here including "vbLf & Chr(0)

        cn.Open cnString

        param.Direction = adParamInput
        param.Type = adVarBinary
        param.Size = 8000
        param.Value = StrConv(rtf, vbFromUnicode)

        cmd.ActiveConnection = cn
        cmd.CommandText = sql
        cmd.Parameters.Append param
        cmd.Execute
    End Sub

注释 确保为所有对 MSP_TASKS、TASK_RTF_NOTES 和 TASK_UID 的所有引用检查上面所列出的代码。根据从其中获取 RTF 数据的表的不同，需要将 TASKS 修改为 RES 或 ASSN。

若要运行以上脚本，必须在用于编辑 VBA 的“Microsoft Visual Basic 编辑器”中引用了 Microsoft ActiveX 数据对象 (ADO) 2.1（或更高版本）库。请确保将 MSP_TASKS 表中的 TASK_HAS_NOTES 列，以及 MSP_PROJECTS 表中的 PROJ_EXT_EDITED 列设置为 1，以便 Project 处理。这也同样适用于更改 MSP_RESOURCES 和 MSP_ASSIGNMENTS 表中的 RTF 备注的情形。

页首

## 管理数据库中的其他数据

下面列出了存储于 MSP_TEXT_FIELDS 表中的其他任务和资源信息：

任务域 | 资源域
--- | ---
任务联系人 | 资源代码
跨项目链接（项目名称、任务标识号） | 电子邮件地址
备注（非 RTF 文本） | 备注（非 RTF 文本）
任务子项目文件 | 资源组
WBS 最大值 | 资源的 Windows 用户帐户
任务超链接 | 资源超链接
任务超链接地址 | 资源超链接地址
任务超链接子地址 | 资源超链接子地址

若要指定上面某个域的值，必须指定类别（任务或资源）、所指定类别的引用 UID、域类型（如“任务联系人”）和值。域类型的值存储于 MSP_CONVERSIONS 表中字符串类型为 105 的行中或存储于“域标识号”中。

为了使 Project 能够处理存储于 MSP_TEXT_FIELDS 表中的其他任务、资源和工作分配数据，必须将 MSP_PROJECTS 表中的 PROJ_EXT_EDITED 和 PROJ_EXT_EDITED_TEXT 列设置为 1。

注释 为了便于操作，Project 将文本从 TASK_RTF_NOTES、RES_RTF_NOTES 和 ASSN_RTF_NOTES 提取到 MSP_TEXT_FIELDS 中。这些备注文本只用于提供信息，而不能进行更新。

页首

### 指定电子邮件地址

若要指定资源的电子邮件地址，请复制、修改并执行下列插入语句：

    Insert into MSP_TEXT_FIELDS (
                  PROJ_ID,
                  TEXT_CATEGORY,
                  TEXT_REF_UID,
                  TEXT_FIELD_ID,
                  TEXT_VALUE )
              values (
                  3,
                  1, -- the category is 'Resource'
                  6, -- the UID of the resource
                  205520931, -- the 'Resource Email Address' field
                  'somebody@microsoft.com' ) -- resource's e-mail address

页首

### 检索跨项目链接项目/任务引用

跨项目链接允许一个项目中的任务依赖于另一个项目中的任务。跨项目链接将同时记录在两个相关任务所在的两个项目中。只能用 Project 创建、修改或删除跨项目链接。在数据库中创建、修改或删除跨项目链接会导致项目损坏。这包括常规任务和影子任务（其他项目中的前置任务或后续任务的复本）、链接和 MSP_TEXT_FIELDS 中的链接引用。

若要检索指定任务的跨项目链接项目/任务引用，请复制、修改并执行下列选择语句：

    Select    PROJ_NAME,
              TASK_NAME,
              CONV_STRING,
              TEXT_VALUE
    From      MSP_PROJECTS p,
              MSP_TASKS t,
              MSP_CONVERSIONS c,
              MSP_LINKS l,
              MSP_TEXT_FIELDS x
    where     p.PROJ_ID = 2    -- set the project ID
    and       t.TASK_UID = 1   -- set the task UID
    and       p.PROJ_ID = t.PROJ_ID
    and       p.PROJ_ID = l.PROJ_ID
    and       p.PROJ_ID = x.PROJ_ID
    and       l.LINK_UID = x.TEXT_REF_UID
    and       X.TEXT_CATEGORY = 4 -- Dependencies
    and       (
                 (    t.TASK_ID = l.LINK_PRED_UID
                  and c.CONV_VALUE = x.TEXT_FIELD_ID
                  and c.STRING_TYPE_ID = 105 -- Field ID
                 )
               or
                 (    t.TASK_ID = l.LINK_SUCC_UID
                  and c.CONV_VALUE = x.TEXT_FIELD_ID

                  and c.STRING_TYPE_ID = 105 -- Field ID
                 )
              )

页首

### 检索共享资源文件名称

为方便起见，在数据库中写入了资源库项目共享者文件的名称。该数据在数据库中是只读的，不能进行修改。若要获取存储于数据库中的资源库的共享者文件列表，请执行下列选择语句：

    Select   AS_VALUE
    From     MSP_ATTRIBUTE_STRINGS S inner join
             MSP_FIELD_ATTRIBUTES A on
             S.AS_ID = A.AS_ID
    Where    A.ATTRIB_ID = 208 -- conversion string 'Sharer File Names'
    Order by S.AS_POSITION

页首

### 用摘要任务和子任务构建大纲结构

大纲由摘要任务以及其下的子任务组成，分三步创建：

1 |  | 对于要在其下插入子任务的任务，递增该任务下所有任务的任务标识号。
2 |  | 插入子任务，并为其指定一个大于摘要任务的任务标识号的任务标识号。
3 |  | 将摘要任务标记为摘要。

例如，若要递增任务 12（该任务将成为摘要任务）后面所有任务的任务标识号，请复制、修改并执行下列更新语句：

    Update    MSP_TASKS
    Set       TASK_ID = TASK_ID + 1
    Where     TASK_ID > 12

在任务标识号列表中腾出空位之后，即可插入子任务（有关创建和插入新任务的内容，请参阅上面的新建任务部分）。插入子任务时，必须将其大纲级别设为摘要任务的大纲级别加 1。若要插入子任务 13，请复制，编辑并执行下列插入语句：

    Insert into MSP_TASKS (
                  PROJ_ID,
                  TASK_UID,
                  TASK_ID,
                  TASK_NAME,
                  TASK_OUTLINE_LEVEL,
                  EXT_EDIT_REF_DATA )
              values (
                  3,
                  24, -- new, unique task UID
                  13, -- the ID of the new task
                  'your subtask name', -- the name of the task
                  3, -- outline level of task 12 + 1
                  '1' ) -- set to 1 so Project will process

如果任务 12 以前不是摘要任务，现在则必须标记为摘要任务。若要将任务指定为摘要任务，请复制、编辑并执行下列更新语句：

    Update    MSP_TASKS
    Set       TASK_IS_SUMMARY = 1
    Where     TASK_UID = 12

为了使 Project 能够处理更改，请确保将 MSP_PROJECTS 中的 PROJ_EXT_EDITED 列更新为 1。

页首

### 编辑摘要任务工作分配的工时

如果资源分配给了摘要任务，而您希望编辑该工作分配的工时，那么必须指定 MSP_ASSIGNMENTS 表中 ASSN_UNITS 和 ASSN_WORK 列的值。若要将现有摘要任务工作分配的工时更改为两个工作日，单位是 50%，请复制、修改并执行下列更新语句：

    Update    MSP_ASSIGNMENTS
    Set       ASSN_WORK = 96000,
              ASSN_UNITS = .50
    Where     TASK_UID > 12

请确保在更新该行前，先备份任务数据。有关备份现有任务数据的详细信息，请参阅确保数据库中项目数据的完整性部分。

页首

### 检索工作组消息的状态

任务和资源工作组消息的状态域（“需要更新”、“已确认”、“正在等待回应”和“正在等待工作组状态信息”）没有直接保存在数据库中。如果希望获取发送给工作组的消息的状态信息，必须从工作分配域中提取这些信息。通过查看与特定任务或资源相关联的所有工作分配记录，可以确定此任务或资源的值。

例如，若要确定任务是否已确认，必须检查 MSP_ASSIGNMENTS 表中与此任务相关的所有工作分配的 ASSN_IS_CONFIRMED 列。如果每个工作分配的 ASSN_IS_CONFIRMED 列都为 1，那么此任务已确认。若要确定任务是否已确认，请复制、修改并执行下列选择语句：

    Select    count(*)
    From      MSP_ASSIGNMENTS
    Where     TASK_UID = 12
    And       ASSN_IS_CONFIRMED = 0

如果查询返回一个大于 0 的数字，表示该任务尚未确认。

若要确定是否有必要更新任务，您必须检查 MSP_ASSIGNMENTS 表中与此任务相关的所有工作分配的 ASSN_UPDATE_NEEDED 列。如果这些工作分配中一个或多个的 ASSN_UPDATED_NEEDED 列为 1，表示需要更新该任务。若要确定任务是否需要更新，请复制、修改并执行下列选择语句：

    Select    count(*)
    From      MSP_ASSIGNMENTS
    Where     TASK_UID = 12
    And       ASSN_UPDATE_NEEDED = 1

如果查询返回一个大于 0 的数字，表示有必要更新该任务。

页首

### 指定超链接

若要指定任务超链接地址，请复制、修改并执行下列插入语句：

    Insert into MSP_TEXT_FIELDS (
                  PROJ_ID,
                  TEXT_CATEGORY,
                  TEXT_REF_UID,
                  TEXT_FIELD_ID,
                  TEXT_VALUE )
              values (
                  3,
                  0, -- task category
                  13, -- the UID of the task
                  188743898, -- 'Task Hyperlink Address'
                  'http://myserver/default.htm' ) -- task hyperlink address

为了便于 Project 处理，必须将与更新项目相应的 MSP_PROJECTS 表中的 PROJ_EXT_EDITED 和 PROJ_EXT_EDITED_TEXT 列设置为 1。

注释 除了任务和资源之外，还可为工作分配指定超链接、超链接地址和超链接子地址。

页首

## 数据库处理顺序、规则和缩写

### 外部编辑数据的处理顺序

Project 的处理顺序控制着数据的应用顺序。例如，请看下面的标准处理顺序，“实际工时”值总是在“剩余工时”值之前处理，但这并不是说“实际工时”值总是覆盖“剩余工时”值。

下面的任务和工作分配域处理顺序列表只包含相互关联的域（当然，并不是每个列表中的所有域都与其他所有域相关联）。列表中的顺序决定了数据的处理顺序，这就像是按这种顺序在用户界面 (UI) 上键入这些数据一样。如果没有这种顺序，在外部更改多个域时可能会导致无法预测结果。另一方面，如果通过在外部更改所有相互关联的域的值消除了数据的不一致，那么是否有这种处理顺序就无关紧要了。

虽然在用户界面上可以按任何顺序将数据输入到任何可编辑域中，但由于处理顺序列表是固化在程序中的，所以在用户界面上可行的输入顺序有可能不能用于数据的读取。最好确定要在外部更改哪些数据，然后在界面上按照处理顺序列表来测试这些更改，以检查结果是否是所期望的。不要试图按照在用户界面上输入数据的顺序来导入数据。换言之，对于每一个有可能进行的外部更改，都可以在界面上测试其结果，但反过来，您能在界面上进行的更改并不都能用外部更改再现。

当 Project 重新打开标记为外部编辑的完整项目时，它首先将该项目恢复到编辑前的状态，然后按处理顺序应用外部编辑的结果。在执行导入操作时，Project 并没有原始值，所以它会先创建默认任务，然后再按处理顺序应用更新值。

注释

- 在对项目数据进行完全导入以创建新的项目时，将会应用标准处理顺序。在通过导入的方式来将项目数据合并或追加到现有项目中时，在各列中均不包含 Null（即零长度）值的情况下，Project 通常遵循标准处理顺序。在进行“导入-合并”或“导入-追加”时，如果与日程相关的列中存在 Null 值，可能会导致在处理导入数据时采用不同于标准处理顺序的其他顺序。建议在将合并和追加导入映射投入使用之前对它们进行测试，以确保它们能提供所期望的结果。如果它们没有提供所期望的结果，请尝试创建多个包含较少列的映射，然后按顺序执行。
- 在加载任何其他数据之前，会首先加载并应用项目选项（例如“工具”和“选项”设置）。因此，如果在外部修改了任何选项，在应用此项目所有加载的日程数据时，都将受到修改后的设置的影响。在创建新项目时，需要明确指定所有选项。
- 时间分段数据总是具有最高的优先级，它们将覆盖任何与之冲突的域更改。

页首

### 标准处理顺序

任务域的标准处理顺序如下所示：

- 实际工期
- 剩余工期
- 工期
- 资源调配延迟
- 开始时间
- 完成时间
- 限制类型
- 限制日期
- 实际开始时间
- 实际完成时间
- 停止
- 重新开始
- 完成百分比
- 实际工时
- 剩余工时
- 工时
- 工时完成百分比
- 固定成本
- 实际成本

工作分配域的标准处理顺序如下所示：

- 单位
- 工作分配延迟
- 资源调配延迟
- 开始时间
- 完成时间
- 实际开始时间
- 实际完成时间
- 实际加班工时
- 实际工时
- 剩余工时
- 正常工时
- 剩余加班工时
- 加班工时
- 工时

## 数据库对象命名规则

### 表命名规则

以下规则应用于表名称：

- 表名称全部大写。
- 所有的表名称均以“MSP_”前缀开头，以表明这是 Project 表。
- 用下划线分隔各个单词。

页首

### 列命名规则

以下规则应用于列名称：

- 列名称全部大写。
- 单词通常用下划线分隔。
- 列名通常使用所在表的唯一标识作为前缀：

表名称 | 列前缀
--- | ---
MSP_ASSIGNMENTS | ASSN_
MSP_ASSIGNMENT_BASELINES | AB_
MSP_ATTRIBUTE_STRINGS | AS_
MSP_AVAILABILITY | AVAIL_
MSP_CALENDARS | CAL_
MSP_CALENDAR_DATA | CD_
MSP_CODE_FIELDS | CODE_
MSP_CONVERSIONS | CONV_
MSP_DATE_FIELDS | DATE_
MSP_DURATION_FIELDS | DUR_
MSP_FIELD_ATTRIBUTES | ATTRIB_
MSP_FLAG_FIELDS | FLAG_
MSP_LINKS | LINK_
MSP_MV_FIELDS | MV_
MSP_NUMBER_FIELDS | NUM_
MSP_OUTLINE_CODES | OC_
MSP_PROJECTS | PROJ_
MSP_RESOURCE_BASELINES | RB_
MSP_RESOURCE_RATES | RR_
MSP_RESOURCES | RES_
MSP_STRING_TYPES | STRING_
MSP_TASK_BASELINES | TB_
MSP_TASKS | TASK_
MSP_TEXT_FIELDS | TEXT_
MSP_TIMEPHASED_DATA | TD_
MSP_VERS_VERSIONS | VERS_

页首

### MSP_PROJECTS 表的列识别符

MSP_PROJECTS 表包含项目选项和信息。存放这些信息的列的名称中包含一个识别符，该识别符用来指定该列中的数据应在何处设置。下面列出了这些识别符及其含义：

识别符 | 说明
--- | ---
OPT_ | 在“工具”菜单上的“选项”对话框中设置的选项
PROP_ | 在“文件”菜单上的“属性”对话框中设置的属性
INFO_ | 在“项目”菜单上的“项目信息”对话框中设置的项目信息
EXT_ | 用于标记外部编辑数据框的标记

### 列名称缩写

为了保持组成列名称的单词短小而一致，在命名列时使用了下列缩写：

缩写 | 单词
--- | ---
ACT | 实际
AVAIL | 可用
BASE | 比较基准
CAL | 日历
COMP | 完成
DEF | 默认
DUR | 工期
EST | 估计
EXT | 外部
FMT | 格式
LANG | 语言
MAX | 最大值
NUM | 数字
OVT | 加班
PCT | 百分比
PRED | 前置任务
PROJ | 项目
REF | 参考
REG | 常规
REM | 剩余
RES | 资源
SCHED | 日程
STD | 常用
SUCC | 后续任务
UID | 唯一标识号
VAR | 差异

页首

## 数据库表

### 仅供参考列

有些域包含的数据是 Project 在向数据库导出数据时写入的，而在将项目数据导入到 Project 中时不会读取这些数据。这些数据通常是由于 Project 中的计算或设置而产生的。如果直接在数据库中编辑这些数据，当将数据导入到 Project 中时，不会反映出这些更改。这些域在表说明中将被标记为 I。

页首

### 加粗列名称

表说明中的域名称以加粗形式指示列（域）在多个表中共用。

页首

### 列的数据类型

Project 数据库结构中使用了下列数据类型：

数据类型 | 说明
--- | ---
bit | 在支持 Boolean 类型的数据库中为布尔值，否则为整数值。
char(n) | 字符型；(n) 指定最多所允许的字符数。
datetime | 包括时间的日期。
decimal | 小数。
image | 大于 255 字节的二进制数据。
integer | 整数。
smallint | SQL Server 系统数据类型，包括 -2^31 (-2,147,483,647) 到 2^31-1 (2,147,483,647) 之间的所有数字。存储大小为 2 个字节。
tinyint | SQL Server 系统数据类型，包括 0 到 255 之间的所有数字。存储大小为 1 个字节。
text | 可用的最长文本域；在 SQL Server 中为 8000 字节，在 Microsoft Access 中为 64k。
varchar(n) | 如果没有特别指明，为变长字符文本；(n) 指定所允许最大字符数。

当 Project 需要存储时间值而无需存储日期值时，时间值将作为日期存储。从数据库中读取此项目时，将忽略这些域中的日期部分。

页首

## MSP_ASSIGNMENT_BASELINES

该表包含自定义工作分配比较基准数据。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| ASSN_UID | integer | 引用 MSP_ASSIGNMENTS 表中的有效标识号。
| AB_REF_ENT_PROJ_ID | integer | 如果工作分配比较基准数据为摘要工作分配的一部分，将引用 MSP_PROJECTS 表中的有效 PROJ_ID。
| AB_BASE_NUM | smallint | 自定义比较基准的编号，1-10。
| AB_BASE_START | datetime | 保存比较基准时，工作分配的计划开始日期。
| AB_BASE_FINISH | datetime | 工作分配的计划完成日期。
| AB_BASE_WORK | decimal | 资源在任务中要完成的原计划工时量。
| AB_BASE_COST | decimal | 资源在任务中要完成工时的计划总成本。
| AB_BASE_COST_PER_USE | decimal | 自定义比较基准的每次使用成本，1-10。

页首

## MSP_ASSIGNMENTS

该表包含工作分配数据。除了已分配资源的任务之外，Project 还将为尚未分配资源的任务（空工作分配）写入行。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| RESERVED_DATA | char(1) | 临时存储特定数据库行的唯一信息；不应修改此域的内容。
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| ASSN_ENTSUMPROJID | integer | 包含具有摘要工作分配的项目的标识号。
I | ASSN_ACT_FINISH | datetime | 工作分配实际完成的日期和时间。
I | ASSN_ACT_START | datetime | 工作分配实际开始的日期和时间。
I | ASSN_ACWP | decimal | 到项目的状态日期或当前日期为止，资源在一项任务中已完成工时的成本；也称作“已完成工时的实际成本”。
I | ASSN_BCWP | decimal | 到状态日期或当前日期为止，工作分配按时间分段的工时完成百分比乘以工作分配按时间分段的比较基准成本的累计值；也称作“盈余分析”。
I | ASSN_BCWS | decimal | 到状态日期或当前日期为止，按时间分段的比较基准累计成本。
| ASSN_RES_TYPE | bit | 资源类型：
0 | 材料；钢材、混凝土或土料等耗材供应
1 | 工时（默认值）；人员和设备
I | ASSN_IS_OVERALLOCATED | bit | 指示在特定任务中是否为资源分配了超负荷的工作量。
I | ASSN_WORK_CONTOUR | smallint | 表示某工作分配中如何在工期内分配工时：
0 | 常规分布（默认值）
1 | 前轻后重
2 | 前重后轻
3 | 双峰分布
4 | 先峰分布
5 | 后峰分布
6 | 钟型分布
7 | 中央加重钟型
8 | 分布
I | ASSN_START_VAR | integer | 工作分配的比较基准开始日期与其当前计划开始日期之间的差异。
I | ASSN_FINISH_VAR | integer | 工作分配的比较基准完成日期与其计划完成日期之间的差异。
I | ASSN_UPDATE_NEEDED | bit | 指定在更改开始日期、完成日期或对资源进行重新分配后，是否需要向接受任务的资源发送“工作组更新”消息。
| EXT_EDIT_REF_DATA | text | 设置该值指定一个新行或在更改数据库中的项目信息时备份现有数据。
| ASSN_UID | integer | 工作分配的唯一标识号。
| ASSN_HAS_LINKED_FIELDS | bit | 指示是否存在与此工作分配链接的 OLE。
| ASSN_IS_CONFIRMED | bit | 指示任务所分配的资源在响应“工作组分配”消息时，是接受还是拒绝了任务分配。
| ASSN_RESPONSE_PENDING | bit | 指示在向接受任务的资源发送“工作组分配”消息后，是否接收到答复。
| ASSN_HAS_NOTES | bit | 指示工作分配是否具有 RTF 备注。
| ASSN_TEAM_STATUS_PENDING | bit | 指示在向任务所分配的资源发送“工作组状态”消息后，是否接收到状态消息。
| TASK_UID | integer | 引用 MSP_TASKS 表中的有效标识号。
| RES_UID | integer | 引用 MSP_RESOURCES 表中的有效标识号。
| ASSN_START_DATE | datetime | 分配的资源计划开始执行任务的日期和时间。
| ASSN_FINISH_DATE | datetime | 所分配的资源计划完成任务工时的日期和时间。
| ASSN_DELAY | integer | 在任务开始日期后，资源开始进行一项工作分配前要等待的时间量。
| ASSN_DELAY_FMT | smallint | 指定延迟格式：
3 | 分钟
5 | 小时（默认值）
7 | 工作日
9 | 周
11 | 月
| ASSN_LEVELING_DELAY | integer | 作为资源调配的结果，工作分配比计划开始日期延迟的时间量。
| ASSN_COST_RATE_TABLE | smallint | 指定对工作分配中的资源使用哪个成本费率表：
0 | A（默认值）
1 | B
2 | C
3 | D
4 | E
| ASSN_BASE_START | datetime | 保存比较基准时，工作分配的计划开始日期。
| ASSN_BASE_FINISH | datetime | 工作分配的计划完成日期。
| ASSN_MATERIAL_RATE_FMT | smallint | 在 Project 中显示材料费率时所使用的单位。有关费率格式的信息，请参阅 MSP_STRING_TYPES 中的“成本费率数据单位”。
| ASSN_UNITS | decimal | 资源分配给任务的单位数，表示为 100% 的百分数（假设资源的 MaxUnits 值为 100%）。
| ASSN_WORK | decimal | 资源在任务中计划完成的总工时量。
| ASSN_ACT_WORK | decimal | 资源在任务中已完成的工时量。
| ASSN_REG_WORK | decimal | 计划由任务所分配的资源完成的非加班工时总量。
| ASSN_REM_WORK | decimal | 任务所分配的资源完成工作分配所需的时间量。
| ASSN_BASE_WORK | decimal | 资源在任务中要完成的原计划工时量。
I | ASSN_COST | decimal | 工作分配的总规划（或计划）成本，等于资源在任务中已完成工时的成本，加上工作分配剩余工时的计划成本。
I | ASSN_ACT_COST | decimal | 资源在任务中已完成工时的成本。
I | ASSN_REM_COST | decimal | 特定任务中的所有资源完成全部剩余计划工时所需的成本。
| ASSN_BASE_COST | decimal | 资源在任务中完成工时所需的计划总成本。
| ASSN_BASE_COST_PER_USE | decimal | 比较基准每次使用成本。
| ASSN_OVT_WORK | decimal | 资源在任务中要完成的加班工时量；按资源的加班费率支付薪酬。
| ASSN_ACT_OVT_WORK | decimal | 资源在所分配的任务中已完成的实际加班工时量。
| ASSN_REM_OVT_WORK | decimal | 工作分配的剩余加班工时量。
I | ASSN_ACT_OVT_COST | decimal | 资源在任务中已完成加班工时的成本。
I | ASSN_REM_OVT_COST | decimal | 工作分配的剩余计划加班费用。
| ASSN_RTF_NOTES | image | 包含工作分配的备注。
| ASSN_BOOKING_TYPE | smallint | 指定工作分配的预订类型：
0 | 已提交
2 | 已建议
| ASSN_ACT_WORK_PROT | decimal | 受保护的实际工时。
| ASSN_ACT_OVT_WORK_PROT | decimal | 受保护的实际加班工时。
| ASSN_CREATION_DATE | datetime | 工作分配创建的日期。

页首

## MSP_ASSN_ENTERPRISE

该表和 MSP_ASSIGNMENTS 表在功能和整体作用上相似，只是该表中的工作分配为项目摘要工作分配，并且引用“资源”全局项目；而 MSP_ASSIGNMENTS 表中包含的所有工作分配没有引用“资源”全局项目（例如，非摘要工作分配）。

注释 该表只是在将企业项目保存到 Project Server 数据库时才由 Project 使用。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| RESERVED_DATA | char(1) | 临时存储特定数据库行的唯一信息；不应修改此域的内容。
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| ASSN_ENTSUMPROJID | integer | 包含具有摘要工作分配的项目的标识号。
| ASSN_ACT_FINISH | datetime | 工作分配实际完成的日期和时间。
| ASSN_ACT_START | datetime | 工作分配实际开始的日期和时间。
I | ASSN_ACWP | decimal | 到项目的状态日期或当前日期为止，资源在一项任务中已完成工时的成本；也称作“已完成工时的实际成本”。
I | ASSN_BCWP | decimal | 到状态日期或当前日期为止，工作分配按时间分段的工时完成百分比乘以工作分配按时间分段的比较基准成本的累计值；也称作“盈余分析”。
I | ASSN_BCWS | decimal | 到状态日期或当前日期为止，按时间分段的比较基准累计成本。
| ASSN_RES_TYPE | bit | 资源类型：
0 | 材料；钢材、混凝土或土料等耗材供应
1 | 工时（默认值）；人员和设备
I | ASSN_IS_OVERALLOCATED | bit | 指示在特定任务中是否为资源分配了超负荷的工作量。
I | ASSN_WORK_CONTOUR | smallint | 表示某工作分配中如何在工期内分配工时：
0 | 常规分布（默认值）
1 | 前轻后重
2 | 前重后轻
3 | 双峰分布
4 | 先峰分布
5 | 后峰分布
6 | 钟型分布
7 | 中央加重钟型
8 | 分布
I | ASSN_START_VAR | integer | 工作分配的比较基准开始日期与其当前计划开始日期之间的差异。
I | ASSN_FINISH_VAR | integer | 工作分配的比较基准完成日期与其计划完成日期之间的差异。
I | ASSN_UPDATE_NEEDED | bit | 指定在更改开始日期、完成日期或对资源进行重新分配后，是否需要向接受任务的资源发送“工作组更新”消息。
| EXT_EDIT_REF_DATA | text | 设置该值指定一个新行或在更改数据库中的项目信息时备份现有数据。
| ASSN_UID | integer | 工作分配的唯一标识号。
| ASSN_HAS_LINKED_FIELDS | bit | 指示是否存在与此工作分配链接的 OLE。
| ASSN_IS_CONFIRMED | bit | 指示任务所分配的资源在响应“工作组分配”消息时，是接受还是拒绝了任务分配。
| ASSN_RESPONSE_PENDING | bit | 指示在向接受任务的资源发送“工作组分配”消息后，是否接收到答复。
| ASSN_HAS_NOTES | bit | 指示工作分配是否具有 RTF 备注。
| ASSN_TEAM_STATUS_PENDING | bit | 指示在向任务所分配的资源发送“工作组状态”消息后，是否接收到状态消息。
| TASK_UID | integer | 引用 MSP_TASKS 表中的有效标识号。
| RES_UID | integer | 引用 MSP_RESOURCES 表中的有效标识号。
| ASSN_START_DATE | datetime | 分配的资源计划开始执行任务的日期和时间。
| ASSN_FINISH_DATE | datetime | 所分配的资源计划完成任务工时的日期和时间。
| ASSN_DELAY | integer | 在任务开始日期后，资源开始进行一项工作分配前要等待的时间量。
| ASSN_DELAY_FMT | smallint | 指定延迟格式：
3 | 分钟
5 | 小时（默认值）
7 | 工作日
9 | 周
11 | 月
| ASSN_LEVELING_DELAY | integer | 作为资源调配的结果，工作分配比计划开始日期延迟的时间量。
| ASSN_COST_RATE_TABLE | smallint | 指定对工作分配中的资源使用哪个成本费率表：
0 | A（默认值）
1 | B
2 | C
3 | D
4 | E
| ASSN_BASE_START | datetime | 保存比较基准时，工作分配的计划开始日期。
| ASSN_BASE_FINISH | datetime | 工作分配的计划完成日期。
| ASSN_MATERIAL_RATE_FMT | smallint | 在 Project 中显示材料费率时所使用的单位。有关费率格式的信息，请参阅 MSP_STRING_TYPES 中的“成本费率数据单位”。
| ASSN_UNITS | decimal | 资源分配给任务的单位数，表示为 100% 的百分数（假设资源的 MaxUnits 值为 100%）。
| ASSN_WORK | decimal | 资源在任务中计划完成的总工时量。
| ASSN_ACT_WORK | decimal | 资源在任务中已完成的工时量。
| ASSN_REG_WORK | decimal | 计划由任务所分配的资源完成的非加班工时总量。
| ASSN_REM_WORK | decimal | 任务所分配的资源完成工作分配所需的时间量。
| ASSN_BASE_WORK | decimal | 资源在任务中要完成的原计划工时量。
I | ASSN_COST | decimal | 工作分配的总规划（或计划）成本，等于资源在任务中已完成工时的成本，加上工作分配剩余工时的计划成本。
I | ASSN_ACT_COST | decimal | 资源在任务中已完成工时的成本。
I | ASSN_REM_COST | decimal | 特定任务中的所有资源完成全部剩余计划工时所需的成本。
| ASSN_BASE_COST | decimal | 资源在任务中完成工时所需的计划总成本。
| ASSN_BASE_COST_PER_USE | decimal | 比较基准每次使用成本。
| ASSN_OVT_WORK | decimal | 资源在任务中要完成的加班工时量；按资源的加班费率支付薪酬。
| ASSN_ACT_OVT_WORK | decimal | 资源在所分配的任务中已完成的实际加班工时量。
| ASSN_REM_OVT_WORK | decimal | 工作分配的剩余加班工时量。
I | ASSN_ACT_OVT_COST | decimal | 资源在任务中已完成加班工时的成本。
I | ASSN_REM_OVT_COST | decimal | 工作分配的剩余计划加班费用。
| ASSN_RTF_NOTES | image | 包含工作分配的备注。
| ASSN_BOOKING_TYPE | smallint | 指定工作分配的预订类型：
0 | 已提交
2 | 已建议
| ASSN_ACT_WORK_PROT | decimal | 受保护的实际工时。
| ASSN_ACT_OVT_WORK_PROT | decimal | 受保护的实际加班工时。
| ASSN_CREATION_DATE | datetime | 工作分配 UID 创建的日期。
| ASSN_PROJ_VERSION_ID | integer | 将摘要记录工作分配行映射回该摘要记录工作分配所属项目的版本 ID。
| ASSN_DEFAULT_VERSION_PROJ_ID | integer | 将摘要记录工作分配行映射回该项目默认版本的项目 ID。如果默认项目版本存在问题，该行将为摘要记录工作分配所引用项目的项目 ID。

页首

## MSP_ATTRIBUTE_STRINGS

该表存储在 MSP_FIELD_ATTRIBUTES 中所定义的自定义 WBS 代码定义、别名和公式。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| RESERVED_DATA | char(1) | 临时存储特定数据库行的唯一信息；不应修改此域的内容。
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| AS_ID | integer | 属性字符串的唯一标识号。
| AS_POSITION | integer | 指定资源库共享者在共享者项目列表中的位置。
| AS_VALUE | varchar(255) | 公式同 Project 的“公式”对话框中显示的一样。

页首

## MSP_AVAILABILITY

该表包含关于资源可用性的数据，并跟踪项目中任何特定资源的时间和可用性。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| RESERVED_DATA | char(1) | 临时存储特定数据库行的唯一信息；不应修改此域的内容。
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| AVAIL_UID | integer | 资源可用性的唯一标识号。
| RES_UID | integer | 引用 MSP_RESOURCES 表中的有效标识号。
| AVAIL_FROM | datetime | 资源可以按照当前时间段指定的单位进行工作的开始日期。
| AVAIL_TO | datetime | 资源可按照为当前时间段指定的单位进行工作的结束日期。
| AVAIL_UNITS | decimal | 资源分配给任务的单位数，表示为 100% 的百分数（假设资源的 MaxUnits 值为 100%）。

页首

## MSP_CALENDAR_DATA

该表包含日历的工作日、非工作日和例外日期数据。

注释 在该表中创建或编辑工作日记录时应注意不要将倒班时间重叠。如果倒班时间发生了重叠，整个工作日将被标记为非工作日。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| RESERVED_DATA | char(1) | 临时存储特定数据库行的唯一信息；不应修改此域的内容。
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| CD_UID | integer | 日历的工作日、非工作日和例外日期数据的唯一标识号。
| CAL_UID | integer | 引用 MSP_CALENDARS 表中的有效标识号。
| CD_DAY_OR_EXCEPTION | smallint | 指示日历是否有定义的工作日，或者日历是否为例外日期：
0 | 例外日期
1 | 星期天
2 | 星期一
3 | 星期二
4 | 星期三
5 | 星期四
6 | 星期五
7 | 星期六
| CD_WORKING | smallint | 指示所选日期是工作日还是非工作日。
| CD_FROM_DATE | datetime | 例外日期的开始日期。
| CD_TO_DATE | datetime | 例外日期的结束日期。
| CD_FROM_TIME1 - 5 | datetime | 工作日的开始日期和时间（最多支持每天 5 个时间段）；如果 CD_DAY_OR_EXCEPTION 设置为 0（例外日期），将不使用该列。
| CD_TO_TIME1 - 5 | datetime | 工作日的结束日期和时间（最多支持每天 5 个时间段）；如果 CD_DAY_OR_EXCEPTION 设置为 0（例外日期），将不使用该列。

页首

## MSP_CALENDARS

该表存储基本日历数据。日历用于定义标准工作时间和非工作时间。项目必须具有一个基准日历。任务和资源可以有其自己的非基准日历，但任何非基准日历必须基于基准日历。Project 将使用唯一标识号 1、2、-65536、-65535、-65534 和 -65533 将 6 个行写入该表中。这些行仅供 Project 内部使用，且不能进行编辑或删除。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| RESERVED_DATA | char(1) | 临时存储特定数据库行的唯一信息；不应修改此域的内容。
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| CAL_UID | integer | 日历的唯一标识号。
| CAL_BASE_UID | integer | 日历引用其父基准日历；对所有资源日历都是必需的。如果该日历为基准日历，其值为 -1。
| RES_UID | integer | 引用 MSP_RESOURCES 表中的有效标识号。
| CAL_IS_BASE_CAL | bit | 指示此日历是否为基准日历；资源日历不能为基准日历。
| CAL_NAME | varchar(255) | 日历名称；如果该日历为资源日历，名称将为空，如果日历为基准日历，需要输入名称。
| CAL_ENTUID | integer | 日历的企业级标识号。

页首

## MSP_CODE_FIELDS

该表将自定义大纲代码域链接到 MSP_TASKS 和 MSP_RESOURCES 表的相应行中。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| CODE_CATEGORY | integer | 指定自定义大纲代码是任务还是资源。
| CODE_REF_UID | integer | 由 CODE_CATEGORY 判定，引用其各自表中的有效 TASK_UID 或 RES_UID。
| CODE_FIELD_ID | integer | 引用 MSP_CONVERSIONS 表的 CONV_VALUE 列中的有效“域标识号”。
| CODE_UID | integer | 引用 MSP_OUTLINE_CODES 表中的有效标识号。

页首

## MSP_CONVERSIONS

该表包含所有 Project 字符串，并将 Project 数据库链接到 Project OLE DB 提供程序中可用的 Task、Resource 和 Assignment 表。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
I | STRING_TYPE_ID | integer | 引用 MSP_STRING_TYPES 表中的有效 STRING_TYPE_ID。
I | CONV_VALUE | integer | OLE 数据库域中所显示的值；取决于 STRING_TYPE_ID 中选择的值：
=3 | 0 = FF（完成-完成） 1 = FS（完成-开始） 2 = SF（开始-完成） 3 = SS（开始-开始）
=14 | 0 = 常规分布 1 = 前轻后重 2 = 前重后轻 3 = 双峰分布 4 = 先峰分布 5 = 后峰分布 6 = 钟型分布 7 = 中央加重钟型 8 = 分布
=29 | 0 = 固定单位 1 = 固定工期 2 = 固定工时
=56 | 0 = 例外日期 1 = 星期日 2 = 星期一 3 = 星期二 4 = 星期三 5 = 星期四 6 = 星期五 7 = 星期六
=57 | 3 = 分钟工时 4 = 分钟 5 = 工时 6 = 小时 7 = 工作日 8 = 天 9 = 周工时 10 = 周 11 = 月工时 12 = 月 19 = 百分比工时 20 = 百分比 21 = ' ' 35 = 分钟工时? 36 = 分钟? 37 = 工时? 38 = 小时? 39 = 工作日? 40 = 天? 41 = 周工时? 42 = 周? 43 = 月工时? 44 = 月? 51 = 百分比工时? 52 = 百分比? 53 = ' '
=68 | 0 = 越早越好 1 = 越晚越好 2 = 必须开始于 3 = 必须完成于 4 = 不得早于...开始 5 = 不得晚于...开始 6 = 不得早于...完成 7 = 不得晚于...完成
=70 | 1 = 开始 2 = 结束
=78 | 1 = 分钟工时 2 = 工时 3 = 工作日 4 = 周工时 5 = 月工时 7 = 年工时
=81 | 0 = 默认 1 = 无 2 = 仅电子邮件 3 = Project Server
=83 | 1 = 日 2 = 一 3 = 二 4 = 三 5 = 四 6 = 五 7 = 六
=84 | 1 =（日） 2 =（一） 3 =（二） 4 =（三） 5 =（四） 6 =（五） 7 =（六）
=85 | 1 = 星期日 2 = 星期一 3 = 星期二 4 = 星期三 5 = 星期四 6 = 星期五 7 = 星期六
=100 | 0 = 任务 1 = 资源 2 = 日历 3 = 工作分配 4 = 相关性
=101 | 0 = 从项目完成之日起排定日程 1 = 从项目开始之日起排定日程
=102 | 0 = 非工作日 1 = 工作日 2 = 默认
=103 | 0 = 前 1 = 后 2 = 前加空格 3 = 后加空格
=104 | 0 = 默认 1 = 无 2 = 仅电子邮件 3 = Project Server
=105 | 变量。与“工作分配”、“资源”和“任务”有关。
=106 | 1 = 大纲代码和 WBS 掩码 2 = 只允许使用查阅表格中列出的大纲代码 3 = 新代码必须在掩码的各个级别上都有值 4 = 检查新 WBS 代码的唯一性 5 = WBS 前缀 6 = 为新任务生成 WBS 代码 7 = 域别名 8 = 自定义域公式 9 = 共享资源文件名称
=107 | 200 = 工作分配剩余工时 201 = 工作分配实际工时 202 = 工作分配实际加班工时 203 = 工作分配比较基准工时 204 = 工作分配比较基准成本 205 = 工作分配实际成本 206 = 资源比较基准工时 207 = 资源比较基准成本 208 = 任务比较基准工时 209 = 任务比较基准成本 210 = 任务完成百分比
=108 | 0 = 分钟工时 1 = 工时 2 = 工作日 3 = 周工时 5 = 月工时 8 = 年工时
I | CONV_LANG_ID | integer | 转换文本显示语言的标识号，例如：2052 = 简体中文，数据库的默认语言。
I | CONV_STRING | varchar(200) | 域的文本值。例如，如果 STRING_TYPE_ID = 68、CONV_VALUE = 0，并且 CONV_LANG_ID = 2052，该域的内容应该为“越早越好”。

页首

## MSP_DATE_FIELDS

该表包含自定义日期数据。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| DATE_CATEGORY | integer | 指定自定义日期类别是“任务”、“资源”还是“工作分配”：
0 | 任务
1 | 资源
3 | 工作分配
| DATE_REF_UID | integer | 由 DATE_CATEGORY 判定，引用其各自表中的有效 TASK_UID、RES_UID 或 ASSN_UID。
| DATE_FIELD_ID | integer | 引用 MSP_CONVERSIONS 表的 CONV_VALUE 列中的有效“域标识号”。
| DATE_VALUE | datetime | 自定义日期域的值。

页首

## MSP_DURATION_FIELDS

该表包含自定义工期数据。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| DUR_CATEGORY | integer | 指定自定义工期类别是“任务”、“资源”还是“工作分配”：
0 | 任务
1 | 资源
3 | 工作分配
| DUR_REF_UID | integer | 由 DUR_CATEGORY 判定，引用其各自表中的有效 TASK_UID、RES_UID 或 ASSN_UID。
| DUR_FIELD_ID | integer | 引用 MSP_CONVERSIONS 表的 CONV_VALUE 列中的有效“域标识号”。
| DUR_VALUE | integer | 自定义工期域的值。
| DUR_FMT | smallint | 指定在 Project 中显示工期时所使用的单位：
3 | 分钟
5 | 小时（默认值）
7 | 天
9 | 周
11 | 月

页首

## MSP_FIELD_ATTRIBUTES

该表包含与域属性（如自定义 WBS、自定义域名称别名和自定义域公式等）有关的数据。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| RESERVED_DATA | char | 临时存储特定数据库行的唯一信息；不应修改此域的内容。
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| ATTRIB_FIELD_ID | integer | 引用公式影响的列；有关“域标识号”的信息，请参阅 MSP_STRING_TYPES 和 MSP_CONVERSIONS。
| ATTRIB_ID | integer | 引用域属性的类型；有关“域属性”的信息，请参阅 MSP_STRING_TYPES 和 MSP_CONVERSIONS。
| ATTRIB_VALUE | integer | 属性值；值 -1 表示该值存储在 MSP_ATTRIBUTE_STRINGS 表中。
| AS_ID | integer | 引用 MSP_ATTRIBUTE_STRINGS 表中的有效标识号；如果 ATTRIB_VALUE 设置为 -1（指定该值为属性值）以外的其他值，将忽略该标识号。
| ATTRIB_EXT_EDITED | bit | 指示记录是否经过外部编辑。

页首

## MSP_FLAG_FIELDS

该表包含有关自定义标志的信息。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| FLAG_CATEGORY | integer | 指定自定义标志类别是“任务”、“资源”还是“工作分配”：
0 | 任务
1 | 资源
3 | 工作分配
| FLAG_REF_UID | integer | 由 FLAG_CATEGORY 判定，引用其各自表中的有效 TASK_UID、RES_UID 或 ASSN_UID。
| FLAG_FIELD_ID | integer | 引用 MSP_CONVERSIONS 表的 CONV_VALUE 列中的有效“域标识号”。
| FLAG_VALUE | bit | 自定义标志域的值。

页首

## MSP_LINKS

该表存储跨项目链接，该链接允许项目链接到企业中的任何其他项目。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| RESERVED_DATA | char | 临时存储特定数据库行的唯一信息；不应修改此域的内容。
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| EXT_EDIT_REF_DATA | text | 设置该值指定一个新行或在更改数据库中的项目信息时备份现有数据。
| LINK_UID | integer | 链接的唯一标识号。
I | LINK_IS_CROSS_PROJ | bit | 指定链接是否为跨项目链接（存储于 MSP_TASKS 表中）。
| LINK_PRED_UID | integer | 前置任务的唯一标识号；在项目中必须唯一，并且必须引用 MSP_TASKS 表中相同 PROJ_ID 的有效行。
| LINK_SUCC_UID | integer | 后续任务的唯一标识号；在项目中必须唯一，并且必须引用 MSP_TASKS 表中相同 PROJ_ID 的有效行。
| LINK_TYPE | smallint | 指定链接类型：
0 | FF（完成-完成）
1 | FS（完成-开始）
2 | SF（开始-完成）
3 | SS（开始-开始）
| LINK_LAG_FMT | smallint | 指示 LINK_LAG 中所指定的延隔时间量的格式。
3 | 分钟工时
4 | 分钟
5 | 工时
6 | 小时
7 | 工作日（默认值）
8 | 天
9 | 周工时
10 | 周
11 | 月工时
12 | 月
19 | 百分比工时
20 | 百分比
35 | 分钟工时?
36 | 分钟?
37 | 工时?
38 | 小时?
39 | 工作日?
40 | 天?
41 | 周工时?
42 | 周?
43 | 月工时?
44 | 月?
51 | 百分比工时?
52 | 百分比?
| LINK_LAG | integer | 指定延隔时间量，按工期值（分钟 * 10）来指定。

页首

## MSP_MV_FIELDS

该表包含资源多值代码信息。

注释 该表只是在将企业项目保存到 Project Server 数据库时才由 Project 使用。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| RESERVED_DATA | char(1) | 临时存储特定数据库行的唯一信息；不应修改此域的内容。
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| CODE_MV_UID | integer | 多值自定义代码的唯一 ID。
| CODE_CATEGORY | integer | 指定自定义多值大纲代码类别为“资源”：
1 | 资源
| CODE_REF_UID | integer | 由 NUM_CATEGORY 判定，引用其各自表中的有效 TASK_UID、RES_UID 或 ASSN_UID。
| CODE_FIELD_ID | integer | 引用 MSP_CONVERSIONS 表的 CONV_VALUE 列中的有效“域标识号”。
| CODE_UID | integer | 引用 MSP_CODE_FIELDS 表中的有效标识号。

页首

## MSP_NUMBER_FIELDS

该表包含自定义数字数据。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| NUM_CATEGORY | integer | 指定自定义数字类别是“任务”、“资源”还是“工作分配”：
0 | 任务
1 | 资源
3 | 工作分配
| NUM_REF_UID | integer | 由 NUM_CATEGORY 判定，引用其各自表中的有效 TASK_UID、RES_UID 或 ASSN_UID。
| NUM_FIELD_ID | integer | 引用 MSP_CONVERSIONS 表的 CONV_VALUE 列中的有效“域标识号”。
| NUM_VALUE | decimal | 自定义数字域的值。

页首

## MSP_OUTLINE_CODES

该表包含与项目相关联的自定义大纲代码定义的有关数据。每个自定义大纲代码在项目中必须唯一，但在使用企业代码的情况下，也可以在几个项目间共用。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| RESERVED_DATA | char | 临时存储特定数据库行的唯一信息；不应修改此域的内容。
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| CODE_UID | integer | 自定义大纲代码的唯一标识号。
| OC_PARENT | integer | 引用 MSP_OUTLINE_CODES 表中的有效标识号；对于没有父代码的最高级代码应将其设置为 0。
| OC_FIELD_ID | integer | 任务或资源自定义大纲代码的标识号，企业必需。
| OC_NAME | text | 自定义大纲代码的名称。
| OC_DESCRIPTION | text | 包含对所定义代码的说明。
| OC_CACHED_FULL_NAME | text | 完整大纲代码值，包括以上所有级别；签入企业全局设置时在发布过程中生成该值。
| OC_CACHED_IS_VALID | bit | 指定大纲代码是否有效；只有有效的大纲代码才可用于 Project 和 Project Web Access 用户。

页首

## MSP_PROJ_SECURITY

该表加强 MSP_PROJECTS 表中的安全性，并由“项目数据服务 (PDS)”进行维护，“项目数据服务 (PDS)”加强该表上的只读和读/写权限。只有从 Project 客户端上进行读取或写入操作时，该表才具有数据，因此该表通常显示为空。

注释 无法通过 Project 直接访问该表，且不能进行修改。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| SEC_SPID | varchar(255) | SQL 进程标识号 (SPID)。
| SEC_SPIDDATESTAMP | datetime | 此安全行中使用的活动 SPID 的创建日期。
| SEC_READCOUNT | integer | 表示当前特定用户对此特定项目进行授权读取访问的数目：
0 | 无用户（默认）
1 | 一个用户；PDS 加强在特定时间对某个项目的单个 READWRITE 访问
| SEC_WRITECOUNT | integer | 表示当前特定用户对此特定项目进行授权写入访问的数目：该值不得大于 1。

页首

## MSP_PROJECTS

该表存储项目的有关信息，包括项目级别设置。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| PROJ_ID | integer | 项目的唯一标识号。
| PROJ_NAME | varchar(255) | 项目名称（显示于项目窗口标题栏中），并且在该表中必须唯一；以及数据源名称，不能超过 255 个字符。 注释 企业版本不包括数据源名称；PROJ_PROJECT.PROJ_VERSION 确保该名称的唯一性
| PROJ_PROP_AUTHOR | varchar(255) | 项目作者的名字；用于将类似的项目组合在一起。
| PROJ_OPT_CALC_ACT_COSTS | bit | 指定 Project 是否应自动计算实际成本。
| PROJ_PROP_CATEGORY | varchar(255) | 项目所属类别；用于将类似的项目组合在一起。
| PROJ_PROP_COMPANY | varchar(255) | 创建该项目的公司名称；用于将类似的项目组合在一起。
| PROJ_OPT_CRITICAL_SLACK_LIMIT | integer | Project 将任务标记为关键任务之前，该任务可以超过结束日期的天数。
| PROJ_OPT_CURRENCY_DIGITS | smallint | 在 Project 中显示货币值时，显示的小数位数：
0 | 没有小数位；￥0
1 | 小数点后有一位数；￥0.0
2 | 小数点后有两位数（默认）；￥0.00
| PROJ_OPT_CURRENCY_POSITION | smallint | 指定与货币值相关的货币符号的位置：
0 | 在前，无空格（默认）；￥0
1 | 在后，无空格；0￥
2 | 在前，加空格；￥ 0
3 | 在后，加空格；0 ￥
| PROJ_OPT_CURRENCY_SYMBOL | varchar(20) | 用于表示项目中所用货币类型的货币符号。
| PROJ_OPT_NEW_ARE_EFFORT_DRIVEN | bit | 指定新任务是否为投入比导向任务。
I | PROJ_INFO_CURRENT_DATE | datetime | 项目的当前日期。
| PROJ_OPT_DEF_FINISH_TIME | datetime | 所有新任务的默认完成时间。
| PROJ_OPT_DEF_FIX_COST_ACCRUAL | smallint | 指定是否累算固定成本。
| PROJ_OPT_MINUTES_PER_DAY | integer | 默认每天分钟数。
| PROJ_OPT_MINUTES_PER_WEEK | integer | 默认每周分钟数。
| PROJ_OPT_DEF_OVT_RATE | decimal | 新资源的默认加班费率；请参阅 MSP_RESOURCES.RES_DEF_OVT_RATE。
| PROJ_OPT_DEF_STD_RATE | decimal | 新资源的默认费率；请参阅 MSP_RESOURCES.RES_DEF_STD_RATE。
| PROJ_OPT_DEF_START_TIME | datetime | 所有新任务的默认开始时间。
| PROJ_OPT_DEF_TASK_TYPE | smallint | 项目中所有任务的默认类型：
0 | 固定单位（默认）；无论任务的工时量或工期如何变化，“工作分配单位”的数量都保持不变
1 | 固定工期：无论分配的资源数量（工作分配单位）或工时量如何变化，任务工期都保持不变
2 | 固定工时：无论工期或接受任务的资源数量（工作分配单位）如何变化，工时量都保持不变
| PROJ_OPT_DUR_ENTRY_FMT | smallint | 项目中所有工期的默认格式：
3 | 分钟
5 | 小时（默认值）
7 | 天
9 | 周
11 | 月
| PROJ_INFO_FINISH_DATE | datetime | 项目的计划完成日期和时间。
| PROJ_OPT_HONOR_CONSTRAINTS | bit | 指定 Project 是否根据任务的限制日期来排定任务。
| PROJ_PROP_KEYWORDS | varchar(255) | 列出与项目相关联的关键字；用于将类似的项目组合在一起。
| PROJ_LAST_SAVED | datetime | 项目最后一次保存的日期。
| PROJ_PROP_MANAGER | varchar(255) | 项目经理；用于将类似的项目组合在一起。
| PROJ_OPT_MULT_CRITICAL_PATHS | bit | 指定 Project 是否为项目中的每个独立网络任务计算并显示关键路径。
| PROJ_CREATION_DATE | datetime | 任务的创建日期。
I | PROJ_POOL_ATTACHED_TO | varchar(255) | 与该项目文件共享资源的项目文件名称；如果 PROJ_IS_RES_POOL 设置为 1，该名称为必需。
| PROJ_INFO_CAL_NAME | varchar(255) | 与项目相关联的日历的名称。
I | PROJ_IS_RES_POOL | bit | 指定项目是否为其自己的资源库，或指定是否与其他项目共享项目中的资源；请参阅 PROJ_POOL_ATTACHED_TO。
| PROJ_INFO_SCHED_FROM | smallint | 指定是从“项目开始日期”（默认）还是从“项目完成日期”排定项目。
| PROJ_OPT_SPLIT_IN_PROGRESS | bit | 指定是否可以拆分正在进行的任务。
| PROJ_OPT_SPREAD_ACT_COSTS | bit | 指定实际成本是否一直分布到状态日期。
| PROJ_OPT_SPREAD_PCT_COMP | bit | 指定完成百分比是否一直分布到状态日期。
| PROJ_INFO_START_DATE | datetime | 项目的计划开始日期和时间。
| PROJ_INFO_STATUS_DATE | datetime | 项目的状态日期。
| PROJ_PROP_SUBJECT | varchar(255) | 项目的主题；用于将类似的项目组合在一起。
| PROJ_PROP_TITLE | varchar(255) | 项目的标题；用于将类似的项目组合在一起。
| PROJ_OPT_TASK_UPDATES_RES | bit | 指定 Project 是否按您在日程中输入的任务完成百分比信息来自动计算实际和剩余工时及成本。
| PROJ_OPT_WORK_ENTRY_FMT | smallint | 项目中所有工期的默认格式：
3 | 分钟
5 | 小时（默认值）
7 | 天
9 | 周
11 | 月
| PROJ_OPT_CALC_SUB_AS_SUMMARY | bit | 指定 Project 是否按摘要任务来计算子任务。
| PROJ_OPT_WEEK_START_DAY | smallint | 工作周在星期几开始：
0 | 星期日（默认）
1 | 星期一
2 | 星期二
3 | 星期三
4 | 星期四
5 | 星期五
6 | 星期六
| PROJ_OPT_FY_START_MONTH | smallint | 财政年度开始的月份：
1 | 1 月（默认）
2 | 2 月
3 | 3 月
4 | 4 月
5 | 5 月
6 | 6 月
7 | 7 月
8 | 8 月
9 | 9 月
10 | 10 月
11 | 11 月
12 | 12 月
| PROJ_OPT_FY_USE_START_YEAR | bit | 指定是否使用财政年度开始年度编号。
| PROJ_OPT_DAYS_PER_MONTH | smallint | 每月工作日的默认数值。
| PROJ_OPT_NEW_TASK_EST | bit | 指定新任务是否有预计工期。
| PROJ_OPT_SHOW_EST_DUR | bit | 指定 Project 是否在带有估计工期的任务后显示 ？。
I | PROJ_OPT_EXPAND_TIMEPHASED | bit | 指定 Project 在保存到数据库时是否以可读或二进制格式保存时间分段数据；请参阅 MSP_TIMEPHASED_DATA。
| PROJ_EXT_EDITED_DATE | bit | 指定自定义日期域是否经过外部编辑。
| PROJ_EXT_EDITED_DUR | bit | 指定自定义工期域是否经过外部编辑。
| PROJ_EXT_EDITED_NUM | bit | 指定自定义数字域是否经过外部编辑。
| PROJ_EXT_EDITED_FLAG | bit | 指定自定义标志域是否经过外部编辑。
| PROJ_EXT_EDITED_CODE | bit | 指定自定义大纲代码域是否经过外部编辑。
| PROJ_EXT_EDITED_TEXT | bit | 指定自定义文本域是否经过外部编辑。
| PROJ_EXT_EDITED | bit | 指定项目是否经过外部编辑。
I | PROJ_DATA_SOURCE | varchar(128) | 项目的数据源名称；Project 用它来检查并发使用情况。
I | PROJ_READ_ONLY | varchar(10) | 指定项目是否为只读。
I | PROJ_READ_WRITE | varchar(4) | 指定项目是否是为写入而打开。
I | PROJ_READ_COUNT | varchar(10) | 指定以只读方式打开一个或多个表的用户的数目。
I | PROJ_LOCKED | varchar(4) | 指定用户是否可以向表中写入数据。
| PROJ_MACHINE_ID | varchar(100) | 打开项目的用户所使用计算机的标识号。
I | RESERVED_BINARY_DATA | Image | 保留，由 Project 使用；请不要更改该域中的值。
| PROJ_TYPE | integer | 项目类型：
0 | 项目（默认值）
1 | 模板
2 | 企业全局模板
3 | 企业资源库
100 | 创建的常规项目
101 | 创建的项目模板
102 | 创建的企业全局设置
1002 | 停用的企业模板
| PROJ_CHECKEDOUT | integer | 指定项目是否已签出。
| PROJ_CHECKOUTBY | text(255) | 值为最后签出项目的用户的“用户标识号”。当重新签入该项目时，该值不会被清除，相反当重新签入项目时，PROJ_CHECKEDOUT 将返回到 0。
| PROJ_CHECKOUTDATE | datetime | 最后一次签出项目时的时间戳。当重新签入项目时，该值不会被清除，相反在重新签入项目时 PROJ_CHECKEDOUT 将返回到 0。
| PROJ_PROJECT | varchar(200) | 不带版本后缀存储唯一的项目名（允许索引重复）；可以有很多具有相同的项目值的项目版本。
| PROJ_VERSION | varchar(50) | 版本名称，例如：“已发布”。
| PROJ_CREATION_DATE_EX | datetime | 项目创建的日期。
| PROJ_ACTUALS_SYNC | tinyint | 指定项目的实际值是否已与项目的保护实际值同步：
0 | 实际值未同步。
1 | 实际值已同步。
| PROJ_ADMINPROJECT | tinyint | 指定项目是否为管理项目。
| PROJ_ENT_LIST_SEPARATOR | varchar(2) | 企业多值大纲代码所使用的列表分隔符，例如逗号 (,)。

页首

## MSP_RES_GLOBAL_BINARY

该表存储与全局企业资源库有关的二进制数据，只可用于 Project 和 Project Server。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| GLB_CATEGORY | integer | 指定全局二进制信息是与“任务”、“资源”还是与“工作分配”相关联：
0 | 任务
1 | 资源
3 | 工作分配
| GLB_REF_UID | integer | 由 GLB_CATEGORY 判定，引用其各自表中的有效 TASK_UID、RES_UID 或 ASSN_UID。
| GLB_REF_ENT_PROJ_ID | integer | 引用 MSP_ASSIGNMENTS 表中的有效 ASSN_ENTSUMPROJID。
| GLB_BINARY_DATA | Image | 此列将 MSP_PROJECTS 表中 RESERVED_BINARY_DATA 列的内容的一部分保存为二进制数据。

页首

## MSP_RES_SECURITY

该表加强 MSP_RESOURCES 表中的安全性，并由“项目数据服务 (PDS)”进行维护，“项目数据服务 (PDS)”加强该表上的只读和读/写权限。只有从 Project 中进行读取或写入操作时，该表才具有数据，因此该表通常显示为空。

注释 无法通过 Project 直接访问该表，且不能进行修改。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| ERUID | integer | 引用 MSP_RESOURCES 表中的有效标识号。
| SEC_SPID | varchar(255) | SQL 进程标识号 (SPID)。
| SEC_SPIDDATESTAMP | datetime | 此安全行中使用的活动 SPID 的创建日期。
| SEC_READCOUNT | tinyint | 表示当前特定用户对此特定资源进行授权读取访问的数目：
0 | 无用户（默认）
1 | 一个用户；PDS 加强在特定时间的单个 READWRITE 访问
| SEC_WRITECOUNT | tinyiny | 表示为更新资源数据当前从特定用户对此特定资源进行授权写入访问的数目。该值不得大于 1。

页首

## MSP_RESGLOBAL_SECURITY

在 Microsoft Project Professional 2002 中处理 Project Server 2003 数据时，该表用于同步资源和日历。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| SEC_RES_UID | integer | 引用 MSP_RESOURCES 表中的有效标识号。
| SEC_CAL_UID | integer | 引用 MSP_CALENDARS 表中的有效标识号。

页首

## MSP_RESOURCE_BASELINES

该表包含自定义资源比较基准数据。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| RES_UID | integer | 引用 MSP_RESOURCES 表中的有效标识号。
| RB_BASE_NUM | smallint | 自定义比较基准的编号，1-10。
| RB_BASE_WORK | decimal | 资源在任务中要完成的原计划工时量。
| RB_BASE_COST | decimal | 资源在任务中完成工时所需的计划总成本。

页首

## MSP_RESOURCE_RATES

该表包含资源费率数据。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| RESERVED_DATA | char | 临时存储特定数据库行的唯一信息；不应修改此域的内容。
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| RR_UID | integer | 资源费率的唯一标识号。
| RES_UID | integer | 引用 MSP_RESOURCES 表中的有效标识号。
| RR_RATE_TABLE | smallint | 指定对工作分配中的资源使用哪个成本费率表：
0 | A（默认值）
1 | B
2 | C
3 | D
4 | E
| RR_FROM_DATE | datetime | 资源费率生效的第一个日期。
| RR_TO_DATE | datetime | 资源费率生效的最后日期。
| RR_STD_RATE | decimal | 标准费率，与所选成本费率表中输入的相同。
| RR_STD_RATE_FMT | smallint | 在 Project 中显示标准费率时所使用的单位：
1 | 分钟
2 | 小时（默认值）
3 | 天
4 | 周
5 | 月
7 | 年
| RR_OVT_RATE | decimal | 加班费率，与所选成本费率表中输入的相同。
| RR_OVT_RATE_FMT | smallint | 在 Project 中显示加班费率时所使用的单位：
1 | 分钟
2 | 小时（默认值）
3 | 天
4 | 周
5 | 月
7 | 年
| RR_PER_USE_COST | decimal | 在所选成本费率表中输入的每次使用成本；例如，￥ * 100。

页首

## MSP_RESOURCES

该表存储组成项目的资源的有关信息。

Project 将向该表中写入四行，它们的唯一标识号分别为 0（任务 0 所需的 Null 资源）、-65536、-65535 和 -65534。这些行仅供 Project 内部使用，且不能进行编辑或删除。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| RESERVED_DATA | char | 临时存储特定数据库行的唯一信息；不应修改此域的内容。
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
I | RES_ACWP | decimal | 到状态日期或当前日期为止，资源的所有工作分配中“已完成工时的实际成本”(ACWP) 值的总和。
I | RES_BCWP | decimal | 对于所有分配任务，资源 BCWP 值的总成型摘要，计算到状态日期或当前日期；也称作“已完成工时的预算成本”。
I | RES_BCWS | decimal | 对于所有分配的任务，资源 BCWS 值的总成型摘要；也称作“计划工时的预算成本”
I | RES_NUM_OBJECTS | integer | 与资源相关联的对象数目，不包括备注中的对象。
| EXT_EDIT_REF_DATA | text | 设置该值指定一个新行或在更改数据库中的项目信息时备份现有数据。
| RES_UID | integer | 资源的唯一标识号。
| RES_ID | integer | 资源列表中资源的位置标识符；确定资源在 Project 中的显示顺序。
| RES_HAS_LINKED_FIELDS | bit | 指示是否存在与此资源链接的 OLE，链接可能来自活动项目的任何位置、其他 Project 文件或其他程序。
| RES_IS_OVERALLOCATED | bit | 指示在所有分配任务中是否为资源分配了超负荷的工作量。
| RES_TYPE | bit | 资源类型（工时或材料）：
0 | 材料；钢材、混凝土或土料等耗材供应
1 | 工时（默认值）；人员和设备
| RES_HAS_NOTES | bit | 指定资源是否具有 RTF 格式的备注。
| RES_CAN_LEVEL | bit | 指定是否可以对资源进行资源调配。
| RES_STD_RATE_FMT | smallint | 在 Project 中显示标准费率时所使用的单位。
| RES_OVT_RATE_FMT | smallint | 在 Project 中显示加班费率时所使用的单位。
| RES_ACCRUE_AT | smallint | 指示资源标准成本和加班成本支付或累加到任务成本的方式和时间：
1 | 开始；按照 ActualStart 域中输入的日期，在任务开始的同时，成本的累算也开始进行。
2 | 结束；直到剩余工时为零时才累算成本。
3 | 按比例（默认）；按照计划工时和报告的实际工时累算成本。
| RES_WORKGROUP_MESSAGING | smallint | 与项目工作组进行通讯使用的消息传递方法：
0 | 默认
1 | 无
3 | Project Server
| RES_CAL_UID | integer | 引用 MSP_CALENDARS 表中的有效标识号。
I | RES_AVAIL_FROM | datetime | 资源可以按照当前时间段指定的单位进行工作的开始日期。
I | RES_AVAIL_TO | datetime | 资源可以按照当前时间段指定的单位进行工作的结束日期。
| RES_STD_RATE | decimal | 资源完成的正常、非加班工时的支付费率。
| RES_OVT_RATE | decimal | 资源完成的加班工时的费率。
| RES_MAX_UNITS | decimal | 最大百分比或最大单位数，表示在当前时间段可用于完成任何任务的资源的最大量。可以超过 100%。
| RES_WORK | decimal | 资源在所有分配的任务中计划完成的总工时量。
| RES_ACT_WORK | decimal | 资源在分配的所有工作中已完成的实际工时量。
| RES_BASE_WORK | decimal | 资源在分配的所有工作中要完成的原计划工时量。
| RES_OVT_WORK | decimal | 资源在分配的所有任务中要完成的加班工时量，按照该资源的加班费率支付新酬。
| RES_COST_PER_USE | decimal | 每次使用资源时都进行累算的成本。
| RES_REM_WORK | decimal | 为完成所有分配任务，资源仍需要的时间量（或人-小时）。
| RES_REG_WORK | decimal | 资源在分配的所有工作中计划完成的非加班工时总量。
| RES_ACT_OVT_WORK | decimal | 资源在分配的所有工作中已完成的实际加班工时量。
| RES_REM_OVT_WORK | decimal | 为完成所有任务，资源所需的剩余加班工时量。
I | RES_PEAK | decimal | 在任何时间，对于分配给资源的所有任务，分配资源的单位的最大百分比（或数值）。
| RES_ACT_COST | decimal | 资源在所有分配任务中完成的工时所对应的成本总和。
| RES_COST | decimal | 资源在所有分配任务中的计划总成本，它基于资源在所有分配任务中已完成工时的成本，加上所有剩余工时的计划成本。
| RES_BASE_COST | decimal | 资源在所有分配任务中的计划总成本；也称作“预算完成成本 (BAC)”。
| RES_REM_COST | decimal | 在完成分配给资源的剩余工时期间，将花费的剩余计划费用。
| RES_OVT_COST | decimal | 资源在所有分配任务中的总加班成本。
| RES_ACT_OVT_COST | decimal | 资源在所有分配任务中已完成加班工时的成本。
| RES_REM_OVT_COST | decimal | 资源在所有分配的任务中，完成剩余计划加班工时期间所花费的资源剩余计划加班费用。
| RES_NAME | varchar(255) | 资源名称；无论资源是否为活动的，资源名称在企业中都必须是唯一的。
| RES_INITIALS | varchar(255) | 资源名称的缩写。
| RES_PHONETICS | text | 包含资源名称的“平假名”或“片假名”拼音信息；只用于 Project 日语版本。
| RES_MATERIAL_LABEL | text | 为材料资源输入的测量单位，例如吨、盒或立方码；与材料资源的“工作分配单位”一起使用；只有在 RES_RTYPE 被设置为“材料”时才可用。
| RES_RTF_NOTES | Image | 资源的备注。
| RES_RTYPE | smallint | 指定资源是普通资源还是常规资源，以及是否停用普通资源或常规资源：
0 | 普通资源
1 | 常规资源
100 | 已停用，普通资源
101 | 已停用，常规资源
| RES_CHECKEDOUT | integer | 指定是否签出资源。
| RES_CHECKOUTBY | varchar(255) | 值为最后签出资源的用户的“用户标识号”。当重新签入资源时，该值不会被清除，相反在重新签入资源时，RES_CHECKEDOUT 将返回到 0。
| RES_CHECKOUTDATE | datetime | 最后一次签出资源时的时间戳。当重新签入资源时，该值不会被清除，相反在重新签入资源时 RES_CHECKEDOUT 将返回到 0。
| RES_ENTERPRISE_TIMESTAMP | datetime | 签入或签出企业资源的日期和时间。
| RES_EUID | integer | 将 RES_UID 映射到“资源全局设置”企业库。
| RES_BOOKING_TYPE | smallint | 指定资源的预订类型：
0 | 已提交
2 | 已建议
| RES_AD_GUID | uniqueidentifier | 用于从 Active Directory 映射 Project Server 资源的 AD GUID。
| RES_ACT_WORK_PROT | decimal | 受保护的实际工时。
| RES_ACT_OVT_WORK_PROT | decimal | 受保护的实际加班工时。
| RES_CREATION_DATE | datetime | 资源 UID 创建的日期。

页首

## MSP_STRING_TYPES

该表存储字符串类别，并将 Project 数据库链接到 Project OLE 提供程序。所有 Project 字符串都属于一个类别。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
I | STRING_TYPE_ID | integer | 显示表示枚举域类别的数字；下表右列中显示该域的 STRING_TYPE 文本表示法：
3 | 链接类型
14 | 工时分布类型
29 | 任务类型
56 | 周内日期
57 | 显示单位
68 | 限制类型
70 | 成本累算
78 | 成本费率数据单位
81 | 工作组用户类型
83 | 周内日期
84 | 周内日期
85 | 周内日期
100 | 类别类型
101 | 日程排定开始时间
102 | 日历工作日
103 | 货币符号位置
104 | 工作组消息
105 | 域标识号
106 | 域属性
107 | 时间分段分布类型
108 | 时间分段数据单位
I | STRING_LANG_ID | integer | 显示转换文本所使用语言的标识号，例如：2052 = 简体中文，它是数据库的默认语言。
I | STRING_TYPE | varchar(200) | 域值的文本表示，由 STRING_TYPE_ID 的值判定；请参阅用于对 STRING_TYPE_ID 的每个值进行 STRING_TYPE 文本表示的 STRING_TYPE_ID 中的右列。例如：如果 STRING_TYPE_ID = 103，该域中的内容将为“货币”符号位置。

页首

## MSP_TASK_BASELINES

该表包含自定义任务比较基准数据。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| TASK_UID | integer | 引用 MSP_TASKS 表中的有效标识号。
| TB_BASE_NUM | smallint | 自定义比较基准的编号，1-10。
| TB_BASE_DUR | integer | 计划完成任务的原始时间范围。
| TB_BASE_DUR_FMT | smallint | 任务比较基准工期的默认格式：
3 | 分钟
5 | 小时（默认值）
7 | 天
9 | 周
11 | 月
| TB_BASE_START | datetime | 保存比较基准时任务的计划开始日期。
| TB_BASE_FINISH | datetime | 保存比较基准时任务的计划完成日期。
| TB_BASE_WORK | decimal | 接受任务的所有资源要完成的原计划工时量。
| TB_BASE_COST | decimal | 任务的计划总成本；也称作“预算完成成本 (BAC)”。

页首

## MSP_TASKS

该表存储组成项目的任务的有关信息。Project 将向该表中写入四行，它们的唯一标识号分别为 0、-65536、-65535 和 -65534。这些行仅供 Project 内部使用，且不能进行编辑或删除。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
I | RESERVED_DATA | char | 临时存储特定数据库行的唯一信息；不应修改此域的内容。
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
I | TASK_ACWP | decimal | 到项目状态日期或当前日期为止，任务中已完成工时的成本。
I | TASK_BCWP | decimal | 到状态日期或当前日期为止，任务按时间分段的完成百分比乘以任务按时间分段的比较基准成本的累计值；也称作“盈余分析”。
I | TASK_BCWS | decimal | 到状态日期或当前日期为止，按时间分段的比较基准累计成本。
I | TASK_DUR_VAR | integer | 任务的比较基准工期与任务总工期（当前估计）的差异。
I | TASK_FINISH_VAR | integer | 表示任务的比较基准完成日期与其当前完成日期之间差异的时间量。
I | TASK_OUTLINE_NUM | varchar(255) | 表示大纲中任务的确切位置。例如，7.2 表示任务为排位第七的高级摘要任务下的第二个子任务。
I | TASK_START_VAR | integer | 任务的比较基准开始日期与其当前计划开始日期之间的差异。
I | TASK_IS_OVERALLOCATED | bit | 指示对任务所分配的资源是否分配了超负荷的工作量。
I | TASK_OVT_WORK | decimal | 接受任务的所有资源计划完成的加班工时量，按加班费率支付薪酬。
I | TASK_VAC | decimal | 任务的比较基准成本与总成本之间的差异；也称作“完成差异 (VAC)”。
I | TASK_REG_WORK | decimal | 排定由接受任务的所有资源完成的非加班工时总量。
I | TASK_NUM_OBJECTS | integer | 附加到任务的对象数目。
| TASK_TOTAL_SLACK | integer | 任务在不延迟项目完成日期的情况下可延迟的时间量。
| EXT_EDIT_REF_DATA | text | 设置该值指定一个新行或在更改数据库中的项目信息时备份现有数据。
| TASK_UID | integer | 任务的唯一标识号。
| TASK_ID | integer | 任务列表中该任务的位置标识符。
| TASK_HAS_LINKED_FIELDS | bit | 指示是否存在与此任务链接的 OLE，链接可能来自活动项目的任何位置、其他 Project 文件或其他程序。
| TASK_IS_MILESTONE | bit | 指定任务是否为里程碑。
| TASK_IS_CRITICAL | bit | 指定任务在日程中是否有延迟的余地，或者任务是否位于关键路径上。
| TASK_IS_SUMMARY | bit | 指定任务是否为摘要任务。
| TASK_IS_SUBPROJ | bit | 指定任务是否为插入的项目。
| TASK_IS_MARKED | bit | 指定是否为某种进一步的操作或识别而对任务作了标记。
| TASK_IGNORES_RES_CAL | bit | 指定任务的日程安排是否考虑了任务所分配资源的日历。
| TASK_IS_ROLLED_UP | bit | 指定摘要任务条形图是否显示总成型栏或子任务甘特条形图上的信息是否上卷到摘要任务条形图；必须将其设置为 1，以使子任务上卷到摘要任务。
| TASK_IS_FROM_FINISH_SUBPROJ | bit | 指定项目是否标记为“从完成之日起排定日程 (SF)”。
| TASK_BAR_IS_HIDDEN | bit | 指定是否隐藏任务的“甘特条形图”和“日历条形图”。
| TASK_IS_RECURRING | bit | 指定任务是否为重复任务。
| TASK_IS_RECURRING_SUMMARY | bit | 指示周期性任务是否为摘要任务。
I | TASK_IS_EXTERNAL | bit | 指定该任务是链接自其他项目还是来源于当前项目。
| TASK_IS_EFFORT_DRIVEN | bit | 指定任务的日程排定是否为投入比导向。
| TASK_IS_COLLAPSED | bit | 指定在 Project 中显示摘要任务时是否折叠摘要任务。
| TASK_HAS_NOTES | bit | 指定任务是否具有 RTF 备注。
| TASK_IS_READONLY_SUBPROJ | bit | 指定此任务的子项目是否为只读项目。
| TASK_LEVELING_CAN_SPLIT | bit | 指定资源的调配功能是否可对任务的剩余工时进行拆分。
| TASK_LEVELING_ADJUSTS_ASSN | bit | 指定为解决资源过度分配问题，调配功能是否可以延迟并拆分各个工作分配（而不是整个任务）。
I | TASK_DUR_IS_EST | bit | 指定比较基准工期是否为估计值。
| TASK_EARLY_FINISH | datetime | 根据前置任务和后续任务的最早完成日期、其他限制和任何资源调配延迟而得出的任务可能完成的最早日期。
| TASK_LATE_START | datetime | 在不延迟项目完成时间的情况下，任务可以开始的最迟日期，该日期由开始日期、前置任务和后续任务的最晚开始日期和最晚完成日期，以及其他限制所决定。
| TASK_STOP_DATE | datetime | 表示任务实际结束的日期。
I | TASK_RESUME_DATE | datetime | 在为“完成百分比”域输入新值后，任务剩余部分计划重新开始的日期。
| TASK_FREE_SLACK | integer | 在不延迟任何后续任务的情况下，任务可以延迟的时间量；如果任务没有后续任务，可用时差就是在不延迟整个项目的情况下，任务可以延迟的时间量。
| TASK_OUTLINE_LEVEL | smallint | 该数字指定任务在项目大纲层次结构中的级别。
| TASK_DUR | integer | 任务活动工作时间的总范围。
| TASK_DUR_FMT | smallint | 在 Project 中显示任务工期时所使用的单位。
3 | 分钟工时
4 | 分钟
5 | 工时
6 | 小时
7 | 工作日（默认值）
8 | 天
9 | 周工时
10 | 周
11 | 月工时
12 | 月
19 | 百分比工时
20 | 百分比
35 | 分钟工时?
36 | 分钟?
37 | 工时?
38 | 小时?
39 | 工作日?
40 | 天?
41 | 周工时?
42 | 周?
43 | 月工时?
44 | 月?
51 | 百分比工时?
52 | 百分比?
| TASK_ACT_DUR | integer | 迄今为止任务实际工作时间的范围，该值基于计划工期和当前剩余工时或完成百分比。
| TASK_REM_DUR | integer | 完成任务的未完成部分所需要时间量。剩余工期可以通过两种方式进行计算（基于“完成百分比”或“实际工期”）。
| TASK_BASE_DUR | integer | 计划完成任务的原始时间范围。
| TASK_BASE_DUR_FMT | smallint | 在 Project 中显示任务的比较基准工期时所使用的单位。
3 | 分钟工时
4 | 分钟
5 | 工时
6 | 小时
7 | 工作日（默认值）
8 | 天
9 | 周工时
10 | 周
11 | 月工时
12 | 月
19 | 百分比工时
20 | 百分比
35 | 分钟工时?
36 | 分钟?
37 | 工时?
38 | 小时?
39 | 工作日?
40 | 天?
41 | 周工时?
42 | 周?
43 | 月工时?
44 | 月?
51 | 百分比工时?
52 | 百分比?
| TASK_CONSTRAINT_TYPE | smallint | 计划任务的限制：
0 | 越早越好
1 | 越晚越好
2 | 必须开始于；需要 TASK_CONSTRAINT_DATE
3 | 必须完成于；需要 TASK_CONSTRAINT_DATE
4 | 不得早于...开始；需要 TASK_CONSTRAINT_DATE
5 | 不得晚于...开始；需要 TASK_CONSTRAINT_DATE
6 | 不得早于...完成；需要 TASK_CONSTRAINT_DATE
7 | 不得晚于...完成；需要 TASK_CONSTRAINT_DATE
| TASK_LEVELING_DELAY | integer | 作为资源调配的结果，任务比其早先开始日期延迟的时间量。
| TASK_LEVELING_DELAY_FMT | smallint | 在 Project 中显示资源调配延迟时所使用的单位。
| TASK_START_DATE | datetime | 任务计划开始的日期和时间；如果该任务有前置任务，将自动计算该值。
| TASK_FINISH_DATE | datetime | 任务计划完成的日期和时间。
| TASK_ACT_START | datetime | 任务实际开始的日期和时间。
| TASK_ACT_FINISH | datetime | 任务实际完成的日期和时间。
| TASK_BASE_START | datetime | 保存比较基准时任务的计划开始日期。
| TASK_BASE_FINISH | datetime | 保存比较基准时任务的计划完成日期。
| TASK_CONSTRAINT_DATE | datetime | 指定限制开始日期或完成日期（ 如 TASK_CONSTRAINT_TYPE 中所定义）。除非 TASK_CONSTRAINT_TYPE 设置为“越晚越好”或“越早越好”，否则该值为必需。
| TASK_PRIORITY | smallint | 指定分配给任务的重要性级别；数字越大，优先级越高：
0 | 最低优先级；总是调配任务
500 | 默认值
1000 | 最高优先级；从不调配任务
| TASK_PCT_COMP | smallint | 任务的当前状态，表示为已完成任务工期的百分比。
| TASK_PCT_WORK_COMP | smallint | 任务的当前状态，表示为任务已完成工时的百分比。
| TASK_TYPE | smallint | 指定编辑工时、工作分配单位或工期对其他两个域的计算的影响：
0 | 固定单位（默认）；无论任务的工时量或工期如何变化，“工作分配单位”的数量都保持不变
1 | 固定工期：无论分配的资源数量（工作分配单位）或工时量如何变化，任务工期都保持不变
2 | 固定工时：无论工期或接受任务的资源数量（工作分配单位）如何变化，工时量都保持不变
| TASK_FIXED_COST_ACCRUAL | smallint | 指定如何将固定成本支付、累加到任务的成本中：
1 | 开始；按照 ActualStart 域中输入的日期，在任务开始的同时，成本的累算也开始进行。
2 | 结束；直到剩余工时为零时才累算成本。
3 | 按比例（默认）；按照计划工时和报告的实际工时累算成本。
| TASK_CREATION_DATE | datetime | 任务添加到项目的日期和时间。
| TASK_PRELEVELED_START | datetime | 在资源调配完成前的任务开始日期。
| TASK_PRELEVELED_FINISH | datetime | 在资源调配完成前的任务完成日期。
| TASK_EARLY_START | datetime | 根据前置任务和后续任务的最早开始日期以及其他限制而得出的任务可能开始的最早日期。
| TASK_LATE_FINISH | datetime | 在不延迟项目完成时间的情况下，任务可以完成的最迟日期，该日期由任务的最晚开始日期、前置任务和后续任务的最晚开始日期和最晚完成日期，以及其他限制决定。
| TASK_CAL_UID | integer | 引用 MSP_CALENDARS 表中的有效标识号。
| TASK_DEADLINE | datetime | 输入作为任务期限的日期。
| TASK_WORK | decimal | 任务中排定由所有分配资源完成的总工时量。
| TASK_BASE_WORK | decimal | 接受任务的所有资源要完成的原计划工时量。
| TASK_ACT_WORK | decimal | 接受任务的资源已经完成的工时量。
| TASK_REM_WORK | decimal | 所有分配的资源完成任务仍然需要的时间量。
| TASK_COST | decimal | 任务的总规划（或计划）成本，等于接受任务的所有资源已完成工时的成本，加上该工作分配的剩余工时的计划成本。
| TASK_FIXED_COST | decimal | 与资源成本无关的任务费用。
| TASK_ACT_COST | decimal | 所有资源在任务中已完成工时的成本，以及任何其他经记录的与该任务相关的成本。
I | TASK_REM_COST | decimal | 在接受任务的所有资源完成剩余的计划工时期间，将花费的任务剩余计划费用。
| TASK_BASE_COST | decimal | 任务的总计划成本，也称作“预算完成成本 (BAC)”。
| TASK_ACT_OVT_WORK | decimal | 接受任务的所有资源已经完成的实际加班工时量。
| TASK_REM_OVT_WORK | decimal | 所有分配资源完成任务所计划的剩余加班量。
| TASK_OVT_COST | decimal | 任务的实际加班成本。
| TASK_ACT_OVT_COST | decimal | 任务中所有分配的资源已完成加班工时的成本。
| TASK_REM_OVT_COST | decimal | 任务的剩余计划加班费用。
| TASK_WBS | text | 用于表示在项目的分层结构中任务位置的唯一代码 (WBS)。
| TASK_NAME | varchar(255) | 任务名称。
| TASK_WBS_RIGHTMOST_LEVEL | text | 任务的最右边的级别。例如，如果任务级别为 A.01.03，最右边的级别将为 03。
| TASK_RTF_NOTES | Image | 包含 RTF 备注。
| TASK_PHY_PCT_COMP | smallint | 任务实际完成的总体百分比。
| TASK_EAC | decimal | 基于已花费成本的任务的总规划（或计划）成本，加上剩余工时的计划成本。
| TASK_EVMETHOD | smallint | 指定 TASK_PCT_COMP 或 TASK_PHY_PCT_COMP 是否用于计算已完成工时的预算成本 (TASK_BCWP)。
| TASK_ACT_WORK_PROT | decimal | 受保护的实际工时。
| TASK_ACT_OVT_WORK_PROT | decimal | 受保护的实际加班工时。

页首

## MSP_TEXT_FIELDS

该表包含自定义文本信息。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| TEXT_CATEGORY | integer | 指定自定义文本类别是“任务”、“资源”还是“工作分配”；对于插入项目，必须设置为 0：
0 | 任务
1 | 资源
3 | 工作分配
| TEXT_REF_UID | integer | 由 TEXT_CATEGORY 判定，引用其各自表中的有效 TASK_UID、RES_UID 或 ASSN_UID。
| TEXT_FIELD_ID | integer | 引用 MSP_CONVERSIONS 表中的有效 CONV_VALUE；对于插入项目，总是使用 188743706。
| TEXT_VALUE | varchar(255) | 自定义文本域的值。

页首

## MSP_TIMEPHASED_DATA

该表以可读格式存储时间分段数据，条件是 MSP_PROJECTS 表中的 PROJ_OPT_EXPAND_TIMEPHASED 列设置为 1，或者用户通过 Project 在“工具”菜单上单击“选项”，单击“保存”选项卡，然后选中“将时间同步数据追加到数据库中”复选框。该表中的各行说明数据类型（工时、完成百分比或成本）、日期范围、时间单位、指定数据的值，并指出时间分段数据是否引用了工作分配、任务或资源。

| 列名称 | 数据类型 | 说明
--- | --- | --- | ---
| RESERVED_DATA | char | 临时存储特定数据库行的唯一信息；不应修改此域的内容。
| PROJ_ID | integer | 引用 MSP_PROJECTS 表中的有效标识号。
| TD_UID | integer | 时间分段数据记录的唯一标识号。
| TD_FIELD_ID | smallint | 引用 MSP_CONVERSIONS 表 CONV_VALUE 列中的有效“域标识号”。
| TD_CATEGORY | smallint | 指定时间分段数据是“任务”、“资源”还是“工作分配”：
0 | 任务
1 | 资源
3 | 工作分配
| TD_REF_UID | integer | 由 TD_CATEGORY 判定，引用其各自表中的有效的 TASK_UID、RES_UID 或 ASSN_UID。
| TD_START | datetime | 将应用工时、完成百分比或成本值的第一个时间段的开始时间。
| TD_FINISH | datetime | 将应用工时、完成百分比或成本值的第一个时间段的结束时间。
| TD_UNITS | smallint | 指定在 TD_VALUE1 - TD_VALUE7 中所指定值应用的时间单位。
0 | 分钟工时
1 | 工时
2 | 工作日（默认值）
3 | 周工时
5 | 月工时
8 | 年工时
| TD_VALUE1 - TD_VALUE7 | decimal | 在 TD_START 和 TD_FINISH 列中指定的日期范围内，按 TD_UNITS 列所指定的单位，第一到第七时间段的工时、完成百分比或成本的值。只有位于指定的开始日期和完成日期之间的值才可应用。
| TD_EXT_EDITED | bit | 指示记录是否经过外部编辑。