使い方2(送信)

JSONデータの扱いに慣れましょう! JSONはXMLとも親和性は高く近年最も多く使われるようになったフォーマットです。

送受信の流れ

カスタムAppにORCA連携の為の機能を組み込む作業では、図のように作成したリクエストJSON電文が結果JSONにダイレクトに影響します。 つまり正しい電文を作成してAD_ORCAに引き継がないと誤った結果を受け取る事になります。 言い換えれば、送信電文さえきちんと処理できればあとはAD_ORCAを介してORCA_APIから正しい情報を受け取る事ができるようになります。
[重要]AD_ORCAにリクエストを送信する際はリクエスト元を識別するコードUUIDと一緒に送信してください。

JSONの構造とXML

JSONはXMLに代わる言語として多く使われてきていますが、XMLとの構造的な親和性も高いです。 AD_ORCAを使いこなすにはFileMakerアプリ内で作成したリクエストデータがどの様なXMLとなるのか理解しておく必要があります。
JSONはXMLと親和性が非常に高いので、慣れるとすぐに解釈できるようになります。
中でも重要解釈のポイントは「オブジェクト(object)」「配列(array)」です。
  • オブジェクト(object)
    • 波括弧「{ , }」で囲まれます。
    • { key : value }のようにします。
    • 例えば{ "name" : "エニーズ" }というオブジェクトがあれば、keyは"name"、valueは"エニーズ"です。
    • valueには同じようなオブジェクトや配列を登録する事もできます。
    • valueはkeyによって検索されるので、順番は気にしません。
  • 配列(array)
    • 角括弧「[ , ]」で囲まれます。
    • 配列は連続した値をカンマ「,」で区切ったものになります。
    • 配列は何もしなくても順番があります。
    • 配列(array)の場合、0,1,2...とインデックス番号で呼出しできます、この番号はJSONの中に記録されません。 先頭から数えた位置という解釈になります。 0,1,2という"key"を使う場合とは違いますのでご注意ください。
どんなに巨大なJSONデータもこの原則から外れません。
これらの事を鑑みて 「日医標準レセプトソフト API」 の内容を参考にすると正しいJSON電文を作成する方法が見えてきます。それはXMLも同じようなオブジェクト(要素)と配列(繰り返し)で構成されているからです。

リクエストJSONの作成

患者病名情報の扱い方を参考にリクエストJSONを作成する方法をみてみます。
オブジェクト{}だけのリクエスト
ORCA_APIでの多くのリクエストがオブジェクトだけのリクエストになります。 電文内容は比較的短くて作るのも簡単です。
  1. 例として 「/api01rv2/diseasegetv2(患者病名情報の返却)」を開きリクエスト(POSTリクエスト)サンプルリクエスト一覧を確認します。
    • リクエスト(POSTリクエスト)サンプル(XMLの部分に注目)
    • リクエスト一覧(こちらは表形式で必須項目や記述内容が確認できます。)
  2. これらの情報を元にJSONデータを構築すると以下のようになります。
      {
        "data":{
          "disease_inforeq":{
            "Patient_ID":"1",
            "Base_Date":"2023-03",
            "Select_Mode":"All"
          }
        }
      }
      
    
  3. [補足]"Select_Mode":"All"は「全て」のデータを必要とする内容ですが必須ではないので省いても問題ありません。
    つまり多くのリクエストがこのように欲しいデータのキーとなる情報を含んだものになります。
  4. これをFileMakerのカスタムAPP内スクリプトで構築すると以下のようになります。
  5.   JSONSetElement ( "" ; 
      [ "Patient_ID" ; $ptid ; JSONString ];
      [ "Base_Date" ; $Base_Date ; JSONString ];
      [ "Select_Mode" ; "All" ; JSONString ]
      )
      ※Patient_IDとBase_Dateは変数で処理しています。
    
    「ORCA連携サンプル」 にあるスクリプト「diseasegetv2」を参照して実際の中身やデバックで動作を確認できます。
配列も含んだ{[,,]}リクエスト
配列も含んだリクエストは病名情報や会計情報など多くの情報をORCAに通知する場合に必要になります。 電文は比較的長くなりがちですが、きちんとロジックを理解すれば問題はありません。
  • 例として 「/orca22/diseasev2(患者病名登録)」を開きリクエスト(POSTリクエスト)サンプルリクエスト一覧を確認します。
    • リクエスト(POSTリクエスト)サンプル(type="array"以下の内容に注目)
    • type="array"は入れ子(ネスト)されている事もあります。このあたりも注意深く確認しましょう。
    • リクエスト一覧(こちらは表形式で必須項目や記述内容が確認できます。)
      • 5番目までは通常のオブジェクトですが、6番目からは「繰り返し50」となっています。つまり6の項番は50回までの配列(array)扱いになります。必須項目です。
      • 繰り返し50は送信できる病名数の上限でもあります。これ以上は一度に送信できません。
      • また、6-4ではさらに「繰り返し6」となっています。つまりここでも6回の繰り返しが発生します。必須とありますが「※1」がありますのでこれも確認します。
      •   ※1:単独病名か一連病名のいずれかの設定が必要。両方に設定がある場合は単独病名を優先する。
             病名コード、病名の両方に設定がある場合は病名コードを優先する。
          解釈:必須とありますが「単独病名(6-4-2)」設定がある場合は、「一連病名(6-3)」は無視されるようです。
        
        ANNYYSでは病名コードでの登録は多くの人にとって直感的では無かった為、入力時は病名のみでコードまでの登録はしていません。つまりコードが無いので「単独病名(6-4-2)」を使わない事にします
  • まず、送信テストをする為に病名を登録します。
  • 「ORCA連携サンプル」 のID:4青森ジロウさんに2つの病名を登録して[患者病名登録]を押します。
  • これらの病名を元にJSONデータを構築すると以下のようになります。"Disease_Information"内が配列になっています。
      {
        "data" : 
        {
          "diseasereq" : 
          {
            "Disease_Information" : 
            [ (←ここから配列)
              {
                "Disease_Category" : "",
                "Disease_EndDate" : "",
                "Disease_Name" : "高血圧症",
                "Disease_OutCome" : "F",
                "Disease_StartDate" : "2023-04-12",
                "Disease_SuspectedFlag" : ""
              },(←配列内区切り)
              {
                "Disease_Category" : "",
                "Disease_EndDate" : "",
                "Disease_Name" : "肝機能障害",
                "Disease_OutCome" : "F",
                "Disease_StartDate" : "2023-04-12",
                "Disease_SuspectedFlag" : ""
              }
            ],(←ここまで)
            "Patient_ID" : "4",
            "Perform_Date" : "2023-04-12",
            "Perform_Time" : "17:38:32"
          }
        }
      }
    
  • FileMakerのカスタムAPP内スクリプトで配列を構築する場合は以下のようにします。
  • ※配列は必ず0からはじまります。
    1. 検索レコードを上から順番に処理しそれぞれ"$Disease_Information"に埋め込む1つのJSONオブジェクト"$tgtobj"を作成する。
    2. #1:
      $tgtobjの内容
      {
        "Disease_Category" : "",
        "Disease_EndDate" : "",
        "Disease_Name" : "高血圧症",
        "Disease_OutCome" : "F",
        "Disease_StartDate" : "2023-04-12",
        "Disease_SuspectedFlag" : ""
      }
      
    3. 現在の$Disease_Information内に何個の配列があるか確認する。
    4. 変数を設定 [ $index; 値:ValueCount ( JSONException ( JSONListKeys ( $Disease_Information ; "." ) ) ) ]
    5. $indexのカウント数=配列の設定位置になるので
    6. 変数を設定 [ $Disease_Information; 値:JSONException ( JSONSetElement ( $Disease_Information ; "[" & $index & "]" ; $tgtobj ; JSONObject ) ) ]
    ORCA連携サンプルにあるスクリプト「diseasev3」を参照して実際の中身を確認しデバックモードで動作や変数の値を確認してください。

    リクエストJSONの送信

    [重要]AD_ORCAでは必ずuuidと一緒にpostdataを送信してください。必要に応じてclass要素も必要な場合があります。
    以下のようなuid等を含んだJSONデータの引数を作成しAD_ORCAの対象スクリプトの引数に指定した上でリクエストを実行してください。
      {
        "uid" :  < Get ( 持続 ID ) > , →FileMakerクライアント識別子を必ず登録します。
        "postdata": < リクエストデータ  > , →リクエストに使うjsonデータです。。
        "class" : < < classNO > →ORCA_APIの種類によってclassが必要な場合があります。。
      }
    
    スクリプト定義では以下の様な方法で作成します。()
    ※「RCA連携サンプル」diseasegetv2スクリプトの14行目:変数を設定[$param]
    JSONSetElement ("" ; 
    [ "class" ; "01" ; JSONString ];
    [ "postjson" ; JSONSetElement ( "" ; "data.disease_inforeq" ; $postdata ; JSONObject ); JSONObject ];
    [ "uid" ; Get ( 持続 ID ) ; JSONString ]
    )
    
    これをAD_ORCA$diseasegetv2に送信します。
    ホストコンピュータからデータベースファイルにアクセスしている状態であればサーバー上でスクリプトを実行します。 
    ※「RCA連携サンプル」diseasegetv2スクリプトの16-21行目
    If [ Get ( ファイル共有状態 )=2 ]
    サーバー上のスクリプト実行 [ 「diseasegetv2」 , ファイル: 「AD_ORCA」; 引数: $param ] [ 終了するまで待つ:オン ]
    Else
      スクリプト実行 [ 「diseasegetv2」 , ファイル: 「AD_ORCA」; 引数: $param ]
    End If
    変数を設定 [ $result; 値:Get ( スクリプトの結果 ) ]
    
    戻り値が必要なので「サーバー上のスクリプト実行」では[ 終了するまで待つ:オン ]にします。
    変数[ $result ]に結果データがセットされるので、あとはこの内容を展開しアプリ内で処理します。
    使い方3(受信)で以後の処理方法を確認できます。