/// create/Update marking between purhcase order and transfer order /// </summary> /// <param name = "_inventTransId">receipt InventTrans PO</param> /// <param name = "_refInventTransId">Issue InventTrans TO</param> /// <param name = "_qtyToMark">qty</param> public void updateMarking(InventTransId _inventTransId, InventTransId _refInventTransId, Qty _qtyToMark = 0) { Qty qtyToMark; try { TmpInventTransMark tmpInventTransMark; InventTransId issueInventTransId = _inventTransId; InventTransId receiptInventTransId = _refInventTransId; InventTransOriginId receiptInventTransOriginId = InventTransOrigin::findByInventTransId(receiptInventTransId).RecId; InventTrans receiptInventTrans = InventTrans::findByInventTransOrigin(receiptInventTransOriginId); InventTransOriginId issueInventTransOriginId = InventTransOrigin::findByInventTransId(issueInventTransId).RecId; InventTrans issueInventTrans = InventTrans::findByInventTransOrigin(issueInventTransOriginId); InventTransMarkCollection collection = TmpInventTransMark::markingCollection( InventTransOrigin::find(receiptInventTransOriginId), receiptInventTrans.inventDim(), receiptInventTrans.Qty); collection.insertCollectionToTmpTable(tmpInventTransMark); select firstonly tmpInventTransMark where tmpInventTransMark.InventTransOrigin == issueInventTrans.InventTransOrigin && tmpInventTransMark.InventDimId == issueInventTrans.InventDimId; if (tmpInventTransMark.RecId != 0) { qtyToMark = issueInventTrans.Qty; tmpInventTransMark.QtyMarkNow = qtyToMark; tmpInventTransMark.QtyRemain -= tmpInventTransMark.QtyMarkNow; Map mapUpdated = new Map(Types::Int64, Types::Record); mapUpdated.insert(tmpInventTransMark.RecId, tmpInventTransMark); TmpInventTransMark::updateTmpMark( receiptInventTransOriginId, receiptInventTrans.inventDim(), -qtyToMark, mapUpdated.pack()); } } catch (Exception::Error) { throw error(strFmt("FailMarkInventtransaction", _refInventTransId)); } }
This blog is contains coding reference related to Microsoft AX 2012 and D365 finance and operations and Power platform
Tuesday, December 13, 2022
D365FO: Inventory marking between purchase order and transfer order
Monday, December 12, 2022
D365FO IDisposable context class
Scenario: pass additional parameter to a method that doesnt have a parametr signature
After the execution of using code block , Dispose method will be called. IDisposible is a singleton instance of a class per session, for example if you open two different tabs and run the code you will get two different instance of the class
class DocTypeFile_CUSTOM_Context implements System.IDisposable { static DocTypeFile_CUSTOM_Context docTypeFileContext; public boolean overrideDefaultDocType = false; public boolean printSalesInvoiceReport; public boolean printSalesConfReport; // public PrintMgmtDocumentType printMgmtDocumentType; public DocuTypeId doucTypeId = strMin(); public void new() { if(docTypeFileContext) { throw error("NestingIsNotSupported"); } docTypeFileContext = this; } public void dispose() { docTypeFileContext = null; } static public DocTypeFile_CUSTOM_Context current() { return docTypeFileContext; } }
/// <summary> /// To handle the report design to print based on caller /// </summary> [ExtensionOf(classStr(SalesInvoiceController))] final class SalesInvoiceController_CUSTOM_Extension { /// <summary> /// choose report design /// </summary> protected void outputReport() { //initalize disposible context class using (var docTypeFileContext = new DocTypeFile_CUSTOM_Context()) { SRSPrintDestinationSettings srsPrintDestinationSettings = formLetterReport.getCurrentPrintSetting().parmPrintJobSettings(); if (srsPrintDestinationSettings.printMediumType() == SRSPrintMediumType::File) { docTypeFileContext.overrideDefaultDocType = true; docTypeFileContext.doucTypeId = "File"; } next outputReport(); } } }
[ExtensionOf(tableStr(DocuType))] final class DocuType_CUSTOM_Extension { static DocuTypeId typeFile() { DocuTypeId docuTypeId; docuTypeId = next typeFile(); DocTypeFile_CUSTOM_Context docTypeFileContext = DocTypeFile_CUSTOM_Context::current(); if(docTypeFileContext && docTypeFileContext.overrideDefaultDocType) { docuTypeId = docTypeFileContext.doucTypeId; } return docuTypeId; } }
Monday, December 5, 2022
Release Number sequence X++
NumberSeq::release(numSeq.parmNumberSequenceCode(), "Number Seq to be released");
NumberSeq::release("@AR26", CustTable.AccountNum);
Wednesday, November 30, 2022
D365FO: Zip/Unzip memory stream to byte[] array X++
Sometimes we have to deal with big file streams, during that scenario there is an option to zip/unzip the file using gzip in X++. for example: Pass files larger than 25MB to logic apps, logic app has a file size limit of 25 MB
using System.IO; using System.IO.Compression; class ZipUnzip { public static System.Byte[] Compress(System.Byte[] data) { var compressedStream = new MemoryStream(); var zipStream = new GZipStream(compressedStream, CompressionMode::Compress); zipStream.Write(data, 0, data.Length); zipStream.Close(); return compressedStream.ToArray(); } public static System.Byte[] Decompress(System.Byte[] data) { var compressedStream = new MemoryStream(data); var zipStream = new GZipStream(compressedStream, CompressionMode::Decompress); var resultStream = new MemoryStream(); System.Byte[] buffer = new System.Byte[4096](); int read; do { read = zipStream.Read(buffer, 0, buffer.Length); resultStream.Write(buffer, 0, read); } while(read); return resultStream.ToArray(); } }
Thursday, November 24, 2022
D365FO: RESET TTS LEVEL
internal final class resettts { /// <summary> /// Class entry point. The system will call this method when a designated menu /// is selected or when execution starts and this class is set as the startup class. /// </summary> /// <param name = "_args">The specified arguments.</param> public static void main(Args _args) { while (appl.ttsLevel() > 0) { info(strfmt("Level %1 aborted",appl.ttsLevel())); ttsAbort; } } }
D365FO: Test Webservices using SoapUI
In soap UI create a new test suite and
create a new POST Http request with below values
Request URL: https://login.microsoftonline.com/YourTenant.onmicrosoft.com/oauth2/token
client_id : xxxxxxx-xxx-xxxx-xxx-xxxxxxxxxx
client_secret : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Resource : https://onebox.sandbox.operations.dynamics.com
grant_type : client_credentials
Run the request copy the access token from
the JSON window into a notepad
Append bearer before the access token
Example
bearer
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik1yNS1BVWliZkJpaTdOZDFqQmViYXhib1hXMCIsImtpZCI6Ik1yNS1BVWliZkJpaTdOZDFqQmViYXhib1hXMCJ9.eyJhdWQiOiJodHRwczovL3RkY2NhZHlwcmVwcm9kLnNhbmRib3gub3BlcmF0aW9ucy5keW5hbWljcy5jb20iLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC9lOGRjZjZlNi0zYWNjLTRhZjktOWNiMi03N2Y2ODhjYjY4OGIvIiwiaWF0IjoxNjQ0NDg3ODcwLCJuYmYiOjE2NDQ0ODc4NzAsImV4cCI6MTY0NDQ5MTc3MCwiYWlvIjoiRTJaZ1lDaWI4ZjNWOUNmL2p1aG5Xd1FzWTNXcUFnQT0iLCJhcHBpZCI6IjEyYzFhY2RmLTAzNjktNDk3OC1hYWQzLTM3OGQxY2I3NTM5ZSIsImFwcGlkYWNyIjoiMSIsImlkcCI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0L2U4ZGNmNmU2LTNhY2MtNGFmOS05Y2IyLTc3ZjY4OGNiNjg4Yi8iLCJvaWQiOiIzNDJlNDMyOC02ZGM3LTQ1MjItYjcwMS1iOWQ4Yzc1N2NmNzUiLCJyaCI6IjAuQVFzQTV2YmM2TXc2LVVxY3NuZjJpTXRvaXhVQUFBQUFBQUFBd0FBQUFBQUFBQUFMQUFBLiIsInJvbGVzIjpbIkNvbm5lY3Rvci5GdWxsQWNjZXNzIl0sInN1YiI6IjM0MmU0MzI4LTZkYzctNDUyMi1iNzAxLWI5ZDhjNzU3Y2Y3NSIsInRpZCI6ImU4ZGNmNmU2LTNhY2MtNGFmOS05Y2IyLTc3ZjY4OGNiNjg4YiIsInV0aSI6IkJoSjFEaUYxb2thd0NsOURtZVE5QUEiLCJ2ZXIiOiIxLjAifQ.EKQ8IVQEzHmJ5W2L0p80HnPKCP86tOgXyT5FuM4OBDeNotxbSPSXPhqq9CV3qNBSUY9l0KXcbla1rDNd7SrZv079oeOsCZaDoTp4L4D8IeYfTAzoSKhmcm3ljaLZIBw4XWC5kcG1pn_o19uDDj9OzBDM9RzUrfwyy-X-TOewBApQe5oEzhwMoTsFrzod6u_8x_tXtWoqjCfWwzbC7bH9jsDMc3cKX4NdebHDdeklIDY9j1kHc3rTYxDlhcu6kLQeN2WVajuuhs52s56YXfJj4Dpz7alTsfIpHeCc5icnijwJx3BQ03kUH2cqFfl6KttowO-cjiBUix2dX3HqTAfN1Q
Copy the access modified text then go to
the request and add Authorization into the Header of the request and paste the
text as value
Also remove the optional tags in the call
context.
D365FO:Delete BatchJob History through SQL query
--delete from batchJobHistory where createdDateTime < '2020-12-31 16:00:49.000' --DELETE FROM batchHistory --WHERE BatchJobHistoryId NOT IN -- (SELECT RECID FROM batchJobHistory ) --DELETE FROM constraintHistory --WHERE DependsOnBatchId NOT IN -- (SELECT RECID FROM batchHistory )
D365FO:Cancel Purchase order through X++
Create a new class and extend standard PurchCancel class
class PurchCancel_CUSTOM extends PurchCancel { public void cancelPO(PurchTable _PurchTable) { PurchCancel_CUSTOM purchCancel = PurchCancel_CUSTOM::construct(); purchCancel.parmPurchTable(_PurchTable); // purchTable = _PurchTable; purchCancel.run(); } static PurchCancel_CUSTOM construct() { return new PurchCancel_CUSTOM(); } void new() { super(); } }
Wednesday, November 16, 2022
SalesInvoice change file name when using print management with File DocumentType
/// <summary> /// To handle the report design to print based on caller /// </summary> [ExtensionOf(classStr(SalesInvoiceController))] final class SalesInvoiceController_MY_Extension { /// <summary> /// choose report design /// </summary> protected void outputReport() { Args controllerArgs = this.parmArgs(); SRSCatalogItemName reportDesign; if((controllerArgs.menuItemName() == menuItemOutputStr(SalesInvoice_CUSTOM)) || custInvoiceJour.isProforma() || (controllerArgs.menuItemName() == menuItemOutputStr(SalesInvoice))) { reportDesign = ssrsReportStr(SalesInvoice_Custom,Report_Custom); } else { reportDesign = ssrsReportStr(SalesInvoice_Custom,Report); } this.parmReportName(reportDesign); this.parmReportContract().parmReportName(reportDesign); SRSPrintDestinationSettings srsPrintDestinationSettings = formLetterReport.getCurrentPrintSetting().parmPrintJobSettings(); SRSPrintMediumType srsPrintMediumType = srsPrintDestinationSettings.printMediumType(); formletterReport.parmReportRun().settingDetail().parmReportFormatName(reportDesign); if (srsPrintDestinationSettings.printMediumType() == SRSPrintMediumType::File) { srsPrintDestinationSettings.fileName(custInvoiceJour.InvoiceId); } srsPrintDestinationSettings.overwriteFile(true); next outputReport(); }