工程管理システム簡易版の改変について

MZ Platformとは 掲示板 MZプラットフォームユーザー会掲示板 工程管理システム簡易版の改変について

10 件の投稿を閲覧中 - 1 ~ 10 件(全 13 件)
  • 著者
    投稿
  • #6838
    Matsuda
    一般参加者

    工程管理システム簡易版をアプリケーションビルダーで一部を改変して使用したいと考えております.当方のデータベースはMySQLではなくMicrsoft SQL Serverを使用しており,テーブルの列名もサンプルとは異なった名称となります.
    そこで工程管理システム簡易版の,
    ・データベースをMySQLからSQL Serverに変更する方法
    ・SQL文のテーブル名や列名を変更する方法
    をご教授いただきたくお願い申し上げます.

    たとえばデータベースをMySQLからSQL Serverに変更するにはローカルMySQL設定のドライバとサーバ名を変更するだけでよいのでしょうか.
    またSQLで使用するテーブル名や列名の変更については,サンプルのAP_DATA¥Production¥production.sqlに記述されているようなidlabelproductdelivery といったサンプル固有の列名は,工程管理システム簡易版のどのコンポーネントに記述されているのでしょうか.ご教授ください.

    • このトピックは編集されました。 2 年 前 by Matsuda
    #6840
    MZPlatformユーザー会
    サイト管理者

    お問い合わせありがとうございます。

    1)接続文字列、パスワードの変更の他に、JDBCドライバーのインストールが必要です。お使いのSQLServerに適合したドライバーをMicrosoftのサイトからダウンロードし、
    MZPlatform\Java\jre8_mz3.6(_64)\lib\extフォルダーの中にコピーして入れます。
    Windows認証方式をお使いの場合は、JDBCダウンロードファイル中にある
    「\jpn\auth\ X64またはx86」内の「mssql-jdbc_auth-XXX.x64/x86.dll」も入れます。
    参考までに最新のドライバーのバージョンは「mssql-jdbc-11.2.0.jre8.jar」でした。

    2)ドライバ、サーバの接続文字列は以下の通りです。
      ドライバ:com.microsoft.sqlserver.jdbc.SQLServerDriver
      サーバ(URL):jdbc:sqlserver:// サーバ名:1433
      ポート省略時デフォルト:1433
      データベース指定時:databaseName=データベース名
      (Windows統合認証を使用する場合は、integratedSecurity=trueをデータベース名;の後に付けます)
    例)jdbc:sqlserver://localhost;encrypt=true;databaseName=データベース名;
    integratedSecurity=true;
    <参考 Micorosoft SQLドキュメント>
    https://learn.microsoft.com/ja-jp/sql/connect/jdbc/building-the-connection-url?view=sql-server-ver16

    \MZPlatform\3.6_64\AP_DATA\Sampleフォルダ内のサンプルファイル『データベースアクセス4.mzax』を実行し『登録名』選択すると各データベースに合わせた接続文字列になります。接続確認にこちらをお使いいただくと簡単かと存じます。

    3)工程管理アプリケーション内の、例えば工程表の「受注情報」と「工程指示表」の表示に関わるSQLクエリ(または雛形)は、ID42~44、50~52の[ラベル]コンポーネントのTEXTに設定されています。コンポーネントキーは「○○クエリ」といった名前になっています。また、[文字列格納変数]を使って、メソッド「正規表現に適合する最初の文字列を置換する(String,String)」によりクエリの雛形の文字を置き換えているので、その部分の引数の確認も必要です。同様に各複合コンポーネント内にSQLクエリを記入した[ラベル]コンポーネントがあります。

    4)工程管理簡易版のアプリケーションはあくまでMZPlatformで実現できる機能の例であり、処理の流れが複雑になっており、このままアプリケーションを変更してのご使用はあまりお勧めしません。手元に工程管理システムのテーブルとガントチャート表示のみの簡単なサンプルファイルがありますので、宜しければこちらをお試しいただいて、追加したい機能やご意見を頂ければと存じます。

    以上ご検討いただき、ご不明な点等ございましたら、どうぞ再度ご連絡ください。
    よろしくお願い申し上げます。

    添付ファイル:
    #7215
    Matsuda
    一般参加者

    いただいたサンプルファイルを触ってみました.ありがとうございました.
    以下,追加での質問です.

    受注番号に該当する文字列を,先頭の10文字だけを取り出してプロジェクトテーブルに表示させたいと考えています.

    いただいたサンプルでは,テーブル格納変数から0番目の列データリストを取得してリスト格納変数に設定し,リスト格納変数からプロジェクトテーブルに設定しています.

    リスト格納変数の各要素の文字列を,先頭の10文字だけ残して切り取るにはどのような方法があるでしょうか.
    あるいは最初からSQL文でSUBSTRINGやLEFT関数を使ってテーブルを取得するほうが簡単でしょうか.

    #7216
    MZPlatformユーザー会
    サイト管理者

    お問い合わせありがとうございます。
    文字列の操作には[文字列格納変数]をお使いください。
    メソッド「指定インデックス間の部分文字列に置き換える(int,int)」で引数0と引数1には位置番号を指定します。引数0の位置の文字は取り出される中に含まれますが、引数1の位置の文字は含まれないことに注意してください。先頭から10文字を指定する場合は(0,11)を指定します。実行後、変数内の文字列は置き換えられます。

    例えば、以下のような処理が考えられます。
    何かのタイミングで以下の2つの処理を設定します。
    (1)新しく[リスト格納変数2]「空のリストを設定する()」を設定します。
    取り出した文字列を格納する準備です。
    (2)[繰り返し制御(FOR)]「繰り返し処理を実行する」を実行します。
    引数0 開始値:固定値 0
    引数1 開始値を含めるかどうか:固定値 true
    引数2 終了値:メソッド戻り値[リスト格納変数]「要素数を取得する」
    引数3 終了値を含めるかどうか:固定値 false
    引数4 増減値:固定値 1

    [繰り返し制御(FOR)]を接続先とし、以下の処理を設定します。
    (3)[リスト格納変数]「要素を位置指定で取得する(int)」
    引数には『メソッド戻り値[繰り返し制御(FOR)]「現在値を取得する」』を指定します。
    (4)(3)で取得した要素を[文字列格納変数]「文字列を設定する(String)」で設定します。引数の取得方法は「メソッド処理結果」です。
    (5)上記の[文字列格納変数]「指定インデックス間の部分文字列に置き換える(int,int)」を設定します。
    (6)[リスト格納変数2]「最後尾に要素を追加する(Object)」を設定します。
    引数は『メソッド戻り値 [文字列格納変数]「文字列を取得する」』です。

    以上の処理実行後、つまり繰り返し処理の呼び出し後に[リスト格納変数2]からテーブルセル選択リストにリストを設定します。

    前回ご覧いただいたサンプルでは、[テーブル]のセル選択リストを選択したタイミングで「Where plojectLabel=”選択されたセル文字列”」の条件句の付いたSQL文を発行していますが、10文字の文字列では条件句が効かなくなるため、
    1.「Where like “○○%”」となるように雛型文を変更する
    2.選択されたセルと同位置の[リスト格納変数]の要素を取得して雛形文と置き換える
    などが考えられます。

    以上ご検討いただき、ご不明な点、ご質問等ございましたら、再度ご連絡いただければ幸いです。どうぞよろしくお願い申し上げます。

    #7217
    Matsuda
    一般参加者

    大変参考になります.ありがとうございました.

    重ねての質問で恐縮ですが,次に,工程テーブルに表示する工程名を,別のテーブルが保持する別名に変更したいと考えています.
    例えば,いただいたサンプルでのtaskテーブルにおいて,processフィールドの値がIDのようなものだとして,このIDをキーとして,工程の日本語名を保持する別のテーブル(工程名テーブル)があるとします(下記参照).

    工程ID | 工程名
    ———–|———
    process1 | 工程1
    process2 | 工程1

    サンプルではtaskテーブルから同じ受注番号のレコードをSQLで取得して工程テーブルに設定していますが,その際に,工程の表示をIDではなく日本語名に置き換えたいのです.
    どのタイミングで工程名テーブルを参照するのが適切でしょうか.あるいはSQL文でtaskテーブルからレコードを取得するタイミングで,工程名テーブルを参照して日本語名に置き換えてしまうことは可能でしょうか.

    • この返信は、 Matsuda により、 1 年, 4 ヶ月 前 に編集されました。
    #7219
    MZPlatformユーザー会
    サイト管理者

    ご連絡ありがとうございます。

    taskテーブルの「めっき」「検査」といった工程名(=process列)が、「Process1」、「process2」という工程IDになっていて、別に工程名テーブルがあるとしたら、検索SQL文実行時に取得してしまうのが一番簡単かと思います。

    例えば、工程名テーブルの名前が「kotei」、列名は「koteiID,koteiname」だとします。
    以前のサンプルでは「select id, process, workingTime, dateEnd, dateStart, isCompleted from task where projectLabel=’A01′ 」というSQLを実行していますが、
    これを
    「 select id, koteiname, workingTime・・・・from task inner join kotei on process=koteiID where projectLabel=’A01′;」
    といったSQL文にすることが考えられます。

    MySQLでは上記実行されましたが、データベースによって書式が違う可能性もあります。
    また、一旦工程名テーブルとtaskテーブルを別々にSQLで取得し、MZ内の処理で[テーブル]のデータを変更することも可能です。
    ご検討いただき、ご不明な点、ご要望等ございましたら、再度ご連絡いただければ幸いです。
    どうぞよろしくお願い申し上げます。

    #7220
    Matsuda
    一般参加者

    ありがとうございます.MZ内の処理で[テーブル]のデータを変更するよりも,教えていただいたようにSQL文実行時に日本語名を取得して置き換えるほうがシンプルでわかりやすいと感じます.

    立て続けの質問で恐縮ですが,当方のデータベースではサンプルのようなworkingTimeの列が無いため,dateEndとdateStartの値から計算したいと考えています.

    この場合もSQL文の実行時に計算するべきか,あるいは一旦テーブル格納変数にテーブルを設定した後でworkingTimeを計算したものをリスト格納変数に設定し,それをテーブル格納変数に列として追加するべきであるかで迷っています.
    SQL文の実行時にworkingTimeを計算した列を追加することは可能でしょうか.

    #7221
    MZPlatformユーザー会
    サイト管理者

    ご連絡ありがとうございます。
    DBテーブルに「workingTime」に当たる列を設けていないのであれば、検索SQLで設定する方が簡単かと存じます。

    例えばMySQLですと、
    「select timestampdiff(minute, dateStart, dateEnd) as 列の名前 from task」で稼働時間が取得できます。列の名前を付けるのは、設定しないと列名が長くなってしまうためで、必須ではありません。minuteの部分をhour, day等に変えることで、他の単位での差分も取得できます。

    MySQLServerの場合はDATEDIFF関数があり、「select datediff(minute, dateStart, dateEnd) as 列の名前 from task」となるかと存じます。手元で検証しておらず申し訳ありませんが、宜しければお試しください。

    なお、MZ内でも[カレンダー]コンポーネント等を使って、時間の差分計算が可能ですので、ご要望があればどうぞお知らせください。
    どうぞよろしくお願い申し上げます。

    #7274
    Matsuda
    一般参加者

    ありがとうございます.DATEDIFF関数を使うことにより,分の単位での時間の差分を整数値で取得することができました.

    次に,この数値を「時間:分」のような形式に変換したいと考えています.例えば差分が125(分)であれば,02:05のような形式でテーブルに表示させたいです.

    MySQLであればSEC_TO_TIME関数があり,秒をhh:mm:ss形式に変換できるようなのですが,SQL Serverの場合にはそれに該当する関数が見当たりません.
    SQL ServerのSQL文で変換することは可能でしょうか.あるいはMZプラットフォームのコンポーネントの機能で変換することは可能でしょうか.

    #7275
    MZPlatformユーザー会
    サイト管理者

    お問い合わせありがとうございます。

    恐らくSQLServerでSQL実行時にフォーマットを指定するよりも、MZ側で処理を設定した方が簡単かと存じますので、MZプラットフォーム上での処理をご紹介します。

    以下の2つの方法が考えられます。
    1)時間が23時間59分を超えない場合
    [カレンダー]を使用します。
    ➀[カレンダー]コンポーネントにメソッド「カレンダーを書式指定で設定(String、String)」で値を設定します。引数0には固定値で「m」を、引数1に「分数」を設定します。
    ➁メソッド「書式指定によるカレンダー文字列表現の取得(String)」で引数に「H:m」、「HH時間mm分」などの書式を設定します。
    ➂[テーブル]の文字列型列に、取得方法:メソッド処理結果で、➁で取得された文字列を設定します。
    または、[テーブル]の列型を日付型に設定後、[表示属性(日付)]>[表示形式]>[その他…]で表示パターンを上記「H:m」にすることも考えられます。この場合➁は不要で➀のすぐ後に[カレンダー]からDate値を取得しセルに設定します。

    [カレンダー]は1970年1月1日が基準となっており、0月0日などには設定できませんので、24時間以上の場合は目的とした表現が取得できません。

    2)24時間以上の場合
    割り算をします。
    ➀[除算(÷)]や[剰余(%)]コンポーネントに入れ、演算結果を取得します。
    また、整数のみ扱うことが確実なら[整数(BigInteger)格納変数]でも計算ができます。
    例えば30時間40分といった表現なら、変数に値を設定し、メソッド「divide(BigInteger)」、「mod(BigInteger)」(引数はそれぞれ「60」)を実行して、メソッド処理結果を取得します。
    ➁[文字列格納変数]に文字列を設定し、メソッド「指定した文字列と連結して置き換える(Stirng)」で順次文字列を繋げていくか、「指定文字列と一致する最初の文字列と置き換える(String,String)」で雛形文字列を置換えるなどで書式を整えます。

    以上ご検討いただき、ご不明な点等ございましたら、どうぞ再度ご連絡ください。
    よろしくお願い申し上げます。

10 件の投稿を閲覧中 - 1 ~ 10 件(全 13 件)
  • このトピックに返信するには、ログインしてください。