Edited at

CData Software ハンズオン(Salesforce と kintone の顧客データを同期するC#アプリケーション)

More than 1 year has passed since last update.


はじめに

本資料では、Salesforceの取引先データをkintoneに同期するWindowsフォームのC#アプリケーションを作成する手順です。

image.png


使用するCData製品

※30日間の無償評価版


前提作業


  • SalesforeのAPIを利用できる権限のアカウントを保有していること。

  • kintoneのアカウントを保有しており、アプリテンプレートの「営業支援パック」でアプリを作成済みであること。

  • 上記、ODBCドライバをインストールして、ODBCのDSNの設定が完了しており、Salesforce、および、kintoneへの「接続のテスト」が成功していること。


SalesforceのDSN設定情報

image.png

Salesforceの接続情報
設定項目

ユーザID
User

パスワード
Password

セキュリティートークン
Security Token


kintoneのDSN設定情報

image.png

kintoneの接続情報
設定項目

ユーザID
User

パスワード
Password

kintoneのサブドメイン含むサイトURL(例:https://****.cybozu.com) ※https://****.cybozu.com/k/の「/k」は不要
Url


プロジェクトの作成

VisualStudio2017を起動して、メニューバーの「ファイル > 新規作成 > プロジェクト」を開きます。

image.png

「新しいプロジェクト」ウィザードが起動するので、「VisualC# > Windowsフォームアプリケーション(.NET Framework)」を選択して、名前に「Salesforce2Kintone」と入力して「OK」ボタンをクリックします。

image.png

プロジェクト作成され、Formのデザイナが開きます。


DataGridViewの配置、および、データバインド

くので、Formを適当な大きさに拡大します。左側の「ツールボックス」の検索ボックスに「table」と入力して抽出された「TableLayoutPanel」を選択して、ドラッグ&ドロップで、Form上に配置します。配置するときに、行列を「1行×3列」に設定して、Formいっぱいに拡大します。「TableLayoutPanel」が選択された状態で、右側のプロパティ内の「配置 > Anchor」を「Top, Left」から「Top, Bottom, Left, Right」に変更します。あわせて「配置 > Columns」を開き、「列と行のスタイル」ウィンドウにて「サイズの型」を以下の通り設定して保存します。

メンバー
サイズの型

Column1
Percent
45.00%

Column2
Percent
10.00%

Column3
Percent
45.00%

image.png

「TableLayoutPanel」のバランスが取れたところで、「ツールボックス」の検索ボックスにて「DataGridView」と入力して抽出された「DataGridView」を、「TableLayoutPanel」の左にドラッグ&ドロップで配置します。「DataGridView」右上の小さな再生ボタン「▶︎」をクリックして、「データソースの選択」の「(なし)」右の下矢印をクリックして、「プロジェクトデータソースの追加」リンクをクリックします。

image.png

「データソース構成ウィザード」が立ち上がるので、「データベース > データセット」を選択して進みます。

image.png

image.png

「データ接続の選択」にて、「新しい接続」ボタンをクリックして、「データソースの選択」ウィンドウから「Microsoft ODBC データソース」を選択して「続行」ボタンをクリックします。

image.png

「ユーザーデータソースまたはシステムデータソース名を使用」のドロップダウンリストから既に作成しているSalesforceのODBC DSN「CData Salesforce Source」を選択して、「テスト接続」をクリックします。テスト接続に成功したら「OK」ボタンをクリックします。

image.png

「次へ」ボタンをクリックして進みます。

image.png

プロジェクト内のアプリケーション構成ファイルに保存する名称「ConnectionStringSalesforce」を入力して「次へ」を進みます。

image.png

Salesforce内のオブジェクトがテーブルリストとして表示されるので取引先に相当する「Account」にチェックを入れ、データセット名を「DataSetSalesforce」として「完了」ボタンをクリックします。

image.png

フォームのデザイナに戻り、左側の「DataGridView」に、ヘッダー行が追加されたことを確認します。「DataGridView」を選択して、プロパティ内の「配置 > Dock」を「Fill(四角の真ん中)」に変更します。これにより、「TableLayoutPanel」の中いっぱいに「DataGridView」が拡大されます。

image.png

今度は、右側の「DataGridView」にkintoneの情報をバインドする設定を行いましょう。Salesforceの時と同様に「データベース > データセット」を選択して進みます。

image.png

image.png

image.png

「データ接続の選択」の「新しい接続」から、今度は、「ユーザーデータソース名またはシステムデータソース名を使用」からkintoneのODBC DSN「CData Kintone Source」を選択します。「テスト接続」をクリックして、接続に成功したのを確認して「OK」ボタンをクリックします。

image.png

「次へ」ボタンをクリックします。

image.png

kintone側の接続文字列名を「ConnectionStringKintone」として「次へ」進みます。

image.png

kintone内のアプリがテーブルリストとして表示されるので、「顧客管理(営業支援パック)」にチェックを入れてデータセット名は「DataSetKintone」として「完了」ボタンをクリックします。

image.png

kintone側の「DataGridView」を選択して、プロパティ内の「配置 > Dock」を「Fill(四角の真ん中)」に変更します。

image.png

それでは、Salesforceとkintoneのデータが、「DataGridView」にバインドされるか確認してみます。メニューバー内の「▶︎開始」ボタンをクリックして実行してみます。しばらくすると「Form1」が起動して、Salesforceとkintoneのデータが表示されれば成功です。確認出来たら「■」の停止ボタンをクリックします。

image.png

次に、「DataGridView」内の不要な項目を非表示にすることで、より、左(Salesforce)右(kintone)の項目を比較しやすくします。まずは、左側のSalesforce側の「DataGridView」の右上の「▶︎」ボタンをクリックして「列の編集」リンクをクリックします。

image.png

「列の編集」の「選択された列」に以下の項目のみ残し、「OK」ボタンをクリックします。

選択された列
備考

Id
内部キー項目

Name
取引先名

BillingStreet
住所

BillingPostalCode
郵便番号

Phone
電話番号

Fax
Fax

image.png

同様に右側のkintone側の「DataGridView」の右上の「▶︎」ボタンをクリックして「列の編集」リンクをクリックします。「列の編集」の「選択された列」に以下の項目のみ残し、「OK」ボタンをクリックします。

選択された列
備考

RecordId
内部キー項目

Revision
レコードバージョン番号

郵便番号

顧客名

住所

TEL

FAX

image.png

再度、Salesforceとkintoneのデータが、必要項目のみ「DataGridView」にバインドされるか確認してみます。メニューバー内の「▶︎開始」ボタンをクリックして実行してみます。しばらくすると「Form1」が起動して、Salesforceとkintoneの項目が設定した項目のみ表示されれば成功です。確認出来たら「■」の停止ボタンをクリックします。

image.png


同期処理の実装

「ツールボックス」の検索ボックスにて「button」と検索して抽出された「Button」コントロールを、「TableLayoutPanel」の間に配置します。デフォルトでは右上に寄った配置となるため、「配置 > Anchor」を「None」に変更することで中央に移動します。また、「表示 > Text」をコピーを行う処理として「>>>」に変更して、ボタンをドラッグ&ドロップ操作で縦に広げて大きくします。追加した「Button」コントロールをダブルクリックします。

image.png

「Form1.cs」のコードが表示されます。下イメージの「ここ」部分に下記のコードをコピーします。

image.png


//// エラー処理は省略

this.button1.Enabled = false;

this.dataGridView1.Rows.Cast<DataGridViewRow>()
.Where(o => o.Selected)
.Select((o, i) => new { Row = (DataSetSalesforce.AccountRow)((DataRowView)o.DataBoundItem).Row, Index = i })
.ToList()
.ForEach(selected =>
{
var row = this.dataSetKintone._顧客管理_営業支援パック_.Rows.Cast<DataSetKintone._顧客管理_営業支援パック_Row>()
.Where(o => o.顧客名 == selected.Row.Name)
.FirstOrDefault();

if (row == null)
{
row = this.dataSetKintone._顧客管理_営業支援パック_.New_顧客管理_営業支援パック_Row();
row.RecordId = selected.Index
+ (this.dataSetKintone._顧客管理_営業支援パック_.Rows.Cast<DataSetKintone._顧客管理_営業支援パック_Row>().Max(o => (int?)o.RecordId) ?? 0)
+ 1;
row.Revision = 0;
}

row.顧客名 = selected.Row.Name;
row.郵便番号 = selected.Row.IsBillingPostalCodeNull() ? "" : selected.Row.BillingPostalCode;
row.住所 = selected.Row.IsBillingStreetNull() ? "" : selected.Row.BillingStreet;
row.TEL = selected.Row.IsPhoneNull() ? "" : selected.Row.Phone;
row.FAX = selected.Row.IsFaxNull() ? "" : selected.Row.Fax;

if (row.Revision == 0)
{
this.dataSetKintone._顧客管理_営業支援パック_.Rows.Add(row);
}

this.顧客管理_営業支援パック_TableAdapter.Update(this.dataSetKintone);
});

this.顧客管理_営業支援パック_TableAdapter.Fill(this.dataSetKintone._顧客管理_営業支援パック_);

this.button1.Enabled = true;

コピー&ペーストして、構文エラー(赤い波線)が出るようであれば、Datasetの名称など、これまでの設定内容と照らし合わせてください。特に構文エラーがない場合は、プロジェクトをリビルドして、再度、「▶︎開始」でプロジェクトを実行してみます。

image.png

Formが起動するので、左側のSalesforceのデータを一レコード選択した状態で、「>>>」ボタンをクリックしてみてください。右側に一レコード追加されれば成功です。

image.png

実際に、kintoneの画面を開き、追加されているか確認してみましょう。

image.png

もう一度、左側のSalesforceのデータの同じ一レコード選択した状態で、「>>>」ボタンをクリックしてみてください。今度はエラーで止まりました。

                    this.顧客管理_営業支援パック_TableAdapter.Update(this.dataSetKintone);

「From1.cs」内の下記のUpdateするところで「[RecordId]列は読み取り専用です。この列の値を更新出来ません。」というエラーが出ています。これは、kintone側のレコード毎に保有のキー項目であるRecordIdは更新出来ないため発生します。そこで、必要な項目のみUpdate(更新)するように変更します。

image.png

右側の「ソリューションエクスプローラー」から「DataSetKintone.xsd」を選択して、右クリックから「デザイナーの表示」を開きます。

image.png

「顧客管理(営業支援パック) Table Adapter」のアイコンをクリックして、右下の「プロパティ」が「顧客管理(営業支援パック) Table Adapter」になった事を確認して、「UpdateCommand」のプラスボタンを開き、「CommandText」を右側の「...」から開きます。 

image.png

「クエリービルダー」が開くので、下記の「郵便番号、住所、TEL、FAX」のみ更新するように変更します。

UPDATE                    Kintone."顧客管理(営業支援パック)"

SET 郵便番号 = ?, 住所 = ?, TEL = ?, FAX = ?
WHERE (RecordId = ?)

image.png

「OK」ボタンをクリッっくして「クエリービルダー」を閉じて、再度、、プロジェクトをリビルドして、再度、「▶︎開始」でプロジェクトを実行してみます。既にkintone側にコピー済みのレコードを再度Salesforce側のレコードを選択してコピーしてみます。kintone側のRevisionが「1」から「2」にカウントアップすれば成功です。

image.png

それでは、左側のSalesforce側のレコードをすべて選択して、コピーを実行してみましょう。

image.png

実行が完了したらkintone側の画面でみてみましょう。Salesforce側の取引先(Account)情報が、kintone側の顧客管理(営業支援パック)に同期されたことを確認出来たら完成です。

image.png


まとめ

資料では、Salesforceの取引先データをkintoneに同期するWindowsフォームのC#アプリケーションを作成する手順について説明しました。このように、最小限のプログラミングで、そして、ODBCというRDBと同じ規格で、Salesforceとkintoneの両方のSaasに接続してデータ連携を行うことが出来ます。