過去の桐井戸端BBS (桐ver.9)
29759 メイン・サブフォームでの新規に行を追加するのがうまくいかない 手塚 修 2005/04/27-11:19
 お客さん毎の週間集配予定表を作ろうとしています。
@のお客さんは、毎週、月・水・金曜日に、Aのお客さんは、火・木・土曜日に、
Bのお客さんは、月・木曜日に、Cのお客さんは、火・金曜日に集配に伺う予定表です。

桐5の一括処理で作った従来のものを、桐9(2004)のイベントを使ったものに直しているところです。
メインフォームは、カード型・週間集配予定表、サブフォームは伝票形式で顧客名の表です。
「左右連動三態」の1つをまねしています。
サブフォーム上の顧客名をクリックし、メインフォーム上のテキスト項目[顧客名]に反映させようとしています。

入力済みのデータを編集・訂正するのは、bQ8087で教えていただきました
そのものでうまく行っているのですが、新規に行を追加する場合がうまくいきません。

あつかましいのですが、そのものずばりを教えてください。

よろしくお願いいたします。

29772 Re:メイン・サブフォームでの新規入力について 佐田 守弘 2005/04/27-20:35
記事番号29759へのコメント
手塚 修さん
具体的なイメージが浮かばないので、あくまでも考え方のアドバイスです
 >サブフォーム上の顧客名をクリックし、メインフォーム上のテキスト項目[顧客名]
 >に反映させようとしています。
サブフォームのマウスクリックイベント、及びキー入力イベントでのEnterキー入力を調べます。
そしてその時のサブフォーム上の顧客名を一度変数に入力しておきます。
次いでメインフォームに戻り、行追加コマンドを実行して、コマンドの中で顧客名の設定を行えば、
目的通りの動作になるかと思います。

●「そのものずばり」とは?
 >あつかましいのですが、そのものずばりを教えてください。
多分、そのまま動くフォームとイベントを作って下さいという意味かと思います。
しかしながら、書かれている情報だけでは、そのまま動くものは作れません。
(情報が少な過ぎて不可能です)

データと現在までに作られているイベントなどを公開されれば別ですが、それは難しいでしょうね。

もし本当にその部分を作ってほしいという事であるなら、BBS上での相談ではなくて、
開発依頼をされた方が宜しいのではないかと思います。

佐田守弘(KS-00119)
29784 Re:メイン・サブフォームでの新規入力について 手塚 修 2005/04/29-12:22
記事番号29772へのコメント
 おそくなりまして、すみません。
>サブフォームのマウスクリックイベント、及びキー入力イベントでのEnterキー入力
>を調べます。そしてその時のサブフォーム上の顧客名を一度変数に入力しておきます。

 新規に入力する場合ですが、うまくいきません。サブフォーム側で下記のように
記したのですが。 変数としては取得できているかと思います。
手続き定義開始 顧客名::マウス左クリック(長整数           &処理中止)
  編集表 "顧客台帳.tbl"
    method @フォーム.更新モード設定(0)
    &顧客名=[顧客名]
  編集表 "予定表.tbl"
  method  ハンドル=&hwindow,@フォーム.更新モード設定(6)
  項目値代入 [顧客名]=&顧客名
手続き定義終了

上記ですとクリックのたびに次から次に行が増えてしまう、[顧客名]に&顧客名画表示されない等の問題があり、使えません。

メソッド呼び出し @%あ%.@%い%.ソース値取得(&%う%,0)
  %あ%...サブフォームの親フォーム上でのオブジェクト名
  %い%...取得する項目値を表示しているオブジェクト名
  %う%...取得した値を格納する変数名     も参考にしたのですが、%あ%が書けない、
メインフォームに書くのか、サブフォームで良いのか、わからない状態です。

>次いでメインフォームに戻り、行追加コマンドを実行して、コマンドの中で顧客名
>の設定を行えば、目的通りの動作になるかと思います。
 メインフォームから制御する方法は全くわからない状態です。

入力済みデータの編集訂正は、行訂正 [顧客名]=&顧客名 の利用でできています。

>●「そのものずばり」とは?
> >あつかましいのですが、そのものずばりを教えてください。
 他意はなかったのですが、失礼であったかと思います。申し訳ありません。

教えてください。よろしくお願いいたします。

29785 Re:メイン・サブフォームでの新規入力について 悲しげ 2005/04/29-15:41
記事番号29784へのコメント
メインとサブ、どちらのkevで実行させるかはどちらでもよいっつーか、
流れ的に妥当な方で構わないと思います。今回はサブのクリックから
入っているので、サブ側でよいんじゃないでしょうか?

で、表示モードで一貫させて処理する一例。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
手続き定義開始 顧客名::マウス左クリック(・・・・
 編集表 "顧客台帳.tbl"
 method @フォーム.更新モード設定(0)
 &顧客名=[顧客名]
 編集表 "予定表.tbl"
 行追加 [顧客名]=&顧客名
 ジャンプ 行番号=最終
 method ハンドル=&hwindow,※.フォーカス設定()
 /*※は初期フォーカスを置きたい項目のオブジェクト名*/
 method ハンドル=&hwindow,@フォーム.更新モード設定(2)
 /*上2行はひとつのボタンの実行メソッドでも可能*/
手続き定義終了
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

今回は、新規追加に特化して書いてあります。
もしも、既存データの訂正と新規追加を同時に扱いたいのであるとするならば、
その違いを何らかの方法で桐様に伝える必要があると思います
(その違いで以て処理をケース分けするために)。
そうじゃないと、いま今手塚さんのやりたいことが訂正なのか追加なのか、
桐側では読心できませんから。(^^;)


29788 Re:メイン・サブフォームでの新規入力について 手塚 修 2005/04/29-18:56
記事番号29785へのコメント
悲しげさん 教えていただきましてありがとうございます。

>もしも、既存データの訂正と新規追加を同時に扱いたいのであるとする
>ならば、その違いを何らかの方法で桐様に伝える必要があると思います
 この件は、以前教えていただきました&旗=新規入力、&旗=訂正で
区別しています。できているかと思います。

>〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
>手続き定義開始 顧客名::マウス左クリック(・・・・
> 編集表 "顧客台帳.tbl"
> method @フォーム.更新モード設定(0)
> &顧客名=[顧客名]
> 編集表 "予定表.tbl"
> 行追加 [顧客名]=&顧客名
> ジャンプ 行番号=最終
> method ハンドル=&hwindow,※.フォーカス設定()
> /*※は初期フォーカスを置きたい項目のオブジェクト名*/
> method ハンドル=&hwindow,@フォーム.更新モード設定(2)
> /*上2行はひとつのボタンの実行メソッドでも可能*/
>手続き定義終了
>〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
 サブフォームの[顧客名]をクリックするとメインフォームの[顧客名]に
転記されています。が、もう一度サブフォームの[顧客名]をクリックすると
行が追加されてしまいます。クリックするたびに行が追加される。
この問題を解決する考え方、方法、イベントはどのようにすれば良いのでしょうか?

よろしくお願いいたします。

29790 Re:メイン・サブフォームでの新規入力について 悲しげ 2005/04/29-22:27
記事番号29788へのコメント
> サブフォームの[顧客名]をクリックするとメインフォームの[顧客名]に
>転記されています。が、もう一度サブフォームの[顧客名]をクリックすると
>行が追加されてしまいます。クリックするたびに行が追加される。

あ、そうか、その件が問題だったのですね。
う〜ん、クリックしたらともかく行追加されるように記述してあるのだから、
当然の(むしろ期待通り?)の挙動だと思います。(^^;)

> この件は、以前教えていただきました&旗=新規入力、&旗=訂正で
>区別しています。

&旗への代入をどのようなタイミングで行っているのかは判りませんし、
その点がユーザインタフェースとしては大きいような気がしないでもありませんが、
それはさておき、もしそれが済んでいるのだとしたら
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
手続き定義開始 顧客名::マウス左クリック(・・・・
 cond(&旗="") return /*もし必要なら*/
 編集表 "顧客台帳.tbl"
 method @フォーム.更新モード設定(0)
 &顧客名=[顧客名]
 編集表 "予定表.tbl"
 if(&旗="新規入力")
  行追加 [顧客名]=&顧客名
  ジャンプ 行番号=最終
 else if(&旗="訂正")
  行訂正 [顧客名]=&顧客名
 end
 method ハンドル=&hwindow,※.フォーカス設定()
 method ハンドル=&hwindow,@フォーム.更新モード設定(2)
 &旗="" /*もし必要なら*/
手続き定義終了
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

一番簡単で判りやすいのは、新規入力と訂正で違うボタンを使うとか辺りでしょうけど、それはやはりダサイですか?

29801 新規データの追加の件 佐田 守弘 2005/04/30-09:11
記事番号29784へのコメント
手塚 修さん
●クリックの度に行が増える
 >上記ですとクリックのたびに次から次に行が増えてしまう、
これはその様に作っているので当然の挙動です。

でもこれでは答えにならないので補足します。新規行が追加されている状態は、
行追加状態であれば、「メソッド呼び出し 更新モード取得」コマンドでその状態が調べられると思います。
また作られているイベントでは、メソッド呼び出しコマンドで行追加をしている様なので、
行追加をする時にフラグを立てておき、行追加の処理が未完了かどうかの判断にもできるかと思います。

該当部分だけを直すなら、次の様になります。
 手続き定義開始 顧客名::マウス左クリック(長整数           &処理中止)
  編集表 "顧客台帳.tbl"
  メソッド呼び出し @フォーム.更新モード設定(0)
  代入 &顧客名=[顧客名]
  編集表 "予定表.tbl"
  ケース開始
   ケース (&行追加処理中=0)
    行追加 [顧客名]=&顧客名
    代入 &行追加処理中=1
  ケース終了
 手続き定義終了

●変数に顧客名が代入されていない
変数は固有変数ないしは共通変数を使っておりますでしょうか。
もし局所変数を使っているとすると、メインフォームとサブフォームでは別の変数として扱われますから、
仮に同じ変数名でもサブフォームからメインフォームへの引継はできません。

念のために共通変数で試してみて下さい。
共通変数であれば、フォームを閉じて、変数値を確認できます。

佐田守弘(KS-00119)
29804 Re:メイン・サブフォームでの新規入力について 手塚 修 2005/04/30-11:57
記事番号29790へのコメント
教えていただいた文を読んでいて「空白行を挿入し、その空白行を訂正すれば」と思ったのですが?
いかがでしょうか? 

新規入力の時は、メインフォームのイベントで空白行を挿入し、サブフォームのイベントで空白行を訂正する。
破棄終了する時には、行挿入そのものも破棄して
元の表の状態にする。保存終了にすれば、空白行が訂正された状態(つまり
新規入力されたのと同じ)で終了できる。
サブフォームのイベント  行訂正 [顧客名]=&顧客名  のみで新規入力にも、
訂正編集にも対応できる。そんな思いをしました。下記がメインのイベントです。

変数宣言 固有,文字列{&トランザクション}

手続き定義開始 フォーム::フォーム開始(長整数 &表番号)
 if(#トランザクションモード=1)  /*---フォームを開いた時に開始---*/
   トランザクション コミット
 end
  トランザクション 開始
if(&旗="予定表入力")
  オブジェクト操作 @入力中.画面表示=0,@訂正中.画面表示=1
  表 予定表
  行挿入 
  ジャンプ 行番号=先頭
else if(&旗="予定表訂正")
  オブジェクト操作 @入力中.画面表示=0,@訂正中.画面表示=1
 end
手続き定義終了
 
手続き定義開始 フォーム::フォーム終了()  /*---フォームを閉じ時の結果---*/
 if(&トランザクション=破棄)
   トランザクション ロールバック
 else if(&トランザクション=保存)
   トランザクション コミット
 end
手続き定義終了

教えていただきましたイベントで
> method ハンドル=&hwindow,※.フォーカス設定()
> cond(&旗="") return /*もし必要なら*/ 
 「※」が書けません。「return」がわかりませんでした。教えてください。
できれば、感想、批評もお願いいたします。 

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


29805 Re:新規データの追加の件 手塚 修 2005/04/30-12:12
記事番号29801へのコメント
>●変数に顧客名が代入されていない
>変数は固有変数ないしは共通変数を使っておりますでしょうか。
   固有変数です。きちんと代入されています。以前教えていただいた「変数のお守り」
   大切にしています。
>●クリックの度に行が増える
>でもこれでは答えにならないので補足します。新規行が追加されている状態は、行追加状態
>であれば、「メソッド呼び出し 更新モード取得」コマンドでその状態が調べられると思い
>ます。また作られているイベントでは、メソッド呼び出しコマンドで行追加をしている様
>なので、行追加をする時にフラグを立てておき、行追加の処理が未完了かどうかの判断にも
>できるかと思います。
>
>該当部分だけを直すなら、次の様になります。
> 手続き定義開始 顧客名::マウス左クリック(長整数           &処理中止)
>  編集表 "顧客台帳.tbl"
>  メソッド呼び出し @フォーム.更新モード設定(0)
>  代入 &顧客名=[顧客名]
>  編集表 "予定表.tbl"
>  ケース開始
>   ケース (&行追加処理中=0)
>    行追加 [顧客名]=&顧客名
>    代入 &行追加処理中=1
>  ケース終了
> 手続き定義終了
  
 せっかく教えていただきましたにもかかわらず、当方良く理解できない状態です。
 理解し、応用できればなと思っています。

ありがとうございました。
29806 Re:メイン・サブフォームでの新規入力について 悲しげ 2005/04/30-18:41
記事番号29804へのコメント
「トランザクション」云々でやろうとしていることが、さっぱり判りませんので、
「感想・批評」どころか、完璧に無視させて戴きます。再説明も不要です・・・・(^^;)

で、まず「※」ですが、これはNo.29785に書いたとおりです。

 method ハンドル=&hwindow,※.フォーカス設定()
 /*※は初期フォーカスを置きたい項目のオブジェクト名*/

行追加なりした直後は、オブジェクトリスト上で先頭にあるオブジェクトに
自動的にフォーカスが行っている筈ですが、ここを敢えて任意の項目オブジェクト等に
フォーカスを移して置いて、直ちに当該項目の訂正が行えれば便利かな、
と云うことで、ま、一種の小さな親切です。が、余計なお世話だったかもしれません。
直後のフォーカスがどこにあってもよいと云うのなら、この部分は無視して結構です。
もしフォーカスを移しておきたいと云うことで、仮にその項目名が[数量]で、
テキストオブジェクト名が「t数量」だったとしたら、※部は次のように記述することになります。

 method ハンドル=&hwindow,@t数量.フォーカス設定()

次、

> cond(&旗="") return /*もし必要なら*/

和名で書き換えれば

 条件(&旗="") 手続き終了

です。
挙動を説明すれば「もし変数&旗の値が空であったならば、
この手続き定義内に記述した処理を実行しない」になります。
ただし、あくまでもそのような「例」でして、手塚さんがしたいこととは無関係っぽいかな。
&旗の値が"追加"ならA、"訂正"ならB、空ならCとして、そのCの中味が上例と云うことです。

蛇足っつーか、混乱に拍車をかけることになるのかもしれませんが、
このように「手続き終了」させると、手続き定義内の処理は実行しないのだが、
桐独自の機能は実行されます(例えば、フォーカスがあった項目がクリックすることで訂正モードになるとか)。
あるいは、else if をひとつ起こして「&処理中止=1」を記述したら、
これは無反応になる(桐本来の機能も一時的に殺す)のではなかったかな?
が、この点は蛇足ですので、読み飛ばして下さい。(^^;)


29807 Re:メイン・サブフォームでの新規入力について 悲しげ 2005/04/30-18:47
記事番号29806へのコメント
言葉を補います。

>このように「手続き終了」させると、手続き定義内の処理は実行しないのだが、

正確には

このように「手続き終了」させると、手続き定義内での処理の内、「手続き終了」より後に記述した処理は実行しないのだが、

でしょうかね。

戻る