D365/AX7: Attach Report PDF & Send Email using X++/Code

Requirement

Send Email Through X++/Code in D365/AX7

Prerequisites

  1. A valid SMTP mail server
  2. A valid SMTP port number
  3. A valid user name & password

Steps

  1. Go to  System administration – Setup – Email – Email Parameters. Configure the SMTP settings as per below screens.

Untitled.png

Untitled.png

2. Sample Code

Filename fileName = "AbcTest.pdf";
SrsReportRunController controller = new SrsReportRunController();
SRSPrintDestinationSettings settings;
Array arrayFiles;
System.Byte[] reportBytes = new System.Byte[0]();
SRSProxy srsProxy;
SRSReportRunService srsReportRunService = new SrsReportRunService();
Microsoft.Dynamics.AX.Framework.Reporting.Shared.ReportingService.ParameterValue[] parameterValueArray;
Map reportParametersMap;
SRSReportExecutionInfo executionInfo = new SRSReportExecutionInfo();
;

controller.parmReportName(ssrsReportStr(VendBaseData, Report));
controller.parmShowDialog(false);
controller.parmLoadFromSysLastValue(false);
// Provide printer settings
settings = controller.parmReportContract().parmPrintSettings();
settings.printMediumType(SRSPrintMediumType::File);
settings.fileName(fileName);
settings.fileFormat(SRSReportFileFormat::PDF);

// Below is a part of code responsible for rendering the report
controller.parmReportContract().parmReportServerConfig(SRSConfiguration::getDefaultServerConfiguration());
controller.parmReportContract().parmReportExecutionInfo(executionInfo);

srsReportRunService.getReportDataContract(controller.parmreportcontract().parmReportName());
srsReportRunService.preRunReport(controller.parmreportcontract());
reportParametersMap = srsReportRunService.createParamMapFromContract(controller.parmReportContract());
parameterValueArray = SrsReportRunUtil::getParameterValueArray(reportParametersMap);

srsProxy = SRSProxy::constructWithConfiguration(controller.parmReportContract().parmReportServerConfig());
// Actual rendering to byte array
reportBytes = srsproxy.renderReportToByteArray(controller.parmreportcontract().parmreportpath(),parameterValueArray,settings.fileFormat(),settings.deviceinfo());

// You can also convert the report Bytes into an xpp BinData object if needed
container binData;
Binary binaryData;
System.IO.MemoryStream mstream = new System.IO.MemoryStream(reportBytes);
binaryData = Binary::constructFromMemoryStream(mstream);
if(binaryData)
{
binData = binaryData.getContainer();
}

System.Byte[] binData1;
System.IO.Stream stream1;

// Turn the Bytes into a stream
for(int i = 0; i < conLen(binData); i++)
{
binData1 = conPeek(binData,i+1);
stream1 = new System.IO.MemoryStream(binData1);
}

var messageBuilder = new SysMailerMessageBuilder();
messageBuilder.addTo('myemail@email.com')
.setSubject("Fun")
.setBody("Fun");
messageBuilder.setFrom('noreply@yourdomain.in');
if (stream1 != null)
{
messageBuilder.addAttachment(
stream1,
'abcd.pdf');
}

SysMailerFactory::getNonInteractiveMailer().sendNonInteractive(messageBuilder.getMessage());





D365/AX7:Create Ledger Dimension From Main Account & Financial Dimension Values

Requirement

Create Ledger Dimension From Main Account & Financial Dimension Values.

Sample Code

_mainAccountNum = '100920' // your main account or ledger account from a valid chart                                                           //of accounts

_conValue = ['001', 'ABC', 0]     //values of financial dimension added to a container.

static int64 getLedgerDim(MainAccountNum _mainAccountNum, container _conValue)

{

container   _conData;

int hierarchyCount;

int hierarchyIdx;

RecId                   dimAttId_MainAccount;

LedgerRecId            ledgerRecId;

MainAccount mainAccount;

RefRecId recordvalue;

DimensionAttribute     dimensionAttribute;

DimensionAttributeValue dimensionAttributeValue;

DimensionSetSegmentName DimensionSet;

DimensionStorage         dimStorage;

LedgerAccountContract LedgerAccountContract = new LedgerAccountContract();

DimensionAttributeValueContract  ValueContract;

List   valueContracts = new List(Types::Class);

dimensionAttributeValueCombination dimensionAttributeValueCombination;

_conData = _conValue;//["033", "abc", 0];

mainAccount = MainAccount::findByMainAccountId(_mainAccountNum);

recordvalue = DimensionHierarchy::getAccountStructure(mainAccount.RecId,Ledger::current());

hierarchyCount = DimensionHierarchy::getLevelCount(recordvalue);

DimensionSet = DimensionHierarchyLevel::getDimensionHierarchyLevelNames(recordvalue);

for(hierarchyIdx = 1;hierarchyIdx<=hierarchyCount;hierarchyIdx++)

{

if(hierarchyIdx == 1)

continue;




dimensionAttribute = DimensionAttribute::findByLocalizedName(DimensionSet[hierarchyIdx],false,"en-in");




if(dimensionAttribute)

{

dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,conPeek(_conData,hierarchyIdx));

if(dimensionAttributeValue)

{

ValueContract = new DimensionAttributeValueContract();

ValueContract.parmName(dimensionAttribute.Name) ;

ValueContract.parmValue(dimensionAttributeValue.CachedDisplayValue);

valueContracts.addEnd(ValueContract);

}

}

}

LedgerAccountContract.parmMainAccount(_mainAccountNum);

LedgerAccountContract.parmValues(valueContracts);

dimStorage = DimensionServiceProvider::buildDimensionStorageForLedgerAccount(LedgerAccountContract);

dimensionAttributeValueCombination = DimensionAttributeValueCombination::find(dimStorage.save());

ledgerRecId = dimensionAttributeValueCombination.RecId;

return ledgerRecId;

}

D365/AX7:Create Default Dimension From Financial Dimension Values

Requirement

Create Default Dimension From Financial Dimension Values.

Sample Code

DimensionAttributeValueSetStorage valueSetStorage = new DimensionAttributeValueSetStorage();
DimensionDefault result;
int i;
DimensionAttribute dimensionAttribute;
DimensionAttributeValue dimensionAttributeValue;
container conAttr = ["BusinessUnit", "conceptbrand"]; // Dimensions
container conValue = ["001", "ABC"]; // respective Values
str dimValue;
for (i = 1; i <= conLen(conAttr); i++)
{
dimensionAttribute = dimensionAttribute::findByName(conPeek(conAttr,i));
if (dimensionAttribute.RecId == 0)
{
continue;
}
dimValue = conPeek(conValue,i);
if (dimValue != "")
{
// The last parameter is “true”. A dimensionAttributeValue record will be created if not //found.
dimensionAttributeValue =
dimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,dimValue,false,true);
// Add the dimensionAttibuteValue to the default dimension
valueSetStorage.addItem(dimensionAttributeValue);
}
}
result = valueSetStorage.save();