過去の桐井戸端BBS (桐ver.9)
24868 イベントで配列変数を使って絞り込みをしたい しぼうかん 2004/02/15-20:57

お知恵をお貸し下さい。

&全番号[5]が宣言してあり、この変数には1〜5個の番号を入れます。
(※&全番号へは繰り返しコマンドで値を代入し、&全番号[3]が未定義の場合は
&全番号[4]と&全番号[5]も未定義になります。)

そして別テーブルにある[番号]という項目に対して、この配列変数に
入れた5つの値のどれかを含むレコードを絞り込む為に、以下の様な
イベント処理を書きました。

手続き定義開始 番号絞込::マウス左クリック(長整数 &マウス位置[2]・・・・
絞り込み [番号]{=#cond([番号]=&全番号[1].or[番号]=&全番号[2]\
.or[番号]=&全番号[3],[],[]=#未定義,"#未定義",1,#未定義)}
手続き定義終了

しかし要素数が多い変数を使って同様の処理をする場合には式が
ゴチャゴチャして見づらくなります。
もっとスマートな式がありますでしょうか?

24869 Re:配列変数を使っての絞り込み 通りすがり 2004/02/15-23:35
記事番号24868へのコメント
スマートかどうかは??ですが。

この配列変数の&全番号が数値型として、

>&全番号[3]が未定義の場合は&全番号[4]と&全番号[5]も未定義

にせず、数値を指定します。
例えば999とか、-999とか(未定義にしない)

元表に絞込み→条件名を設定します。事前に定義しておくのです。
条件1 &番号[1]
条件2 &番号[2]
・・・同様に条件5まで

んでもって、イベントでは、この条件名で絞込みを実行する。

手続き定義開始 番号絞込::マウス左クリック(長整数 &マウス位置[2]・・・・
 絞り込み 条件名 = "hogehoge"
手続き定義終了

ってのは?スマートじゃないよね?

未定義のデータは絞り込まないんですよね?

24870 Re:配列変数を使っての絞り込み うにん 2004/02/16-00:13
記事番号24869へのコメント

>元表に絞込み→条件名を設定します。事前に定義しておくのです。
>条件1 &番号[1]
>条件2 &番号[2]
>・・・同様に条件5まで

「要素数が多い変数を使って」と書いてるので、OR条件だと無理なことがあるかも。
最大10個ですね。

否定のAND条件に変えて補集合をとれば多くても大丈夫ですが、一度でやろうとすれば式が複雑になるのはしょうがないですね。

&i=1
&s=""
繰り返し (&番号[&i])
 &s=#文字置換(&s,&i,"<>&番号["+#STR(&i)+"]")
 &i=&i+1
 条件 (&i>#配列要素数("番号")) 繰り返し中止 
繰り返し終了
絞り込み [番号]_&s
絞り込み 補集合

スマートかどうかは疑問ですが。

24871 Re:配列変数を使っての絞り込み 通りすがり 2004/02/16-10:44
記事番号24870へのコメント
>「要素数が多い変数を使って」と書いてるので、OR条件だと無理なことがあるかも。
>最大10個ですね。

そうですよね〜。でも、

>&全番号[5]が宣言してあり、この変数には1〜5個の番号を入れます。
とあったから・・・。

この&全番号[]という配列変数で制御しようと思わず、検索用のインデックスを作れば?
例えば、文字列型で&検索用を作っておき、
この&全番号[]をループで作成するさいに、「,」区切りでデータの一覧を作る。

&検索用の中身は 2,45,7,5,9,1, なんてなるでしょうから、後は#対応番号で該当するデータがある場合に絞り込むとか?

数値を一旦文字列にする手間がかかりますけど。

というか、この検索のためだけに&全番号[]なる配列を作っているのであれば、管理方法を変えたほうがいいかも?
要素数が多くても対応できる方法を模索すべきです。


24872 Re:配列変数を使っての絞り込み ONnoji 2004/02/16-10:53
記事番号24868へのコメント
しぼうかんさん、こんにちは。

式を簡単にすると、その代償に準備作業が面倒になるのは仕方がないかもしれません。

なお、

 絞り込み [番号]{ ( #対応番号( &expression, #str( [番号] ) ) ) <> 0 }

という式は桐ver.8 sp6以降から使用可能だと思います。
つまり、桐ver.8 sp5以前ではエラーになる可能性があります。

*-------------------------------------------------------*
名札 メイン
 変数宣言 固有,数値{&全番号[5] = { 3,8,9,,}}



手続き定義開始 番号絞込::マウス左クリック(長整数 &マウス位置[2]・・・・
 変数宣言 自動,文字列{ &varName, &expression, &comma = #jis( #hex("2C") ) }
 変数宣言 整数,数値 { &i, &loop, &val }

 &varName = "全番号"
 &loop = #配列要素数( &varName )

 if ( &loop > 0 )

  繰り返し &i = 1, &loop

   &val = #変数( &varName, &i )
   if ( &val <> #u )
    &expression = &expression + #cond( &expression, &comma ) + #str( &val )
   end
  繰り返し終了

  if ( &expression )
   絞り込み [番号]{ ( #対応番号( &expression, #str( [番号] ) ) ) <> 0 }
  end

 end

手続き定義終了
*-------------------------------------------------------*

外していたらすいません。
24875 Re:配列変数を使っての絞り込み うにん 2004/02/16-12:22
記事番号24872へのコメント

なるほど。通りすがりさんも書いてるように、もし検索専用の値なら配列にせず最初から文字列にしておけば

>式を簡単にすると、その代償に準備作業が面倒になるのは仕方がないかもしれません。

ということがなくなりますね。

変数宣言 固有,文字列{&全番号 = "3,8,9"}

みたいに。

私の例は、条件名を使わないで1つの比較式にしてしまっていたので
OR条件を減らすというのと関係なくなってあまり意味がなかった。

データベース的なやり方としては、検索値を配列ではなく別のテーブルのレコードにしておいて、
併合:選択でやるのがいいんじゃないでしょうか。これならいくらでも可能。

24876 蛇足です。 ONnoji 2004/02/16-12:41
記事番号24872へのコメント
>なお、
>
> 絞り込み [番号]{ ( #対応番号( &expression, #str( [番号] ) ) ) <> 0 }
>
>という式は桐ver.8 sp6以降から使用可能だと思います。
>つまり、桐ver.8 sp5以前ではエラーになる可能性があります。

見直したら、括弧"( )"が一組余分でした。(^^ゞ

△ 絞り込み [番号]{ ( #対応番号( &expression, #str( [番号] ) ) ) <> 0 }
○ 絞り込み [番号]{ #対応番号( &expression, #str( [番号] ) ) <> 0 }

やはり、桐ver.8 sp5ではコマンドで書くとエラーです。
しかし、[絞り込み:比較式]ダイアログに

検索項目名:[番号]
比較式:#対応番号( "3,8,9", #str( [番号] ) ) <> 0 }
部分一致検索:しない

とすると桐ver.8 sp5でも実行されます。

この辺りは、桐ver.8 sp6 から履歴でもOKになるように構文解析が変更されたようです。

*--------------------------------------------------------*
名札 メイン
 変数宣言 固有,数値{&全番号[5] = { 3,8,9,,}}

* 
 
手続き定義開始 番号絞込::マウス左クリック(長整数 &マウス位置[2]・・・
 変数宣言 自動,文字列{ &varName, &expression, &comma = #jis( #hex("2C") ) }
 変数宣言 整数,数値 { &i, &loop, &val }
 
 &varName = "全番号"
 &loop = #配列要素数( &varName )
 
┌if ( &loop > 0 )

│┌繰り返し &i = 1, &loop
││
││ &val = #変数( &varName, &i )
││┌if ( &val <> #u )
│││ &expression = &expression + \
│││  #cond( &expression, &comma ) + #str( &val )
││└end
││
│└繰り返し終了

│┌if ( &expression )
││ 絞り込み [番号]{ #対応番号( &expression, #str( [番号] ) ) <> 0 }
│└end

└end
手続き定義終了
*-------------------------------------------------------------*

蛇足でした。(^^ゞ

24877 Re:蛇足です。 ONnoji 2004/02/16-12:52
記事番号24876へのコメント
>やはり、桐ver.8 sp5ではコマンドで書くとエラーです。
>しかし、[絞り込み:比較式]ダイアログに
>
>検索項目名:[番号]
>比較式:#対応番号( "3,8,9", #str( [番号] ) ) <> 0 }
>部分一致検索:しない
>
>とすると桐ver.8 sp5でも実行されます。

コピペを間違えました。
以下のように訂正します。

× 比較式:#対応番号( "3,8,9", #str( [番号] ) ) <> 0 }

○ 比較式:#対応番号( "3,8,9", #str( [番号] ) ) <> 0


24882 タイトル変更です。複数の値を使った絞り込み しぼうかん 2004/02/16-21:14
記事番号24868へのコメント
通りすがりさん、うにんさん、ONnojiさん返答ありがとうございます。

説明が悪くてすいません。
&全番号[5]じゃなくて&全番号[11]とでもしておけばよかったです。

いろいろな方法があるんですね。
どれも最初の投稿の方法よりスマートと言うかカッコ良い方法です。
紹介して頂いた皆さんのやり方をそれぞれ試してみました。
(※絞り込み条件方式を除く)
結果は全ての方法でうまく行きました。

そしてどの方法がいいか考えた結果、タイトルに偽り有りになってしまう
のですが、絞り込みの為の値を配列変数を使わずにコンマ区切りの文字列
として取得する方法が良さそうな感じがします。

そこで紹介して頂いたコマンドの書き方を参考に最初の投稿では省略した
絞り込みの為のコマンド部分も含めてこんな感じで書きました。
ただもう少し検証するつもりです。

※1)元々&全番号[5]に値を取得していた方法は、変数を使った絞り込みの
  後に繰り返しコマンドを使って取得していました。
※2)最終的にイベントで絞り込みをする表の名前はB.tblとします。
※3)B.tblで絞り込みをする為の値を取得する表の名前はA.tblとします。
※4)絞り込み[全番号取得用]{=&全番号絞込用}この行は&全番号を[全番号]
  から取得する為に必要なコマンドです。
※5)&全番号は数値,&全番号2は文字列で宣言済みです。


手続き定義開始 番号絞込::マウス左クリック(長整数 &マウス位置[2]・・・
表 "A.tbl"
絞り込み [全番号取得用]{=&全番号絞込用}
if(&選択件数>0)
&全番号=[全番号]
&全番号2=#文字列([全番号])
&i=1
繰り返し (&i=1)
検索 ∨,[全番号]{<>&全番号},終了状態=&i
if(&i=1)
&全番号=[全番号]
&全番号2=&全番号2+","+#文字列([全番号])
end
繰り返し終了
絞り込み解除 *
編集表 "B.tbl"
絞り込み [番号]{#対応番号(&全番号2,#文字列([番号]))><0}
ケース終了
手続き定義終了

24883 Re:タイトル変更です。複数の値を使った絞り込み うにん 2004/02/16-22:02
記事番号24882へのコメント

>※3)B.tblで絞り込みをする為の値を取得する表の名前はA.tblとします。

値が手入力などでなく最初から表に入っているなら

>手続き定義開始 番号絞込::マウス左クリック(長整数 &マウス位置[2]・・・
>表 "A.tbl"
>絞り込み [全番号取得用]{=&全番号絞込用}
>if(&選択件数>0)

>編集表 "B.tbl"

併合 "A.tbl",選択,編集表=する,{[番号]照合[全番号]}

>ケース終了
>手続き定義終了

みたいなのでできませんかね?

24903 Re:タイトル変更です。複数の値を使った絞り込み 通りすがり 2004/02/17-17:06
記事番号24882へのコメント
>&全番号[5]じゃなくて&全番号[11]とでもしておけば

5も11もあんまり変わらないというか・・・。50とか100だと思ってました。

>※3)B.tblで絞り込みをする為の値を取得する表の名前はA.tblとします。

この絞り込み条件のためだけにこの表を作成するのですか?
11個くらいのデータ数ですよね。
フォームから検索用のデータを拾う → 絞り込み条件用のA.tblに書出す →これから読みこんで「カンマ区切り」のデータを作成する
なんて手順なんでしょうか?
すなわち、フォームで拾った値で「or」の絞込みをしたい?
(と勝手に解釈したのですが)

たかだか11個くらいであれば(かつ、フォームでやってるのであれば)変数で持っていて、
イベントでこの「カンマ区切り」のデータを作成したらどうでしょうか?

もし、もっとあるのであれば(50とか100とか)、この表から、うにんさんのおっしゃるような併合を使う方がスマートかと・・・。


24913 Re:タイトル変更です。複数の値を使った絞り込み しぼうかん 2004/02/17-23:19
記事番号24882へのコメント
うにんさん、通りすがりさん、またお返事ありがとうございます。


>うにんさん

うにんさんに教えていただいた併合を使う方法はまだ出来ていませんが、
原因は多分説明した以外の部分にあるようです。
そこでもう2日ぐらい考えてみます。
もしどうにも解らなくなったときには又、質問させて頂きたいと思います。


>通りすがりさん

>フォームから検索用のデータを拾う → 絞り込み条件用のA.tblに書出す →
>これから読みこんで「カンマ区切り」のデータを作成する
>なんて手順なんでしょうか?

A.tblは絞り込み条件専用のtblでは無いのですが

>すなわち、フォームで拾った値で「or」の絞込みをしたい?
>(と勝手に解釈したのですが)

ここはその通りです。実はその絞り込みの後に置換も実行するのですが。

ただ何がしたいかの説明がだんだん難しくなってきたのでもう一度考えを整理してまた報告します。※1)



ただ通りすがりさんがおっしゃっている

>「カンマ区切り」のデータを作成したらどうでしょうか?

この方法ではうまくいっているようなので投稿当初の目的は果たしています。
ただ併合を使った方法も勉強してみようと思っています。


※1)本当は実際のファイルをUPすれば良いのでしょうが、簡略化した全体をUPしないとうまく説明出来る自信がありません。
また全体をUPすると不完全な為逆に???が増えてしまう可能性が大です。
そこでもう少し今回質問部分以外の他の部分も完成させてから、UPしようかと思っています。


追伸
全回投稿のイベントのコマンドの最後から2行前の"ケース終了"は"end"の間違いです。
24921 Re:タイトル変更です。複数の値を使った絞り込み 通りすがり 2004/02/18-10:49
記事番号24913へのコメント
未だどういうことをしたいのかが不明ですが、

>A.tblは絞り込み条件専用のtblでは無いのですが
ならば、うにんさんの方法が手っ取り早いし(要素数が増えようが対応可能)、

この表を持たずにフォーム内だけで処理したいのであれば、
>>「カンマ区切り」のデータを作成したらどうでしょうか?

だと思います。そう、あえて複雑にする必要なないのかと思うのですが。(^^ゞ
かえってスマートじゃなくなるような・・・。

目的に添った「データ管理」が必要かと思います。


24968 Re:タイトル変更です。複数の値を使った絞り込み しぼうかん 2004/02/19-19:03
記事番号24882へのコメント
>通りすがりさん

何度もお返事ありがとうございました。
カンマ区切りの方法で行く事にしました。
なお何がしたかったか?についてはこの投稿が
消える前までにファイルをUPしたいと思います。

>うにんさん

併合を使った方法を試していると別の点でドンドン修正が必要な箇所が出て来てしまったので
今回はカンマ区切りの方法で行くことにしました。

>通りすがりさん、うにんさん、ONnojiさん

おかげでスマートな方法を使う事が出来るようになりました。有り難うございました。

25035 とりあえず。 しぼうかん 2004/02/23-23:46
記事番号24968へのコメント
いつも書き忘れてしまうのですが桐の
バージョンは8SP6or9SP1でした。

ずいぶん時間がかかってしまいました。
かなり不完全な為何をしたかったかを知ってもらう事が出来るかどうかわかりませんがとりあえずUPしました。

納品書.wfmで入力後、請求書.wfmへ切替て入力します。
請求書.wfm決定した請求書番号を
コマンドボタンの請求番付や請求番消を使って
納品書.tblに反映させようと思っていました。

PS
しかしその後の思考錯誤・・・もとい試行錯誤の結果
今この計算式を使わない全く別の方法で
同様の事が出来るように改良中です。

なお多分他の人の害になっても参考には
ならないと思うのでこのファイルは1週間ぐらいで
消す予定です。


戻る