Public class BizNodeIntegration_Custom { public static void CreditRatingUpdate (CustTable _custTable) { URL url = strLTrim(@'https://test-integrations-syncoperations.azurewebsites.net/api/companyRating?code=fgfgfgfgfgfg'); //URL url = SysAppUtilities_Custom::getKeyVaultSecret(SysAppUtilities_Custom::IntegrationsFunctionsBaseUrl) + '/api/creditRating?code=' + SysAppUtilities_Custom::getKeyVaultSecret(SysAppUtilities_Custom::IntegrationsFunctionAppMasterKey); System.IO.StringWriter stringWriter; Newtonsoft.Json.JsonTextWriter jsonWriter; System.Byte[] bytes; System.Text.Encoding utf8; stringWriter = new System.IO.StringWriter(); jsonWriter = new Newtonsoft.Json.JsonTextWriter(stringWriter); str jsonString = ""; jsonWriter.WriteStartObject(); jsonWriter.WritePropertyName("RegistrationNumber"); jsonWriter.WriteValue(_custTable.registrationNumber()); jsonWriter.WritePropertyName("CountryCode"); jsonWriter.WriteValue(strDel(_custTable.VATNum,3,strLen(_custTable.VATNum))); jsonWriter.WriteEndObject(); jsonString = stringWriter.ToString(); str method = 'POST'; str contentType = @'application/json'; RetailWebRequest webRequest = RetailWebRequest::newUrl(url); utf8 = System.Text.Encoding::get_UTF8(); bytes = utf8.GetBytes(jsonString); webRequest.parmMethod(method); webRequest.parmContentType(contentType); webRequest.setContentBytes(bytes); RetailCommonWebAPI webApi = RetailCommonWebAPI::construct(); RetailWebResponse webResponse = webApi.getResponse(webRequest); str responseData = webResponse.parmData(); info(responseData); if (webResponse.parmHttpStatus() == 200) { Map responseMap = RetailCommonWebAPI::getMapFromJsonString(responseData); MapEnumerator mapEnumerator; mapEnumerator = responseMap.getEnumerator(); while (mapEnumerator.moveNext()) { switch (mapEnumerator.currentKey()) { case "payload" : container con = mapEnumerator.currentValue(); CustomerCreditInsuranceUpdate_Custom::updateCustomerCreditInsurance(conPeek(con,conFind(con,'companyRating') + 1),_custTable.registrationNumber()); break; default: break; } } } else { info(responseData); } } }
This blog is contains coding reference related to Microsoft AX 2012 and D365 finance and operations and Power platform
Wednesday, January 17, 2024
Send Http request with JSON payload using X++
Tuesday, January 16, 2024
Execute SQL statement from X++
Connection connection; Statement statement; str query; connection = new Connection(); statement = connection.createStatement(); query = "update EnumValueTable set EnumValueTable.enumValue = '75'"; new SqlStatementExecutePermission(query).assert(); statement.executeUpdate(query); CodeAccessPermission::revertAssert();
User multiselect lookup on UI Builder class
class UpdateEndOfLifeOnItemsUIBuilder_Custom extends SysOperationAutomaticUIBuilder { UpdateEndOfLifeOnItemsContract_Custom contract; DialogField usersDF; public void postBuild() { super(); contract = this.dataContractObject() as UpdateEndOfLifeOnItemsContract_Custom; usersDF = this.bindInfo().getDialogField(contract, methodStr(UpdateEndOfLifeOnItemsContract_Custom, parmUsers)); usersDF.lookupButton(FormLookupButton::Always); } public void postRun() { super(); this.lookupUsr(); } /// <summary> /// Creates a multi-select users lookup dialog box field /// </summary> public void lookupUsr() { Query query = new Query(); QueryBuildDataSource qbdsLegalEntity = query.addDataSource(tableNum(UserInfo)); qbdsLegalEntity.fields().addField(fieldNum(UserInfo, id)); qbdsLegalEntity.fields().addField(fieldNum(UserInfo, Name)); container selectedFields = [tableNum(UserInfo), fieldNum(UserInfo, id)]; SysLookupMultiSelectCtrl::constructWithQuery(this.dialog().dialogForm().formRun(), usersDF.control(), query, false, selectedFields); } /// <summary> /// Gets or sets the value of the datacontract parameter users. /// </summary> /// <param name="_users"> /// The new value of the datacontract parameter users; optional. /// </param> /// <returns> /// The current value of datacontract parameter users /// </returns> [ DataMemberAttribute, SysOperationLabelAttribute(literalStr("@SYS25412")), SysOperationDisplayOrderAttribute("2") ] public str parmUsers(str _users = users) { users = _users; return users; } }
Generate CSV file and send as an attachment using X++
class UpdateEndOfLifeOnItemsService_Custom extends SysOperationServiceBase { public void processOperation(UpdateEndOfLifeOnItemsContract_Custom _contract) { Query orderQuery; QueryRun queryRun; boolean closeWSLItem; Str users; orderQuery = _contract.getQuery(); closeWSLItem = _contract.parmCloseWSLItem(); users = _contract.parmUsers(); queryRun = new QueryRun(orderQuery); container userCon = str2con(users, SysAppUtilities_Custom::semiColon); System.Byte[] byteArray; CommaStreamIo io = CommaStreamIo::constructForWrite(); io.outFieldDelimiter(SysAppUtilities_Custom::comma); io.outRecordDelimiter('\r\n'); io.writeExp(['@MCR23630', '@SYS319915' , '@Custom:PLCStat']); Filename fileName = strFmt('@Custom:EOLUpdateFileName', DateTimeUtil::getSystemDate(DateTimeUtil::getUserPreferredTimeZone())); fileName = fileName + ".csv"; while (queryRun.Next()) { ItemId itemId = strMin(); InventTable inventTableMaster = queryRun.get(tableNum(InventTable)); itemId = inventTableMaster.ItemId; EcoResProductLifecycleStateId productLifecycleStateId; if (!this.OnhandQty(inventTableMaster) == 0) { PurchLine purchLine; PurchTable purchTable; select firstonly purchLine where purchLine.ItemId == itemId exists join purchTable where purchTable.PurchId == purchLine.PurchId && purchTable.PurchStatus == PurchStatus::Backorder; if (!purchLine) { if (closeWSLItem) { productLifecycleStateId = EcoResProductLifecycleState::find("40_EOL_int").StateId; SalesLine salesLine; InventTrans inventTrans; InventTransOrigin inventTransOrigin; select firstonly inventTrans where inventTrans.ItemId == itemId && inventTrans.StatusIssue == StatusIssue::ReservPhysical join inventTransOrigin where inventTransOrigin.RecId == inventTrans.InventTransOrigin exists join salesLine where inventTransOrigin.InventTransId == salesLine.InventTransId; if (!inventTrans) { UpdateEndOfLifeOnItemsService_Custom::updateSalesStopped(itemId); } UpdateEndOfLifeOnItemsService_Custom::updatePLCStatus(itemId, productLifecycleStateId); } } io.writeExp([itemId, inventTableMaster.itemName(), productLifecycleStateId]); } } System.IO.Stream stream = iO.getStream(); stream.Position = 0; System.IO.StreamReader reader = new System.IO.StreamReader(stream); str csv = reader.ReadToEnd(); System.Text.Encoding encoding = System.Text.Encoding::get_UTF8(); byteArray = encoding.GetBytes(csv); using(System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(byteArray)) { this.sendEmailNotification(userCon, memoryStream, fileName); } info("@SYS9265"); } public Qty OnhandQty(InventTable _inventtable) { Qty availPhysical; CompanyInfo companyInfo; ItemId item = _inventtable.ItemId; select firstonly companyInfo where companyInfo.IsMasterCompany_Custom == NoYes::Yes; changecompany(companyInfo.DataArea) { InventDim inventDimLoc; InventDimParm inventDimParm; InventTable inventTableMaster = InventTable::find(item); InventLocationId inventLocationId = inventTableMaster.InventItemSalesSetup().inventDimDefault().InventLocationId; InventLocation inventLocation = InventLocation::find(inventLocationId); if (inventLocationId) { inventDimLoc.InventLocationId = inventLocationId; inventDimLoc.InventSiteId = inventLocation.InventSiteId; inventDimLoc = InventDim::findOrCreate(inventDimLoc); inventDimParm.initFromInventDim(InventDim::find(inventDimLoc.inventDimId)); return InventSum::findSum(item, inventDimLoc, inventDimParm).AvailPhysical; } } return 0; } /// <summary> /// Send emails notification about the base cost update to user/user group. /// </summary> /// <param name = "_notifyCon"> /// Container which holds users to whom email notification to be sent. /// </param> /// <param name = "_messageBody"> /// Contains information about the method of calculation to be send to user in email. /// </param> /// <returns> /// boolean true, if sends the notification of users successfully. /// </returns> public boolean sendEmailNotification(container _notifyCon, System.IO.MemoryStream _memoryStream, Filename _fileName) { UserInfo sysUser; boolean messageSent = false; str messageBody; str subject = strFmt('@Custom:EOLUpdateFileName', DateTimeUtil::getSystemDate(DateTimeUtil::getUserPreferredTimeZone())); for (int i = 1; i <= conLen(_notifyCon); i++) { str notifyEmailsStr = conPeek(_notifyCon, i); select firstonly RecId, NetworkAlias from sysUser where sysUser.Id == notifyEmailsStr; if (sysUser.RecId && sysUser.NetworkAlias) { UpdateEndOfLifeOnItemsService_Custom::sendEmail(_fileName, subject, messageBody, _memoryStream, sysUser.NetworkAlias); messageSent = true; } } return messageSent; } public static void sendEmail(str _fileName, str _subject, str _body, System.IO.MemoryStream _memoryStream, Email _toEmail) { SysMailerMessageBuilder mailer = new SysMailerMessageBuilder(); try { mailer.setSubject(_subject); mailer.setBody(_body); mailer.addTo(_toEmail); mailer.addAttachment(_memoryStream, _fileName); SysMailerFactory::sendNonInteractive(mailer.getMessage()); Info("@SYS58551"); } catch (Exception::CLRError) { System.Exception ex = ClrInterop::getLastException(); if (ex != null) { ex = ex.get_InnerException(); if (ex != null) { error(ex.ToString()); } } } catch (Exception::Error) { Error("@CustomASCS:ErrorOccurredFailedSendEmail"); } } public static void updatePLCStatus(ItemId _itemId, EcoResProductLifecycleStateId _productLifecycleStateId) { InventTable inventTable; inventTable.skipDatabaseLog(true); inventTable.skipDataMethods(true); inventTable.skipBusinessEvents(true); inventTable.skipAosValidation(true); inventTable.skipEvents(true); update_recordset crosscompany inventTable setting ProductLifecycleStateId = _productLifecycleStateId where inventTable.ItemId == _itemId; } public static void updateSalesStopped(ItemId _itemId) { InventItemSalesSetup inventItemSalesSetup; inventItemSalesSetup.skipDatabaseLog(true); inventItemSalesSetup.skipDataMethods(true); inventItemSalesSetup.skipBusinessEvents(true); inventItemSalesSetup.skipAosValidation(true); inventItemSalesSetup.skipEvents(true); update_recordset crosscompany inventItemSalesSetup setting Stopped = true where inventItemSalesSetup.ItemId == _itemId && inventItemSalesSetup.InventDimId == InventDim::inventDimIdBlank() && inventItemSalesSetup.DataAreaId != SysAppUtilities_Custom::companyDSSE; } }
Upload SSRS report to SFTP using Renci.SShnet DLL in path /Folder/
using Renci.SshNet; using Renci.SshNet.SftpClient; using Renci.SshNet.Common; using Renci.SshNet.Sftp; using Renci.SshNet.Sftp.SftpFile; using System.IO; class UploadSSRSReportToSFTPService_Custom extends SysOperationServiceBase { public void processOperation(UploadSSRSReportToSFTPContract_Custom _contract) { Query orderQuery; QueryRun queryRun; date processedDate; orderQuery = _contract.getQuery(); queryRun = new QueryRun(orderQuery); processedDate = DateTimeUtil::getSystemDate(DateTimeUtil::getUserPreferredTimeZone()); while (queryRun.Next()) { custInvoiceJour custInvoiceJour = queryRun.get(tableNum(custInvoiceJour)); this.sendFileToSFTP(custInvoiceJour); } } public void sendFileToSFTP(custInvoiceJour _custInvoiceJour) { str ext = SRSPrintDestinationSettings::findFileNameType(SRSReportFileFormat::PDF, SRSImageFileFormat::BMP); Filename filename = _custInvoiceJour.InvoiceId + ext; System.Byte[] reportBytes = this.renderReportToBinaryArray(_custInvoiceJour, filename); if (reportBytes) { using (System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(reportBytes)) { try { str success = 'fail'; CustParameters parameter = CustParameters::find(); str host, username, password, destinationPath; int port; host = parameter.SFTPHostName_Custom; port = str2Int(parameter.SFTPPort_Custom); username = parameter.SFTPUserName_Custom; password = parameter.SFTPPassword_Custom; destinationPath = parameter.SFTPDestinationPath_Custom; SftpClient sftpClient = new SftpClient(host, port, username, password); sftpClient.OperationTimeout = System.TimeSpan::FromMilliseconds(60000); sftpClient.connect(); sftpClient.ChangeDirectory(destinationPath); if (sftpClient.IsConnected) { sftpClient.UploadFile(memoryStream , destinationPath + "@SYS35673" + fileName , null); success = 'pass'; } sftpClient.Disconnect(); sftpClient.Dispose(); if(success == 'pass') { Info(strFmt('@@Custom:UploadReportToSFTPSuccess', filename)); } else { Error('@@Custom:UploadReportToSFTPError'); } } catch (Exception::CLRError) { System.Exception ex = ClrInterop::getLastException(); if (ex != null) { ex = ex.get_InnerException(); if (ex != null) { error(ex.ToString()); } } } catch (Exception::Error) { Error("@@Custom:UploadReportToSFTPError"); } } } } /// <summary> /// Render report to byte array /// </summary> /// <param name = "_contract">contract class object</param> /// <param name = "_documentType">document type</param> /// <param name = "_filename">filename for the report</param> /// <returns>report as a byte array</returns> // private System.Byte[] renderReportToBinaryArray(Object _contract, PrintMgmtDocumentType _documentType, filename _filename) private System.Byte[] renderReportToBinaryArray(custInvoiceJour _custInvoiceJour, Filename _fileName) { SalesInvoiceContract rdpContract = new salesInvoiceContract(); rdpContract.parmRecordId(_custInvoiceJour.RecId); PrintMgmtReportFormatName printMgmtReportFormatName = PrintMgmtDocType::construct(PrintMgmtDocumentType::SalesOrderInvoice).getDefaultReportFormat(); SrsReportRunController srsReportRunController = new SrsReportRunController(); srsReportRunController.parmReportName(printMgmtReportFormatName); srsReportRunController.parmExecutionMode(SysOperationExecutionMode::Synchronous); srsReportRunController.parmShowDialog(false); srsReportRunController.parmReportContract().parmRdpContract(rdpContract); srsReportRunController.parmReportContract().parmReportExecutionInfo(new SRSReportExecutionInfo()); srsReportRunController.parmReportContract().parmReportServerConfig(SRSConfiguration::getDefaultServerConfiguration()); SRSPrintDestinationSettings printerSettings = srsReportRunController.parmReportContract().parmPrintSettings(); printerSettings.printMediumType(SRSPrintMediumType::File); printerSettings.fileFormat(SRSReportFileFormat::PDF); printerSettings.parmFileName(_fileName); SRSReportRunService srsReportRunService = new SrsReportRunService(); srsReportRunService.getReportDataContract(srsReportRunController.parmReportContract().parmReportName()); srsReportRunService.preRunReport(srsReportRunController.parmReportContract()); Map reportParametersMap = srsReportRunService.createParamMapFromContract(srsReportRunController.parmReportContract()); Microsoft.Dynamics.AX.Framework.Reporting.Shared.ReportingService.ParameterValue[] parameterValueArray = SrsReportRunUtil::getParameterValueArray(reportParametersMap); SRSProxy srsProxy = SRSProxy::constructWithConfiguration(srsReportRunController.parmReportContract().parmReportServerConfig()); System.Byte[] reportBytes = srsproxy.renderReportToByteArray(srsReportRunController.parmreportcontract().parmreportpath(), parameterValueArray, printerSettings.fileFormat(), printerSettings.deviceinfo()); return reportBytes; } }
Subscribe to:
Posts (Atom)