A5:SQL Mk-2 でSalesforce へのCRUD クエリを作成

フリーのSQL 開発ツールといえば「[A5:SQL Mk-2](https://a5m2.mmatsubara.com/)」が有名です。Windows ODBC に強い！というイメージです。ただのイメージで、他のDB 管理/クエリツールでもODBC は普通に使えるのですが。

この記事では、A5 Mk-2 からCData ODBC Drivers for Salesforce 経由でSQL クエリでSalesforce データをクエリしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116843/91eddd65-2fdc-7164-e821-52f20ff1aad8.png)

## A5:SQL Mk-2 をインストール
[https://a5m2.mmatsubara.com/](https://a5m2.mmatsubara.com/) からA5 Mk-2 をダウンロードして解凍します。

## CData ODBC Driver for Salesforce の準備
### CData ODBC Driver for Saleforce をダウンロード
CData ODBC Drivers サイトからSalesforce ODBC を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116843/9f434966-0fc4-236e-a85f-84ee84cf74fc.png)

[https://www.cdata.com/jp/drivers/salesforce/odbc/](https://www.cdata.com/jp/drivers/salesforce/odbc/) からドライバーをダウンロードします。30日の無償評価版があります。

DL された.exe ファイルを実行してインストールを行います。

### Salesforce アカウントに接続するDSN を設定
インストール完了後にODBC DSN 設定画面が開きます。
Salesforce に接続するには、以下の3つのプロパティの設定が最低必要です：
* User: Salesforce のユーザー
* Password: Salesforce のパスワード
* Security Token: Salesforce の「私の設定」で発行したトークン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116843/ff759409-b9ea-929a-2973-0d9f9bb41961.png)

入力したら、［接続のテスト］を押してSalesforce への接続を試します。問題がなければ［OK］を押してSalesforce への接続を確立させます。

## A5 Mk-2 からSalesforce ODBC をクエリ
### Salesforce ODBC を使う
［データベース］→［データベースの追加と削除］を開きます。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116843/e04acb78-de87-5fbe-93bd-1613ba56f8d7.png)

［64bit ODBCシステムデータソースを列挙する］にチェックを入れます。システムデータソースを利用するか、ユーザーデータソースを利用するかはどちらでもかまいません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116843/2588066d-5ecb-9c43-c20a-bfe1cf6b1452.png)

データベースとして、設定しているODBC DSN がツリービューで表示されます。CData ODBC Driver で設定されたDSN もここに表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116843/0db99672-33fa-7747-2fc2-59f1687dea49.png)

［CData Salesforce Sys］をダブルクリップします。データベースログイン画面が開くので、Salesforce のユーザーとパスワードでログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116843/61d2f3eb-51d9-42eb-2e62-e80ebd291eef.png)

Salesforce のオブジェクトがテーブル・ビュー・ストアドプロシージャにモデル化されて表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116843/1c2ff403-895e-3b2e-aa17-e4a587acc0e1.png)

［Lead］というテーブルを開いてみます。Lead オブジェクトで利用できるデータがカラムとしてモデル化されています。それぞれのカラムにはデータ型の情報も付いています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116843/f893c94a-5f71-47ba-764d-b02ce07d22ba.png)

では、実際にSQL を作成してみましょう。

## Salesforce にクエリするSQL をA5 Mk-2 で作成する
対象のテーブル・ビューを右クリックして［SQL の作成］をクリックしてクエリ作成画面を開きます。
### SELECT 文
SELECT にチェックを入れます。とりあえず全カラムを指定して条件なしでクエリしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116843/6a78cf54-5256-ff51-e8ea-9a034f14c301.png)

以下のSQL クエリが生成されました。実行ボタンで実行するとSalesforce のLead オブジェクトがクエリされ、データがテーブルとして返されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116843/311c0505-a6ef-5d9c-6c40-1adbcf955d8a.png)


```SQL
--*DataTitle "Salesforce"."Lead"
--*CaptionFromComment
SELECT
  "Id"                                            -- Id
  , "IsDeleted"                                   -- IsDeleted
  , "MasterRecordId"                              -- MasterRecordId
  , "LastName"                                    -- LastName
  , "FirstName"                                   -- FirstName
  , "Salutation"                                  -- Salutation
  , "Name"                                        -- Name
  , "Title"                                       -- Title
  , "Company"                                     -- Company
  , "Street"                                      -- Street
  , "City"                                        -- City
  , "State"                                       -- State
  , "PostalCode"                                  -- PostalCode
  , "Country"                                     -- Country
  , "Latitude"                                    -- Latitude
  , "Longitude"                                   -- Longitude
  , "GeocodeAccuracy"                             -- GeocodeAccuracy
  , "Phone"                                       -- Phone
  , "MobilePhone"                                 -- MobilePhone
  , "Fax"                                         -- Fax
  , "Email"                                       -- Email
  , "Website"                                     -- Website
  , "PhotoUrl"                                    -- PhotoUrl
  , "Description"                                 -- Description
  , "LeadSource"                                  -- LeadSource
  , "Status"                                      -- Status
  , "Industry"                                    -- Industry
  , "Rating"                                      -- Rating
  , "AnnualRevenue"                               -- AnnualRevenue
  , "NumberOfEmployees"                           -- NumberOfEmployees
  , "OwnerId"                                     -- OwnerId
  , "IsConverted"                                 -- IsConverted
  , "ConvertedDate"                               -- ConvertedDate
  , "ConvertedAccountId"                          -- ConvertedAccountId
  , "ConvertedContactId"                          -- ConvertedContactId
  , "ConvertedOpportunityId"                      -- ConvertedOpportunityId
  , "IsUnreadByOwner"                             -- IsUnreadByOwner
  , "CreatedDate"                                 -- CreatedDate
  , "CreatedById"                                 -- CreatedById
  , "LastModifiedDate"                            -- LastModifiedDate
  , "LastModifiedById"                            -- LastModifiedById
  , "SystemModstamp"                              -- SystemModstamp
  , "LastActivityDate"                            -- LastActivityDate
  , "LastViewedDate"                              -- LastViewedDate
  , "LastReferencedDate"                          -- LastReferencedDate
  , "Jigsaw"                                      -- Jigsaw
  , "JigsawContactId"                             -- JigsawContactId
  , "CleanStatus"                                 -- CleanStatus
  , "CompanyDunsNumber"                           -- CompanyDunsNumber
  , "DandbCompanyId"                              -- DandbCompanyId
  , "EmailBouncedReason"                          -- EmailBouncedReason
  , "EmailBouncedDate"                            -- EmailBouncedDate
  , "SICCode__c"                                  -- SICCode__c
  , "ProductInterest__c"                          -- ProductInterest__c
  , "Primary__c"                                  -- Primary__c
  , "CurrentGenerators__c"                        -- CurrentGenerators__c
  , "NumberofLocations__c"                        -- NumberofLocations__c
FROM
  "Salesforce"."Lead"

```

ちなみにSalesforce の画面で確認したLead はこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116843/620420af-c58a-df62-dcc6-46ccc53d1f43.png)

次にフィルタリング条件を付けてみます。［Company］カラムに絞り込みを行います。カラム数も選択で絞ります。

SQL が生成されるので、Company に［'伊達株式会社'］を入れて絞り込みます。実行します。フィルタリングも普通に機能しますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116843/599c89ae-7f9c-5a23-16b4-ad6699d29cda.png)

```SQL
--*DataTitle "Salesforce"."Lead"
--*CaptionFromComment
SELECT
  "Id"                                            -- Id
  , "LastName"                                    -- LastName
  , "FirstName"                                   -- FirstName
  , "Name"                                        -- Name
  , "Title"                                       -- Title
  , "Company"                                     -- Company
  , "Status"                                      -- Status
  , "Industry"                                    -- Industry
FROM
  "Salesforce"."Lead" 
WHERE
  "Company" = '伊達株式会社'

```


### INSERT 文
次にINSERT 処理をやってみます。

```SQL
INSERT 
INTO "Salesforce"."Lead" ("LastName", "FirstName", "Company") 
VALUES ('テスト', 'てすと','テスト株式会社')

```
1レコードがSalesforce に挿入されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116843/6a554e5f-06a5-d1d4-d3bf-4e01bed62aad.png)

試しにSELECT して確認すると確かに「テスト株式会社」が作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116843/50b521f6-f013-261a-ca67-8729158de28a.png)


### UPDATE 文
次に更新処理を行います。松平株式会社の一党25件のリードを徳川株式会社に変更します。

```SQL
UPDATE "Salesforce"."Lead" 
SET
  "Company" = '徳川株式会社'

WHERE "Company" = '松平株式会社'
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116843/425e12a0-c551-4377-fe0f-38c984be08b1.png)

処理が完了して、更新されました。

### DELETE 文
最後にDELETE 文を実行します。
「最上株式会社」のLead には消えてもらいましょう。

```SQL
DELETE 
FROM
  "Salesforce"."Lead"

WHERE 
"Company" = '最上株式会社'
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116843/c0e3b027-e230-d2c3-9e3f-0fbcb9036dd3.png)


## まとめ
おなじみのSQL 作成ツールで、CData ODBC Driver for Salesforce 経由でSalesforce を標準SQL でCRUD 操作することができました。

[CData ODBC Drivers](https://www.cdata.com/jp/drivers/salesforce/odbc/) はほかにも150 種類を超えるSaaS/NoSQL 向けのODBC Driver を用意しています。是非、無償版からお試しください。