Pleasanterのルックアップを改めて整理してみる

# はじめに
Pleasanterの[ルックアップ](https://pleasanter.org/manual/table-management-lookup)は、リンクを指定した上で、リンク先の特定の項目を転記することができる機能です。いわゆる、Excelのvlookupとかと同じイメージです。

このルックアップ、オプションがいろいろありますが、少々理解が難しいこともあり、改めて、オプション指定で何が起こるのか、可能な限りわかりやすくまとめてみたいと思います。

### 注意
- ルックアップを使うためには、[リンク](https://pleasanter.org/manual/table-management-choices-text-link)機能を知っておく必要がありますが、こちらについては理解している前提で整理しています。
- 以下に示したサイトは、基本的に[自動ポストバック](https://pleasanter.org/manual/table-management-auto-postback)を設定、選択の都度、値が転記されるような設定を前提としています。

# 基本

### 参照するマスタサイト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/15fc22ff-007e-52b4-fbf3-827bf2f4cc26.png)
「分類A(ClassA)」を転記します。分類A(ClassA)は単純にテキストを入力しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/15abd504-d73f-3543-4b47-9b65b2e979c2.png)

### ルックアップで転記する側
転記先イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/b26dfc8b-53c6-4d2c-c56a-81c15abe8f19.png)

分類I(ClassI)にルックアップを指定、分類J(ClassJ)にルックアップしてきた値を転記します。

分類I(ClassI)の設定（"選択肢一覧の設定"）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/d3a160ad-ccd7-f821-8faf-0ca9aea2afa3.png)

```json
[
    {
        "SiteId": 315196,
        "Lookups": [
            {
                "From": "ClassA",
                "To": "ClassJ"
            }
        ]
    }
]
```

"SiteId"にルックアップ参照するサイトIDを指定します。
"Lookups"の"From"にルックアップ参照するサイトの転記したい項目(=ClassA)を指定、"To"に転記させたい項目(ClassJ)

### ルックアップした結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/1e19c976-6ee8-fd43-e004-760738cfb05d.png)
分類I(ClassI)に"マスタ２－１－１"を選択すると、同レコードの分類A(ClassA)の値"データ１"が、転記先の分類J(ClassJ)が転記されました。

# Typeの指定

マニュアルには以下のように記載されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/ba116de7-ab39-0e68-542c-fb533f4f67e1.png)

実際に試してみます。

### 参照するマスタサイト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/7b8e175e-8ea5-b0ce-30d1-11b32ff3573f.png)
[基本](#基本)の時と同じく、分類A(ClassA)を転記します。今回はこの分類A(ClassA)を以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/0251fa74-e746-44f4-c501-3319f2aba58c.png)
テーブルの管理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/e887c183-3b1d-6a8f-335f-03f4cf9960b3.png)
値と表示名を定義する形で設定します。

### ルックアップで転記する側が"Type" : 0 のとき

転記先イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/c39dba3f-c1cc-b025-6a26-ab2c8e0590b3.png)
こちらも同じように、分類A(ClassA)にルックアップを指定、分類B(ClassB)に転記します。

分類A(ClassA)の選択肢一覧の設定
```json
[
    {
        "SiteId": 315180,
        "Lookups": [
            {
                "From": "ClassA",
                "To": "ClassB",
                "Type": 0
            }
        ]
    }
]
```

### ルックアップした結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/b72c49b2-1a6a-97ce-af55-e57ff9337ca7.png)
表示名である"組織A"ではなく、値"1"が転記されました。

### ルックアップで転記する側が"Type" : 1 のとき

ルックアップ参照するサイトは、"Type":0 のと同じです。

転記先イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/d3071938-6194-0162-1b78-61a502f66a65.png)

分類C(ClassC)を以下のように設定します。
```json
[
    {
        "SiteId": 315180,
        "Lookups": [
            {
                "From": "ClassA",
                "To": "ClassD",
                "Type": 1
            }
        ]
    }
]
```

### ルックアップした結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/0f2d8fc1-712d-d76d-1172-ac4ffb1ee45f.png)
今度は、表示名"組織A"が転記されました。

### "Type" : 0 の応用

転記先の項目を、転記元と同じように選択肢を指定、値と表示名を定義する形で設定します。

転記先イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/d15c604e-a710-79bb-6fc6-c718f83704a6.png)

転記先項目の分類H(ClassH)は以下のように設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/31fb8feb-7edb-fd85-55d2-a8c96269ca45.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/40526a86-ffeb-22d5-66b5-e39f7ca5dc07.png)
転記元と同じ選択肢一覧を設定します。

分類G(ClassG)の選択肢一覧の設定は以下のとおり
```json
[
    {
        "SiteId": 315180,
        "Lookups": [
            {
                "From": "ClassA",
                "To": "ClassH",
                "Type": 0
            }
        ]
    }
]
```
"Type": 0 を指定します。

### ルックアップした結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/b10b3817-56a1-730a-e5c1-365ca4154ef2.png)
選択肢項目として、"組織A"が転記されました。

# Overwrite/OverwriteForm

OverwriteとOverwriteFormは、転記先の項目に値が入力済だった場合、どのような動きになるか、を制御します。

まずはマニュアル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/779e3263-a259-debe-687e-e972c8f43686.png)
ちょっと難しい。

### Overwriteの指定

#### trueの場合　

[基本](#基本)で使用したサイトで確認します。未設定のため、規定値Trueの動作になります。

##### パターン１
実施前　→　まだ、値は保存されていない状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/bf38cc4f-1b9c-22b5-a352-f5b2f068ea9f.png)
ここで、分類J(ClassJ)に任意の値を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/ace6a82a-4707-c671-ebe0-2387e7d5dce3.png)
そこから、分類I(ClassI)を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/4475b7fc-e34d-6b82-26f1-22146091b601.png)
分類J(ClassJ)は変更されません。

##### パターン２
実施前　→　画面を開いた時点で、値が表示される。すでに値は保存済の状態。ここから、分類I(ClassI)を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/48d14336-47f7-67c8-1060-1fb847f730ac.png)
ここから、分類I(ClassI)を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/7d631a07-3e9f-c858-ad9a-65402ccb8e99.png)
値が転記されました。

#### falseの場合

以下のように設定を変更します。
```json
[
    {
        "SiteId": 315196,
        "Lookups": [
            {
                "From": "ClassA",
                "To": "ClassJ",
                "Type": 0,
                "Overwrite": false
            }
        ]
    }
]
```

##### パターン１
実施前　→　まだ、値は保存されていない状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/bf38cc4f-1b9c-22b5-a352-f5b2f068ea9f.png)
ここで、分類J(ClassJ)に任意の値を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/ace6a82a-4707-c671-ebe0-2387e7d5dce3.png)
そこから、分類I(ClassI)を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/4475b7fc-e34d-6b82-26f1-22146091b601.png)
分類J(ClassJ)は変更されません。trueのパターン１と変わりません。

##### パターン２
実施前　→　画面を開いた時点で、値が表示される。すでに値は保存済の状態。ここから、分類I(ClassI)を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/48d14336-47f7-67c8-1060-1fb847f730ac.png)
ここから、分類I(ClassI)を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/e7040d28-f54b-9eb1-829d-f08a4f4d65dc.png)
**今度は値が転記されませんでした。**

### "OverwriteForm"の指定

#### falseの場合
既定値のため、"Overwrite"の"true"のパターンで示したものと挙動は同じ。

#### trueの場合
以下のように設定を変更します。
```json
[
    {
        "SiteId": 315196,
        "Lookups": [
            {
                "From": "ClassA",
                "To": "ClassJ",
                "Type": 0,
                "OverwriteForm": true
            }
        ]
    }
]
```
##### パターン１
実施前　→　まだ、値は保存されていない状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/bf38cc4f-1b9c-22b5-a352-f5b2f068ea9f.png)
ここで、分類J(ClassJ)に任意の値を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/ace6a82a-4707-c671-ebe0-2387e7d5dce3.png)
そこから、分類I(ClassI)を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/43871217-6bb3-4a3e-8ba1-c8341a155788.png)
**今度は値が転記されました。**

##### パターン２
実施前　→　画面を開いた時点で、値が表示される。すでに値は保存済の状態。ここから、分類I(ClassI)を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/48d14336-47f7-67c8-1060-1fb847f730ac.png)
ここから、分類I(ClassI)を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/922382/7d631a07-3e9f-c858-ad9a-65402ccb8e99.png)
値が転記されました。こちらは変わりません。

### 整理してみる。
少々ややこしいので整理してみました。

|No|Overwrite|OverwriteForm|DB保存済の状態で、選択肢を変更した場合|値を画面から入力後、選択肢を変更した場合|
|:----|:----|:----|:----|:----|
|1|TRUE|FALSE|上書きする|上書きしない|
|2|FALSE|FALSE|上書きしない|上書きしない|
|3|TRUE|TRUE|上書きする|上書きする|
|4|FALSE|TRUE|上書きしない|上書きする|

ひとことでまとめると・・
- Overwriteは、DB保存済の値を上書きするか否かを制御する
- OverwriteFormは、画面入力値を上書きするか否かを制御する

### 終わりに
選択肢一覧に設定できるオプションとしては、[「選択肢一覧を他の項目の値で絞り込む」](https://pleasanter.org/manual/table-management-choice-json-column-filter-expressions)というのがありますが、こちらはさらに難しくなるため、また別の機会に整理したいと思います。