Chapter7:変数値の保存・読み込み


変数値の保存についてですが
桐には "変数書き出し" , "変数読み込み" コマンドが準備されていますが次のような問題点があります。

1.変数を保存しているファイル("*.vax")の数が増えてくると管理が大変。保存内容を確認するには最悪 変数保存の全ファイルを開くことになる。
2.局所変数が保存できない。

そこでここでは、変数を保存するための表を準備して、"変数名" と "変数値" を保存してみます。


事前準備

〇 新たに表を1つ準備して次のように設定してください。
表ファイル名は ”変数保存表.tbx” といったとことでしょうか。
項目数は 2つ以上あればよいですね。 使用する項目は2つで、名称は "変数名" , "変数値" としましょう。

変数保存表定義 


〇 変数値の保存

それでは フォーム"郵便番号簿.WFX" を定義画面で開いて

 "txt読み込みファイル名" のオブジェクトの属性 → イベント → ソース値更新 をダブルクリックしてください。

ソース値更新イベントをダブルクリック 

イベントファイル "郵便番号簿.kex" が起動してつぎのように表示されます。

ソース値更新

*****

それでは 郵便番号を更新するためのファイルを選択した際に、その値を "変数保存表.tbx" に保存するソースを書いてみましょう。

----------

まず "名札 メイン" を次のように修正してください。
※ 必ず編集対象表 ( ここでは "郵便番号簿.tbx" )  を一旦変数に代入して、その変数を使って編集対象表を設定します。

名札 メイン

----------

次に "手続き定義開始 txt読み込みファイル名::ソース値更新()" は次のように記入してください。
"prc変数書出"の手続きも合わせて作成します。

変数書き出し 

---------  〇 手続き定義開始 txt読み込みファイル名::ソース値更新()

"名札 メイン" で設定した 変数  "&m編集対象表"  からファイル名を取得します。

15   変数宣言 自動,文字列 { &ファイル名 = #ファイル名( &m編集対象表 , 2 ) }     /* 2:ファイル名  */

16   変数宣言 自動,文字列 { &STRbak , &変数値 }
17   &STRbak = &STR          /* &STR の値を 自動変数 &STRbak に退避 */ 

" &STR " は 桐が標準で準備している組み込み変数です (共通変数なので注意が必要です)。

---------

19   &STR = &ファイル名 + "," + "m読み込みファイル名"   /* 保存変数名称:局所変数は使用するフォーム専用なので編集対象表名を付加。*/
21   &変数値 = #ファイル名( &m読み込みファイル名 , 1 )    /* 1:パス名とファイル名と拡張子  */

局所変数は使用するフォーム専用となるので、編集対象表名を一緒にして変数の名称とします。

ここでは "&STR" には "変数名"(局所変数の場合は、編集対象表名が付加されている 名称)、
"&変数値" には設定した読み込みファイルの "パス名とファイル名と拡張子" が値として代入されました。

----------

 引数に "変数名" と "&変数値" 、そして保存ファイルを指定して、その値を "prc変数書き出し()" に渡します。

23   手続き実行 prc変数書出( &STR , &変数値 , &m変数保存表 )   /* 変数名称、変数の値、変数を保存する表、の順に並べてみました。*/

*****

ヒント:データ型
変数の値が文字列以外の場合には、#文字列( &文字列以外の変数値 )と文字列に変換して保存します。
 → 手続き実行 prc変数書出( &STR , #文字列( 文字列以外の値│変数もOKです ) , &m変数保存表 )
そして値を変数に代入する際には #数値( &文字列に変換された変数値 )といった具合に、本来のデータ型に変換します。

ヒント:固有変数の場合、編集対象表名は不要
固有変数の場合保存する変数名にファイル名を付け加える必要はありません(付け加えるとトラブルの原因になるかと思います)。
&STR = &ファイル名 + "," + "g読み込みファイル名" ではなく そのまま  "g読み込みファイル名" とします
 → 手続き実行 prc変数書出( "g読み込みファイル名" , &変数値 , &m変数保存表 )

ヒント:変数別の命名ルールを決めておくと、混乱を避ける(思考を節約する)ことができます。
局所変数 → 接頭辞に " m " を付ける ( 変数宣言 局所 , 文字列 { &m局所変数名 } ): m はモジュールの頭文字。
固有変数 → 接頭辞に " g " を付ける  ( 変数宣言 固有 , 文字列 { &g固有変数名 } ) : g  はグローバルの頭文字。
共通変数 → 接頭辞に " p " を付ける  ( 変数宣言 共通 , 文字列 { &p共通変数名 } ) : p  はパブリックの頭文字。

ヒント:&STR
" &STR " は " &実行リターン " と共にフォーム間のデータをやり取りする際によく利用されているようです。
共に 桐の組み込み変数で、共通変数になります。代入した値が桐を終了するまで保持されるのでその対策を行って利用してください。
ここでは " &STRbak = &STR " とすることで " &STR " の値を "自動変数 &STRbak " に退避して使い終わったら元の値に戻しています。
* 文字列操作の関数 " #対応文字列 " なども参照しておきましょう。

*****

---------

" &STR " はここで使用する前の値に戻します。

28   &STR = &STRbak          /* &STRbakの値を 組み込み変数 &STR に戻す */

 

-------- 〇手続き定義開始 prc変数書き出し( 文字列 &変数名 , 文字列 &変数値 , 文字列 &変数保存表)

表 "変数保存表.TBX" の 項目名 [変数名] を "書き出す変数名" で検索して

一致するものがあれば、項目名 [変数値] を 更新します。
一致するものがなければ行を追加して  "変数名" , "変数値" を新しく保存します。

36   検索 [変数名] { &変数名 } , 終了状態 = &検索結果
37   if ( &検索結果 = 1 )
38    行訂正 [変数値] = &変数値
39   else
40    行追加 [変数名] = &変数名 , [変数値] = &変数値
41   end

---------

 完成したら フォーム郵便番号簿を通常の編集画面で開いて、所定のファイルを選択してみてください。

郵便番号更新ファイル名

そのあと "変数保存表.tbx" を開いて "変数名" と "変数値" が保存されているか確認してください。

MainMenu.tbx


〇 変数値の読み込み

フォーム "郵便番号簿" を起動したときに、保存している変数の値を読み込みます。

まず "郵便番号簿.WFX"を定義画面で開いて、コマンドボタン "cmdStartup " をワークスペースに配置します。属性は以下の通りです。

startup 

 

フォームの属性 → オプション → 実行コマンドの開始時に 作成した "cmdStartup " ボタンを登録します。

開始時実行コマンド

 

それでは ソースコードを書いていきます。次のように作成します。

起動時変数読み込み 

今までの学習で学んだ様に、順番に見ていけば大したことはないと思います。

 &表現式 = "*" + &WQ + &変数名 + &WQ + "*"  は "&表現式" を使わず
 &変数名 = "*" + &WQ + &変数名 + &WQ + "*"  とも書けますが、変数の値が変わるとデバッグが難しくなります。

"手続き定義開始 prc変数値読み込み()" の最後には次のメソッドを記入して、読み込んだ変数値をフォーム画面に反映させます。
 メソッド呼び出し @フォーム.変数変更()

ヒント:連続して変数値を代入する
 &STR = &ファイル名 + "," + "m読み込みファイル名"
 手続き実行 prc変数値代入文字列( &STR , &m読み込みファイル名 ) 

 &STR = &ファイル名 + "," + "m変数名2"
 手続き実行 prc変数値代入文字列( &STR , &m変数名2 ) 

 &STR = &ファイル名 + "," + "m変数名3"
 手続き実行 prc変数値代入文字列( &STR , &m変数名3 ) 

といった具合に、ただ続けて記載するだけです。

固有変数だったら
 手続き実行 prc変数値代入文字列( "g変数名1" , &g変数名1 )
 手続き実行 prc変数値代入文字列( "g変数名2" , &g変数名2 )
 手続き実行 prc変数値代入文字列( "g変数名3" , &g変数名3 ) 

といった具合です(変数値を検索する "一般手続き" に、局所変数や固有変数の種別はありません)。

ヒント:文字列以外の変数値を読み込む
以下の図ように 文字列用、数値用の "一般手続き" また整数用の "一般手続き" などと別々に作成して準備おきます

文字列以外の変数値 

* "一般手続き" 側にデータ型変換を組み込んでおくことで、もとの手続きでは単純に羅列するだけで済みます。

 &STR = &ファイル名 + "," + "m変数名1"
 手続き実行 prc変数値代入数値( &STR , &m変数名1 )  : &m変数名1 は数値型
 &STR = &ファイル名 + "," + "m変数名2"
 手続き実行 prc変数値代入文字列( &STR , &m変数名2 ) : &m変数名2 は文字型
 &STR = &ファイル名 + "," + "m変数名3"(数値型)
 手続き実行 prc変数値代入数値( &STR , &m変数名3 )  : &m変数名3 は数値型

 手続き実行 prc変数値代入文字列( "g変数名1" , &g変数名1 )  : &g変数名1 は文字型
 手続き実行 prc変数値代入数値( "g変数名2" , &g変数名2 )   : &g変数名2 は数値型
 手続き実行 prc変数値代入文字列( "g変数名3" , &g変数名3 )  : &g変数名3 は文字型

といった具合ですね。

 


参考)

1  名札    メイン
2  
3   変数宣言 局所,文字列 { &m編集対象表 = #一括パス名 + "郵便番号簿.tbx" }
4   オブジェクト操作 @フォーム.編集対象表 = &m編集対象表          /* 編集対象表は、メイン処理でのみ変更できます */
5  
6   変数宣言 局所,文字列 { &m変数保存表 = #一括パス名 + "変数保存表.tbx" }
7   変数宣言 局所,文字列 { &m読み込みファイル名 }
8  *
9  
10  手続き定義開始 cmdStartupClick( )
11   手続き実行 prc変数読込( &m変数保存表 )
12  手続き定義終了
13  
14  手続き定義開始 txt読み込みファイル名::ソース値更新()
15   変数宣言 自動,文字列 { &ファイル名 = #ファイル名( &m編集対象表 , 2 ) }     /* 2:ファイル名  */
16   変数宣言 自動,文字列 { &STRbak , &変数値 }
17   &STRbak = &STR          /* &STR の値を 自動変数 &STRbak に退避 */ 
18  
19   &STR = &ファイル名 + "," + "m読み込みファイル名"   /* 保存変数名称:局所変数は使用するフォーム専用なので編集対象表名を付加。*/
20   * 固有変数の場合、編集対象表名を付加する必要はありません。付加するとトラブルの原因になると思います。
21   &変数値 = #ファイル名( &m読み込みファイル名 , 1 )    /* 1:パス名とファイル名と拡張子  */
22  
23   手続き実行 prc変数書出( &STR , &変数値 , &m変数保存表 )   /* 変数名称、変数の値、変数を保存する表、の順に並べてみました。*/
24   * 手続き実行 prc変数書出( &STR , #文字列( 文字列以外の変数値 ) , &m変数保存表 )
25   * 変数の値が文字列以外の場合には、#文字列( &文字列以外の変数値 )と文字列に変換して保存します。 \
26    そして値を変数に代入する際には #数値( &文字列以外の変数値 )といった具合に、本来のデータ型に変換します。
27  
28   &STR = &STRbak          /* &STRbakの値を 組み込み変数 &STR に戻す */
29  手続き定義終了
30  
31  手続き定義開始 prc変数書出( 文字列 &変数名 , 文字列 &変数値 , 文字列 &変数保存表 )
32   変数宣言 自動,整数  { &exportTblNum ,  &検索結果 }
33  
34   表 &変数保存表        /* "変数保存表.tbx" を開く */
35   &exportTblNum = #IS表
36   検索 [変数名] { &変数名 } , 終了状態 = &検索結果
37   if ( &検索結果 = 1 )
38    行訂正 [変数値] = &変数値
39   else
40    行追加 [変数名] = &変数名 , [変数値] = &変数値
41   end
42   終了 表 &exportTblNum    /* "変数保存表.tbx" を閉じる */
43  手続き定義終了
44  
45  手続き定義開始 prc変数読込( 文字列 &変数保存表 )
46   変数宣言 自動,文字列 { &ファイル名 = #ファイル名( &m編集対象表 , 2 ) }     /* 2:ファイル名  */
47   変数宣言 自動,文字列 { &STRbak , &変数値 }
48   変数宣言 自動,整数  { &importTblNum }
49   &STRbak = &STR          /* &STR の値を 自動変数 &STRbak に退避 */ 
50  
51   表 &変数保存表        /* 変数保存表.tbx を開く */
52   &importTblNum = #IS表
53  
54   &STR = &ファイル名 + "," + "m読み込みファイル名"   /* 局所変数は使用するフォーム専用となるので編集対象表名も検索値の一部です。*/
55   手続き実行 prc変数値代入文字列( &STR , &m読み込みファイル名 )  /*  引数は 検索する値 , 値を代入する変数名 の順に並べてみました。 */
56   * 手続き実行 prc変数値代入数値( "固有変数の場合ファイル名を付加していない" , &g数値型の固有変数名 )
57  
58   終了 表 &importTblNum    /* 変数保存表.tbx を閉じる */
59   &STR = &STRbak          /* &STRbakの値を 組み込み変数 &STR に戻す */
60   メソッド呼び出し @フォーム.変数変更()
61  手続き定義終了
62  
63  手続き定義開始 prc変数値代入文字列( 文字列 &変数名 , 参照 文字列 &変数値 )
64   変数宣言 自動,文字列{ &WQ = #jis( #hex("22") ) }
65   変数宣言 自動,文字列{ &表現式 }                /* &表現式 をつかうことで、&変数名 の値を保持したままにできます */
66   変数宣言 自動,整数 { &検索結果 }
67  
68   &表現式 = "*" + &WQ + &変数名 + &WQ + "*"             /* 準備した &表現式に 式の値を代入しています */
69   検索 [変数名] _ &表現式 , 終了状態 = &検索結果
70   &変数値 = #u
71   if ( &検索結果 = 1 )
72    &変数値 = [変数値]
73   end
74  手続き定義終了
75  
76  手続き定義開始 prc変数値代入数値 ( 文字列 &変数名 , 参照 数値 &変数値 )      /* 整数と数値でもデータ型は異なります */
77   変数宣言 自動,文字列{ &WQ = #jis( #hex("22") ) }
78   変数宣言 自動,文字列{ &表現式 }                /* &表現式 をつかうことで、&変数名 の値を保持したままにできます */
79   変数宣言 自動,整数 { &検索結果 }
80  
81   &表現式 = "*" + &WQ + &変数名 + &WQ + "*"             /* 準備した &表現式に 式の値を代入しています */
82   検索 [変数名] _ &変数名 , 終了状態 = &検索結果
83   &変数値 = #u
84   if ( &検索結果 = 1 )
85    &変数値 = #数値( [変数値] )
86   end
87  手続き定義終了