過去の桐井戸端BBS (桐ver.8)
15277 変数の存在を調べる方法ありますか? 桐霧舞 2002/03/01-11:41
変数について教えてください。
変数を宣言すると初期値は未定義ですよね。
ある共通変数をいろいろなフォームの中で使いたいときに、
「該当する変数がなければ変数宣言をする」ということが可能でしょうか。
変数に値が入っているところに同じ変数を宣言してしまうと、未定義になってしまうのを防ぎたいのです。
よろしくお願いします。
15278 Re:変数の存在を調べる方法ありますか? ONnoji 2002/03/01-12:12
記事番号15277へのコメント
#変数と#SETの二つの関数を利用するとよいかもしれません。
外していたらすいません。

#変数( str 【 | , n 】 )
str で指定した変数の値を取り出します。
指定した変数が宣言されていなければ、未定義値を返します。

#SET( str , val )
str で指定した変数に値を代入します。
計算結果は、変数に代入した値と同じです。
変数が宣言されていなければ、未定義値を返します。
15279 Re:変数の存在を調べる方法ありますか? natsu 2002/03/01-12:43
記事番号15278へのコメント
>>「該当する変数がなければ変数宣言をする」ということが可能でしょうか。

>#変数と#SETの二つの関数を利用するとよいかもしれません。
変数が宣言されていれば、必ず何らかの値が入っていれば
ONnojiさんが回答されたとおりだと思います

変数宣言はされているが、その変数値は未定義である場合(&なんとか=#U)と始めから
 &なんとか が宣言されていない場合2種類がありそうです
ひとつの一括処理ファイルで同名の変数を2回宣言すると
「KU1151:変数名はすでに定義されています 」
で引っかかりますが...

どのような処理の中で、変数が宣言されているか不明なので
これもはずしているかもしれませんが

変数書き出しコマンドで、varファイルを書き出し、
拡張子をcsvに変更してから桐の表ファイルに変換して
そのtblに対象とする変数名があるかどうかを検索して
該当がなければ変数宣言をするイベントになるでしょうか

定型業務で使用するのであれば、いちいちこれをやるのも大変なので、
変数の種類がが多くなければ、桐の立ち上げ時に変数宣言を行う
一括処理を実行しておくとよいかもしれません

15280 Re:変数の存在を調べる方法ありますか? 桐霧舞 2002/03/01-12:59
記事番号15278へのコメント
なるほど!
#SETという関数はそのような使い方があるのですね。
目からうろこです。
早速ためしてみます。
15285 Re:変数の存在を調べる方法ありますか? 悲しげ 2002/03/01-15:58
記事番号15279へのコメント
どもっ、natsuさん

>変数宣言はされているが、その変数値は未定義である場合(&なんとか=#U)と
>始めから &なんとか が宣言されていない場合2種類がありそうです

これはそのとおりです。しかし

>ひとつの一括処理ファイルで同名の変数を2回宣言すると
>「KU1151:変数名はすでに定義されています 」
>で引っかかりますが...

にはならない場合の方が多いと思います。
試しに次の一括処理を実行すると
------------------------------
変数削除 共通
変数宣言 固有,文字列{&なんとか=""}
*変数宣言 固有,文字列{&なんとか="あ"}

if(#変数("なんとか")="")
 確認 "変数「なんとか」は未宣言または中味が空なのでここで(再)宣言します"
 変数宣言 固有,文字列{&なんとか}
 変数宣言 共通,文字列{&なんとか}
 変数宣言 固有,長整数{&なんとか}   /*★*/
else if(&なんとか<>"")
 確認 "変数「なんとか」は宣言済で、その中味は「"+&なんとか+"」です"
end
------------------------------
★印の行でエラーとなります。Win桐では、同名変数でも種別が異なっていれば
別変数と認識する仕様に変わっているようです。
ただし、同種でデータ型が異なればエラーとなります。
少なくとも同種でデータ型が同じであれば、同名変数を再宣言することは可能です(確かDOS桐でも)。
云ってみれば「上書き」ですね。ですから、
  #変数("なんとか")=""
で判断する場合、元の中味が空なので、上書き再宣言しても支障ないことになり、
判断のネタとしては私は妥当なような気がしないでもありません。

>桐の立ち上げ時に変数宣言を行う一括処理を実行しておくとよいかもしれません

一般的には仰るとおりです。
ただ、イベントだと、イベント手続き内でだけ有効な「自動変数」もけっこう便利ですよ。
既存変数と同名でもかまわないし(あえて同名にする必要はないが)、
何よりも他の処理に影響を与えない(受けない)ので、その辺りは適材適所に
使い分けるのがベターかと思います。(^^)
15288 Re:変数の存在を調べる方法ありますか? natsu 2002/03/01-17:22
記事番号15285へのコメント
悲しげさん ご指摘ありがとうございました

私の場合、一括処理を書いていると、よく変数の二重宣言をやってしまって
エラーがでてしまいます  まあ、ただの不注意ですが...

これも自分の経験ですが コマンドコマンドを使用して
表の項目名を変数宣言して、フォーム間で受け渡しを行う場合が多いので
変数名には苦労することが多いです
15290 同名変数エラー 悲しげ 2002/03/01-19:18
記事番号15288へのコメント
どもっ、natsuさん
一番起こりがちなのは、同種・同名の中でも整数/長整数/数値の違い辺り
ではないかと思います。
  変数宣言 長整数{&a} /*種別を省略すれば固有変数*/
  変数宣言 共通,数値{&a}
  *  (中略)
  変数宣言 固有,長整数{&a} /*実は「上書き」的宣言*/
は大丈夫なのに
  変数宣言 固有,数値{&a}
  *  (中略)
  変数宣言 長整数{&a} /*種別を省略すれば固有変数*/
でエラーになって、レレレとか。(^^;)

この点だけ気を付けていれば、KU1151エラーにはさほど出会いません。
でも、なるべく別名にしておいた方が無難でしょうね。(^^;)

15292 Re:同名変数エラー、むしろ・・・ 悲しげ 2002/03/01-20:45
記事番号15290へのコメント
しつこくすいません。
同名変数では、エラーが出てくれた方がむしろ有り難いかもしれませんね。
同種同名同データ型変数で上書きになっていたり、異種同名変数が併行して
いることに気が付かないでいる方が、よほどレレレになりやすい可能性ありですもんね。
15298 Re:同名変数エラー、むしろ・・・ natsu 2002/03/01-23:11
記事番号15292へのコメント
>同種同名同データ型変数で上書きになっていたり、異種同名変数が併行して
>いることに気が付かないでいる方が、よほどレレレになりやすい可能性あり
>ですもんね。

ヘルプでは、

各種別で同じ名前の変数を宣言した場合、次の順番で検索され、最初に見つかった変数の値が参照されます。
自動
局所
固有
共通

同名変数を使用して、更にこれを考えながら、一括なりイベントなり組んでいると、確かにレレレですね
よっぽど気合いを入れないと、相当挙動不審になりそうです
15300 Re:接頭辞を付けるといいですよ。 ONnoji 2002/03/02-08:03
記事番号15298へのコメント
natsuさん
途中から割りこみで失礼します。m(__)m

natsuさん、はじめまして。

同名の変数で困らないようにするには、変数の有効範囲(スコープ:scope)によって、
接頭辞を付けるといいですよ。

自動 &名前  接頭辞は付けない
局所 &m名前 接頭辞 "m" を付ける:モジュール=フォームの意味
固有 &g名前 接頭辞 "g" を付ける:グローバルの意味
共通 &p名前 接頭辞 "p" を付ける:パブリックの意味

その他に、変数のデータ型を示す接頭辞を併用するとより明確になります。
ただし、面倒ですが…(^^ゞ

(例)&str名前 &mstr名前 &gstr名前 &pstr名前

私はMSのVBのヘルプを参考にしています。ただし、"p"は創作しました。
15313 Re:接頭辞を付けるといいですよ。 natsu 2002/03/03-13:04
記事番号15300へのコメント
ONnojiさん どうもありがとうございます

変数のデータ型なんですが、長整数と整数の違いで
処理を止めてしまうことがありまして...

なんとか.cmdという一括処理を書くときは、なんとか_変数.tblという
表を同時に開いて、変数名は項目計算式にして接頭・接尾辞を合成すれば、
一括には変数名を貼り付けるだけだし、備考項目を付けておけば変数の管理も楽になるし
今度から使ってみようと思います

15318 Re:変数の存在を調べる方法ありますか? ntomi 2002/03/04-09:17
記事番号15280へのコメント
桐霧舞さん、こんにちは。

桐ver7.1,8であれば、次の関数が使えるかと思います。

 #配列要素数(str)
 str で指定した変数の配列要素数を調べます。
 指定した変数が配列変数でなければ、0 を返します。
 指定した変数が宣言されていなければ、-1 を返します。
 -- 桐ヘルプより抜粋 --

配列変数ではなくても、宣言されていなければ -1 を返してくれます。


戻る