[DB]在庫管理バーコード Stock3

Database

どうも。つじけ(tsujikenzo)です。このシリーズでは「在庫管理バーコード」についてお届けしています。社内マニュアル的な要素が強いですが、皆さんのお勤め先でも使えるアイディアになれば幸いです。

前回のおさらい

前回は「現場棚卸とデータベースの突合作業」の前半戦として必要なデータを準備しました。具体的に言うと「現場が拾ってきたバーコードリーダーデータ」[mappedValues]と「社内在庫表データベースにあるバーコードデータ」[stockValues]の2つです。

[DB]在庫管理バーコード Stock2
どうも。つじけ(tsujikenzo)です。このシリーズでは「在庫管理バーコード」についてお届けしています。社内マニュアル的な要素が強いですが、皆さんのお勤め先でも使えるアイディアになれば幸いです。前回のおさらい前回は「在庫管理バーコード」

今回はこれらを突合していきたいと思います。

リーダーが拾ってくるデータ

リーダーからのバーコードはスプレッドシートを使って商品ID納品書番号(事情により桁数を変更しました)に分割できています(分割する関数ができあがっています)。配列[mappedValues]には、

商品ID・・・・mappedValues[i][1]
納品書番号・・mappedValues[i][2]

が格納されていました。

社内データベースのデータ

突合したい元データになる配列[stockValues]にはこのような要素が格納されていました。

商品ID・・・・stockValues[i][5]
納品書番号・・stockValues[i][10]

2つの配列の突合

ということは、

  1. mappedValues[i][1]がstockValues[i][5]に含まれており、
  2. かつmappedValues[i][2]がstockValues[i][10]に含まれていれば

良さそうです。

for文をネストすればいいんでしょうけど、配列のインデックスがマジックナンバーになってしまっているし、1レコードにつきstocksValuesを全件検索していて、野暮ったいです。。。これはどうしましょうか。

objArray化

色々考える前に、とりあえずobjArray化してから考えましょう笑。

let id = 'SSのID';
const stocksObject = SpreadsheetDataConverterToObject.getElementsArray(id,'シート1');
console.log(stocksObject);

このようなオブジェクト化配列が取得できます。(一部抜粋)

[ { No: 'No',
    '品名': '品名',
    '品種': '品種',
    '部品ID': '部品ID',
    'ID入力': 'ID入力',
    '数量': '数量',
    '検証': '検証',
    '納品書番号': '納品書番号',
    '棚卸': '棚卸' },
  { No: '',
    '品名': '【1本】【12月】特別純米 1800ml',
    '品種': '鬼殺し 特別純米',
    '部品ID': 'JK1899',
    'ID入力': 114,
    '数量': 1,
    '検証': '',
    '納品書番号': 554907824899,
    '棚卸': '' },
]

と言うことは、stocksObjectにfilterを掛けると良さそうです。

const filterdArray = stocksObject.filter(element => element['部品ID'] === 'JK1899');

このように在庫一覧表から、部品IDでフィルターを掛けた配列を準備できます。

[  { No: '',
    '品名': '【1本】【12月】特別純米 1800ml',
    '品種': '鬼殺し 特別純米',
    '部品ID': 'JK1899',
    'ID入力': 114,
    '数量': 1,
    '検証': '',
    '納品書番号': 554907824899,
    '棚卸': '' },
  { No: '',
    '品名': '【1本】【12月】特別純米 1800ml',
    '品種': '鬼殺し 特別純米',
    '部品ID': 'JK1899',
    'ID入力': 115,
    '数量': 1,
    '検証': '',
    '納品書番号': 554907824900,
    '棚卸': '' }
]

[filterdArray]にリーダーが拾ってきた下記情報が含まれるか、検索しましょう。

[mappedValues]
商品ID・・・・mappedValues[i][1]
納品書番号・・mappedValues[i][2]

んー。。。。。本当にこのまま突き進んでいいんでしょうか。。

突合アルゴリズムを考える

自分で悩みまくる前にやったこと

  1. ネットで調べる→以前から気になっていたアルゴリズムのサイトを再び見つけて、いつか勉強したいなぁと思った。(今やることではない)
  2. 社内Slackで聞いて見る→櫻庭君だけスタンプをくれたけど他は無し。
  3. Twitterで聞いて見る→ノンプロ研メンバーがとあるサイトを教えてくれた。結合してから検索するのが良さそう!

結果として3で教えてもらった方法が一番良さそうなのでやってみましょう。

ミニマムデータでやってみる

ちょっとObjArrayとかごちゃごちゃしてきたので、まずはミニマムデータを用意してシンプルなfunctionを作成してみようと思います。サンプルのスプレッドシートはこちら

左側のテーブルを結合してみます。.map()メソッドで一発です。

const leftValues = SpreadsheetApp.getActiveSheet().getRange("A2:B7").getValues();
const margedValues = leftValues.map(element => [element[0] + element[1]]);
console.log(margedValues);

無事結合できてるようですね。

[ [ 'ID001123456' ],  [ 'ID002123457' ],  [ 'ID002123458' ],  [ 'ID003123456' ],
  [ 'ID999987654' ],  [ 'ID001123457' ] ]

ObjArrayでもやってみます。

const objArray = SpreadsheetDataConverterToObject.getElementsArray('Sheet ID','シート1');
const mappedValues = objArray.map(element => [element['商品ID'] + element['納品書番号']]);
console.log(mappedValues);

無事結合できているようですね。(ライブラリめっちゃ便利💦)

[[ '商品ID納品書番号' ], [ 'ID001123456' ],  [ 'ID002123457' ],  [ 'ID002123458' ],  
[ 'ID003123456' ],  [ 'ID999987654' ],  [ 'ID001123457' ] ]

ちょっと長くなってしまったので、今回はここまでで。

まとめ

異なるテーブルの突合をどうやったら効率がいいのか、色んなやり方があると思いますが、結論は『頑張ってググっても分からない時は、一人で悩む前に人に聞け。』でした。結合するアイディアはとても良さそうですし、結合する為のmap()メソッドや、列を移動したり誰かにシートを変更されても対応が可能なSpreadsheetDataConverterToObjectライブラリはここでも便利に働いてくれそうです。

準備が整ったので、いよいよ突合本番と突合のパーツ化をしたいと思います。

このシリーズの目次

  1. [DB]在庫管理バーコード Stock1
  2. [DB]在庫管理バーコード Stock2
  3. [DB]在庫管理バーコード Stock3

Comments

Copied title and URL