Electronic Reporting: Send vendor payments to external azure storage via X++
Faisal Fareed
10,794
User Group Leader
Electronic Reporting module in Microsoft Dynamics 365 Finance Operation lets you archive file generated by ER at SharePoint location and in Azure Storage as per this link Archive ER destination type - Finance & Operations | Dynamics 365 | Microsoft Learn. APIs can be used to check message status and read file from either location. Logic Apps or Power Automate can be used to make a call to APIs, read files, and perform required action. This post is not about how this can be done via integration :) It's been a while I haven't written a full code base post (no low code :))
To send ER generated files directly to your provided Azure Blob Container, below is the sample class.
using Microsoft.Azure;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.File;
using Microsoft.WindowsAzure.Storage.Blob;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.File;
using Microsoft.WindowsAzure.Storage.Blob;
using Microsoft.WindowsAzure.Storage.Auth;
class DAX_ERVendPaymOutFieUploadHelper
{
{
/// <summary>
/// Handles attachingFile event from Electronic reporting
/// </summary>
/// <param name = "_args">Event args for event handler</param> [SubscribesTo(classStr(ERDocuManagementEvents), staticDelegateStr(ERDocuManagementEvents, attachingFile))]
public static void ERDocuManagementEvents_attachingFile(ERDocuManagementAttachingFileEventArgs _args)
{
ERFormatMappingRunJobTable ERFormatMappingRunJobTable;
Common common = _args.getOwner();
/// Handles attachingFile event from Electronic reporting
/// </summary>
/// <param name = "_args">Event args for event handler</param> [SubscribesTo(classStr(ERDocuManagementEvents), staticDelegateStr(ERDocuManagementEvents, attachingFile))]
public static void ERDocuManagementEvents_attachingFile(ERDocuManagementAttachingFileEventArgs _args)
{
ERFormatMappingRunJobTable ERFormatMappingRunJobTable;
Common common = _args.getOwner();
if(common.tableid == tableNum(ERFormatMappingRunJobTable))
{
ERFormatMappingRunJobTable = ERFormatMappingRunJobTable::find(common.RecId);
}
{
ERFormatMappingRunJobTable = ERFormatMappingRunJobTable::find(common.RecId);
}
if (!_args.isHandled() && ERFormatMappingRunJobTable.Archived == noyes::No)
{
DAX_ERVendPaymOutFieUploadHelper uploadHandler = DAX_ERVendPaymOutFieUploadHelper::construct();
{
DAX_ERVendPaymOutFieUploadHelper uploadHandler = DAX_ERVendPaymOutFieUploadHelper::construct();
uploadHandler.uploadFile(_args.getStream());
}
}
}
}
/// <summary>
/// Creates an object of DAX_ERVendPaymOutFieUploadHelper class
/// </summary>
/// <returns>DAX_ERVendPaymOutFieUploadHelper class object</returns>
/// Creates an object of DAX_ERVendPaymOutFieUploadHelper class
/// </summary>
/// <returns>DAX_ERVendPaymOutFieUploadHelper class object</returns>
public static DAX_ERVendPaymOutFieUploadHelper construct()
{
return new DAX_ERVendPaymOutFieUploadHelper();
}
{
return new DAX_ERVendPaymOutFieUploadHelper();
}
/// <summary>
/// Uploads file to custom Azure blob container specified in parameters
/// </summary>
/// <param name = "_fileStream">File stream to be uploaded</param>
/// <returns>True if file uploaded successfully</returns>
/// Uploads file to custom Azure blob container specified in parameters
/// </summary>
/// <param name = "_fileStream">File stream to be uploaded</param>
/// <returns>True if file uploaded successfully</returns>
private boolean uploadFile(System.IO.Stream _fileStream)
{
boolean ret = true;
{
boolean ret = true;
// Custom parameters table to store Azure Storage and container info
DAX_Parameters parameters = DAX_Parameters::find();
DAX_Parameters parameters = DAX_Parameters::find();
try
{
StorageCredentials credentials = new StorageCredentials(parameters.StorageAccountName, parameters.Key);
{
StorageCredentials credentials = new StorageCredentials(parameters.StorageAccountName, parameters.Key);
CloudStorageAccount storageAccount = new CloudStorageAccount(credentials, true);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer rootContainer = blobClient.GetContainerReference(parameters.ContainerName);
if(!rootContainer.Exists(null, null))
{
return Checkfailed('Azure storage parameters are not set up correctly.');
}
{
return Checkfailed('Azure storage parameters are not set up correctly.');
}
CloudBlobDirectory directory = rootContainer.GetDirectoryReference(parameters.BankOutPaymFolder);
CloudBlockBlob blockBlob = directory.GetBlockBlobReference(strFmt('VendOutPaym.xml'));
if (_fileStream.CanSeek)
{
_fileStream.Seek(0, System.IO.SeekOrigin::Begin);
}
{
_fileStream.Seek(0, System.IO.SeekOrigin::Begin);
}
blockBlob.UploadFromStream(_fileStream, null, null, null);
Info('File uploaded');
}
Info('File uploaded');
}
catch(Exception::Error)
{
ret = checkFailed('Error occurred while uploading the file');
}
{
ret = checkFailed('Error occurred while uploading the file');
}
catch(Exception::CLRError)
{
ret = checkFailed('CLR Error occurred while uploading the file');
}
{
ret = checkFailed('CLR Error occurred while uploading the file');
}
return ret;
}
}
}
}
Comments
-
Electronic Reporting: Send vendor payments to external azure storage via X++Hi,
If we perform these actions, can we upload vendor payment file to Azure blob storage? Its not working for me. what is the minimum (more functionally, less technically) can we do to achieve this?
*This post is locked for comments