過去の桐井戸端BBS (桐ver.9)
23804 伝票(又は一覧表)フォームを使って表示させているデータの特定行を先頭行と共に表示させたい 沼田 2003/12/09-15:01
いつもご迷惑ばかりをお掛けします。
桐V9SP1を使用しています。

伝票(又は一覧表)フォームを使って表示させているデータの特定行を、先頭行と共に表示させたいのです。

"基本表A.tbl"に入力したデータを元に、計算結果を"集計表B.tbl"に書き出し、
"集計表B.tbl"をポップアップフォーム"集計表.wfm"で表示させています。
元帳と試算表の関係と思っていただいて結構です。
"集計表B.tbl"の各項目値は"基本表A.tbl"の値に連動して更新されますが、
更新された項目のある「行」を特定行として明示したいと思っています。
現在の明示の方法は単にその行の項目「摘要」にフォーカスを合わせているだけですが、
それでも十分だと思っています。

問題は、その特定行がデータの終わりの方である時、
フォーム開始イベント内の検索コマンドで特定行にカーソルを移動させた後に表示させると、
先頭行が表示されなくなってしまう、ということです。

"集計表B.tbl"の最大の行数は18行と見込まれますので、明細行の繰り返し数を
「20」としています。
フォームの大きさも20行分が表示されるようにしてあります。

データの総行数が17行などであり、特定行が最終行である場合などでは、
特定行が10行目に表示され、先頭行が表示されなくなります。
もちろん、カーソルを先頭行に移動させれば全体を見ることが出来ますが、
フォーム開始イベントで特定行を処理対象行にすると、画面の中央部に表示されるように思われます。
これを、フォームが開いた時点で、先頭行が必ず表示されながら、同時に17行目や
18行目の処理対象行も表示されるようにしたいのです。
どのような方法があるのかお教えいただくとうれしく思います。
よろしくお願いします。

23806 Re:処理対象行の表示位置 アックン 2003/12/09-16:42
記事番号23804へのコメント
沼田さん、こんにちは。
ぼくの経験では、フォーム開始イベントでは実現できなかったので、コマンドボタンを利用しています。

例1:
・フォームのワークエリア(定義画面周囲の白紙部分)に、コマンドボタンを1個配置します。
 オブジェクト名:b_1
 機能名(例):検索_比較式
 機能パラメータリスト:・・・
 イベント定義なし

・フォームの「オブジェクトの属性」→「オプション(タブ)」→実行コマンド→開始時(S)
 プルダウンリストから b_1 を選びます。

例2:
・フォームのワークエリアに、コマンドボタンを1個配置します。
 オブジェクト名:b_2
 機能名:手続き実行
 機能パラメータリスト:"ナントカ()"
 イベント定義なし

・フォームの「オブジェクトの属性」→「オプション(タブ)」→実行コマンド→開始時(S)
 プルダウンリストから b_2 を選びます。

・フォームのイベントに一般手続きを記述します。
 proc ナントカ()
    検索 ・・・
 end

おまけ:データ行がたくさんある一覧表や伝票で、いつも決まった明細部の位置から入力を始めたいときは、
例2のイベント内容を次のようにしてます。

 proc ナントカ()
  ジャンプ 行番号=終端
  method @フォーム.明細番号設定( 2 )
   /* ↑この例では、明細部 2行目を指定しています。「フォーム」は半角で記述。*/
 end

23807 Re:処理対象行の表示位置(解決) 沼田 2003/12/09-17:11
記事番号23806へのコメント
アックンさん、ありがとうございました。いつもご迷惑をお掛けします。
解決です。

フォームが表示されるまでの手順がそこそこの量でもあったため、「例2」のパターンを使わせていただきました。
全く希望通りの動作をしてくれています。ありがとうございました。

この問題に関しては、おそらく「桐の仕様だ」という理解で良いのではないかと思っています。
フォームが表示されるタイミングの問題だと理解しました。
本当にありがとうございました。
23809 Re:処理対象行の表示位置(解決) 宮城 2003/12/09-20:21
記事番号23807へのコメント
沼田さん、アックン、こんばんは。

あれっ、「先頭行」はどうなったんですか?

「先頭行」と「処理対象行」を常にスクロールしなくても同時にみられるようにしたいというのは、
「桐の仕様」というか、たぶんどんな DBソフトでも正面玄関からは無理でしょう。(「先頭行」と
「処理対象行」の位置関係はそれこそ「不定」でしょうからね。) 
というか、そもそもどんなニーズがあって「先頭行」表示が必要なのかに非常に興味があったんですけど。

ニーズはさておきどうしてもと言われれば、先頭行だけ別表に書き出してそちらで作業した後、
2行目以降を元の表末尾に読み込む、ぐらいでしょうか。(先頭行と処理対象行以外については
なんともお書きになっていませんので。)

23810 Re:処理対象行の表示位置(解決) 悲しげ 2003/12/09-22:31
記事番号23809へのコメント
どもっ、宮城さん
私も実は宮城さんと同じ受け止め方をしてまして(例えば1000行目辺りと
1行目を同時表示させたいとか)、ならばメイン&サブにして、
メインのヘッダ部にサブフォーム(同表を多重化して先頭行だけを表示させる)を
置く方法なんかを想定してみました。
でも、次の記述をよく読むと違いますね。(^^;)

>"集計表B.tbl"の最大の行数は18行と見込まれますので、明細行の繰り返し数
>を「20」としています。フォームの大きさも20行分が表示されるようにして

>データの総行数が17行などであり、特定行が最終行である場合などでは、特定
>行が10行目に表示され、先頭行が表示されなくなります。

行数が20行を超えることは無さそうだと云う前提で、フォームをオープンした時に、
画面上に表示されるのは、例えば行番号8〜17のレコードではなく、
行番号1〜17となって欲しいと云うことのようです。

23811 Re:処理対象行の表示位置(解決) 悲しげ 2003/12/09-22:43
記事番号23810へのコメント
書き足りなかった。(^^;)

>行数が20行を超えることは無さそうだと云う前提で、フォームをオープン
>した時に、画面上に表示されるのは、例えば行番号8〜17のレコードで
>はなく、行番号1〜17となって欲しいと云うことのようです。

レコードポインタは17行目にして、と云う前提を書き忘れました。

23812 Re:処理対象行の表示位置(解決) 沼田 2003/12/09-23:27
記事番号23811へのコメント
宮城さん、悲しげさん、こんばんは。

全く悲しげさんのおっしゃる通りです。
「前提」もその通りですし、状況もその通りです。
このような状態では処理対象行とした行は画面の真ん中に表示されてしまうようですね。
もちろん、「フォームのオープン時には」という、別の前提が付け加わりそうですが....。
何らかの作業の後では、必ずしも処理対象行が真ん中に表示される、
ということでもなさそうですが、フォーム開始イベント内で並べ替えや絞り込みを行えば
当然処理対象行は先頭行となり、この状態が意に沿わないということで対象行を
変更した後に表示させようとすると、この時は明細領域の真ん中に
処理対象行が来てしまうようです。

これを回避しようとして、
例えば一旦先頭行にカーソルを移してからもう一度希望する行にカーソルを移してみたり、
メソッドで描画を禁止してみたり、もしかするとオープン時のタイミングでフォーム表示の座標の取得に失敗しているのかもと思って
タイマーイベントを使ってみたりしたんですが、どれもうまく行きませんでした。
このような状態が桐の仕様なら仕方ないですが、どこかの設定などを見落としているのかもしれないと思い、
質問させていただきました。
結論は、自分なりには「仕様」だと、納得させるしかありませんでした。
もし、そうではないようでしたら、ぜひご教示下さい。

23822 Re:処理対象行の表示位置(解決) アックン 2003/12/10-09:16
記事番号23812へのコメント

沼田さん>
>これを回避しようとして、
 :
>イベントを使ってみたりしたんですが、どれもうまく行きませんでした。
ぼくもまったく同じことを試みたことがあります。

宮城さん> 悲しげさんと沼田さんが書かれているとおりです。
これは実際に試してみるとすぐにわかるんですが、フォームを開いた直後は明細行の表示位置を桐が自動的に決めています。
これを、任意の行を任意の位置に表示したいというニーズです。

沼田さんの場合は、20行の明細部繰り返し数の中に、先頭行から最終行(最大18行)までを表示しておき、
検索した行をハイライトにするというものです。

検索に限らず、任意の行を何らかの方法で処理対象行にしたいとき、
フォーム開始イベント内でメソッドを使って明細番号を設定しても、有効でなかったと記憶してます。
そこで、困ったときのコマンドボタンを実行開始コマンドに指定してやれば、
コントロール可能になったというわけです。
23832 フォームを開いた直後に明細番号設定メソッド 悲しげ 2003/12/10-12:39
記事番号23822へのコメント
どもっ、アックン君

>検索に限らず、任意の行を何らかの方法で処理対象行にしたいとき、フォーム開
>始イベント内でメソッドを使って明細番号を設定しても、有効でなかったと記憶
>してます。そこで、困ったときのコマンドボタンを実行開始コマンドに指定して
>やれば、コントロール可能になったというわけです。

私もこのことには悩んだ口です。(^^;)
で、今回改めてV9のヘルプで「明細番号設定」メソッドを見てみたら、
設定できないイベントとして「フォーム開始」が明記(追記)されてますね。
V8のヘルプでは無記載でしたが。
ただ私が試した感じでは、コマンド牡丹の開始時実行でも、「明細番号設定」メソッドは利いてないような気がします。
確かに、フォームを開いた直後に、何らかの形で処理対象行を指定した際の
画面表示のされ方(当該行が画面中央になるか画面の下部になるか)は違ってはいますけど。
私の試し方が間違っているっぽいですけど。ちょっと試して戴けます?

23837 Re:フォームを開いた直後に明細番号設定メソッド アックン 2003/12/10-14:52
記事番号23832へのコメント
悲しげさん、おこんにゃちゃわん。(=^・^=)
V9ヘルプに記載されているのは知りませんでした。V8一括マニュアル本「つぎのイベントハンドラ内では、
明細番号を設定できません」リストに、[フォーム開始]イベントが記載されてないんだから、
そりゃもういろいろ試したのでありますよ、当時。

No.23806の下の方に例を書いたのですが、メソッドより先にいったん終端行にジャンプしないと、
指定した明細番号に落ち着かないんですわ。なぜか?ふっふ・・・・・・知りません。
この超裏技(わらひ)見つけるまでの長い道のりは実に、ふ〜はぁ・ふ〜はぁ・あい〜ん・ぽてちん。。。状態でありました。_(--:_ nobita...

(↓)使用例(フォーム開始イベントなし)
proc 明細番号設定()
/* フォーム開始時の実行コマンド / b_隠し_明細番号設定 */
ジャンプ 行番号=終端
method @フォーム.明細番号設定( 2 )
end

なぜか先頭にジャンプすると、メソッド効かない。
メソッド単独だと、まったく効かない。
終端ジャンプだとなんで効くんだろう。(^^;
23838 Re:フォームを開いた直後に明細番号設定メソッド 悲しげ 2003/12/10-15:49
記事番号23837へのコメント
どもっ、アックン君

>なぜか先頭にジャンプすると、メソッド効かない。
>メソッド単独だと、まったく効かない。
>終端ジャンプだとなんで効くんだろう。(^^;

私の場合は、ジャンプ(当然メソッドの前)も明細番号も任意の行
(先頭、中間、終端いずれも有り)へですが、どうしてもうまく行きませんでした。
「フォーム開始」でも「開始時」コマンドボタンの手続き実行でも。
で、最終的には、例によって次のように「タイマー」イベントで逃げています。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
手続き定義開始 フォーム::タイマー1()
 オブジェクト操作 @フォーム.タイマー1="0"
 if(・・・・)
  *----明細番号設定メソッドはフォーム開始では無効?ゆえ、ここで?
  method @フォーム.描画禁止(1)
  /*&行番,&明細番はフォーム呼出し前に代入済み*/
  ジャンプ 行番号=&行番
  method @フォーム.明細番号設定(&明細番)
  method @フォーム.描画禁止(0)
 end
手続き定義終了
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
でもこれだと一瞬チラリと先頭行で表示されてから飛ぶんですよね。(;_;)

23844 Re:フォームを開いた直後に明細番号設定メソッド アックン 2003/12/11-08:08
記事番号23838へのコメント
悲しげ先生、再確認でありんす。これ(↓)効き目なし?
(開始時実行コマンドボタンを使用)

  ジャンプ 行番号=終端
  method @フォーム.明細番号設定(&明細番)
23855 Re:フォームを開いた直後に明細番号設定メソッド 悲しげ 2003/12/11-16:07
記事番号23844へのコメント
>悲しげ先生、再確認でありんす。これ(↓)効き目なし?
>(開始時実行コマンドボタンを使用)
>
>  ジャンプ 行番号=終端
>  method @フォーム.明細番号設定(&明細番)

すいません、アックン君(先生?)+他の皆様
完璧に私の勘違いでごじゃりました。<(_ _)>
私がやってうまく行かないのは

手続き定義開始 フォーム::フォーム開始(長整数 &表番号)
 グループ検索 {[某項目]=&某値},終了状態=&実行リターン
 ・・・・・

のように、フォーム開始(または開始時実行ボタン)でグループ検索させていたからでした。
これだと、先ずは、当該グループの先頭行に位置せざるを得ませんですもんね。(^^;)
この前提を省略していたら(実は私自身忘れていた)、話が通じませんですよね。
すみませんでした。

23859 Re:フォームを開いた直後に明細番号設定メソッド アックン 2003/12/11-17:04
記事番号23855へのコメント
悲しげさん> ぼくの方こそ勘違いです。
えっと、
>>  ジャンプ 行番号=終端
これはあくまで終端行を、続くメソッドで指定した明細行に位置させる処理でした。すいません。
どうやらわかってきたことは、任意の明細行に位置させたい行をメソッドよりも前に処理行にしておけばいいみたいです。
通常の検索コマンドをフォーム開始イベントに記述して、開始時実行コマンドの方で
一般手続きにメソッドの1行だけ記述したら、検索された行が指定した明細行にずばり位置します。
というのが、そもそもこの質問への回答だったですね。自分ですっかり忘れてたりして。(^^;ほっほっ
これが悲しげさんのようにグループ検索だったら、グループの最初の行に位置するわけですけど、
それからさらに明細の任意の行にわざとジャンプするなり
検索するなりして処理対象行を移動すれば(できるかどうか試してないです)、
あとはメソッド1行だけでうまくいくような気がするんですが。
>>  method @フォーム.明細番号設定(&明細番)

戻る