こんにちは!
今回は、Visualforceページを作成していてよく聞く問題の対処法です。
はじめに
画面からCSVファイルを読み込んで、マスタデータを一括更新!! や 複数のレコードに画像ファイルを紐づけ!! 等のVisualforceを作成中、↓の画面のようなエラー画面に出くわした方いらっしゃいませんか。 結構厄介ですよね。これ↓
そこで、今回はJavascriptと<input type=”file”>と<apex:actionFunction>を使った回避方法を紹介します。
回避方法
回避方法をざっくりと説明すると <apex:inputFile>ではなく<input type=”file”>を使い、Javascriptで読み込んだファイルをごにょごにょし、 <apex:actionFunction>でApexを呼び出してファイルの情報を渡してる感じです。 以下サンプルです。
Visualforce
<apex:page id="pgid" controller="Sample_InputFileCon" >
<apex:form id="form_id">
<apex:actionFunction name="passToController" action="{!readCsvFile}" oncomplete="onCompleteAction('{!isSuccess}');">
<apex:param name="fname" value="" assignTo="{!filename}" />
<apex:param name="body" value="" assignTo="{!body}"/>
</apex:actionFunction>
<apex:pageMessages id="msg_id"/>
<apex:pageBlock id="pageBlock_id" >
<apex:pageBlockSection >
<input type="file" id="file_input" name="attFile" accept=".csv" /><br/>
<apex:commandButton value="CSV読み込み" onclick="remoteLocationPost(); return false;"/>
</apex:pageBlockSection>
</apex:pageBlock>
<script>
var blobfile;
function getAsText(readFile) {
var reader = new FileReader();
reader.readAsDataURL(readFile);
reader.onload = attLoaded;
}
function attLoaded(evt) {
var fileString = evt.target.result;
blobfile = fileString;
var input = document.getElementById("file_input");
var filename= input.value;
passToController(filename,blobfile);
}
function remoteLocationPost(){
var fbody= document.getElementById("file_input").files[0];
if(typeof fbody === "undefined"){
alert("CSVファイルが選択されていません。");
return;
}
else{
getAsText(fbody);
}
}
function onCompleteAction(ret){
if(ret == 'true'){
alert('CSV読み込み完了');
}
else{
alert('CSV読み込み失敗');
}
}
</script>
</apex:form>
</apex:page>
Apex
public class Sample_InputFileCon {
public String filename {get; set;}
public String body {get; set;}
public Boolean isSuccess {get; set;}
public Sample_InputFileCon(){
filename = '';
body = '';
isSuccess = false;
}
// CSV読み込み
public void readCsvFile(){
try{
body = body.substringAfterLast(',');
Blob csvFileBody = EncodingUtil.base64Decode(body);
// ファイル解析処理
// ~~~略~~~
isSuccess = true;
}
catch(Exception e){
isSuccess = false;
}
}
}
実装例(※GIFとなっています。画像をClick)
この方法を使用することで、エラーを回避し、処理を実現することができます!
こんにちは!
Force.com Sites 構築中、 robots.txtについて調べる機会がありました。 そこで今回は、Sites開発におけるrobots.txtの設定・作成方法についてまとめます。
下記、目次になります。
※robots.txtについては、下記をご参照ください。 Search Console ヘルプ – robots.txt ファイルについて (さらに…)
こんにちは!
Visualforceページの開発では、reRenderでページの一部を動的に書き換える方法を取ることが多いと思います。 コンポーネントのIdを指定するだけなので、手軽で便利ですよね。 ただ、便利なreRenderにも落とし穴があります。 今回は以下の流れで、現象とその対策を紹介していきたいと思います。
- ・reRenderを使用したVisualforceページは多い
- ・reRenderがもたらすユーザビリティの低下
- ・History APIを使った対策
- ・実装例:History API・Javascript
- ・実装例:Visualforce・Apex
- ・まとめ・サンプルコード
※本記事はSalesforce Classicを対象とした記事になっております。
こんにちは!
Saleforceのグローバル検索、便利ですよね。
でも、思うように検索結果が返ってこない、ということありませんか?
または、「ん?何でこれが検索結果でHITするんだ?」とか。
と、いう訳でグローバル検索の動きについてまとめてみました。
★グローバル検索についてまとめてみた
1.グローバル検索のルール
●まずはグローバル検索の基本的なルールから。
- ・全角のみの文字列は1語として扱われる
- ・英字のみの文字列は1語として扱われる
- ・数字のみの文字列は1語として扱われる
- ・数字と英字など、複数の文字種類が混在した場合は、それぞれ連続している文字種類で1単語として扱われる。
→例えば…
検索語が「AA0099」の場合→「AA」と「0099」
検索語が「AA00CD」の場合→「AA」と「00」と「CD」 - ・検索キーワードは2文字以上指定する必要がある。
●グローバル検索対象のオブジェクト等はこんな感じです。
カテゴリ | 可能な検索 | 不可能な検索 | 備考 |
対象オブジェクト | タブ化しているオブジェクト | タブ化していないオブジェクト | |
参照可能な項目 |
テキスト テキストエリア ロングテキストエリア リッチテキストエリア 数値 通貨 電話 |
数式 参照関係の値 選択リスト 日付 |
画面非表示の項目も検索対象となる |
ワイルドカードを使用した検索 |
中間一致 前方一致 |
後方一致 英数字記号等混在 |
2.実際に検索してみよう
○例1○
あるオブジェクトのテキスト項目に「001919」というデータがある場合、グローバル検索を行うと以下の様な感じになります。
「001919」→検索される
「0*1919」→検索される
「*01919」→検索されない(※後方一致では「*」は使用できない)
「*1919」→検索されない(※後方一致では「*」は使用できない)
「1919」→検索されない(※「1919」で開始するデータを検索する)
○例2○
あるオブジェクトのテキスト項目に「A01919」というデータがある場合、グローバル検索を行うと以下の様な感じになります。
「A01919」→検索される
「*01919」→検索される(※「A」と「01919」が別単語の扱いとなるため、検索される)
「A*1919」→検索されない(※この場合のワイルドカードは英字のものを検索しにいく)
「1919」→検索されない(※「1919」で開始するデータを検索する)
○例3○
あるオブジェクトのテキスト項目に「ABCD1919」というデータがある場合、グローバル検索を行うと以下の様な感じなります。
「ABCD1919」→検索される
「AB」→検索されない(英単語部分が「AB」であるデータを検索しに行く(この場合は、ABCDで1単語とみなされるため検索されない)
「AB*」→検索される
「*BC*」→検索されない(後方一致がされないため、英字部分が「BC」で始まるデータを検索しにいく)
「AB*D」→検索される
「*1919」→検索される
文字種類で単語を区切って検索をかけているのがグローバル検索の特色ですね。
ちなみに、このグローバル検索のルールはSOSLにも適用されます。
グローバル検索については、以下も参照ください。
検索機能を利用した情報の検索(Salesforceヘルプ)
Salesforce Classic での検索の制限(Salesforceヘルプ)
グローバル検索でレコードが見つからない(Salesforceナレッジ)
こんにちは!
小数点の項目を数式で参照することってありますよね?
その際に発見した小ネタを今回はご紹介します。
Salesforceに関する小ネタ。小数点項目を数式で参照する場合の注意事項
例えば、こんな項目を作ったとします。
・請求額(BillingAmount__c)(通貨(18,0))
・粗利率(GrossMargin__c)(パーセント(3,2))
・請求額/粗利率(BillingAndGross__c)(数式(テキスト)) → TEXT(BillingAmount__c) + “/” + TEXT(GrossMargin__c * 100)
この設定の状態で、
請求額:1000
粗利率:0.5%
という風に登録を行い、請求額/粗利率を画面で表示すると、標準画面とVisualforce画面で表示が変わってしまいます。
標準画面の場合
Visualforceページの場合
このように、Visualforceページでは、1の位が0の小数点項目を数式で参照すると、0が除外されてしまう現象が発生してしまいます。
これは、数式を以下の様に修正することで、標準画面でもVisualforceでも対応する項目になります。
IF(LEFT(TEXT(GrossMargin__c * 100),1)=”.”, TEXT(BillingAmount__c) + “/”+ “0” + TEXT(GrossMargin__c * 100),TEXT(BillingAmount__c) + “/” + TEXT(GrossMargin__c * 100))
小数点を参照する数式項目に対して、標準画面とVisualforce画面両方で利用する場合に、利用してみてください。
こんにちは!
ロングテキストエリア、リッチテキストエリアはSOQLのWHERE句に対応していないため、
ロングテキストエリア、リッチテキストエリアに対して絞り込みを行いたい場合は、SOQLではなく、
SOSLを使う必要があります。
※ちなみに、ロングテキストエリア、リッチテキストエリアをSELECT句に指定することは可能です。
SOQLじゃないよ!SOSLの活用法!
SOSLの構文は
・FIND 検索キーワード IN ALL FIELDS RETURNING 検索対象オブジェクト名(取得項目)
となります。以下の様に、複数オブジェクトにまたがって検索することも可能です。
・FIND 検索キーワード IN ALL FIELDS RETURNING 検索対象オブジェクト名1(取得項目),検索対象オブジェクト名2(取得項目)…
また、Dynamic SOQLを実行する場合は「Database.query」を使用しますが、Dynamic SOSLを実行する場合は、「Search.query」を使用します。
下記は、SOSL実行のサンプルです。
searchText変数に画面から入力した条件が設定され、Hoge__cオブジェクトに対してキーワード検索を行います。
public List<Hoge__c> hogeList {get;set;}
public String searchText {get;set;} // 画面から入力した検索条件
public void sampleSoslExec(){
String query = ‘FIND ‘*’ + searchText + ‘*’ IN ALL FIELDS RETURNING Hoge__c(Id, Name)’;
List<List<sObject>> searchList = search.query(query);
hogeList = searchList[0]:
}
}
検索結果はネストしたsObjectのリストに格納されます。
複数オブジェクトを検索対象にしている場合は、SOSLに記載したオブジェクトの順番でリストに格納されます。
※このサンプルでは、1オブジェクトのみを対象で取得しているため、リストの0番目にHoge__cが格納されています。
SOSLを使用する場合は以下の点に注意が必要です。
1)SOQLとSOSLはガバナ制限が異なります。
○SOQL実行回数→1トランザクションにつき、100回
○SOSL実行回数→1トランザクションにつき、20回
※最新の情報はSalesforceのリファレンスを参照ください
2)SOSLはグローバル検索と同じ仕組みとなります。(※グローバル検索の仕組みについてはSalesforceのヘルプを参照ください)
○1文字の検索は不可(エラーとなる)
○検索するカラムが指定できない(指定した全オブジェクトのカラムに対し、検索が実行されます)
→機能の要件によっては、SOSLでのデータ取得後、Apex処理内で更にマッチングの処理を追加する必要があります。
○文字の種類で区切って検索される
(例)
登録データが以下の場合、「TEST0001」で検索を実行すると、下記4件がすべて抽出されます。
※「TEST」というキーワードと「0001」というキーワードが別で検索されるため。
TEST0001
TEST0002
TEST0003
SAMPLE0001
グローバル検索同様に少し癖はありますが、使いこなせると便利です。
是非ご活用ください。
ソフトウェア開発を行う際、知っておきたい情報をまとめました。
「超上流から攻めるIT化の事例集」(IPA(独立行政法人情報処理推進機構))
「システム化の方向性と計画」及び「要件定義書」の事例サンプルとフォーマットが掲載されています。
「安全なウェブサイトの作り方」(IPA(独立行政法人情報処理推進機構))
「安全なウェブサイトの作り方」は、IPAが届出を受けた脆弱性関連情報を基に、届出件数の多かった脆弱性や攻撃による影響度が大きい脆弱性を取り上げ、ウェブサイト開発者や運営者が適切なセキュリティを考慮したウェブサイトを作成するための資料が掲載されています。
また、別冊で、「安全なSQLの呼び出し方」と「ウェブ健康診断仕様」も掲載されています。
SSLサイト評価(Qualys SSL LABS)
ホストネームを入力すると、Certificate、Protocol Support、Key Exchange、Cipher Strengthの4項目でABC評価を行ってくれます。
Web Content Accessibility Guidelines (WCAG) 2.0(ウェブアクセシビリティ基盤委員会による日本語訳)
ウェブコンテンツをアクセシブルにするためのガイドラインです。
HTML文法チェッカー(W3C)
URLを入力するか、htmlファイルをアップロードするか、直接htmlを入力又はコピー&ペーストすると、html構文の文法をチェックしてくれます。
CSS3文法チェッカー(W3C)
URLを入力するか、cssファイルをアップロードするか、直接cssを入力又はコピー&ペーストすると、css構文の文法をチェックしてくれます。
リンク切れチェッカー(W3C)
URLを入力すると、リンク切れをチェックしてくれます。
QRコード作成サイト(株式会社シーマン)
簡単にQRコードが作成できます。