在庫管理

在庫管理システム-データベースへのアクセス

2022年10月21日

在庫管理システムでしようしているデータベースへの読み書きを記しておきます。

読み込み

次のようなテーブル(T_社員)があり、今「社員・鈴木一郎の社員コードを取得したい」とします。

ID社員コード社員所属
110000山田太郎管理部
210001鈴木一郎製造部
310002在庫花子営業部

SQLとしては下記を使用します。

sql = "SELECT * FROM  (テーブル名) WHERE (フィールド名)= '(パラメータ名)'"

具体的には

sql = "SELECT * FROM T_社員 WHERE 社員 = '鈴木一郎'"

これを汎用的にします。

sql = "SELECT * FROM " & strTable & " WHERE " & strField1 & "= '" & strParameter & "'"

パラメータ(strParameter)をシングルクォーテーション(’)で囲います。
文字列の連結には&を用います。
データベースから読み出す処理を関数(Function)にします。

Public Function ReadDatabase(ByVal strTable As String, ByVal strField1 As String, ByVal strParameter As String, ByVal strField2 As String) As String
    On Error Resume Next
    Dim sql As String
    Dim rst As DAO.Recordset
    
    sql = "SELECT * FROM " & strTable & " WHERE " & strField1 & "= '" & strParameter & "'"
    Set rst = CurrentDb.OpenRecordset(sql)
    ReadDatabase = rst.Fields(strField2)
    If IsNull(ReadDatabase) = True Then ReadDatabase = "" 'Nullだった場合の処理

    rst.Close
    Set rst = Nothing
End Function

上の関数の中で、引数strField2は読み出したい「社員コード」を入力します。
まず、確認のためにポップアップさせます

msgbox ReadDatabase("T_社員","社員","鈴木一郎","社員コード")

上記のように社員コード10001が表示されればOKです。VBAコード例を示します。
社員コードは数値ですので、文字列を数値に変換するValを使用します。
例ではInteger(厳密にはVal()はLong型なのでVal()をInt()で囲む)としていますが、数値の範囲によってはLongやSingleで宣言します。文字列ならStringです。

Dim int社員名 as Integer
int社員名 = Val(ReadDatabase("T_社員","社員","鈴木一郎","社員コード"))

書き込み

入出庫処理での例をまず示します。
AddNewは新しいレコードに書き込むことを意味します。既存のレコードのデータを書き換えるなら、ここにEditを用います。(他にもDeleteがあります)

    Dim rst As DAO.Recordset
    Set rst = CurrentDb.OpenRecordset("T_入出庫処理", dbOpenTable)
    With rst
        .AddNew
        .Fields("日付") = Me.txt_日付
        .Fields("品目コード") = Me.cmb_品目
        '~省略~
        .Update
        .Close
    End With

    Set rst = Nothing

下記が基本形です。

    Dim rst As DAO.Recordset
    Set rst = CurrentDb.OpenRecordset((テーブル名), dbOpenTable)
    rst.AddNew
    rst.Fields(フィールド名)=(書き込みデータ)
    rst.Update

Updateを忘れるとデータベースへ記録されません。
最後はCloseとNothingで閉じます。

    rst.Close
    Set rst = Nothing

上記例は

    rst.AddNew
    rst.Fields("日付") = Me.txt_日付
    rst.Fields("品目コード") = Me.cmb_品目
    '~省略~
    rst.Update
    rst.Close

rstが冒頭に付くコードが連続しますので、With~End Withステートメントで囲むと見やすいですし、コーディングも楽です。
書き込みも関数化できそうですが、引数が固定にならないため、ParamArray()を使わざるを得ませんのでやめました。

-在庫管理