Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

Salesforceに表計算グリッドコントロール「SPREAD」のパワーを融合する

「CData ADO.NET Provider for Salesforce 4J」の紹介

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2015/01/08 14:00

 パブリッククラウドのシェアはSaaS、PaaS、IaaSなどの分類ごとに違いがありますが、大企業向けのSaaS分野でのシェア第1位といえば、Salesforceになります。しかし、受託開発の現場にいるとPaaSやIaaSを使う場合が多く、Microsoft AzureやAWSは使ったことがあってもSalesforceは「名前は聞いたことがあるけれど実際に使ったことは……」ということも、これまでは多かったのではないでしょうか。

 しかしながら、クラウドの利用率は今後も増えていくでしょうし、さらに、クラウド単体だけではなく、クラウドとオンプレミスを組み合わせたり、複数のクラウドを組み合わせたりするケース(ハイブリッドクラウド)も今後は増加していくと考えます。そうなってくると、Salesforceを扱っていてもオンプレミスの技術を知る必要がでてきたり、その逆のケースがでてきたりすることが予想できます。

 ハイブリッドクラウドにおける接続を解決するアプローチはいろいろありますが、ADO.NETによるさまざまなデータソースとの接続性を活用するというアプローチに注目したのが、今回使用する「CData ADO.NET Provider for Salesforce 4J」です。

 CData ADO.NET Provider for Salesforce 4J(以下、CData)を使えば、ADO.NETでのノウハウを使ってSalesforceからデータを取得できます。さらに、ADO.NETでの接続を前提とした各種コントロールのデータソースとしてSalesforceを指定することもできるのです。

 なお、今回のサンプルはVisual Studio Ultimate 2013で作成しましたが、無料版であるVisual Studio Community 2013でも同じ手順で確認することができます。

Salesforceの準備

 Salesforceをすでに利用しているならば、セキュリティトークンを入手するだけで準備は完了します。もし、Salesforceを利用していない場合でも無料で簡単に試してみることができます。

SalseForceの利用開始

 CDataでSalesforceに接続するためには、SalesforceのエディションとしてEnterprise EditionまたはUnlimited Editionが必要です。無料トライアルはそれ以外のエディションになるので、無料のDeveloper Editionに申し込みます。

図1 無料のDeveloper Editionのサインアップ
図1 無料のDeveloper Editionのサインアップ

 [サインアップ]ボタンをクリックすると「無料のDeveloper Edition環境にサインアップ」画面が表示されるので、姓名やメールアドレスなど必要事項を登録します。数分後に登録したメールアドレス宛にSalesforceからメールが届くので、そこに記載されたURLにアクセスすればDeveloper Editionの利用を開始できます。

図2 無料のDeveloper Editionの利用開始
図2 無料のDeveloper Editionの利用開始

セキュリティトークンの入手

 Salesforceの外からデータアクセスするためはSalesforceへのログインが必要です。ログインの方法には2つの方法があります。

  • (1)ID、パスワード、セキュリティトークンの3つを指定してログイン
  • (2)OAuth認証によるログイン

 今回は(1)の方法で試してみますので、セキュリティトークンを入手します。セキュリティトークンを入手する手順は以下のとおりです。

私の設定にアクセス

図3 私の設定にアクセス
図3 私の設定にアクセス

 Salesforce にログインしたらヘッダに表示されている(1)自分の名前のドロップダウンを開いて(2)[私の設定]メニューを選択します。

セキュリティトークンのリセット

図4 セキュリティトークンのリセット
図4 セキュリティトークンのリセット

 [私の設定]画面が開いたら、サイドメニューから(3)[個人用]メニューを選択、(4)[私のセキュリティトークンのリセット]メニューを選択します。そして、(5)[セキュリティトークンのリセット]ボタンをクリックします。

 これでセキュリティトークンが登録してあるメールアドレスにメールで届きます。

Visual Studioからの接続

 Salesforce側の準備が終わったら、いよいよCDataを使ってサーバーエクスプローラーで接続してみましょう。

接続の追加

 サーバーエクスプローラーで[データ接続]に対して[接続の追加]を行います。

図5 接続の追加
図5 接続の追加

 [接続の追加]ダイアログでは、Salesforceに登録したユーザID、パスワードそしてメールで送られてきたセキュリティトークンを[User]欄、[Password]欄、[Security Token]欄にそれぞれ設定します。

データ表示

図6 データ表示
図6 データ表示

 設定が完了すれば、サーバーエクスプローラーに[CData]ノードが追加されるので、[Tables]ノードから試しに[Account]に対してデータ表示を行ってみましょう。

Salesforceをデータソースに指定

 サーバーエクスプローラーでSalesforceのデータが確認できるようになるだけでも、いろいろな可能性があります。例えば、サーバーエクスプローラーのデータ接続は、アプリのデータソースのデータ接続として利用できます。

 それでは、Salesforceのキャンペーンページで表示される内容をCData経由でデータソースにして、表計算グリッドコントロールの「SPREAD for WPF」で表示するサンプルを作成してみましょう。

図7 キャンペーンページ
図7 キャンペーンページ

 キャンペーンページの内容はCampaignテーブルに格納されています。サーバーエクスプローラーで確認してみましょう。

図8 Campaignテーブル
図8 Campaignテーブル

新規プロジェクトの作成

 [ファイル]-[新しいプロジェクト]メニューを選択して[Windowsデスクトップ]-[WPFアプリケーション]を選択してWPFアプリの新規プロジェクトを作成します。

データソースの追加

 [表示]-[その他のウィンドウ]-[データソース]メニューを選択して[データソース]ウィンドウを表示します。

図9 [データソース]ウィンドウ
図9 [データソース]ウィンドウ

 [新しいデータソースの追加]リンクをクリックしてウィザードを起動します。

 (1)データソース構成ウィザードで、[データベース]を選択して[次へ]ボタンをクリックし、次に[データソース]を選択して[次へボタン]をクリックします。

図10 データソース構成ウィザード
図10 データソース構成ウィザード

 (2)[データの選択]画面で「CData [Cdata ADO.NET Provider for Salesforce 4J]」を選択します。このときパスワードを接続文字列に含まないようにします。

図11 データ接続の選択
図11 データ接続の選択

 (3)接続文字列をアプリケーション構成ファイルに保存します。

図12 接続文字列の保存
図12 接続文字列の保存

 (4)取得するテーブルおよび項目を指定します。

図13 取得内容の設定
図13 取得内容の設定

データソースとコントロールの関連付け

 [データソース]ウィンドウにウィザードで設定したテーブルが表示されていることを確認します。テーブル名の横のドロップダウンボタンをクリックして、コントロールの関連付けを「GCSpreadGrid」にします。

図14 コントロールの関連付け
図14 コントロールの関連付け

 もし、「GCSpreadGrid」が表示されていないときには、以下の手順を行えば表示されます。

  1. ツールボックスからGCSpreadGridをWPFウィンドウエディタにドラッグ&ドロップして、プロジェクトにSPREAD for WPFの参照設定などを追加
  2. 追加されているSPREAD for WPFを削除
  3. コントロールの関連付けで[カスタマイズ]を選択して[GCSpreadGrid]項目を選択

データソースから画面部品の配置

 コントロールの関連付けが終わったら、[データソース]ウィンドウの[Campaign]テーブルをWPFウィンドウにドラッグ&ドロップします。これでデータソースの内容をSPREADで表示する画面ができあがりました。

図15 SPREAD for WPFの配置
図15 SPREAD for WPFの配置

パスワードの設定

 データソースを作成するときにパスワードは除外しているので、MainWindows.xaml.vbにパスワードを設定するコードを追加します。

リスト1 SPREAD for WPFの配置
Class MainWindow 

    Private Sub Window_Loaded(sender As Object, …

        Dim DataSet1 As CZ1411DataSource.DataSet1 = …
        Dim DataSet1CampaignTableAdapter As  …

        DataSet1CampaignTableAdapter.Connection.ConnectionString &= ";password=hogehoge"

        DataSet1CampaignTableAdapter.Fill(DataSet1.Campaign)
        Dim CampaignViewSource As System.Windows.Data.CollectionViewSource = …
        CampaignViewSource.View.MoveCurrentToFirst()
    End Sub
End Class

 具体的には「DataSet1CampaignTableAdapter.Connection.ConnectionString」にパスワード指定の文字列を追加するコードになります。

実行

 Visual Studioでの定義と操作、そして1行だけコードを記述しただけですが、この状態で実行すればSalesforceからデータを取得してSPREADに表示ができます。

図16 データソースの表示例
図16 データソースの表示例

コードからSalesforceを使用

 データソースを使った例は手軽である反面、細かな調整がしづらいため、同様のことをコードで実現した例も紹介します。

参照設定

 GACにあるSystem.Data.CData.Salesforce.dllを参照設定します。

図17 参照設定
図17 参照設定

Salesforceアクセス用Model

 CDataは、ADO.NETと同様にConnectionで接続しDataAdapterでデータを取得します。

リスト2 SalesForceModel
Namespace Models
    Public Class Campaign
        Public Property Id As String
        Public Property Name As String
        Public Property Type As String
        Public Property Status As String
        Public Property StartDate As DateTime?
        Public Property EndDate As DateTime?
        Public Property ExpectedRevenue As Double?
        Public Property BudgetedCost As Double?
        Public Property ActualCost As Double?
    End Class

    Public Class SalesForceModel
        Implements INotifyPropertyChanged

        Private ConnectionString As String =
            "Offline=False;" &
            "Security Token=wxFN7ZEITyiU0hvcvTUQ5I80a;" &
            "User={0};" &
            "Password={1};"

        Public Property Items As New ObservableCollection(Of Campaign)

        Public Sub GetCampaign(userID As String, password As String)
            Dim connString = String.Format(ConnectionString, userID, password)
            Using conn As New SalesforceConnection(connString)
                Dim sql As String = "SELECT * FROM Campaign WHERE IsDeleted=false"
                Using da As New SalesforceDataAdapter(sql, conn)
                    Using tb As New DataTable
                        da.Fill(tb)
                        For Each row As DataRow In tb.Rows
                            Me.Items.Add(
                                New Campaign With
                                {
                                    .Id = row("Id"),
                                    .Name = row("Name"),
                                    .Type = row("Type"),
                                    .Status = row("Status"),
                                    .StartDate = row("StartDate"),
                                    .EndDate = row("EndDate"),
                                    .ExpectedRevenue = row("ExpectedRevenue"),
                                    .BudgetedCost = row("BudgetedCost"),
                                    .ActualCost = If(IsDBNull(row("ActualCost")),
                                                     Nothing,
                                                     row("ActualCost"))
                                }
                            )
                        Next
                    End Using
                End Using
            End Using
        End Sub

        Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
        Private Sub OnPropertyChanged(<CallerMemberName> Optional propertyName As String = Nothing)
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
        End Sub
    End Class
End Namespace
  1. SalesforceConnectionでSalesforceとの接続を定義
  2. SalesforceDataAdapterでデータの取得
  3. 取得したデータはObservableCollectionに設定

Binding用ViewModel

 ModelとViewを連携するためのViewModelを作成します。

リスト3 SalesForceModel
Imports System.ComponentModel
Imports System.Runtime.CompilerServices
Imports CZ1411Spread.Models
Imports System.Collections.ObjectModel
Imports CZ1411Spread.Common

Namespace ViewModels
    Public Class MainViewModel
        Implements INotifyPropertyChanged

        Private WithEvents Model As New SalesForceModel

        Public Property Items As ObservableCollection(Of Campaign)
            Get
                Return Me.Model.Items
            End Get
            Set(value As ObservableCollection(Of Campaign))
                Me.Model.Items = value
            End Set
        End Property

        Private _GetCommand As RelayCommand
        Public Property GetCommand() As RelayCommand
            Get
                If _GetCommand Is Nothing Then
                    _GetCommand = New RelayCommand(AddressOf Me.GetCampaign)
                End If
                Return _GetCommand
            End Get
            Set(value As RelayCommand)
                _GetCommand = value
            End Set
        End Property

        Public Sub GetCampaign()
            Dim userID = "hatsune@wankuma.com"
            Dim password = "hogehoge"
            Me.Model.GetCampaign(userID, password)
        End Sub

        Private Sub Model_PropertyChanged(sender As Object, …
            OnPropertyChanged(e.PropertyName)
        End Sub

        Public Event PropertyChanged(sender As Object, …

        Private Sub OnPropertyChanged(<CallerMemberName> Optional propertyName  …
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
        End Sub
    End Class
End Namespace

SPREADを使ったView

 ObservableCollectionをSPREADに表示するViewを定義します。そのためにはツールボックスに「GcSpreadGrid」を追加します。

図18 ツールボックスアイテムの選択
図18 ツールボックスアイテムの選択

 追加が終わったら、WPFウィンドウにドラッグ&ドロップしてからプロパティの微調整やその他の画面要素の設定を行います。

リスト4 MainWindow.xaml
<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sg="http://schemas.grapecity.com/windows/spreadgrid/2012" 
    x:Class="Views.MainWindow"
    Title="CZ1411Spread" Height="300" Width="498">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <sg:GcSpreadGrid HorizontalAlignment="Left" 
                         VerticalAlignment="Top"
                         ItemsSource="{Binding Items}" 
                         CanUserSortColumns="True" 
                         CanUserFilterColumns="True"/>
        <StackPanel Grid.Row="1" Orientation="Horizontal" Margin="10">
            <Button Content="GET" Command="{Binding GetCommand}" />
        </StackPanel>
    </Grid>
</Window>

実行結果

 このサンプルを実行するとデータが表示されていない画面が表示されます。[GET]ボタンをクリックするとViewModelのGetCommandが実行されてデータの取得が行われます。

図19 実行結果
図19 実行結果

まとめ

 CData ADO.NET Provider for Salesfoce 4Jを使えば、Salesforceをクラウドデータベースのように利用することができます。そして、ADO.NETライクで使えるということは、今回取り上げたSPRAEDだけではなく、ActiveReportsを使って日本のビジネスに合った帳票を作成してSalesforceから印刷するということも可能だということです。つまり、納品伝票や請求書など相手先が指定する帳票スタイルであったとしてもSalesforceから印刷できるのです。

 すべてをWindowsアプリでではなくSalesforceを核として適材適所でハイブリッド化することでSalesforceを本当の意味での自社インフラになります。もし、「SalseForceでもいいけれど、ここだけでもどうにかなれば」と躊躇する要素があるのであれば、そこに市販コンポーネントを注入した姿を検討してみてはいかがでしょうか。

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 初音玲(ハツネアキラ)

     国内SIerのSEでパッケージ製品開発を主に行っており、最近は、空間認識や音声認識などを応用した製品を手掛けています。  個人的には、仕事の内容をさらに拡張したHoloLensなどのMRを中心に活動しています。  Microsoft MVP for Windows Development...

All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5