# 元数据

> 一次运行在开始时采集的字段目录（文本、数字，或者拼出来的流水号标识）、流水号字段背后的那个计数器，以及每个单元的代号和计数器状态。

**元数据**是模型的一份目录，列出一次运行在开始时要采集的那些字段：一个序列号、一个批次、一个操作员姓名、一个拼出来的标识。一个字段在模型上定义一次，因此它在每一个单元上含义相同，历史筛选和报告也就保持一致；每一个[流程](process-procedures)挑出它要提示的那一部分，而这些值会被冻结进运行记录文件。**元数据**屏幕（Process > 模型 > 定义 > 元数据）上面装着这份目录，下面是那些单元，旁边则是被选中字段或被选中单元的设置。标题栏写着“运行记录开始时采集的字段目录，以及每个单元用它们盖上的东西。”，并数出字段数和单元数。

读取需要查看模型；每一次编辑都需要管理 Process 和一台没有被锁住的工作站。这个屏幕穿着每个定义屏幕共用的那一副样子（见[定义](process-definition#the-one-shape-of-the-five-screens)）。

## 模型定义：那份目录 {#model-definition-the-catalogue}

标题栏写着“这份目录对每个单元都有效：在这里加一个或删一个字段，每个单元的表都会跟着变。”，并带着**字段**，按它就追加一行，名字取第一个空着的“字段 N”，新的一行被选中，设置就在它旁边，并滚动到可见处（工作站被锁住时变灰；没有管理 Process 时不画出来）。

| 列 | 是什么 | 取值 / 默认 | 效果 |
| --- | --- | --- | --- |
| **名称** | “每一次运行记录都以这个名称记下它的值。”它同时也是下一次启动会消费掉的那个预选点位 `Process.<Model>.<Unit>.Next.<Name>`。 | 自由文本；创建时是“字段 N”。 | 一次安全重命名：预告行说出有多少处位置读这个地址，提交时把它们改写，并把某个单元上已经预选好的值带到新名字下。名称的地址段和另一个字段映射到同一个时会被拒绝（“名称‘X’映射到的地址段‘Y’已经被‘Z’占用。”），用了预选流程那个点位的保留名称时也会（“名称‘Procedure’映射到的是保留的地址段‘Procedure’。”）。 |
| **种类** | “一次运行记录里这个字段的值从哪里来。” | **文本**（“运行记录开始时由操作员输入。”）、**数字**（“运行记录开始时由操作员输入一个数。”）、**流水号**（“由应用拼出来，运行被受理时确定并占用这个值。”）；默认文本。 | 切到流水号时，会把必需的计数器组成部分加进那份组成里。 |
| **必填** | 是不是每一个流程都提示这个字段（“这个模型上的每一个流程都会提示填写它，并把它锁进各自的元数据清单。不是只有流程要它时才必填。”）。 | 开 / 关；默认关。 | 开：“这个模型的每一个流程都会提示填写它，没有它就没有运行记录可以启动。”关：“只有要它的流程才会提示填写。” |
| **计数器范围** | 只有流水号才有：这个计数器按什么来分别计数。 | **整个模型**、**按单元**、**按流程**、**按流程加单元**；默认整个模型。 | 改动它会先问一次：“要把‘Serial’改成每个单元一个计数器吗？已经有计数器发出过值。当前的‘上一个’和‘下一个’状态不会被转换，也不会被分发。新的状态从配置的初始值开始，下一次运行之前必须复核。” |
| **下一个标识** | 只有流水号才有：这份组成接下来会发出的那个标识，配上示例日期和代号。 | 只读。 | 见下面的预览。 |
| **把字段上移**和**把字段下移**（行上） | 把这个字段在目录里挪一个位置。 | | 到了列表两头就变灰。工作站要是拒绝这次写入，这一行回到原来的位置。 |
| **删除**（行上，危险色） | 把这个字段以及它在每一个流程里的选择一并删掉。 | | 确认“要删除‘X’吗？这会删除这个字段，以及它在这个模型每一个流程里的使用。 此操作无法撤销。” |

字段按目录里存放的先后排列，开始时也按这个顺序提示；那就是添加进来的先后，直到行上的命令把它改掉。

## 一个字段的设置栏 {#the-settings-column-for-a-field}

点中一行就把它完整打开（“元数据 · 序列号”）：**名称**、**种类**和**必填**，每一个都写在说明它决定什么、当时生效的值会产出什么的那一行上面。流水号字段还会在它们下面加上它的组成和它的计数器。

### 预览 {#preview}

**预览**那一块显示这个字段接下来会发出的标识，取自计数器当前的“下一个”值、模型上找到的第一个单元代号和流程代号（还没有设时写 `UNIT` 和 `PROC`），以及今天的日期：“示例日期和代号。运行被受理时才确定并占用这个值。”字段拒绝的配置写作“无法预览”，理由作为一条附注立在预览下面（“流水号元数据‘X’必须正好含有一个计数器组成部分。”“……需要 1 到 18 位计数器位数。”“……的初始值超出了 0 到 999999。”“……有一个年份组成部分，它必须用两位或四位。”）。

### 计数器 {#the-counter}

| 字段 | 是什么 | 取值 / 默认 | 效果 |
| --- | --- | --- | --- |
| **计数器范围** | 计数器状态的共享边界：整个模型一份状态、每个单元一份、每个流程一份，或者每一对流程加单元一份。 | 四个范围；默认整个模型。 | 改动范围会从初始值造出全新的状态，绝不转换也不重新分摊旧的（就是上面那句确认）。 |
| **初始值** | 每一份新建的状态从哪里起算，以及计数器走到最大值之后回绕到哪里。 | 0 到位数所允许的最大值；默认 1。 | 编辑它绝不会重置已有的状态。 |
| **计数器位数** | 印出来的宽度，也因此是它的上限：六位数到 999999。 | 1 到 18；默认 6。 | 把它减到某份状态当前的“下一个”之下，会在保存时被拒绝：“‘Serial’的计数器位数表示不了它当前的下一个值 1200000。请先调整‘下一个’，再减少位数。” |
| **计数器前面补零** | 计数器那一部分是不是左边补零到位数宽度。 | 开 / 关；默认开。 | `000042` 对着 `42`。 |

### 组成 {#composition}

这个标识是一串有序的组成部分，与地区设置无关。**组成**的标题上带着一个类型选择框和**组成部分**，按它就追加一个那种类型的部分。

| 组成部分 | 发出什么 | 设置 |
| --- | --- | --- |
| **固定文本** | 字面文字，分隔符也在内。 | 一个文本字段（占位写“分隔符或固定文本”；新加的部分一开始是 `-`）。 |
| **年** | 本地日历年份。 | **2 位**或者 **4 位**（新加的部分是 4 位）。 |
| **月** | “两位数的本地月份”。 | |
| **日** | “两位数的本地日期”。 | |
| **计数器** | “这个字段占用的计数器”。 | 正好一个，字段变成流水号时自动加上；它不能删除，类型也不能改。 |
| **单元代号** | “在单元上配置的代号”。 | |
| **流程代号** | “在流程上配置的代号”。 | |

每一个组成部分那一行都带着它的序号、它的类型（除计数器外每种类型都是一个下拉框）、它的设置，以及**把组成部分上移**、**把组成部分下移**和**删除组成部分**。凡是组成里用到单元代号或流程代号的，在代号空着的那个单元或流程上启动都会被拒绝（“流水号元数据‘X’需要一个单元代号。请在模型自己的页面上，在单元表里设置它。”）。

### 共享的模型计数器 {#the-shared-model-counter}

对于按整个模型计数的字段，这一栏最后是一行**共享的模型计数器**，写着“所有单元和所有流程”：**上一个发出的**（实际上一次确定并占用的值，第一次启动之前是一个空缺）和**下一个**（下一次被受理的启动会占用的那个值）。“下一个”可以编辑，往回调也行；“下一个”不高于“上一个”时这一行警告“可能重复出同一个标识”，标题上也重复着“调低‘下一个’可能重复出一个已经发出过的标识。”超出 0 到最大值的取值会被拒绝：“‘Serial’的下一个值必须在 0 到 999999 之间。”工作站被锁住时，以及状态还不存在时（状态是在模型保存时创建的），“下一个”是禁用的。

按流程计数的计数器立在流程自己那一页上；按单元和按流程加单元计数的计数器立在下面的单元里。

## 按单元：单元列表 {#per-unit-the-units-list}

下面那一块列出那些单元，标题栏最末端是**管理单元**。

| 列 | 显示什么 |
| --- | --- |
| **单元** | 单元的名称。 |
| **代号** | 单元的代号，空着时写“没有代号”，而在这个模型有流水号字段把单元代号拼进去时，用警示色写“还没有代号”。 |
| **计数器** | “没有计数器”“1 个计数器”或者“N 个计数器”：按单元计数的每个字段各一个（必填字段，或者某个流程选中的字段），加上按流程加单元计数的每个字段在每一个适用流程上各一个。 |

## 一个单元的设置栏 {#the-settings-column-for-a-unit}

点中一个单元，就打开这张试验台盖下什么（“单元 · 单元 1”）：

| 字段 | 是什么 | 效果 |
| --- | --- | --- |
| **单元代号** | “每一个含有‘单元代号’的流水号字段都共用它。重命名单元绝不会改变它。”占位写“用到之前可以不填”。 | 和模型页面上单元表格里那个代号是同一个；去掉首尾空格，空着就是没有。 |
| 计数器状态那些行 | 这个单元持有的每一份计数器状态一行：字段的名称，加上上下文“这个单元”（按单元）或者流程的名称（按流程加单元）；上一个发出的，以及一个可以编辑的“下一个”，同上。 | “‘上一个’绝不会被改写。调低‘下一个’或者到达最大值后回绕，都可能重复出同一个标识。”一份都没有时：“这个模型没有任何流程会为按单元计数的流水号字段盖章，因此这张试验台不保存计数器状态。” |

## 一个流水号的值是怎么被占用的 {#how-a-sequential-value-is-reserved}

在一次被受理的启动上，等其他每一项校验都通过之后（手工填写的字段、必需的代号、绑定、单元可用性、信号源锁），这次运行的每一个流水号字段都在一次立即事务里占下它的号；同时发生的多次启动绝不可能看到同一个“下一个”。格式化好的文字，前导零也在内，会被冻结进这次运行：此后对字段、代号或计数器的编辑，绝不会改写它。崩溃正好落在那一小段窗口里可能留下一个空号，但一个号绝不会被自动重用。快照和独立的判定不提示任何元数据，也不占用任何号。在一个单元的界面上，流水号字段读作对它下一个值的预测，不用输入。

## 这个屏幕不做的事 {#what-this-screen-does-not-do}

- 它不挑选子集：一次运行提示哪些字段，是在每一个[流程](process-procedures)上选的；只有必填会把一个字段强加给每一个流程。
- 它不输入任何值：值是在单元的操作面板上或者某张仪表画面上于开始时输入的，或者由[自动化](process-automation)提供。
- 它不在范围改动时转换计数器状态。
- 它不改写任何已冻结的值：一次运行保留它当时盖下的东西。
