0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-25

はじめに

本資料では、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に接続してデータ連携を行うことが出来ます。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?