カスタムメニューの1操作から全自動で帳票内のアクションを実行させ、帳票起票してみた
目次
はじめまして。
i-Reporterの導入支援などシステム開発を行っている、株式会社ネクストビジョンの加藤です。
いつもお世話になっております。
私も以前別の投稿をしたネクストビジョン友木と同様に、ネクストビジョンのi-Reporterチームの一員としてi-Reporterの機能に魅了されているひとりです。
突然ですが、i-Reporterの帳票入力はできるだけ操作数を減らして簡易に実行したいですよね。
今回は、そんな操作簡易化の一例として、『QRコードを読み込むだけで必要なデータを全て入力済みの帳票を起票させたい』というお客様のご要望にお応えした際の設定方法や手順をご紹介します。
i-Reporterの単一機能で全てを実現することは難しいですが、機能の組み合わせとアイディアで上記のご要望が実現可能になります。
今回のテーマを通して、i-Reporterの機能の組み合わせで広がる操作簡易化の方法と可能性をお伝えできればと思います。
概要
帳票入力操作簡易化の一例として、『1つの操作をトリガーに3つのアクションを全自動で実行する仕組みをi-Reporterの4つの機能を組み合わせて実現する方法』をご紹介いたします。
実行する1つの操作
カスタムメニューの画面からQRコードやバーコードのデータを読む
全自動で実行する3つのアクション
1. 帳票を起票する
2. 読み込んだデータを利用したConMas Gatewayスクリプトを実行する
3. マスター選択し、クラスターへ入力を行う。
利用する4つのi-Reporter機能
1. カスタムメニュー
2. デバイスコード分解
3. クラスターフォーカス
そして以下の仕様を利用していきます。
※1:フォーカスされたアクションクラスターは操作なしで実行することが出来る。
※2:ConMas GatewayのPythonスクリプトでもクラスターフォーカスをすることが可能。
事前準備
1. カスタムメニュー:今回はQRコードをカスタムメニューに表示してQRコードを利用します。

2. 帳票:今回は画像のようなSample帳票で説明します。

操作とアクションの流れ
一連の流れは以下のようになっています。
1. カスタムメニューでQRコードを読み込んで起票する。
2. デバイスコード分解でQRコードのデータが帳票のクラスターに設定される。
3. 予め入力待ち状態の設定をしておいたアクションクラスターから、最終的に実行したいGateway連携クラスターにフォーカスするPythonスクリプトを実行する。
4. QRコードのデータを利用したアクションが実行できる。(本例では別のPythonスクリプトを実行してDBから帳票定義名を取得してみます)
設定の手順
1. カスタムメニューの帳票起票設定
2. デバイスコード分解の設定
3. クラスターフォーカスの設定
4. QRコードのデータを利用してPythonスクリプトを実行
応用:QRコードのデータを利用してマスター選択クラスターを自動選択することも可能
クラスターフォーカスをする別のPythonスクリプトを間に挟んでいる理由
1.カスタムメニューの帳票起票設定
1. ConMas Managerにてカスタムメニューの設定を行います。
2. カスタムメニューから帳票を起票する為の動作設定を行います。
今回は帳票定義を開く設定で、iPad内蔵のカメラからQRコードを読み込んで起票します。

2.デバイスコード分解の設定
1. 帳票定義に対してデバイスコード分解の設定を行います。
今回は2つのキーボードクラスターにそれぞれ設定します。

3.クラスターフォーカスの設定
1. 予め帳票定義のクラスターにConMas Designerから「このクラスターにフォーカスして”入力待ちの状態で起動する。”」設定をしておきます。
注意点として、こちらの設定は1シート辺り1クラスターのみ設定できます。

2. アクションクラスターのGateway連携より、別のクラスターにフォーカスする以下のPythonスクリプトを実行します。(1シートのクラスターindex3)
import json
# フォーカスしたいクラスターを指定
mappings = {"error": "", "mappings": [
{ "sheet": 1,"cluster": 3,"type": "SetFocus"}
]}
print(json.dumps(mappings))4.QRコードのデータを利用してPythonスクリプトを実行
最後は実際にQRコードのデータを利用してDBから帳票定義名を取得してみます。
クラスターフォーカスによって以下のアクションクラスターが自動で実行され、下のPythonスクリプトが実行されます。

import os
import sys
import json
import psycopg2
import psycopg2.sql as sql
from psycopg2.extras import DictCursor
import traceback
# DB接続文字列
DB_CONNECTION_STRING = "host= port= dbname= user= password="
class MyException(Exception):
    """
    エラー終了する際の自作例外
    """
    pass
class PostgreSQL:
    """
    i-ReporterDBの操作クラス
    """
    connection = None
    cursor = None
    @classmethod
    def open(cls) -> None:
        """
        DBオープン
        """
        cls.connection = psycopg2.connect(DB_CONNECTION_STRING)
        cls.cursor = cls.connection.cursor(cursor_factory=DictCursor)
    @classmethod
    def get_def_top(cls,def_top_name:str,def_top_org:str) -> list:
        """
        帳票定義名取得
        """
        query = sql.SQL("""
            SELECT
                def_top.def_top_name 
            FROM
                view_def_top def_top 
                INNER JOIN view_def_current def_current 
                    ON def_top.def_top_id = def_current.def_top_id 
                    AND def_top_name LIKE {def_top_name} 
                    AND def_top.def_top_org = {def_top_org}
        """).format(
            def_top_name = sql.Literal(f"%{def_top_name}%")
            , def_top_org = sql.Literal(f"{def_top_org}")
        )
        cls.cursor.execute(query)
        results = cls.cursor.fetchall()
        return results
    
    @classmethod
    def close(cls) -> None:
        cls.cursor.close()
        cls.connection.close()
def main() -> None:
    """
    メイン処理
    """
    # POSTパラメータの読み込み
    jsonData = json.loads(sys.stdin.readline())
    post = jsonData['post']
    try:
        # POSTパラメータから取得した帳票定義名称
        def_top_name = post["clusters"][0]["value"]
        # POSTパラメータから取得した元定義ID
        def_top_org = post["clusters"][1]["value"]
        # DB接続
        PostgreSQL.open()
        # 帳票定義名の検索
        def_top = PostgreSQL.get_def_top(def_top_name,def_top_org)
        if 0 == len(def_top):
            raise MyException("帳票定義名が見つかりません。")
        # DB切断
        PostgreSQL.close()
        # JSON で返す
        mappings = {"error": "", "mappings": [
            { "item": "chart1" ,"sheet": 1,"cluster": 0,"type": "string","value": str(def_top[0][0])}
        ]}
        print(json.dumps(mappings))
    except MyException as e:
        print(str(e))
    
    except Exception as e:
        print(str(e))
        print(traceback.format_exc())
    finally:
        PostgreSQL.close()
# メイン処理
main()応用:QRコードのデータを利用してマスター選択クラスターを自動選択することも可能
今回は以下のカスタムマスターを用意しました。

デバイスコード分解先のクラスターとマスター選択クラスターをネットワークで繋いでおき、マスター検索デフォルト検索値設定も併せて行います。

今回はQRコードのデータで一意にレコードが特定できるとして、「マスター画面の表示”データが1件に絞られた場合は表示しない”」を有効に

後は先ほどと同じようにカスタムメニューからQRコードを読み込んで起票する際に、マスター選択クラスターにフォーカスする以下のPythonスクリプトを実行するように設定するとカスタムマスターの値が自動で親子設定をしているクラスターに入力されます。
import json
# フォーカスしたいクラスターを指定
mappings = {"error": "", "mappings": [
{ "sheet": 1,"cluster": 4,"type": "SetFocus"}
]}
print(json.dumps(mappings))
クラスターフォーカスをする別のPythonスクリプトを間に挟んでいる理由
ここまで本記事を読まれた方で「わざわざクラスターフォーカスをPythonスクリプトで行わなくても、元々QRコードのデータを利用したいGateway連携のクラスターに対して”入力待ちの状態で起動する。”設定をすれば良いのではないか?」と思われる方がいらっしゃるかもしれません。
それにつきましてはおっしゃる通りなのですが、残念ながらカスタムメニュー起票そのままでは実行順の影響でQRコードのデータを起票タイミングでは利用できなくなっています。
その為、今回のようにクラスターフォーカスをする別のPythonスクリプトを間に挟んでいるのです。
最後に
いかがだったでしょうか。 今回はスマートデバイスなどを使わず、i-Reporter機能の組み合わせでお客様のご要望である『QRコードを読み込むだけで必要なデータを全て入力済みの帳票を起票させたい』を実現してみました。
是⾮「この1操作を無くしたい!」という場合の参考にしていただけますと幸いです。
ネクストビジョンでは、このようなi-Reporterの機能を組み合わせた業務改善の提案やシステムの開発を⾏っています。
「i-Reporterだったら実現できそう!」「もう少しでやりたいことが出来るのにあと⼀歩⾜りない…」というようなお困りごとがございましたら、是⾮ネクストビジョンにご相談ください。 全⼒でサポートいたします︕
この記事をもとに作られた仕組みで不利益を被っても一切責任は持てません。
株式会社ネクストビジョン i-Reporterチーム

i-Reporterの導入支援を行うシステム開発会社 株式会社ネクストビジョンのi-Reporterチームです。
当チームには2013年からお取引させていただいて以降、i-Reporterの機能に魅了され、探求し続ける技術者が多数在籍しております。
本記事を通じてi-Reporterの機能と外部システム連携のアイデアや具体的実行方法など共有させていただけますと幸いです。
導入支援も行っておりますのでお気軽にご相談くださいませ。
【ネクストビジョンの導入支援】はこちらからアクセスいただけます。


現場帳票研究所の編集部です!
 当ブログは現場帳票電子化ソリューション「i-Reporter」の開発・販売を行う株式会社シムトップスが運営しております。
 現場DXの推進に奮闘する皆様のお役に立てるよう、業界情報を定期的に配信致しますので、ぜひ御覧ください!
 
