Xplenty入門 Part9: データ型の変換

Xplentyでは**式エディタ**を使用することでデータ型を変換することが可能です。しかし、型の変換方法は変換する型によって変わるため、以下を参考に活用ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/c12a2e68-f999-8a60-e7da-8aa81cfff7c8.png)


#シンプルな型変換1
##1. Chararray(String)
用途：BAG型やMAP型および数値型などから文字列型への変換に使用する

式エディタでの使用例：
**(chararray)**field名

**例外ケース：変数画面でHexstring（16進文字列）を文字列型に変換するには？**
XplentyではSalesforceのオブジェクトにあるID列(AccountIdやOwnerId)でも使用される「0052x0000034oJqAAI」のような値を文字列として**変数画面で使用した場合**、Hexstring（16進文字列）として自動的に扱われます。こうした場合、Chararray関数を使用して文字列型へ変換しようとするとエラーとなってしまいます。
そこでHexstring（16進文字列）の値を文字列型で定義し、パイプラインの条件やSelectコンポーネントで使用したい場合、バックスラッシュ「\'[Hexstring文字列]\'」のように定義することで、文字列に変換が可能です。

例）文字列「0052x0000034oJqAAI」を変数で文字列型として定義する場合
`'\'0052x0000034oJqAAI\''`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/a58f0f54-20f0-7ea8-c965-4d7d459fcaed.png)



##2. Int型
文字列型の数値データを数値型に変換

式エディタでの使用例：
**(int)**field名

##3. Long型
文字列型の数値データを数値型に変換

式エディタでの使用例：
**(long)**field名

##4. Float型
文字列型の数値データを数値型に変換

式エディタでの使用例：
**(float)**field名

##5. Double型
文字列型の数値データを数値型に変換

式エディタでの使用例：
**(double)**field名

##6. 数値へ変換、数値に変換出来なかった場合はデフォルト値をセット
ParseIntOrDefault(field名,数値に変換出来なかった場合のデフォルト数値（Int型）) 
ParseLongOrDefault(field名,数値に変換出来なかった場合のデフォルト数値（Long型）) 
ParseFloatOrDefault(field名,数値に変換出来なかった場合のデフォルト数値（Float型）)
ParseDoubleOrDefault(field名,数値に変換出来なかった場合のデフォルト数値（Double型）) 

式エディタでの使用例：
ParseIntOrDefault('ああああ',1)
1（Int型）を返す >文字列が数値に変換できなかったため

ParseIntOrDefault('300',1)
300（Int型）を返す

#シンプルな型変換2
##1. Map型
JSONなどのキーバリュー形式のデータを格納したデータ形式です。
以下のようなデータを取り込む際に使用されます
area : **{
id : "130" ,
name : "東京" 
}**

式エディタでの使用例：
**TOMAP**('id','130','name','東京')

結果：
{name=東京, id=130}

**MAP型からデータを取得するには?**
Field1#'キー名称'と指定すれば、キーに対応する値が取得できます。

式エディタでの使用例：
**TOMAP**('id','130','name','東京')#'id'

結果：
130

##2. Tuple型
複数フィールドが配列になっている形式のデータ型です。

式エディタでの使用例：
**TOTUPLE**('001,TV,Electronics')

結果：
(001,TV,Electronics)

##3. Bag型

式エディタでの使用例：
**TOBAG**('001','TV','Electronics')

結果：
{(001),(TV),(Electronics)}

#その他の型変換
##1. BagToString 
Bag型からString型に変換

式エディタの使用例： *この例では、文字列をBag型に便宜的に変換するためにJsonStringToBagを使用
BagToString(JsonStringToBag('[1,2,3]'),';')

結果：String型
1;2;3

##2. BagToTuple
Bag型からTuple型に変換

式エディタの使用例：
BagToTuple(JsonStringToBag('[1,2,3]'))

結果：Tuple型
(1,2,3)

**Tuple型の配列の一部の値を取得するには?**

式エディタの使用例：
BagToTuple(JsonStringToBag('[1,2,3]')).$0

結果：
1

##3. MapToBug
Map型からBug型に変換

式エディタの使用例：
MapToBag(TOMAP('a',1,'b',2,'c',3))

結果：Bag型
{([value#1,key#a]),([value#2,key#b]),([value#3,key#c])}


#参考：Xplentyで扱えるデータ型について
使用できる型は[こちら](https://www.xplenty.com/docs/using-expressions-in-xplenty/)
*2020年8月16日現在、XplentyではDate型がありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/8991b790-4aa7-8b90-db88-155d1a4b0ef9.png)

#より実践的なデータ処理
##1. BAG型のフィールド
Flatten関数を使用する。
式）Flatten(`BAG型のフィールド`）
バッグ型のフィールドがもつデータ数にもとづきレコードが分かれます。
例えば以下のようなデータをもつBAG型のフィールドの場合、1レコードが2つのレコードに分かれます。
`{
[{"id":"001","price":"200"}],
[{"id":"002","price":"500"}]
}`

**結果:**
{"id":"001","price":"200"}
{"id":"002","price":"500"}

##2. BAG形式の文字列を持つフィールドの処理
すでに処理対象のフィールドのデータ型がBAG型の場合はこの処理は不要ですが、String型の場合には以下の処理が必要となります。
フィールド「test」の値：
`[{"id":"001","price":"200"}]`

String型のJSON文字列をBAG型へ変換
「test2」フィールド：
式）**JsonStringToBag**(test) 
結果値：`{({"id":"001","price":"200"})}`

これでフィールドをFlatten関数で処理することで、以下の様なJSON文字列になります。
「test3」フィールド：
式）**Flatten**(test2)
`{"id":"001","price":"200"}`

あとは**JsonStringToMap**関数を使って、testフィールドの値の各キーを取得できます。
JsonStringToMap(test3)#'id' --> 001
JsonStringToMap(test3)#'price' --> 200