> ## 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.

# Odoo Upsert 設定

> 從工作流程中的知行之橋訊息插入或更新 Odoo 資料。

Upsert 操作插入或更新 Odoo 資料。預設情況下，如果 Odoo 中已存在記錄，則使用輸入提供的值對 Odoo 中的現有資料執行更新。有關詳細資訊，請參閱 [UPSERT 查詢行為](#upsert-query-behavior)。

## 表格和列

Odoo Upsert 端口支援兩種配置模式：**表結構** 和 **對映**。

**表結構** 是預設模式。當 **對映** 開關處於關閉狀態時，單擊 **新增表結構** 從 Odoo 中選擇目標表。

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

在 **編輯目標結構** 面板中，選擇所需的表，然後單擊 **套用**。

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

> [!NOTE]
>
> 有關選擇多個相關表的更多資訊，請參閱 [子表](https://docs.kasoftware.com/26.4/self-hosted/zh/connectors/odoo/odoo-ac.md#子表)。

隨即顯示所選的表和列。端口會自動檢測具有特殊相關性的值（例如主索引鍵）並相應地標記它們。右鍵單擊某列可存取其他設定，包括該列的 UPSERT 設定。

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

**對映** 模式提供完整的對映編輯器。啟用 **對映** 開關即可切換到此模式。

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

在 **目標** 面板中，單擊 **新增目標結構**，選擇目標表，然後單擊 **套用**。

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

所選的表和列會顯示在 **目標** 面板中。右鍵單擊某列可存取其他設定，包括該列的 UPSERT 設定。

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

> [!NOTE]
>
> 新增目標結構或配置 UPSERT 設定不需要來源範本。你可以在連線來源之前，在僅結構模式下設定 UPSERT 鍵並儲存。

## UPSERT 查詢行為

在表結構模式和對映模式下，均按列配置 UPSERT 設定。右鍵單擊某列，然後從快顯功能表中選擇 **UPSERT 設定**。

隨即開啟 **UPSERT 設定** 對話方塊。預設情況下，**啟用 UPSERT 設定** 開關為 **ON**，這意味著端口會先檢查目標中是否已存在記錄，再決定執行 INSERT 還是 UPDATE。

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

用於確定記錄是否存在的查詢由以下部分中描述的邏輯控制。

### UPSERT 設定已啟用

當 **啟用 UPSERT 設定** 處於開啟狀態時，查詢行為取決於在 **UPSERT 設定** 清單中選擇的選項：**UPSERT by**（按單列匹配）或 **Query to select UPSERT key**（使用自訂查找查詢）。

#### 按 ID UPSERT

在 **UPSERT 設定** 清單中選擇 **UPSERT by** 並選擇表的鍵列後，端口會發出查詢，以確定是否存在具有匹配鍵值的任何記錄：

```text theme={null}
The action type is UPSERT and an UPSERT query is not specified. The key column [Id] is present and will be determined using an automatically generated UPSERT query.
SELECT COUNT(*) AS [count] FROM [Orders] WHERE [Id] = @Id; @Id='123'
```

匹配結果更新；沒有匹配結果導致插入。

如果輸入 XML 中不存在鍵列，則始終插入記錄：

```text theme={null}
The key column Id was not specified, INSERT will be executed.
The action type is UPSERT or an UPSERT query is specified. The key column is not present. Record will be INSERTED.
```

#### 按非鍵列 UPSERT

在 **UPSERT 設定** 清單中選擇 **UPSERT by** 並選擇非鍵列後，端口會發出查詢，以確定是否存在該列包含匹配值的記錄，SELECT 語句以表的主索引鍵為目標（以下範例演示向 Orders 表執行 UPSERT）：

```sql theme={null}
SELECT [Id] FROM [Orders] WHERE [OrderId] = @OrderId; @OrderId='12345'
```

SELECT 查詢始終以 SELECT 語句中表的鍵列為目標。如果匹配成功，則輸入 XML 中的資料將更新到資料來源中。如果沒有匹配，則插入記錄。

> [!NOTE]
>
> 如果輸入中未指定所選的 **UPSERT by** 列，則查詢將與 NULL 值一起使用，如以下查詢所示：

```sql theme={null}
SELECT [Id] FROM [Orders] WHERE [OrderId] = @OrderId; @OrderId=NULL
```

#### 使用自定義查詢

在 **UPSERT 設定** 清單中選擇 **Query to select UPSERT key** 後，可以編寫自訂查詢來確定 UPSERT 鍵。這樣可以使用比單列匹配更複雜的邏輯來執行查找。考慮以下查詢：

```sql theme={null}
SELECT [Id] FROM [Orders] WHERE [OrderId] = @OrderId AND Status = 'Active'
```

在此範例中，必須選擇表的鍵列，以便為 UPDATE 提供足夠的條件。`@OrderID` 語法用於引用匹配輸入 XML 中的值。還可以使用靜態值：`'Active'` 周圍的引號表示該子句使用靜態值。

同樣，鍵列的成功匹配用於形成更新請求。如果沒有匹配，則插入記錄。

> [!TIP]
>
> 當對資料庫插入的行為有疑問時，請檢視 UPSERT 嘗試的 `.log` 檔案：用於指導該行為的邏輯的完整細分將傳送到日誌檔案。

### UPSERT 設定已停用

要對某列停用 UPSERT 行為，請開啟 **UPSERT 設定** 對話方塊（右鍵單擊目標列並選擇 **UPSERT 設定**），將 **啟用 UPSERT 設定** 切換為 **OFF**，然後單擊 **套用**。

停用 UPSERT 設定後，端口僅發出 INSERT 查詢。檢查輸入對映的程式碼檢視顯示表的 `action` 屬性是 `insert`：

```xml theme={null}
<Items>
    <Orders table="`Orders`" action="insert">
```

無論主索引鍵是否存在，向表發出的所有查詢都被視為插入。要根據表更新所有收到的記錄，可以將此操作關鍵字設定為 `update`，如以下程式碼片段所示：

```xml theme={null}
<Items>
    <Orders table="`Orders`" action="update">
```

> [!WARNING]
>
> 當操作定義為 `update` 時，應用程式期望表的鍵列（例如 Id）存在。如果未提供鍵列，則 UPDATE 命令的效果可能會因目標資料庫型別而異，因此可能會看到更改的行數比預期多，或者根本沒有更改。

\##知行之橋工作流程範例

為 Upsert 配置的 Odoo 端口選擇表格和列後，將端口放置在 知行之橋 工作流程的末尾。下面的螢幕截圖描述了一個範例流程，其中包含一個 File 端口、一個 CSV 端口和一個 Odoo Upsert 端口：

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

此範例工作流程中的資料透過以下步驟：

<ol><li>File 端口從磁碟提取 CSV 檔案並將其放入流程中。</li>
<li>**CSV1** 端口將 CSV 檔案轉換為 XML。</li>
<li>**Odoo\_Upsert** 端口接收 XML 資料。在端口的 **操作** 索引標籤上使用對映模式直接配置列對映，如 [表和列](#表和列) 中所述。然後，端口執行 Upsert 並將結果資料傳遞給 Odoo。</li></ol>


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