crmprogrammer38の日記

主にDWHやSalesforceのプログラムメモです。

【Java】Interfaceやabstract classが何となく理解できた時の思い出

最初のプログラム言語はJavaでした。インスタンスやクラス、インターフェースや抽象クラス、キャストなど色々な横文字が大量に出てきて何が何やらわからず、苦労した思い出があります。(当時、WebObjectsというAppleのWebフレームワークを利用していました) …

【Salesforce】重複ルールで作成・編集を許可している時の、標準画面以外からのデータの登録について

Salesforceで、重複ルールという機能があります。(前はなかったのですが、とても欲しかった機能でした。実装されてちょっと嬉しかったです) 重複ルールの設定次第では、重複レコードが他にあった際に警告は出るが保存できるということができます。 この設…

【Excel】セルの表をtableタグで出力するマクロをバージョンアップしました

以前、Excelの表をhtmlのtableタグに変換するマクロを作成しました。 crmprogrammer38.hatenablog.com 使っていくうちにやっぱりこうしたほうがいいかなとか考えていき、次のように改良しました。 マクロの中でセルの値をValueで取得していた箇所をTextで取…

【Salesforce】APIの「renderEmailTemplate」「renderStoredEmailTemplate」を使ってみた

前回SalesforceのAPIについて書きました。使ったことのないメソッドが増えているなーと思い、まず「renderEmailTemplate」「renderStoredEmailTemplate」を使ってみました。 「renderEmailTemplate」 String endpoint = "https://login.salesforce.com/servi…

【Salesforce】APIで用意されている機能について

SalesforceにはいくつかのAPIが用意されています。こういうことをやりたいときにこれを使えばいいというのがわかるようにまとめてみました。Rest API、Bulk APIは外していて、SOAP APIに限定しました。(APIVer40の時に書いています) メソッド 処理内容 どのA…

【SQL】Window関数を理解できた時の思い出2

SQL

前の続きです。 crmprogrammer38.hatenablog.com Window関数では、Windowの中で並び替えをした順番に各行で計算する仕組みがあります。例としては累計の計算になります。(BIツールで、ランニングサムの名称がついていたりします) 以下の年別累計の項目は、…

【SQL】Window関数を理解できた時の思い出

SQL

はじめてのデータベースは、Oracle8でした。 その時はWindow関数自体なく、検索条件と結合条件を入り混じるSQLを書いていました。 その後Oracle9になって、SQLも変化していましたが、Window関数とは距離を置いていました。あまり使う必要性を感じなかったの…

【SQL】よくやってしまう間違い(割り算や型変換)

SQL

気を抜くとすぐ忘れてしまうのでメモ。(メモしたから忘れないわけではないですが) 書き方の例でnullif関数を使っていますが、適宜データベースで用意されている関数に置き換えが必要です。 SQLの割り算では分母が0の時はnullに変換する 0除算エラーの対策…

【Salesforce】直接XMLでSalesforce APIを操作する

WebServiceのSOAPメッセージのデバッグについて書きました。 crmprogrammer38.hatenablog.com これを行うことで、SOAPメッセージが拾えるので、xmlをpostして、xmlで結果が返ってくるというシンプルな処理でSOAP APIを行うことができます。wsdlクライアント…

【Java】JavaのWebServiceライブラリのクライアントプログラムでSOAPメッセージをデバッグする

前に、いくつかのJavaライブラリでSalesforceのSOAP APIを扱うという内容を書きました。 crmprogrammer38.hatenablog.com さらに追記で、上記のJavaライブラリでSOAPメッセージをデバッグするやり方になります。 Axis1.4 log4j.propertiesで指定します。なの…

【Java】「Apache Velocity」と「StringTemplate」の性能を比べてみる

前回StringTemplateの記事を書きましたが、Apache Velocityと性能を比べてみました。 Apache Velocityではまったこと テンプレートの書き方を忘れていて、テンプレートで変数のプロパティを指定する場合getterが必要でした。。 例えば、Apache Velocityのテ…

【Java】「StringTemplate」ライブラリを使ってみました

Javaで、「StringTemplate」のライブラリを使ってみました。 はじめに Javaのテンプレートエンジンは、Apache Velocityを代表として色々なものがあると思います。VelocityはVTLが使いやすいのですが様々な理由でVelocity以外が使いたいときもあると思います…

【Salesforce】Apex開発で最初の頃にやってしまった間違い

Java開発の後、Salesforceの開発を始めたのですが、当初色々間違いや勘違いがありました。思い出すことがあったので書いてみます。 booleanの変数の扱い Javaですとboolean変数は true/false のプリミティブ型で、Booleanと書くとオブジェクトとなりますが、…

【SQL】縦横変換で気をつけていること

SQL

SQLで縦持ちから横持ちへ変換、横持ちから縦持ちの変換を行うことは多いと思います。 横持ちから縦持ちへの変換は、union all を使うことで実現ができ、union allはどのデータベースでも使えるので困ることは特にありません。 ですが、縦持ちから横持ちへの…

【Salesforce】ナレッジを一括で公開する

Salesforceのナレッジをまとめて登録し、そのまま公開したい場合があります。 その際のやり方は次のようになります。 ナレッジをまとめて登録する データローダをはじめとするAPIで登録が可能です。 上記の、ナレッジの記事タイプの詳細で表示されているAPI…

【Salesforce】SOQLの検索条件で、半角全角の区別ではまったこと

SOQLで検索条件は、半角全角の区別ではまりました。何ではまったかというと、検索条件で指定したのは半角なのに、検索結果に全角も含まれていたからです。 はまった経緯は次です。 半角の"x01"と全角の"x01"は分けてコード登録を行います。 Apex処理内で…

【Salesforce】パーセント項目をApexで普通に掛け算すると100倍になる

Salesforceのパーセント項目の使い方を間違って値が100倍になってました。 間違った理由は、数値項目とパーセント項目を単純に掛け算したからで、正しい使い方は、数値項目とパーセント項目を掛け算した後、100で割る必要があります。 例えば、「24%」 とい…

【Excel】複数のExcelファイルのセル値をまとめてセットするマクロを作りました

同じフォーマットのExcelファイルが複数あって、まとめてセル値を更新したい時があります。 例えば、DBのテーブル定義書をテーブル単位にファイルを分けていて、各テーブルのラベルや物理名を特定のセルに入れる場合などがあると思います。 そんな時に使える…

【Salesforce】自動採番項目をupsertの外部ID(externalIdField)として使う

Salesforceで自動採番項目を外部IDにできるようになりました。 Apex内でupsertのキーとして使用できるようになりましたが、DataLoaderをGUIで使う時はupsertの外部IDとして選ぶことができません。 Help | Training | Salesforceの記載には、 データローダは …

【雑記】Java開発ではまった思い出(JDBCやlog4J)

久しぶりにJavaを使うことがありました。 だいぶ前に、JavaのWeb開発をしていてその時にはまったことをふと思い出しました。 WebLogicのDataSourceのConnectionをcloseしておらずエラー インスタンスを起動してしばらくすると、DBのConnectionが取得できずエ…

【Salesforce】文字化けの制御で注意したいこと

他のシステムとの整合をとるため、Salesforceで入力できる文字を制限をかけたり、変換したい場合があります。 次のような要件があると思います。 Shift_JISで定義されていない文字をエラーとしたい Shift_JISで定義されていない文字は、全角四角"□"に変換し…

【Excel】テンプレートテキスト内の変数を展開してテキスト出力するマクロを作りました

あるテキストの中身を、一部書き換えて別のテキストを作りたい時があります。 例えば、Salesforceでロールや、公開グループ、キューなどを作成する場合に、ファイルの名前とファイル内の一部を変更すればデプロイで新規作成ができます。 ※ロールや公開グルー…

【Salesforce】Apexで共有オブジェクト(・・Share)にロールを指定する

Salesforceで特定のユーザにデータを参照・編集させる設定は、共有設定を使うか、Apexで共有オブジェクトを操作するかになります。 共有オブジェクトに特定のユーザのロールを指定したい時があります。 例えば、代表者(User)を入力すると、その代表者は「参…

【Salesforce】ユーザの「承認申請メールを受信する」項目をまとめて更新したい時

結論として、データローダや、ApexClassでまとめて更新する手段が用意されていないようです。少し作業を効率化できるちょっとしたアイデアを書きます。 「承認申請メールを受信する」項目をまとめて更新したい時 例えば、そもそも承認申請のメールが不要であ…

【SQL】MS-ACCESSで、結合条件で大文字・小文字を区別する

SQL

MS-ACCESSの結合は、通常では大文字・小文字の区別がありません。たまに、大文字・小文字を区別して結合をしたい時があります。例えば、Salesforceの15桁のSalesforceIDで結合する場合などです。 そんな時には、「strcomp(項目1, 項目2, 0) = 0 」を使うこ…

【Salesforce】メタデータ「フィード条件(CustomFeedFilter)」エクスポート時にエラーとなる件

エクスポートしようとするとエラーが発生するメタデータコンポーネントがあります。それは、「フィード条件(CustomFeedFilter)」なのですが、エクスポートしようとすると"UNKNOWN_EXCEPTION msg: null: Need to specify full name, Name:XXX, Delimiter:."と…

【Salesforce】データローダのコマンドライン操作のメモ

ETLツールがない場合など、Salesforceとのバッチ連携はCSVファイルとデータローダのコマンドラインの組み合わせになると思います。(APIで開発は意外と手間がかかりますし) データローダをコマンドラインで使った際のメモを書いておこうと思います。 日付型…

【Salesforce】データ移行時のトリガスキップについて考えたこと

データ移行では、既存のデータを確実に移行したいのでトリガを動かしたくない時があると思います。その制御の方法について考えてみました。 No.3のユーザのカスタム項目の制御がいいかなと思っていますが、要件として、トリガをスキップしたい時スキップした…

【Salesforce】EventLogFileのユニークキー

監査ログとしてEventLogFileの内容をデータベース、Database.com、AnalyticsCloudなど別のシステムに蓄積したいという要件があると思います。 ユニークなキーが欲しいなと思い調べたのですが、結論として、イベントログのCSVの中には、キー項目はありません…

【Excel】VBAでセルの表をtableタグで出力するマクロを作りました

Excelで作成した表をtableタグに変換するVBAマクロを作成しました。 ダウンロードはこちらからになります。 次のように操作します。 ①作成した表を選択します。(選択範囲がtableタグになります)②tableタグ出力ボタンをクリックします。 そうすると、ポップ…

【Java】beanshellでSalesforceのメタデータ削除ツールを作りました

メタデータを削除したい時があります。 間違えてカスタム項目をたくさん作ってしまった キューを作ると自動で作成されるビューを削除する こんな時にまとめてメタデータを削除できるツールです。 ツールはbeanshellで作成しています。 ダウンロードはこちら…

【Java】beanshellでSalesforceのファイル(添付ファイル、ドキュメント、イベントログ)のエクスポートツールを作りました

SalesforceのバイナリファイルはSOQLで取得することができます。 例えば添付ファイルはAttachmentというオブジェクトから取得できます。 ですが、SOQLでオブジェクトからデータを取得するとbase64エンコードされた文字列となるため、バイナリにデコードして…

【Java】beanshellが使いやすい

Javaでスクリプトを実行する仕組みは色々ありますが、Javaコードがほぼそのまま実行できる点でbeanshellはとても使いやすいなと感じています。(でも、ジェネリクスや、可変長引数は対応してないので、うっかり書いてしまうとエラーの解決に時間がかかります…

【Salesforce】コマンドラインのメタデータのエクスポートツールのAPIバージョンをあげました(apiver40.0)

Summer'17(apiver40.0)のエクスポートツールはこちらです。 api39.0のものや、使い方は前回の記事を参照ください。 crmprogrammer38.hatenablog.com 修正履歴 2017/7/24 CustomFeedFilterのダウンロード時にエラーとなる事象の対応を行いました。具体的に…

【Java】wscでSalesforce APIを使用する

まずはサンプルコード ConnectorConfig connectorConfig = new ConnectorConfig(); String soapEndpoint = "https://login.salesforce.com/services/Soap/u/39.0"; connectorConfig.setAuthEndpoint(soapEndpoint); connectorConfig.setManualLogin(true); c…

【Java】apache cxfでSalesforce APIを使用する

まずはサンプルコード URL wsdlurl = Soap.class.getClassLoader().getResource("/partner.wsdl"); Soap soapBinding = new SforceService(wsdlurl).getSoap(); BindingProvider bp = (BindingProvider)soapBinding; bp.getRequestContext().put(BindingProv…

【Java】wsimportでSalesforce APIを使用する

まずはサンプルコード Soap soapBinding = new SforceService().getSoap(); WSBindingProvider provider = (WSBindingProvider)soapBinding; Map<String, Object> reqContext = provider.getRequestContext(); reqContext.put(WSBindingProvider.ENDPOINT_ADDRESS_PROPERTY, </string,>…

【Java】axis2でSalesforce APIを使用する

まずはサンプルコード String url = "https://login.salesforce.com/services/Soap/u/39.0"; SforceServiceStub soapBinding = new SforceServiceStub(url); Options options = soapBinding._getServiceClient().getOptions(); options.setProperty(HTTPCons…

【Java】axis1.4でSalesforce APIを使用する

まずはサンプルコード SoapBindingStub soapBinding = (SoapBindingStub)new SforceServiceLocator().getSoap(); soapBinding._setProperty(org.apache.axis.transport.http.HTTPConstants.MC_ACCEPT_GZIP , "true"); soapBinding._setProperty(org.apache.a…

【Java】色々なJavaライブラリでSalesforceAPIを使う

SOAP APIのJavaクライアントには、色々なライブラリがあります。それぞれのJavaライブラリでSalesforce APIを使ってみた結果をまとめてみます。 サマリ Java ライブラリ SOAP API Metadata API xsd:intにバインドされる型 データバインディングの性能 Axis1.…

【Salesforce】apex:outputText で 日付/時間型はGMTで表示される

outputTextでは、日付/時間型の項目がGMTで表示される仕様ではまりました。 時間まで出力していれば、ずれてるのは比較的気づくのですが日付までしか表示していなかったため発見に時間がかかりました。。 [日付がずれる書き方] <APEX:OUTPUTTEXT value="{0, date, yyyy/MM/dd}"> <APEX:PARAM value="{!items.datetimefield }"></APEX:PARAM></APEX:OUTPUTTEXT> [日付がずれない書き方] <APEX:OUTPUTTEXT value="{0, date, yyyy/MM/dd}"> …</apex:outputtext>

【Salesforce】 JavaScript FileReaderとsforce.connectionを使って添付ファイルを登録する。

現場写真を保存したり、処理で必要となる書類をPDFで保存したりなどSalesforceにファイルを保存することは多いと思います。 写真はプレビューで確認してから登録したいなど、ファイルを登録する際に便利なのがJavaScriptのFileReaderだと思いますが、FileRea…

【Salesforce】キューをデータローダで作成する。

キューをデータローダで作成したい キューもかなりの数になると画面から設定で作成するのは大変ですし、ミスも増えてくると思います。そこでデータローダでキューを作成する手順の紹介です。 [キューに関連するデータモデル] オブジェクトとキューの登録画面…

【Salesforce】編集ボタンを上書きしたら、参照画面でインライン編集ができなくなることの対策

Visualforceで編集ボタンを上書きしたら、参照画面でインライン編集できなくなるんですね。 [編集ボタン上書き前の参照画面] [編集ボタン上書き後の参照画面] インライン編集できないと不便なので、参照ボタンも次のVisualforceで上書きしてインライン編集が…

【Salesforce】Decimal.round()とDecimal.setScale()は、RoundingModeを指定しないとHALF_EVENです

1円の単位で金額がおかしくなる現象が発生 Decimalのroundは引数を指定しないと、HALF_EVENでした。 RoundingMode.HALF_UPを引数で指定しないと四捨五入になりませんでした。 横着してはいけないですね。。 以下RoundingMode別のround後の値です。 値 Roudin…

【Salesforce】Id.getSobjectType() を使ってオブジェクトを特定する。

親オブジェクトがどれかを判断したいときがある 添付ファイル(Attachment)の 参照先 ID(ParentId) ToDo(Task)の 関連先 ID(WhatId)行動(Event)の 関連先 ID(WhatId) など複数の参照先オブジェクトを指定できる項目があります。 トリガ処理などで、特定のオブ…

【Salesforce】1度のSOQLで選択リストの値(表示ラベル)とAPI 参照名を取得する。

toLabelで表示ラベルを取得する 例えば次のような選択リスト項目「PickTest__c」があります。 1) 項目をselectした場合 選択リスト項目は、オブジェクトには、API 参照名がセットされていて、Apexコードと実行結果は次の通りです。 [Apex] List<Sample__c> rows = [Sele</sample__c>…

【Salesforce】 Excel VBAからSalesforce API呼び出しと、TLS1.0無効化の件

SalesforceとはTLS1.0では通信できない 脆弱性のため、TLS1.0は無効となり、ブラウザの設定変更、APIを使ったアプリケーションの対応が必要となりました。 バージョンアップで対応できるものはいいのですが、VBAは対応が難しいなと思っています。ExcelからSa…

【Salesforce】カスタムボタンで、WebServiceの戻り値をMsxml2.XMLHTTPでsendする際にはまったこと

カスタムボタンで、Msxml2.XMLHTTPを使って別のシステムと接続する際にはまったことのメモになります。 やりたかったことは、 1.カスタムボタンで、文字列を戻すカスタムWebServiceをコール。 2.戻り値で取得した文字列を、Msxml2.XMLHTTPのsendで別シス…

【Salesforce】コマンドラインのメタデータのエクスポートツールを作りました。(apiver39.0)

メタデータを使うシーンは多い 1.開発時のバックアップ 2.デプロイ用のモジュール 3.モジュールリリース後の確認 上記のような場面で何かと必要となるメタデータですが、「Force.com IDE」や「Force.com Migration Tool」のメタデータダウンロード機能…