---目的---
在庫情報など日々変わる数値をデータベースから読み込んで指定のデータに流し込んで
指定フォーマットで書き出しする。
使用インタープリタ:Python3.8
---投稿者の作業環境---
Windows10Pro 64Bit
コード
# !/usr/bin/env python
# -*- coding: utf-8 -*-
### 使用モジュール###
import sqlite3
import pandas as pd
import datetime
###### タイムスタンプの取得
ThisDate = datetime.datetime.today().strftime("%Y%m%d")
# CurStocks <<参照元の在庫マスタのデータベースを入れるデータフレーム用の変数
###### 在庫情報マスタを在庫参照元データフレームに変換
# ここでは、在庫参照元のデータをSQlite3形式のファイルから引っ張ってますが、
# お好きなな形式をPandasでデータフレーム変換してください。
dbpath = 'C:/参照元/在庫SQLite/Zaiko.db'
conn = sqlite3.connect(dbpath)
cursor = conn.cursor()
cursor=cursor.execute('SELECT * FROM TurnOver_Data')
CurStocks = pd.DataFrame(cursor.fetchall())
CurStocks.columns=["index", "商品名", "商品CD", "バーコード", "在庫"]
conn.close()
# (備考)↑上記のやり方「cursor.fetchall()」だと
# カラムのタイトルが抜けてしまうので、後から足してます。
# 参照元のデータは上記のカラムタイトルという前提で。
###### 流し込み先のSqlite形式のファイルを用意
print("●在庫連絡ファイルの更新")
dbpath = 'C:/流し込み先/得意先_在庫FMT.db'
conn = sqlite3.connect(dbpath)
df_files=("C:/流し込み先ベースファイル/得意先_在庫FMT.xlsx")
# エクセルファイルで別で流し込み先のリストを作ってますが、これは対象アイテムが増えた時など
# メンテしやすいようにエクセルファイルでベースのリストを作っておいて書き換えるというやり方の為
df = pd.read_excel(df_files,encoding="cp932")
Chlist = (df["JAN"].transpose())
# df["JAN"].transpose()<<「JAN」のデータを1件つづ読み込めるように変換してます。
# 流し込み先のカラムに読み取りキーとなる「JAN」というタイトルをつけてます。
###### 在庫参照用のデータを回して順次参照していく。
for item in Chlist:
CurStocksult = CurStocks.query('バーコード == @item')
#ここでさっき作った参照元のデータフレームのキーとなるJANコードを参照して回していきます。
#参照元カラム:「バーコード」 流し込み先:「JAN」というカラムのタイトル
#ここで参照元のデータフレームから1件つづ読み取りを行っていきます。
if len(CurStocksult) >= 1:
#在庫数カウント:参照元フレームに当該JANがある場合は、当該データ位置を参照
CurStocksult = (CurStocksult.iat[0, 3])
# インデックス番号の取得(2次配列のリストのデータ位置)
DFindex=int(df.query('JAN == @item').index.astype("int64").values[0])
if(CurStocksult) < 3 :
Buf = 0
df.iat[DFindex, 7] = "欠品"
else:
Buf=CurStocksult
df.iat[DFindex, 7] = ""
df.iat[DFindex, 6]=Buf
df.iat[DFindex, 8]=ThisDate
# 流し込み先の6列が在庫列、7列目がフラグ欄、8列目が更新したタイムスタンプという設定
df.to_sql("Stock_Data", conn, if_exists="replace")
df.to_csv('C:/更新した在庫データ.csv')
# SqliteとCSVを更新。
conn.close()
print("●更新を完了しました")
del df
del df_files
詰まったポイント等
1:ループ処理用のリストの作成
Chlist = (df["JAN"].transpose())
流し込み先のリストを1件づつ処理するために、流し込み先のキーとなるリストを
ループで回せるように変換したところ
2:インデックス番号の取得
DFindex=int(df.query('JAN == @item').index.astype("int64").values[0])
2次配列のリストのデータ位置(Y軸?)を取得するための変換処理