Dynamics CRM モバイルアプリケーション開発 その 4

みなさん、こんにちは。

前回に引き続き、モバイルアプリケーション開発の紹介をします。
シリーズものですので、是非初回からご覧ください。

CRM モバイル開発ヘルパーのダウンロードと参照

まず Microsoft より提供されている、Dynamics CRM モバイル
開発ヘルパーをダウンロードしてコンパイルします。

1. 以下 URL にアクセスします。
https://code.msdn.microsoft.com/Mobile-Development-Helper-3213e2e6

2. 画面中央のダウンロードリンクをクリックします。

image

3. 任意の場所に保存後、展開します。

4. 展開後 <展開パス>\C#\Microsoft.Crm.Sdk.Mobile.sln を開きます。

5. ソリューションをビルドします。NuGet パッケージなど必要な
ファイルが自動的にダウンロードされ、コンパイルが完了します。

6. コンパイルされた bin\Debug\Microsoft.Crm.Sdk.Mobile.dll を
開発中の CRMContact プロジェクトにコピーします。

7. 参照よりコピーしたアセンブリへの参照を追加します。

image

ヘルパーの利用

次に参照したヘルパーを利用するために MainPage.xaml.cs を
変更します。

1. 以下の using ステートメントを追加します。

using Microsoft.Xrm.Sdk.Samples;
using Microsoft.Xrm.Sdk.Query.Samples;

2. クラスメンバとして以下を追加します。

private OrganizationDataWebServiceProxy proxy;

3. MainPage コンストラクタに以下コードを追加します。

// proxy の初期化とサーバーアドレスの設定
proxy = new OrganizationDataWebServiceProxy();
proxy.ServiceUrl = crmServerUrl;

4. GetToken メソッドで AccessToken を確認した後 Proxy に
AccessToken を付与します。

// AccessToken の確認
var accessToken = result.AccessToken;
//Proxy に AccessToken の付与
proxy.AccessToken = accessToken;

これで Proxy を経由して Web サービスを呼べるようになりました。

MainPage にコントロール配置

現時点で MainPage.xaml にはコントロールがなにも配置されて
いませんので、以下の XAML を最上位の grid に追加します。また
今回はコードに専念するため見た目は Margin 以外設定しません。

<Grid.ColumnDefinitions>
    <ColumnDefinition Width="1*" />
    <ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions>

<!-- 検索グリッド -->
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="*"/>               
    </Grid.RowDefinitions>
           
    <!-- 検索ボックス -->
    <Grid Margin="24,60">
        <StackPanel>
            <TextBox x:Name="txtSearchCriteria" />
            <Button x:Name="btnSearch" Content="検索"  Click="btnSearch_Click" />
        </StackPanel>
    </Grid>
    <!-- 結果リスト -->
    <Grid Grid.Row="1" Margin="24,0">
        <ListView x:Name="lvContacts"
                    IsItemClickEnabled="True">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <Grid>                               
                        <StackPanel>
                            <TextBlock Text="{Binding FullName}" />
                            <TextBlock Text="{Binding EMailAddress1}"  />
                        </StackPanel>
                    </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
</Grid>

画面は以下のようになります。ListView はデータがないので現時点
ではなにも表示されていません。

image

Contact クラスの追加

今回は事前バインドは利用しませんが、データバインディングを
利用するため Contact クラスを定義します。別コードに追加するか
MainPage.xaml.cs に新しいクラスとして追加してください。

/// <summary>
/// 担当者用のクラス
/// </summary>
public class Contact
{
    // 姓名
    public string FullName { get; set; }
    // 電子メールアドレス
    public string EMailAddress1 { get; set; }
}

検索ロジックの追加

最後に検索ロジックを追加しましょう。

以下のメソッドを MainPage.xaml.cs に追加します。

/// <summary>
/// ユーザーが検索ボタンをクリックした際に呼び出されます。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private async void btnSearch_Click(object sender, RoutedEventArgs e)
{
    // 検索文字列を取得
    string searchCriteria = (String.IsNullOrEmpty(txtSearchCriteria.Text)) ? "" : txtSearchCriteria.Text;

    // FetchXML で検索を実行
    string fetch = String.Format(@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
<entity name='contact'>
<attribute name='fullname' />
<attribute name=’emailaddress1’ />
<order attribute='fullname' descending='false' />
<filter type='and'>
<condition attribute='fullname' operator='like' value='%{0}%' />
</filter> 
</entity>
</fetch>", searchCriteria);

    // RetrieveMultiple の実行
    var results =  await proxy.RetrieveMultiple(new FetchExpression(fetch));

    // リストビュー用のリストを作成
    List<Contact> contacts = new List<Contact>();

    // 検索結果からリスト作成
    foreach(var result in results.Entities)
    {
        Contact contact = new Contact()
        {
            FullName = result["fullname"].ToString(),
            EMailAddress1 = result["emailaddress1"].ToString()
        };

        contacts.Add(contact);
    }

    // リストをリストビューに設定
    lvContacts.ItemsSource = contacts;
}

動作の確認

最後に動作の確認をします。

1. コンパイルを行いエラーがないことを確認後、F5 キーを押下して
プログラムを実行します。

2. 検索を文字列を入力して「検索」ボタンをクリックします。又は
検索文字列をなにも入れずに検索を実行するとすべてのレコードを
検索できます。

3. 以下のように検索結果が表示されます。

[すべてのレコード検索]
image

[”佐” で検索した場合]
image

まとめ

今回は CRM モバイル開発ヘルパーの簡単な利用方法と、簡単な
コードの紹介をしました。既に Dynamics CRM 開発を経験して
いる開発者の方には、簡単に開発できる予感が伝わると幸いです。

次回はリストに読み込んだ取引先担当者を選択したのち、右側に
詳細と関連する活動の表示、また他アプリケーションとの連携
部分を実装してみます。

- 中村 憲一郎