階層構造のデータをロードします (データベース、サービス、固定値などから)。
アプリケーションでは、データ交換による相互作用の必要性がますます高まっています。旅行会社のアプリケーションでは、航空会社にチケットの発券を要求する際に、乗客の情報を送る必要があります。別のアプリケーションでは、Google のサービスを使用したり、アプリケーション内の構造化されたデータを交換する必要があります。
この場合、構造化されたデータを扱うことが不可欠です。そのようなデータの形式が 1 種類に固定されることはありません。XML は今日最も普及している形式ですが、転送を軽量化する JSON などその他の形式も登場しており、今後の予測は困難です。
データプロバイダーとは階層構造のデータの取得に使用される「宣言型のプロシージャー」のことを言い、非常に分かりやすく操作も簡単です。これは、出力という明確な意図があり、希望の出力形式が示されているためです。

データプロバイダーで実行できることはすべて、プロシージャーでも実行できます。これらはいずれも入力、変換、および出力を含むプロセスと考えることができます。異なる点は、通常のプロシージャーでは、変換言語を重視し、データプロバイダーでは、出力言語を重視することです。
たとえば、すべての顧客の読み込み (入力) と、これを使った XML ファイルの書き出し (出力) でプロセスが構成される場合、プロシージャーは次のようになります:
&XmlWriter.Open(...)
&XmlWriter.WriteStartElement('Clients')
For Each
&XmlWriter.WriteStartElement('Client')
&XmlWriter.WriteElement('Code', CustomerId.ToString())
&XmlWriter.WriteElement('Name', CustomerName)
&XmlWrite.EndElement()
Endfor
&XmlWriter.EndElement()
&XmlWriter.Close()
&XmlWriter は、GeneXus XMLWriter データタイプの変数です。
ここで、プロシージャーの出力をすぐに表示するのは、簡単ではありません。プロシージャーは、それを取得するために書き出されたコード内部に、分かりにくく埋め込まれています。
その代わり、データプロバイダーが明確に目的を示します。
Clients
{
Client
{
Code = CustomerId
Name = CustomerName
}
}
ToXML メソッドでは、出力を相当する XML 形式に簡単に変換できます:
<Clients>
<Client>
<Code>1</Code>
<Name>John Smith</Name>
</Client>
<Client>
<Code>2</Code>
<Name>Jennifer Lopez</Name>
</Client>
...
</Clients>

GeneXus で階層構造を実装するには、Structured Data Type (SDT) オブジェクトを使用します。詳しくは、「実装例」を参照してください。
データプロバイダーは書き込みが容易で分かりやすいため、タスクによっては、通常のプロシージャーよりデータプロバイダーを使ったほうが簡単に行えるものがあります。テーマについてこのようなタスクは、構造化データを返すものです。次に例を示します。
定義を示す前に、例をいくつかあげます:
Invoices
{
Date = today()
Invoice Order InvoiceAmount
Where InvoiceDate = today()
{
Id = InvoiceId
CustomerId = CustomerId
CustomerName = CustomerName
Amount = InvoiceAmount
Product
{
Id = ProductId
DetailQuantity = InvoiceDetailQuantity
DetailAmount = InvoiceDetailAmount
}
}
}
出力は、今日の日付の SDT となり、InvoiceDate = today() の請求書アイテムの集合です。
ChartConstants
{
ChartServer = 'http://www.gxchart.com/drawchart.asp'
ChartParameters = '...'
}
同様の例には、TabbedView Web コンポーネントに必要な SDT タブのロードがあります。
LoadTabs parm(&CustomerId)
Tabs
{
Tab
{
Code = 'General'
WebComponent = link(WCustomerGeneral, &CustomerId)
}
Tab
{
Code = 'Invoices'
WebComponent = link(WCustomerInvoices, &CustomerId)
}
}
(詳細は、こちらを参照してください。)
rss
{
version = "2.0"
channel
{
title = 'Today's Invoices"
link = link(ViewTodayInvoices)
item where InvoiceDate = today()
{
title = format('Invoice %1', InvoiceId)
link = link(ViewInvoice, InvoiceId)
description = format('Invoice %1 for customer %2, amount %3', InvoiceId, CustomerName, InvoiceAmount)
author = 'system'
pubDate = today()
}
}
}
データプロバイダーの要旨についての説明は以上です。次も参照してください:
次の例およびユースケースも参照してください:
データプロバイダーは、「プログラミング」ではなく、「宣言」によって手順を進めます。この方法の利点は、基礎の実装部分を変更でき、データプロバイダーを有効に保つことができることです。詳細については、「Data Provider の考え方」を参照してください。
Compound data types
|