フォーラムへの返信
-
投稿者投稿
-
MZPlatformユーザー会キーマスター
整数の割り算はなかなか難しいですが、確かに添付していただいた方法では思った通りにならないようです。これを不具合と考えて他に影響を与えないように修正することも難しいので、やはり前回紹介した方法がおすすめです。
以下、解説です。
整数の割り算とするために除算コンポーネントのDecimalPlaceを0にしたようですが、今回の問題はこれが影響しています。除算コンポーネントは常に実数として割り算をしていて、どこまでも割り切れないときの丸め用にDecimalPlaceがあり、かつそのときの丸めモードが四捨五入に限定されています。つまり、DecimalPlaceを0にして整数の割り算をすると、実数として割り算をした結果次第で切り上げになります。
したがって、除算コンポーネントを使う場合はそのまま実数の計算として使い、結果から小数点以下を切り捨てて整数の割り算の結果にするのが良いと思います。例えば、結果を数値入力フィールドに設定して、フィールドの数値型を実数として小数点以下の最大桁数を0、丸めモードを切り捨てにすれば可能です。
MZPlatformユーザー会キーマスタービルダー画面のキャプチャ画像のみでは正確な記述がわかりませんが、おそらく整数の割り算ではなく小数の計算で結果が丸められていると思います。
整数の割り算にはいくつか方法がありますが、例えば整数(BigInteger)格納変数を使って、添付ファイルのように記述する方法があります。演算子コンポーネントを複数使うよりは、こちらの方がシンプルになると思います。変数側のメソッドがあまり日本語化されていないので探しづらいかもしれませんが、ご確認ください。
添付ファイル:
MZPlatformユーザー会キーマスター1.実際の状況によりますが、基本的にはエラー発生後の通常メソッド起動は飛ばされて、ErrorOnlyやFinallyの起動メソッドだけが実行されます。そのようなサンプルアプリを作成して試してみるのが良いと思います。
2.データベースアクセスに限らず、起動メソッドでエラーが発生すると、通常はその都度ダイアログが表示されます。ただし、ErrorOnlyやFinallyの起動メソッドがあると、エラーダイアログが表示されなくなるという仕様になっていると思います。そのため、サンプルではErrorOnlyでダイアログを表示する処理を追加している箇所があります。
MZPlatformユーザー会キーマスター最終的に何を質問したいのかがよくわからないので、こちらが質問と認識できた部分だけ回答します。
分類テーブル作成コンポーネントは、かなり難易度が高いので、直接使うことは考えない方が良いです。それを使用した複合コンポーネントがありまして、そのサンプルがインストール時に含まれていますので、まずは下記のファイルをご覧ください。
C:\MZPlatform\3.6\AP_DATA\Sample\グラフ化.mzax
ご紹介するのは、テーブルデータから各種グラフやガントチャート用にデータを変換する複合コンポーネントです。ビルダー上のポップアップメニューで「複合コンポーネント追加>グラフ>グラフ化モジュール.mzcx」で追加することができます。この複合コンポーネントの使い方は、複合コンポーネントをダブルクリックして中の階層に移動すると、コメントに説明が書いてあります。いずれにしろ説明が抽象的で難しいので、添付していただいた処理をこのグラフ化の複合コンポーネントで置き換えてみました。添付ファイルをご確認ください。
「グラフ化テーブル表示」ボタンを実行すると、「メソッド値分類テーブル表示」ボタンと同じ動作をします。結果的には、分類テーブル作成コンポーネントの使い方は合っていたと思います。
添付ファイル:
MZPlatformユーザー会キーマスター下記回答です。
1.テーブルにSQL文を記述して実行する際には、0列目にSQL文、1列目に実行時に発生するイベント番号を記入したテーブルを渡します。イベント発生時に処理を分岐したい場合には、別の番号を指定する必要がありますが、分岐が不要であれば常に0と記入しておけば良いです。
2.MySQLコマンドラインクライアントでSQL文を実行する場合はセミコロンが必要ですが、MZでデータベースアクセスコンポーネント経由でSQL文を実行する場合はセミコロン不要です。これは仕様になります。
MZPlatformユーザー会キーマスター今回は添付のMZアプリを開けましたが、MZASファイルのZIPファイルを添付するのはおやめください。こちらはMZのバージョンが異なると開けないタイプのファイルですので、MZAXファイルをお使いください。
さて、2は列ではなく行位置の話ですね。問題は、繰り返し制御の「繰り返し処理を実行する」の引数の指定の仕方です。引数の説明を見てもらえばわかりますが、「開始値」と「開始値を含めるかどうか」の組み合わせで、「0」と「false」と書くと、最初の行を含めないという指定になります。もしかしたらこれは理解した上で、先頭行が「1」だと考えていることが問題かもしれません。行や列の先頭位置は「0」となりますので、お間違えの無いように。
1はわかりにくいですが、列を追加するときに整数型にしていることが問題です。整数に変換できない文字列をセルに設定したときに、おそらく内部的に工程番号部分だけを見て整数に変換しているのだと思います。文字列型の列に変更すれば、正しく表示されます。
修正版ZIPファイルを添付しましたので、ご確認ください。
- この返信は6年、 10ヶ月前にMZPlatformユーザー会が編集しました。
MZPlatformユーザー会キーマスター下記回答です。
1.実際に確認していないので正確にはわかりませんが、接続したまま複数のクエリを実行して、最後に切断する方法は間違いないと思います。ただ、自動コミットのままで本当にそうなったでしょうか。単に最初のクエリでエラーが出たからということはないですか。そもそも、このように分ける必然性がよくわかりません。毎回コミットせずに、例えば複数のテーブルに対するクエリを一括で反映したいということでしょうか。
なお、FAQにはトランザクションの話題が複数ありますので、下記リンク先をご覧ください。
https://ssl.monozukuri.org/mzplatform/faq/faq/faq_technical/database/database_a51.html
https://ssl.monozukuri.org/mzplatform/faq/faq/faq_technical/database/database_a40.html
https://ssl.monozukuri.org/mzplatform/faq/faq/faq_technical/database/database_a73.html
https://ssl.monozukuri.org/mzplatform/faq/faq/faq_technical/database/database_a27.html2.そういう切断方法も可能です。ダイアログのアクションイベント処理から呼び出します。また、エラーが発生しても必ず実行させるようにメソッド起動のFinally起動というものもあります。
3.はい、それでよいです。ファンクションを使わずに直接呼んでも同じです。
4.詳細には調べていませんが、これは特に違いはないと思います。必ず切断してから終了することが重要です。一点だけ、接続している時間が長いと、複数からの接続で同時接続数の問題が出るかもしれません。
MZPlatformユーザー会キーマスターはい、可能です。
システム情報コンポーネントに「システムプロパティを取得する(String)」というメソッドがありまして、引数に固定値の文字列「user.name」を与えると、Windowsにログインしているユーザ名が取得できます。システムプロパティでは他にもとれる情報がありますので、FAQの関連質問へのリンクを張っておきます。他の項目についての詳細は、Web検索で「Java システムプロパティ」を調べると情報が得られると思います。
https://ssl.monozukuri.org/mzplatform/faq/faq/faq_technical/developer/developer_a5.htmlMZPlatformユーザー会キーマスター質問1の内容がよくわかりません。親という表現はやめた方が良いと思います。
基本的なことを説明しますと、左側の四角がコンポーネントの本体で、各コンポーネントに定義されたイベント処理につながる右側の四角は各コンポーネントが持つ機能(メソッド)の呼び出しです。前述の処理の順序を理解していれば、メソッド起動はそのときの値を返すと思えばよいです。質問2については、「Java 正規表現」をWeb検索してみてください。文字列のパターンを指定してマッチする行を選択しています。「.+」は任意の文字列を意味して、空文字列の行を除外する効果があると思います。
MZPlatformユーザー会キーマスター削除の条件についてのご質問にお答えする前に、後半の繰り返し制御について、というよりMZの処理実行順序について理解していただく必要がありそうです。
基本的な処理の順序は、下記の3つです。
1)イベント処理(赤丸につながった一連の起動メソッド)は上から順です。
2)起動メソッドを実行したときにイベントが発生する場合は、そのイベント処理が終わってから次の起動メソッドに移ります。
3)コンポーネント(左側の四角)の順番は、処理の順番と関係ありません。ここでは、サブルーチンと繰返し制御の実行の両方で必要なテーブルを作成しています。
サブルーチンの方では、アクションイベント処理の中で全体テーブルからフィルタで部分テーブルを取得して、選択テーブルに設定した後で経過時間が入る列を追加します。最後の繰り返し制御の繰り返し処理を呼び出すと、指定した回数アクションイベントが発生します。そのイベント処理の中で、選択テーブルの各行に関してセルを比較して経過時間を計算して、最後にテーブルの経過時間のセルに値を設定します。
この処理順序が理解できないうちは、適切に処理の追加はできませんので、がんばっていただくしかありません。
-
投稿者投稿