Q10:ガントチャートにおいてある一定期間の各一台ずつの稼働率(時間占有率)と空き時間の最大を表示させる、現在の時刻が瞬時に判定できるように、現在の時刻のところに赤いラインが表示されるようにするには。
Q10-1:
ガントチャートにおいて、横軸を時間としています。縦軸を複数のマシンとします。ある一定期間の各一台ずつの稼働率(時間占有率)と空き時間の最大を表示させるようとしています。その場合、コンポーネントとして、数値を表示させる「数値入力フィールド」と演算子である「剰余」のコンポーネントを配置させれば宜しいでしょうか?他にはどのようなコンポーネントが必要でしょうか?また、現在の時刻が瞬時に判定できるように、現在の時刻のところに赤いラインが表示されるようにするには、どうすれば宜しいでしょうか?
A10-1:
1.
>現在の時刻が瞬時に判定できるように、現在の時刻のところに赤いラインが表示されるようにするには、どうすれば宜しいでしょうか?
[ガントチャート]ではデフォルトで、現在日時のところに赤い線が付くようになっています。[ガントチャート]の下側の小さな三角形をクリックして、表示が現在日時のところに来るよう探してみて下さい。線の色や太さは設定変更することもできます。
また、特定日時を表示することもできます。
[ガントチャート]上で右クリック>[ガントチャート]>[特定日時]
で表示の有無や線の色などの設定をご確認下さい。
2.開始日時から終了日時までの経過時間を取得するには[カレンダー]コンポーネントを使用します。
メソッド
・「Dateオブジェクトによるカレンダーの設定(Date)」
・「指定時刻までの経過時間の取得」
などを使うことが考えられます。経過時間はミリ秒で取得されます。
特定期間の時間も[カレンダー]コンポーネントでミリ秒で取得し、[除算(÷)]コンポーネント等を使って割り算をすることになるかと存じます。
簡単なサンプルファイルを作成しお送りすることもできます。
その際には
@データベースやエクセルファイルに入っているデータを使用する
A「Lesson11」のようにガントチャートに合わせて手入力で[テーブル]にデータを入力したものを使用する
どちらのご予定であるのかお知らせ頂ければ幸いです。
『エクセル連携導入』チュートリアルの例のように、他からデータをMZPlatform上に読込み、形式を整えた後、グラフ表示することも多いかと存じます。
経過時間の計算は[ガントチャート]からよりも、元々のテーブルデータの開始・終了日時を使った方が簡単な場合もあるので、お伺いする次第です。
Q10-2:
私はエクセル導入型を予定しています。上記の方法でもタスク上に作業者の名前を表示させることができるでしょうか?
エクセル連携チュートリアルについて質問がございます。使用するエクセル表の名前は英語ではなく、日本語でもMZビルダーで動きますでしょうか?p7のドライバ名とデータベースのURLを設定する箇所は、使用するパソコンの環境によって変わると推測します。
私のパソコンではデータベースのURLはJドライブのMZフォルダです。すなわち、下記のようになります。この場合、p7でどのように設定すれば宜しいでしょうか?また、ドライバ名には、何を設定すれば宜しいのでしょうか?
J:\MZ
エクセル連携チュートリアルのp33とp34は何の説明なのでしょうか?分類される前の表、すなわち、エクセルの表が各ページの最初の表に対応するのでしょうか?p33とp34では同じような説明になっていますが、これらのページでは何が異なるのでしょうか?
A10-2:
ご使用になるエクセル表は日本語名で結構です。
MZPlatformから[データベースアクセス]コンポーネントを使用し、エクセルファイルへ接続するには、P4−6をご覧頂き、ODBCデータソースの登録を行う必要があります。
P7の「第2 引数:データベースのURL⇒jdbc:odbc:dispatch」の『dispatch』の部分はP5で「データソース名」として設定したものです。
データベースのURL⇒jdbc:odbc:データソース名 です。
「データソース名」は自由に決めて頂いて結構ですが、英語名の方が宜しいかと思います。
例)P5の設定でデータソース名を『haken』と設定
データベースのURLはjdbc:odbc:haken とする
使用するエクセルファイルはP5-P6をご覧頂き、「ブックの選択」ボタンを押して、Jドライブを探して使用するエクセルファイル名を選択し、設定します。
先程の回答で抜けておりましたが、ドライバ名に変更はありません。
第1 引数:ドライバ名⇒sun.jdbc.odbc.JdbcOdbcDriver
のままで結構です。
ドライバ名は使用するデータベースソフトによって変わります。
エクセルファイルへの接続の際にはチュートリアルに記載してあるドライバー名を使用します。
> エクセル連携チュートリアルのp33とp34は何の説明なのでしょうか?分類される前の表、すなわち、エクセルの表が各ページの最初の表に対応するのでしょうか?p33とp34では同じような説明になっていますが、これらのページでは何が異なるのでしょうか?
ここでは、エクセル表をガントチャート用の表に変換するために用いる、分類テーブル作成コンポーネントについて説明しております。
エクセルから読み込んで来たテーブルデータ([データ分類>>]ボタン左側)と、ガントチャートに設定するテーブルデータ([データ分類>>]ボタン右側、ボタンクリック後に設定される)とでは、テーブルの形式が異なっているのがお分かりいただけるかと存じます。
一般に、案件ごとのデータを表形式で蓄積するには、ここで扱っているエクセル表のような形式が適切だと言えます。しかしながら、蓄積されたデータを分析する場合、例えば人ごとの派遣先と派遣期間を時系列でグラフ表示したいというような場合には、その目的(グラフの形式)にあった形で蓄積されているデータを整理する必要があります。分類テーブル作成コンポーネントはそのための機能を提供するコンポーネントで、ここではその機能と考え方について説明しています。
ただし、分類テーブル作成コンポーネントをそのままお使いになるとアプリケーションの作成に手間がかかりますので、それを簡略化するためにグラフ作成複合コンポーネントが用意されております。
なお、p.33とp.34の違いについてですが、p.33は元のエクセル表の1行分のデータを1つのセルに入れたテーブルの作り方、p.34は元のエクセル表のセルのデータを1つのセルに入れたテーブルの作り方を説明しているものとご理解ください。
すなわち、p.33では、元のエクセル表の各行のデータを、目的とするグラフ(ガントチャート)の形式にあった形のテーブルとして整理する方法、p.34では、その整理されたテーブルに基づいて、実際にガントチャートのデータとして用いるテーブルを作成する方法について説明しております。
Q10-3:
エクセル連携のp7のデータベースのURLもパソコンの環境が変わってもテキストどおりで良いのでしょうか?データベース名であるdispatchの部分はこちらで適当に変えますが、これについては日本語で良いという回答と英語の方が良いという両方の回答を得ましたが、名前は同一名にしなくても良いのでしょうか?また、この7ページの.や:の後にはスペースは不要とみて宜しいのでしょうか?
このエクセル連携チュートリアルではp57以降ではグラフ作成複合コンポーネントを用いたものになっていますが、p57で1つの内容は完了していると見て良いのでしょうか?また、グラフ作成複合コンポーネントを用いると何か良い点はあるのでしょうか?仮に、グラフ作成複合コンポーネントをもちいてプログラムを作成する場合、このエクセル連携のp23に続けてエクセル連携(応用)1ページ以降の内容を記入していけば、良いのでしょうか?
A10-3:
> エクセル連携のp7のデータベースのURLもパソコンの環境が変わってもテキストどおりで良いのでしょうか?
ODBCデータソースの設定は個々のPCについての設定になります。
例えば2台のPCでそれぞれお試しになる場合には、各PCでODBCデータソースの設定が必要です。
「jdbc:odbc:データソース名」の『jdbc:odbc』の部分は変わりはありません。
データソースのURLとドライバー名のピリオド、コロンは省略せず、テキスト通り入力して下さい。
テキストではエクセルファイル名とデータソース名を同じにしてあるのですが、全く違うもので構いません。
例)エクセルファイル名⇒J:\MZ\テスト.xls (日本語名可)
データソース名⇒haken (P5を参照し、設定 英語名が望ましい)
データベースのURL⇒jdbc:odbc:haken
> このエクセル連携チュートリアルではp57以降ではグラフ作成複合コンポーネントをもちいたものになっていますが、p57で1つの内容は完了していると見て良いのでしょうか?
この『エクセル連携導入チュートリアル』は以前はP57までの内容のみでしたが、後からグラフ作成複合コンポーネントをサンプルとして提供するようになりましたので、この複合コンポーネントを使った例を応用部分として追加してあります。P57までで一旦完了しているとお考え頂いて結構です。
グラフ作成複合コンポーネントを用いる利点としては、データの分類が容易となり手順が簡略化したことが挙げられます。
P57までの内容では[分類テーブル作成]コンポーネントを使用して、データをガントチャート用テーブルデータに変更し設定していますが、考え方や引数の設定が難しく、処理の数も多くなります。
グラフ作成複合コンポーネントを使うと、一つの処理を設定すれば、ガントチャート用のデータができ上がります。
> グラフ作成複合コンポーネントをもちいてプログラムを作成する場合、このエクセル連携のp23に続けてエクセル連携(応用)1ページ以降の内容を記入していけば、良いのでしょうか?
P23までの、エクセルファイルの内容をMZPlatform上に表示するところまでを作成します。
その後、[ラベル(ID:9)]に書いてある文字列を変更します。
テキストでは
「select ID,氏名,派遣先,開始日,終了日,伝票番号 from "plan$"」を
「select ID,氏名,派遣先,開始日,終了日,伝票番号 from "plan2$"」に変更しています。
この「plan」や「plan2」はエクセルのシート名で、通常は「sheet1」などとなっているものです。付属の「C:\MZPlatform\2.4\AP_DATA\Tutorial\dispatch.xls」のシート名は「sheet1」から予め変更してあります。
(planとplan2の内容の違いはID番号列があるかどうかです。ID番号を使用して処理を行いたいので、(応用)P1で読込むシートを変更しました。)
お手元のエクセルファイルの内容を表示する場合には、この「plan」の部分もシート名に合わせて変更する必要があります。「$」マークは必ず付けることになっています。
その後はテキストの内容に合わせてお進め下さい。
Q10-4:
エクセル表のデータソースへの登録は完了できました。ただ、この表に接続しようと思い、接続ボタンを押しますと
「データベースのアクセス中にエラーが発生しました「データベースアクセス[ID:7](KEY:"データベースアクセス7")](Exception:[Microsoft][ODBC Excel Driver] 'plan$'が見つかりません。パラメータや別名が正しいこと、無効な文字や区切り記号が含まれてい・・・・・)
とエラーが出ます。p11の2つのテキストフィールドに記載してあるとおりに入力しました。問題があるとすればどこにあるのでしょうか?
A10-4:
お知らせ頂いたエラーメッセージは「plan」というシートがエクセルファイル中に見つからないということを示しています。
確認させて頂きたいのですが、ODBCデータソースで設定したエクセルファイルはチュートリアルと同じ付属の「dispatch.xls」ファイルでしょうか。
それともお手元のエクセルファイルを設定なさったでしょうか。
お手元のエクセルファイルをご使用の場合は、シート名は「Sheet1」等になっているかと存じます。[ラベル(ID:9)] に設定するSQL文は「select * from "Sheet1$"」と変更してみて下さい。シート名を「Sheet1」以外に変更している場合はそれに合わせて下さい。
dispatch.xlsをご使用の場合は、シート名は「plan」のままになっているかご確認下さい。
前回の回答で紛らわしい箇所がありましたが、シート名が「plan」の場合はSQL文は「select ID,氏名,派遣先,開始日,終了日,伝票番号 from "plan$"」となります。
シート名には「$」は必要なく、SQL文にはシート名に「$」を付ける必要があります。
Q10-5:
エクセルの表を正しくMZで読み込むことができました。ガントチャートの縦軸を複数のマシンとし、横軸を時間として表示させました。ここから、ある一定期間のマシンの稼働率と空き時間の最大時間を表示させたいと考えています。どのような方針でプログラムを作成すれば良いでしょうか?
エクセル連携(応用)p7−9には、「変更されたガントチャートデータの取得」が説明されています。ここでは何をしていると考えれば宜しいのでしょうか?分かりにくいです。ガントチャートかテーブルのどちらかに変更があった場合にそれを他方に反映させるための準備と見て宜しいのでしょうか?
A10-5:
> MZで読み込むことができました。ガントチャートの縦軸を複数のマシンとし、横軸を時間として表示させました。ここから、ある一定期間のマシンの稼働率と空き時間の最大時間を表示させたいと考えています。どのような方針でプログラムを作成すれば良いでしょうか?
まず、計算の前提条件について確認させていただきたく存じます。
(a) マシンの稼働率=(期間内のマシンの稼働時間の総和)÷(期間内の勤務時間の総和)
例えば、1日の勤務時間が8時間でマシンの稼働時間が4時間の場合、その日の稼働率は4÷8=0.5となる。
(b) マシンは勤務時間内でのみ稼働する。
(c) 1つのマシンが複数の仕事を同時に行うことはない(稼働時間をガントチャートとして表示したとき、複数のタスクが重なることはない)。
(d) 休日の勤務時間はゼロであり、休日以外の勤務時間は一定である。超過勤務等の不規則な勤務時間は考慮しない。
以上の前提条件が成立するものとして、ご説明申し上げます。不規則な勤務時間を計算対象とする場合には別途個別の対応が必要となること、あらかじめご了承ください。
[稼働率計算について]
勤務時間の計算には、Ver.2.4から収録された[稼働日時情報]複合コンポーネントをご利用になると便利です。この複合コンポーネントは、始業/終業時刻、昼休み、休日情報を設定し、これに基づいて指定日時間の勤務時間の計算や指定日時から一定勤務時間経過したときの日時を計算するために用います。実際の使用例につきましては、付属のマニュアル「サンプル(勤務時間計算)」をご覧ください。
この複合コンポーネントを使うことで、稼働率計算の分母である「期間内の勤務時間の総和」は容易に計算できます。
次に「期間内のマシンの稼働時間の総和」ですが、こちらはガントチャートから取得するテーブルデータより計算可能です。ガントチャートテーブルデータの各行は、
開始日時1,終了日時1,開始日時2,終了日時2,...
という並びになっていますので、順次、開始日時から終了日時までの時間を計算して和をとれば、「期間内のマシンの稼働時間の総和」が得られます。具体的な計算手順は以下となります。
(1) ガントチャートからテーブルデータを取得する。
(2) (1)で取得してテーブルからマシンごと(行ごと)のデータをリストして取得する。
(3) (2)で取得したリストからNULLデータ(テーブルで空欄となっているセルに対応)を削除する。
(4) (3)で得られたリストを日時順で並び替え、指定された期間外の開始/終了
日時データを削除する。(開始日時、終了日時の2つで1セットとして扱うことに注意)。
(5) (4)で得られたリストの先頭から2つずつ(それぞれ開始日時、終了日時に対応)データを取得してその間の時間を計算し、総和を取る。
以上のようにして計算された「期間内のマシンの稼働時間の総和」を「期間内の勤務時間の総和」で割れば、稼働率が求められます。
ご参考までに、サンプルアプリケーション"稼働率計算.mzax"を用意しましたので、どうぞご覧ください。このアプリケーションでは、[稼働率計算]ボタンをクリックすると、作業項目ごとの稼働率が計算されます。
[最大空き時間計算について]
上述の「期間内のマシンの稼働時間の総和」と同じ要領で空き時間を計算することができます。稼働時間の場合は、
開始日時1,終了日時1,開始日時2,終了日時2,...
という並びのデータから、(終了日時1-開始日時1)、(終了日時2-開始日時2)、...を計算して総和を取りました。最大空き時間を計算する場合には、基本的に、(終了日時1から開始日時2までの勤務時間)、(終了日時2から開始日時3までの勤務時間)、...の中から最大値を選べば良いことになります。
ただし、マシンは勤務時間内でのみ稼働という条件がありますので、空き時間が日をまたぐことはできません。そこで、指定された期間内のすべての日の変わり目(午後12時/午前零時)に仮の稼働時間(午後12時開始、午前零時終了)を挿入することで、空き時間が日をまたいで計算されることを回避します。
少し分かりにくいかと思いますので、以下に例を示します。仮に、始業時刻を9:00、終業時刻17:00としておきます。マシンの稼働時間が以下の通りであったとします。
13:00開始-16:00終了、(翌日)10:30開始-12:00終了
この場合、単純に終了時刻から翌日の開始時刻までの勤務時間を空き時間として計算すると、16:00から翌10:30までの勤務時間を計算することになりますので2時間30分となります。ところが勤務時間外である17:00〜翌9:00まではマシンは稼働しませんので、空き時間を2時間30分とすることは不適切です。そこで、以下のように、実働ゼロの仮の稼働時間を挿入します。
13:00開始-16:00終了、24:00開始-0:00終了、10:30開始-12:00終了
そうすると空き時間は、16:00から24:00までの勤務時間である1時間、および翌0:00から10:30までの勤務時間である1時間30分となり、マシンの割り当てが可能な空き時間が適正に計算できます。
以上をまとめると、最大空き時間の具体的な計算手順は以下となります。
(1) ガントチャートからテーブルデータを取得する。
(2) (1)で取得してテーブルからマシンごと(行ごと)のデータをリストして取得する。
(3) (2)で取得したリストからNULLデータ(テーブルで空欄となっているセルに対応)を削除する。
(4) (3)で得られたリストを日時順で並び替え、指定された期間外の開始/終了日時データを削除する。(開始日時、終了日時の2つで1セットとして扱うことに注意)。
(5) (4)で得られたリストに、指定期間開始日、指定期間終了日、実働ゼロの仮の稼働時間(24:00〜0:00)を期間内のすべての日について追加した後、日時順で並び替える。
(6) (5)で得られたリストの先頭から2つずつデータを取得してその間の時間を計算し、最大値を取る。
ご参考までに、"稼働率計算.mzax"に最大空き時間計算機能を追加した"稼働率&空時間計算.mzax"を用意しましたので、どうぞご覧ください。このアプリケーションでは、[稼働率&最大空き時間計算]ボタンをクリックすると、作業項目ごとの稼働率と最大空き時間が計算されます。
関連ファイル:稼働率計算.mzax、稼働率&空時間計算.mzax
1.P7の「変更されたガントチャートデータの取得」の考え方からご説明します。
A)ガントチャートのタスク(=帯)が実行画面上で変更(=ドラッグ)される時は、必ずマウスで選択されている状態です。
各ガントチャートのタスクには「作業項目インデックス」、「系列インデックス」が振られています。
これを取得するために、ここではメソッド:
「現在選択されている作業項目のインデックスを取得する」
「現在選択されている系列のインデックスを取得する」を使います。
B)グラフデータ作成複合コンポーネントからは「ガントチャート用に分類されたテーブルデータ」が取得できます。(P7下部の表)
セルの値は例示されている通り、元のエクセルデータ一行分のデータが一つのセルに入っている形です。
C)データが入っているセルの位置を「作業項目インデックス」、「系列インデックス」と照し合わせると
「作業項目インデックス」=「ガントチャート用に分類されたテーブルデータ」の行インデックス
「系列インデックス」=列インデックス −1
という関係が成り立ちます。
よって「作業項目インデックス」、「系列インデックス」を用いて、「ガントチャート用に分類されたテーブルデータから一列削除したテーブルデータ」からセルの値を取得することができます。
D)一つ一つのセルの値はリスト型のデータなので、取得したらリスト格納変数に入れます。
2.P8の処理は「ガントチャート化」ボタンを押したら、
@グラフ作成複合コンポーネントから、「ガントチャート用に分類されたテーブル」を取得し------ B)
A0列目を削除------C)
3.P9ガントチャートが更新されたら
@「作業項目インデックス」、「系列インデックス」を使って、2.Aのテーブルデータからセルの値を取得------A),C)
A取得したデータをリスト格納変数に格納------D)
という処理になります。
Q10-6:
このマシンは、勤務時間以外でも自動運転が可能であることを私としては前提しています。したがって、勤務時間以外の運転時間も考慮して稼働率を求める予定です。
関連ファイルプログラムのサブルーチン「稼働率計算」の部分で質問がございます。先ず最初にテーブル「稼働率」を全行削除しています。これは、そのテーブルの初期化だと考えて良いのでしょうか?開始日と終了日の取得を表のインデックスで指定してその値を取得しています。しかし、どの表からその値を取得するのか指定している箇所がないように見受けられます。どの表の値なのかを指定する必要はないのでしょうか?
A10-6:
> 関連ファイルプログラムのサブルーチン「稼働率計算」の部分で質問がございます。先ず最初にテーブル「稼働率」を全行削除しています。これは、そのテーブルの初期化だと考えて良いのでしょうか?
はい、テーブルの初期化とお考えください。
> 開始日と終了日の取得を表のインデックスで指定してその値を取得しています。しかし、どの表からその値を取得するのか指定している箇所がないように見受けられます。どの表の値なのかを指定する必要はないのでしょうか?
「その値」が何を指すのかが不明ですが、「開始日」および「終了日」を示す日付データを指すのであれば、それはテーブル[ID:5 KEY:"計算開始/終了日"]です。このテーブルは、アプリケーション起動画面上では、[稼働率計算]ボタンのすぐ上に配置されているものです。
サブルーチン[ID:8 KEY:"稼働率計算"]のアクションイベントにテーブル[ID:5KEY:"計算開始/終了日"]が接続されており、その起動メソッドが「指定セルの値を取得する(int,int)」であることは、ビルダー上でご確認いただけると思います。このメソッド起動の意味は、
「テーブル[ID:5 KEY:"計算開始/終了日"]が保持しているセルの値を、行の位置と列の位置を指定して取得する」
ということであり、ここで取得された「テーブルテーブル[ID:5 KEY:"計算開始/終了日"]が保持しているセルの値」は、同じアクションイベントに接続されている他のコンポーネントが、「メソッド処理結果」として利用します。
テーブル[ID:5 KEY:"計算開始/終了日"]の起動メソッド「指定セルの値を取得する(int,int)」は、
「テーブル[ID:5 KEY:"計算開始/終了日"]が、他のテーブルコンポーネントから、行の位置と列の位置を指定して、そのセルの値をもらってくる」
という働きをするものではございません。
Q10-7:
「テーブル[ID:5 KEY:"計算開始/終了日"]にある値を設定しようとしていると勘違いしていました。そうではなくて、そのテーブルに手書きである値を記載し、その値を別のコンポーネントで取得して稼働率の計算に使用していました。サブルーチン「稼働率計算」で「ファンクション」コンポーネントがあります。これの機能はどのようなものなのでしょうか?
A10-7:
> サブルーチン「稼働率計算」で「ファンクション」コンポーネントがあります。これの機能はどのようなものなのでしょうか?
ファンクションコンポーネントは、FORTRANにおけるFUNCTION文のように、何らかの計算をさせてその結果を取得する処理を記述するために用います。したがって、ファンクションコンポーネント自体は特別な計算機能を持ちません。
例えば、稼働率計算.mzaxのサブルーチン[ID:8 KEY:"稼働率計算"]のアクションイベントに接続されているファンクション[ID:23 KEY:"指定日時間の勤務時間計算"]では、引数として2つの日付データを与え、その間の勤務時間を計算する処理を行わせています。この計算処理は、ビルダー画面の末尾に記述されています。
ファンクションコンポーネントのメソッド「ファンクションの呼び出し(Object,...)」を実行すると、ファンクションコンポーネントから処理要求イベントが発生します。その処理要求イベントに接続されているメソッドのうち、最後に接続されているメソッドの実行結果が「ファンクションの呼び出し(Object,...)」メソッドの実行結果となり、その値は他のコンポーネントから「メソッド処理結果」として利用されることになります。
サブルーチン[ID:8 KEY:"稼働率計算"]のアクションイベントに接続されているファンクション[ID:23 KEY:"指定日時間の勤務時間計算"]の場合、「ファンクションの呼び出し(2引数)(Object,Object)」の実行結果は、直後の任意精度実数(BigDecimal)格納変数[ID:9 KEY:"通常勤務時間総計(分)"]の「数値を設定する(イベント発生なし)(BigDecimal)」の引数として利用されています。
なお、付属のマニュアル「コンポーネント別記述先ドキュメント対応表」には、コンポーネントごとにその使用例が掲載されているマニュアルが示されています。そちらも合わせてご覧いただければと存じます。
Q10-8:
作成して頂いたプログラムの中身についてお伺いします。ファンクション「指定日時間の勤務時間計算」で発生している処理要求イベントの計算の中身について質問がございます。ここで、複合コンポーネント「稼動日時情報」が利用されています。ここでは、終了日−開始日の引き算をおこなうために、それぞれの引数を設定していると推測します。ここで、この複合コンポーネントを使用する理由を伺いたいです。これを利用すると自動的に勤務時間内のみの計算になるのでしょうか?仮に、勤務時間に関係なく無人運転が可能な場合、この複合コンポーネントの代わりにどのようなコンポーネントをもちいるのが理想的なのでしょうか?
A10-8:
> ファンクション「指定日時間の勤務時間計算」で発生している処理要求イベントの計算の中身について質問がございます。ここで、複合コンポーネント「稼動日時情報」が利用されています。ここでは、終了日−開始日の
引き算をおこなうために、それぞれの引数を設定していると推測します。ここで、この複合コンポーネントを使用する理由を伺いたいです。これを利用すると自動的に勤務時間内のみの計算になるのでしょうか?
画面上の就業時間および休日情報に基づいて、勤務時間のみを計算します。複合コンポーネント「稼働日時情報」を用いたアプリケーションとして、"勤務時間計算.mzax"を用意してございます。そのマニュアルはドキュメントインデックスより「サンプル(勤務時間計算)」を選択することでご覧いただけます。
> 仮に、勤務時間に関係なく無人運転が可能な場合、この複合コンポーネントの代わりにどのようなコンポーネントをもちいるのが理想的なのでしょうか?
複合コンポーネント「稼働日時情報」の勤務時間および休日の設定において、始業時刻0:00、終業時刻24:00、昼休み12:00〜12:00、休日なし、と設定するのが簡単かと存じます。
この複合コンポーネントを利用せず、単純に経過時間等を計算するのであれば、カレンダーコンポーネントをご利用になるのがよろしいかと存じます。カレンダーコンポーネントの説明や使い方につきましては、付属のサンプル「サンプル(カレンダー)」をご覧ください。
Q10-9:
サブルーチン「稼働率計算」の後半についてお伺いします。「作業項目名リスト取得」以降のファンクション「期限内午前零時リスト作成」は、何をおこなうために設定されているのでしょうか?
A10-9:
> サブルーチン「稼働率計算」の後半についてお伺いします。「作業項目名リスト取得」以降のファンクション「期限内午前零時リスト作成」は、何をおこなうために設定されているのでしょうか?
2009/11/25にサンプルアプリケーションとともにお送りしたメールに記述いたしました以下の部分、
> ただし、マシンは勤務時間内でのみ稼働という条件がありますので、空き時間が日をまたぐことはできません。そこで、指定された期間内のすべての日の変わり目(午後12時/午前零時)に仮の稼働時間(午後12時開始、午前零時終了)を挿
入することで、空き時間が日をまたいで計算されることを回避します。
ここでいう仮の稼働時間を挿入するために実行しています。
同じメールに記述した具体的な計算手順、
> 以上をまとめると、最大空き時間の具体的な計算手順は以下となります。
(1) ガントチャートからテーブルデータを取得する。
(2) (1)で取得してテーブルからマシンごと(行ごと)のデータをリストして取得する。
(3) (2)で取得したリストからNULLデータ(テーブルで空欄となっているセルに対応)を削除する。
(4) (3)で得られたリストを日時順で並び替え、指定された期間外の開始/終了日時データを削除する。(開始日時、終了日時の2つで1セットとして扱うことに注意)。
(5) (4)で得られたリストに、指定期間開始日、指定期間終了日、実働ゼロの仮の稼働時間(24:00〜0:00)を期間内のすべての日について追加した後、日時順で並び替える。
(6) (5)で得られたリストの先頭から2つずつデータを取得してその間の時間を計算し、最大値を取る。
の、(5)の「指定期間開始日、指定期間終了日、実働ゼロの仮の稼働時間(24:00〜0:00)を期間内のすべての日について追加」を行うために、追加対象である日付データのリスト(例えば、[2009/05/18 00:00:00, 2009/05/19 00:00:00,2009/05/19 00:00:00, 2009/05/20 00:00:00, 2009/05/20 00:00:00, ...])を作成しています。「2009/05/19 00:00:00, 2009/05/19 00:00:00」のようにデータが重複しているのは、24:00と0:00を表現するためです。
Q10-10:
先日送って頂いたメールの仮の稼働時間についての設定の仕方が良く理解できないので質問申し上げます。
> 少し分かりにくいかと思いますので、以下に例を示します。仮に、始業時刻を9:00、終業時刻17:00としておきます。マシンの稼働時間が以下の通りであったとします。
13:00開始-16:00終了、(翌日)10:30開始-12:00終了
この場合、単純に終了時刻から翌日の開始時刻までの勤務時間を空き時間として計算すると、16:00から翌10:30までの勤務時間を計算することになりますので2時間30分となります。ところが勤務時間外である17:00〜翌9:00まではマシンは稼働しませんので、空き時間を2時間30分とすることは不適切です。そこで、以下のように、実働ゼロの仮の稼働時間を挿入します。
13:00開始-16:00終了、24:00開始-0:00終了、10:30開始-12:00終了
そうすると空き時間は、16:00から24:00までの勤務時間である1時間、および翌0:00から10:30までの勤務時間である1時間30分となり、マシンの割り当てが可能な空き時間が適正に計算できます。
上記では空き時間を2つ算出しています。前半部分では2時間半となっております。後半部分でも1時間と1時間半を足して2時間半となっております。算出した結果である時間が同じなので、何故後者の方が妥当なのか、わかりかねます。24:00と0:00は同じなのでしょうか?
作成して頂いたプログラムについて質問がございます。
サブルーチン「稼働率計算」の箇所です。「作業項目名リスト取得」がありますが、ここでのデータの流れはガントチャート→テーブル格納変数→テーブル稼働率となっていると推測します。ガントチャート上の作業項目名がテーブル稼働率の1列目に入力されると推測しています。ガントチャート上の作業項目はインデックスでどのように指定しているのでしょうか?
また、この設定は、プログラム起動時にガントチャートが既に出来上がっていることが前提になっているのでしょうか?ボタンを押してからガントチャートが作成される場合、do clickか何かでガントチャートの作成とテーブル稼働率への作業項目追加を連動させた方が良いのでしょうか?
申し訳ございません。ご説明の意図がわかりました。空き時間の最大として計算したいのは、「連続して確保できる時間」という意味ですね。失礼致しました。ただ、この場合でも24:00開始−0:00終了の設定の意図がわかりかねます。
A10-10:
> いつもお世話になっております。先日送って頂いたメールの仮の稼働時間についての設定の仕方が良く理解できないので質問申し上げます。
>> 少し分かりにくいかと思いますので、以下に例を示します。仮に、始業時刻を9:00、終業時刻17:00としておきます。マシンの稼働時間が以下の通りであったとします。
13:00開始-16:00終了、(翌日)10:30開始-12:00終了
この場合、単純に終了時刻から翌日の開始時刻までの勤務時間を空き時間として計算すると、16:00から翌10:30までの勤務時間を計算することになりますので2時間30分となります。ところが勤務時間外である17:00〜翌9:00まではマシンは稼働しませんので、空き時間を2時間30分とすることは不適切です。そこで、以下のように、実働ゼロの仮の稼働時間を挿入します。
13:00開始-16:00終了、24:00開始-0:00終了、10:30開始-12:00終了
そうすると空き時間は、16:00から24:00までの勤務時間である1時間、および翌0:00から10:30までの勤務時間である1時間30分となり、マシンの割り当てが可能な空き時間が適正に計算できます。
> 上記では空き時間を2つ算出しています。前半部分では2時間半となっております。
後半部分でも1時間と1時間半を足して2時間半となっております。算出した結果である時間が同じなので、何故後者の方が妥当なのか、わかりかねます。24:00と0:00は同じなのでしょうか?
2009/11/25にお送りしたメールでは、「マシンは勤務時間内のみで稼働」との前提条件を示していました。そして、明記してはおりませんでしたが、空き時間を以下のように定義して説明させていただきました。
「空き時間とは、マシンを連続して稼働することができる時間のことである。」
上述の例の場合、合計時間は同じなのですが、非勤務時間帯である17:00〜翌9:00を間に挟みますので、その間はマシンを連続して稼働することができません。そこで、「マシンを連続して稼働できる時間」を計算するという観点からは、16:00〜17:00と9:00〜10:30に分けるのが適正と考えました。
例えば、非勤務時間帯は一旦停止し、勤務時間から再開という形態で運用される場合、すなわち間に非勤務時間帯を挟んでも事実上連続運転可能という場合であれば、2つに分ける必要はないかと存じます。この場合には、実働ゼロの仮の稼働時間などを挿入する必要はございません。
24:00と0:00、例えば2009/5/18 24:00と2009/5/19 0:00は同一時刻とご理解ください。開始と終了を区別するために24:00と翌0:00という書き方にしましたが、混乱を招いてしまったのであれば、お詫びいたします。
お問い合わせの件につきまして、最初に、お送りしたサンプルアプリケーションの位置付けについてご確認いたしたく存じます。
まず、2009/11/24に、以下のご質問を頂きました。
> ご返答有難うございます。エクセルの表を正しくMZで読み込むことができました。ガントチャートの縦軸を複数のマシンとし、横軸を時間として表示させました。ここから、ある一定期間のマシンの稼働率と空き時間の最大時間を表示させたいと考えています。
どのような方針でプログラムを作成すれば良いでしょうか?
これに対して、稼働率および最大空き時間を求めるための考え方をご説明したのが、私どもからの2009/11/25のメールです。そのメールに添付したサンプルアプリケーションは、説明した考え方を実際にMZ
Platformのアプリケーションとして作るとどのようになるかの具体例を示したもので、説明用の補足資料に過ぎません。
したがって、ご自身の仕事でお使いになるアプリケーションを作成する際に、お送りしたサンプルアプリケーションにとらわれる必要はまったくございません。サンプルアプリケーションは、あくまで考え方を理解し、身に付けるための参考とお考えください。
以上の前提の下に、ご質問に答えさせていただきます。
> 作成して頂いたプログラムについて質問がございます。サブルーチン「稼働率計算」の箇所です。「作業項目名リスト取得」がありますが、ここでのデータの流れはガントチャート→テーブル格納変数→テーブル稼働率となっていると推測します。
この部分のデータの流れはそのようになっております。
> ガントチャート上の作業項目名がテーブル稼働率の1列目に入力されると推測しています。ガントチャート上の作業項目はインデックスでどのように指定しているのでしょうか?
すでに開発チュートリアルの「Lesson.11 ガントチャートを使ってみよう」や「Lesson.14 テーブルとガントチャートの機能を拡張しよう」でご覧頂いておりますとおり、ガントチャート上の作業項目は、ガントチャートコンポーネントから取得したテーブルの第0列の各セルに収まっております。お送りしたサンプルアプリケーションは、Lesson.11で扱っているアプリケーションに機能追加したもので、起動画面に表示されているテーブルのデータは、ガントチャートから取得したテーブル、すなわちテーブル格納変数[ID:12 KEY:"ガントチャートテーブル"]に設定されているデータと同じものになります。
「ガントチャート上の作業項目はインデックスでどのように指定しているのか」の意味が不明なのですが、「ガントチャートの各作業項目名をどのように取得して、テーブル[ID:7 KEY:"稼働率"]の第0列の適切な位置に記入しているのか」という意味であるとするならば、テーブル格納変数[ID:12 KEY:"ガントチャートテーブル"]に設定されているテーブルデータの第0列が作業項目名ですので、
(1) テーブル格納変数[ID:12 KEY:"ガントチャートテーブル"]の第0列の列データリストを取得し、
(2) その列データリストをテーブル[ID:7 KEY:"稼働率"]の第0列に設定
すれば適切に記入できます。ただし、テーブル[ID:7 KEY:"稼働率"]はその前に実行している初期化処理で行数0となっていますので、この(1)および(2)の処理に先立ち、必要な行数(テーブル格納変数[ID:12 KEY:"ガントチャートテーブル"]の行数)だけ、行を追加しておく必要があります。この行追加の処理が、「作業項目名リスト取得」直前にある、テーブル[ID:7 KEY:"稼働率"]の「addMultiRowData(int)」です。この引数は追加すべき行数、すなわち、テーブル格納変数[ID:12 KEY:"ガントチャートテーブル"]の行数となっています。
作業項目ごとの稼働率は、サブルーチン[ID:8 KEY:"稼働率計算"]から発生しているアクションイベントに接続されている最後のメソッド、繰り返し制御[ID:13KEY:"作業項目ごとの稼働率計算"]の「繰り返し処理を実行する(int,boolean,int,boolean,int)」の実行により計算されています。
作業項目数は、ガントチャートから取得したテーブル、テーブル格納変数[ID:12KEY:"ガントチャートテーブル"]の行数に等しいので、その行数文だけ同様の処理を繰り返しております。
> また、この設定は、プログラム起動時にガントチャートが既に出来上がっていることが前提になっているのでしょうか?
その前提で作られています。
> ボタンを押してからガントチャートが作成される場合、do clickか何かでガントチャートの作成とテーブル稼働率への作業項目追加を連動させた方が良いのでしょうか?
連動させたほうが良いかどうかはアプリケーションの使用目的に依存しますので、私どもでは判断しかねます。
なお、ここでおっしゃる「do click」が、お送りしたサンプルアプリケーションの[稼働率計算]もしくは[稼働率&最大空き時間計算]ボタンの「doClick()」メソッドのことであるならば、そのメソッドをお使いになるよりも、その接続先に設定されているサブルーチン[ID:8 KEY:"稼働率計算"]の「処理を呼び出す()」メソッドをお使いになることをお勧めします。ボタンを含めたGUI部品の操作とそこから起動される内部処理とは、なるべく分けておいた方が、将来の機能修正等の場合に便利です。
Q10-11:
作って頂いた稼働率と空き時間最大を見積もるプログラムについて質問がございます。
8:30〜17:30の勤務時間と休日の有無に関係なく、稼働率と「空き時間の最大」を作成して頂いたプログラムで計算させてみました。稼働率については、正しく計算できていました。
ただ、「空き時間の最大は」ほとんどの設定において、24×60×1=1440となり、1日の時間を1440分で表示されていました。この計算は、「繰り返し制御,作業項目ごとの稼働率計算」のアクションイベントにつながる、まとまりの部分で計算されていると推測します。空き時間の最大は稼動したある測定の終了時間からその次の測定の開始時間までの時間を記録し、その記録した時間のうち、いずれが最大かを比較して決定していると推測します。その記録した時間の情報は、どのコンポーネントに保持されているのでしょうか?
1440となる理由は、「午後12時/午前零時リスト追加」のリスト格納変数に原因があると考え、そのコンポーネントを削除してみました。しかし、妥当な数値は得られませんでした。何が原因か、ご助言をお願い致します。
計算が正しくおこなわれていることを確認するには、その計算の途中でどのような数値において、どのような処理がなされているのか調べることが重要だと考えられます。これをおこなう場合、数値入力フィールドを適切なところに接続させて、調べたいコンポーネントの情報を表示させれば良いと考えています。私の考え方で正しいでしょうか?
A10-11:
> 作って頂いた稼働率と空き時間最大を見積もるプログラムについて質問がございます。
8:30〜17:30の勤務時間と休日の有無に関係なく、稼働率と「空き時間の最大」を作成して頂いたプログラムで計算させてみました。稼働率については、正しく計算できていました。
ただ、「空き時間の最大は」ほとんどの設定において、24×60×1=1440となり、1日の時間を1440分で表示されていました。
こちらでは、この現象が確認できませんでした。お手数ですが、このような計算結果となった状態のプログラムをファイルに保存し、メール添付にてこちらへお送り頂けないでしょうか?
> この計算は、「繰り返し制御,作業項目ごとの稼働率計算」のアクションイベントにつながる、まとまりの部分で計算されていると推測します。空き時間の最大は稼動したある測定の終了時間からその次の測定の開始時間までの時間をを記録し、その記録した時間のうち、いずれが最大かを比較して決定していると推測します。その記録した時間の情報は、どのコンポーネントに保持されているのでしょうか?
空き時間の最大値はそのように計算しております。その記録した時間の情報は、比較演算(≧)[ID:32 KEY:"この空き時間は最大?"]の右オペランドとして保持されています。
ある稼働の終了時間から次の開始時間までの時間を記録して、その記録した値が比較演算(≧)[ID:32 KEY:"この空き時間は最大?"]に保持されている右オペランドの値以上の場合には、比較演算(≧)[ID:32 KEY:"この空き時間は最大?"]の右オペランドを記録した値で置き換える、という処理を行っています。この処理は、繰り返し制御(FOR)[ID:31 KEY:"最大空時間計算"]から発生するアクションイベントに接続されています。
>1440となる理由は、「午後12時/午前零時リスト追加」のリスト格納変数に原因があると考え、そのコンポーネントを削除してみました。しかし、妥当な数値は得られませんでした。何が原因か、ご助言をお願い致します。
計算が正しくおこなわれていることを確認するには、その計算の途中でどのような数値において、どのような処理がなされているのか調べることが重要だと考えられます。これをおこなう場合、数値入力フィールドを適切なところに接続させて、調べたいコンポーネントの情報を表示させれば良いと考えています。私の考え方で正しいでしょうか?
基本的にはその考え方で間違いありません。ただし、数値入力フィールドの場合には、数値以外の値が設定されるとエラーとなりますので、テキストフィールドをお使いになった方が、より一般のデータに対応できます。また、情報を確認するときに計算を一時的に停止させたい場合には、メッセージダイアログを用いて情報を表示させるという方法もあります。
この他、メソッドを1つずつ順に実行させてその引数やメソッド処理結果の値を確認するために、デバッガが用意してあります。デバッガの使用方法につきましては、付属の「デバッガ操作説明書」をご覧ください。
Q10-12:
ご助言頂いた内容を順次試してみます。エクセルの表を読み込んでガントチャートを作成するプログラムとしました。ガントチャート化というボタンを押すと、「稼働率最長空き時間計算のボタン」が有効になります。
A10-12:
お送り頂いたアプリケーションを拝見しましたところ、画面右上の始業/終業時刻、昼休みの設定がそれぞれ以下のように24時間運転の設定となっておりました。
始業時刻: 0:00
就業時刻: 0:00
昼休み: 12:00〜12:00
これらの値を正しく設定していただければ、空き時間の最大値も正しく計算されます。
蛇足ですが、稼働率の計算が正しく行われていたのは、各マシンの稼働時間がすべて日単位で入っているので、24時間運転でも8時間運転でも結果的に「勤務時間内稼働時間÷勤務時間」の値が一致するためです。
Q10-13:
私が想定しているのは自動運転が可能であり、勤務時間外でも稼動するマシンです。そのため、24時間運転するものとして設定しておりました。24時間運転として設定する場合、空き時間の最大の計算は、下記の始業時刻と就業時刻と昼休みの設定を24時間勤務としただけでは、うまく動かないと考えて宜しいのでしょうか?
A10-13:
> 私が想定しているのは自動運転が可能であり、勤務時間外でも稼動するマシンです。
そのため、24時間運転するものとして設定しておりました。
24時間運転として設定する場合、空き時間の最大の計算は、下記の始業時刻と就業時刻と昼休みの設定を24時間勤務としただけでは、うまく動かないと考えて宜しいのでしょうか?
24時間運転を行う場合、すでにお考えになったように、
(1) 始業時刻と就業時刻と昼休みの設定を24時間勤務とする。
(2) 実働ゼロの仮の稼働時間(午後12時/午前零時)を挿入しない。
とすることで基本的には計算が可能です。これらのうち、(1)は画面上の時間設定のみで行うことができますが、(2)はプログラムの変更が必要となります。
(2)のプログラム変更につきまして、すでにリスト格納変数[KEY:"午後12時/午前零時リスト]の削除をお試しになったと伺いました。しかしながらこのリスト格納変数には、実働ゼロの仮の稼働時間(午後12時/午前零時)の他に、計算開始日時と計算終了日時のデータが含まれています。これらも削除してしまったために、妥当な計算結果(空き時間の最大値)が得られなかったのではないかと思います。
24時間運転の場合には、実働ゼロの仮の稼働時間(午後12時/午前零時)は不要ですので、ファンクション[KEY:"期間内午前零時リスト作成"]の「ファンクションの呼び出し(2引数)(Object,Object)」メソッドによる処理を、計算開始日時と計算終了日時のみのリストを作成するように修正すればよいことになります。
この修正は、ファンクション[KEY:"期間内午前零時リスト作成"]から発生している処理要求イベントに接続されているメソッドの4番目、カレンダー[ID:51 KEY:"作業領域"]の「Dateオブジェクトリストの取得(int,int)」の最初の引数(説明: リスト要素数)を、
取得方法: 固定値
メソッド/値: 1
と変更することで行えます。(お送りしたサンプルアプリケーションでは、計算開始日時から計算終了日時までの日数を計算して、その間のすべての日の午前零時のデータを生成していますが、日数を1で固定してしまうことで、24時間運転の場合には不要となるデータを生成しないようにします。)
以上の修正により、24時間運転の場合の稼働率と最大空き時間の計算は行えますが、以下の制限事項が存在することを最後に申し上げておきます。
制限事項
計算開始日時あるいは計算終了日時をまたがって運転する状況が存在する場合、稼働率および最大空き時間は正しく計算されない。
制限事項の理由
計算対象となる稼働時間(開始/終了日時のセット)は、開始日時が計算期間(計算開始日時〜計算終了日時)に含まれているかどうかで判定しています。したがって、計算開始日時よりも前に運転が始まって計算開始日時後に運転が終了するものは計算に含まれません。一方、計算期間内に運転が始まって計算終了日時後に運転が終了するものは、計算期間外の稼働時間も計算に含まれることになります。このような計算不正を回避するには、計算対象となる稼働時間の判定条件の修正ならびに稼働時間の補正処理(計算期間内の稼働時間のみを計算に含める)が必要となります。
Q10-14:
作成して頂いたマシン稼働率の計算以下の部分についてお伺い致します。
サブルーチン「稼働率計算」から発生しているアクションイベントにつながっている開始日取得の部分の「テーブル」「計算開始/終了日」で「指定セルの値を取得する」とあります。これはこのテーブル上の指定セルの値を取得し、それを日付格納変数に設定していると推測します。この考え方で正しいでしょうか?また、取得した指定セルの値は、日付格納変数に設定されるまではどこに保持されているのでしょうか?ここの日付格納変数では取得方法が「メソッド処理結果」となっています。このメソッド処理結果は、どのような時に設定可能なのか、参考になる解説書などありましたらお教え下さい。
A10-14:
> 作成して頂いたマシン稼働率の計算以下の部分についてお伺い致します。
サブルーチン「稼働率計算」から発生しているアクションイベントにつながっている開始日取得の部分の「テーブル」「計算開始/終了日」で「指定セルの値を取得する」とあります。これはこのテーブル上の指定セルの値を取得し、それを日付格納変数に設定していると推測します。この考え方で正しいでしょうか?
その考え方で間違いございません。
> また、取得した指定セルの値は、日付格納変数に設定されるまではどこに保持されているのでしょうか?
取得したセルの値(起動メソッドの実行結果)は内部的にのみ保持されており、その保持場所はビルダー画面上には表示されません。「メソッド処理結果」は、「起動メソッド情報」ダイアログで参照・設定することができます。その方法は以下の通りです。
(1) イベントに接続されているコンポーネント上で右クリック。
(2) メニューから[起動メソッド設定...]を選択。「起動メソッド情報」ダイアログが表示される。
(3) [取得方法]欄で「メソッド処理結果」を選択。
(4) [メソッド/値]欄で左クリック。「メソッド処理結果選択」ダイアログが表示され、選択可能なメソッド処理結果の一覧が示される。
> ここの日付格納変数では取得方法が「メソッド処理結果」となっています。このメソッド処理結果は、どのような時に設定可能なのか、参考になる解説書などありましたらお教え下さい。
「メソッド処理結果」は、同じイベントに接続されている起動メソッドのうち、先に行われたメソッドの結果を後の起動メソッドの引数として利用するときに設定します。この場合は、テーブル[ID:5 KEY:"計算開始/終了日"]のセルの値(計算開始/終了日の日付データ)を日付格納変数に設定したいので、テーブル[ID:5 KEY:"計算開始/終了日"]の「指定セルの値を取得する(int,int)」を先に実行し、その後で、その実行結果を引数として日付格納変数の「日付データを設定する(Date)」メソッドを実行しています。
「メソッド処理結果」につきましては、以下に説明が記述してありますので、ご覧いただければと存じます。
・アプリケーションビルダー操作説明書
「2.用語説明」の「4) メソッド」
「3.5.コンポーネント間の接続設定」の 「4) 起動メソッドの指定」
・注文票アプリケーション作成チュートリアル
「Lesson.2 注文票の機能を拡張してみよう」の「Step.3 カタログを用意する」の「2) 注文票にカタログデータを登録する」および「4) 確認メッセージを変化させる」
Q10-15:
作成して頂いたアプリケーションについて質問がございます。マシン稼働率の計算の箇所のサブルーチン稼働率計算のアクションイベントにつながっているファンクション「指定日時間の勤務時間計算」コンポーネントの役割は何なのでしょうか?また、ここでの2つの引数は第1が計算開始日で第2が計算終了日と考えて宜しいでしょうか?
A10-15:
> 作成して頂いたアプリケーションについて質問がございます。
> マシン稼働率の計算の箇所のサブルーチン稼働率計算のアクションイベントにつながっているファンクション「指定日時間の勤務時間計算」コンポーネントの役割は何なのでしょうか?また、ここでの2つの引数は第1が計算開始日で第2が計算終了日と考えて宜しいでしょうか?
2つの引数は、第1が計算開始日で第2が計算終了日です。
このファンクションコンポーネントの役割は、計算開始日から計算終了日までの勤務時間を計算することです。
2009/11/25にお送りしたメールでは、稼働率の最大空き時間の計算に関して、以下の前提条件を定時させていただきました。
> まず、計算の前提条件について確認させていただきたく存じます。
(a) マシンの稼働率=(期間内のマシンの稼働時間の総和)÷(期間内の勤務時間の総和)
例えば、1日の勤務時間が8時間でマシンの稼働時間が4時間の場合、その日の稼働率は4÷8=0.5となる。
(b) マシンは勤務時間内でのみ稼働する。
(c) 1つのマシンが複数の仕事を同時に行うことはない(稼働時間をガントチャートとして表示したとき、複数のタスクが重なることはない)。
(d) 休日の勤務時間はゼロであり、休日以外の勤務時間は一定である。超過勤務等の不規則な勤務時間は考慮しない。
この(a)に記されているように、稼働率を計算するには「期間内の勤務時間の総和」が必要となります。サブルーチン[ID:8 KEY:"稼働率計算"]のアクションイベントにつながっているファンクション[ID:21 KEY:"指定日時間の勤務時間計算"]コンポーネントの役割、(a)で示されている稼働率計算の分母である「期間内の勤務時間の総和」を計算することです。ここで計算された「期間内の勤務時間の総和」は、任意精度実数(BigDecimal)格納変数[ID:9 KEY:"通常勤務時間総計(分)"]に設定され、マシンごとの稼働率の計算に使われています。
サンプルアプリケーションをお送りする時点では、マシンを24時間稼働とするのかそうでないのかが不明でしたので、非勤務時間を取り除いた勤務時間の計算を行えるファンクション[ID:21KEY:"指定日時間の勤務時間計算"]コンポーネントのメソッドを呼び出すようにサンプルを作成しました。24時間稼働を前提とするならば、ファンクション[ID:21 KEY:"指定日時間の勤務時間計算"]コンポーネントのメソッドを呼び出さず、例えばカレンダーコンポーネントを利用して計算開始日時から計算終了日時までの時間を計算し、それをお使いになることも可能です。
カレンダーコンポーネントの使用例につきましては、付属の「サンプル(カレンダー)」をご覧ください。
Q10-16:
作成して頂いたアプリケーションにおいて、下記で返答頂いた「ファンクション」“指定日時間の勤務時間計算”について、コンポーネントの実行される順番について質問がございます。このファンクションが実行されるときは、その下部に記載されている、そのファンクションの「処理要求イベント」につながっている複合コンポーネントの「稼動日時情報」が実行されるのでしょうか?その場合、そのイベントに減算コンポーネントが2回接続されています。減算コンポーネントには、メソッドとして「数値変換/左右オペランド設定後、演算を行う」も選択できます。これを使う場合、1回の接続だけで計算ができます。ここで敢えて2回接続してある理由をお教え下さい。
A10-16:
> 作成して頂いたアプリケーションにおいて、下記で返答頂いた「ファンクション」“指定日時間の勤務時間計算”について、コンポーネントの実行される順番について質問がございます。このファンクションが実行
されるときは、その下部に記載されている、そのファンクションの「処理要求イベント」につながっている複合コンポーネントの「稼動日時情報」が実行されるのでしょうか?
はい。ファンクション[ID:21 KEY:"指定日時間の勤務時間計算"]の処理要求イベントに接続されている4つのメソッドが順次実行されます。
> その場合、そのイベントに減算コンポーネントが2回接続されています。減算コンポーネントには、メソッドとして「数値変換/左右オペランド設定後、演算を行う」も選択できます。
これを使う場合、1回の接続だけで計算ができます。ここで敢えて2回接続してある理由をお教え下さい。
ファンクション[ID:21 KEY:"指定日時間の勤務時間計算"]の「ファンクションの呼び出し(2引数)(Object,Object)」の実行結果として、減算の結果を戻すためです。
2009/11/26のメールにて、ファンクションの機能について以下のようにご説明いたしました。
> ファンクションコンポーネントのメソッド「ファンクションの呼び出し (Object,...)」を実行すると、ファンクションコンポーネントから処理要求イベントが発生します。その処理要求イベントに接続されているメソッドのうち、最後に接続されているメソッドの実行結果が「ファンクションの呼び出し
(Object,...)」メソッドの実行結果となり、その値は他のコンポーネントから「メソッド処理結果」として利用されることになります。
ここで、「処理要求イベントに接続されている最後のメソッドの実行結果が『ファンクションの呼び出し(Object,...)』メソッドの実行結果となる」という点にご注目ください。
ご指摘のように、減算(−)[ID:22 "作業領域"]の「数値変換/左右オペランド設定後、演算を行う(String,String)」メソッドを用いれば、メソッド実行1回のみで計算を行うことができます。しかしながら、このメソッドが返す実行結果はNULL(データが何もないこと)ですので、結果として、ファンクション[ID:21KEY:"指定日時間の勤務時間計算"]の「ファンクションの呼び出し(2引数)(Object,Object)」の実行結果がNULLになります。そこで、実行結果を減算の値とするために減算(−)[ID:22 "作業領域"]の「演算結果(左オペランド-右オペランド)を取得する()」メソッドを最後に実行しています。
ちなみに、減算(−)コンポーネントの「数値変換/左右オペランド設定後、演算を行う(String,String)」メソッドによる計算結果は、このコンポーネントが発生する処理完了イベントの内包データとして取得できます。付属の「開発チュートリアル(基礎編)」や「注文票アプリケーション作成チュートリアル」では、この方法で取得した計算結果を、数値入力フィールドに設定しています。
コンポーネントの各メソッドの引数や戻り値につきましては、付属の「コンポーネントリファレンス」およびそこに記述されているリンク先のWEBページをご覧ください。
Q10-17:
作成して頂いたアプリケーションのファンクション「指定日時間の勤務時間計算」の処理要求イベントについて、下記の回答を頂きました。
>減算コンポーネントの「数値変換/左右オペランド設定後、演算を行う(String,String)」メソッドを用いれば、メソッド1回の実行で計算を
行うことはできます。しかしながら、このメソッドの戻り値として得られる値は NULL(何のデータもないこと)ですので、結果として、ファンクション[ID:21
KEY:"指定日時間の勤務時間計算"]の「ファンクションの呼び出し(2引数)(Object,Object)」メソッドの実行結果がNULLになります。
ここでの実行結果と下記の計算結果とは異なると考えて良いのでしょうか?計算の結果はメソッドの戻り値として減算コンポーネントは保持していないのでしょうか?コンポーネントレファレンスでは減算コンポーネントの戻り値は(左オペランド−右オペランド)となっていましたが。
> ちなみに、「数値変換/左右オペランド設定後、演算を行う(String,String)」メソッドの実行による計算結果は、この減算コンポーネントが発生する処理完了
イベントの内包データとして取得できます。付属の「開発チュートリアル(基礎編)」や「注文票アプリケーション作成チュートリアル」では、その方法で取得
した計算結果を、数値入力フィールドに設定しています。
このファンクション:"指定日時間の勤務時間計算"の箇所には、サブルーチンのコンポーネントも設定できるように思いますが、ファンクションとした理由は、処理結果を他のコンポーネントで引用したいからと考えて良いのでしょうか?
A10-17:
> 作成して頂いたアプリケーションのファンクション「指定日時間の勤務時間計算」の処理要求イベントについて、下記の回答を頂きました。
>> 減算コンポーネントの「数値変換/左右オペランド設定後、演算を行う(String,String)」メソッドを用いれば、メソッド1回の実行で計算を
行うことはできます。しかしながら、このメソッドの戻り値として得られる値はNULL(何のデータもないこと)ですので、結果として、ファンクション[ID:21
KEY:"指定日時間の勤務時間計算"]の「ファンクションの呼び出し(2引数)(Object,Object)」メソッドの実行結果がNULLになります。
> ここでの実行結果と下記の計算結果とは異なると考えて良いのでしょうか?
計算の結果はメソッドの戻り値として減算コンポーネントは保持していないのでしょうか?コンポーネントレファレンスでは減算コンポーネントの戻り値は(左オペランド−右オペランド)となっていましたが。
この場合、「実行結果」と「計算結果」は、値としてはまったく同じもので、いずれも(左オペランド−右オペランド)です。「実行結果」という用語は「戻り値」と同義とお考えください。ここで、減算コンポーネントの以下の2つのメソッド
(1) 演算結果(左オペランド−右オペランド)を取得する()
(2) 数値変換/左右オペランド設定後、演算を行う(String,String)
について、その動作の詳細を説明させていただきます。
(1) 演算結果(左オペランド−右オペランド)を取得する()
このメソッドの英語名は「getNumberResult()」で、コンポーネントリファレンスから参照されたのは、このメソッドかと存じます。このメソッドは、すでに設定されている左オペランドと右オペランドの差を計算し、その計算結果を戻り値として返します。このメソッドの実行により発生するイベントはありません。すなわち、
計算結果: (左オペランド−右オペランド)を表す数値
実行結果(戻り値): (左オペランド−右オペランド)を表す数値
発生するイベント: なし
となります。
(2) 数値変換/左右オペランド設定後、演算を行う(String,String)
このメソッドの英語名は「evaluateNumber(String,String)」で、コンポーネントリファレンスからのリンクでは、「クラスjp.go.aist.dmrc.platform.beans.util.operator.PFArithmeticOperator から継承したメソッド」の欄に記述されているものです。
このメソッドは、引数として与えられた左オペランドと右オペランドの差を計算し、その計算結果を内包データとする処理完了イベントを発生します。戻り値として返すデータはありません。すなわち、
計算結果: (左オペランド−右オペランド)を表す数値
実行結果(戻り値): NULL(何もなし)
発生するイベント: (左オペランド−右オペランド)を表す数値を内包データとする処理完了イベント
となります。
以上、ご覧頂きましたように、どちらのメソッドも減算を行うという点では同じですが、その計算の結果をどのようにして出力するのかが異なっています。そして、減算コンポーネント自身は計算の結果を保持してはおらず、メソッド起動のたびに計算を行っています。
> このファンクション:"指定日時間の勤務時間計算"の箇所には、サブルーチンのコンポーネントも設定できるように思いますが、ファンクションとした理由は、
処理結果を他のコンポーネントで引用したいからと考えて良いのでしょうか?
その通りです。サブルーチンの「処理を呼び出す()」メソッドを用いても計算を行うことはできるのですが、この「処理を呼び出す()」メソッドの戻り値はNULLであるため、計算結果を他のコンポーネントで利用することができません。さらに、サブルーチンの「処理を呼び出す()」メソッドには引数を与えることもできませんので、2つの日時間の勤務時間を計算させるような場合での使用には不向きです。そこでファンクションを用いています。
Q10-18:
作って頂いたアプリケーションについて質問があります。サブルーチン「稼働率計算」のアクションイベントにつながっているファンクション「指定日時間の勤務時間計算」の直ぐ下に接続されている任意精度実数格納変数「通常勤務時間総計」には、指定した期間内の総勤務時間が設定されるとことでしたが、ここで(イベント発生なし)で数値を設定しているのはいかなる理由からでしょうか?
また、その下のテーブル格納変数には、ガントチャートのデータがテーブル形式で設定されると推測します。ガントチャートの場合もテーブル同様にインデックスをもちいて情報が設定されるのでしょうか?テーブルの場合、インデックスは行も列も0から始まっていましたが、ガントチャートのデータも0から始まるインデックスで指定されるのでしょうか?また、その場合、チャートの上から開始時刻、終了時刻の順にインデックスが設定されるのでしょうか?その場合、ガントチャートの横軸と縦軸の情報はテーブル格納変数にどのように指定されるのでしょうか?
A10-18:
> 作って頂いたアプリケーションについて質問があります。
サブルーチン「稼働率計算」のアクションイベントにつながっているファンクション「指定日時間の勤務時間計算」の直ぐ下に接続されている任意精度実数格納変数「通常勤務時間総計」には、指定した期間内の総勤務時間が
設定されるとことでしたが、ここで(イベント発生なし)で数値を設定しているのはいかなる理由からでしょうか?
不要なイベント発生を行わないようにすることで、想定外の挙動が起きないようにするためです。
メソッドには、「イベントを発生させる」動作をともなうものがあることは、すでにご理解いただいていることと存じます。この動作は、処理を連続して行うためには必須のものなのですが、一方、イベント発生のタイミングを把握しておかないと、意図していない処理が起動されてしまう危険性があります。ここでは、任意精度実数格納変数[ID:9 KEY:"通常勤務時間総計(分)"]へのデータ設定によって何らかの処理を起動することは意図していませんので、それを確実なものとするためにあえて「イベント発生なし」を使用しています。
もっとも、お送りしたサンプルアプリケーションの場合、任意精度実数格納変数[ID:9 KEY:"通常勤務時間総計(分)"]が発生するイベントに接続されているメソッドはありませんので、結果的には、「イベント発生なし」でも動作に違いはありません。
> また、その下のテーブル格納変数には、ガントチャートのデータがテーブル形式で設定されると推測します。ガントチャートの場合もテーブル同様にインデックスをもちいて情報が設定されるのでしょうか?
新しくタスク(ガントチャート上の帯)を追加することはできませんが、各タスクの開始/終了日時の取得/設定等はインデックス指定で行うことができます。それらのメソッドにつきましては、付属のコンポーネントリファレンスおよびそこに記述されているリンク先のWEBページをご覧ください。
> テーブルの場合、インデックスは行も列も0から始まっていましたが、ガントチャートのデータも0から始まるインデックスで指定されるのでしょうか?また、その場合、チャートの上から開始時刻、終了時刻の順にインデックスが設定されるのでしょうか?
ガントチャート上のタスクはインデックスによって特定され、各タスクは開始/終了日時データを保持しています。タスクを特定するためのインデックスは「作業項目インデックス」と「系列インデックス」の2つで、いずれも0から始まります。
作業項目インデックスはガントチャート上の縦軸のインデックスとなっており、お送りしたサンプルアプリケーションを例にとってご説明しますと、
見積り: 作業項目インデックスは0
設計: 作業項目インデックスは1
調達: 作業項目インデックスは2
となります。
系列インデックスは、基本的には凡例の並び順に対応しております。お送りしたサンプルアプリケーションを例にとってご説明しますと、
神立: 系列インデックスは0
石岡: 系列インデックスは1
高萩: 系列インデックスは2
となります。ただし、Ver.2.4からは重複した凡例(系列名と色が同一の凡例)は表示されないようになっていますので、系列名と色が同一のタスクが存在する場合、系列インデックスをガントチャート上から特定することはできません。
お送りしたサンプルアプリケーションの場合、系列「神立」(赤色)に該当するタスクが2つありますが、これらの系列インデックスをガントチャート上のグラフ表示のみから特定することはできません。このような場合には、ガントチャートからテーブルデータを取得し、そのテーブルの情報から系列インデックスを特定するしかありません。
> その場合、ガントチャートの横軸と縦軸の情報はテーブル格納変数にどのように指定されるのでしょうか?
2009/11/27のメールで以下の通りご説明しましたように、
>> ガントチャート上の作業項目名がテーブル稼働率の1列目に入力されると推測しています。
ガントチャート上の作業項目はインデックスでどのように指定しているのでしょうか?
> すでに開発チュートリアルの「Lesson.11 ガントチャートを使ってみよう」や「Lesson.14 テーブルとガントチャートの機能を拡張しよう」でご覧頂いており
ますとおり、ガントチャート上の作業項目は、ガントチャートコンポーネントから取得したテーブルの第0列の各セルに収まっております。お送りしたサンプル
アプリケーションは、Lesson.11で扱っているアプリケーションに機能追加したもので、起動画面に表示されているテーブルのデータは、ガントチャートから取
得したテーブル、すなわちテーブル格納変数[ID:12 KEY:"ガントチャートテーブル"]に設定されているデータと同じものになります。
テーブル格納変数に設定されるテーブルデータは、お送りしたサンプルアプリケーションの画面に表示されているテーブルと同じものになります。すなわち、
第0列が作業項目名
第1列以降は2列1組で各タスクの開始/終了日時、系列名は奇数列の列名
となります。このように、ガントチャート上の横軸(時間軸)の情報はタスクの開始/終了日時データとして、テーブルのセルに収められております。ガントチャート上に表示されている表示期間に関する情報は、テーブルデータとしては出力されません。
ガントチャート上の各タスクの系列インデックスは、テーブルデータの列インデックスに対応します。テーブルデータでは、上述のように、タスク1つは2列に対応しますので(それぞれ開始と終了)、系列インデックスがN(N=0, 1, 2,...)であるタスクのテーブル上の列インデックスは、2N+1となります。
ガントチャートのグラフとテーブルデータとの対応関係は、開発チュートリアルの「Lesson.11 ガントチャートを使ってみよう」をご覧ください。
Q10-19:
大変丁寧なご説明ありがとうございます。良く理解できました。また、飲み込みが悪く同じ質問を繰り返しまして誠に申し訳ありません。
作成して頂いたアプリケーションについて質問がございます。サブルーチン「稼働率計算」に接続されている「テーブル格納変数」“ガントチャートテーブル”で「列を位置指定で削除する」とあります。これは、この変数に格納されているデータのうち列のインデックスが0の情報を削除することだと推測します。この情報を削除する目的は何なのでしょうか?
ファンクション“期間内午前零時リスト作成”の処理要求イベントに接続されている2番目のカレンダー“作業領域”の「時刻を零時に設定する」の意図をお教え下さい。
A10-19:
> 作成して頂いたアプリケーションについて質問がございます。サブルーチン「稼働率計算」に接続されている「テーブル格納変数」“ガントチャートテーブル”で「列を位置指定で削除する」とあります。
これは、この変数に格納されているデータのうち列のインデックスが0の情報を削除することだと推測します。この情報を削除する目的は何なのでしょうか?
お送りしたサンプルアプリケーションでは、マシンごとの稼働時間の総和を計算するために
[開始日時1, 終了日時1, 開始日時2, ...]
というデータを利用しており、このデータはガントチャートのテーブルデータから取得しています。ただし、ガントチャートのテーブルデータの第0列には作業項目名が入っていますので、そのまま使おうとすると
[作業項目名, 開始日時1, 終了日時1, 開始日時2, ...]
というデータになります。そこで、先頭の作業項目名を取り除くために、テーブル格納変数[ID:12 KEY:"ガントチャートテーブル"]の第0列を削除しています。
> ファンクション“期間内午前零時リスト作成”の処理要求イベントに接続されている2番目のカレンダー“作業領域”の「時刻を零時に設定する」の意図をお教え下さい。
一般に日時データ(Dateデータ)は、年月日時分秒のデータを持っています(厳密にはミリ秒単位)。したがって、自分では午前零時(例えば2009/05/1800:00:00)を指定したつもりでも、単に時分秒が画面に表示されていないだけで、データとしては午前零時ではない可能性があります(日付入力フィールドやテーブルの日付データ列は、表示形式を「日付のみ」などに設定可能です)。そこで、「時刻を零時に設定する()」メソッドを実行し、時分秒を00:00:00に合わせています。
Q10-20:
ファンクション“期間内午前零時リスト作成”の処理要求イベントに接続されている1番目と3番目のカレンダー“作業領域”では1番目が計算開始日を取得し、3番目が計算終了日を取得していると推測します。しかし、それらのメソッドが「Dateオブジェクトによるカレンダーの設定」、「設定されている日時以降の日数を取得」となり、異なっています。これはどのような理由で異なっているのでしょうか?
A10-20:
> ファンクション“期間内午前零時リスト作成”の処理要求イベントに接続されている1番目と3番目の
カレンダー“作業領域”では1番目が計算開始日を取得し、3番目が計算終了日を取得していると推測します。
しかし、それらのメソッドが「Dateオブジェクトによるカレンダーの設定」、「設定されている日時以降の日数を
取得」となり、異なっています。これはどのような理由で異なっているのでしょうか?
ファンクション[ID:23 KEY:"期間内午前零時リスト作成"]の処理要求イベントに接続されている一連のメソッドでは、計算開始/終了日および実働ゼロの仮の稼働時間からなるリストを作成しています。このリスト作成という処理において、計算開始日データと計算終了日データでは使用目的が異なるため、それらのデータを利用しているメソッドが異なっています。
この処理要求イベントに接続されている一連のメソッドで行っている処理は以下の通りです。具体的なデータとして、仮に計算開始日を「2009/05/18」、計算終了日を「2009/05/20」といたします。
(1) 計算開始日から計算終了日前日までの日付データのリストを作成する。
ここでは、[2009/05/18 00:00:00, 2009/05/19 00:00:00]というリストが作成される。
(2) (1)で作成したリストをコピーして、そのまま末尾に追加する。
この操作により、
[2009/05/18 00:00:00, 2009/05/19 00:00:00, 2009/05/18 00:00:00, 2009/05/19 00:00:00]というリストが作成される。
(3) (2)で作成したリストでは計算開始日(2009/05/18 00:00:00)が重複しているので、先頭要素を削除する。この操作により、
[2009/05/19 00:00:00, 2009/05/18 00:00:00, 2009/05/19 00:00:00]というリストが作成される。
(4) (3)で作成したリストには計算終了日(2009/05/20 00:00:00)が含まれていないので、末尾に計算終了日のデータを追加する。この操作により、
[2009/05/19 00:00:00, 2009/05/18 00:00:00, 2009/05/19 00:00:00, 2009/05/20 00:00:00]というリストが作成され、このリストが戻り値として返される。
この時点では、このリストの要素の並びは日付順になっておりません。この後、マシンの稼働時間データリストに追加してから、まとめて並び替えています。
さて、ご質問の箇所は、上述の(1)の計算部分に該当します。この計算をさらに細かく分けますと、以下のようになります。
(1-1) 計算開始日データをカレンダー[ID:24 KEY:"作業領域"]に設定する。
(1-2) 計算開始日から計算終了日までの日数を計算する。
(1-3) 計算開始日を先頭に、(1-1)で得た日数分の日付データを要素とするリストを作成する。
(1-1)は、リスト作成のための計算の基点を設定する処理です。
(1-2)の処理を行っているのがカレンダー[ID:24 KEY:"作業領域"]の「設定されている日時以降の日数を取得(Date)」メソッドです。このメソッドは、現在設定されている日時から、引数で与えられた日時までの日数を計算します。ここで扱っている例では、設定されている日時が「2009/05/18 00:00:00」(計算開始日)で、引数で与えられた日時が「2009/05/20 00:00:00」(計算終了日)ですので、日数は2となります。
そして、(1-3)の処理を行っているのがカレンダー[ID:24 KEY:"作業領域"]の「Dateオブジェクトリストの取得(int,int)」メソッドです。このメソッドは、現在設定されている日時を先頭として、第1引数で与えられた数だけの日付データを、第2引数で与えられた間隔で生成し、そのリストを作成します。ここの例では、第1引数が(1-2)で計算された日数である2で、第2引数が固定値の1ですので、「2009/05/18 00:00:00」(計算開始日)から1日間隔で要素数が2のリスト、すなわち、[2009/05/18 00:00:00, 2009/05/19 00:00:00]を作成します。
以上、ご覧頂きましたように、ここの処理では、計算開始日はリスト作成の基点を設定するため、計算終了日はリストに含まれる要素数を計算するために使われており、それぞれ用途が異なりますので、利用しているメソッドも異なります。
なお、2009/11/30のメールで回答しましたように、24時間運転の場合には計算開始日から計算終了日までの日数分の日付データを作成する必要がありませんので、カレンダー[ID:24 KEY:"作業領域"]の「Dateオブジェクトリストの取得(int,int)」メソッドの第1引数を1とします。そうすることによって、実働ゼロの仮の稼働時間用の日付データは作成されず、(1-3)で作成されるリストは計算開始日のみを含むことになります。
Q10-21:
> (4) (3)で作成したリストには計算終了日(2009/05/20 00:00:00)が含まれていないので、末尾に計算終了日のデータを追加する。この操作により、
[2009/05/19 00:00:00, 2009/05/18 00:00:00, 2009/05/19 00:00:00, 2009/05/20 00:00:00]というリストが作成され、このリストが戻り値として返される。
リスト作成するとき、何故このように、終了日前日までの日付データのリストを作成したり、コピーしたものを末尾にペーストしたりと、ややこしい操作をおこなうのでしょうか?また、作成したリストでは2009/05/19が2個ありますが、これは、後の操作で必要となるのでしょうか?
> なお、2009/11/30のメールで回答しましたように、24時間運転の場合には計算開始日から計算終了日までの日数分の日付データを作成する必要がありませんの
で、カレンダー[ID:24 KEY:"作業領域"]の「Dateオブジェクトリストの取得 (int,int)」メソッドの第1引数を1とします。そうすることによって、実働ゼ
ロの仮の稼働時間用の日付データは作成されず、(1-3)で作成されるリストは計算開始日のみを含むことになります。
ここで、第1引数を1と設定すると、第2引数も1なので、1日分のリストを一日おきに 作成されるのではないでしょうか?この場合、1日分のリストが作成されるのでしょうか?それとも、リストはまったく作成されないのでしょうか?
ファンクション「期間内午前零時リスト作成」の処理要求イベントに接続されているリスト格納変数“作業領域”において、下記のデータが下記の並びの順のままリストとして設定されるのでしょうか?
>この操作により、
[2009/05/19 00:00:00, 2009/05/18 00:00:00, 2009/05/19 00:00:00, 2009/05/20 00:00:00]というリストが作成され、このリストが戻り値として返される。
この時点では、このリストの要素の並びは日付順になっておりません。この後、>マシンの稼働時間データリストに追加してから、まとめて並び替えています。
A10-21:
>> (4) (3)で作成したリストには計算終了日(2009/05/20 00:00:00)が含まれていないので、末尾に計算終了日のデータを追加する。この操作により、
[2009/05/19 00:00:00, 2009/05/18 00:00:00, 2009/05/19 00:00:00, 2009/05/20 00:00:00]というリストが作成され、このリストが戻り値として返される。
> リスト作成するとき、何故このように、終了日前日までの日付データのリストを作成したり、コピーしたものを末尾にペーストしたりと、ややこしい操作をおこなうのでしょうか?
他に簡単な方法が思い当たらなかったからです。良い方法があれば、ご提案頂ければと存じます。
> また、作成したリストでは2009/05/19が2個ありますが、これは、後の操作で必要となるのでしょうか?
実働ゼロの稼働時間を表現する開始/終了日時として利用します。実働ゼロの稼働時間およびその挿入の目的は、すでに2009/11/27のメール等で回答差し上げた通りです。
24時間運転の場合には、実働ゼロの稼働時間を表現する2個の2009/05/19は不要です。
>> なお、2009/11/30のメールで回答しましたように、24時間運転の場合には計算開始日から計算終了日までの日数分の日付データを作成する必要がありませんの
で、カレンダー[ID:24 KEY:"作業領域"]の「Dateオブジェクトリストの取得(int,int)」メソッドの第1引数を1とします。そうすることによって、実働ゼ
ロの仮の稼働時間用の日付データは作成されず、(1-3)で作成されるリストは計算開始日のみを含むことになります。
> ここで、第1引数を1と設定すると、第2引数も1なので、1日分のリストを一日おきに作成されるのではないでしょうか?この場合、1日分のリストが作成されるので
しょうか?それとも、リストはまったく作成されないのでしょうか?
「(1-3)で作成されるリストは計算開始日のみを含む」と申し上げている通り、1日分のリスト、ここでの例では[2009/05/18 00:00:00]というリストが作成されます。
> ファンクション「期間内午前零時リスト作成」の処理要求イベントに接続されているリスト格納変数“作業領域”において、下記のデータが下記の並びの順のままリストとして設定されるのでしょうか?
>> この操作により、
[2009/05/19 00:00:00, 2009/05/18 00:00:00, 2009/05/19 00:00:00, 2009/05/20 00:00:00]というリストが作成され、このリストが戻り値として返される。
この時点では、このリストの要素の並びは日付順になっておりません。この後、マシンの稼働時間データリストに追加してから、まとめて並び替えています。
この並びの順のままリストとして設定されます。
Q10-22:
ファンクションの“期間内午前零時リスト作成”の処理要求イベントに接続されている中間あたりのリスト格納変数で「最後尾に全要素を追加する」では、
[2009/05/19 00:00:00, 2009/05/18 00:00:00,2009/05/19 00:00:00, 2009/05/20 00:00:00]が
[2009/05/19 00:00:00, 2009/05/18 00:00:00,2009/05/19 00:00:00, 2009/05/20 00:00:00]の後にこの順番で追加されると考えて良いのでしょうか?
A10-22:
> ファンクションの“期間内午前零時リスト作成”の処理要求イベントに接続されている中間あたりのリスト格納変数で「最後尾に全要素を追加する」では
> [2009/05/19 00:00:00, 2009/05/18 00:00:00, 2009/05/19 00:00:00, 2009/05/20 00:00:00]が [2009/05/19 00:00:00, 2009/05/18 00:00:00, 2009/05/19 00:00:00, 2009/05/20 00:00:00]の後にこの順番で追加されると考えて良いのでしょうか?
違います。
[2009/05/18 00:00:00, 2009/05/19 00:00:00]が、[2009/05/18 00:00:00,2009/05/19 00:00:00]の後にこの順番で追加されます。
この部分のリスト格納変数[ID:26 KEY:"作業領域"]の「最後尾に全要素を追加する(Collection)」メソッドの処理は、2009/12/03に差し上げたメールでご説明した以下の手順のうち、(2)に該当します。
> この処理要求イベントに接続されている一連のメソッドで行っている処理は以下の通りです。具体的なデータとして、仮に計算開始日を「2009/05/18」、計算終了日を「2009/05/20」といたします。
(1) 計算開始日から計算終了日前日までの日付データのリストを作成する。
ここでは、[2009/05/18 00:00:00, 2009/05/19 00:00:00]というリストが作成される。
(2) (1)で作成したリストをコピーして、そのまま末尾に追加する。
この操作により、[2009/05/18 00:00:00, 2009/05/19 00:00:00, 2009/05/18 00:00:00, 2009/05/19 00:00:00]というリストが作成される。
(3) (2)で作成したリストでは計算開始日(2009/05/18 00:00:00)が重複しているので、先頭要素を削除する。この操作により、[2009/05/19 00:00:00, 2009/05/18 00:00:00, 2009/05/19 00:00:00]というリストが作成される。
(4) (3)で作成したリストには計算終了日(2009/05/20 00:00:00)が含まれていないので、末尾に計算終了日のデータを追加する。この操作により、
[2009/05/19 00:00:00, 2009/05/18 00:00:00, 2009/05/19 00:00:00, 2009/05/20 00:00:00]というリストが作成され、このリストが戻り値として返される。
Q10-23:
作成して頂いたアプリケーションのサブルーチン“稼働率計算”のアクションイベントに接続されているひとまとまりの下から2番目のリスト格納変数“午後12時/午前零時リスト”には、例の場合の[2009/05/19 00:00:00, 2009/05/18 00:00:00,2009/05/19 00:00:00, 2009/05/20 00:00:00]がこの順番で設定されると考えて宜しいのでしょうか?
A10-23:
> 作成して頂いたアプリケーションのサブルーチン
“稼働率計算”のアクションイベントに接続されているひとまとまりの下から2番目のリスト格納変数“午後12時/午前零時リスト”には、例の場合の
[2009/05/19 00:00:00, 2009/05/18 00:00:00, 2009/05/19 00:00:00, 2009/05/20
00:00:00]がこの順番で設定されると考えて宜しいのでしょうか?
その通りです。
備考:「データベース」の「Q&A79」、「実現したい処理別」の「Q&A103」、「グラフ」の「Q&A24」にも掲載。