過去の桐井戸端BBS (桐ver.8)
16803 イベントで訂正状態と表示状態の行き来は出来ないのでしょうか しぼうかん 2002/07/31-22:17
こんばんは、しぼうかんです。

もう桐9を入手して使ってらっしゃる方も増えてきた様ですが、私の環境ではインストールすら出来ません。
たぶん発売時期にはパソコンの買い換えが必要になりそうです。

桐8ではオブジェクトの入力前イベントでは置換の様なコマンドは"KU1068:対象表が更新中またはグループ操作中のため
このコマンドは使用できません"とエラーメッセージが出て実行出来ませんが、
桐9ベータ版では可能でしょうか?または何か裏技的な方法で桐8でも出来ますか?
16805 Re:イベントで訂正状態と表示状態の行き来は出来ない? 今村 誠 2002/07/31-23:29
記事番号16803へのコメント
>桐8ではオブジェクトの入力前イベントでは置換の様なコマンドは"KU1068:対象表
>が更新中またはグループ操作中のためこのコマンドは使用できません"とエラーメッセー
>ジが出て実行出来ませんが、桐9ベータ版では可能でしょうか?または何か裏技的
>な方法で桐8でも出来ますか?

こんにちは、何をされたいのかよくわかりませんが、多重化した編集中の表は検索できますので
最大値を求めたり、同じ名前の同じ月の番号を求めたりできます。
編集している表を対象とするサブフォームを適当に貼り付け「画面表示しない」にして
そのフォームの、フォーム開始イベントで、表番号を取得すれば編集中の表ですが、
編集中ではないので入力中のフォームからメソッドで名前や日付(月)の一致する条件で検索して、
求めたい数値を探したり、最大値に1を足すことは容易にできます。


16806 入力前イベントで置換を行う目的は? 佐田 守弘 2002/07/31-23:52
記事番号16803へのコメント
しぼうかんさん
桐ver.8でのコメントになります。
タイトルに書かれているイベントで行訂正状態と表示状態の行き来は可能です。
これは、「メソッド呼び出し @フォーム.更新モード設定(n)」コマンドで行います。

さて、タイトルと書かれている質問が一致しないのですが、本文中に書かれている
入力前イベントで置換を行うについては、なぜその様な事をするのかについて、
もう少し詳しくお知らせ下さい。

■〔解説〕入力前後でのイベントとその用途
詳しくはオンラインヘルプなどに書いてありますが、桐ver.8では入力の前後で発生する
イベントに、「入力前」「入力後」「ソース値更新」のイベントがあります。
そして桐ver.9ではこれに「編集開始」イベントが加わりました。
●「入力前」イベント
このイベントは、テキストオブジェクトのクリックなどで編集操作を始めようとした時、
変数を行うエディタが起動する直前で発生します。
このイベントは、起動するエディタに対して初期値を与える時などに使います。
このイベント発生時には、エディタは起動していないので、編集文字列を反転する、
範囲指定するなどの操作はできません。
●「編集開始」(桐ver.9より)
イベントが起動した直後に発生します。編集を行う文字列に対して、選択範囲を指定したり、
カーソルの初期位置を指定するといった操作を行います。
●入力後
入力操作でEnterキーを押して値を確定すると、エディタが終了してその値を表に書き込みますが、
エディタが終了して表に書き込む前に発生するイベントです。
入力値のチェックや、値が不適の場合、再度エディタを起動して編集をやり直させるといった時に使います。
あるいは、表に書き込む前に、値を整形する操作にも使えます。
●ソース値更新
入力が終了し、編集値が表に書き込まれた直後に発生します。表に書き込まれた結果を使って
他の項目の値の計算や、入力後に行う操作に移行するなどに使います。

さて、それぞれのイベントの機能は上記の通りですので、入力前イベントを使って、
表全体に対する値の書き替えである置換コマンドを行う事自体が、表の状態になじまない様に思います。
そもそも、入力前イベントが発生した時には、表を更新状態に移行させた訳なので、
ここで表示に戻そうとしたり、表示状態でなければ行えない置換を行う事が適切でないと思うのですが。

佐田守弘(KS-00119)
16809 説明ベタですいません しぼうかん 2002/08/01-21:01
記事番号16803へのコメント
こんばんわ しぼうかんです。

今村さん、佐田先生、早速のご返答ありがとうございます。お世話になります。

過去に投稿した内容16076や16494からの続きの為に説明内容がかなりダブってしまうのを
おそれて問題点だけを簡単に説明してしまいました。すいません。

納品書メイン.tblと納品書サブ.tblを編集対象表とする納品書入力フォーム(メイン&サブフォーム)と
同じく納品書メイン.tblと納品書サブ.tblを編集対象表とする請求書入力フォーム
(メイン&サブフォーム…請求書番号でグループ化してあります)を作り,納品書入力フォームでは[納品書番号]と
[請求書番号]その他の項目を入力し印刷し、請求書入力フォーム([請求書番号]では請求書発行日を入力して印刷する。
これだけの事をしたいのです。

[納品書番号]と[請求書番号]はどちらも印刷はしませんが[請求書番号]はこの項目で
納品書をグループ化して納品書の金額を合計して請求金額を求める為作りました。
[納品書番号]の初期値式には#直前値([納品書番号],1000)+1と記述して

[請求書番号]は次の3つの項目を使って半自動で求めています。

1つ目の項目 [請求書番号計算用1]の項目計算式には
[会社名]+[締月]

2つ目の項目 [請求書番号計算用2]の項目計算式には
#cond(#直前値([請求書番号計算用1],"")=[請求書番号計算用1] .or #表引き([請求書番号計算用1],=,"納品書表引き用",[請求書番号計算用1],[納品書番号])><"" .and #表引き([請求書番号計算用1],=,"納品書表引き用",[請求書番号計算用1],[納品書番号])><[納品書番号],#直前値([請求書番号計算用2],1000),1,#直前値([請求書番号計算用2],1000)+1)
…"納品書表引き用"ファイルとはフォーム終了イベントで表引き用に同じ内容の物を書き出す様して作ったファイルです。

3つ目の項目 [請求書番号計算用3]の項目計算式には
#cond(#直前値([請求書番号計算用1],"")=[請求書番号計算用1],#直前値([請求書番号計算用3],0),#表引き([請求書番号計算用1],=,"納品書表引き用",[請求書番号計算用1],[納品書番号])><"" .and #表引き([請求書番号計算用1],=,"納品書表引き用",[請求書番号計算用1],[納品書番号])><[納品書番号],#表引き([請求書番号計算用1],=,"納品書表引き用",[請求書番号計算用1],[請求書番号計算用3]),1,#直前値([請求書番号計算用2],1000)+1)

[請求書番号]には[請求書番号計算用3]と同じ計算式が編集初期値式に記述して有ります。


16810 説明ベタですいません2 しぼうかん 2002/08/01-21:03
記事番号16803へのコメント
長くなってしまったので2つに分割しました

このフォームで
例えば20日締めのA社,B社,C社が有り7月19日にまずA社に納品書(請求書番号1001)を発行し、
次にB社に納品書(請求書番号1002)を発行しました。7月20日にまずA社に納品書(請求書番号1001)

を発行し、次にC社に納品書(請求書番号1003)を発行し、次にA社の請求書(請求書番号1001)とB社の
請求書(請求書番号1002)とC社の請求書(請求書番号1003)を順に発行しました。
しかし7月20日発行のA社の納品書(請求書番号1001)の品物が7月21日の納品になってしまいました。
そこでこの納品書の納品日を7月20日から7月21日に変更して再出力しなければなりませんが、
この場合当然この納品書の締月が8月に変更になりA社の7月21日納品分の納品書の請求書番号も1001から
1003にC社の7月20日発行の納品書の請求書番号も1003から1004に変更しなければなりません。
この時一度[請求書番号]を消してもう一度[請求書番号]にフォーカスを当てても
正しい(この場合1003)請求書番号が初期値として表示されません。
これは納品書入力フォームで入力後,フォームの多重化で請求書入力フォームに切り替えて請求書発行日を
入力した時に[請求書番号計算用2],[請求書番号計算用3]が再計算されてしまう事が原因です。

この為に現状では一度表示状態にして置換を実行してから[請求書番号]を消してもう一度[請求書番号]に
フォーカスを当てると正しい請求書番号が表示されます。
そこで[請求書番号]の入力前イベントで[請求書番号計算用1],[請求書番号計算用2],[請求書番号計算用3]の
置換を実行する事が出来ればいいと思ったのです。

この様なシステムが正しいのかどうかわからないのですが,
佐田先生とpokoponさんには表引き用のファイルのイベントでの作り方を、
今村さんにはメイン&サブフォームの作り方を教えて頂きやっとゴール出来た!!と思っていたのですが
実際に作業してみるといろいろ不具合が発見されて…ゴール地点には落とし穴だらけです。

ただ長いだけのこんな説明でわかっていただけるか甚だ不安ではありますが、
どうかよろしくおねがいします。

なお佐田先生に教えて頂いたイベントハンドラを以下の様に記述して見たのですが
置換のところでやはり例の"対象表が更新中…とエラーメッセージが出てしまいます。
(ちょっと表現が悪かったと思いますがこの場合の置換とは計算項目の再計算の事です。)
どの部分が間違っているのでしょうか?記述内容の意味は訂正モードから表示モードにして置換を行った後
また訂正モードにもどして入力を続行しようとする意味です。

手続き定義開始 t請求書番号::入力前(参照 文字列 &編集文字列)
メソッド呼び出し @フォーム.更新モード設定(0)
置換 [請求書番号計算用1]
メソッド呼び出し @フォーム.更新モード設定(2)
手続き定義終了

今村さんにお教え頂いた表番号の収得?や貼り付けるサブフォームの設定?などは
勉強不足でわからない事が多いので明日じっくり調べてもう一度報告いたします。
ただサブフォームの貼り付けは自己流でとりあえず[納品書番号]と[請求書番号]の
グループ項目と[請求書番号計算用1]と[請求書番号計算用2]と請求書番号計算用3]の
テキストオブジェクトを明細にもつサブフォームを作り
これにコマンドボタンを作りこのコマンドボタンに
1行目機能名 表示/訂正
2行目機能名 置換 パラメータ [請求書番号計算用1]
3行目機能名 表示/訂正
と記述して 
請求書番号の入力前イベントに
メソッド呼び出し @請求書番号用.@置換.実行()と書いて試してみましたが
"フォーカスを設定できる領域が無いので訂正モードにできません"とエラーメッセージが出てしまいました。


16811 Re:説明ベタですいません2 悲しげ 2002/08/01-21:59
記事番号16810へのコメント
概観しただけの感想ですが、「入力前」イベントではそもそも置換はできない
のだから、出来ないことを無理やりやろうとはせずに、「入力前」イベントに
入る前に置換を実行させるような組み立て方に発想を切り替えた方がいいような気がします。
「入る前に」どのように方法があるかについては、すいません、
概要もいまいち判らないことを含めて、名案がある訳ではありませんが、ま、
よくあるパターンとしてはコマンド牡丹の利用とか・・・・。

それと[請求書番号]を項目計算式で求めているようですが、項目計算式だと、
何かの時点で置換再計算されて変更になってしまうことがありえます。
[請求書番号]の類が後で変わってしまってもいいのでしょうか?
私なら項目計算式は使わないで、非計算項目として別途求めた値を行訂正などで記入します。
入力済みデータは別途「台帳」の類に転記保存しておきますから、
その台帳から以前の[請求書番号]の類を探し出してですね、
例えばその&最大値+1を今回の番号にする、とかですね。

16812 Re:説明ベタですいません2 今村 誠 2002/08/01-23:25
記事番号16810へのコメント
しぼうかんさんこんにちは、なかなかゴールしませんね。
>例えば20日締めの
> 7月19日 A社に納品書(請求書番号1001)を発行し、……………………う
>     B社に納品書(請求書番号1002)を発行しました。
> 7月20日 A社に納品書(請求書番号1001)を発行し、……………………あ
>     C社に納品書(請求書番号1003)を発行し、……………………い
> A社の請求書(請求書番号1001)と
> B社の請求書(請求書番号1002)と
> C社の請求書(請求書番号1003)を順に発行しました。………い
> 7月20日 発行のA社の納品書(請求書番号1001 あ)が7月21日の納品になってしまいました。
> この納品書の納品日を7月20日から7月21日に変更して再出力しなければなりません。
> この場合当然この納品書の締月が8月に変更になり
> A社の7月21日納品分の納品書の請求書番号も1001から1003に………あ
> C社の7月20日発行の納品書の請求書番号も1003から1004に変更しなければなりません。

 何故変更のないC社の請求書番号(い)を変えるのでしょうか。
 8月締めのA社の納品書(あ)を(請求書番号1004)にすればいいのではないですか。
 7月締めで、7月19日に納品された分(う)を訂正して印字する必要はあると思います。

しぼうかんさんの希望は、納品日毎に納品書を発行し、
同一顧客で、同一月に何回か請求書を発行し、その請求書番号は締め月が一緒の場合、
同じ請求書番号にしたいということで良いのでしょうか。
当然締め月が変われば、請求書番号も現在の請求書番号の最大値に1を足した数値にしたい。
この前提で話を進めると、締め月が変更になった納品書の請求番号は1004が一番の候補だと思います。

 請求書番号は、お得意先1社に1月に1回の締めで一つだけ割り当てるのですか。

別の表を書き出して、計算式を設定して請求書番号を求めるより、
納品書メイン.wfmに納品書メイン.tblを対象とする「表引き.wfm」をサブフォームとして
貼り付けて、編集表の切換で、最大値を求める方がいいと思います。
一番大きいメインのフォーム  表引き用サブフォーム 1 と 2  サブフォーム
フォーム名 納品書メイン.wfm 表引き用得意先.wfm 表引き.wfm  納品書サブ.wfn
編集対象表 納品書メイン.tbl 得意先マスター.tbl 納品書メイン.tbl 納品書サブ.tbl
納品月日と得意先名をメインフォームで入力すると、得意先マスター.tblから締め日を
検索して、締め日より大きいときは翌月小さいときは今月に締め月を項目値代入する。
表引き用の納品書メイン.tblを得意先コードと締め月で検索して
終端行の場合最大値に1を加えた数を請求書番号にする。
終端行でない場合その請求書番号を変数に代入して入力中の請求書番号に初期値として入れる。
16821 お返事ありがとうございます しぼうかん 2002/08/02-20:41
記事番号16811へのコメント
こんばんわ 悲しげさん"どもっ"が無いので少し寂しいですが

>概観しただけの感想ですが、「入力前」イベントではそもそも置換はできないのだか 
>ら、出来ないことを無理やりやろうとはせずに、「入力前」イベントに入る前に置換を
>実行させるような組み立て方に発想を切り替えた方がいいような気がします。「入る前
>に」どのように方法があるかについては、すいません、
>概要もいまいち判らないことを含めて、名案がある訳ではありませんが、ま、よくある
>パターンとしてはコマンド牡丹の利用とか・・・・。

はい納品書入力フォームには新規入力というボタンが配置して有りこのコマンドボタン
では置換をした後入力を始めるように設定して有りますが訂正時には置換の為のボタン
を押して、その後に修正という2段階方式では無く、マウスで修正するオブジェクトを
直接クリックしてイベントで置換が出来る裏技がないかと思ったのです。

>それと[請求書番号]を項目計算式で求めているようですが、項目計算式だと、何かの時
>点で置換再計算されて変更になってしまうことがありえます。
>[請求書番号]の類が後で変わってしまってもいいのでしょうか?

[請求書番号]は納品書入力フォームにで入力した金額を請求書入力フォームにフォームを
切り替えた時に同一の会社の同一の締め月でグループ化して集計する為だけに作った項目なので
印刷などには使いません。

だから後で変わってもいいかな?と思ったのです。
[請求書番号]が後で変わることによってどんな問題が発生するのかはテストで使い始めて間もないので、
まだわからないのですが。

>別途求めた値を行訂正などで記入します。

すいません。この辺はまだ内容を理解できていません解読中です。

>入力済みデータは別途「台帳」の類に転記保存しておきま
>すから、その台帳から以前の[請求書番号]の類を探し出してですね、例えばその&最大
>値+1を今回の番号にする、とかですね。

現在入力済みデータはフォームの終了時(通常1回で3枚の納品書を入力するときは3枚分の
データを入力後)にフォームの終了イベントで納品書表引き用.tblとして書き出しているのですが、
この納品書表引き用.tblの[請求書番号]から&最大値+1で新規の[請求書番号]を取り出して入力する為には、
納品書を1件入力する毎にイベントで入力データを納品書表引き用.tblに書き出して更新しておく。
という風に解釈したのですが解釈の仕方はあっているでしょうか?

あとこの方法は請求書番号の訂正はコマンドボタンを押してから[請求書番号]を訂正するという方法なのでしょうか?
頭がウニになりつつあるので質問ばかりですいません。
16822 毎度お世話になっております。 しぼうかん 2002/08/02-20:52
記事番号16812へのコメント
こんばんわ、今村さんいつもお世話になっております。

まず一番重要な請求書番号の目的を説明し忘れていた事に気がつきました。この[請求書番号]は納品書入力フォームで
入力した金額データを請求書入力フォームで同一得意先の同一月の請求額を自動的に合計する為にグループ化する為だけに
作った項目なのです。


>何故変更のないC社の請求書番号(い)を変えるのでしょうか。
>8月締めのA社の納品書(あ)を(請求書番号1004)にすればいいのではないですか。
>当然締め月が変われば、請求書番号も現在の請求書番号の最大値に1を足した数値にしたい。
>この前提で話を進めると、締め月が変更になった納品書の請求番号は1004が一番の候補だと思います。

はい、その通りです。がその請求書番号を自動または半自動で入力する方法がわからなかったので
こんなくるしい方法を考え出しました。
単純にカウンタ項目にしたら7月20日に発行したA社の納品書の納品日が変更無かった場合は、[請求書番号]は
1001にならず1003になってしまうので…

>7月締めで、7月19日に納品された分(う)を訂正して印字する必要はあると思います。

7月19日に納品された分(う)は7月締めに入れて請求書を発行する為、訂正しなくていいのです。

>しぼうかんさんの希望は、納品日毎に納品書を発行し、同一顧客で、同一月に何回か請求書を発行し、その請求
>書番号は締め月が一緒の場合、同じ請求書番号にしたいということで良いのでしょうか。

納品日毎に納品書を発行する場合と納品日にかかわらず、締め日前に納品書と請求書を一緒に発行する場合が有り、
通常は同一顧客に同一月には1回だけ請求書を発行します。
但し、例外的に年1、2回同一顧客に同一月に複数枚の請求書を発行する場合が有ります。

>請求書番号は、お得意先1社に1月に1回の締めで一つだけ割り当てるのですか。

お得意先1社に1月に1回の締めで一つだけ割り当てていますが、上記の通り例外的に
年1、2回1社に1月に複数の請求書を発行するときは複数の請求書番号を請求書ごとに割り当てたいと思っています。

長くなってしまいましたので2つに分割します


16823 毎度お世話になっております。 しぼうかん 2002/08/02-20:55
記事番号16812へのコメント
>納品月日と得意先名をメインフォームで入力すると、得意先マスター.tblから締め日を検索して、締め日より
>大きいときは翌月小さいときは今月に締め月を項目値代入する。

ここは現状で編集初期値式を使っての表引きで出来て居ます。

>編集表の切換で、最大値を求める方がいいと思います。

>表引き用の納品書メイン.tblを得意先コードと締め月で検索して
>終端行の場合最大値に1を加えた数を請求書番号にする。
>終端行でない場合その請求書番号を変数に代入して入力中の請求書番号に初期値として入れる。

すいませんがこの辺をどういう風にkebファイルに書けばいいのかよくわかりません。

正しい自信はないのですが考え方としてはまず[請求書番号]の入力前イベントでメソッド呼び出しコマンドで
フォーカスを"メインサブ.wfm"(納品書メイン.tblを編集対象表とする表引き用のサブフォームにこの名前を付けました。)
の[請求書番号計算用1](この項目の項目計算式には[得意先]+[締月]が入っているので検索に使用できると思うので)に設定して…

この項目をイベントで納品書メイン.wfmの[請求書番号計算用1]と納品書メインサブ.wfmの[請求書番号計算用1]を
照合し検索して一致する物があれば納品書メインサブ.wfmそのレコードの[請求書番号]を変数に代入してフォーカス
を納品書メイン.wfmに移してその変数を納品書メイン.wfmの[請求書番号]に初期値として入れ…

一致する物が無い場合[請求書番号]の最大値に1を加えた数を変数に代入してフォーカスを納品書メイン.wfmに
移して[請求書番号]に初期値として入れる。

この考えの元にとりあえず以下の様に記述して見たのですがやはり"検索 [請求…の部分が"対象表が更新中または
グループ操作中のためこのコマンドは使用できません"とエラーメッセージが出てしまいます。

頭がウニになりつつ有るのでピントはずれの解釈をしている可能性が大です。まだまだ勉強不足なので勉強しつつ
もうしばらく悪あがきをしてがんばってみます。

手続き定義開始 t請求書番号::入力前(参照 文字列 &編集文字列)
代入 &請求書番号計算用1 = [請求書番号計算用1]
メソッド呼び出し @納品書メインサブ.@請求書番号.フォーカス設定()
メソッド呼び出し @フォーム.更新モード設定(0)
検索 [請求書番号計算用1],{[]=&請求書番号計算用1},終了状態=&実行リターン
ケース開始
ケース (&実行リターン=1)
代入 &請求書番号 = [請求書番号]
ケース その他
項目集計 [請求書番号]
代入 &請求書番号 = &最大値+1
ケース終了
手続き定義終了

*こうしておいて[請求書番号]の編集初期値に&請求書番号を設定する

追伸 今村さんにはいつもお世話になっていますが最近はちょっと甘え過ぎている感じがして質問するのも
心苦しいのでもし桐がない、もとい、切りがない問題と判断された場合は気にしないで
いつでもお返事をうち切りになさっても感謝の気持ちは変わりませんので…では。
16824 Re:お返事ありがとうございます 悲しげ 2002/08/02-21:54
記事番号16821へのコメント
>悲しげさん"どもっ"が無いので少し寂しいですが

疲れてるんですね、きっと。(^^;)

さて、No.16821のコメント前段においての結論として、「入力前イベントで置換をしたい」件は
諦めてくれたと理解してよろしいでしょうか?

次、中段。
>[請求書番号]は納品書入力フォームにで入力した金額を請求書入力フォームにフォーム
>を切り替えた時に同一の会社の同一の締め月でグループ化して集計する為だけに作った
>項目なので印刷などには使いません。だから後で変わってもいいかな?と思ったので
>す。[請求書番号]が後で変わることによってどんな問題が発生するのかはテストで使い
>始めて間もないので、まだわからないのですが。

うっ(^^;)
そりゃ確かに請求書番号が変わってしまうことでどのような不具合が起こるのかは一概には云えませんけど・・・、
う〜ん、ともかく「請求書番号を変えない」ことを前提として処理を組み立てて行く方がよいような気がします
(云い換えれば、請求書番号項目は項目計算式を設定しない)。
と同時に、「グループ化項目」のように扱うのであれば、これまた項目計算式では好ましくなかったと思います。
これはそれなりの理由があったような記憶があります。
それと、一般的に伝票番号の類は、メイン&サブフォームでの「グループ項目」にもよく使われますが、
この場合も計算項目は使えません。
それやこれやで、とにもかくにも[請求書番号]項目は項目計算式を設定しない方向で抜本的に考え直してみては如何でしょう?
・・・・だまされたつもりで、とか云ってみる。(^^;)
さすれば道は開かれるかどうかは保証の限りではありませんが(^^;)、でも
このままだと泥沼化しそうな気がします・・・とも云ってみる。(^^;)(^^;)

その他(後段)のことは、この前提の上での話です(私の根本的な誤読かもしれませんが)。

16825 Re:多重化した表は同じtblでも表番号は違います 今村 誠 2002/08/03-00:14
記事番号16823へのコメント
しぼうかんさんこんにちは
>この考えの元にとりあえず以下の様に記述して見たのですがやはり"検索 [請求…の部分が"対象表が更新中また
>はグループ操作中のためこのコマンドは使用できません"とエラーメッセージが出てしまいます。

編集表の切換がないのでエラーが出ます。

proc t請求番号::入力前(参照 文字列 &編集文字列)
var 数値,{&得意c,&締年,&締月}
  method @t得意C.ソース値取得(&得意c,0 ) /* 0はデータ型はソースと一緒*/
  method @t締月.ソース値取得(&締月,0 )   /* 1は編集文字列として取得*/
  method @t日付.ソース値取得(&現在月日,0 )   /* 1は編集文字列として取得*/
  &締年=#cond(#月(&現在月日)>&締月,#元号年(#月数加算(&現在月日,4,1)),1,#元号年(&現在月日))
  項目値代入 [締年]=&締年
****ここまでで納品書メインに入力した得意コードと締め月を求めます。締め年は自動計算して項目値代入しています。
  編集表 &HYO5 /* ここが重要です多重化した納品書メイン.tblを検索に行きます*/
  &MAX2=1000
  検索 [請求番号]=#PROGN(#setq(&MAX2,#cond(&MAX2<[請求番号],[請求番号],1,&MAX2)),999999)
****上の行はあり得ない数値を検索して&最大値を求めています。
検索 [得意C]{[得意C]=&得意c,[締年]=&締年,[締月]=&締月}
****ここで入力中の納品書と同じデータが多重化した表にないか検索しています。
****多重化した表は常に最新のデータですので書き出したり置換したりする必要がありません。
    if ( .not #eof ) /* 終端行でない場合同じ締めで同じ請求先が見つかった*/
&G=[請求番号]
else
&G=&MAX2+1
   end
  編集表 &HYO /* ここで入力中の編集表に戻します*/
  &編集文字列=#str(&G) /* 編集文字列に請求書番号の初期値を表示させます*/
end

変数は一括処理から入っているためにそのままでは動きません。
メインアンドサブフォームに3つのサブフォームを貼り付けたら、そのフォーム毎にイベントファイルを造り
メインのフォームのイベントファイルのメイン部で共通か固有で整数型の変数を宣言して、フォーム開始イベントで
表番号を取得する必要があります。


16844 どもっ しぼうかん 2002/08/03-23:36
記事番号16824へのコメント
こんばんわ、悲しげさん

>云い換えれば、請求書番号項目は項目計算式を設定しない)。
>と同時に、「グループ化項目」のように扱うのであれば、これまた項目計
>算式では好ましくなかったと思います。

[請求書番号]は項目計算式は未定義で編集初期値に計算式を書いています。
(じゃないとグループ項目に出来ないので)この[請求書番号]の値を求めるために別の項目
([請求書番号計算用1]、[請求書番号計算用2]を用意してこの項目には項目計算式を設定しこの項目に対して
置換を実行してからこの項目の値を利用して編集初期値として[請求書番号]を入力しています。
なのでただ置換するだけでは[請求書番号]は変わりません。


>このままだと泥沼化しそうな気がします

すでに泥沼にハマッテもがいているところです。(∋_∈)
16863 表番号でつまずいてます。 しぼうかん 2002/08/04-17:33
記事番号16825へのコメント
こんばんわ、今村さん具体的なアドバイスありがとうございます。

アドバイスを理解しようとしているのですがまだわからないところがあり、返事も遅れてしまってすいません。
もう少し補足説明をお願いしてもよろしいでしょうか。

>編集表 &HYO5 /* ここが重要です多重化した納品書メイン.tblを検索に行きます*/

この部分はたぶん表番号をつかって編集表を開く意味だと思うのですがここでつまずいてうまくいきません。
ツールの変数管理に無いということは普通の変数ではないですよね。
表番号の収得についてかかれているリファレンスの部分はどの辺なのでしょうか。
探してはいるのですが見つかりません。
フォーム開始イベントの時に自動的に"手続き定義開始 フォーム::フォーム開始(長整数 &表番号)"と
記述されるのですがこの"&表番号"が関係しているとは思うのですが使用方法が?
またリファレンスに適当な部分がないときは表番号の収得の説明とかがあるHPなどは知りませんでしょうか。
いまこの表番号についておぼろげに理解しているのは最初に開いた表の表番号が0で次に開いた表は1となるのかな…その程度です。

>メインアンドサブフォームに3つのサブフォームを貼り付けたら、そのフォーム毎にイベントファイルを造り

現状ではメインフォーム1つとサブフォーム1つですがこれに検索用のサブフォームを1つ加えると
サブフォームは2つですが3つめのサブフォームとはなんでしょうか。

>変数は一括処理から入っているためにそのままでは動きません。

この方法は一括処理を使わないとダメなのですか?(すいません。まだ一括は組んだことがなかったので
一括限定の場合はまた勉強を始めないといけないので)

16868 Re:表番号でつまずいてます。 今村 誠 2002/08/04-21:48
記事番号16863へのコメント
しぼうかんさんこんにちは。
>>編集表 &HYO5 /* ここが重要です多重化した納品書メイン.tblを検索に行きます*/
>この部分はたぶん表番号をつかって編集表を開く意味だと思うのですがここでつまずいてうまくいきません。

ここは編集表を切り替えると言うことです。
サブフォームを貼り付けた時点で、例えばメインフォームの編集表(納品書メイン.tbl)
の表番号が1とすれば       …………………………あ  &HYO
納品書サブフォームの編集表(納品書サブ.tbl)
の表番号は2となるかもしれません。…………………………い &HYO2
また表引きで請求番号を求めるために貼り付ける表引きフォームの編集表(納品書メイン.tbl)
の表番号が3になるかもしれません。…………………………う &HYO5
しぼうかんさんは編集初期値でされているようですが、私が作ったのでは、締め月を求めるために
得意先表引きフォームの編集表(得意先.tbl)の表番号……え &HYO1
も判ってないと得意Cを検索して締め日を計算できないので取得する必要があります。

>表番号の収得についてかかれているリファレンスの部分はどの辺なのでしょうか。

あまりマニュアル読まないので知りません。htmlのヘルプファイルとお送りした略記テーブルの
関数とコマンドの説明を見ることが多いのでごめんなさい。

>フォーム開始イベントの時に自動的に"手続き定義開始 フォーム::フォーム開始(長整数 &表番号)"と
>記述されるのですがこの"&表番号"が関係しているとは思うのですが使用方法が?

ここまでお調べになられたら答えは簡単です。
&HYO5=&表番号
とするだけでそのフォームの表番号が求められます。

>>メインアンドサブフォームに3つのサブフォームを貼り付けたら、そのフォーム毎にイベントファイルを造り
>現状ではメインフォーム1つとサブフォーム1つですがこれに検索用のサブフォームを1つ加えると
>サブフォームは2つですが3つめのサブフォームとはなんでしょうか。
>>変数は一括処理から入っているためにそのままでは動きません。
>この方法は一括処理を使わないとダメなのですか

そんなことはないですよ。変数を宣言する場所がフォーム開始ではうまく動かないし、宣言する種別が
大事だと言うことです。前コメントの繰り返しになりますが

>>メインのフォームのイベントファイルのメイン部で共通か固有で整数型の変数を宣言して、

最初にメイン部で宣言しないとサブフォームのフォーム開始で編集表の表番号を取得できないかもしれません。
ただ共通を宣言するとフォームを切り替えるたびに、「その変数は既に宣言済みです」と桐からメッセージが出るかもしれません。
(このようなメッセージが嫌いなので一括から入っています。
メニューフォームからだとそこで使いたい変数を最初に宣言しておくともちろん出ませんよ)

具体的に書くと納品書メインフォーム用のイベントファイルしぼうかんさんの場合は納品書.KEVのようですね。

名札 メイン

変数宣言 共通,整数{ &HYO,&HYO1,&HYO2,&HYO3,&HYO4,&HYO5 }
変数宣言 共通,日時{&現在月日} ,固有,数値{&G,&MAX2}



手続き定義開始 フォーム::フォーム開始(長整数 &表番号)
変数宣言 固有 数値{&ok,&印刷頁},固有 文字列{&状態}
&HYO=&表番号
手続き定義終了
16886 重要なお知らせです 今村 誠 2002/08/05-23:12
記事番号16868へのコメント
しぼうかんさんこんにちは。
>具体的に書くと納品書メインフォーム用のイベントファイルしぼうかんさんの場合は納品書.KEVのようですね。
>
>名札 メイン
>
>変数宣言 共通,整数{ &HYO,&HYO1,&HYO2,&HYO3,&HYO4,&HYO5 }
>変数宣言 共通,日時{&現在月日} ,固有,数値{&G,&MAX2}
>
>*
>
>手続き定義開始 フォーム::フォーム開始(長整数 &表番号)
>変数宣言 固有 数値{&ok,&印刷頁},固有 文字列{&状態}
>&HYO=&表番号
>手続き定義終了

しぼうかんさんのフォームのフォーム名とイベントファイルの組み合わせについてです。

フォーム名   イベントファイル名 編集対象表
納品書入力.wfm 納品書.kev     納品書メイン.tbl
納品書サブ.wfm 納品書.kev     納品書サブ.tbl
請求書入力.wfm 請求書.kev     納品書メイン.tbl
請求書サブ.wfm 請求書.kev     納品書サブ.tbl

このようにフォーム名とイベントファイルが1対2の関係にあると
フォーム開始では正しい表番号は取得できません。
またメイン部の変数も2回宣言されたことになります。
フォームとイベントファイルは必ず1対1で作成しないと
正常な答えは出ません。
納品書入力.wfm 納品書入力.kev   納品書メイン.tbl
納品書サブ.wfm 納品書サブ.kev   納品書サブ.tbl
請求書入力.wfm 請求書入力.kev   納品書メイン.tbl
請求書サブ.wfm 請求書サブ.kev   納品書サブ.tbl
このようにフォームとイベントファイルは同じ名前が一番
後々のチェックで紛れがなくて良いと思います。
16888 1歩1歩すすんでいる? しぼうかん 2002/08/06-20:45
記事番号16886へのコメント
今村さん、こんばんわ。返事が遅れてすいません。

簡単な事でも知らないと、つまずいてしまいいつまでも起きあがれない事がよくあります。

まだ解決していませんが途中報告を致します。

以下の通り記述して実行しました

1.手続き定義開始 t請求書番号::入力前(参照 文字列 &編集文字列)
2.var 数値,{&締年,&締月,&納品書番号,&MAX2,&G},文字列{&現在月日,&得意先}
3.method @t得意先.ソース値取得(&得意先,0)
4.method @t締月.ソース値取得(&締月,0 )
5.method @t日付.ソース値取得(&現在月日,0 )
6.method @t締年.ソース値取得(&締年,0 )
7.method @G納品書番号.ソース値取得(&納品書番号,0 )

8.*&締年=#cond(#月(&現在月日)>&締月,#元号年(#月数加算(&現在月日,4,1)),1,#元号年(&現在月日))
9.*項目値代入 [締年]=&締年

*8.行目と9.行目はうまく行かなかったのでとりあえず6.行目に替えました。

10.編集表 &表0
11.&MAX2=1000
12.検索 [請求書番号]=#PROGN(#setq(&MAX2,#cond(&MAX2<[請求書番号],[請求書番号],1,&MAX2)),999999)
13.検索 [得意先]{[得意先]=&得意先,[締年]=&締年,[締月]=&締月,[納品書番号]><&納品書番号}
14.if ( .not #eof )
15.&G=[請求書番号]
16.else
17.&G=&MAX2+1
18.end
19.手続き定義終了


*[得意先コード]は今現在、納品書入力フォームに無いので[得意先]に変えて実行しました。

以上の用に記述後、[請求書番号]の編集初期値に&Gと書いておくと
エラーメッセージは出なくなったのですが
[請求書番号]の新規入力時には未定義の表示となり、一度表示状態にした後もうフォーカスを当てて一度入力しようとすると
正しい請求書番号が表示されます。
なぜ最初の入力時には未定義になるのか現在調査中です。

今、今村さんの"重要なお知らせ"を見ました。桐に関する全体的な知識も必要なのですね。
今つまずいている問題はもしかしたらこれが原因かもしれません。なお納品書メインを多重化して作った検索用のファイルにも
イベントファイルは別に作った方がいいんでしょうね。今システムのファイルが無いので明日お返事させて頂ます。m(_ _)m


16897 経過報告2です しぼうかん 2002/08/07-21:07
記事番号16886へのコメント
こんばんは、今村さん。まだ途中経過です。

問題の原因が推測できましたがどうも[編集初期値式]→イベントハンドラの順に実行される為に、&請求書番号を求める為の
フォームの[請求書番号]の入力前イベントハンドラの計算を実行する前に、編集初期値式に設定した&請求書番号が
確定されてしまう様です。

そこで方法として編集初期値式に書いた&請求書番号を消してイベントハンドラの計算で求めた&請求書番号の値を
[請求書番号]に表示する方法、又は、フォームのオブジェクトを[請求書番号]から&請求書番号に替えてこの&請求書番号を
[請求書番号]へ持って行く方法、どんな方法があるのか、うーんまだまだ調査中です
16899 Re:経過報告2です 悲しげ 2002/08/07-22:33
記事番号16897へのコメント
どもっ、しぼうかんさん
No.16897だけに関してのコメントです。

しばしば、表定義の「**初期値式」とか「**制約式」の設定と、
イベントでやろうとすることがぶつかることがあります。
これらは私の乏しい経験では「イベントとは相性が悪いのでは?」と思ったりもしています。
と云う訳で、どちらかにした方がいい、と云うか、
イベントで細々と設定しようとするのなら、「**初期値式」は抜きにするやり方なんかもご検討されるとよいかもしれません。

16911 Re:基礎が大事です 今村 誠 2002/08/08-21:53
記事番号16897へのコメント
しぼうかんさんこんにちは
>問題の原因が推測できましたがどうも[編集初期値式]→イベントハンドラの順に実行される為に、
>&請求書番号を求める為のフォームの[請求書番号]の入力前イベントハンドラの計算を実行する前に、
>編集初期値式に設定した&請求書番号が確定されてしまう様です。
編集初期値が優先されるのではと思います。編集初期値を使うのであればイベントは使わない方がいいと思います。
>なお納品書メインを多重化して作った検索用のファイルにもイベントファイルは別に作った方がいいんでしょうね。
それがないと請求書番号は訂正できないし、連続して納品書の入力はできないと思います。
イベントをたくさん書いても、表番号が不明のままでは結果も不定です。
納品書メインを訂正しても明細まで一緒に変わることはないので、ソース値更新イベントを書いてみました。
proc t納品番号::入力前(参照 文字列 &編集文字列)
var 文字列,{&納品番号}
  method @t納品番号.ソース値取得(&納品番号,1 )   /* 1は編集文字列として取得*/
  alter &HYO5
  &MAX2=1000
  検索[納品番号]=#PROGN(#setq(&MAX2,#cond(&MAX2<[納品番号],[納品番号],1,&MAX2)),-9999999)
  &STR=#str(&MAX2+1)
  alter &HYO
  if (&納品番号<>"")
    確認 "納品番号を訂正しますか(はいEnter いいえEsc)",&確認
    cond(&確認<>1) return
    &編集文字列=&STR
  else
    &編集文字列=&STR
end
end
proc t請求番号::入力前(参照 文字列 &編集文字列)
var 数値,{&得意c,&締年,&締月}
  method @t請求番号.ソース値取得(&M1,0 ) /* &M1,2,3は共通か固有の変数です*/
  method @t納品番号.ソース値取得(&M3,0 )   /* 1は編集文字列として取得*/
  method @t得意C.ソース値取得(&得意c,0 ) /* 0はデータ型はソースと一緒*/
  method @t締月.ソース値取得(&締月,0 )
  method @t日付.ソース値取得(&現在月日,0 )
  &締年=#cond(#月(&現在月日)>&締月,#元号年(#月数加算(&現在月日,4,1)),1,#元号年(&現在月日))
  項目値代入 [締年]=&締年
  alter &HYO5  /* 多重化した納品書メイン.TBL 許可作業の多重化にチェックが必要*/
  &MAX2=1000
  検索[請求番号]=#PROGN(#setq(&MAX2,#cond(&MAX2<[請求番号],[請求番号],1,&MAX2)),999999)
検索 [得意C]{[得意C]=&得意c,[締年]=&締年,[締月]=&締月}
    if ( .not #eof )
&G=[請求番号]
else
&G=&MAX2+1
   end
  alter &HYO /* これがないと元に戻れませんよ納品書メイン.TBL*/
  &編集文字列=#str(&G) /* &編集文字列が入力前に表示される文字列のことです*/
end
手続き定義開始 t請求番号::ソース値更新()
  method @t請求番号.ソース値取得(&M2,0 ) /* 0はデータ型はソースと一緒 固有変数を宣言すること*/
  cond(&M2=&M1 .or &M1="") return /* 自動変数は他の手続きから参照することはできません*/
確認 "請求書番号が"+#str(&M1)+"から"+#str(&M2)+"に変わりました。納品書も訂正しますか(はいEnter いいえEsc)",&確認
  cond(&確認<>1) return
  alter &HYO3
  グループ検索 {[納品番号]=&M3,[請求番号]=&M1},終了状態=&確認
  cond(&確認=1) グループ値訂正 {[納品番号]=&M3,[請求番号]=&M2},終了状態=&確認
手続き定義終了
16940 事件発生です しぼうかん 2002/08/10-14:40
記事番号16897へのコメント
悲しげさん、今村さん、お返事ありがとうございます。
8日午後8時ごろ愛機シンクパッド1459のディスプレイ部分の表示が突然おかしくなり
何度かリセットを繰り返すとついにその短い一生を終えてしまいました。
享年3歳でした。今インターネットカフェで書き込みをしています。
それで今村さんのアドバイスはまだ勉強できていません。至急新しいシンクパッドを購入して報告をしたいと思います。
まさかこんなことになるとはトホホ・・・(;_;)

戻る