マッピングクラスを使わないCsvHelperによるCSV取り込み方法

以下のサイトにあるように
CsvHelperによるCSV取り込みには、マッピングクラスを使わない方法もありますが、
CsvHelperのクラス構成がv7.0.0以降大きく変わったのに伴い、変わっていたのでメモしておきます。

kageura.hatenadiary.jp

参考サイト
github.com

ClosedXMLを使ってExcelファイルからデータを読み取る方法

CSVファイルやテキストファイルがデータを読み取る場合は、File.ReadAllLinesメソッドなどを使用して簡単に読み取りができます。

CSVファイルやテキストファイルからだけでなく、Excelファイルからデータを読み取り、
Dynamics CRMに何らかのデータ処理を行いたい要件も比較的多いと思いますが、
ExcelファイルについてもClosedXMLライブラリを使うことで簡単に読み取りができるようになります。
他にもNPOI やEPPlusといったオープンソースライブラリがよく使用されています。

読み取りしたExcelファイルのサンプルデータ
f:id:katharsis1721:20180409225846p:plain

この例ではエンティティの作成をしていますが、もちろんデータ処理を行うこともできます。
読み取ったデータごとにエンティティの作成、更新、削除をそれぞれ分けたい場合は、フラグ用のカラム(Create,Update,Delete)を追加して処理を分けるしかないかと思います。

また組織サービス(OrganizationService)によるDynamics CRMへの接続は、CrmConnectionクラスを使用するより、以下のようにapp.configに設定したconnectionStringをパラメーターとしてそのまま渡すほうがより簡単に接続ができます。

参考サイト
qiita.com

Microsoft Dynamics CRM 2015 へのより簡単な接続

Dynamics CRMグローバルオプションセット一覧がほしい時に実行するSQL

Dynamics CRMのカスタムグローバルオプションセットの一覧がほしい時に実行するSQLです。

SELECT
	PicklistValue.Label,
	PicklistValue.Name,
	--PicklistValue.OptionSetId,
	LLLV2.Label,
	PicklistValue.Value
FROM LocalizedLabelLogicalView AS LLLV2
INNER JOIN
(
	-- カスタムグローバルオプションセットのPickListIDを表示
	SELECT
		OSIdLabel.OptionSetId,
		OSIdLabel.Label,
		OSIdLabel.Name,
		APVLV.Value,
		APVLV.AttributePicklistValueId
	FROM   AttributePicklistValueLogicalView AS APVLV
	INNER JOIN 
	(
		-- カスタムグローバルオプションセットの表示名と名前を表示
		SELECT
			OSLV.OptionSetId,
			LLLV.Label,
			OSLV.Name
		FROM OptionSetLogicalView AS OSLV
		INNER JOIN LocalizedLabelLogicalView AS LLLV ON OSLV.OptionSetId = LLLV.ObjectId
		WHERE LLLV.ObjectColumnName = 'DisplayName'
		AND OSLV.IsGlobal = 1
		AND OSLV.IsCustomOptionSet = 1
	) AS OSIdLabel
	ON OSIdLabel.OptionSetId = APVLV.OptionSetId
) AS PicklistValue
ON LLLV2.ObjectId = PicklistValue.AttributePicklistValueId
WHERE LLLV2.ObjectColumnName = 'DisplayName' 


LocalizedLabelLogicalViewやMetadataSchema.LocalizedLabelには、
オプションセットのプルダウン内の各ラベルや値はもちろんですが、オプションセット自体の表示名と名前もデータが入っているんですね。
LabelTypeCode列の値が1の場合、プルダウン内の各ラベルの表示で、
LabelTypeCode列の値が10の場合、オプションセット自体の表示名を表します。


参考サイト

How to query CRM Global OptionSet Values in SQL? | Arun Potti's MS CRM blog

WSDLによるSOAP連携

外部システムからWSDLによるSOAP連携によりデータを取得する機会があったのですが、以外とどこにも連携方法の情報がまとまっていなかった気がするのでまとめます。

WSDLからWebサービスプロキシクラスを作成する。
プロキシクラスを作成する方法は2つあって、1つはSrcUtil.exeをコマンドラインから実行する方法であり、もう1つはVisualStudioの「サービス参照の追加」のアドレスにエンドポイントのアドレスを指定する方法です。
※移動ボタンを押してもサービスが見つからない場合、アドレスの末尾に「?wsdl」を付けて再度移動ボタンを押してみてください。

f:id:katharsis1721:20170314000509p:plain

サービスが見つかりOKボタンを押すと、Webサービスプロキシクラス(CSファイル)とapp.configに設定が追加されます。

②①で作成したプロキシクラスを使用してWebサービスへ接続、データ取得する。

       //Webサービスプロキシクラスを使用して、Webサービスとの接続を行う。
       BasicHttpBinding myBinding = new BasicHttpBinding();
       myBinding.Name = "任意のBinding名";
       EndpointAddress endPointAddress = new EndpointAddress("公開されているエンドポイントのアドレス");
       ChannelFactory<IService> factory = new ChannelFactory<IService>(myBinding,endPointAddress);
       IService channel = factory.CreateChannel();

       //ここからは各WSDLの仕様に依存する。
       //各WSDLが用意しているメソッドを指定することでほしいデータを取得する。
       //ただ任意の引数を指定して、Responseデータを取得する方法に大きな違いはないはず。
       getHogeHogeResponse hogehogeResponse = new getHogeHogeResponse();
       hogehogeResponse = channel.getHogeHoge(任意の引数);

       factory.Close();


参考サイト

code.msdn.microsoft.com

www.smartllc.jp

Azure Recommendations APIを使ってDynamics CRM上から推奨製品をだしてみた。

こちらに書かれているようにまだプレビュー版ですが(2016年9月現在)標準機能で「クロスセル製品推奨事項」機能が備わっています。

memo.tyoshida.me

この標準機能と似たようなことがMicrosoft Cognitive ServicesのAzure Recommendations APIを使ってできないかなと思い、以下のサイトを参考に試してみました。


blog.shibayan.jp

new_recommendationlink.htmlからnew_recommendation.htmlを読み出す形で作成し、
new_recommendationlink.htmlをWebリソースとしてCRM画面に埋め込んでいます。

new_recommendationlink.html

new_recommendation.html



f:id:katharsis1721:20160905224934p:plain

関連性(Rating)の高い上位10件の製品を出力することができました。

f:id:katharsis1721:20160905224016p:plain

XPathを使用してExcelのXMLスプレッドシートからセルの値を取得する

ExcelXMLスプレッドシートからセルの値を取得してなんやかんやとデータ操作したい場合があります。
例えばXMLスプレッドシートを使用してデータインポートやエクスポート時にデータを更新するなど。

ExcelXMLスプレッドシート名前空間は「urn:schemas-microsoft-com:office:spreadsheet」であるため、AddNamespaceで名前空間とそのプレフィックスを指定する必要があります。

参考サイト

XPath and Excel spreadsheet
http://forums.asp.net/t/377921.aspx?XPath+and+Excel+spreadsheet


名前空間を指定してXPathを実行する。
http://devlights.hatenablog.com/entry/20070906/p1

Dynamics CRMで作成可能なフィールド項目一覧

Dynamics CRM 2016時点で作成可能なフィールド一覧をまとめてみました。

# データの種類 形式 データ型 最小値 最大値
1 1行テキスト 電子メール nvarchar 1 4000
2 1行テキスト テキスト nvarchar 1 4000
3 1行テキスト テキスト領域 nvarchar 1 4000
4 1行テキスト URL nvarchar 1 4000
5 1行テキスト 株式銘柄コード nvarchar 1 4000
6 1行テキスト ふりがな nvarchar 1 4000
7 1行テキスト 電話 nvarchar 1 4000
8 オプションセット - int -2147483648 2147483648
9 2つのオプション ラジオボタン bit 0(FALSE) 1(TRUE)
10 2つのオプション チェックボックス bit 0(FALSE) 1(TRUE)
11 2つのオプション 選択リスト bit 0(FALSE) 1(TRUE)
12 整数 なし int -2147483648 2147483647
13 整数 期間 int -2147483648 2147483647
14 整数 タイムゾーン int -2147483648 2147483647
15 整数 言語 int -2147483648 2147483647
16 浮動小数点数 小数点桁数0〜5桁の範囲で指定可能 float -100000000000 100000000000
17 10進数 小数点桁数0〜10桁の範囲で指定可能 decimal -100000000000 100000000000
18 通貨型 小数点桁数0〜4桁の範囲で指定可能 money -922337203685477 922337203685477
19 複数行テキスト - ntext 1 1048576
20 日付と時間 日付のみ datetime 1900/1/1 9999/12/30
21 日付と時間 日付と時間 datetime 1900/1/1 0:00 9999/12/30 23:59
22 イメージ - image - -
23 検索 - identifier - -

イメージフィールドはこの他に以下のような特徴があるようですね。
・各エンティティに1つのみ設定可能
・検索可能項目には「いいえ」のみ指定可能(検索不可)
・任意項目のみ指定可能(必須不可)
・実際のイメージデータは内部エンティティImageDescriptorで管理される

参考サイト

Dynamics CRM 4.0 のデータ型と形式のまとめ
http://www.pine4.net/Memo/Article/Archives/255


フィールドの作成および編集
https://technet.microsoft.com/ja-jp/library/dn531187.aspx