過去の桐井戸端BBS (桐ver.9)
22489 「#未定義」関数の意味がよくわからないので教えてください 桐本 2003/09/27-11:36
#未定義の意味がよくわかりません
わかるような簡単な説明がほしいです
22490 Re:教えてください 宮城 2003/09/27-12:08
記事番号22489へのコメント
桐本さん、こんにちは。

関数だから戸惑うんですかね。関数っぽくいうと、いわゆるヌル
(文字で表現すれば"")を常に返します。

(ということだと思ってるんですが。はて?)

22491 Re:教えてください 宮城 2003/09/27-12:17
記事番号22490へのコメント
つまり、ヌルと同値。こういう使い方になります。

ケース([氏名]="")
 ・・・こうするとかの記述・・・

ケース([氏名]=#未定義)
 ・・・こうするとかの記述・・・

同じ意味です。
22492 Re:#未定義について教えてください うにん 2003/09/27-13:05
記事番号22491へのコメント
項目値でいえば、データが何も入っていないのが#未定義です。

数値の場合""だと
ケース([数値]="")
とやると数値と文字列を比較しているようで違和感があるので
ケース([数値]=#未定義)
と書けます。

22493 お礼  桐本 2003/09/27-16:26
記事番号22489へのコメント
返信

うにんさん  宮城さん どうもありがとうございました。
  よくわかりました!
22494 【補足】未定義値について 佐田 守弘 2003/09/27-22:52
記事番号22489へのコメント
桐本さん
宮城さんとうにんさんの説明で理解された様ですが、重要な問題なので少し補足します。

●未定義値とは
既にコメントされている通り、未定義値は、値が定義されていないヌルの状態です。
文字列のヌルストリングは、分りやすいと思いますが、要するに文字列の長さがゼロの状態です。
空白は空白という文字なのですが、未定義値の文字列は、
空白文字も含めて、文字そのものがない(従って長さが0)の状態です。
一方、数値の場合ですが、数値(整数でも同じ0は、0の値を記述するバイナリコードで表されますが、
未定義値は文字列のヌルストリングと全く同じで、何も書かれていない状態です。

では表の上にはどう書かれているかですが、項目値が書き込まれる場所に、
項目値が未定義の場合には、全く何も書かれていません。
ちょうど、在籍者ではあるけど、座席が作られていない様な状態と考えて
貰うと分りやすいと思います。

●「#未定義」関数と「#定義」関数の大きな違い
「#未定義」関数は、未定義値を返す関数です。値ですから、項目値や変数
に代入したり、比較式の比較値としても記述できます。

一方、「#定義」関数は、比較式の中で使用し、項目値ないしは変数値が
未定義でない事を判定しする関数です。その項目値や変数値が未定義でない時には真(1)、
未定義の時には、偽(0)が論理値として返されます。

つまり、未定義という値(つまり未定義値)は値としてありますが、定義というのは、
項目値や件数値の状態であって、値ではありません。

例として
 1) 条件 ([名前]<>#未定義)
 2) 条件 ([名前]=#定義)
上記の2つは、結果として同じ判定になります。しかし、この2つは判定の
仕組みが違います。仮に[名前]が"桐村"だとします。
1)では"桐村"と未定義値を比較して、値が異なるのでこの条件は成立すると判断します。
2)では、[名前]に"桐村"という値が入力されている(定義状態)から、この条件が成立すると判断されます。

佐田守弘(KS-00119)
22495 Re:【補足】未定義値について hidetake 2003/09/28-06:35
記事番号22494へのコメント
あまり細かい事を書くと,かえって混乱させるかも知れないですけど
他の BD を扱ったり,他の DB との連携の場合で,桐だけの認識では困る場合もあるので・・・ (^^;

>文字列のヌルストリングは、分りやすいと思いますが、要するに文字列の長さ
>がゼロの状態です。空白は空白という文字なのですが、未定義値の文字列は、
>空白文字も含めて、文字そのものがない(従って長さが0)の状態です。

これは「桐」の場合は!と言う前提がつきますね。

他の DB の場合は「NULL」(#未定義)と「長さ 0 の文字列」("")を
区別するのが普通です。桐の場合は #未定義 と "" が同一であるのですが,そう行かない場合もあります。

例えば,桐でも「外部DB」を扱う場合は,この問題が生じますが,
桐は #未定義 と "" を区別しませんし,外部DB ではどちらも NULL としか扱ってくれません。
ですので,相手の DB (テーブル)の定義で,長さ 0 の文字列の入力は許可されているけど,
NULL値は許可されていないと桐からはデータの更新ができなくなってしまいます。
桐でも特に外部DB では #未定義 と "" を区別してくれないと困ってしまいます! (;_;)
22496 Re:【補足】未定義値について hidetake 2003/09/28-08:03
記事番号22495へのコメント
桐における「#未定義」の更なる神秘を求めて?
数値型に対する「#未定義」編

>一方、数値の場合ですが、数値(整数でも同じ0は、0の値を記述するバイナリ
>コードで表されますが、未定義値は文字列のヌルストリングと全く同じで、
>何も書かれていない状態です。

数値型の変数・計算式等において「#未定義」は,時と場合によって
本来の NULL(#未定義) の働きをする場合と,そうでない(0を返す)
場合があります。

桐のテーブルには,数値型の項目にデータが全く入力されていない状態の処理を
「ファイル属性」の「未定義項目値処理」の設定で
「ゼロ」として扱うか「未定義」として扱うかの設定がありますが
#未定義 もこの設定の影響を受ける場面があります。

それは,「印字」コマンドの内部計算式で #未定義 を使う場合です。
状態によって,本来の #未定義 として扱われる場合と,0 として扱われる場合があります。
それは,「印字」コマンドを使う際に表が開かれている場合であり,
表が開かれていると,現在処理対象の「表」の「未定義項目値処理」の設定が
#未定義 の動作に影響します。
だから,数値型を対象に #未定義 を使う場合は,Windows版の桐の場合(DOS版の桐に対して仕様が変更された),
単純に #未定義 をNULL (#未定義) として動作するか 0 として動作するか言えない場合があります。
「印字」コマンドの中の未定義状態の処理(計算式)って結構複雑です。 :-)

この件に関しては,たゆーさんのところの下記コメント以下も参考
になるかと思います。(Windows版「桐」の印字コマンドのツリー)
http://www2u.biglobe.ne.jp/~s_tanaka/cgi-bin/bbs/bbs.cgi?function=logview_html&no=79#3911

戻る