第8回 食品番号で選択した食品のデータを一時保管する
 
 
     以前に作成した食品番号の入力画面(食品NO選択用.wfm)を用いて食品番号を入力し、その番号に該当する食品を絞り込み、その後、選択した食品を何g摂取したかという『摂取量』を入力して各栄養素のデータとその摂取量から実際の摂取量及び1日の総摂取量を計算して求めます。
その結果を一時的にファイルに保存するまでの過程を今回勉強します。
前のページへ

ホームページへ 
 
         
         
  前回作成した一括処理を修正して、より実用的な処理に変更します。

前回の一括処理ファイルは『食品の検索.cmd』というファイル名で保存しました。バックアップをとるために、デスクトップにでもコピーし、ファイル名を『食品の検索org.cmd』に変更しましょう。
変更後のファイルは自分のフォルダに移動し、『食品の検索.cmd』、『食品の検索org.cmd』という2つのファイルがあることを確認します。

その後、『WIN版・桐』を起動して、『食品の検索.cmd』という一括処理を訂正します。

変数宣言 共通 , 文字列{&食品NO , &食品名 , &ボタン名 , &NO1C , &NO2C , &NO3C}
変数宣言 共通 , 整数{&ハンドル1 , &ハンドル2 , &ハンドル3 , &NO1 , &NO2 , &NO3}
*---------------------------------------------------------------------------
* 以下の変数を宣言して追加した。
変数宣言 共通 , 数値{&使用量 , &廃棄率 , &Kcal , &KJ , &水分 , &タンパク質 , &脂質}
変数宣言 共通 , 数値{&糖質 , &繊維 , &灰分}
変数宣言 共通 , 数値{&Ca , &P , &Fe , &Na , &K , &レチノール , &カロチン , &VA , &VB1 , &VB2}
変数宣言 共通 , 数値{&ナイアシン , &VC , &食塩相当量} 
変数宣言 共通 , 文字列{&四群別 , &六群別 , &備考} 
変数宣言 共通 , 文字列{&栄養システムパス名} 
変数宣言 共通 , 整数{&終了キー} 
*---------------------------------------------------------------------------
名札 サブ1
*---------------------------------------------------------------------------
ウィンドウ作成 #CAT(&栄養システムパス名,"食品NO選択用.WFM") , 位置=(50 , 50) , \
サイズ=(550, 300),ハンドル=&ハンドル1 , カーソル位置=@テキスト_10
&栄養システムパス名 = "C:\栄養計算\"
表 #CAT(&栄養システムパス名,"成分表.TBL") , \
表番号 = 5 , モード = 専有 , \
使用フォーム = #CAT(&栄養システムパス名,"食品NO選択用.WFM") , \
リトライ = しない , \
終了状態 = &終了キー
繰り返し
    ウィンドウ会話 &ハンドル1 , カーソル=↓ 初期項目 = @テキスト_10 ,ボタン = &ボタン名
    条件(&ボタン名 = "コマンドボタン_13") 繰り返し中止
    ケース開始
        ケース(&ボタン名="コマンドボタン_10")
            手続き実行 食品の検索
        ケース(&ボタン名="コマンドボタン_11")
            手続き実行 食品の採用
        ケース(&ボタン名="コマンドボタン_12")
            手続き実行 変数初期化
    ケース終了
繰り返し終了
ウィンドウ終了 &ハンドル1
&ボタン名 = #UNDEF
終了 表 5
終了
*---------------------------------------------------------------------------
名札 食品の検索
*---------------------------------------------------------------------------
分岐(&NO1=#UNDEF .OR &NO2=#UNDEF) 食品の採用END
条件(&NO3C=#UNDEF) &食品NO = #CAT(#STR(&NO1,2),"-",#STR(&NO2,3))
条件(&NO3C<>#UNDEF) &食品NO = #CAT(#STR(&NO1,2),"-",#STR(&NO2,3),"-",&NO3C)

絞り込み [食品NO]=&食品NO

*---------------------------------------------------------------------------
&食品名 = [食品名]
* ここは検索機能のみなので、&食品名に[食品名]が代入されればよい。
* 各項目値を変数に代入する処理は次の採用処理部分で代入すればよい。
*---------------------------------------------------------------------------
*-- 次行・『ウインドウ作成』から『ウィンドウ終了』の処理は約1200件の食品データの中から
*-- 1件だけが絞り込まれたことを意識してもらうために書いたので、確認したら『注釈文』に
*-- してよい。

ウィンドウ作成 表 , 位置=(50 , 50) , \
                              サイズ = (550, 300) , \
                              ハンドル = &ハンドル2 , \
                              カーソル位置 = 先頭行
ウインドウ会話 &ハンドル2 , 初期項目 = [食品NO]
ウインドウ終了 &ハンドル2

&ボタン名 = #UNDEF
手続き終了
*---------------------------------------------------------------------------
名札 食品の採用
*---------------------------------------------------------------------------
分岐(&NO1=#UNDEF .OR &NO2=#UNDEF) 食品の採用END

キー入力 (1 , 1) - (10 , 60) , プロンプト = "摂取量は何gですか。" , モード = 無変換 , \
上書き = する , 初期値=#UNDEF , \
終了状態 = &終了キー , &使用量

&廃棄率 = [廃棄率]
&四群別 = [四群別]
&六群別 = [六群別]
&Kcal = [エネルギー]
&KJ = [KJ]
&水分 = [水分]
&タンパク質 = [タンパク質]
&脂質 = [脂質]
&糖質 = [糖質]
&繊維 = [繊維]
&灰分 = [灰分]
&Ca = [Ca]
&P =[P]
&Fe = [Fe]
&Na = [Na]
&K = [K]
&レチノール = [レチノール]
&カロチン = [カロチン]
&VA = [V.A]
&VB1 = [V.B1]
&VB2 = [V.B2]
&ナイアシン = [ナイアシン]
&VC = [V.C]
&食塩相当量 = [食塩相当量]
&備考 = [備考]

表 #CAT(&栄養システムパス名,"作業用01.TBL") 表番号 = 1 , 終了状態 = &終了キー
行挿入 [食品NO] = &食品NO , [四群別] = &四群別 , [六群別] = &六群別 , \
           [食品名] = &食品名 , [使用量] = &使用量 , [廃棄率] = &廃棄率 , \
           [エネルギー] = #四捨五入(&Kcal * &使用量 * 0.01,0) , \
           [KJ] = #四捨五入(&KJ * &使用量 * 0.01,0) , \
           [水分] = #四捨五入(&水分 * &使用量 * 0.01,1) , \
           [タンパク質] = #四捨五入(&タンパク質 * &使用量 * 0.01,1) , \
           [糖質] = #四捨五入(&糖質 * &使用量 * 0.01,1) , \
           [脂質] = #四捨五入(&脂質 * &使用量 * 0.01,1) , \
           [繊維] = #四捨五入(&繊維 * &使用量 * 0.01,1) , \
           [灰分] = #四捨五入(&灰分 * &使用量 * 0.01,1) , \
           [Ca] = #四捨五入(&Ca * &使用量 * 0.01,0) , \
           [P] = #四捨五入(&P * &使用量 * 0.01,0) , \
           [Fe] = #四捨五入(&Fe * &使用量 * 0.01,1) , \
           [Na] = #四捨五入(&Na * &使用量 * 0.01,0) , \
           [K] = #四捨五入(&K * &使用量 * 0.01,0) , \
           [レチノール] = #四捨五入(&レチノール * &使用量 * 0.01,0) , \
           [カロチン] = #四捨五入(&カロチン * &使用量 * 0.01,0) , \
           [V.A] = #四捨五入(&VA * &使用量 * 0.01,0) , \
           [V.B1] = #四捨五入(&VB1 * &使用量 * 0.01,2) , \
           [V.B2] = #四捨五入(&VB2 * &使用量 * 0.01,2) , \
           [ナイアシン] = #四捨五入(&ナイアシン * &使用量 * 0.01,1) , \
           [V.C] = #四捨五入(&VC * &使用量 * 0.01,0) , \
           [食塩相当量] = #四捨五入(&食塩相当量 * &使用量 * 0.01,1) , \
           [備考] = &備考

終了 表 1
*---------------------------------------------------------------------------
名札 食品の採用END
*---------------------------------------------------------------------------
手続き実行 変数初期化
手続き終了
*---------------------------------------------------------------------------
名札 変数初期化
*---------------------------------------------------------------------------
絞り込み解除

&NO1   = #UNDEF , &NO2   = #UNDEF , &NO3   = #UNDEF
&NO1C = #UNDEF , &NO2C = #UNDEF , &NO3C = #UNDEF
&食品NO = #UNDEF , &食品名 = #UNDEF , 使用量 = #UNDEF
&廃棄率  = #UNDEF , &Kcal     = #UNDEF , &KJ    = #UNDEF , &水分 = #UNDEF
&タンパク質 = #UNDEF , &脂質 = #UNDEF , &糖質 = #UNDEF , &繊維 = #UNDEF
&灰分 = #UNDEF , &Ca = #UNDEF , &P =#UNDEF , &Fe = #UNDEF , &Na = #UNDEF
&K = #UNDEF , &レチノール = #UNDEF , &カロチン = #UNDEF , &VA = #UNDEF
&VB1 = #UNDEF , &VB2 = #UNDEF , &ナイアシン = #UNDEF , &VC = #UNDEF
&食塩相当量 = #UNDEF , &備考 = #UNDEF , &ボタン名 = #UNDEF

手続き終了
*---------------------------------------------------------------------------
* End of File
*---------------------------------------------------------------------------


徐々に、いろいろな機能をつけていき、メインのメニューから今回の『食品の検索処理』というサブメニューに飛ぶようにする予定です。
しかしながら、今回ここでは先ず始めにこのフォーム内でのメニュー処理についして説明します。

このフォーム内の4つのボタンのうち、『終了』以外のボタンが押されたとき、押されたボタンによって処理を振り分け、再び、このフォームへ戻ってくること考えます。

終了のボタンを押したときのみ、データベースを閉じ、フォームも閉じるという処理をします。

このようなメニューの基本骨格は次のようになります。

変数宣言

ウィンドウ作成<使用するフォームの名前>, カーソル=<移動方向> 初期項目 = < @オブジェクト名> , ボタン = <ボタン名>  /*  ここは1行です */

表 <使用する表の名前>

繰り返し
    ウィンドウ会話 <ハンドル名>
    条件(&ボタン名 = "ボタン4") 繰り返し中止
    ケース開始
        ケース(&ボタン名="ボタン1")
            手続き実行 処理1
        ケース(&ボタン名="ボタン2")
            手続き実行 処理2
        ケース(&ボタン名="ボタン3")
            手続き実行 処理3
                ・
                ・
                ・
    ケース終了
繰り返し終了
ウィンドウ終了 <ハンドル名>
&ボタン名 = #UNDEF
終了 表 
終了

使用する変数を宣言することは必須事項ですが、先ず最初に『ウィンドウ作成』コマンドを使って、表示したいフォームファイルを指定します。
このコマンドでは、同時にカーソルの初期位置の指定(初期項目 = < @オブジェクト名>)、押されたボタンの名前を代入する変数の設定(ボタン = <ボタン名>)などを行います。

使用するデータベースを『』コマンドで指定します。

繰り返し』コマンドから『繰り返し終了』コマンドまでの間に挟まれた処理は終了条件が一致するまで繰り返されます。

今回の骨格説明用の図では、終了条件は『条件』コマンドで指定しています。
つまり、『ボタン4』という名称のボタンが押された場合に&ボタン名という変数へその値が代入され、&ボタン名という変数の内容を判断して『ボタン4』ならば繰り返しを終了するという処理です。

ウィンドウ会話』コマンドでフォームを表示しながら、押されたボタンを判断してそれぞれの処理に飛びます。

押されたボタンを判断するコマンドが『ケース』コマンドで、『ケース開始』コマンドと『ケース終了』コマンドで挟んで使用します。

ケース』コマンドはケース(条件式)の書式で用い、条件が一致した場合に次のコマンド(ここでは『手続き実行』コマンド)が実行されます。

手続き実行』コマンドは、複数のコマンドを並べた『手続き』(『WIN版・桐』では手続きといいますが、プログラム言語によっては『サブルーチン』とか、『モジュール』などと呼ばれています)を実行して、全て実行し終わると元の位置(手続き実行コマンドの次の行)に戻ってきます。

結局、これらの処理が繰り返し行われ、終了のボタンが押されるまではこのフォームを表示し続けて、ボタンに割り振られた処理(手続き)を何度でも繰り返し行うことができるのです。

最後に、『ウィンドウ終了 <ハンドル名>』でウインドウを閉じ、表も閉じて処理を終了します。

*-----------------------------------------------------------------------------
名札 食品の検索
*-----------------------------------------------------------------------------
分岐(&NO1=#UNDEF .OR &NO2=#UNDEF) 食品の採用END
条件(&NO3C=#UNDEF) &食品NO = #CAT(#STR(&NO1,2),"-",#STR(&NO2,3))
条件(&NO3C<>#UNDEF) &食品NO = #CAT(#STR(&NO1,2),"-",#STR(&NO2,3),"-",&NO3C)

絞り込み [食品NO]=&食品NO
*-----------------------------------------------------------------------------
&食品名 = [食品名]
*-----------------------------------------------------------------------------

&ボタン名 = #UNDEF
手続き終了

『食品の検索』という手続きの重要部分のみ再掲しました。一括処理中にもコメントした『注釈文にしてもよい部分(実は削除してもよい)』は省略しています。

説明が前後しますが、基本は『絞り込み』コマンドを用いて、[食品NO]と&食品NOが一致した場合に、そのデータのみを絞り込んで表示します。

絞り込みを解除するまでは、これ以後は該当したデータのみが処理の対象となります。

食品名という項目の項目値、つまり[食品名]を&食品名という変数に代入して、この手続きは終了します。

再度、繰り返しコマンド内の『ウィンドウ会話』コマンドにより該当した食品の&食品NOと&食品名がフォーム内に表示されます。

分岐』コマンドは、条件が一致したとき、名札で決められた場所(上の例では『食品の採用END』)まで飛びます(分岐します)。また、『条件』コマンドは条件に一致した場合のみ、条件コマンドで決められたコマンドを実行します。

上の例(最初の3行)の意味は各自考えてみましょう。
*-----------------------------------------------------------------------------
名札 食品の採用
*-----------------------------------------------------------------------------
分岐(&NO1=#UNDEF .OR &NO2=#UNDEF) 食品の採用END

キー入力 (1 , 1) - (10 , 60) , プロンプト = "摂取量は何gですか。" , モード = 無変換 , \
上書き = する , 初期値=#UNDEF , \
終了状態 = &終了キー , &使用量

&廃棄率 = [廃棄率]
&四群別 = [四群別]
&六群別 = [六群別]
&Kcal = [エネルギー]
       ・
       ・
       ・
途中省略
       ・
       ・
       ・
&ナイアシン = [ナイアシン]
&VC = [V.C]
&食塩相当量 = [食塩相当量]
&備考 = [備考]

表 #CAT(&栄養システムパス名,"作業用01.TBL") 表番号 = 1 , 終了状態 = &終了キー
行挿入 [食品NO] = &食品NO , [四群別] = &四群別 , [六群別] = &六群別 , \
           [食品名] = &食品名 , [使用量] = &使用量 , [廃棄率] = &廃棄率 , \
           [エネルギー] = #四捨五入(&Kcal * &使用量 * 0.01,0) , \
           [KJ] = #四捨五入(&KJ * &使用量 * 0.01,0) , \
           [水分] = #四捨五入(&水分 * &使用量 * 0.01,1) , \
           [タンパク質] = #四捨五入(&タンパク質 * &使用量 * 0.01,1) , \
           [糖質] = #四捨五入(&糖質 * &使用量 * 0.01,1) , \
           [脂質] = #四捨五入(&脂質 * &使用量 * 0.01,1) , \
           [繊維] = #四捨五入(&繊維 * &使用量 * 0.01,1) , \
           [灰分] = #四捨五入(&灰分 * &使用量 * 0.01,1) , \
           [Ca] = #四捨五入(&Ca * &使用量 * 0.01,0) , \
           [P] = #四捨五入(&P * &使用量 * 0.01,0) , \
           [Fe] = #四捨五入(&Fe * &使用量 * 0.01,1) , \
           [Na] = #四捨五入(&Na * &使用量 * 0.01,0) , \
           [K] = #四捨五入(&K * &使用量 * 0.01,0) , \
           [レチノール] = #四捨五入(&レチノール * &使用量 * 0.01,0) , \
           [カロチン] = #四捨五入(&カロチン * &使用量 * 0.01,0) , \
           [V.A] = #四捨五入(&VA * &使用量 * 0.01,0) , \
           [V.B1] = #四捨五入(&VB1 * &使用量 * 0.01,2) , \
           [V.B2] = #四捨五入(&VB2 * &使用量 * 0.01,2) , \
           [ナイアシン] = #四捨五入(&ナイアシン * &使用量 * 0.01,1) , \
           [V.C] = #四捨五入(&VC * &使用量 * 0.01,0) , \
           [食塩相当量] = #四捨五入(&食塩相当量 * &使用量 * 0.01,1) , \
           [備考] = &備考

終了 表 1
*-----------------------------------------------------------------------------
名札 食品の採用END
*-----------------------------------------------------------------------------
手続き実行 変数初期化
手続き終了

『食品の採用』という手続きでは、先ず始めに、『キー入力』コマンドで摂取量を入力します。変数名は『&使用量』となっています。
ここではまだ書いていませんが、&終了キーの値(押されたキーによって個別の値が代入されます)により、エラー処理など別々の処理ができます。

次に各項目値([糖質]や[脂質]など)がそれぞれの変数に代入されます。

絞り込んだ食品のデータと摂取量から計算された値は作業用のファイル(ここでは、『作業用01.TBL』)に、『行挿入』コマンドを用いて書き込みます。

実際には1行で記述してよいのですが、見にくいので分けて記述しています。

<<参考>>行末の¥
行末にある¥マークは次行も連結して1行とします。
ここでは、『行挿入』コマンドから『[備考] = &備考』という行までが連結されて1行になります。

<<参考>>『作業用01.TBL』の定義内容
『作業用01.TBL』の定義内容は次の通りです。『成分表.TBL』とほとんど変わらないので『成分表.TBL』をデスクトップにでもコピーし、ファイル名を『作業用01.TBL』と変更後、自分のフォルダーに移動してから違っているところを再定義して下さい。『NO-1』〜『NO-3』の項目がないだけです。


その後、『変数初期化』という手続きを実行して、各変数値を未定義にし、ここの手続きは終了され、元の場所へ処理が戻ります。

*-----------------------------------------------------------------------------
名札 変数初期化
*-----------------------------------------------------------------------------
絞り込み解除

&NO1   = #UNDEF , &NO2   = #UNDEF , &NO3   = #UNDEF
&NO1C = #UNDEF , &NO2C = #UNDEF , &NO3C = #UNDEF
&食品NO = #UNDEF , &食品名 = #UNDEF , 使用量 = #UNDEF
&廃棄率  = #UNDEF , &Kcal     = #UNDEF , &KJ    = #UNDEF , &水分 = #UNDEF
&タンパク質 = #UNDEF , &脂質 = #UNDEF , &糖質 = #UNDEF , &繊維 = #UNDEF
&灰分 = #UNDEF , &Ca = #UNDEF , &P =#UNDEF , &Fe = #UNDEF , &Na = #UNDEF
&K = #UNDEF , &レチノール = #UNDEF , &カロチン = #UNDEF , &VA = #UNDEF
&VB1 = #UNDEF , &VB2 = #UNDEF , &ナイアシン = #UNDEF , &VC = #UNDEF
&食塩相当量 = #UNDEF , &備考 = #UNDEF , &ボタン名 = #UNDEF

手続き終了

『変数初期化』という手続きについては、それほど説明は要らないでしょう。

まず最初に、『絞り込み解除』コマンドで絞り込みを解除し、今までは処理対象が1件の食品のみだったのですが、元の約1600件のデータ全てが処理対象となります。

次に文字通り、使用している変数を初期化して、未定義値とします。

これでこの手続きは終わるので、元に戻って、再度『ウィンドウ会話』コマンドでフォームが表示されます。
このとき食品NO欄や食品名の欄は当然空欄になります。

全ての一括処理を書き上げ、少し余裕が出た段階で再度エラー処理等を書き加えるかも知れませんが、とりあえず『成分表』データベースから食品番号でデータを絞り込み、摂取量の計算をして『作業用のファイル』に追加しながら保存できるようになりました。

今後は、1日分の食品を選択した後で、間違って選択してしまった食品を削除する処理を加えたり、1日分の各栄養素の摂取量総計を求める処理を作ります。

また、栄養診断を行う人の性別や年齢を入力後、栄養所用量と比較して自分の献立がどの程度正しいかなどをグラフ表示することなども考えたいと思っています。

   
         
    前のページへ    
    ホームページへ