▲[ 14266 ] / ▼[ 14268 ]
■14267 / 1階層) |
Re[1]: 加工開始日を求めたい
|
□投稿者/ ONnoji -(2024/04/09(Tue) 14:12:31)
| 2024/04/09(Tue) 14:39:10 編集(投稿者)
> ・やりたい事 > 休日を除いた工場の加工開始日を 加工日1 加工日2 に表示(代入?)したい。 > 加工日1の加工日数は5日 加工日2の加工日数は7日 です。 > 会社の休日カレンダーは作成済です。
人が行う場合も、プログラムで行う場合も同じです。
0.表(.tbx)の現在のレコード(行)から、 1.前に5レコード戻って値を変数Aに代入 2.前に7レコード戻って値を変数Bに代入 3.元のレコードへ戻って、加工日1に変数Aを、加工日2に変数Bの値を格納
という段取りになると思いますが、厄介なこと休日を除外しなければなりませんね。 ・・・・・・・・・・・・・・・・・・・・・・
そこで休日を除外するには、事前に条件式: [休日] = "" で絞り込めばOKだと気が付くでしょう。
以上を参考にして手続きを作ってくださいと言っても、慣れていないと大変でしょう。(^^ゞ
なので、以下に加工日数.kexのサンプルを示します。
コピペで動きますよ。
◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇
■加工日数.kex
名札 メイン
*
手続き定義開始 cmdテストClick( ) 変数宣言 自動,文字列{ &title = "cmdテストClick( )", &msg } 変数宣言 自動,日時 { &加工日1, &加工日2 } 変数宣言 自動,整数 { &multiTblNum } 変数宣言 自動,長整数{ &recordNum }
&msg = "Start" &msg = &msg + "\n\nこれはテスト用のメッセージボックスです" &msg = &msg + "\n\n不要になったらコメントアウトしてください" メッセージボックス &title, &msg, アイコン = i, ボタン指定 = 1, 制御文字展開 = する
多重化 &multiTblNum = #is表 /* 多重化した表の表番号を取得 */
解除 * 絞り込み [休日]{ [休日] = #u } ジャンプ 行番号 = 先頭 繰り返し ( .not #eof )
&recordNum = #行番号 手続き実行 prc加工日探索( &加工日1, &加工日2 ) ジャンプ 行番号 = &recordNum
トレース出力 _[日付], " ", _&加工日1, " ", _&加工日2 行訂正 [加工日1] = &加工日1, [加工日2] = &加工日2
ジャンプ 行番号 = 次行 /* これを忘れると無限ループになります */ 繰り返し終了
終了 表 &multiTblNum /* 多重化した表を閉じる */ 編集表 &hwindow
&msg = "Finish" &msg = &msg + "\n\nこれはテスト用のメッセージボックスです" &msg = &msg + "\n\n不要になったらコメントアウトしてください" メッセージボックス &title, &msg, アイコン = i, ボタン指定 = 1, 制御文字展開 = する
手続き定義終了
手続き定義開始 prc加工日探索( 参照 日時 &加工日1, 参照 日時 &加工日2 ) 変数宣言 自動,文字列{ &title = "prc加工日探索( )", &msg } 変数宣言 自動,長整数{ &recordNum }
&加工日1 = #u /* 参照引数を初期化 */ &加工日2 = #u /* 参照引数を初期化 */
&recordNum = #行番号 ジャンプ 行番号 = &recordNum if ( &recordNum > 5 ) ジャンプ 行番号 = -5 &加工日1 = [日付] end
ジャンプ 行番号 = &recordNum if ( &recordNum > 7 ) ジャンプ 行番号 = -7 &加工日2 = [日付] end
手続き定義終了
◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇
■加工日数.WFX のコマンドボタン
オブジェクト名: cmdテスト 標題 : テスト
機能名 機能パラメータリスト 1 表示 2 手続き実行 cmdテストClick 3 なし 4 なし
◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇
■トレース結果
<参考> 40 [トレース出力]ウィンドウと[トレース出力]コマンド|桐の釣魚大全のトップ > フォームアプリケーション教書 第2部 http://silicon7565.html.xdomain.jp/guide/guide_Part2.htm#section40
:[日付] : 2024年 4月 1日 0時 0分 0秒 &加工日1 : &加工日2 : :[日付] : 2024年 4月 2日 0時 0分 0秒 &加工日1 : &加工日2 : :[日付] : 2024年 4月 3日 0時 0分 0秒 &加工日1 : &加工日2 : :[日付] : 2024年 4月 4日 0時 0分 0秒 &加工日1 : &加工日2 : :[日付] : 2024年 4月 5日 0時 0分 0秒 &加工日1 : &加工日2 : :[日付] : 2024年 4月 6日 0時 0分 0秒 &加工日1 : 2024年 4月 1日 0時 0分 0秒 &加工日2 : :[日付] : 2024年 4月 8日 0時 0分 0秒 &加工日1 : 2024年 4月 2日 0時 0分 0秒 &加工日2 : :[日付] : 2024年 4月 9日 0時 0分 0秒 &加工日1 : 2024年 4月 3日 0時 0分 0秒 &加工日2 : 2024年 4月 1日 0時 0分 0秒 :[日付] : 2024年 4月10日 0時 0分 0秒 &加工日1 : 2024年 4月 4日 0時 0分 0秒 &加工日2 : 2024年 4月 2日 0時 0分 0秒 :[日付] : 2024年 4月11日 0時 0分 0秒 &加工日1 : 2024年 4月 5日 0時 0分 0秒 &加工日2 : 2024年 4月 3日 0時 0分 0秒 :[日付] : 2024年 4月12日 0時 0分 0秒 &加工日1 : 2024年 4月 6日 0時 0分 0秒 &加工日2 : 2024年 4月 4日 0時 0分 0秒 : 途中省略 : :[日付] : 2025年 5月14日 0時 0分 0秒 &加工日1 : 2025年 5月 8日 0時 0分 0秒 &加工日2 : 2025年 5月 2日 0時 0分 0秒 :[日付] : 2025年 5月15日 0時 0分 0秒 &加工日1 : 2025年 5月 9日 0時 0分 0秒 &加工日2 : 2025年 5月 7日 0時 0分 0秒 :[日付] : 2025年 5月16日 0時 0分 0秒 &加工日1 : 2025年 5月10日 0時 0分 0秒 &加工日2 : 2025年 5月 8日 0時 0分 0秒 :[日付] : 2025年 5月19日 0時 0分 0秒 &加工日1 : 2025年 5月12日 0時 0分 0秒 &加工日2 : 2025年 5月 9日 0時 0分 0秒 :[日付] : 2025年 5月20日 0時 0分 0秒 &加工日1 : 2025年 5月13日 0時 0分 0秒 &加工日2 : 2025年 5月10日 0時 0分 0秒 :[日付] : 2025年 5月21日 0時 0分 0秒 &加工日1 : 2025年 5月14日 0時 0分 0秒 &加工日2 : 2025年 5月12日 0時 0分 0秒 :[日付] : 2025年 5月22日 0時 0分 0秒 &加工日1 : 2025年 5月15日 0時 0分 0秒 &加工日2 : 2025年 5月13日 0時 0分 0秒 :[日付] : 2025年 5月23日 0時 0分 0秒 &加工日1 : 2025年 5月16日 0時 0分 0秒 &加工日2 : 2025年 5月14日 0時 0分 0秒 :[日付] : 2025年 5月24日 0時 0分 0秒 &加工日1 : 2025年 5月19日 0時 0分 0秒 &加工日2 : 2025年 5月15日 0時 0分 0秒 :[日付] : 2025年 5月26日 0時 0分 0秒 &加工日1 : 2025年 5月20日 0時 0分 0秒 &加工日2 : 2025年 5月16日 0時 0分 0秒 :[日付] : 2025年 5月27日 0時 0分 0秒 &加工日1 : 2025年 5月21日 0時 0分 0秒 &加工日2 : 2025年 5月19日 0時 0分 0秒 :[日付] : 2025年 5月28日 0時 0分 0秒 &加工日1 : 2025年 5月22日 0時 0分 0秒 &加工日2 : 2025年 5月20日 0時 0分 0秒 :[日付] : 2025年 5月29日 0時 0分 0秒 &加工日1 : 2025年 5月23日 0時 0分 0秒 &加工日2 : 2025年 5月21日 0時 0分 0秒 :[日付] : 2025年 5月30日 0時 0分 0秒 &加工日1 : 2025年 5月24日 0時 0分 0秒 &加工日2 : 2025年 5月22日 0時 0分 0秒
p.s.
なお、サンプルは多重化して、レコードをあちこっちに移動させていますが、これ以外にも方法があると思います。
プログラムの作り方はいろいろありますので、サンプルはその一つの例だとお考え下さい。
p.p.s
サンプルはレコードをあちこっちに移動させていますので、多重化しない状態で行うと目が回ります。(@_@)
ということで多重化をしています。
サンプルの一般手続き:prc加工日探索( ) では参照の引数を使っています。
これは一見すると難しく見えますが、慣れてしまえば簡単ですよ。
難しそうだからと敬遠していると、一番美味しいところを食べそこないますよ。(^^ゞ
27.3 引数の[値渡し]と[参照渡し]|桐の釣魚大全のトップ > フォームアプリケーション教書 第2部 http://silicon7565.html.xdomain.jp/guide/guide_Part2.htm#section27-3
|
|
|
▲[ 14293 ] / ▼[ 14296 ]
▼[ 14298 ]
■14294 / 14階層) |
Re[14]: 加工開始日を求めたい
|
□投稿者/ ONnoji -(2024/04/15(Mon) 16:56:38)
| 以上がプログラムの制御構造と制御構文ですが、関連することを・・・
実は、スパゲッティにならなければ何でもよいのか?というわけではないのです。
もう一つ重要なポイントは、ブロック化です。
分かり易く言えば、ブロック玩具のレゴ(LEGO)みたいにプログラムを作るということです。 ・・・・・・・・・・・・・・・・・・・・・・・・
以下のイベント処理(.kex)は何度も見ていると思います。
1.[名札 メイン ... *] 2.[手続き定義開始 cmdテストClick( ) ... 手続き定義終了] 3.[手続き定義開始 prc加工日探索( ) ... 手続き定義終了]
↑この3つが機能のブロックですね。
しかし、単に範囲という意味ではなくて[機能]という視点からのブロックです。 ・・・・・・・・・・・・・・・・ つまり、このイベント処理(.kex)には、3個の機能(ブロック)があるということです。
そして、機能のブロックを[モジュール]と呼びますよ。
┌名札 メイン │ │ ** フォームが開かれる時に必ず実行される機能のブロック │ └*
┌手続き定義開始 cmdテストClick( ) │ 変数宣言 自動,文字列{ &title = "cmdテストClick( )", &msg } │ 変数宣言 自動,日時 { &加工日1, &加工日2 } │ 変数宣言 自動,整数 { &multiTblNum } │ 変数宣言 自動,長整数{ &recordNum } │ │ │ &msg = "Start" │ &msg = &msg + "\n\nこれはテスト用のメッセージボックスです" │ &msg = &msg + "\n\n不要になったらコメントアウトしてください" │ メッセージボックス &title, &msg, アイコン = i, ボタン指定 = 1, 制御文字展開 = する │ │ 多重化 │ &multiTblNum = #is表 /* 多重化した表の表番号を取得 */ │ │ 解除 * │ 絞り込み [休日]{ [休日] = #u } │ ジャンプ 行番号 = 先頭 │┌繰り返し ( .not #eof ) ││ ││ &recordNum = #行番号 ││ 手続き実行 prc加工日探索( &加工日1, &加工日2 ) ││ ジャンプ 行番号 = &recordNum ││ ││ トレース出力 _[日付], " ", _&加工日1, " ", _&加工日2 ││ 行訂正 [加工日1] = &加工日1, [加工日2] = &加工日2 ││ ││ ジャンプ 行番号 = 次行 /* これを忘れると無限ループになります */ │└繰り返し終了 │ │ 終了 表 &multiTblNum /* 多重化した表を閉じる */ │ 編集表 &hwindow │ │ &msg = "Finish" │ &msg = &msg + "\n\nこれはテスト用のメッセージボックスです" │ &msg = &msg + "\n\n不要になったらコメントアウトしてください" │ メッセージボックス &title, &msg, アイコン = i, ボタン指定 = 1, 制御文字展開 = する │ │ *手続き定義終了 │ └end
┌手続き定義開始 prc加工日探索( 参照 日時 &加工日1, 参照 日時 &加工日2 ) │ 変数宣言 自動,文字列{ &title = "prc加工日探索( )", &msg } │ 変数宣言 自動,長整数{ &recordNum } │ │ &加工日1 = #u /* 参照引数を初期化 */ │ &加工日2 = #u /* 参照引数を初期化 */ │ │ &recordNum = #行番号 │ ジャンプ 行番号 = &recordNum │┌if ( &recordNum > 5 ) ││ ジャンプ 行番号 = -5 ││ &加工日1 = [日付] │└end │ │ ジャンプ 行番号 = &recordNum │┌if ( &recordNum > 7 ) ││ ジャンプ 行番号 = -7 ││ &加工日2 = [日付] │└end │ └手続き定義終了
もうひとつ大事なことは、3個の機能(ブロック)のうち2つの機能
cmdテストClick ← 上位の機能(モジュール) │ └ prc加工日探索 ← 下位の機能(モジュール)
は、実行するタイミングで、上位の機能(モジュール)と下位の機能(モジュール)と呼びます。
これは、呼び方が違うだけでメインルーチンとサブルーチンと全く同じものですよ。
上位モジュール:cmdテストClickの機能
・多重化した表の先頭から最後までジャンプすること
下位モジュール:prc加工日探索の機能
・加工日を探索して、変数に格納して、呼び出し元へ値を返すこと。
ということです。
このように、各モジュールで仕事分担をしています。
そして、ひとつのモジュールはひとつの機能を分担しています。 ・・・・・・・・・・・・・・・・・・・・・・・・
実は、初級者の場合このような機能の分割・分担の切り分けが上手に出来ません。
だって、慣れていないのですから当たり前です。
繰り返しになりますが、ひとつのモジュールはひとつの機能を分担するという事を常に念頭にしていれば、
上位の機能(モジュール)と下位の機能(モジュール)の関係で手続きが作れるようになりますよ。
そして、機能(モジュール)は一般手続きですから、同じイベント処理の別の機能(一般手続き・イベントハンドラ)からも呼び出せます。
また、一度作った一般手続きは、別のイベント処理でも再利用しやすくなります。
cmdテストClickの機能とprc加工日探索の機能を合体させた、ひとつの一般手続きを例示しようと思っていましたが、説明が長くなったので割愛します。
でも、合体させた場合には、プログラムが複雑にってしまって分かりにくくなるということはイメージできると思います。
<参考> 8.4 一般プロシージャをサブルーチンとして呼び出す|桐の釣魚大全のトップ > フォームアプリケーション教書 第1部 http://silicon7565.html.xdomain.jp/guide/guide_Part1.htm#section8-4
p.s.
今回話題にした[プログラムの制御構造]や[モジュラー設計]というのは、いわゆる[構造化プログラミング]と呼ばれるものです。
[構造化プログラミング]は、はるか昔から提唱されてきた考え方ですので、現代では特に[構造化プログラミング]が雑誌やネットで騒がれることはありません
また、[構造化プログラミング]とされる範囲は非常に広いので、今さら[構造化プログラミング]をお勉強される必要はないと思います。
非常に文章が長くなって恐縮ですが。アハハha (@^^)/~~~
|
|
|
▲[ 14294 ] / 返信無し
■14298 / 15階層) |
Re[15]: 加工開始日を求めたい
|
□投稿者/ ONnoji -(2024/04/15(Mon) 18:09:28)
| 2024/04/15(Mon) 18:31:45 編集(投稿者)
> cmdテストClickの機能とprc加工日探索の機能を合体させた、ひとつの一般手続きを例示しようと思っていましたが、説明が長くなったので割愛します。 > > でも、合体させた場合には、プログラムが複雑にってしまって分かりにくくなるということはイメージできると思います。
上位モジュールと下位モジュールを合体させてみました。
複雑さが増して、その結果分かりにくくなっているでしょう??
最初はこれでもいいのですが、だって動くんだモン♪
でもね、モジュール化をしないと、一か月後、数か月後、一年後と時間が経てば経つほど、
記憶もあいまいになって、さらに複雑さも加わり、謎のプログラムに変容していくのです。アハハ。
しかし、モジュール化しておけば、記憶が曖昧になっていても、複雑さが軽減されているで、何とかなるのです。アハハ。
自分で作ったプログラムが解読出来なくて何時間も格闘するするのは無駄でしょう。、
だから、未来への投資だと思って、後々のことを考えて拙速にならないようにくれぐれも気を付けてください。
┌手続き定義開始 cmdテストClick( ) │ 変数宣言 自動,文字列{ &title = "cmdテストClick( )", &msg } │ 変数宣言 自動,日時 { &加工日1, &加工日2 } │ 変数宣言 自動,整数 { &multiTblNum } │ 変数宣言 自動,長整数{ &recordNumMain } /* 変数名が重複するので &recordNum → &recordNumMain に変更 */ │ 変数宣言 自動,長整数{ &recordNum } │ │ │ &msg = "Start" │ &msg = &msg + "\n\nこれはテスト用のメッセージボックスです" │ &msg = &msg + "\n\n不要になったらコメントアウトしてください" │ メッセージボックス &title, &msg, アイコン = i, ボタン指定 = 1, 制御文字展開 = する │ │ 多重化 │ &multiTblNum = #is表 /* 多重化した表の表番号を取得 */ │ │ 解除 * │ 絞り込み [休日]{ [休日] = #u } │ ジャンプ 行番号 = 先頭 │┌繰り返し ( .not #eof ) ││ ││ &recordNumMain = #行番号 ││ **手続き実行 prc加工日探索( &加工日1, &加工日2 ) /* 下位モジュールを読み込んだのでコメントアウト */ ││ ││ &加工日1 = #u /* 参照引数を初期化 */ ││ &加工日2 = #u /* 参照引数を初期化 */ ││ ││ &recordNum = #行番号 ││ ジャンプ 行番号 = &recordNum ││┌if ( &recordNum > 5 ) │││ ジャンプ 行番号 = -5 │││ &加工日1 = [日付] ││└end ││ ││ ジャンプ 行番号 = &recordNum ││┌if ( &recordNum > 7 ) │││ ジャンプ 行番号 = -7 │││ &加工日2 = [日付] ││└end ││ ││ ジャンプ 行番号 = &recordNumMain ││ ││ トレース出力 _[日付], " ", _&加工日1, " ", _&加工日2 ││ 行訂正 [加工日1] = &加工日1, [加工日2] = &加工日2 ││ ││ ジャンプ 行番号 = 次行 /* これを忘れると無限ループになります */ │└繰り返し終了 │ │ 終了 表 &multiTblNum /* 多重化した表を閉じる */ │ 編集表 &hwindow │ │ &msg = "Finish" │ &msg = &msg + "\n\nこれはテスト用のメッセージボックスです" │ &msg = &msg + "\n\n不要になったらコメントアウトしてください" │ メッセージボックス &title, &msg, アイコン = i, ボタン指定 = 1, 制御文字展開 = する │ └手続き定義終了
p.s.
これは、適切に機能を分割していない例です。
既出の prc加工日探索 のように、機能を分割するべきです。
そして、 prc加工日探索 は本来ならば汎用性が求められるものですが、現行のサンプルは見本であって汎用性に欠けていますよ。(^^ゞ
|
|
|