■276 / ResNo.1) |
Re[1]: 列固定に集計関数も移動させたい
|
□投稿者/ 宮田 -(2010/07/31(Sat) 09:53:36)
| 2010/08/01(Sun) 22:31:01 編集(投稿者)
列固定式フォームを製作した宮田です。 たまたまここを訪れ、お問い合わせがあることを見つけました。 私が作ったものがお役に立てているようで、大変嬉しく思っております。 さて、ご質問の件(列固定式フォームで集計項目をスクロールさせる)ですが、列固定検証1.wfm(両端固定で列幅一定の列固定式フォーム)については以下の方法で実現できます。 しかもボタン1つで、何時でも集計方法を自由に変更できます。他の2つの列固定式フォームについても多分同じ方法で可能だと思いますが、時間の都合で検証しておりません。 なお、ONnojiさんも作品NO 165「INF Tools Framework 第2.1版」で列固定機能を持つフォームを提供されておられので、ご紹介させて頂きます。 INF Tools Framework 第2.1版も多分列固定に関しては、フォーカスの移動に伴ってオブジェクトの属性(画面表示及び始点X)を書き換えているものと思いますが(ONnojiさん、違っていたらお詫び致します)、私の方式より優れているうえに機能も豊富で使い勝手がよく、断然そちらをお薦めします。
では列固定検証1.wfmについて説明させて頂きますが、まずグループ項目オブジェクトのソースはメイン処理でしか変更できず、明細部の様にソースを書き換える方法は使えません。(やまもとさんのエラーメッセージは多分これが原因だと思います。) そこでスクロールさせる全項目に対する集計用グループ項目オブジェクトを非表示で用意しておき、その集計値をグループソース値取得メソッドで読みとって、対応する場所のテキストオブジェクトに表示させるという方法です。 流れとしては以下のようになります。
1.対象表のスクロールさせる項目(列固定検証.tblの場合[B]〜[Y]の24項目)集計用のグループ項目オブジェクトを、フォームフッタ部に「画面表示しない」(場所・サイズは任意)で用意し、それらのソースに各項目を対象とする集計関数を設定します。 2.これとは別に集計結果表示用のテキストオブジェクトを好きな所(通常はフッタ部)に配置し、それらのソースに変数(例えば、&表示値[1],&表示値[2],&表示値[3] )を設定しておきます。 3.あとはスクロールに合わせ、イベントファイル中でグループソース値取得メソッドにより、スクロールに対応する項目用のグループ項目オブジェクトからソース値(即ち集計値)を読み取って、該当する場所のテキストオブジェクトの変数に代入すればOKです。 4.ただしこれだけでは縦方向に入力していくとき(つまりスクロールが起こらないとき)にはイベントが起こらずグループソース値の取得が行われないので、上記の3と同じ内容をフォームの行訂正終了イベントにも記述しておきます。
具体的には、まず1.について変数宣言で集計値の取得用として&集計値[24]を、グループ項目オブジェクト名の指定用として&集計項[24]を宣言し、&集計項[24]については24個のグループ項目オブジェクトのオフジェクト名を入れておきます。2.については上記のとおりです。 3.については、手続き定義開始 変更() の中に以下の●印を付けた7行を書き足します。
手続き定義開始 変更() オブジェクト操作 @aB{標題=&標題[&番号+1]} @aC{標題=&標題[&番号+2]} @aD{標題=&標題[&番号+3]} @tB{ソース=&項目[&番号+1],横位置=&横表示[&番号+1]} @tC{ソース=&項目[&番号+2],横位置=&横表示[&番号+2]} @tD{ソース=&項目[&番号+3],横位置=&横表示[&番号+3]} ●メソッド呼び出し ハンドル=&hwindow,&集計項[&番号+○].グループソース値取得(&集計値[&番号+○],0) ←この○を1〜3に書き換えた3行を挿入 ●&表示値[○]=&集計値[&番号+○] ←この○を1〜3に書き換えた3行を挿入 ●メソッド呼び出し @フォーム.変数変更() ←無くても多分大丈夫 手続き定義終了
また4についても、3とほぼ同じ内容で以下の様に記述します。(勿論フォームの行訂正終了イベントに対するチェックもお忘れ無く)
手続き定義開始 フォーム::行訂正終了(長整数 &明細番号,長整数 &モード) オブジェクト操作 &B列=@tB.ソース ←スクロールが発生しない場合に備え、B列が表のどの項目を表示しているのかを取得 &番号=#条件選択(&B列="[B]",0,&B列="[C]",1,&B列="[D]",2,&B列="[E]",3,&B列="[F]",4,&B列="[G]",5,&B列="[H]",6,&B列="[I]",7,&B列="[J]",8,&B列="[K]",9,&B列="[L]",10,&B列="[M]",11,&B列="[N]",12,&B列="[O]",13,&B列="[P]",14,&B列="[Q]",15,&B列="[R]",16,&B列="[S]",17,&B列="[T]",18,&B列="[U]",19,&B列="[V]",20,&B列="[W]",21) ←グループ項目オブジェクト用の配列変数の要素番号決定の元となる値を決定 上記の3で書き加えた6行を記述 メソッド呼び出し @フォーム.変数変更() ←無くても多分大丈夫 手続き定義終了
実際に動かしてみましたが、問題なく動きました。 なお、集計値の更新はレコードが変わるときに行われるので、同一レコード内をスクロールさせている間は、項目が移っても集計値は更新されないことにご注意ください。 (このことは普通のフォームでも同じであり、決して動作が不正な訳では有りません。なお項目を移動する毎に更新させることも、更新モード取得と設定メソッド使えば、やってやれないことは無いと思います) またグループ項目オブジェクトを項目数の何倍か用意して集計関数を変えておき、ソース値を取得する際にどの関数のグループ項目オブジェクトのソース値を取得するかを選択すれば、集計方法を変えることもできます。 最後にONnojiさんの方式なら、多分明細部と同じ方法でフッタ部も列固定出来ると思え、上記のやり方よりもっとシンプルに実現できると思います。 以上、お役に立てば幸いです。 ところで桐についてはこの頃全く音沙汰無しですが、この先いったいどうなっていくのでしょうか?せめて我々愛好者がガンバらなければ!
|
|