配布しているソースにバグがありましたので入れ替えています。トップ行のコメントを参照してください。修正ソース(Form1.vb)と(database.vb)です。
前回は、メイン画面の表示部分について解説しました。今回は、各種機能ボタンの解説です。その前にリストビューやボタン等のコンテンツのNameは、コンテンツを配した際に既定名称が付きます(Button1とかListView1とか)。本来は、そのままにすべきではありません。ボタンなら先頭にbtnを付けたりリストビューならlvを付けたりと統一すべきです。たとえば登録ボタンなら「btnTouroku」とか。本ソフトは、自分のためだけのソフトなので既定のままにしています。仕事上のソースなら駄目ですね。なお、VisualBasicは親切なのでデザイン画面で名称を変えるとソースコードも自動で変えてくれます。試してみてください。
①登録ボタン
ListView1選択対象のデータを登録します。最終行は、新規追加、それ以外は、上書きとなります。処理は単純で①選択データを確定し②入力内容を取得③エラーチェック④登録⑤画面リセットの流れです。
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click 登録ボタンのイベントハンドラ
If ListView1.SelectedIndices.Count = 0 Then 未選択は何もしない
Return
End If
idxSelect = ListView1.SelectedIndices(0) 選択データ取得
Dim st As ST_BLEND ワーク用の器用意
st.init()
If idxSelect >= stBlends Then
'追加
Else
'既存
st.copy(stBlend(idxSelect)) 変更前の内容を取得 固有idが必要
End If
Select Case save(st) 入力内容を取得する エラーがある場合は、出る。
Case 1
MsgBox("焙煎豆の選択無し。", MsgBoxStyle.OkOnly Or MsgBoxStyle.Exclamation, Me.Text)
Return
Case 2
MsgBox("配合率が100%ではありません。", MsgBoxStyle.OkOnly Or MsgBoxStyle.Exclamation, Me.Text)
Return
End Select
web_WriteBlendDB(st) DB更新
'登録完了
lblSave.Visible = True 「登録完了」のラベルを表示
nsave = 30 タイマーイベントでカウントダウンし0でラベルを消している
Dim top As Integer = ListView1.TopItem.Index 画面リセット後にListView1の状態を戻すためまず可視トップ行のインデックスを退避している
'メインリスト
resetBlendList() 再表示
'登録したリスト
Dim idx As Integer = stBlends 選択すべき行を特定する
'idの指定あるのでインデックス取得
For i As Integer = 0 To stBlends - 1
If stBlend(i).id = st.id Then
idx = i
Exit For
End If
Next
'↓行変更しているので 更新確認イベント拾わないようにする
idxBlendNow = -1
'※[追加]あるので履歴数が0ということは無い
ListView1.Items(idx).Selected = True 選択すべき行を選択状態にする
ListView1.Select()
'一旦解除
ListView1.EnsureVisible(ListView1.Items.Count - 1) 可視トップ行を再設定
ListView1.EnsureVisible(top)
resetDetail() これ要らないかも
End Sub
②削除ボタン
ListView1選択対象のデータを削除します。処理は単純で①選択データを確定し②確認問い合わせ③削除④画面リセットの流れです。ほぼ登録処理と同じです。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If ListView1.SelectedIndices.Count = 0 Then 選択していなれければ何もしない
Return
End If
idxSelect = ListView1.SelectedIndices(0) 選択行を取得
If idxSelect >= stBlends Then
'追加
Return 最下行は新規追加なので何もしない
Else
'既存
End If
Dim st As ST_BLEND これ要らない 登録処理コピーして作ったので無駄なのが残ったままになってた
st.copy(stBlend(idxSelect)) これ要らない
If MsgBox("削除します。", MsgBoxStyle.YesNo, Me.Text) <> MsgBoxResult.Yes Then 問い合わせ
Return
End If
'削除
web_deleteBlendDB(idxSelect) インデックスを渡して削除している この中でメモリからも削除している
'メインリスト
resetBlendList() リストを再表示
'↓行変更しているので 更新確認イベント拾わないようにする 以下で選択を最下行の追加にしている
idxBlendNow = -1
'※[追加]あるので履歴数が0ということは無い
ListView1.Items(stBlends).Selected = True
ListView1.Select()
ListView1.EnsureVisible(stBlends)
resetDetail()
End Sub
③複写ボタン
ListView1選択対象のデータを複製して新規登録します。コピー元をベースにして焙煎豆を変えたり配合率を変える場合に重宝します。処理は単純で①選択データを確定し②ブレンドデータをコピーし固有idをクリア③登録④画面リセットの流れです。これもほぼ登録処理と同じです。
Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
If ListView1.SelectedIndices.Count = 0 Then 選択していなれければ何もしない
Return
End If
idxSelect = ListView1.SelectedIndices(0) 選択行を取得
If idxSelect >= stBlends Then
'追加
Return 最下行は新規追加なので何もしない
Else
'既存
End If
Dim st As ST_BLEND コピー用の器を用意
st.copy(stBlend(idxSelect)) コピー
If MsgBox("複写します。", MsgBoxStyle.YesNo, Me.Text) <> MsgBoxResult.Yes Then 問い合わせ
Return
End If
st.id = 0 元データの固有idをクリアして新規登録としている
Cmn_GetDate(st.ymd) ブレンド日付を今日にする
st.taste.init() 評価もクリア
st.todo = 0 Todoもクリア
st.finished = 0 製品レベルフラグもクリア
st.taste.memo = stBlend(idxSelect).id.ToString & "のコピー" & vbCrLf メモにどのブレンドデータが元になっているか分るように固有idを記録しておく
ちなみに 「vbCrLf」は、改行コードでこのままDBに格納される。
web_WriteBlendDB(st) 登録
'メインリスト
resetBlendList() リストを再表示
'↓行変更しているので 更新確認イベント拾わないようにする
idxBlendNow = -1
'※[追加]あるので履歴数が0ということは無い
ListView1.Items(stBlends).Selected = True リスト再表示後に最下行を選択しているが追加した行にしたほうが良いかも。
登録関数で追加したデータの固有idが返ってくるのでそれを使い何番目かidxを確定して選択すればよい。(ブレンド日でソートしているため最後とは限らないため)
ListView1.Select()
ListView1.EnsureVisible(stBlends)
resetDetail()
End Sub
④「×補完」
選択したブレンドデータで×表示(欠品)になった焙煎豆を在庫豆に置き換えます。このボタンは、一度評価が完了したブレンドデータに対して使用してはいけません。複写ボタンで追加し、これから評価するブレンドに対して使用するボタンです。結構便利です。この処理の手順は、①ブレンドデータの焙煎データ一覧の中にdeleteflag=1を探す。②その焙煎データと同じ種類の豆(beanmasterID)を持ち And 焙煎度が同じ And deleteflag=0 の焙煎データを上から順に検索しあれば入れ替える。③入れ替えたら配合率欄の表示を入れ替える。という処理を行います。ここで悩んだのは、同種の在庫を探すときに豆種(beanmaster)にしたことです。本来は、購入データ(bean)にすべきかもしれません。ただ私の場合は、数kg単位でしか購入しないため入れ代わりが激しく検索してもヒットしない確率のほうが多いので豆種が同じなら「まぁいいか」となりました。あくまでも補完なのでこれでいいでしょう。
Private Sub Button10_Click(sender As Object, e As EventArgs) Handles Button10.Click
'焙煎リストチェックしているidxをリストアップ
Dim idxs() As Integer = {-1, -1, -1, -1, -1}
Dim b As Boolean = False
For i As Integer = 0 To ListView2.CheckedIndices.Count - 1 欠品があるかをチェック
idxs(i) = ListView2.CheckedIndices.Item(i)
If stCoffee(idxs(i)).deleteflag = 1 Then
b = True
End If
Next
If b = False Then
Return 欠品がないので何もしない
End If
If MsgBox("欠品焙煎を在庫に置き換えます。", MsgBoxStyle.YesNo, Me.Text) <> MsgBoxResult.Yes Then 実行問い合わせ
Return
End If
'この焙煎の中で欠品を入れ替える
For i As Integer = 0 To idxs.Length - 1
If idxs(i) < 0 Then
Continue For
End If
'欠品じゃなければスキップ
If stCoffee(idxs(i)).deleteflag = 0 Then
Continue For
End If
'この焙煎と同じ豆(stCoffee(j).bean.beanmasterid)が同一 同じ焙煎baisenしかも欠品じゃない検索
For j As Integer = 0 To stCoffees - 1 焙煎データの先頭(古い順)から全件検索
If stCoffee(j).deleteflag = 1 Then
'欠品はスキップ
Continue For Forの先頭へジャンプ
End If
'豆の種類同一か
If stCoffee(j).bean.beanmasterid = stCoffee(idxs(i)).bean.beanmasterid Then 同じ豆種か判定 購入データが同じか判定するなら「~.bean.id」を比較すればよい
'焙煎度同じか
If stCoffee(j).baisen = stCoffee(idxs(i)).baisen Then 焙煎深度が同じか判定
'豆・焙煎度同じでしかも欠品なしなので入れ替え
'×の%
Dim per As Integer = blendPar(idxs(i))
ListView2.Items.Item(idxs(i)).Checked = False 元の欠品していた焙煎データのチェックを外す
blendPar(j) = per
skipblendParReset = True 焙煎データをチェックした際にイベント処理で配合率を0にしているのでそれをスキップするフラグを立てている
ListView2.Items.Item(j).Checked = True 新たな焙煎データをチェックする
Exit For
End If
End If
Next
Next
End Sub
以上でメイン画面の機能ボタン系の解説を終わります。それ以外のボタンやメニューは、サブ画面(子画面)を呼び出しての処理となるため次回は、子画面のソース公開と解説の記事です。
コーヒー談話
初めて生豆を購入したのは、4種類。わけも分らず自作の焙煎機をただカラカラ回して10数回。焙煎日や状態、それを使ったブレンド管理をエクセルで書いていたが次の生豆を購入した辺りで縦も横も無限に広がりつつあるセルに恐怖を感じ本ソフトの開発に着手しました。おかげで?豆の特徴も把握しやすくなり焙煎度も安定してきたように感じました。表にするということは、客観視できるということです。表にするからには、焙煎深度だったり味の評価だったり具体的に分ける必要があり自然と経験値も上がります。美味しいブレンドができないと悩んでいても表を見れば「だってあんたこの焙煎深度やってないじゃん」とか「不味いのわかっててまたこれとこれ混ぜたの?」とか教えてくれます。結構コーヒーライフが楽しくなってます。このソフトのおかげか?























































