過去の桐井戸端BBS (桐ver.8)
11535 2つ以上の条件での表引きの方法 pokopon 2001/06/13-01:33
Win桐V8SP2を使っています。
表引きについての質問ですが、直下の質問とは別な内容なので、新規に投稿しました。

表引きをする際に、2つ以上の条件に合致する値で相手の表から表引きは可能でしょうか?
例えばA表(主表)で表引きを行い、[CODE-1]=1 かつ、[CODE-2]="A" で拾ってB表から[データ]を得るとします。
B表には同じ[CODE]値が複数あります。それらの[CODE]には別々の[データ]があり、
その中に"A"というデータがあり、その該当レコードの別の項目値を拾いたいのです。

「#表引き」では演算子が1だけしか設定できませんよね。 「.and」なんてつかえるのかな〜
表定義での「表引き項目」でも同じで、複数の条件で表引きできれば良いのですが、よろしくご教授下さい。
11538 Re:2つ以上の条件での表引きの方法について 悲しげ 2001/06/13-01:50
記事番号11535へのコメント
どもっ、pokoponさん

簡単な対策としては、項目計算式を #文字列([CODE-1])+[CODE-2] とした
もうひとつの項目を増設します。その項目について必要な索引を定義した上で、
#表引きする方法なんかはどうでしょう?
11541 Re:2つ以上の条件での表引きの方法について ONnoji 2001/06/13-10:34
記事番号11535へのコメント
pokoponさん、こんにちは。

No.11535とNo.11533はどちらも表(.tbl)の[表引き]機能のことですね。

ところで、これらは表編集が前提になるのでしょうか?

フォーム編集状態からならば、簡単な細工でなんとかなるような気がしているのですが...

表編集が前提だとするとNo.11535とNo.11533のどちらも実現できないと思います(たぶん)。

はずしていたら、ごめんなさい。
11546 Re:2つ以上の条件での表引きの方法について 幅田 2001/06/13-12:56
記事番号11538へのコメント
悲しげさんが答えを出しておられますが、一応
↓も参考に読んでみてください。
http://www.fuku3.com/~habata/kbbs/kakov8/02364.htm
11572 Re:2つ以上の条件での表引きの方法について 佐田 守弘 2001/06/14-00:31
記事番号11535へのコメント
pokoponさん
既に悲しげさんと幅田さんがコメント付けておられますが、
質問を良く読み返してみると、質問の主旨がお二人の書かれている事とちょっと違う様に見えているのですが。

そこで私から確認させて頂きます。
桐には表引きと呼ばれる機能で、パネルから選択入力する表引きと、表引き関数で一義的に決める表引きがあります。
また、イベントを使って、表引き的な機能をプログラム的に実現する方法もあります。
主旨は、パネルから選択入力する表引きの事でしょうか。

また、表引き入力する表と表引き元の表の関係が今一つ分かりにくい部分があります。
このあたりを例示で構いませんから、もう少し詳しくお知らせ下さい。

また、ONnojiさんが書かれている通り、表形式編集なのか、フォーム編集なのかも重要なポイントですので、お知らせ下さい。

佐田守弘(KS-00119)
11588 具体的事例について pokopon 2001/06/14-16:10
記事番号11535へのコメント
みなさん、すいません。レスが遅れてしまいました。 別件で取り込んでいたものですから。
さて、
説明の仕方が悪かったようで、具体的な例を書きます。
なお、この内容は、
11535、11533の両方に関連したものですが、対応内容が異なると思ったので、別件で投稿したものです。
長文となりますが、お許しください。
実は、小生は高等学校に勤務しているものですが、生徒の大学受験先&合否結果をデータベース化する計画が進んでいます。
そこで出てきた問題がこの事例でした。
受験先の大学名をデータとして入力するとき、
[大学名]、[学部名]、[学科名]、[受験方式]・・・・・と入力することになるのですが、キーボードから直接その名称を入力すると、
担当者によって「同じ大学だけれどもデータが異なる」ことが出てきます。
例えば「東京大学」と「東大」、「東京大」というように、同じ大学なのにデータの入れ方が異なると、後から集計するとき困ります。
ということで、それぞれの大学に「CODE」を設定し、その番号を入れると自動で「東京大学」と統一して入力できるようにしたいのです。
それに伴い、学部もコード化し、学科もコード化しました。
[大学CODE]:4桁整数 これに対応した文字列データがあります。[大学名]とか
[学部CODE]:2桁整数  同 上
[学科CODE]:2桁整数  同 上
この他に、一意の受験先CODEとして、
[大学ID]を作成し、[大学ID]=[大学CODE]+[学部CODE]+[学科CODE]とし、8桁長整数としています。
このCODEは、ユニークな値です(1つしかありません)。
ということで
データ入力をさせる場合、数値でCODEを入れさせようと言うわけです。
であれば、[大学ID]の8桁を入れれば「一発」でデータが入力されますが、
この8桁整数、生徒も記入しなければなりませんし、入力担当者も入力しなければなりません。
これが実際の現場では大変なのです。
(すなわち、ミスだらけなのです。番号が間違っています。
それだけいろいろな学部・学科があるからです。
番号が間違っていると、違う学部、学科が設定されます。
生徒も自分の受験する大学のコードを正確に記入できてはいないのです)
そこで、8桁のCODEを生かしつつも、生徒、担当者が入力しやすいように、[大学CODE]:4桁だけを入力すると、
それに合致した[学部名]、[学科名]を選択して入力させるようにと考えました。
この操作により、入力担当者も「誰が、どこの大学の、どの学部、学科を受験するか」確認しながら入力可能となります。
1.[大学CODE]4桁の入力→それに合致した[大学名]が入力される。
2.この[大学CODE]を拾って、「この大学にある学部だけ」を選択できるようにし、その中から選ばせる。
→[学部CODE]と[学部名]を拾う→学部名が入力される
3.[大学CODE]と[学部CODE]を拾って、「この大学の該当学部にある学科だけ」を選択できるようにする。
→[学科CODE]を拾う→学科名が入力される。
4.以上の作業から、[大学ID]8桁を自動作成し、インデックスとして登録する。
という手順です。入力するのは4桁の[大学CODE」のみ、残りは順次選択させるという手法です。
これなら、生徒も担当教員も「管理可能」な範囲です。
であれば、「イベントなり、一括で処理を」となるわけですが、後々のシステムの保守・管理のことを考えると、
誰でも変更可能な状態、すなわち、比較的簡単な操作でこのことを実現したいのです。
できれば「表引き」が使えればと思いました。
そこで、「順次絞り込みながらの表引き」加えて「2つの条件ででの表引き」が必要です。
表引き元の大学情報用の表には
[大学CODE]:4桁 それに対応する[大学名]
[学部CODE]:2桁 同上
[学科CODE]:2桁 同上
[大学ID] :8桁 一意の数値 [大学CODE]+[学部CODE]+[学科CODE] で構成が登録されています。
編集する表(実際の生徒データのある表)は、「表形式」でも「フォーム」でも利用可能とします。
表引きは、
ア.表定義の項目属性の表引きでの設定
イ.項目計算式での「#表引き」関数の利用
が考えられますが、ここの設定だけで上記の操作を可能としたいということです。
フォームでの入力支援での表引きを使うためには、表定義での「表引き」設定が必須ですので。

・・・・かえって分かりにくくなったかも?

なんか、「表引き」だけでは、そう簡単に出来そうもなさそうですね。
イベントや一括は出来るだけ避けたい(メンテナンス上、関係職員のスキルはそれほど高くないのですよ)。
簡単な設定でこれらを実現できる方法はありませんか?

ご検討をお願いいたします。

11595 Re:選択・マルチキーの擬似表引き ONnoji 2001/06/14-17:08
記事番号11588へのコメント
pokoponさんは、こんにちは。

フォーム編集からならば入力支援ボタン:モーダルフォームで簡単にできます。
参考になればと思います。

私も初めて試してみましたが意外と簡単で使えます。
ちょっとびっくりしています。
パラメータの受け渡しがとても便利です。

<表引き元と表引き先の表のイメージ>
項目名 データ型
値1   文字列
値2   文字列
結果  文字列(この項目で選択・マルチキーの擬似表引きを行う)

<表引き元のフォームのtxt結果に付属する入力支援ボタン>

リストの種別:モーダルフォーム
選択値リスト:&gParameter,&gLookupForm
自動表示:未定義時

<表引き元のイベント>

名札 メイン
 変数宣言 固有,文字列{&gParameter,&gLookupForm,&gSeekList}
 &gLookupForm = "master.wfm"
*これらの変数の宣言と初期化は上位のモジュールで行ってもよい。


手続き定義開始 txt結果::入力前(参照 文字列 &編集文字列)
 &gSeekList=[値1]+","+[値2]
手続き定義終了
*このイベントの変わりに項目計算式で#代入(&gSeekList,[値1]+","+[値2])としても良いが...
*#対応文字列( )関数を使用するので","のコンマ(,)は半角です。

<イベント無しのアプローチ>
たぶん表引き元のイベントは無しをご希望だと思います。
(1)変数の宣言と初期化は上位のモジュールで行ってもよいですね。
(2)入力前イベントの代わりに項目計算式でも可能ですが、再計算してくれない場合があるので要注意です(止めたほうがいいです)。

<表引き先のイベント>

名札 メイン



手続き定義開始 フォーム::フォーム開始(長整数 &表番号)
 絞り込み [値1]{[値1]=#対応文字列(&gSeekList,1),[値2]=#対応文字列(&gSeekList,2)}
手続き定義終了

手続き定義開始 フォーム::フォーム終了()
 &gParameter=[結果]
手続き定義終了
*&gParameterは受け渡しパラメータとして機能します。表引き元に入力されます。
*いずれかの方法で閉じるを実行すればフォーム終了イベントが発生します。

<表引き先のフォーム>
値を訂正できないような工夫が必要です。
11619 対象を絞りこんでの表引き(1) 佐田 守弘 2001/06/15-00:29
記事番号11588へのコメント
pokoponさん
具体的な話で書いて頂いたので目的などがはっきり分かりました。
で、結論を先に申し上げますと、残念ながら仰る意味での簡単な設定でこれを行う方法は存在しません。
そして、目的とする[大学名]→[学部名]→[学科名]と、上位の選択に基づいてその場での候補値を絞りこんで、
絞りこまれた値を対象としての表引きを行うには、フォームとイベントを組み合わせて行う必要があります。

この件は、他の方にも参考になるかと思いますので、できる限り詳しくコメントさせて頂く積もりです。
しかしながら執筆時間と掲載できる文字数の関係から、数回に分けてコメントさせて頂きます。

●用意すべき表引き表
表引きに使う表引き表(仮に学部学科.TBLとします)は、書かれておられます通り、
[大学CODE] [大学名] [学部CODE] [学部名] [学科CODE] [学科名]などの項目を持ちます。
そして、データの入れ方ですが、例示的に言うと、
0001 東京大学 01 農学部 01 農業工学科
0001 東京大学 01 農学部 02 農芸化学科
0001 東京大学 02 工学部 01 機械工学科
の様な形で、大学名、学部名、学科名までを1セットとしたデータをその大学の学部学科数並べる形になります。
ただし、記は現在の正しい学部学科名ではありません。
また受験用の学部学科名は、理科T類、文科U類になると思います。
ですから実際には、全国の大学を全てカバーしようとすると、おそらく数万レコードの膨大な表になるのではないでしょうか。
また、大学以外に専門学校なども含めると、更にレコード数が増えるのではないかと思います。

なお、前提としてコードは上記のように振られる事を考えておられると思いますが、本当は大学名、学部名、学科名毎にコードを振る必要はなく、
大学名〜学科名のセットのデータに対して、上から連番号のコードを振る事で済みます。
これについては後で触れます。

■対象を絞りこんでの表引きのあらまし
入力を行う表を志望校.TBLとします。目的とする対象の大学や学部を絞りこみながら表引き(風に)入力するには、
最初にも述べた通り、イベントが必須になります。
ですからイベントを使うためにもフォーム入力が必須になります。

●表引き表はフォーム開始時に共有で開いておく
イベントファイルのメイン部分で表コマンドを使い、共有モードで学部学科.TBLを開いておきます。

●大学名の表引き入力
コードで入力させるのも1つの方法なのでしょうが、もっと優しい方法を考える必要があるでしょうね。
仮名で先頭数文字を入力したら、該当する大学名を絞りこんで、一覧で表示させるのが良いかと思います。
先頭一致のあいまい入力で表引きができますから、これを使うのが良いと思います。
いずれにしても数万件のレコードがある学部学科.TBLから、該当する大学名を絞り込み、更に大学名で単一化します。
この絞り込みや単一化は、大学名の入力欄(オブジェクト)の入力後イベントで行えば良いでしょう。
あるいはコマンドボタンを押させて、その様な絞り込みや単一化をさせても構いません。

●学部と学科の表引き入力
学部の入力時には、大学名が確定していますから、一度絞り込みを解除した後、改めてその大学名で絞りこみ、学部名で単一化します。
この絞り込みは、学部名入力支援ボタンオープンイベントで行ってもよいですし、大学名のソース値更新イベント(大学名が確定した時)で行っても構いません。
学科名の場合についてもこれと同様です。

■イベントはそれ程複雑ではありません
あらましは以上の通りなのですが、イベントを作った事がないと、あるいは上記の説明はちんぷんかんぷんかも知れません。
ただし、実際にはイベントハンドラの中で記述する絞り込みのコマンドは、数行程度で大した事はありません。

佐田守弘(KS-00119)
(続く)
11641 Re:絞り込み・マルチキーの擬似表引き ONnoji 2001/06/15-11:51
記事番号11595へのコメント
pokoponさんは、こんにちは。

><表引き先のフォーム>
>値を訂正できないような工夫が必要です。

表引きと同等ですから、項目値が書き換えられると具合悪いですよね。

表引き先のフォームの属性の[編集対象表]タブの[許可作業]を実行して、
許可作業のすべてのチェックを消すといいようです。

追伸
選択はDOS桐の用語でしたね。
絞り込み・マルチキーの擬似表引きでした。
11648 Re:絞り込み・マルチキーの擬似表引き ONnoji 2001/06/15-14:19
記事番号11641へのコメント
pokoponさん、こんにちは。

>手続き定義開始 txt結果::入力前(参照 文字列 &編集文字列)
> &gSeekList=[値1]+","+[値2]
>手続き定義終了

上の[入力前]イベントの代わりに
入力支援ボタンの[入力支援オープン]イベント使っても大丈夫のようです。

手続き定義開始 入力支援::入力支援オープン()
 &gSeekList=[値1]+","+[値2]
手続き定義終了

戻る