[Salesforce]生年月日(誕生日)から年齢の算出

生年月日(誕生日)から年齢の算出する数式項目作成例を紹介しまます。

IF(OR(MONTH(today())-MONTH(Birthday__c)>0,AND(MONTH(TODAY()) - MONTH(Birthday__c)>=0,DAY(TODAY()) - DAY(Birthday__c)>=0)),
YEAR(TODAY()) - YEAR(Birthday__c),
YEAR(TODAY()) - YEAR(Birthday__c)-1)

ここで、

Birthday__c : 誕生日の日付項目

[Salesforce]TestVisible アノテーション

TestVisible アノテーションにつついて紹介します。

TestVisible アノテーションを使用すると、テストクラス外にある別のクラスの非公開メンバーまたは保護メンバーにテストメソッドからアクセスできるようになります。これらのメンバーには、メソッド、メンバー変数、内部クラスが含まれます。このアノテーションは、テストを実行する目的でのみ、権限の高いアクセスレベルを有効にします。このアノテーションによって、非テストクラスからアクセスするメンバーの表示が変わることはありません。

このアノテーションでは、メソッドのアクセス修飾子やメンバー変数にテストメソッドでアクセスする場合に、それらを public に変更する必要はありません。たとえば、外部クラスに対して非公開メンバー変数を表示せずに、テストメソッドからアクセスできるようにする場合は、TestVisible アノテーションを変数定義に追加します。

この例では、非公開クラスメンバー変数と非公開メソッドに TestVisible アノテーションを付加する方法を示します。

public class TestVisibleExample {    
// Private member variable    
@TestVisible private static Integer recordNumber = 1;     
// Private method    
@TestVisible private static void updateRecord(String name)
 {        // Do something    }
}    

上記のクラスを使用するテストクラスを次に示します。アノテーションが付加されたメンバー変数とメソッドにアクセスするテストメソッドが含まれています。

@isTest
private class TestVisibleExampleTest {    
@isTest static void test1() {        

// Access private variable annotated with TestVisible        

Integer i = TestVisibleExample.recordNumber;        

System.assertEquals(1, i);         

// Access private method annotated with TestVisible        TestVisibleExample.updateRecord('RecordName');       

 // Perform some verification    

}

[Salesforce]Visual Studio CodeでのApex PMD使い方

Visual Studio CodeでApex PMDの使い方について共有します。

PMDとは、ソースコードの解析を行い、無駄な変数、ループ、条件式などバグの原因となる可能性のあるコードの判定を行っているツールです。

Apex PMDはApexコードでソースの分析を行ってくれるExtentionです。

・Apex PMDインストールする。

Visual Studio Codeの「Extentions」にて「Apex PMD」をインストールする。

インストール後、画面右下のステータスバーに「Apex PMD」の文字が表示されるようになります。

例えとして、以下のテスト用クラスを作成して保存してコミットします。

コミット後、画面に右下の「Apex PMD]の横にワーニング表示が表示されます。

そしえ、「Problems」のところにワーニング内容が表示されまます。

Apex classes should declare a sharing model if DML or SOQL is used (rule: Security-ApexSharingViolations)

該当箇所:public class testClass {

修正案:public class testClass {

上記の修正案によって、該当ワーニングが消えました。

Class names should begin with an uppercase character (rule: Code Style-ClassNamingConventions)

該当箇所:public with Sharing class testClass {

修正案:public with Sharing class TestClass {

上記の修正案によって、該当ワーニングが消えました。

Use one statement for each line, it enhances code readability. (rule: Code Style-OneDeclarationPerLine)

該当箇所:integer a, b, c = 0; 

修正案:

integer a;        

integer b; 

integer c = 0; 

Validate CRUD permission before SOQL/DML operation (rule: Security-ApexCRUDViolation)

該当箇所:User u = [Select id from User Limit 1];

修正案:

ログインユーザについて「ユーザ」オブジェクトについて参照権限付与を確認する。

[Salesforce]親オブジェクトから子オブジェクトへのリレーションの辿り方法

親オブジェクトから子オブジェクトへのリレーションの辿り方法について共有します。

取引先から取引先責任者を取得する例を紹介します。

for(Account obj : [
                    Select 
  						Name, 
  						(Select Name From Contacts) 
					From 
  						Account
                    ]
   					){
   					system.debug('obj:'+obj);
   					system.debug('obj.Name:'+obj.Name);
                        
                    for(Contact objChild : obj.Contacts){
	   					system.debug('objChild:'+objChild);
                        system.debug('objChild.Name:'+objChild.Name);
                    }
}

[Salesforce]子オブジェクトから親オブジェクトへのリレーションの辿り方法

子オブジェクトから親オブジェクトへのリレーションの辿り方法について共有します。

例として、取引先責任者から取引先を辿る例です。

for(Contact obj : [
                    Select 
                      Name, 
                      Account.Name,
                        Account.CreatedBy.Name
                    From 
                      Contact
                    ]
   					){
   system.debug('obj.Name:'+obj.Name);
   system.debug('obj.Account.Name:'+obj.Account.Name);
   system.debug('obj.Account.CreatedBy.Name:'+obj.Account.CreatedBy.Name);
}

[Salesforce]api is not enabled for this organization or partner

データローダでExportしようとして、アカウント情報を入力してログインボタン押下すると、「api is not enabled for this organization or partner」エラーがでた。

理由として、Salesforceライセンスによるものでした。

以下の参考だと、今現在APIが有効であるのは、「Enterprise, Unlimited and Developer editions」のことです。

https://help.salesforce.com/articleView?id=000327326&language=en_US&type=1&mode=1

対応案として、SFの「データインポートウィザード」を使うことで解決できます。

[JavaScript]コールバック関数

コールバック関数について共有します。

コールバック関数とは、上から順番に実行されない関数のことです。

プログラムは上から下へと実行されますが、コールバック関数は何らかの条件の後に登録され実行される関数のことになります。

●コールバック関数とは

コールバック関数とは、他の関数に引数として渡される関数です。

コールバック関数はイベントハンドラとして多く用いられます。

ここでイベントハンドラおてゃ、ボタンリック時のような、何らかのイベントが発生した際に実行する関数を指します。

●コールバック関数の使い方

コールバック関数の使い方は以下の通りです。

以下は、コールバック関数function1を、function2の引数として渡しています。

var function1 = function(){
//
}

function2(function1);

SalesforceのVisualforceを利用して例は以下です。

<apex:page sidebar="false" showHeader="false">
<script language="javascript" type="text/javascript">

    // パラメータなし
    function btnClick1() {
    
        hello('煌木 太郎', funcPrint);

    }

    // パラメータなし
    function hello(name, callback) {
    
        callback(name);

    }

    function funcPrint(name) {

        console.log("こんにちは!", name, "さん");

    }

</script>
<apex:form id="formId" target="_blank">
    <apex:pageBlock >
        <apex:commandButton value="sayHello()" onClick="btnClick1();" />
    </apex:pageBlock>
</apex:form>
</apex:page>

[Technical Method]TortoiseGitインストールと操作例

TortoiseGitインストールと操作例について共有します。

●事前準備

・Git の設定

 - Gitのバージョン確認

  Git の公式ページにアクセスし、最新バージョンのバージョン番号確認

  Windowsの場合はコマンドプロンプト、Macの場合はターミナルを起動

  git --version と入力し、実行

  バージョン番号が表示され、これが最新バージョンと一致しない場合は、Gitインストールする。

  

●TortoiseGitインストール

 - 基本的なソフトウェアをChocolateyを使用してインストール

 - Windowsの場合はコマンドプロンプト(管理者として実行)、Macの場合はターミナルにて、以下のコマンドを実行する。

@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
cinst -y chocolatey
cinst -y googlechrome
cinst -y firefox
cinst -y sakuraeditor 
cinst -y putty.install
cinst -y winscp
cinst -y cyberduck
cinst -y git.install
cinst -y curl
cinst -y jdk8
cinst -y gradle
cinst -y vscode
cinst -y winmerge
cinst -y virtualbox
cinst -y vagrant
cinst -y docker
cinst -y awscli
cinst -y heroku-cli
cinst -y gcloudsdk
cinst -y azure-cli
cinst -y terraform
cinst -y selenium
cinst -y selenium-chrome-driver
cinst -y slack
cinst -y jmeter
cinst -y 7zip
cinst -y heidisql
cinst -y TortoiseGit
cinst -y sourcetree
cinst -y git-lfs
chocolatey upgrade all

●プロジェクトのチェックアウト

・リポジトリのクローン

 C:\git フォルダを作成する

  

cd C:\git

 GitHubで、クローンするリポジトリの「Clone or download」ボタンをクリックしてURLをコピーする。

コマンドプロンプトで、下記コマンドを実行する

git clone [コピーしたURL]

●最新のファイルをダウンロードする

・リモートリポジトリの変更を取り込む(pull)

右クリック→Git Sync…​ を押下する。
Pullボタンを押下し、成功メッセージが表示されることを確認する。

・ファイルを追加する

対象ファイルを右クリック→TortoiseGit→Add を押下し、成功メッセージが表示されることを確認する。

・ローカルリポジトリとリモートリポジトリに変更を書き込む(commit&push)

右クリック→Git Commit を押下する。
チケット番号とコミットコメントを入力してCommit&Pushボタンを押下し、成功メッセージが表示されることを確認する。

・ローカルの変更を取り消す

対象ファイルを右クリック→TortoiseGit→Revert を押下し、成功メッセージが表示されることを確認する。

・競合を解消する

複数のメンバーが同時に同一ファイルを編集した場合、pullまたはpush時に競合が発生する。

  競合の内容を確認し、必要な箇所を修正してマージする。

  対象ファイルを右クリック→Resolve を押下し、成功メッセージが表示されることを確認する。

 

・ファイルを削除する

対象ファイルを右クリック→TortoiseGit→Delete を押下し、成功メッセージが表示されることを確認する。

[Excel]ExcelでSQLite操作

ExcelでSQLite操作手順を共有いたします。

SQLiteForExcelをダウンロードする

https://github.com/govert/SQLiteForExcel/releases

SQLite For Excel Version 1.0 Zipファイルをダウンロードする。

・ダウンロードされたZipファイルを解凍する。

・解凍されたファイルの「Distribution」フォルダを開き、以下のファイルをコピーして作業用フォルダに貼り付ける。

 1.PCのスペックが32Bitの場合

  「Distribution」フォルダの中の以下

  SQLite.dll

  SQLite3_StdCall.dll

SQLiteForExcel.xls

  2.PCのスペックが64Bitの場合

   「Distribution」フォルダの中の以下

SQLite3_StdCall.dll

SQLiteForExcel_64.xls

   「Distribution」フォルダの「x64」フォルダ中の以下

 SQLite.dll

・SQLiteのDBファイルを作業フォルダの下におく。

 例えば、ファイル名:Test.sqlite3

・例えば、64Bitの場合、SQLiteForExcel_64.xlsを開き、標準モジュールの「Sqlite3Demo」のAllTests関数の以下のように変更する。

TestFile = “保存フォルダ\Test.sqlite3”

InitReturn = SQLite3Initialize(ThisWorkbook.Path)
ここで、ThisWorkbook.Path(=ActiveのExcelファイルがあるフォルダ)にSQLite.dllあることを再確認しておく。

・Select文確認

例えば、関数TestSqliteSelect作成して、以下のコードを埋め込む。

Public Sub TestSelectCustomize()
    #If Win64 Then
    Dim myDbHandle As LongPtr
    Dim myStmtHandle As LongPtr
    #Else
    Dim myDbHandle As Long
    Dim myStmtHandle As Long
    #End If
    Dim RetVal As Long
    
    Dim stepMsg As String
    
    Debug.Print "----- TestSelect Start -----"
    ' Open the database - getting a DbHandle back
    RetVal = SQLite3Open(TestFile, myDbHandle)
    Debug.Print "SQLite3Open returned " & RetVal
    
    '-------------------------
    ' Select statement
    ' ===============
    ' Create the sql statement - getting a StmtHandle back
    RetVal = SQLite3PrepareV2(myDbHandle, "SELECT * FROM " & TableName, myStmtHandle)
    Debug.Print "SQLite3PrepareV2 returned " & RetVal

    ' Start running the statement
    RetVal = SQLite3Step(myStmtHandle)
    If RetVal = SQLITE_ROW Then
        Debug.Print "SQLite3Step Row Ready"
        PrintColumns myStmtHandle
    Else
        Debug.Print "SQLite3Step returned " & RetVal
    End If
    
    
    Dim colCount As Long
    Dim colName As String
    Dim colType As Long
    Dim colTypeName As String
    Dim colValue As Variant
    
    Dim i As Long
    
    colCount = SQLite3ColumnCount(myStmtHandle)
    Debug.Print "Column count: " & colCount
    For i = 0 To colCount - 1
        colName = SQLite3ColumnName(myStmtHandle, i)
        colType = SQLite3ColumnType(myStmtHandle, i)
        colTypeName = TypeName(colType)
        colValue = ColumnValue(myStmtHandle, i, colType)
        Debug.Print "Column " & i & ":", colName, colTypeName, colValue
    Next
    
    
    ' Close the database
    RetVal = SQLite3Close(myDbHandle)

    Debug.Print "----- TestSelect End -----"
End Sub