トップ > 日医標準レセプトソフト > 技術情報 > dbsインタフェース

dbsインタフェース

[(1) 概要] [(2) 説明] [(3) 注意点] [(4) 定義体について] [(5) 送受信する内容について] [備考]

(1) 概要

dbsインタフェースとは、電子カルテなどの外部アプリケーションから、MONTSUQI配下のデータベースをアクセスするためのインタフェースです。

(2) 説明

MONTSUQIは、MONTSUQI配下のデータベースを一括して管理することを前提として作られています。もし、MONTSUQI配下のデータベースを、外部アプリケーションから正当性を保って直接更新するためには、トランザクション管理・主従のミラーリング(同期取り)を外部アプリケーション自身が行う必要が出てきます。

MONTSUQI配下のデータベースは、「HAKAMA」と呼ばれるデータベースレイヤを経由してアクセスします。

HAKAMAを経由してデータベースにアクセスすることで、データベースアクセスの手順(API)を一本化・(PostgreSQLなどの)データベースアプリケーションの隠蔽・外部からのデータベースアクセスの抽象化を可能にします。

dbsインタフェースは、MONTSUQIのHAKAMA層を経由することで、外部アプリケーションがトランザクション管理・主従のミラーリングをMONTSUQIにまかせた上で、各テーブルを操作することが可能になります。

なお、dbsインタフェース(HAKAMA)経由でMONTSUQI配下のデータベースをアクセスするためには、後述する定義体を記述する必要があります。これにより、MONTSUQI配下にあるデータベースの全てのテーブル操作が可能になります。

ただし、dbsインタフェースは、単にDBアクセスを提供するための実装であり、テーブル間の整合正等のチェックはおこないません。

(3) 注意点

  • dbsインタフェースは、インタフェースのみの提供であり、MONTSUQI配下のデータベースに対し、何のチェックなしにアクセスすることが可能です。そのため、テーブルの内容をすべて削除するなど、どのような操作も行うことができますので、dbsインタフェースを使う際には注意してください。
  • データベースにアクセスするためには、MONTSUQI配下のアプリケーション(日医標準レセプトソフト)のチェック等が行われないため、MONTSUQI配下のアプリケーション(日医標準レセプトソフト)と同様に、データベースの仕様を理解し、更新の際に各外部アプリケーションによってチェックを行う必要があります。
  • MONTSUQI配下のアプリケーション(日医標準レセプトソフト)のデータベースの構造が変更された場合、テーブル変更によって外部アプリケーション側に影響がないか、その都度調査する必要があります。

(4) 定義体について

dbsインタフェース経由で、MONTSUQI配下のデータベースにアクセスするためには、MONTSUQI・HAKAMA側に定義体を記述する必要があります。ここでは、テーブルにアクセスするために必要な定義体の記述方法を記載します。

  1. /etc/jma-receipt/orcadbs.incの編集
  2. db定義体の作成
  3. dbd定義体の作成
  4. 定義体の反映
  5. dbsデーモンの起動

※なお、db定義体・dbd定義体の設定に関する詳細な説明については、ORCAサイトにある開発者情報のMONTSUQIについてのページに置いてある「MONTSUQI資料」を参照してください。

  1. /etc/jma-receipt/orcadbs.incの編集

    このファイルにdbd名を定義します。

    後述する「3.dbd定義体の作成」で記載してある「dbs.dbd」の場合は、下記のように記述します。

    dbs;
    
  2. db定義体の作成
    /usr/local/site-jma-receipt/record/以下にdbs経由でアクセスするdb定義体を作成します。ここでは例としてpatient.dbというファイルを記載します。(注意:patient.dbは例として記載しています。データベースのテーブルの作成等は、事前に行う必要があります。)
    patient  {
             ptno  char(10);
             name  varchar(40);
             sex   char(1);
    };
    
    primary {
            ptno;
    };
    
    path  ptno  {
          DBSELECT   {
            DECLARE  patient_ptno_csr  CURSOR FOR
            SELECT  *
                    WHERE
                         ptno = :ptno
            ;
          };
    };
    
  3. dbd定義体の作成
    /usr/local/site-jma-receipt/lddef/の以下にdbs.dbdというファイルを作成します。dbd定義体の中に先ほどのdb定義体をエントリします。以下にdbs.dbdのサンプルです。
    name dbs;
    arraysize   20;
    textsize   200;
    
    db   {
         patient; ←----「2.db定義体の作成」の定義体
     tbl_wksryact; ←--- 日医標準レセプトソフトのdb定義体(例はワーク診療行為)
              :
        (その他のdb定義など)
              :  
         doctor;
    };
    
    db   "shell" {
         shell;
    };
    
  4. 定義体の反映
    上記の定義体を、MONTSUQIが認識できるようにするため、下記のコマンドを実行してください。
    $ sudo /usr/lib/jma-receipt/scripts/allways/site-upgrade.sh
    
  5. dbsデーモンの起動
    外部アプリケーションが、dbsインタフェース経由でデータベースにアクセスできるようにするため、dbsデーモンを起動します。 下記のコマンドを実行してください。
    $ sudo -u orca /usr/lib/panda/sbin/dbs -dir /usr/lib/jma-receipt/lddef/directory dbs
    

(5) 送受信する内容について

dbsインタフェースと外部アプリケーションとは、TCPソケット通信で接続します。
接続するポートは、デフォルトで「8013」です。このポートは、dbsインタフェースの実行プログラム「dbs」のコマンド引数「-port」で変更することが可能です。 TCPソケット通信でのやりとりは、次の順番で行われます。
  1. 認証確認
  2. DBOPEN
  3. トランザクションスタート
  4. DB検索・更新・追加・削除
  5. トランザクションエンド
  6. DBCLOSE
※rubyの記述例を実行するためには、インタフェーススクリプト「dbslib.rb」が必要です。(取得方法は、備考を参照)
  1. 認証確認
  2. 外部アプリケーションがdbs経由でデータベースにアクセスするためには、まずソケット通信のための接続を行います(ポートは、デフォルトで「8013」です。

dbsのコマンド引数で「-port」の指定がある場合は、そちらのポートに接続します。プロトコルはTCP接続です)。
接続しましたら、認証確認のメッセージをdbsに送信します。
下記の内容をdbsに向けて送信してください。(改行は「¥n」と記述しています)
<バージョン番号> <ユーザID> <パスワード> <type>¥n
※各項目の間は半角空白で区切っています。 <バージョン番号>には、MONTSUQIのバージョン番号をセットします。 例えば、MONTSUQIのバージョンが1.2.1の場合は 1.2.1 とセットします。
<ユーザID>には、MONTSUQI側で gluseradd コマンドでセットしたユーザIDを指定します。(glclientの引数 -user で指定するユーザIDです)
<パスワード>は、上記<ユーザID>のパスワードを指定します。
<type>には、string stringe のいずれかを指定します。通常は stringe を指定します。
<type>の後には、改行をセットしてください。
・認証確認の送信例
MONTSUQIのバージョンが1.2.1、ユーザIDはormaster、パスワードはjmarcpt、typeはstringeの場合
1.2.1 ormaster jmarcpt stringe¥n
認証のメッセージを送信しますと、メッセージが返ってきます。

※Ver.4.8.0以降の注意点

Ver.4.8.0からは、通常のユーザーはアプリケーションによる認証に変わったため、新規インストールでは /etc/jma-receipt/passwdファイルが作成されません。dbsを使用するユーザーは以下の手順でパスワードを設定してください。
$ sudo touch /etc/jma-receipt/passwd
$ sudo chmod 600 /etc/jma-receipt/passwd
$ sudo chown orca:orca /etc/jma-receipt/passwd
$ sudo -u orca gluseradd  -file /etc/jma-receipt/passwd -p パスワード ユーザー名
接続する外部アプリケーションによっては tbl_sysuserに登録されている必要があります(グループ診療対応によりhospnumをtbl_sysuserから取得している場合)。外部アプリケーション側で指定するユーザ名に従ってください。


先頭に「Error:」とあった場合、認証に失敗しています。その後にエラーメッセージがセットされています。
成功しますと、「Connect: OK」といったメッセージがセットされます。(MONTSUQIのバージョンが1.2.1の場合)
・記述例[ruby]
接続先MONTSUQI/dbsマシンのアドレスが192.168.1.51、ポートはデフォルト(8013)、ユーザIDはormaster、パスワードはjmarcptの場合
server = DB_Server.new("192.168.1.51",0,"ormaster","jmarcpt");
※DB_Serverクラスのオブジェクトをserverという名前で生成します。
以降、serverオブジェクトのメソッドを使って、dbsとのやりとりを行います。

  • DBOPEN
  • 最初に、データベースを使えるようにするため、DBOPENを行います。
    dbsに向けて、下記の2行を送信してください。(改行は「¥n」と記述しています)
    Exec: DBOPEN¥n
    ¥n
    
    すると、dbsからメッセージが「Exec: *****」と戻ってきます。(「*****」にdbsからのコードが入ります)
    ※もしも、先頭に「Exec:」が付かない場合は、接続が失われているので、接続を終了する必要があります。これは、後述のトランザクションのスタート等でも同様です。
    dbsから「Exec: *****」のメッセージを受け取りましたら、dbsに向けて「¥n」を送信してください。
    ・記述例[ruby]
    rc = server.dbops("DBOPEN");
    
  • トランザクションスタート
  • トランザクションの開始であることをdbsに通知します。
    dbsに向けて、下記の2行を送信してください。
    Exec: DBSTART¥n
    ¥n
    
    すると、dbsからメッセージが「Exec: *****」と戻ってきます。
    その後「¥n」をdbsに向けて送信してください。
    これで、DBの検索・更新・追加・削除のトランザクションを指定を行うことができます。
    ・記述例[ruby]
    rc = server.dbops("DBSTART");
    

  • DB検索・更新・追加・削除
  • トランザクションを開始しましたら、FETCH文やSELECT文などのトランザクションの要求をdbsに送信することができます。
    ・記述例[ruby])
     
    rec = {}
    rec["tbl_wksryact.HOSPID"] = 'JPN0000000000001';
    rec["tbl_wksryact.PTID"] = '0000000170';
    rc = server.recordops("DBSELECT","tbl_wksryact","dbs",rec);
    server.recordops("DBFETCH","tbl_wksryact","dbs",rec);
    rec["tbl_wksryact.SRYKA"] = '10';
    server.recordops("DBUPDATE","tbl_wksryact","dbs",rec);
    
    ※recordopsメソッドの引数は、下記のように指定します。
    recordops(func, rname, pname, rec)
      func  - db定義体に記述してあるファンクション名
              (A { 〜SQL文〜 } のAの部分を記述します)
      rname - db定義体に記述してあるテーブル定義名
              (tbl_*** { char(99) ...}のtbl_***の部分を記述します)
      pname - db定義体に記述してあるパス名
              (path pname {〜}のpnameの部分を記述します)
      rec   - SQLにセットする内容のハッシュ形式配列
              例えば、db定義体名が「tbl_wksryact」で、db定義体に「HOSPID = :HOSPID」とあったとします。
              右辺の「:HOSPID」に「JPN000000000001」をセットして
              SQLを実行したい場合は、rubyスクリプトの中で、
              「rec["tbl_wksryact.HOSPID"] = 'JPN000000000001';」と記述します。
              そして、recordopsの4番目の引数に「rec」を指定すれば、
              :HOSPIDの部分が展開され、「HOSPID = JPN000000000001」という
              検索条件を含んだSQLが実行されます。
    

  • トランザクションエンド
  • DBに対するトランザクションの指定が終了しましたら、dbsに対して、実際のDB領域に対してSQLを実行(COMMIT)します。
    dbsに向けて、下記の2行を送信してください。
    Exec: DBCOMMIT¥n
    ¥n
    
    すると、dbsからメッセージが「Exec: *****」と戻ってきます。
    その後「¥n」をdbsに向けて送信してください。
    これで、実際のDBに対して更新処理が行われます。
    ・記述例[ruby])
    rc = server.dbops("DBCOMMIT");
    

  • DBCLOSE
  • 最後にデータベースのCLOSEを行います。
    dbsに向けて、下記の2行を送信してください。
    Exec: DBDISCONECT¥n
    ¥n
    
    すると、dbsからメッセージが「Exec: *****」と戻ってきます。
    その後「¥n」をdbsに向けて送信してください。
    次に、dbsとの接続を終了します。
    dbsに向けて、下記の1行を送信してください。
    End¥n
    
    送信しましたら、接続を終了して(ソケットを閉じて)ください。
    ・記述例[ruby]
    rc = server.dbops("DBDISCONNECT");
    server.close;
    

    備考

    A-1. dbsへアクセスするためのインタフェースについて

    dbsへアクセスするためのクライアント側(電子カルテなどの外部アプリケーション)のインタフェースとして、rubyとjavaが提供されています。
    MONTSUQIのバージョンが1.2.1以前の場合、これらのdbsへアクセスするためのインタフェースは、apt-getコマンドで取得する必要があります。
    まず、下記のコマンドを実行してください。(apt-lineにorcaサイトの記述が必要です)
    $ apt-get source panda-server
    
    すると、現在のディレクトリ配下に、MONTSUQIのソースが展開されます。
    この中に、インタフェースプログラムがあります。
    rubyのインタフェース
    panda-*/dbstuff/dbslib.rb
    
    javaのインタフェース
    panda-*/java/*
    

    B-1. rubyの記述例で記述した「rc」の値について

    『(5) 送受信する内容について』の「記述例[ruby])」に記述した「rc」には、dbopsメソッドを実行後にエラーコードがセットされます。
    エラーコードの意味は、下記のとおりです。
     0 = MCP_OK
     1 = MCP_EOF
     2 = MCP_NONFATAL
    -1 = MCP_BAD_ARG
    -2 = MCP_BAD_FUNC
    -3 = MCP_BAD_SQL
    -4 = MCP_BAD_OTHER
    
    ただし、複数のエラーが発生した場合、これらの値を単純加算しているので、最終的には、意味をなさない値となることがあります。

    グループ診療対応

    グループ診療対応により全てのテーブルのkeyがhospidからhospnumに変更となっています。
    グループ診療対応(dbsインタフェースによるアクセス) [PDF]

    トップ > 日医標準レセプトソフト > 技術情報 > dbsインタフェース

    このページのトップへ