• Taiki Yoshikawa
  • NEWBIE
  • 74 Points
  • Member since 2012
  • Force.com Developer
  • Salesforce DUG Tokyo


Badges

  • Chatter
    Feed
  • 165
    Best Answers
  • 1
    Likes Received
  • 2
    Likes Given
  • 2
    Questions
  • 665
    Replies
コミュニティユーザが自身のログインパスワードを変更できないようにしたいです。

パスワード変更機能自体を防ぐことは難しいと思いますが、間接的にでも良いのでコミュニティユーザがパスワードを変更できないようにする方法はあるでしょうか。
完全に封じることができずとも、ある程度防げる形でも構いません。

よろしくお願いします。
現在Lightningコンポーネントを開発中で、コンポーネントを埋め込むページ内からどのページに埋め込まれているかを判断する方法を探っています。

例えば、下記のようなURLのページ内に配置したコンポーネントから「Contact」や「Lead」部分を取得したいのですがどのようにすればよいのでしょうか?
/lightning/r/Contact/0032v0000*********/view
/lightning/r/Lead/0032v0000*********/view

よろしくお願いします。
 
AppExchangeアプリメーカです

ユーザのログイン履歴で、スマートフォンのSalesforceアプリは
「アプリケーション」で「Salesforce for iOS」と表示されるのですが、
当社アプリは「ブラウザ」と表示されます。
「アプリ名」を表示させる方法はをご教示いただけませんでしょうか。

○Salesforceアプリ
アプリケーション:Salesforce for iOS

○当社アプリ
アプリケーション:ブラウザ

※ブラウザアクセス禁止設定だと利用できないため、アプリ名にしたい
特定のカスタムオブジェクトに添付ファイルが投稿された際に動作するApex Triggerを作成しています。

添付されたのがどのカスタムオブジェクトなのかを判定する方法として、添付ファイルの親カスタムオブジェクトID(ParentId)をハードコードして判定する方法を利用しているのですが、SandboxとはカスタムオブジェクトIDが異なっているため、リリース前に書き換えるという手段をとっています。

Sandboxと本番組織で同一のコードでカスタムオブジェクトを判定する方法はないでしょうか?
Lightningの標準レコードページを使用しています。
コピーのボタン押下により、参照中のレコードデータが入力された状態の新規レコード用ダイアログが出ますが、
例えばレコードのステータスや日付が入るような項目はコピーの対象から外し、空白の状態でコピーがしたいです。
上記のようなことを実現するためにはどうしたら良いでしょうか。
よろしくお願いします
お世話になっております。

以下のトレイルのChallenge(テスト)を実施したところ、1問不正解という結果になりました。

アドミニストレーター認定資格の更新 (Spring '19)・Spring '19 の新機能の学習
https://trailhead.salesforce.com/ja/content/learn/modules/administrator-maintenance-spring19/learn-whats-new-in-spring19

その設問は6問目の「システム管理者がマクロ内で指定できるマクロ実行時からの相対日時はどれですか?」で、Dの「分後」を選択して不正解となりました。
この設問に対応するのは「マクロでの相対日付を使用した正確な日時の設定」だと思うのですが、ここでは以下のように説明されています。

日時を操作する場合、相対日付で次の内容を指定できます。
  • 分後
  • 時間後
  • 日後
  • 週間後

この内容であれば、相対日付として「分後」が使用できるので、Cの「時間後」とDの「分後」は正答だと思うのですが、どういうわけかDの「分後」だと不正解になってしまいます。

なぜ「分後」では不正解になってしまうのでしょうか。
どなたかわかる方がいらっしゃいましたら、お知恵をいただければと思います。
よろしくお願いいたします。
 

 

 

お世話になっております。

Bootstrapでデザインを行っているのですが、ある条件下で一部の表示が異常になることがわかりました。
こちらをVisualforce上で解決する手段はありますでしょうか。

<現象>
apex:selectListの選択肢がずれ、選択肢が消えてしまったり余白ができてしまったりする(下記画像赤枠部分)
(本番環境に一度アップロードしているため、企業や業務が特定できそうな内容は消しております)
User-added image

<発生した条件>
  • ブラウザが「Google Chrome」
  • 対象のVisualforceページを「コンソール上で」表示する
  • ディスプレイを2つ使用し、「メインディスプレイと拡大率の異なるサブディスプレイ上で」表示する
    • メインディスプレイより小さいと選択肢が一部消え、大きいと余白が発生します

<VIsualforceコード>
(本番環境に一度アップロードしているため、選択肢近辺のみを抜粋し、企業や業務が特定できそうな内容は消しております)
<apex:page showHeader="false" sidebar="false" standardStyleSheets="false" controller="CalendarPageController" docType="html-5.0">
	<style>
		th, td{text-align: center; vertical-align: middle; font-size: small;}
        body{font-size: small;}
	</style>
	<script type='text/javascript' src='/soap/ajax/29.0/connection.js'></script>
	<script type='text/javascript' src='/soap/ajax/29.0/apex.js'></script>
	<apex:stylesheet value="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css"/>
	<div style="text-align: center;" id="centeringDiv" onLoad="FixedMidashi.create();">
		<apex:form id="form">
            <div>
                <apex:outputText styleClass="header" style="text-align:center;"><h5 style="color: '#6c757d';">  カレンダー      </h5></apex:outputText>
                <apex:commandLink action="{!replaceTargetToLastMonth}" value="<< {!lastYear}年{!lastMonth}月"/>
                <apex:outputText styleClass="header" style="display: inline; font-size: medium;" value=" {!targetYear}年{!targetMonth}月 "/> 
                <apex:commandLink action="{!replaceTargetToNextMonth}" value="{!nextYear}年{!nextMonth}月 >>"/>
                <apex:messages styleClass="alert alert-danger" style="text-align: left;"/>
            </div>
            <div class="form-group">
                <div class="d-inline-flex">
                    <apex:selectList value="{!selectedWeekString}" size="1" styleClass="form-control">
                        <apex:selectoptions value="{!monthOrWeekSelectList}"/>
                    </apex:selectList>
                </div>
                <div class="d-inline-flex">
                    <apex:selectList value="{!       IdString}" size="1" styleClass="form-control">
                        <apex:selectoptions value="{!       SelectList}"/>
                    </apex:selectList>
                </div>
                <div class="d-inline-flex">
                    <span class="input-group-append">
                        <apex:commandButton value="表示する  ・期間を選択" styleClass="btn btn-info" action="{!selectMonthOrWeek}"/>
                    </span>
                </div>
            </div>
		</apex:form>
	</div>
	<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js" integrity="sha384-cs/chFZiN24E4KMATLdqdvsezGxaGsi4hLGOzlXwp5UZB1LY//20VyM2taTB4QvJ" crossorigin="anonymous"></script>
	<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js" integrity="sha384-uefMccjFJAIv6A+rW+L4AHf99KvxDjWSu1z9VI8SKNVmz4sk7buKt/6v9KI65qnm" crossorigin="anonymous"></script>
</apex:page>

以上、よろしくお願いいたします。
そのほか、必要な情報がありましたら可能な範囲で追記します。
主レコード:A
従レコード:B
があり、このAレコードとBレコードを1つのVisualforce画面で更新できるようにします。

このVFページのコントローラで
update B;
update A;

のようにした時に、Bをupdateした時点でプロセスビルダーが起動しAレコードの項目を一部更新します。
その後Aのupdate処理が行われるのですが、プロセスビルダーで更新した値を上書きしてしまいます。
(順番で考えれば当たり前なのですが。。)

Aのupdate時に値を上書きしないような更新方法はありますでしょうか。
参照関係があるテキストボックスにLIKE検索を行い、
invalid operator on id fieldエラーが発生しました。

IDを持つデータにLIKE検索できないというのは認識したのですが、
どの様に対処したらいいかが不明です。

他ページにての中に
https://developer.salesforce.com/forums/?id=906F00000009BPRIA2
>数式(テキスト型)にWhatId(ID)をコピーすることで検索可能です。
とあったのですが、いまいち何をすればいいのかわかっておりません。

理解不足で大変申し訳ないのです・・・
お時間ありましたら回答頂けると助かります。

 
  • June 05, 2018
  • Like
  • 0
SalesForceとLightningの標準画面に独自CSSを読み込む手順・方法を教えてください。
静的リソースにcustomcssをアップロードしましたが、標準画面のレイアウトに反映することができませんでした。
Salesforce初心者で何もわかりません。
宜しくお願いいたします。
お世話になっております。

本番環境からsandboxを作成しようとすると、
「このsandboxをコピー」というものがありました。
このリンクの意味は何になるでしょうか。

ちなみに、「更新」のリンクは、
最新の本番環境をsandboxにコピーするものかと思いますが、
「このsandboxをコピー」との違いは何になるのでしょうか。

 
  • April 08, 2018
  • Like
  • 0

初めて投稿いたします。
私は開発会社の所属ではありませんが、色々と試したいこと調べたいことがあり、developer editionに登録しました。
いろいろといじっている中、開発をお願いしたいベンダーさんを管理ユーザーに追加したいのですが、developer editionはユーザーが追加できるのでしょうか?

設定>管理>ユーザーの管理>ユーザーで、一人追加し、ユーザーライスエンスをデベロッパーの場合はどれを選んで良いかわからずsalesforceとし、プロファイルをシステム管理者としました。

そうしましたところ、ユーザーを追加してくださいというメッージが表示されました。

developer editionで管理ユーザーや開発ユーザー、使用者のテストのユーザーなどどのように取り扱えすれば良いでしょうか?
よろしくお願いいたします。
 

お世話になっております。

以下、AppExchangeの「郵便番号検索」にて、
https://appexchangejp.salesforce.com/appxListingDetail?listingId=a0N300000016aMeEAI
取引先標準レイアウトの住所を、jsで拡張している実装を見かけ、標準レイアウトの参照・詳細ページを
操作を加えることはできない認識であったので、どのようにしているか興味がありました。

どのように回避して、実装できていると考えられますでしょうか。


 
  • February 12, 2018
  • Like
  • 0
はじめまして、Horiと申します。

現在、AppExcahnge経由で、あるアプリケーションを購入予定です。
購入後は、同アプリケーションのデータを、REST APIを使ってアクセスしようと考えています。

そのアプリケーションを開発したベンダに、REST APIを使ってアクセスできるかを問い合わせたところ、
SalesForce社との間で、REST APIを使ってアクセスする旨の契約をしないと、アクセスできないと回答されました。
開発ベンダの都合ではなく、SalesForce社から契約をするよう求められるはずだと言うのです。

大変、意外な回答でした。
当方は、接続アプリケーションを作成し、OAuthで十分な権限を与えておけば、自作のアプリやSalesForce社提供の
アプリと同様、REST APIでアクセスしても構わないのだと思っていました。

購入予定のアプリは、Force.com上に実装されているとのことで、アプリを購入すれば、カスタムオブジェクトの作成
以外は、Force.comの機能を使えるとのことで、技術的にはREST APIを使ってアクセスするための障害はなさそうなのです。

本当に、SalesForce社と何らかの契約を締結しないと、AppExcahge経由で購入したアプリにREST APIでアクセスしては
いけないのでしょうか? あるいは、契約しないと、技術的制約がかけられていて、アクセスそのものが出来ないのでしょうか?

ご指導をお願い致します。
 
ネットの情報を参考にしながら、visualforceで日本語pdf出力で改行できない問題を改行コード<wbr />を入れて解決するクラスを作ってみたのですが、sandboxでは動くのですが、本番リリースでうまくいきません。IDに関連するeventの情報を取ってきて、時系列にpdf上に表示するvisualforcepageを別に用意しています。初心者なもので、何を修正したらカバー率が上がるかわからず、アドバイス頂けると助かります。

visualforce class  ShowAllSObjectActivityKaig
public class ShowAllSObjectActivityKaig {
Id sObjectname= ApexPages.currentPage().getParameters().get('Id');

public list<Event> tasklist{get;set;}
public list<Event> namae{get;set;}
public  ShowAllSobjectActivityKaig(){
if(sObjectname !=null )

namae= [select id,ActivityDateTime,StartDateTime,Field6__c,Field5__c,Field1__c,Subject,Type,Field2__c,Who.Name,What.Name,Description,LastModifiedDate,Owner.Name FROM Event WHERE WhatID=:sObjectname OR whoId=:sObjectname order by startdatetime asc
LIMIT 1];

tasklist= [select id,ActivityDateTime,StartDateTime,Field6__c,Field5__c,Field1__c,Subject,Type,Field2__c,Who.Name,What.Name,Description,LastModifiedDate,Owner.Name FROM Event WHERE WhatID=:sObjectname OR whoId=:sObjectname order by startdatetime asc
];


//一文字ずつクラスを参照し、返す
//参加者
for(Event a : tasklist){
a.Field1__c = kaigyo(a.Field1__C,1);
}
//内容
 for(Event a : tasklist){
 a.Description = kaigyo(a.Description,1);
 }
}

public PageReference cancel() {
PageReference ldPage = new PageReference('/'+sObjectname);
ldPage.setRedirect(true);
return ldPage;
}
//指定位置にwbrコードを入れる
public String kaigyo(String value, Integer posLength )
    { 
    if(value == null || value.length() <= posLength) return value; 
    String rtnValue = value.substring(0, posLength ) + '<wbr/>'; 
    for(Integer i = posLength; i < value.length(); i++)
        {
        if(Math.mod(i, posLength ) == 0)
            { 
            if(value.length() > i + posLength)
                { 
                rtnValue += value.substring(i, i + posLength ) + '<wbr/>';
                }
                else
                { 
                rtnValue += value.substring(i,value.length());
                }
               //  kaigyoCount[col]++; 
             }
        }
        return rtnValue;
    }
}
visualforce page 
 
<apex:page controller="ShowAllSObjectActivityKaig" standardStylesheets="false"

 showHeader="false"
 sidebar="false"
 applyHtmlTag="false"
 renderAs="pdf">
<head>
 <style>
  @page {
    size: 8.27in 11.69in;
    padding: 0;
  }
  body {
    font-family: Arial Unicode MS;
    font-size: 10pt;
    text-align: left;

  }
  
table.type01 {
    width: 650px;
    table-layout:fixed;
    word-wrap: break-word;
    border-collapse: collapse;
    text-align: left;
    line-height: 1.2;
    margin-left:15px;
}
table.type01 th {
    width: 150px;
    padding: 2px;
    font-weight: bold;
    vertical-align: top;
    border: 1px solid #333;
}
table.type01 td {
    width: 500px;
    padding: 2px;
    vertical-align: top;
    border: 1px solid #333;
}





  
</style>
  
    
 </head>
<h2>
<center>相談支援記録</center></h2>
<table class="type01" >
<tbody>
<tr>
<th>

<br></br>
</th>
<td><apex:repeat value="{!namae}" var="item">
(<apex:outputText value="{!item.Who.Name}"/>)
[<apex:outputText value="{!item.What.Name}"/>]
</apex:repeat> 
</td>
</tr>
<apex:repeat value="{!tasklist}" var="oSobject">
<tr>                 
<th><apex:outputText value="{!oSobject.Field6__c}" />
    <br>
    <apex:outputText value="{0,date,HH:mm}">
    <apex:param value="{!oSobject.startdatetime}"/></apex:outputText>
    </br>
    <br><apex:outputText value="(種){!oSobject.Subject}" /></br>
    <br><apex:outputText value="(所){!oSobject.Field2__c}" /></br>
    <br><apex:outputText value="(参){!oSobject.Field1__c}" escape="false" /></br>
</th>

<td><apex:outputText value="{!oSobject.Description}" escape="false" /></td></tr>     
                  
</apex:repeat>                    
</tbody>
</table>  
</apex:page>



 
お世話になります。

chatterに関して質問です。
Salesforce Platformライセンスユーザのchatter投稿をコミュニティユーザのchatterで見る、
コミュニティユーザのchatter投稿をSalesforce Platformライセンスユーザのchatterで見る
ということをしたいのですが、実現することは可能でしょうか?
また、実現方法はどのようになるのでしょうか?

ご教示をお願い致します。
  • November 20, 2017
  • Like
  • 0
プロセスビルダーまたはVisualWorkフローを利用してChatterを自動投稿する機能について、
Chatterの投稿者を指定することができるでしょうか。
例えば、作業者はユーザAですが、Chatterの投稿者はユーザB(システム用アカウント)で行いたいです。
可能な設定あればご教示ください。

作業漏れの自動案内を行うChatterを投稿したいため、レコード更新したユーザAでなく、システム用のアカウントから投稿したメッセージとして表示したいと考えています。
ご教示ください。
よろしくお願いします。
APEXトリガで、レコードの更新または削除を実行したユーザのプロファイルを取得して、条件に指定することは可能でしょうか。
例えば、下記の形で条件指定をする時、実行ユーザのプロファイル情報を指定することが可能か知りたいです。
IF(実行ユーザのプロファイル=営業用プロファイル OR マネージャ用プロファイル , 動作A , 動作B)

APEXで実行ユーザのプロファイル情報を取得して条件に指定する方法ありましたら、ご教示ください。
よろしくお願いします。
レコードの項目値でレコードの削除を制限する方法あるでしょうか。
関連リストの左端にある削除をクリックした時に、項目値が特定の値(ex.商談のフェーズ=受注)であれば、削除できないようにしたいです。

本来は関連リストの編集・削除のリンクを非表示にしたいのですが、
ヘルプに問い合わせたところ、ユーザーのアクセス権限が影響し、削除を利用するユーザーは非表示にできないと回答があったため、
対策を検討しています。

ご教示いただけますと幸いです。
よろしくお願いいたします。
お世話になっております。

以下画像に表示されているAPI要求数について、
内訳を確認することは出来ますでしょうか。

例:XXXクラスのYYYメソッドから1000回要求されている
  AAAクラスのBBBメソッドから896回要求されている...など

User-added image



以上です。
  • September 26, 2017
  • Like
  • 0
Visualforceページの開発でdocType="html-5.0"を宣言した際の必須チェックについて困っています。
リストの行を追加するボタンをクリックしたときは必須チェックをスキップするようにしたいです。

通常は『immediate="true"』を宣言しておけば必須チェックをスキップできます。
<apex:commandButton value=" Add Contacts " action="{!addContacts}" immediate="true" />

ですが、docType="html-5.0"を宣言したときは『immediate="true"』を宣言してもフォームの必須チェックが実行されてしまいます。
User-added image

『html-formnovalidate="formnovalidate"』を宣言することで回避できたのですが、このときreRenderを宣言すると『immediate="true"』の宣言が無効になってしまいました。reRenderを宣言しながら必須チェックをスキップしたいです。どなたか解決方法をご存知の方がいらっしゃいましたら教えてください。


補足
『html-formnovalidate="formnovalidate"』を宣言すると必須チェックをスキップできる。
<apex:commandButton value=" Add Contacts " action="{!addContacts}" immediate="true" html-formnovalidate="formnovalidate" />
User-added image

この状態でreRenderを宣言すると『immediate="true"』の宣言が効かなくなる。
<apex:commandButton value=" Add Contacts " action="{!addContacts}" reRender="form" immediate="true" html-formnovalidate="formnovalidate" />
User-added image

動作確認に使ったコードです。
HtmlFormnovalidateDemo.page
<apex:page standardController="Account" extensions="HtmlFormnovalidateDemoController" docType="html-5.0" sidebar="false">
    <apex:form id="form">
        <apex:pageMessages id="msg" />
        <apex:pageBlock id="block">
            <apex:pageBlockButtons id="buttons" location="bottom">
                <apex:commandButton value=" Save " action="{!Save}" reRender="form" />
                <apex:commandButton value=" Cancel " action="{!Cancel}" reRender="form" immediate="true" html-formnovalidate="formnovalidate" />
                <apex:commandButton value=" Add Contacts " action="{!addContacts}" immediate="true" html-formnovalidate="formnovalidate" reRender="form" />
            </apex:pageBlockButtons>
            <apex:pageBlockSection id="section">
                <apex:inputField value="{!Account.Name}" required="true" html-placeholder="取引先名を入力" />
                <apex:inputField value="{!Account.AccountNumber}" />
            </apex:pageBlockSection>
            <apex:pageBlockTable value="{!contacts}" var="item">
                <apex:column headerValue="{!$ObjectType.Contact.Fields.LastName.Label}">
                    <apex:inputField value="{!item.LastName}" required="true" />
                </apex:column>
                <apex:column headerValue="{!$ObjectType.Contact.Fields.FirstName.Label}">
                    <apex:inputField value="{!item.FirstName}" />
                </apex:column>
            </apex:pageBlockTable>
        </apex:pageBlock>
    </apex:form>
</apex:page>
HtmlFormnovalidateDemoController.cls
public with sharing class HtmlFormnovalidateDemoController {
    
    public List<Contact> contacts {get; set;}
    
    public HtmlFormnovalidateDemoController(ApexPages.StandardController stdController) {
        this.contacts = new List<Contact>();
    }
    
    public void addContacts() {
        this.contacts.add(new Contact());
    }
}

よろしくおねがいします。

Salseforce Android Mobileアプリの開発ってどうやって始めればいいのかなと思っていたら、

Eclipseで開発する方法についての動画がYouTubeに公開されていました。

 

英語ですが、実際に画面を動かして説明してくれているのでわかりやすかったです。

 

Android Mobile SDK Project

http://youtu.be/VQC6E7ToFdY

 

 

2012年5月にMobile SDK Webinarの動画も公開されていました。

これを見て勉強してみたいと思います。

 

Mobile SDK Webinar

http://www.youtube.com/watch?v=VflsLd3if2M

Salseforce Android Mobileアプリの開発ってどうやって始めればいいのかなと思っていたら、

Eclipseで開発する方法についての動画がYouTubeに公開されていました。

 

英語ですが、実際に画面を動かして説明してくれているのでわかりやすかったです。

 

Android Mobile SDK Project

http://youtu.be/VQC6E7ToFdY

 

 

2012年5月にMobile SDK Webinarの動画も公開されていました。

これを見て勉強してみたいと思います。

 

Mobile SDK Webinar

http://www.youtube.com/watch?v=VflsLd3if2M

お世話になっております。

VisualforceのPDFに関して質問です。

VisualforceのPDF上に
outputtextの項目(数値)がA,B,Cとあります。
項目Aおよび項目Bには、100ー[Apexより取得した数値型の変数]という式を埋め込んでいる状態で、
項目CにA+Bという式を埋め込みたいと考えております。

実際には、項目Aおよび項目Bには、複雑な計算式を埋め込み、
その結果の合計を項目Cに表示させたいと考えております。

このように項目AとBの結果を参照し、項目Cで使用する方法はありますでしょうか?

以上、よろしくお願いいたします。
  • February 26, 2020
  • Like
  • 0
いつもお世話になっております。

下記コードは、VYDEXを使い、3階層になっているカスタムオブジェクトを一つのエクセルから取り込むコードです。
ですが、案件project(親オブジェクト)を取り込んだ際に、所有者がログインユーザーになってしまいます。
こちらは、デフォルトでそのように設定されており、普段は、保存後に変更しております。
出来れば、VYNDEXで取り込んだ時に、担当者=案件所有者になるような式を追加したいです。
どのようなコードを追加したらいいでしょうか?
ご教示ください。

public with sharing class estimateTriggerHandler {

    private MAP<String,Account> accMAP;
    private MAP<String,User> userMAP;
    Private MAP<string,Project__c> projectMAP;
    Private MAP<string,Item__c> itemMAP;
    Private MAP<string,Sale__c> saleMAP;
    private List<Project__c> projectList;
    private List<Item__c> itemList;
    private List<Sale__c> saleList;

    //VyNDEX連携時動作トリガ処理
    public void OnBeforeInsert(List<estimate__c> elist) {
        //初期処理(Map作成)
        createMAP();

        Savepoint sp = Database.setSavepoint();

        try{
            //案件作成
            createProjects(elist);
    
            //アイテム作成
            createItems(elist);
    
            //仕入作成
            createSales(elist);

        }catch(DmlException e){
            throw e;
            Database.rollback(sp);
        }
    }

    private void createProjects(List<estimate__c> elist){
        string key;
        Set<string> projects = new Set<string>();
        projectList = new List<Project__c>();

        //案件設定
        for(estimate__c e : elist){
            //種別=案件の場合のみ処理実行
            if(e.type__c != '案件') continue;

            //クライアント存在チェック
            //if(accMAP.get(e.client__c)==null) continue;

            //案件が登録されているか確認(Vyndexは1行ずつの読込登録するため重複確認を行う)
            key = e.subject__c + e.timestamp__c;
            if(!projectMap.containsKey(key)){
                //未登録案件の場合、案件登録
                Project__c project = New Project__c();
                project.Name = e.subject__c;
                project.client__c = accMAP.get(e.client__c).id;
                project.vyndexKey__c = key;
                projectList.add(project);

                //案件Map追加
                projectMap.put(key, project);
            }
        }

        //登録処理
        if(projectList.size()>0){
            insert projectList;
        }
    }

    private void createItems(List<estimate__c> elist){
        itemList = new List<Item__c>();
        string itemKey;
        string projectKey;

        //アイテム設定
        for(estimate__c e : elist){
            //種別=アイテムの場合のみ処理実行
            if(e.type__c != 'アイテム') continue;

            //クライアント存在チェック
            if(accMAP.get(e.client__c)==null) continue;

            //アイテムが登録されているか確認(Vyndexは1行ずつの読込登録するため重複確認を行う)
            itemKey = e.subject__c + e.project__c + e.item__c + e.itemOther__c + e.size__c + e.sizeOther__c + e.printCnt__c + e.timestamp__c;
            projectKey = e.subject__c + e.timestamp__c;
            if(!itemMap.containsKey(itemKey)){
                Item__c item = New Item__c();
                item.title__c = e.project__c;
                item.item__c = e.item__c;
                item.itemOther__c = e.itemOther__c;
                item.Maisu__c = e.printCnt__c;
                item.size__c = e.size__c;
                item.sizeOther__c = e.sizeOther__c;
                item.project__c = projectMap.get(projectKey).id;
                item.Owner__c = userMAP.get(e.staff__c).id;
                item.vyndexKey__c = itemKey;
                item.color__c = e.color__c;
                itemList.add(item);
    
                //アイテムMap追加
                itemMap.put(itemKey, item);
            }
        }

        //登録処理
        if(itemList.size()>0){
            insert itemList;
        }
    }

    private void createSales(List<estimate__c> elist){
        saleList = new List<Sale__c>(); 
        string itemKey;
        string saleKey;

        //仕入設定
        for(estimate__c e : elist){
            //種別=アイテムの場合のみ処理実行
            if(e.type__c != '仕入') continue;

            //クライアント存在チェック
            if(accMAP.get(e.client__c)==null) continue;
            
                                   
            //仕入が登録されているか確認(Vyndexは1行ずつの読込登録するため重複確認を行う)
            itemKey = e.subject__c + e.project__c + e.item__c + e.itemOther__c + e.size__c + e.sizeOther__c + e.printCnt__c + e.timestamp__c;
            saleKey = e.subject__c + e.project__c + e.sale__c + e.content__c + e.invoiceCnt__c + e.unitPrice__c + e.timestamp__c;
            system.debug('itemKey:'+itemKey);
            system.debug('itemMap:'+itemMap);
            system.debug('saleKey:'+saleKey);
            if(!saleMap.containsKey(saleKey)){
                Sale__c sale = New Sale__c();
                sale.IsUriageSeikyu__c = true;
                sale.costType__c = e.sale__c;
                sale.item__c = itemMap.get(itemKey).id;
                sale.SeikyuSuryo__c  = e.invoiceCnt__c;
                sale.UriTanka__c = e.unitPrice__c;
                sale.vyndexKey__c = saleKey;
                sale.remark__c = e.Note__c;
                sale.ShireKingaku__c = e.cost__c;
                sale.date_seikyuusyo__c = e.date_seikyuusyo__c;
                sale.otherSuplier__c = e.siirekaisya__c;
                saleList.add(sale);
    
                //仕入Map追加
                saleMap.put(saleKey, sale);
            }
        }

        //登録処理
        if(saleList.size()>0){
            insert saleList;
        }
    }
    
    private void createMAP() {
        //クライアントMAP作成(KEY : 会社名)
         RecordType rt = getRecodeType('Account','ClientRecordType'); 
        accMAP = New MAP<String,Account>();
        List<Account> accList = [Select id, Name From Account Where recordTypeID =: rt.id];
        for(Account acc : accList){
            accMap.put(acc.Name, acc);
        }
 
        
        //担当者MAP作成(KEY : ユーザ名)
        userMAP = New MAP<String,User>();
        List<User> userList = [Select id, Name, Alias From User];
        for(User usr : userList){
            userMap.put(usr.Name, usr);
        }

        //案件MAP作成(KEY : 案件名 + 作成日時)
        projectMAP = New MAP<string,Project__c>(); 
        List<Project__c> projectList = [Select id, Name, vyndexKey__c From Project__c Where vyndexKey__c != ''];
        for(Project__c pj : projectList){
            projectMAP.put(pj.vyndexKey__c, pj);
        }
        
        //アイテムMAP作成(KEY : アイテム名  + サイズ + 印刷枚数 + 作成日時)
        itemMAP = New MAP<string, Item__c>();
        List<Item__c> itemList = [Select id, Name, vyndexKey__c From Item__c Where vyndexKey__c != ''];
        for(Item__c item : itemList){
            itemMAP.put(item.vyndexKey__c, item);
        }

        //仕入MAP作成(KEY : 仕入名  + 請求数量 + 単価 + 作成日時)
        saleMAP = New MAP<string, Sale__c>();
        List<Sale__c> saleList = [Select id, Name, vyndexKey__c From Sale__c Where vyndexKey__c != ''];
        for(Sale__c sale : saleList){
            saleMAP.put(sale.vyndexKey__c, sale);
        }
    }
     
    //レコードタイプ取得関数
    private RecordType getRecodeType(String objectName, String devName) {
        List<RecordType> listRecordType = 
            [
                select  Id,
                        Name,
                        DeveloperName,
                        IsActive 
                from    RecordType
                where   IsActive = true
                  and   SobjectType =: objectName
                  and   DeveloperName =: devName
            ];
        if (!listRecordType.isEmpty()) {
            return listRecordType[0];
        }
        return null;
    }

}
sale.otherSuplier__c = e.siirekaisya__c;
上記コードは別々のカスタムオブジェクトの項目(参照項目)です。
参照先は取引先です。
文字で入力し、IDに変換するコードを教えてください。
コミュニティユーザが自身のログインパスワードを変更できないようにしたいです。

パスワード変更機能自体を防ぐことは難しいと思いますが、間接的にでも良いのでコミュニティユーザがパスワードを変更できないようにする方法はあるでしょうか。
完全に封じることができずとも、ある程度防げる形でも構いません。

よろしくお願いします。
現在Lightningコンポーネントを開発中で、コンポーネントを埋め込むページ内からどのページに埋め込まれているかを判断する方法を探っています。

例えば、下記のようなURLのページ内に配置したコンポーネントから「Contact」や「Lead」部分を取得したいのですがどのようにすればよいのでしょうか?
/lightning/r/Contact/0032v0000*********/view
/lightning/r/Lead/0032v0000*********/view

よろしくお願いします。
 
お世話になっております。
掲題のとおりですが、選択リストで特定の項目を選択すると、同画面内のテキストエリアが表示される(活性化or編集可状態になるでもOK)ようにしたいのですが、どのように実現するのでしょうか。
ご教示ください。

例としては、リストで「その他」を選ぶと、すぐ下に「備考欄(テキストエリア)」が出現するイメージです。

よろしくお願いします。
  • September 02, 2019
  • Like
  • 0
ClassicからLightningへの移行作業を行っています。
同じ現象が起きる方、対応策をご存知の方がいらっしゃいましたらアドバイス頂けると幸いです。

ブラウザ:Chrome最新版
現象:
Classicで利用しているVisualforceページ(「ボタン、リンクおよびアクション」の「参照」に指定したVFページです)で「メモ&添付ファイル」関連リストを表示しています。

Lightningに移行するため、pageタグにlightningStyleSheets="true" を追加し、Lightning表示に切り替えた後「メモ&添付ファイル」関連リストにファイルを添付。

添付後に表示される「タイトル」列のファイル名のリンクをクリックしても画面遷移等せずファイルが参照できません。
また、同じ画面のリンクも動作しません。(取引先参照リストのリンク、作成者・更新者のリンク等)

タイトルに表示されたファイル名のリンクURLをコピーしてブラウザのアドレスに指定するとダウンロードできます。
画面をいったん閉じで、再度開くとタイトルのリンクから問題なくダウンロードできます。

今後「メモ&添付ファイル」は「ファイル」「メモ」に差し替えますが、データ移行期間は「メモ&添付ファイル」を使用し続けるのでできれば解決したいと考えています。
対応策をご存知の方、ご教授いただきたく。どうぞよろしくおねがいいたします。
  • August 21, 2019
  • Like
  • 0
Apex中でCSVファイルを作成し、ドキュメントに保存した後、ドキュメントのIDを新しいPageに渡して、ページのコントローラクラス中で該当ドキュメントのデータをSoqlで取得できませんでした。
※Idの渡しができています。
ソースコードが以下になります。
  1. document = new Document();
  2. document.Name = FileName;
  3. document.FolderId = folder.Id;                    
  4. document.Body = Blob.valueOf('test');
  5. document.Type = 'csv';
  6. document.ContentType='text/csv';
  7. insert document;
  8. PageReference csvpage = page.ConvertPage;
  9. csvpage.getParameters().put('str', document.id);
  10. ページのコントローラクラス:
  11. global class Convert{
  12. public String csvId {get;set;}
  13. public String csvtext {get;set;}
  14. // コンストラクタ
  15. public Convert() {
  16. this.csvId =ApexPages.currentPage().getParameters().get('str');
  17. Document d = [SELECT Id, Body from document where Id =: csvId];
  18. csvtext = d.Body.toString();
  19. }
  20. }
16番のIDはありますが、17番のデータが取得できず、エラーとなってしましました。

原因はご存じでしたら、ご教授をお願いいたします。
AppExchangeアプリメーカです

ユーザのログイン履歴で、スマートフォンのSalesforceアプリは
「アプリケーション」で「Salesforce for iOS」と表示されるのですが、
当社アプリは「ブラウザ」と表示されます。
「アプリ名」を表示させる方法はをご教示いただけませんでしょうか。

○Salesforceアプリ
アプリケーション:Salesforce for iOS

○当社アプリ
アプリケーション:ブラウザ

※ブラウザアクセス禁止設定だと利用できないため、アプリ名にしたい
特定のカスタムオブジェクトに添付ファイルが投稿された際に動作するApex Triggerを作成しています。

添付されたのがどのカスタムオブジェクトなのかを判定する方法として、添付ファイルの親カスタムオブジェクトID(ParentId)をハードコードして判定する方法を利用しているのですが、SandboxとはカスタムオブジェクトIDが異なっているため、リリース前に書き換えるという手段をとっています。

Sandboxと本番組織で同一のコードでカスタムオブジェクトを判定する方法はないでしょうか?
お世話になっております。

商談の下にカスタムオブジェクトAとB(A・B間にリレーションなし)と、商談とはリレーションがないカスタムオブジェクトCとD(Cが親の主従関係、A・Bとはリレーションなし)があります。
これらのオブジェクトに対して、2つの動作があります。

1.Aにレコードを作成すると、商談を元にCを、Bを元にDを作成する(プロセスビルダーからApexクラス呼び出し)。
2.Aにレコードを作成すると、Bの値を更新する(Apexトリガ、After Insert)

当初、1.で作成されたCとDが2.の影響を受けていなかったので、これらは1.→2.の順で動作していました。
今回、処理2.のコードを改修することになり、ガバナ制限的にも問題のあるコードだったので、同様の動作を制限にかからないように書き直しました。
すると、処理内容はほぼ変わらないはずなのですが、1.で作成されたCとDが2.で更新した後の値となっており、2.→1.の順に動作するようになってしまいました。

Apexの動作順序を考えるとトリガ→プロセスビルダーなので2.→1.が正しい気もするのですが、だとすれば今まで1.→2.の順で動作していた理由がわかりません。業務的には1.→2.が理想です。

この逆転してしまった順番を、トリガを元に戻さずに1.→2.に戻すにはどうすればよいでしょうか。
また、当初1.→2.の順に動作する理由も開設いただければと思います。

以上、よろしくお願いいたします。
Developerエディションを使用しシステム管理者プロファイルのユーザーでログインしています。
設定>プロセスの自動化の中に「承認プロセス」が表示されません。
考えられる原因は何でしょうか?
Lightningの標準レコードページを使用しています。
コピーのボタン押下により、参照中のレコードデータが入力された状態の新規レコード用ダイアログが出ますが、
例えばレコードのステータスや日付が入るような項目はコピーの対象から外し、空白の状態でコピーがしたいです。
上記のようなことを実現するためにはどうしたら良いでしょうか。
よろしくお願いします
取引先に、チェックボックス型のカスタム項目を追加しました。
追加した項目の値をSOAP APIからSOQLでselectしたところ、値が取得できません。

同じクエリを開発者コンソールのQueryEditorから実行すると、
値を取得できます。

カスタム項目の追加の方法に不足があるのでしょうか?
よろしくお願いいたします。
レコードの項目値でレコードの削除を制限する方法あるでしょうか。
関連リストの左端にある削除をクリックした時に、項目値が特定の値(ex.商談のフェーズ=受注)であれば、削除できないようにしたいです。

本来は関連リストの編集・削除のリンクを非表示にしたいのですが、
ヘルプに問い合わせたところ、ユーザーのアクセス権限が影響し、削除を利用するユーザーは非表示にできないと回答があったため、
対策を検討しています。

ご教示いただけますと幸いです。
よろしくお願いいたします。
特定のカスタムオブジェクトに添付ファイルが投稿された際に動作するApex Triggerを作成しています。

添付されたのがどのカスタムオブジェクトなのかを判定する方法として、添付ファイルの親カスタムオブジェクトID(ParentId)をハードコードして判定する方法を利用しているのですが、SandboxとはカスタムオブジェクトIDが異なっているため、リリース前に書き換えるという手段をとっています。

Sandboxと本番組織で同一のコードでカスタムオブジェクトを判定する方法はないでしょうか?
お世話になっております。


カスタマーポータルユーザの新規作成時にパスワード通知メールを送信しないようにしたいと考えております。

パスワード通知メールを送信しない方法、
またその可否についてご存知でしたらご教授頂けると幸いです。

宜しくお願い致します。