過去の桐井戸端BBS (桐ver.9)
24293 フォームからイベントを使って別表ファイルを絞り込んで印刷したい。 ステラ 2004/01/16-18:43
表Aが対象表になっているフォームAがあります。
表Aと店舗IDで他の表と関連している結合表Bがあります。

フォームAで表Aを変数を用いてイベント一般手続き(ア)を使用し絞り込んだID店舗の
関連データのみを結合表Bで絞り込み、結合表Bに登録してある一覧表を印刷したいのですが、
フォームAのコマンドボタンの機能に

開く      B.viw
手続き実行   ア
一覧表印刷   1

としましたが、B結合表が開かれるだけで、必要な絞込みができません。

一覧表の印刷は結合表Bから会話処理により行ってもかまわないのですが、
絞込みは場合分けしてあり複雑なので、フォームAで使用したものをそのまま使いたいと思いますが、
どなたかいい方法を教えてください。

(当然ですが、結合表Bに登録してある一覧表印刷1は、表Aには登録されていないため、印刷もできません。)


24296 Re:フォームからイベントを使って別表ファイルを絞り込んで印刷したい。 悲しげ 2004/01/16-19:09
記事番号24293へのコメント
どもっ、ステラさん
私ならこうするかな、と云う例。

1.フォームAのコマンドボタンの記述

 手続き実行 結合印刷

2.kevの記述
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
手続き定義開始 結合印刷()
 結合 "b.viw"
 ・・・・・・
 (手続き「ア」の中味。編集表は"b.tbl")
 ・・・・・・
 一覧表印刷・・・(bの方の)
 ・・・・・・
 (bを閉じる)
 編集表 "a.tbl"
手続き定義終了
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

但し挙動未確認(結合は苦手)。

24299 指定した値で結合表の絞り込みを行う 佐田 守弘 2004/01/16-21:56
記事番号24296へのコメント
ステラさん
悲しげさんが大筋を書いておりますが、フォーム上で選んだ表Aの項目値を元に、
結合表Bの絞り込みを行いたい様なので、この部分について補足します。

ポイントは、表Aにある項目の値を使って、結合表Bの絞り込みを行うので、
・絞り込む値を変数に入れて引渡す事
・受け取った値で絞り込む様に結合表に設定する方法
です。

●絞り込み値を引渡す変数
引渡す値を代入する固有変数ないしは共通変数で定義しておいて下さい。
そして結合表を開く前に、表Aの項目値をこの変数に代入します。
代入コマンドを書く場所ですが、悲しげさんの書いたイベントでいえば、
手続きの冒頭の結合コマンドの前か、この手続きを呼び出すコマンドの前に入れて下さい。

●変数値で結合時の絞り込みを設定しておく
結合表の定義画面で、絞り込み条件を設定して下さい。
この時に、上記の変数を使った比較式で記述します。
なお、先にこの変数を定義しておかないと、エラーになります。

●パラメータ変数の設定
フォームの編集対象表のタブにある、「結合表パラメータを入力する」のチェックは外して下さい。
このチェックがあると、絞り込み値をパラメータ変数に代入するダイアログが出てしまいます。

試してはおりませんが、多分上記で巧く行くと思います。

参考情報がヘルプの「結合表の定義-パラメータ変数を使用する」に書いてあります。
但し、今回の場合にはパラメータ変数として入力するのではなく表Aから
共通変数ないしは固有変数に代入してこれを結合表に引渡すので、
もしパラメータ変数を定義してしまうと、巧く行かないと思います。

佐田守弘(KS-00119)
24305 Re:フォームからイベントを使って・・・。 ステラ 2004/01/17-12:38
記事番号24296へのコメント
悲しげさん、佐田さん、いつもありがとうございます。

概要はわかりましたので、やってみます。
結合表は苦手なので、また、基本的な細かいことをお聞きするかもしれませんが、
よろしくお願いします。

フォームで、別の表を定義して扱ったことがないのですが、(何しろ、手探
り状態でやってきてるので、基本的なことがいまいち解っていません。)
悲しげさんが書いている、
>〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
>手続き定義開始 結合印刷()
> 結合 "b.viw"
> ・・・・・・
これで、結合表Bを指定してるのですね。
それで、これ以下は、結合表Bに登録してある一覧表印刷や並べ替えが使え、
作業が行われるという理解でいいでしょうか。

24306 Re:フォームからイベントを使って・・・。(前の投稿はコメントなしです 削除してください。) 悲しげ 2004/01/17-14:51
記事番号24305へのコメント
>>手続き定義開始 結合印刷()
>> 結合 "b.viw"
>> ・・・・・・
>これで、結合表Bを指定してるのですね。
>それで、これ以下は、結合表Bに登録してある一覧表印刷や並べ替えが使
>え、作業が行われるという理解でいいでしょうか。

「結合」はさせていますが、その後のことは、すいません、
私は結合は滅多に使わないのでよく判りません。(^^;)

24308 結合コマンドの意味 佐田 守弘 2004/01/17-16:43
記事番号24305へのコメント
ステラさん

●「結合」コマンドで行われる事
 >これで、結合表Bを指定してるのですね。
その通りです。

結合コマンドの意味を説明しておきます。まずHELPには、
「指定した結合表または外部データベースを開きます。 」
と記載されています。これをもう少し詳しく述べてみます。

結合コマンドでは、結合表の定義で作成したviwファイル(これは結合定義ファイルです)を指定します。
この場合には、B.viwがそれです。
結合コマンドを実行すると、この定義にしたがって、対象表の結合が実行され、得られた結合表が開かれます。
「結合表」とは、正しくはこの結合結果で得られた表の様なものを言います。
結合表の定義は、この結合表を得るための方法と条件の定義ファイルの作成です。

結合コマンドで結合表が開かれると、開かれた結合表が編集対象表になりますから、
その後は表コマンドで開いた表と同じ様にして、一覧表の印刷を初め、様々な処理が行えます。

「終了 表」コマンドによって、編集中の結合表を閉じられます。
結合表は、基本的には保存する必要がない(開く度に新しく結合する)ので、破棄して閉じます。

佐田守弘(KS-00119)
24310 Re結合コマンドの意味(もう少しお願いします。) ステラ 2004/01/18-10:09
記事番号24308へのコメント
佐田さん、詳しい説明ありがとうございます。


>結合コマンドを実行すると、この定義にしたがって、対象表の結合が実行され、
>得られた結合表が開かれます。
>
>結合コマンドで結合表が開かれると、開かれた結合表が編集対象表になり
>ますから、その後は表コマンドで開いた表と同じ様にして、一覧表の印刷を
>初め、様々な処理が行えます。
>
とありますが、これを悲しげさんのように、フォームのイベントの中に書いて実行した場合、
画面では、結合表が表示されるのでしょうか。
表が表示されているときのみしか使えないコマンドもあるようですが、
どこまでフォームのイベントに書いてしまっていいものかがわかりません。

確かそのために、ボタンの機能パラメーターで最初に結合表を開いたのだと思うのですが。

>コマンドボタンの機能
>開く      B.viw
>手続き実行   ア   (フォームの中のフォーム対象表での絞り込み)
>一覧表印刷   1   (結合表の中で登録している一覧表印刷)

ここでは省いてありますが、印刷の前には並べ替えもしなくてはなりません。

桐の入っているPCが手元にないため動作確認ができていませんが、

表コマンドや、結合コマンドを別の表が対象になっているフォームのイベントで実行した場合と、
コマンドボタンの機能をつかって開いた場合との違いをもう少し教えてもらえませんか。

24311 結合コマンドで開いた結合表 佐田 守弘 2004/01/18-11:17
記事番号24310へのコメント
ステラさん
●結合コマンドで開いた結合表
 >フォームのイベントの中に書いて実行
 >した場合、画面では、結合表が表示されるのでしょうか。
結論を先に言うと、開かれた結合表は画面には表示されません。
裏で編集対象表になっているだけです。

これはイベントの中で表コマンドを使って、別の表を開いた場合と同じと考えて下さい。

フォームのイベントの中で、表コマンドを使って別表を開いたり、
結合コマンドを使って別の結合表を開けば、その段階で開いた表が編集対象表となります。
これらのコマンドに続いて、絞り込みや一覧表印刷を初め、その表(結合表も同じ)に
対する一連のコマンドが行えます。

一連の操作が終われば、終了コマンドで閉じるまで、その表などは裏で開かれたまま
でアイドル状態になります。
そしてフォームの方で何か処理を行うと、フォームの対象表の方が編集対象表に戻ります。
もし裏で行っている一連の操作が、ある程度時間の掛るものだとすると、その処理が終るまでは、
フォーム上の操作はできなくなると思います。
またもし後から裏で開かれている表や結合表に対して、これをもう一度編集対象表として
何らかの一連の操作を死体場合には、編集表コマンドでそれらの表などを編集対象とします。

●開かれたれた表や結合表の画面表示
おそらく質問の主旨は、開かれた表を画面表示したいという事ではなさそうですが、
コマンドで開いた場合、上記にも書いた通り、桐の中で開かれていても、
画面には表示されないはずです。
画面表示したい場合には、表表示コマンドや、それを対象表とするフォームを開く、
ないしはそれらの編集ウィンドウを作成して開くなどの必要があります。
但し、元のフォームがモーダルフォームの場合、
新しい表ウィンドウやフォームのウィンドウを表示する事はできません。
モーダルフォームが表示されている状態では、新たなフォームなどを表示するには
フォーム呼び出しなどで、次のモーダルフォームを呼び出す必要があります。

●コマンドボタンで開いた場合
>確かそのために、ボタンの機能パラメーターで最初に結合表を開いたのだと思うの
>ですが。
コマンドボタンで表や結合表を開けますが、その後の一連の処理を行う事ができないのではないかと思います。
私はコマンドボタンで複雑な事をした経験がないので、どこまでできるかはちょっと、不明です。

 >コマンドボタンの機能
@>開く      B.viw
A>手続き実行   ア   (フォームの中のフォーム対象表での絞り込み)
B>一覧表印刷   1   (結合表の中で登録している一覧表印刷)
について言えば、
@の開くコマンドで結合表は開けます。
Aの手続きの実行は、現在のフォームのイベントの中に書いてある手続きであれば、実行できます。
Bの一覧表印刷は、結合表に定義してあるものであれば、できません。
この機能で行える一覧表印刷は、あくまでもフォームの編集対象表に定義してあるものだけです。

従って、結合表の中の一覧表印刷を行うのであれば、Aで実行するの手続きの中で
結合表を対象としてコマンドで実行する必要があるでしょう。

●結合表の印刷前の並べ替え
結合表は、結合時の条件で並べ替えさせるのが得策です。
もちろん、印刷の度に並べ替え方法が違うなら、結合表を開いてから、
並べ替えるのも1つの方法ですが。

佐田守弘(KS-00119)
24312 追加>コマンドボタンで開いた場合 佐田 守弘 2004/01/18-11:25
記事番号24311へのコメント
ステラさん
コマンドボタン開いた場合について捕捉します。
 @>開く      B.viw
 A>手続き実行   ア   (フォームの中のフォーム対象表での絞り込み)
 B>一覧表印刷   1   (結合表の中で登録している一覧表印刷)
ですが、「開く」の機能で結合表を開いた場合、開き終わるまでは結合表が対象表になっていますが、
その後のAの手続き実行の機能を実行した段階で、
編集対象表がフォームの方に戻るのではないかと思います(未確認です)。

従って、実行する手続きの中で開いてある結合表に対して何かの操作をする場合には、
編集表コマンドを使って、結合表の方を編集対象表とする必要があるかと思います。

ステラさんの元質問の主旨では、現在のフォームでレコードを選び、その項目値を使って、
結合時の絞り込みを行う、あるいは、開いた結合表から絞り込む様ですね。

もしこういった一連のコマンドを実行したいのであれば、コマンドボタンの機能は、
手続き実行だけにして、この手続きの中でコマンドを使って一連の操作をした方が
解りやすく間違いも少なく、むしろ簡単なのではないかと思います。

佐田守弘(KS-00119)

24313 Re:質問の意味 ステラ 2004/01/18-11:46
記事番号24311へのコメント
佐田さん、早速の説明ありがとうございます。

質問の意図は、コマンドをイベントで使った場合の制限のことで、
確か、表が画面に表示状態でないと使えないコマンドがあり、
並べ替えや絞込みはそれに該当していたのではないかと思うのです。
そのため、表を画面表示させる必要があると思って、結合表を開くことにしたと思うのです。

>●結合コマンドで開いた結合表
>結論を先に言うと、開かれた結合表は画面には表示されません。裏で編集対象表に
>なっているだけです。
>
>これはイベントの中で表コマンドを使って、別の表を開いた場合と同じと考えて
>下さい。
>フォームのイベントの中で、表コマンドを使って別表を開いたり、結合コマンドを
>使って別の結合表を開けば、その段階で開いた表が編集対象表となります。
>これらのコマンドに続いて、絞り込みや一覧表印刷を初め、その表(結合表も同じ)
>に対する一連のコマンドが行えます。
>
>一連の操作が終われば、終了コマンドで閉じるまで、その表などは裏で開かれたまま
>でアイドル状態になります。

この状態で、これらの表示されている場合に使えると言うコマンドが使えるかどうかが
心配だったので、先ほどの質問(「表は表示されるのか」)になったわけです。

> >コマンドボタンの機能
>@>開く      B.viw
>A>手続き実行   ア   (フォームの中のフォーム対象表での絞り込み)
>B>一覧表印刷   1   (結合表の中で登録している一覧表印刷)

ご指摘の通り、@が実行された後は、Aは実行されないわけで(当然Bも)、
今回の当初の質問になったわけです。

ご面倒ばかりおかけてもいけないので、明日、動作確認など自分でできそうなことを
試してみて、また投稿します。

24314 「表示」の意味 悲しげ 2004/01/18-15:58
記事番号24313へのコメント
どもっ、ステラさん
ちょっと「結合」からは離れまして、言葉の意味についてコメントします。

>質問の意図は、コマンドをイベントで使った場合の制限のことで、確か、
>表が画面に表示状態でないと使えないコマンドがあり、並べ替えや絞込み
>はそれに該当していたのではないかと思うのです。
>そのため、表を画面表示させる必要があると思って、結合表を開くことに
>したと思うのです。

確かに「並べ替え」や「絞り込み」は「表示モード」でなければ使えない
コマンドです。(正確には「表示状態」ではありません)
ただ、桐で云う「表示モード」とは、現在の画面に表示されているような
状態を指すのではなく、訂正・挿入などの、いわば「入力まっ最中の状態」
(「非表示モード」とか「更新モード」「編集モード」とか云うこともあります)
ではない状態のことを指します。
「表示モード」とは確かにネーミングとしては非常に判りにくいとは私も思いますが、
少なくとも「画面表示」とは全く関係ありません。(^^;)

24315 表等の画面表示と更新モード 佐田 守弘 2004/01/18-20:19
記事番号24314へのコメント
ステラさん
悲しげさんが表の画面表示と更新モードの件について説明しておられますので、
ほぼ理解できたかと思いますが、多少の追加捕捉をさせて頂きます。

●表などの更新モード
開かれている表は、表示状態であるか、あるいは特定の項目値の編集状態であるかによって、
また編集状態の時にはどの様な編集状態であるかによって、
表示、訂正、行挿入、行追加、項目訂正などのモードがあります。
詳しくは一括処理&イベントリファレンスの「更新モード設定」メソッドの項目を見て下さい。

表示ではないモードには、上記の訂正以下のモードがありますが、
これらをまとめて、「編集モード」と呼ぶ事にします。
なおこの「編集モード」という言葉は、桐の正式な言葉ではありません。
しかしこの言葉を使った方が、「表示モード」←→「編集モード」の対比で解りやすいので、
私が作り、かつての「コンプリートガイド」シリーズ以来使って来ております(私の造語です)。
以下、この呼称を使って説明します。

●表示モードと更新モードの違い
桐の内部的な処理を推定しての話になりますが、表示モードは、
桐のデータベースエンジンに制御がある状態です。
これに対して、編集モードでは、その項目値編集する入力エディタに制御が移っています。
この違いによって、表示モードで使えるコマンドと使えないコマンドの違い、
ひいてはイベントと一括処理で使えるコマンドの違い(のいくつか)が生じます。
ざっくり言えば、表全体あるいは行全体に対して行う様な処理は、
表示モードでないとできません。

●編集モードになれる表
会話処理で行っている表(結合表も含む)のみが、編集モードに入れます。
通常は、表示モードと編集モードを行き来します。

●表示モードのみの状態の表
一括処理で開いた表や、フォームのイベントで開いた別表は、表示モードです。
行訂正コマンドで行訂正をしたり、行追加コマンドで新規の行を追加したりできますが、
これは表示モードで行っている操作です。
一例として言えば、編集モードでは行訂正コマンドが使えず、
代わりに、項目値代入コマンドを使うといった違いがあります。

つまり、一般的に言えば、一括処理から開いた表は、会話処理に入るコマンドを使わない限り、常に表示状態です。
これはイベントで開いた別表も同様です。
ただし、一括処理とイベントとの状態の違いから、
これらの更新モードとは別の理由で使えるコマンドの違いは出て来ます。

●一括処理などで開いた表を編集モードにするには
一括処理からであれば、ウィンドウ作成、ウィンドウ会話コマンドを使って、
その表の編集に入るのが普通です。
(表形式編集や、会話処理実行コマンドでも編集モードに入れます。)
またフォームから開いてイベントを使う場合には、一般的にはフォーム呼び出しで
目的の表を編集するフォームを開くのが普通です。

●結論として
先の悲しげさんの説明と上記を読んで頂けば解ると思いますが、
表示モードである事と、その表を画面表示している状態である事とは、全く別物です。
そして、画面表示せずに裏で開かれているだから、表示モードでいられると考えて下さい。

佐田守弘(KS-00119)
24316 Re:「表示」の意味(すっごく理解しました。) ステラ 2004/01/18-23:58
記事番号24314へのコメント
悲しげさん、佐田さん、ほんとにありがとうございます。

「表示している状態」はこれでしっかり理解できました。
(そうと解っていれば・・・と振り返る処理はたくさんありますが)

こんなことも知らずに使っているのかとあきれるかもしれませんが、ヘルプと
桐BBS(過去ログ含む)と動作のみで何とか使っています。

また、いろいろ教えてください。

動作確認したら、また報告します。
とりあえず・・・。
24317 表の表示と使えるコマンドの制限(念のために) 佐田 守弘 2004/01/19-00:23
記事番号24313へのコメント
ステラさん
既に説明して来た事と重複しますが、念のために質問部分について補足しておきます。

 >質問の意図は、コマンドをイベントで使った場合の制限のことで、確か、表が画面に表
 >示状態でないと使えないコマンドがあり、並べ替えや絞込みはそれに該当していたので
 >はないかと思うのです。
 >そのため、表を画面表示させる必要があると思って、結合表を開くことにしたと思うの
 >です。

の部分ですが、並べ替えや絞り込みなどのコマンドは、表の更新モードが訂正などの
編集モード(造語)ではなく、表示モードになっている事が必要なだけで、
画面表示されている必要はありません。

対象とする表に対してこれらの表全体に対する処理コマンドを実行できる条件は、
・対象とする表が開かれている事。
  − 表が開かれてなければ、何もできない
・その表が編集対象表になっている事。
  − コマンドによる処理は、編集対象表に対して行われる。
・その表の更新モードが表示モードになっている事。
  − 表全体に対する処理は、更新モードのみで行える。
の3つです。

そして、表コマンドないしは結合コマンドを実行すれば、対象の表が開かれて
それが編集対象表となって、表示モードになります。つまり、開くだけで、上記の
状態になります。

●質問中の疑問箇所
質問の主旨である並べ替えや絞り込みをコマンドで行うための条件は御理解頂けたと思いますが、
質問文中の以下の部分に、解らない部分が残ってました。

 >そのため、表を画面表示させる必要があると思って、結合表を開くことにしたと思うの
 >です。

表を画面表示する必要がない事は述べて来ましたが、別の目的でもし画面表示させる
必要が生じた時のための話として確認させて下さい。
画面表示させるために、表ではなくて結合表を開こうとしている意味は何でしょうか。

・複数の表を結合した結合表で開く必要があった。
 これなら意味は解ります。当然、結合表を開く必要があります。

・本当は現在のフォームの対象表に対して処理したいのだが、改めて開かなければならない
 と考え、かつ、開かれている表なので重複して開く事ができないと考えて、その表を対象とした結合表を開こうとした。
 現在表示しているフォームが対象としている表は、既に開かれていますから、イベントの中で様々な処理が行えます。
 フォームによっては、グループ選択されている場合には、先にそれを解除する必要がありますが、
 フォームの対象表は編集対象表になっていますから、イベントの中の
 コマンドで様々な事が可能です。改めて開き直す必要はありません。
 なおフォームの編集対象表の場合、表示モードではなくて、編集モードに入っている時があります。
 コマンドボタンで絞り込みなどを行う際には、コマンドの中で「メソッド呼び出し 更新モード変更」コマンドを使って、
 表示モードに戻す必要があります。

また、何かの理由でフォームの編集対象表と同じ表を重複して開く必要がある時には、
多重化する方法もあります。
多重化とは、一人のユーザーが同じ桐環境の中で、同じ表を重複して開く事です。
同じPC上でも、もう1つの桐を起動して開くと、多重化ではなくて同じユーザーによる共有にする必要があります。

フォームの編集対象表になっている表を対象とした結合表ですが、既にフォームでその表が専有モードで開かれていると、
結合表を開く事ができません。
同じ表を結合対象とする結合表を開くには、フォームで開く表を共有更新モードで開く必要があるでしょう。

佐田守弘(KS-00119)
24319 Re:表の表示と使えるコマンドの制限(画面表示の理由) ステラ 2004/01/19-10:14
記事番号24317へのコメント
佐田さん、ぎもんにお答えします。

>●質問中の疑問箇所
>質問の主旨である並べ替えや絞り込みをコマンドで行うための条件は御理解頂けたと
>思いますが、質問文中の以下の部分に、解らない部分が残ってました。
>
> >そのため、表を画面表示させる必要があると思って、結合表を開くことにしたと思うの
> >です。
>
>表を画面表示する必要がない事は述べて来ましたが、別の目的でもし画面表示させる
>必要が生じた時のための話として確認させて下さい。
>画面表示させるために、表ではなくて結合表を開こうとしている意味は何でしょうか。

別の目的は特にありません。
結合表を開く必要があったのは、フォームで絞込みを実施している対象表(A)とは違う表(B)を
対象表として絞り込みしなおす必要があったためです。Bは結合表で、A及びその他2つの表を結合し
Aに関連した情報を取り出せるようにしてあるもので、別の2つの表にある
Aに関連した情報を、先のフォームで絞り込んだ分だけ同様に絞り込むのが
今回の目的でした。

その絞込みが、画面表示されていないとできないと誤解していたので、結合表を画面表示することとしたのです。

フォームの対象表Aは共有になっているので、フォームが開いていても結合表は画面表示されていました。
(その先のコマンドは機能しませんでした。)

****
最初から結合表Bを対象にすることも考えましたが、その後、絞り込んだデータを書き出しをしたりするのですが、
Bはマルチデータになるので単一化をしたり、適切な並べ替えを行わなければいけないため、
結合表でそれらを完全に行える自信がなかったので、手っ取り早く今回の書き出しに必要なデータのみが入っていて
単一データであるAを対象表として処理することにしました。
その上で、Bのデータも印刷して参考にしたいわけです。
****

24328 Re:うまくいきました。とても勉強になりました。 ステラ 2004/01/19-17:12
記事番号24296へのコメント
悲しげさん、佐田さん、

指導のとおりにしたら、うまく動きました。

質問の動作についてもですが、表の表示状態についての解説、とっても勉強になりました。
そのおかげで、いろいろ改善ができました。
(画面表示をしなくてはならないと思い、余分なことをしてました。)

本当にありがとうございました。

戻る