2023/12/18

つないでみよう:#7)お天気アイコンの表示

Web 系アプリ開発のど素人が、チャレンジする WebAPI 連携日記の第 7 回です。

気象庁の天気予報取得シリーズの最終回です。前回まででお天気アイコンの準備ができたので、いよいよ天気マークを表示します。完成すると、次のように天気予報が表示できます。


天気コードの取得

第 4 回 で気象庁の Web サイトから天気予報取得のサンプルコードを紹介しました。ただ、シンプルなコードにするため、天気の名称だけを取得していました。まずは、天気コードを取得するように修正します。

修正する個所は次の通りです。修正箇所のみを抽出して赤字で表示します。

Sub Initialize
            ・・・
   Dim vCD As Variant
            ・・・
   '大阪の天気予報を取得
   sAreaCD = "270000"
   Call xGetForecast(sAreaCD, vCD, vWeather)
End Sub

Function xGetForecast(ByVal vsAreaCD As String, rvCD As Variant, rvWeather As Variant)
            ・・・
   '明後日までの天気予報
   Set je3 = jnav.GetFirstElement()
   Call xGetForecast_3Days(je3, rvCD, rvWeather)
End Function

"weatherCodes" というオブジェクト内に天気コードがありますので、それを取得して新設した変数にセットします。

Function xGetForecast_3Days(vje3Days As NotesJSONElement, rvCD As Variant, rvWeather As Variant)
            ・・・
      If jeTmp.Type = Jsonelem_type_array Then
         '配列だが1つしか要素がない
         Set jaTmp = jeTmp.Value
         Set jeTmp = jaTmp.GetFirstElement()
         Set jobjTmp = jeTmp.Value

         '天気 CD
         Set jeTmp = jobjTmp.GetElementByName("weatherCodes")
         rvCD = xGetArray_String(jeTmp)


         '天気
         Set jeTmp = jobjTmp.GetElementByName("weathers")
         rvWeather = xGetArray_String(jeTmp)
      End If
   End If
End Function


天気予報の表示

続いて天気予報を表示する機能をエージェントに追加します。

まず、表示する関数は次の通りです。新規文書を作成し、天気コードと天気名称をセットして、文書を表示するだけのシンプルなプログラムです。

Function xShowForecast_3Dyas(vvCD As Variant, vvWeather As Variant)
   Dim ndb As NotesDatabase
   Dim nd As NotesDocument
   Dim nuiw As New NotesUIWorkspace
   Dim i As Integer

   Set ndb = xns.CurrentDatabase
   Set nd = ndb.CreateDocument()

   nd.Form = "fForecast"
   For i = 0 To UBound(vvCD)
      Call nd.ReplaceItemValue("Days3_WeatherCode_" & CStr(i+1), vvCD(i))
      Call nd.ReplaceItemValue("Days3_WeatherText_" & CStr(i+1), vvWeather(i))
   Next

   Call nd.ComputeWithForm(False, False)
   Call nuiw.EditDocument(False, nd)
End Function

天気コードは Days3_WeatherCode_n 、天気の名称は  Days3_WeatherText_n フィールドにセットします。n = 1 が今日、n = 2 が明日、n = 3 が明後日となります。


関数ができたらメインルーチンから関数をコールします。これでエージェントは完成です。

Sub Initialize
            ・・・
   '大阪の天気予報を取得
   sAreaCD = "270000"
   Call xGetForecast(sAreaCD, vCD, vWeather)

   '天気予報を表示
   Call xShowForecast_3Dyas(vCD, vWeather)
End Sub


フォームの作成

続いて、天気予報を表示するフォームを作成します。3列の表を作成し、上記エージェントで作成されるフィールドを各列に配置し、3日分の天気を表示します。値はエージェントでセットするので作成時の計算結果で、式には "" をセットします。

エージェントでセットしていない Days3_WeatherIcon_n がイメージリソース名を保持するフィールドです。計算結果フィールドとして作成し、以下の式をセットします。この式は自身のフィールド名を利用して記述しているので n = 1 ~ 3 のすべてのフィールドで同じ式となります。

xFld := "Days3_WeatherCode_" + @RightBack(@ThisName; "_");
xWCD := @GetField(xFld);
xSVG := @DbLookup("":""; "":""; "vWeather"; xWCD; "WeatherFileName");
@If(@IsError(xSVG);
   "";
   @Left(xSVG; ".") + ".png"
)

イメージリソースのファイル名は、@DbLookup を使用して、天気コードマスタから取得しています。今回は、昼用のアイコンだけを対象としています。


最後に天気アイコンの表示です。表の背景を@式で設定する機能を利用して作成しました。表の内側にカスケードの表を作成し幅や高さを設定し、罫線を 0 にします。

イメージのソースを計算結果に設定し、式にリソース名が入っているフィールド Days3_WeatherIcon_1 を記述します。この設定はフィールド内ではないので、列ごとにそれぞれのフィールド名をしています。


以上で完成です。エージェントを実行すると、その時点の天気を Web API から取得して、フォームに表示します。これを応用すればノーツのポータル画面にも天気予報が表示できますね。


前回 連載:つないでみよう 次回

0 件のコメント:

コメントを投稿