1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Apex Wrapper Salesforce Metadata API Part 1

Last updated at Posted at 2020-10-30

:cloud: Metadata API

以下の日本語訳です。少々長いので分けています。

#Documentation
このREADMEのドキュメントに加えて、次のブログでもライブラリについて説明しています。

このAPIは、標準ドキュメントに記載されているAPIタイプと操作を可能な限り反映しています。提供される動作と機能は、特定の操作を介して使用およびアクセスできるメタデータに関して、Salesforceのドキュメントで説明されているとおりです。

  • Salesforce Metadata API Developers Guide

#Showcase

この新しいセクションは、人々がこのライブラリを使用して構築しているクールなツールとアプリケーションを紹介することを目的としています。ここであなたの名前と作成をライトで希望する場合は、詳細についてGitHubの問題を提起してください。喜んで紹介します!

image.png

Layout Editing Tool by BoonPlus

#Background and Motivation
プラットフォームの宣言型の性質を取り入れたソリューションや便利なユーティリティを開発したいと考えるApex開発者が増えているようです。そのことについてはFinancialForce.comにあるものを含めてください!このようなソリューションは、管理者が作成する必要のあるカスタムフィールドやオブジェクト、および/または既存のパッケージ内のオブジェクトへのカスタマイズに動的に適応しています。

管理者がこれらのソリューションをますます活用するにつれて、自動化のトピックが発生します。これらのソリューションの開発者は、管理者に手動で作成してからソリューションに参照するように依頼することなく、ウィザードを実装したり、ソリューションを自己構成したりすることで、管理者を支援できますか?

#Apexから呼び出すための概要

Salesforceは、開発者がオフプラットフォームとオンプラットフォームの両方で(Apex開発者として)使用できる多数のAPIを提供します。プラットフォームから離れていて(Herokuなど)、管理の自動化に役立つコードを開発している場合。次に、SalesforceメタデータAPI(Salesforce WebServiceコネクタ経由)を利用してこれを支援できます。これは、オブジェクト、フィールド、ページ、およびその他の多くのコンポーネントタイプを作成するための堅牢ですぐに利用できるAPIです。

SalesforceはプラットフォームApex開発者にApexDescribeを介してこの情報の一部(メタデータAPIカバレッジのサブセット)をクエリする手段を提供しますが、Apexからこのメタデータをネイティブに操作する手段はまだ提供していません。これはパイプラインにあると言われていますが、これがいつ到着するかは個人的にはわかりません。

読み進める前に、このアイデアに投票し、ネイティブメタデータAPIを入手してください。

では、その間にApex開発者として何ができるでしょうか。 Apexは、Webサービスや最近ではRESTベースのAPIへのアウトバウンド呼び出しを行うのに非常に優れていることがわかりました。これは、いつものように、少数のガバナーが知っておく必要があります。では、なぜApexはMetadata Web ServicesAPIを呼び出せないのでしょうか。結局のところ、そのためのWSDLがあり、Apex開発者としてWSDLをApexにインポートし、それが生成するコードを使用して呼び出しを行うことができます...

#Examples
以下は、MetadataServiceExamples.clsを使った例です。

public static void createObject()
	{
		MetadataService.MetadataPort service = createService();		
		MetadataService.CustomObject customObject = new MetadataService.CustomObject();
		customObject.fullName = 'Test__c';
		customObject.label = 'Test';
		customObject.pluralLabel = 'Tests';
		customObject.nameField = new MetadataService.CustomField();
		customObject.nameField.type_x = 'Text';
		customObject.nameField.label = 'Test Record';
		customObject.deploymentStatus = 'Deployed';
		customObject.sharingModel = 'ReadWrite';
		List<MetadataService.SaveResult> results = 		
			service.createMetadata(
				new MetadataService.Metadata[] { customObject });		
		handleSaveResults(results[0]);
	}
	
	public static void createField()
	{
		MetadataService.MetadataPort service = createService();		
		MetadataService.CustomField customField = new MetadataService.CustomField();
		customField.fullName = 'Test__c.TestField__c';
		customField.label = 'Test Field';
		customField.type_x = 'Text';
		customField.length = 42;
		List<MetadataService.SaveResult> results = 		
			service.createMetadata(
				new MetadataService.Metadata[] { customField });				
		handleSaveResults(results[0]);
	}

	public static void createPage()
	{
		MetadataService.MetadataPort service = createService();		
		MetadataService.ApexPage apexPage = new MetadataService.ApexPage();
		apexPage.apiVersion = 25;
		apexPage.fullName = 'test';
		apexPage.label = 'Test Page';
		apexPage.content = EncodingUtil.base64Encode(Blob.valueOf('<apex:page/>'));
		List<MetadataService.SaveResult> results = 		
			service.createMetadata(
				new MetadataService.Metadata[] { apexPage });				
		handleSaveResults(results[0]);
	}

	public static void listMetadata()
	{
		MetadataService.MetadataPort service = createService();		
		List<MetadataService.ListMetadataQuery> queries = new List<MetadataService.ListMetadataQuery>();		
		MetadataService.ListMetadataQuery queryWorkflow = new MetadataService.ListMetadataQuery();
		queryWorkflow.type_x = 'Workflow';
		queries.add(queryWorkflow);		
		MetadataService.ListMetadataQuery queryValidationRule = new MetadataService.ListMetadataQuery();
		queryValidationRule.type_x = 'ValidationRule';
		queries.add(queryValidationRule);		
		MetadataService.FileProperties[] fileProperties = service.listMetadata(queries, 25);
		for(MetadataService.FileProperties fileProperty : fileProperties)
			System.debug(fileProperty.fullName);
	}
	
	public static MetadataService.MetadataPort createService()
	{ 
		MetadataService.MetadataPort service = new MetadataService.MetadataPort();
		service.SessionHeader = new MetadataService.SessionHeader_element();
		service.SessionHeader.sessionId = UserInfo.getSessionId();
		return service;		
	}

更なる詳細はこちら

#Community Examples

Report Cloning with Apex Metadata API

/**
	 * Method cloneReport(String sFolderApiName, String sReportApiName, String tFolderApiName, String tReportApiName)
	 * @param sFolderApiName: api name of the (source) folder of the report to clone
	 * @param sReportApiName: api name of the (source) report to clone
	 * @param tFolderApiName: api name of the (target) folder to create the cloned report in
	 * @param tReportApiName: api name of the (target) cloned report 
	 */
	public static void cloneReport(String sFolderApiName, String sReportApiName, String tFolderApiName, String tReportApiName) {
	    MetadataService.MetadataPort service = new MetadataService.MetadataPort();
	    service.SessionHeader = new MetadataService.SessionHeader_element();
	    service.SessionHeader.sessionId = UserInfo.getSessionId();
	
	    // Get the report to clone
	    MetadataService.Report reportToClone = (MetadataService.Report) service.readMetadata('Report', new String[] { sFolderApiName+'/'+sReportApiName }).getRecords()[0];
	
	    // Instanciate a new one to attribute the same metadata from the report to clone
	    MetadataService.Report apexReport = new MetadataService.Report();
	    // Set the cloned report properties from parameters and the source report
	    apexReport.name = reportToClone.name + ' Clone';
	    apexReport.fullName = tFolderApiName + '/' + tReportApiName;
	    apexReport.reportType = reportToClone.reportType;
	    apexReport.description = reportToClone.description;
	    apexReport.format = reportToClone.format;
	    apexReport.filter = reportToClone.filter;
	    apexReport.showDetails = reportToClone.showDetails;
	    apexReport.sortColumn = reportToClone.sortColumn;
	    apexReport.sortOrder = reportToClone.sortOrder;
	    apexReport.groupingsAcross = reportToClone.groupingsAcross;
	    apexReport.groupingsDown = reportToClone.groupingsDown;
	    apexReport.chart = reportToClone.chart;
	    apexReport.timeFrameFilter = reportToClone.timeFrameFilter;
	    apexReport.columns = reportToClone.columns;
	
	    // Create the report clone
	    List<MetadataService.SaveResult> results = service.createMetadata(new MetadataService.Metadata[] { apexReport });
	
	    // Handle results
	    handleSaveResults(results[0]);
	}
You can use the report clone example like this...

MetadataServiceExamples.cloneReport('Source_Folder_Api_Name','Source_Report_Api_Name','Target_Folder_Api_Name','Tar
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?