過去の桐井戸端BBS (桐ver.8)
18304 過去の「16803イベントで訂正状態と表示状態の行き来は出来ないのでしょうか」の16940の続きです。 しぼうかん 2002/12/21-23:51
諸々の事由で報告が非常に遅れまして申し訳ありません。(特に今村さん大変失礼しました。)

今村さんに教えて頂いた方法を少し変更して下記の通りにやってみると
そのとき悩んでいた問題は解決してうまくいきました。
カーソルを[請求書番号]の位置で訂正状態と表示状態を何度かクリックする事で
切り替えるとそのたびに[請求書番号]が1ずつ増えてしまうので
一部変更して"B-1〜B-20"の通り記述するとうまくいきました。
問題が解決したのは教えて頂いたA-19.とA-20.がポイントでした。実は半分むりかな?
と思っていたのでうまくいくのが不思議な変な感じがしました。

A-1.proc t請求番号::入力前(参照 文字列 &編集文字列)
A-2.var 数値,{&得意c,&締年,&締月}
A-3.method @t請求番号.ソース値取得(&M1,0 ) /* &M1,2,3は共通か固有の変数です*/
A-4.method @t納品番号.ソース値取得(&M3,0 )   /* 1は編集文字列として取得*/
A-5.method @t得意C.ソース値取得(&得意c,0 ) /* 0はデータ型はソースと一緒*/
A-6.method @t締月.ソース値取得(&締月,0 )
A-7.method @t日付.ソース値取得(&現在月日,0 )
A-8.&締年=#cond(#月(&現在月日)>&締月,#元号年(#月数加算(&現在月日,4,1)),1,#元号年(&現在月日))
A-9.項目値代入 [締年]=&締年
A-10.alter &HYO5  /* 多重化した納品書メイン.TBL 許可作業の多重化にチェックが必要*/
A-11.&MAX2=1000
A-12.検索[請求番号]=#PROGN(#setq(&MAX2,#cond(&MAX2<[請求番号],[請求番号],1,&MAX2)),999999)
A-13.検索 [得意C]{[得意C]=&得意c,[締年]=&締年,[締月]=&締月}
A-14.if ( .not #eof )
A-15.&G=[請求番号]
A-16.else
A-17.&G=&MAX2+1
A-18.end
A-19.alter &HYO /* これがないと元に戻れませんよ納品書メイン.TBL*/
A-20.&編集文字列=#str(&G) /* &編集文字列が入力前に表示される文字列のことです*/
A-21.end

*A-8.とA-9は自動で[締年]を入力する計算式の様ですがフォーム上で直接[締年]を入力する様にしました。

B-1.手続き定義開始 t請求書番号::入力前(参照 文字列 &編集文字列)
B-2.method @t得意先.ソース値取得(&得意先,0)
B-3.method @t締年.ソース値取得(&締年,0)
B-4.method @t締月.ソース値取得(&締月,0)
B-5.method @G納品書番号.ソース値取得(&納品書番号,0 )
B-6.編集表 &表3
B-7.検索 [得意先]{[得意先]=&得意先,[締年]=&締年,[締月]=&締月,[納品書番号]><&納品書番号},終了状態=&ok
B-8.行番号 &行番号
B-9.ケース開始
B-10.ケース (&ok=1)
B-11.代入 &請求書番号=[請求書番号]
B-12.ケース その他
B-13.絞り込み [納品書番号]><&納品書番号
B-14.項目集計 [請求書番号]
B-15.&請求書番号=&最大値+1
B-16.絞り込み解除 1
B-17.ケース終了
B-18.編集表 &表1
B-19.&編集文字列=#str(&請求書番号)
B-20.手続き定義終了

上記の通りにやってやっと終わったと思ったのですが、また問題点を見つけてしまいました。
下記の順に納品書を出力して(納品書番号,得意先,締月,請求書番号の並び表示です、
また請求書番号は納品書に印刷されません)


18305 過去の井戸端桐8の16940の続き2です。 しぼうかん 2002/12/21-23:53
記事番号18304へのコメント
長くなったので分割しました

1001ソニー8月1001
1002ソニー8月1001
1003IBM8月1002
1004富士通8月1003

その後、納品書の内納品書番号1003の納品書の締めを9月に変更してほしいと
営業より指示があった時に納品書番号1003の納品書の[請求書番号]をクリックすると1002から1004に変わるのですが、
変更の無いときでも納品書番号1003のレコードの[請求書番号]をクリックした場合に
[請求書番号]が1002から1005に変わってしまいます。
この事で請求書番号にダブリが発生する訳では無いので具体的に問題が発生する訳では無いのですが、
変わる必要の無い[請求書番号]がクリックするたびに変わり続けるのは何か違和感を感じます。
また[締月]を変更後に[請求書番号]を変更し忘れた場合は当然[請求書番号]は自動的には変わりません。
そこでこのイベントハンドラは[締月]と[得意先]に作るべき物なのかと考え、
初心に戻ってこのシステムについて最初から考え直してみて気がついたのですが
(気がつくのが遅すぎるー)システム作成を進める過程においてまず最小限これだけは絶対に必要だと思う目的を決め、
作業する人がどういう流れで入力し、また印刷するか、をイメージして入力の為に必要な項目を決め、
その目的の為に1つ又は複数のある項目の値の入力や訂正によって
連動して変化する別の1つ又は複数の項目があるというシステムを組む場合、
そのフォームで使用する入力項目がなぜ必要なのか?
どういう役割が必要なのか?
その役割の内絶対必要な役割と有ればいい役割を考えて決めておく事が必要だと感じました。
[請求書番号]については絶対に必要な役割とは同一締月、同一会社の納品書に同一の番号を付ける事
そして違うそれ以外は重複しない番号を付ける事だけだと思いました。
さらにこの項目は一枚の伝票だけではチェックの出来ない項目
(番号の,ダブリやヌケがないかをチェックする為には前後の伝票が必要)です。
一般的に考えられる請求書番号は請求書発行時に請求書発行順に
自動的に連番としてつけられるものの様に思っているのですが(あっているかどうかはわかりませんが)
今問題にしている[請求書番号]は納品書の金額を請求書に
まとめる為だけの"納品書集計用番号"という意味合いの物です。
これらの事を考えると[請求書番号]は人間の入力項目とはせずに、
[締月]と[会社名]によって自動的に決まる計算項目とし、
さらに納品書入力フォーム上で表示させる必要もないと考えました。
そこで実際の方法としては

1.まず納品書入力フォームで"会社名","締月","金額"他を入力する。

2."請求書へ"というコマンドボタンを作り、これを押すと納品書メイン.tblと納品書サブ.tblの
[請求書番号]などの計算項目を再計算して、さらに請求書入力フォームで
グループ項目として使うために作った[g請求書番号]という項目を[請求書番号]で置き換えて、
その後フォーム多重化で請求書入力フォームを開く

この2.のフォームを切り替えて請求書入力フォームを開いたときに納品書入力フォームで
入力した"会社名"と"締月"でグループ化され"金額"が自動的に集計される。
この部分こそこのシステムを作る最も重要な目的だと考えました。

今の所とりあえずこの方法でやってみようかなと思っています。

もしこの考え方や方法に問題点があるんじゃないかという場合はまたご指導お願い致します。
18306 Re:請求番号の更新 今村 誠 2002/12/22-10:21
記事番号18305へのコメント
しぼうかんさんこんにちは
>また[締月]を変更後に[請求書番号]を変更し忘れた場合は
>当然[請求書番号]は自動的には変わりません。
>そこでこのイベントハンドラは[締月]と[得意先]に作るべき
>物なのかと考え、

締月を変えた時点で請求番号を訂正するのがいいのではないでしょうか。
請求書番号を表示項目とした場合[締月]の入力前で現在の請求番号を
取得しておいてソース値更新に以下の記述でよいのではないでしょうか

手続き定義開始 t締月::ソース値更新()
var 文字列,{&表題文字列,&表示文字列}
  method @t得意先.ソース値取得(&得意先,0)
  method @t締年.ソース値取得(&締年,0)
  method @t締月.ソース値取得(&締月,0)
  alter &表3
  &MAX2=1000
  検索[請求番号]=#PROGN(#setq(&MAX2,#cond(&MAX2<[請求番号],[請求番号],1,&MAX2)),999999)
検索 [得意先]{[得意先]=&得意先,[締年]=&締年,[締月]=&締月}
    if ( .not #eof )
&M2=[請求番号]
else
&M2=&MAX2+1
   end
  alter &表1
  項目値代入 [請求番号]=&M2
  cond(&M2=&M1 .or &M1="") return
  &表題文字列="請求書番号は得意先と納品明細をつなぐ重要な項目です"
&表示文字列="請求書番号が"+#str(&M1)+"から"+#str(&M2)+"に変わりました。
\n納品明細も請求番号を訂正しないとみえなく
なります。
\n納品明細の請求番号を訂正しますか。"
*変数名の値 1 : OK 2 : キャンセル 3 : 中止 4 : 再試行 5 : 無視 6 : はい 7 : いいえ
*制御文字展開=するを指定すると、 "\t" : タブ文字として扱う "\n" : 改行文字として扱う
    msgbox &表題文字列,&表示文字列,ボタン指定=4,制御文字展開=する,&確認
  cond(&確認<>6) return
  alter &HYO3
  グループ検索 {[納品番号]=&M3,[請求番号]=&M1},終了状態=&確認
  cond(&確認=1) グループ値訂正 {[納品番号]=&M3,[請求番号]=&M2},終了状態=&確認
手続き定義終了
proc t納品番号::入力前(参照 文字列 &編集文字列)
var 文字列,{&納品番号,&表題文字列,&表示文字列}
  method @t請求番号.ソース値取得(&M1,0 )   /* 1は編集文字列として取得*/
  method @t納品番号.ソース値取得(&M3,0 )   /* 0はデータ型はソースと一緒*/
  alter &HYO5
  &MAX2=1000
  検索[納品番号]=#PROGN(#setq(&MAX2,#cond(&MAX2<[納品番号],[納品番号],1,&MAX2)),-9999999)
  &STR=#str(&MAX2+1)
  alter &HYO
  if (&M3>0)
  else
    &編集文字列=&STR
end
end

>変更の無いときでも納品書番号1003のレコードの[請求書番号]を
>クリックした場合に[請求書番号]が1002から1005に変わってしまいます。
下記の納品番号以外としているため、訂正で新番号になると思います。
>B-7.検索 [得意先]{[得意先]=&得意先,[締年]=&締年,[締月]=&締月,
>[納品書番号]><&納品書番号},終了状態=&ok

18322 請求番号の更新したい。 しぼうかん 2002/12/24-23:24
記事番号18306へのコメント
おひさしぶりです今村様。またお世話になります。

とりあえず教えていただいたとおり記述してみましたが
>&M2=&MAX2+1
>end
>alter &表1
>項目値代入 [請求番号]=&M2

ここまではif…else…コマンドはケース開始…コマンドに変更しましたが、うまく行きました。
最初の投稿の時に説明もれがあったのですが、期中で有限会社から株式会社への
変更や社名の変更等があったりするのでこのイベントハンドラを締月と同時に社名の所にも作って
このまましばらくやってみようと思います。

>cond(&M2=&M1 .or &M1="") return

以下の行についてはやろうとしていることの意味はわかるのですが、
まだうまく動かないので(たぶんコンマとか記号とかちょっとした文字抜けじゃないかと思うのですが)
検証でき次第もう一度報告したいと思います。

18341 まだ途中です。 しぼうかん 2002/12/27-19:17
記事番号18322へのコメント
今村さん今年は本当にお世話になりました。
納品書メインフォームの締月や得意先のソース値変更によるイベントに今村さんに教えて頂いた
イベント記述行の項目値代入 [請求書番号]=&M2の次の行に
メソッド呼び出し @納品書サブ.@請求書番号置換.実行()と記述して,
納品書サブフォームに"請求書番号置換"という名のコマンドボタンを作り,
機能名:項目置換,機能パラメータ:[請求書番号]=&M2 としてこのイベントを実行するとサブフォームに
請求書番号が入るという風にしたいのですが,
どうも一度表示状態に戻してからでないとうまくいかないようなので
ここの所を解決するために考え中です。[請求書番号]=&M2以下のイベント記述行のについては
この問題が解決し次第挑戦するつもりです。

今日から帰省するのでしばらく書き込みが出来ないので又投稿が消えてしまうかもしれませんが
その時は又投稿し直したいと思います。

18559 Re:まだ途中です。 しぼうかん 2003/01/16-21:46
記事番号18341へのコメント
やっと、ついにゴール出来ました!!ひっかかっていたのは
納品書入力フォーム(メインフォームを多重化した検索用のサブフォームと納品書の明細部を
表示するサブフォームの2つのサブフォームを持つメイン&サブフォーム形式)締月などの
変更による請求書番号の変更、だったのですが、

>alter &HYO3

ここの教えて頂いた&HYO3を検索用のサブフォームの表番号と勘違いしたり、
(正しくは納品書の明細部を表示するサブフォームでした。)変更前の請求書番号を変数"&M1"に
所得するのを忘れていたり、一括処理コマンドの別名表記(例えばreturn)の意味がわからなかったりして
なかなかうまくできなかったのですが以下の通りに記述して何とか動きました。

手続き定義開始 締月::ソース値更新()
method @得意先.ソース値取得(&得意先.0)
method @締年.ソース値取得(&締年.0)
method @締月.ソース値取得(&締月.0)
method @請求書番号.ソース値取得(&M1.0)
method @納品書番号.ソース値取得(&M3.0)
alter &表3
&MAX2=1000
検索[請求書番号]=#PROGN(#setq(&MAX2,#cond(&MAX2<[請求書番号],[請求書番号],1,&MAX2)),999999)
検索 [得意先]{[得意先]=&得意先,[締年]=&締年,[締月]=&締月},終了状態=&ok
if(.not#eof)
&M2=[請求書番号]
else
&M2=&MAX2+1
end
alter &表1
項目値代入 [請求書番号]=&M2
cond(&M2=&M1 .or &M1="")return
&表題文字列="請求書番号は得意先と納品明細をつなぐ重要な項目です"
&表題文字列="請求書番号が"+#str(&M1)+"から"+#str(&M2)+"に変わりました。\n納品明細も請求書番号を訂正しないと見えなくなります。\n納品明細の請求書番号を訂正しますか。"
msgbox &表題文字列,&表示文字列,ボタン指定=4,制御文字列=する,&確認
cond(&確認<>6) return
alter &HYO3
グループ検索 {[納品書番号]=&M3,[請求書番号]=&M1},終了状態=&確認
cond(&確認=1)グループ値訂正 {[納品書番号]=&M3,[請求書番号]=&M2},終了状態=&確認
手続き定義終了

ただ教えて頂いた事をコピーするのでなく、アドバイスの内容の意味を理解して、
質問を減らすように返答する事を考えていたのですが、
いつも自分の知識の1歩も2歩も先のアドバイスを理解する為、
(いいわけですが)鈍い頭脳では返答がかなり遅れぎみになってしまし大変失礼をお掛けして申し訳ありませんでした。m(_ _)m
まだmsgboxなどの書き方はわかっていないのですが、ここはシステムの重要な部分でも無いので、自分で勉強して何とかします。

このシステムはほとんど今村さんの辛抱強いアドバイスのおかげで出来ました。長い間、本当にありがとうございました。(^-^)v

戻る