使い方3(受信)

AD_ORCAを使ってORCAと自由に対話できるカスタムAppを作り上げましょう! 「受信」したデータはカスタムApp内で自由自在!

送受信の流れ

受信したJSONデータはカスタムApp内で自由自在に展開できます。

受信データの形式

前項の リクエストJSONの作成では、 「オブジェクト{}だけのリクエスト」と「配列も含んだ{[,,]}リクエスト」を解説しましたが、ここでも同じ事が言えます。 傾向として、
  • 「オブジェクト{}だけのリクエスト」では 配列も含んだ{[,,]}結果」
  • 「配列も含んだ{[,,]}リクエスト」では「オブジェクト{}だけの結果」
の様な事が良く発生します。

JSON関数

受け取ったJSONはClaris FileMakerProに標準で実装されている「JSON関数」を使って適宜処理を行います。
標準関数(Claris FileMaker Pro標準)
JSONDeleteElement オブジェクト名、配列索引、またはパスで指定された JSON データ要素を削除します。
JSONFormatElements JSON データ内の要素を読みやすい形に書式設定します。
JSONGetElement JSON データで、オブジェクト名、配列索引、またはパスで指定された要素のクエリーを実行します。
JSONGetElementType オブジェクト名、配列索引、またはパスで指定された要素の JSON データタイプを検証して返します。
JSONListKeys オブジェクト名、配列索引、またはパスで指定された要素に対する JSON データ内のオブジェクト名 (キー) または配列索引の一覧を表示します。
JSONListValues オブジェクト名、配列索引、またはパスで指定された要素に対する JSON データ内の値の一覧を表示します。
JSONSetElement オブジェクト名、配列索引、またはパスで指定された JSON データ内の要素を追加または変更します。
また「ORCA連携サンプル」 には、 「JSONException」、「JSONExists」 の2種のカスタム関数があります。詳細はご術しますが、これらはスクリプト内でエラーを判定する為に使っており、ANNYYSシリーズでも利用しています。 Clarisのヘルプページには「JSON データのエラー処理」 方法についての記載もありますが、ANNYYSではコードを簡素化する目的がありこれらカスタム関数を使いエラー判定しています。
例えば、受け取った配列の件数を知りたい場合
$listLeys = JSONException( JSONListKeys ( $Disease_Information ; "." ))
とすれば戻り値は「""」となり,直後の1行で全てのエラーに対して判定可能にするためです。
if[ ValueCount($listLeys) ]
...(成功時処理)
カスタム関数(「ORCA連携サンプル」に内臓)
JSONException
JSON形式を取得の際「?」が付きエラーが返される場合「""」を返却
※ANNYYSシリーズでは頻繁に利用しています。
JSONExists
正式なJSON形式の場合は「1」そうでない場合は「0」を返却
その他のカスタム関数
DateFormater:日付フォーマット用関数("YYYYMMDD" < "20221231")
TimeFormater:時刻フォーマット用関数("HHMMDD" < "121260")
TimeStampFormater:上記2つの組合せ

受信データの処理

ここでも「日医標準レセプトソフト API」 の内容を参考にすると正しいJSON電文の構造が確認し、受信したJSONデータを分解してFileMakerカスタムApp内で適宜処理を行います。 ここでも前項の リクエストJSONの作成と同じように 「ORCA連携サンプル」 の病名処理を例に解説します。
  1. 仕様確認
    例として 「/api01rv2/diseasegetv2(患者病名情報の返却)」を開き レスポンスサンプルレスポンス一覧を確認します。
    • レスポンスサンプル(type="array"以下の内容に注目)
    • 受信したデータはここでは配列で複数の病名が返却されている事が確認できます。
    • レスポンス一覧(こちらは表形式で必須項目や記述内容が確認できます。)
      • 9番目以後には病名が最大で200個まで受信できるようになっているのがわかります。
      • それ以外にも氏名やカナ、生年月日なども電文に含まれているのが確認できます。これらは適宜利用できそうです。
  2. 受信データ確認
    実際に受け取ったJSON電文を確認してみましょう。 「ORCA連携サンプル」 の病名処理(diseasegetv2)を例に解説します。
    結果の部分に受信した内容が表示されます。スクリプト「」内ではこの値を使ってレコードに情報を登録しています。
    「ORCA連携サンプル」 の病名処理(diseasegetv2)スクリプトの内容と以下説明文を照らし合わせながら理解を勧めてください。
  3. 内部処理解説
    [diseasegetv2]スクリプトステップは大きく分けて4つの内部処理が組まれています。
    1. JSONリクエストデータの作成と送信
    2. 受信したJSONデータの確認と再構築([$byomeiObj]を作成)
      • [ヒント]戻値には送信時にセットしたuidも一緒に戻ります。これを突合すればリクエストに対応した結果である事が判定できます。
      • 既存にある病名とは「病名と開始日」の組合せで比較します。このセクションでは戻り値の配列[$Disease_Information]を「病名と開始日」をキーとしたJSONオブジェクトに作り変えています。
    3. 既存データと病名データ[$byomeiObj]の比較:存在する場合は更新
      • 病名テーブルへ移行し対象患者の病名レコードを検索します。対象がなkれば4へ進みます。
      • レコード内容から「病名と開始日」キーを作成し[$byomeiObj]から対象レコードを探します。
      • #96:If [ Length ( JSONGetElement ( $byomeiObj ; $checkkey ) ) ]
      • レコードの値(転帰、転帰日など)取得した内容に上書きして置き換えます。
      • [$byomeiObj]から該当キーのエレメントを削除します。
      • #128:変数を設定 [ $byomeiObj; 値:JSONException ( JSONDeleteElement ( $byomeiObj ; $checkkey ) ) ]
    4. 残りの病名データ($byomeiObj)を追加登録
      • [$byomeiObj]がこのっている場合、これらは既存レコードに無かったデータなので全て追加します。
    あとは任意で最終結果の処理を行い一連のメソッドは完了します。
    送信結果JSON
      {
        "class" : "01",
        "disease_infores" : 
        {
          "Api_Result" : "00",
          "Api_Result_Message" : "処理終了",
          "BirthDate" : "2017-12-26",
          "Disease_Information" : 
          [
            {
              "Department_Code" : "01",
              "Disease_Name" : "高血圧症",
              "Disease_Single" : 
              [
                {
                  "Disease_Single_Code" : "8833421",
                  "Disease_Single_Name" : "高血圧症"
                }
              ],
              "Disease_StartDate" : "2023-04-12"
            },
            {
              "Department_Code" : "01",
              "Disease_Name" : "肝機能障害",
              "Disease_Single" : 
              [
                {
                  "Disease_Single_Code" : "5738002",
                  "Disease_Single_Name" : "肝機能障害"
                }
              ],
              "Disease_StartDate" : "2023-04-12"
            }
          ],
          "Information_Date" : "2023-04-13",
          "Information_Overflow" : "False",
          "Information_Time" : "11:44:58",
          "Patient_ID" : "00000004",
          "Reskey" : "Medical Info",
          "Sex" : "1",
          "WholeName" : "青森 ジロウ",
          "WholeName_inKana" : "アオモリ ジロウ"
        },
        "postjson" : 
        {
          "data" : 
          {
            "disease_inforeq" : 
            {
              "Base_Date" : "2023-04",
              "Patient_ID" : "4",
              "Select_Mode" : "All"
            }
          }
        },
        "uid" : "78F75FD2D2D073A4371148E169BD1E1B"
      }