Claude Media
Claudeで入荷検品の差異を仕分ける — 入荷予定との数量違い・品番違い・未着

Claudeで入荷検品の差異を仕分ける — 入荷予定との数量違い・品番違い・未着

入荷予定(ASN)と検品実績の2つのCSVを品番で結合し、数量違い・品番違い・未着・予定外入荷に仕分けて、取引先連絡・返品・在庫訂正へ振る手順です。

入荷検品の差異は、入荷予定データ(ASN、事前出荷通知)と検品実績の2つのCSVを品番で結合し、一致しなかった行を「数量違い」「品番違い」「未着」「予定外入荷」に分けると、後工程の担当が決まります。結合と分類はコードに任せ、Claudeには分類の設計、スクリプトの作成、結果の読み合わせを担当させる分担が安定します。この記事では、例データで動かした分類スクリプトと、Claudeへの依頼文、仕分け後の振り先までを順に説明します。

受領書と請求の突合は納品書の突合をClaudeで進める手順、発注・納品・請求の三点照合はClaudeで発注書・納品書・請求書を三点照合する手順にあります。ここで扱うのは、倉庫に荷が着いた時点の「予定と実物のずれ」です。

差異を4つに分けると、振り先が決まる

検品の差異を「差異あり」の一括りにすると、毎回人が中身を読み直すことになります。区分を先に決めておくと、区分ごとに連絡先と処理が固定できます。

区分結合したときの見え方主な後工程
数量不足・超過結合したときの見え方両方に行があり、数量だけ違う主な後工程取引先へ数量確認、追加納品または返品
未着候補結合したときの見え方予定にだけ行がある主な後工程取引先へ出荷状況の確認、在庫は計上しない
予定外入荷結合したときの見え方実績にだけ行がある主な後工程発注の有無を確認、返品または受入登録
品番違い疑い結合したときの見え方予定のみの行と実績のみの行が対になる主な後工程現物のラベル確認、取引先へ誤送の確認

品番違いは、結合の結果だけを見ると「未着」と「予定外入荷」が1件ずつ出る形になります。この2件を別々の問題として処理すると、取引先には「未着の問い合わせ」と「身に覚えのない荷物の連絡」が別々に飛び、話が噛み合いません。同じ入荷予定番号の中で、予定のみの行と実績のみの行が1組だけあり、数量も同じなら、品番違いとして1件にまとめます。判定の根拠が弱いので「疑い」と付けて、人が現物のラベルを見て確かめる行として残します。

ここでの数量違いは、入荷予定に対して検品数が少ない・多いだけの行です。破損や汚損で検品に通らなかった数量を別の列で持っているなら、検品実績の数量は「合格数」と「受入総数」のどちらかに揃えてから結合します。この揃え方を決めずに渡すと、数量不足の中に「届いたが不合格にした分」が混ざり、取引先への連絡内容を誤ります。

前提:CSVの形と、Claudeで使える環境

必要なのは2つのCSVです。列は最小限で足ります。

  • 入荷予定(asn.csv):入荷予定番号、品番、予定数量
  • 検品実績(receipt.csv):入荷予定番号、品番、検品数量

実際のWMSや検品アプリの出力には、ロット、賞味期限、パレット番号などの列がつきます。最初の分類には使わないので、渡す前に落とすか、Claudeに「この列は使わない」と書いておきます。

Claude.aiで試す場合、コード実行とファイル作成の機能を使います。Free・Pro・Maxでは、Settings > Capabilitiesで「Code execution and file creation」をオンにします。TeamとEnterpriseでは組織の管理者が組織設定で切り替えるため、自分の画面に項目がなければ管理者に確認が必要です。サポート記事には、CSVやTSVをアップロードして分析できること、Excel(.xlsx)を作成して保存できること、ファイルの上限が1ファイルあたり30MBであることが書かれています。ファイル作成はプランの使用量を通常のチャットより多く消費するとも記載されているため、月次の全件を何度も流し直す使い方は避け、スクリプトを一度作って固定する流れが向いています。

Team・Enterpriseの新規組織では、ネットワークアクセスが既定でオフまたはパッケージマネージャーのみになります。この手順のスクリプトは外部通信を必要とせず、追加パッケージも要りません。APIのコード実行ツールの実行環境も、インターネット接続はなく、pandasやopenpyxlなどのライブラリが入った状態で動くと説明されています。ネットワークを閉じた組織でも、同じスクリプトが動く構成です。

ステップ1:Claudeに分類スクリプトを作らせる

2つのCSVをアップロードし、次のように依頼します。ポイントは、分類の定義と出力の形を依頼文の中で固定することです。「差異を調べて」とだけ書くと、毎回違う切り口の表が返ってきます。

添付の asn.csv(入荷予定)と receipt.csv(検品実績)を、
入荷予定番号+品番で突き合わせてください。
- 品番は全角半角・大小文字・前後の空白をそろえてから結合する
- 同じ入荷予定番号+品番の行が複数あれば数量を合算する
- 区分は次の5種類に限る
  一致 / 数量不足 / 数量超過 / 未着候補 / 予定外入荷
- 同じ入荷予定番号で、予定のみの行と実績のみの行が1組だけあり
  数量が同じなら、両方を「品番違い疑い」に変える
- 結果は diff_result.csv に出力する(列: 入荷予定番号, 品番,
  予定数量, 検品数量, 区分, 差分)
- 判定はコードで行い、あなたの推測で区分を変えない
- 区分ごとの件数を最後に示す

最後の2行が重要です。区分をコードの条件で決めさせれば、同じCSVを渡す限り同じ結果になります。区分の件数は、あとで人が検算するときの基準にもなります。

ステップ2:スクリプトを確かめる

Claudeが作るスクリプトは毎回同じ書き方にはなりません。次のコードは、上の依頼文の条件を満たす形で書いた一例で、ローカルのPython環境でも動かせます。Claude.aiで受け取ったスクリプトを読むときは、結合のキー、合算、品番の正規化、品番違いの条件の4か所が依頼どおりかを見ます。

import unicodedata
import pandas as pd
 
def norm(s):
    return unicodedata.normalize("NFKC", str(s)).strip().upper().replace("−", "-")
 
asn = pd.read_csv("asn.csv", dtype=str)
rcv = pd.read_csv("receipt.csv", dtype=str)
for df in (asn, rcv):
    df["asn_no"] = df["asn_no"].map(norm)
    df["item_code"] = df["item_code"].map(norm)
asn["qty_expected"] = asn["qty_expected"].astype(int)
rcv["qty_received"] = rcv["qty_received"].astype(int)
 
# 同じ入荷予定番号・品番の行は合算してから突き合わせる
asn = asn.groupby(["asn_no", "item_code"], as_index=False).sum()
rcv = rcv.groupby(["asn_no", "item_code"], as_index=False).sum()
 
m = asn.merge(rcv, on=["asn_no", "item_code"], how="outer", indicator=True)
 
def classify(r):
    if r["_merge"] == "both":
        d = r["qty_received"] - r["qty_expected"]
        return "一致" if d == 0 else ("数量不足" if d < 0 else "数量超過")
    return "未着候補" if r["_merge"] == "left_only" else "予定外入荷"
m["区分"] = m.apply(classify, axis=1)
 
# 同じ入荷予定番号で、予定のみの行と実績のみの行が1組だけあり数量が同じなら品番違いの疑い
for no, g in m.groupby("asn_no"):
    l = g[g["区分"] == "未着候補"]
    r = g[g["区分"] == "予定外入荷"]
    if len(l) == 1 and len(r) == 1 and l.iloc[0]["qty_expected"] == r.iloc[0]["qty_received"]:
        m.loc[l.index, "区分"] = "品番違い疑い(予定側)"
        m.loc[r.index, "区分"] = "品番違い疑い(実績側)"
 
m["差分"] = m["qty_received"].fillna(0) - m["qty_expected"].fillna(0)
out = m.drop(columns="_merge")
for c in ("qty_expected", "qty_received", "差分"):
    out[c] = out[c].astype("Int64")
out.to_csv("diff_result.csv", index=False, encoding="utf-8-sig")
print(out.to_string(index=False))

例データは次のとおりです。品番や数量は説明用に作ったもので、実在の取引ではありません。

asn.csv                       receipt.csv
A001,BLT-M8-30,200            A001,BLT-M8-30,200
A001,NUT-M8,200               A001,NUT-M8,180
A001,WSH-M8,500               A001,WSH-M8,500
A001,SCR-M4-12,300            A001,SCR-M5-12,300
A002,CBL-USB-1M,50            A002,CBL-USB-1M,50
A002,CBL-USB-2M,30

実行すると、次の結果になりました(pandasを入れたPython 3.12の環境で確認)。

python diff.py
asn_no  item_code  qty_expected  qty_received          区分   差分
  A001  BLT-M8-30           200           200          一致    0
  A001     NUT-M8           200           180        数量不足  -20
  A001  SCR-M4-12           300          <NA> 品番違い疑い(予定側) -300
  A001  SCR-M5-12          <NA>           300 品番違い疑い(実績側)  300
  A001     WSH-M8           500           500          一致    0
  A002 CBL-USB-1M            50            50          一致    0
  A002 CBL-USB-2M            30          <NA>        未着候補  -30

読み方は次のとおりです。NUT-M8は20個の不足で、取引先へ数量の確認をします。SCR-M4-12とSCR-M5-12は、数量が同じ300で対になっており、M4とM5の取り違えが疑われます。CBL-USB-2Mは検品側に行がなく、未着候補です。7行のうち一致は3行で、残り4行が人の見る対象になります。

ステップ3:コードの判定を読み合わせる

分類をコードに任せても、条件の置き方が現場に合わないと誤った仕分けになります。Claudeには、結果の表を渡して次の確認をさせます。

  • 区分ごとの件数の合計が、結合後の行数と一致しているか
  • 「品番違い疑い」が、同じ入荷予定番号の内側だけで対になっているか
  • 数量の差分の符号が、「検品数量 − 予定数量」で統一されているか
  • 品番の正規化で、別の品番を同一視していないか(ハイフンの有無が品番の違いを表す仕入先がある場合など)

最後の項目は、コードの側だけでは見つかりません。品番の表記ゆれをそろえる処理は、揃えすぎると別の品番を同じものとして扱ってしまいます。仕入先ごとに品番の体系が違うなら、正規化の規則を仕入先ごとに分けるか、規則の適用前後の対応表を出力させて目で確かめます。

落とし穴

品番違いの条件は『数量が同じ』に頼りすぎない

数量が同じ1組だけを品番違いとみなす条件は、候補を絞る目的の簡易な規則です。同じ入荷予定番号に未着の行が複数あれば、この条件には当てはまらず、品番違いの疑いも出ません。その場合は未着候補と予定外入荷が別々に残るので、人が現物のラベルと突き合わせます。条件を緩めて候補を増やすより、当てはまらなかった行を残す方が見落としを避けられます。

ステップ4:区分ごとに後工程へ振る

仕分けた結果は、区分の列で並べ替えるだけで担当別の一覧になります。Claudeには、区分ごとの連絡文面の下書きを作らせることもできます。ただし送る前に、人が内容を確認します。

後工程

区分ごとの振り先

  • 数量不足・超過

    取引先へ、予定数量と検品数量を並べて確認を依頼します。超過分は受け入れるか返品するかを、発注側の担当が決めます。

  • 未着候補

    別便で後から届く可能性があるため、まず出荷状況を確認します。届いていない間は、在庫を増やす処理をしません。

  • 予定外入荷

    発注の有無を調べ、発注がなければ返品の手配に進みます。現物は受入前の保管場所に分けておきます。

  • 品番違い疑い

    現物のラベルと梱包明細を見て、誤送かデータ誤りかを切り分けます。誤送なら、数量不足と予定外入荷の両方を1件の連絡にまとめます。

在庫の訂正は、人が確認して区分が確定してから行います。疑いの段階で在庫システムを動かすと、後で取り消す手間が増えます。受入の登録そのものはClaudeに任せず、検品担当と在庫担当の権限に残します。

仕分けの結果をExcelで持ち回りたい場合は、diff_result.csvをClaudeにxlsxへ変換させ、区分ごとにシートを分けてもらえます。Excelの中で作業するなら、Claude for Excelのアドインも選択肢です。Excel用のアドインはPro・Max・Team・Enterpriseが対象で、重要な計算は検証なしに使わないよう注意書きがあります。ファイルの形式やExcel上での扱いは、ABC分析で倉庫のロケーションを見直す手順に近い進め方で運用できます。

件数が多いとき、うまくいかないとき

1日の入荷が数千行を超えるなら、Claude.aiでのアップロードより、同じスクリプトを自社の環境で走らせるほうが安定します。アップロードには1ファイル30MBの上限があり、会話をまたぐたびにファイルを渡し直すことになるためです。スクリプトはClaudeに作らせて保存し、毎日の突合はローカルで実行します。Claudeには、出力された差異表の読み合わせと、連絡文面の下書きだけを依頼する分担です。

結果が毎回少し違うとき:区分を文章で説明しているのに、コードの条件として固定していない場合に起きます。依頼文の「判定はコードで行い、推測で区分を変えない」の一文を残し、条件の変更はスクリプトの修正として依頼します。

一致するはずの行が、予定外入荷と未着に分かれるとき:品番の表記ゆれが原因であることが多く、全角と半角、ハイフンの種類、前後の空白を確認します。正規化の前後の品番を並べた表を出力させると、原因が見つかります。

検品が何回かに分かれているとき:同じ入荷予定番号と品番の行が複数あれば、合算してから突き合わせます。合算の処理は、スクリプトの例に入っています。分納で後日届く分は、未着候補のまま残して構いません。

まとめ

入荷検品の差異仕分けは、結合と分類を決まった条件のコードに任せ、Claudeにはスクリプトの作成と結果の読み合わせを依頼する形が、結果のぶれを抑えます。区分の定義と振り先は先に決めておき、品番違いのように疑いの段階のものは、人が現物で確かめる行として残します。差異の原因の断定や、在庫の訂正は人の判断に置いたまま、取引先連絡の下書きまでを任せる使い方が、検品の現場に収まりやすい分担です。

この記事を共有:XはてブLinkedIn