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

# Exact Online Upsert

> Insert or update Exact Online data from an Arc message in the flow.

export const DbasaUpsertExampleFlow = ({datasource = "データソース", upsertXmlFlow = "dbsa_upsert_flow.png", siteNameShort = "Arc"}) => <>
    <p>Upsert で構成された{datasource}コネクタのテーブルとカラムを選択したら、そのコネクタを{siteNameShort} フローの末尾に配置します。次のスクリーンショットは、CSV コネクタ、XML Map コネクタ、および末尾の{datasource}Upsert コネクタから成るフローの例を示しています。</p>

    <img src={`/public/images/${upsertXmlFlow}`} width="800" />

    <p>このフローの例では、データは次の手順を通過します。</p>

    <ol>
      <li>File コネクタがディスクからCSV ファイルを取得してフローに取り込みます。</li>
      <li><strong>CSV1</strong> コネクタがCSV ファイルをXML に変換します。</li>
      <li>このデータは<strong>Source File</strong> として<strong>XML_Map</strong> コネクタに渡され、<strong>Source</strong> ツリーにマッピングされます。</li>
      <li><strong>{datasource}_Upsert</strong> コネクタからのデータは<strong>Destination File</strong> として<strong>XML_Map</strong> コネクタに渡され、<strong>Destination</strong> ツリーにマッピングされます。
        <img src="/public/images/dbsa_xmlmap_upsert.png" width="800" />
      </li>
      <li><strong>XML_Map</strong> コネクタは、<strong>Source</strong> 要素を同じ名前の<strong>Destination</strong> 要素に自動的にマッピングしようとします。これらは手動で変更でき、<strong>Source</strong> から<strong>Destination</strong> へ要素をドラッグすることで空のマッピングを補完できます。
        <img src="/public/images/dbsa_xmlmap_elements.png" width="800" />
      </li>
      <li><strong>{datasource}_Upsert</strong> コネクタは、マッピングに従ってUpsert を実行し、結果のデータを{datasource}に渡します。</li>
    </ol>
  </>;

export const DbasaUpsertSliderOnIntro = () => <p>スライダーが<strong>ON</strong> に設定されている場合、クエリの動作は<strong>UPSERT By</strong> および<strong>Perform this query...</strong> のラジオボタンで選択した内容に基づいて変化します。</p>;

export const DbasaUpsertQueryBehavior = () => <>
    <p>デフォルトでは、カラムマッピングの<strong>UPSERT</strong> スライダーは<strong>ON</strong> に設定されています。これは、UPSERT マッピングが、レコードを挿入する前（一致するレコードがない場合のINSERT）か、更新する前（レコードがすでに存在する場合のUPDATE）かを判定するために、対象にレコードが存在するかどうかを判断することを意味します。</p>

    <img src="/public/images/dbsa_upsert_slider.png" width="700" />

    <p>その値を判定するために使用されるクエリは、以下のセクションで説明するロジックによって決定されます。</p>
  </>;

export const DbasaUpsertTablesAndColumns = ({datasource = "データソース", connectorSlug}) => <>
    <p>{datasource}コネクタでUpsert を選択する場合は、{datasource}から対象のテーブル（1つまたは複数）を選択する必要があります。<strong>Tables</strong> ペインの上にある<strong>Add</strong> ボタンをクリックします。</p>

    <img src="/public/images/dbsa_upsert_tableadd.png" width="250" />

    <p>モーダルが表示され、利用可能なすべてのテーブルが一覧表示されます。目的のテーブルを選択して<strong>Add</strong> をクリックします。</p>

    <img src="/public/images/dbsa_tablelist.png" width="500" />

    <p>選択したテーブルが<strong>Tables</strong> ペインの下に表示され、テーブル内のカラムが<strong>Columns</strong> ペインの下に表示されます。コネクタは、特別な意味を持つ値（主キーや外部キーなど）を自動的に検出し、それに応じてラベルを付けます。</p>

    <img src="/public/images/dbsa_upsert_columns.png" width="700" />

    <p>デフォルトでは、すべてのカラムが{datasource}コネクタのアクションに含めるように選択されています。個々のカラムを除外するには、チェックを外します。</p>

    <Note><strong>Add</strong> をクリックしてこのプロセスを繰り返すことで、さらにテーブルを選択できます。詳細については、<a href={connectorSlug ? `/26.3/cloud/ja/connectors/${connectorSlug}/${connectorSlug}-ac#child-tables` : "#child-tables"}>子テーブル</a>を参照してください。</Note>
  </>;

export const DbasaUpsertIntro = ({datasource = "データソース"}) => <p>Upsert アクションは、{datasource}のデータを更新または挿入します。デフォルトでは、{datasource}にレコードがすでに存在する場合、入力から提供された値を使用して{datasource}内の既存データに対して更新が実行されます。詳細については、<a href="#upsert-query-behavior">UPSERT クエリの動作</a>を参照してください。</p>;

<DbasaUpsertIntro datasource="Exact Online" />

## Tables and Columns

<DbasaUpsertTablesAndColumns datasource="Exact Online" connectorSlug="exact-online" />

## UPSERT Query Behavior

<DbasaUpsertQueryBehavior />

### UPSERT Slider Set to ON

<DbasaUpsertSliderOnIntro />

#### UPSERT By Id

入力XML にキーカラムが存在する場合、一致するキーを持つレコードが存在するかどうかを判定するために、データベースにクエリが発行されます。

```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 By Non-key Column

選択した**UPSERT By** カラムに一致する値を含むレコードが存在するかどうかを判定するために、テーブルの主キーを選択することにより、データベースにクエリが発行されます。

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

SELECT クエリは、SELECT ステートメントにおいて常にテーブルのキーカラムを対象とします。一致が成功した場合、入力XML のデータがデータソースに更新されます。一致しない場合は、代わりにレコードが挿入されます。

<Note>選択した**UPSERT By** カラムが入力で指定されていない場合、次のクエリに示すように、NULL 値でルックアップが使用されます。</Note>

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

#### Using a Custom Query

UPSERT キーを選択するためのカスタムクエリを記述することもできます。このオプションを使用すると、単一のカラムの一致だけでなく、より複雑なロジックを使用してルックアップを実行できます。次のクエリを考えてみましょう。

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

この例では、UPDATE に適切な条件を提供するために、テーブルのキーカラムを選択する必要があります。`@OrderID` 構文は、一致する入力XML から値を参照するために使用されます。静的な値を使用することもできます。`'Active'` を囲む引用符は、この句が静的な値を使用していることを示します。

ここでも、キーカラムの一致が成功すると、更新リクエストの形成に使用されます。一致しない場合は、レコードが挿入されます。

<Tip>データベースへの挿入の動作について疑問がある場合は、UPSERT 試行の`.log` ファイルを確認してください。動作を導くために使用されたロジックの完全な内訳がログファイルに送信されます。</Tip>

### UPSERT Slider Set to OFF

スライダーが**OFF** に設定されている場合、コネクタはすべてのクエリを単純にデータベースに挿入します。入力マッピングのコードビューを確認すると、テーブルの`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 コマンドの効果は対象のデータベースタイプによって異なる可能性があるため、予想より多くの行が変更されたり、まったく変更されなかったりする場合があります。</Warning>

## Example Arc Flow

<DbasaUpsertExampleFlow datasource="Exact Online" />
