> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kasoftware.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Exact Online 高级设置

> Exact Online 端口的高级配置选项。

Exact Online 端口的 **高级设置** 选项卡允许配置端口的高级属性及其数据处理方法。以下部分详细介绍了以下功能和配置：

<ul><li>[XML 模型](#xml-models)</li>
<li>[子表](#child-tables)</li>
<li>[只处理新的或更改的记录](#only-process-new-or-changed-records)</li>
<li>[预处理和后处理查询](#pre-processing-and-post-processing-queries)</li>
<li>[XML 属性](#xml-attributes)</li></ul>

**高级** 选项卡上的许多其他设置都是从正在使用的数据源动态加载的，因此本文档中未介绍它们。非特定于数据源的设置在 [高级选项卡](#advanced-tab) 中描述。

您可以在 知行软件 网站的 [在线帮助文件](https://www.kasoftware.com/articles.html) 页面上找到有关数据源的 *所有* 配置设置的详细信息。从该页面中，单击数据源对应的磁贴。

> [!TIP]
>
> 可以突出显示应用程序中的任何字段以显示工具提示，其中包含有关该字段功能的更多信息。

## XML 模型

Exact Online 端口将知行之桥中的 Exact Online 表建模为 XML。建模遵循以下结构：

* 父元素标识要插入的表。
* 每个子元素对应目标表中的一列。

这在 XML 元素和 Exact Online 值之间建立了连接，这允许端口从传入的 XML 文档中读取值并在 INSERT 或 UPDATE 查询中使用它们。

单击配置面板上方的 **`</>` 代码** 可以查看表的 XML 模型。以下 XML 是名为 **Account** 的表的简化示例模型，它被建模为 XML 元素 `<Account>`：

```xml theme={null}
<Items>
    <Account action="upsert">
        <Id key="true" />
        <account_c />
        <AccountNumber />
        <AccountSource />
    </Account>
</Items>
```

在上面的例子中，`Id`、`account_c`、`AccountNumber` 和 `AccountSource` 是 **Account** 表中的列。当端口处理与此结构匹配的 XML 文件时，它会自动将来自该 XML 的值插入到 **Account** 表中。当端口查询 **Account** 表时，它会输出与此结构匹配的 XML。

### 批处理输入

Exact Online 端口支持批处理以提高插入大量数据时的性能。批处理通过 **高级设置** 部分下的两个字段进行配置：**事务大小**（TransactionSize）和 **批处理大小**（BatchInputSize）。当这些字段设置为正整数时，端口在单个操作（批处理）中插入 \[*批处理大小*] 记录，并在单个连接（事务）中插入 \[*事务大小*] 记录。

XML 输入文件可以包含比单个事务大小更多的记录，在这种情况下，端口将在多个事务中插入数据。

如果在批量插入过程中发生错误，端口将回滚事务并缓存失败事务中第一条记录的索引。重试输入文件时，只有缓存索引之后的记录才会插入到 Exact Online 中。

### 批处理输出

查询输出时，可以配置端口以支持将记录批处理到单个文档中。**Max Records** 设置控制单个消息中应包含多少条记录，**Batch Size** 设置指示单个批处理组中应包含多少条批处理消息。

## 子表

Exact Online 端口支持使用单个操作更新和选择多个表。创建具有多个表的表模型时，这些表之间应该有外键关系，表示一个表是另一个表的子表。

要与子表交互，请创建一个以父表为目标的模型，然后使用右侧的箭头添加子表。下图显示的是 Upsert 操作。

![](https://docs.kasoftware.com/26.4/images/dbsa_upsert_table_modal.png)

单击 **应用** 后，设计器会填充表的层次结构。选择应包含在模型中的子表的列。

### 子表 XML

插入父表和子表时，输入映射 XML 结构将是多层的。以下 XML 是通过外键关联的两个表的示例输入映射：

```xml theme={null}
<Account action="upsert">
    <Id key="true" />
    <account_c />
    <AccountNumber />
    <AccountSource />
    <AccountPartner>
        <Id key="true" />
        <AccountFromId ref="@Id" />
        <IsPrimary />
        <OpportunityId />
        <Role />
    </AccountPartner>
</Account>
```

在上面的例子中，`Account` 是父表，`AccountPartner` 是子表。当 Exact Online 端口处理匹配此结构的输入 XML 文件时，它会更新这两个表并确保链接两条记录的键相同。

### 使用 ref 属性

子表中的某些列标有 [ref](#ref) 标记。此标记表示这些列对应于父表中的主键。在对父表进行插入之后，在对子表进行插入之前，端口会在父表中查询它刚刚插入的记录的主键。然后，端口在插入子表时使用此值。

当父表的主键由 Exact Online 生成时，这很有用。在这种情况下，此列不会作为输入 XML 传入，因此端口在将记录插入到父表中之前不知道该列的值。

在 XML 模型中，`ref` 属性表示可以稍后引用列，或者应该从映射中的另一列读取列的值。为了引用由 Exact Online 生成的列的值，列元素应包含一个设置为保留值 `LAST_INSERT_ID` 的 `ref` 属性：

```xml theme={null}
<Item action="upsert">
    <Id key="true" upsert="id" ref="@@LAST_INSERT_ID" />
```

这表明 *id* 值将在插入后检索，并且可以在以后引用（通常在子表中）。要稍后引用此值，请将 `ref` 元素设置为相关列的名称：

```xml theme={null}
<id key="true" ref="@id" />
```

在上面的例子中，*id* 是父表中主键的名称，也是子表中某列的名称。`ref` 语法指示端口在插入后从父表中检索 *id*，然后将检索到的值用作子表中的 *id* 列。

### 从子表选择

通常，当从父表和子表中选择时，如果外键与父表中的主键匹配，则应仅从子表中提取记录。

例如，假设一个 Select 从父表 **PurchaseOrders** 和子表 **PurchaseOrderLineItems** 中提取采购订单数据。从 **PurchaseOrders** 拉取的每条记录（订单）还应拉取与该订单关联的行项目。这两个表通过共享的 *PONumber* 列关联，该列是 **PurchaseOrders** 表的主键和 **PurchaseOrdersLineItems** 表中的外键。如果订单项的 *PONumber* 与从父表中提取的订单的 *PONumber* 匹配，则应仅从子表中提取订单项记录。

要在知行之桥中建立这种关系，请向 Select 添加一个新过滤器并按如下方式配置它：

<ul><li>在第一个（左侧）下拉列表中，选择作为父表外键的子表列。在上面的示例中，这将是 **PurchaseOrderLineItems** 表的 *PONumber* 列。</li>
<li>在中间（运算符）下拉列表中，选择 **equal**。</li>
<li>在最后一个（右侧）输入框中，首先使用右侧的下拉箭头选择 **REF**。之后，输入框应该有 `$` 前缀，表示正在引用父表。</li>
<li>使用最后一个（右侧）下拉列表选择应与子表的外键匹配的父表列。在上面的示例中，这将是 **PurchaseOrders** 表的 *PONumber* 列。</li></ul>

## 仅处理新的或更改的记录

可以将选择操作配置为仅检索最近更新或添加的记录。端口可以使用两种方法来检测哪些记录是新的或被修改的。

<ul><li>第一种方法需要一个 DateTime 列来表示记录的最后修改时间。</li>
<li>第二种方法需要一个列来显式存储一个值，该值表示是否应该处理记录。</li></ul>

这两个选项均在配置面板底部的 **高级** 设置中的 **设置** 选项卡上设置。要进一步细化您的要求，请参阅 **高级** 选项卡的 [高级设置](#advanced-settings) 部分中的三个附加 **流程更改...** 设置。

### 使用上次修改列

在配置面板底部找到 **高级设置** 设置。如果检测到 DateTime 列，则选项显示为 **使用列处理新的记录或已更改的记录**。将此设置为表示记录的上次修改时间的相应 DateTime 列。

### 使用自定义列

可以配置选择操作来更新从 Exact Online 表中成功拉取记录的列。这可以与过滤规则结合使用，该规则会仅选择列的值指示尚未拉取（或应再次拉取）的记录。

要在处理后启用列更新，请在映射编辑器底部找到 **高级设置** 设置。启用 **在成功处理行时使用值更新列**，然后指定应该更新哪一列以及应该在该列中设置的值。

例如，输出映射可能配置为在提取记录后将 *Processed* 列更新为 **1**。然后，可以应用 **Filter** 规则，将记录限制为 *Processed 不等于 1* 的记录。

在此示例中，当端口处理查询模板时，它会根据模板创建一个 SELECT 语句。该模板将执行 `SELECT Id, AccountId, Amount FROM INVOICE`，根据模板为结果集中的每条记录创建一个 XML 文件，并将这些文件放置在此端口的输出文件夹中。

## 预处理和后处理查询

你可以配置 Exact Online 端口以在执行其配置的操作之前和之后执行其他查询。可以通过手动修改端口生成的查询代码来配置这些附加查询。以下部分概述了此过程。

### 在 Upsert 映射中

在 UPSERT 映射中，可以发出在所有记录被 UPSERT 到表中之前或之后自动执行的查询。

要配置此功能，首先单击 **Upsert 配置** 窗格中的 **`</>` 代码**。

![](https://mintcdn.com/qiao/92y00drsn6lqgU2C/26.4/images/dbsa_ac_upsertcode.png?fit=max\&auto=format\&n=92y00drsn6lqgU2C\&q=85\&s=bbe26e4b308744c0ed5f2d52c3d4ebac)

打开的文本编辑器允许编辑数据表映射的高级功能。文本可能如下所示：

```xml theme={null}
<Items>
    <Names table="`dbo`.`Names`" action="upsert">
        <ID key="true" />
        <Name />
        …
    </Names>
</Items>
```

如要在任何列被添加到表之前或之后触发请求，定义一个具有以下属性的节点：

* `requireInput`：设置为 `false`。此属性值指示端口即使输入文件中没有任何匹配的输入元素也发出查询。
* `insertQuery`：包含要在 UPSERT 查询之前或之后执行的语句。
* `table`（可选）：设置为要使用额外查询定位的表的名称。（在下面的示例中，表名称是 updateTable。）如果在映射的根级别发出查询（即，作为 `<Items>` 元素的子元素），此属性不是必需的。如果将查询作为另一个表的子项发出，设置 table 属性可确保查询与该表的列区分开来。

根据你希望它执行的时间，将新定义的元素放在 UPSERT 查询之前或之后。

在下面的例子中，`<runFirst>` 会在任何 UPSERT 请求之前对表运行 `EXEC [dbo.FlushTemp]`：

```xml theme={null}
<Items>
    <runFirst table="updateTable" insertQuery="EXEC [dbo].[FlushTemp]" requireInput="false" />
    <Names table="`dbo`.`Names`" action="upsert">
        <ID key="true" />
        <Name />
        …
    </Names>
</Items>
```

在下面的例子中，`<runLast>` 会在所有 UPSERT 请求完成后对表运行 `EXEC [dbo].[CommitTemp]`。

```xml theme={null}
<Items>
    <Names table="`dbo`.`Names`" action="upsert">
        <ID key="true" />
        <Name />
        …
    </Names>
    <runLast table="updateTable" insertQuery="EXEC [dbo].[CommitTemp]" requireInput="false" />
</Items>
```

例子中的元素名称（`runFirst` 和 `runLast`）都是占位符，你可以随意自选。

> [!NOTE]
>
> UPSERT 映射中的预处理和后处理查询不接受查询中未硬编码的输入元素，并且它们也不会生成输出数据。

### 在 Select 映射中

在 Select 映射中，可以发出在对目标表发出查询之前或之后自动执行的查询。要配置此功能，首先单击 **Select 配置** 窗格中的 **`</>` 代码**。

![](https://mintcdn.com/qiao/92y00drsn6lqgU2C/26.4/images/dbsa_ac_selectcode.png?fit=max\&auto=format\&n=92y00drsn6lqgU2C\&q=85\&s=1c6ff14bb609cb56693a03ac9b594346)

打开的文本编辑器允许编辑数据表映射的高级功能。

如要在任何列被添加到表之前或之后触发请求，定义一个具有以下属性的节点：

* `outputResult`：设置为 `false`。此属性值指示端口不将查询的任何数据作为结果返回到输出文件中。
* `selectQuery`：包含要在 SELECT 查询之前或之后执行的语句。
* `table`（可选）：设置为要使用额外查询定位的表的名称。（在下面的示例中，表名称是 selectTable。）如果在映射的根级别发出查询（即，作为 `<Items>` 元素的子元素），此属性不是必需的。如果将查询作为另一个表的子项发出，设置 table 属性可确保查询与该表的列区分开来。

根据你希望它执行的时间，将新定义的元素放在 SELECT 查询之前或之后。

在下面的例子中，`<runFirst>` 会在对表发出 SELECT 查询之前运行 `EXEC [dbo].[prepTable]`：

```xml theme={null}
<Items>
    <runFirst table="selectTable" selectQuery="EXEC [dbo].[prepTable]" outputResult="false" />
    <Names table="`dbo`.`Names`" action="select">
        <ID key="true" />
        <Name />
        …
    </Names>
</Items>
```

在下面的例子中，`<runLast>` 会在对表发出 SELECT 查询及任何子查询之后运行 `EXEC [dbo].[cleanTable]`：

```xml theme={null}
<Items>
    <Names table="`dbo`.`Names`" action="select">
        <ID key="true" />
        <Name />
        …
    </Names>
    <runLast table="selectTable" selectQuery="EXEC [dbo].[cleanTable]" outputResult="false" />
</Items>
```

例子中的元素名称（`runFirst` 和 `runLast`）都是占位符，你可以随意自选。

> [!NOTE]
>
> SELECT 映射中的预处理和后处理查询不接受查询中未硬编码的输入元素。

## XML 属性

知行之桥 支持一系列 XML 属性，用于定义 XML 文档与数据库表之间数据的解析、映射和转换方式。这些属性可以应用于不同层级——如整体 XML 结构、特定表或单个列——以精确控制 知行之桥 读取、写入和格式化数据库数据的方式。

### 表属性

表属性定义了 知行之桥 如何与数据库表交互，指定要检索的数据、如何插入或更新记录，以及是否仅处理变更的行。诸如 [selectQuery](#selectquery)、[insertQuery](#insertquery)、[upsertQuery](#upsertquery) 和 [table](#table) 等属性控制数据的检索和修改操作，而 [requireInput](#requireinput)、[outputResult](#outputresult) 和 [processChangesOnly](#processchangesonly) 等设置则决定了输入需求和输出行为。

#### allColumns

在选择（Select）映射中，使用此属性指定输出 XML 应包含查询结果中返回的所有列。这允许定义输出映射，而无需在输出映射中显式定义所有列的名称。如果不使用此属性，输出映射中存在的列将用于按照代码视图中指定的顺序对查询返回的元素进行定位，查询中返回但输出映射中没有匹配列的元素将不会返回到输出 XML 中。

`<MyTable allcolumns="true" selectQuery="SELECT * FROM [MyTable]" />`

#### insertQuery

在更新/插入（Upsert）映射中，当插入记录时，可以使用此查询覆盖端口创建的默认查询。它可以用于发布超出与输入文件关联的普通插入操作之外的查询。

`<runFirst insertQuery="TRUNCATE TABLE [dbo].[Records]" requireInput="false" />`

#### outputResult

在选择（Select）映射中，如果设置此属性，则会发出匹配 Select 查询的查询，但不会生成要在输出 XML 中返回的内容。这允许运行作为事务一部分的其他查询，而这些查询不会反映在端口的输出中。

`<runFirst table="selectTable" selectQuery="EXEC [dbo].[prepTable]" outputResult="false" />`

#### processChangesOnly

在选择（Select）映射中，如果将 processChangesOnly 属性应用于表，并结合将 [timeCheck](#timecheck) 属性应用于日期时间列，则选择映射会在查询中动态生成的 WHERE 子句中使用此列，以确保仅检索新记录。这对应于设计器中 **使用列 *columnname* 处理新记录或更改记录** 选项中所选的列。有关更多信息，请参阅 [仅处理新记录或更改记录](#only-process-new-or-changed-records)。

> [!NOTE]
>
> 此属性仅适用于选择映射中的根表。

`<Orders processChangesOnly="true">`

#### requireInput

在更新/插入（Upsert）映射中，如果设置此属性，则无论输入 XML 是否包含匹配元素，都会执行与 inputQuery 匹配的查询。当[预处理或后处理查询](#pre-processing-and-post-processing-queries)作为存在一个或多个输入元素的同一事务的一部分发布时（例如，在输入新批次之前截断表，或在批次完成后运行存储过程），将使用此属性。

`<runFirst insertQuery="TRUNCATE TABLE [dbo].[Records]" requireInput="false" />`

#### selectQuery

在选择（Select）映射中，此属性用于在 XML 中定义查询及其参数。如果未提供 selectQuery，则会发出简单的 `SELECT *`。可以将 selectQuery 用于自定义查询，例如使用 JOIN 或其他 SQL 关键字的查询。

`<Orders selectQuery="SELECT ID, OrderNo, OrderDate FROM Orders">`

#### table

用于指定作为映射查询目标的表，特别是当表名与映射到它的有效 XML 元素名称不同时。

> [!NOTE]
>
> 如果在 selectQuery、upsertQuery 或 insertQuery 中编写了显式查询，则此属性将被忽略。

`<Purchase_Orders table="Purchase Orders">`

#### upsertQuery

在更新/插入（Upsert）映射中，使用此查询来确定正在处理的记录是新记录（INSERT）还是正在更新的现有记录（UPDATE）。操作将根据是否找到此查询的匹配结果来确定。

`<Records action="upsert" upsertQuery="SELECT ID FROM Records WHERE Key1 = @Key1 and Key2 = @Key2">`

### 列属性

列属性配置各个数据字段在 知行之桥 工作流中如何进行处理、转换和验证。这些属性允许定义数据类型、聚合值、跟踪随时间变化的变更，并对特定列应用自定义更新逻辑。

#### aggregate

在某些情况下，映射中列的值本身可能是一个 XML 聚合。默认行为是将该列视为字符串，并使用 XML 编码对列中聚合的值进行编码。但是，当列上存在 aggregate 属性时，映射到该表的 XML 文件会将任何聚合列的值作为原始 XML，而不是编码为单个元素。

`<LineItems aggregate="true" />`

#### column

映射中列上的 column 属性提供了所引用表中的列名。这可以实现以下几点：

<ul><li>映射到非有效 XML 元素的列</li>
<li>为数据库中的列创建别名，以将其与其他表中名称相似的列区分开来</li>
<li>在 XML 模型中使用更易读的元素</li></ul>

`<New_data column="New Data" />`

#### id

在选择（Select）映射中，此属性使用 Id 标记对列值进行标记，随后可以在子查询中使用语法 `${#ID}` 引用该标记。当子查询中需要列值，且多个表中的匹配列名可能导致选择歧义时，这非常有用。

```xml theme={null}
    <Shipments table="`Shipments`" selectQuery="SELECT * FROM `Shipments`">
        <ID type="integer" key="true" id="ShipID"/>
        ...
        <ShipmentOrders table="`ShipmentOrders`" selectQuery="SELECT * FROM `ShipmentOrders` WHERE `ShipmentID` = ${ID}">
            <ID type="integer" key="true" id="ShipOrderID"/>
            ...
            <ShipmentOrderItems table="`ShipmentOrderItems`" selectQuery="SELECT * FROM `ShipmentOrderItems` WHERE `ShipmentOrderID` = ${ID}">
                <ID type="integer" key="true" id="ShipOrderItemID"/>
                ...
```

#### key

将该列标识为表的主键。当此属性出现在更新/插入（Upsert）查询中时，端口会在更新记录前检查该记录是否存在。如果表中没有主键属性，则仅允许对表进行插入（Insert）操作，且在选择记录后无法更新列值，因为无法标识唯一记录。（如果确定某列可以像主键列一样使用，则可以覆盖现有列作为主键。）

`<ID key="true" type="integer"/>`

#### ref

在更新/插入（Upsert）映射中，此属性用于向数据库提供无法仅从输入 XML 中确定的更新/插入值。这最常用于父子关系中以确定数据库生成的主键，或者用于一个表引用子表上的外键。有关更多信息，请参阅 [使用 ref 属性](#使用-ref-属性)。

```xml theme={null}
   <Orders table="`Orders`" action="upsert">
        <ID type="integer" key="true" ref="@@LAST_INSERT_ID" />
        ...
        <OrderLines table="`OrderLines`" action="upsert">
            <ID type="integer" key="true" />
            ...
            <OrderID type="integer" ref="@ID" />
        </OrderLines>
    </Orders>
```

#### timeCheck

在选择（Select）映射中，如果将 [processChangesOnly](#processchangesonly) 属性应用于表，并结合将 timeCheck 属性应用于日期时间列，则选择映射会在查询中动态生成的 WHERE 子句中使用此列，以确保仅检索新记录。这对应于设计器中 **使用列 *columnname* 处理新记录或更改记录** 选项中所选的列。有关更多信息，请参阅 [仅处理新记录或更改记录](#only-process-new-or-changed-records)。

> [!NOTE]
>
> 此属性仅适用于选择映射中的根表。

`<LastModified timeCheck="true" />`

#### type

用于标识表中列的数据类型。对于更新/插入（Upsert）查询，在执行查询之前，系统会根据该类型对列中的值进行验证。

`<ID key="true" type="integer"/>`

#### updateValue

在选择（Select）映射中，从数据库中选择的任何记录在检索后，都会使用此列中的新值进行更新。这对应于设计器中的 **当行处理成功时，使用值 *value* 更新列 *columnname*** 选项。

> [!NOTE]
>
> 此属性仅适用于查询中的根表。

`<Exported updateValue="true" />`


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.