SlideShare a Scribd company logo
The Largest Independent Gathering
of the Microsoft User Ecosystem
Decrease Complexities,
Deliver Results.
@ 2023 Dynamic Communities
X++ Extreme: Boost
Your Development
Skills with Proven
Tips and Tricks
The Largest Independent Gathering
of the Microsoft User Ecosystem
Decrease Complexities,
Deliver Results.
@ 2023 Dynamic Communities
Nathan Clouse
Technical Architect
enVista Corp.
Microsoft Business Applications MVP (4x)
nclouse@envistacorp.com
www.atomicax.com
www.dynamics.fo
@NathanClouseAX
The Largest Independent Gathering
of the Microsoft User Ecosystem
Decrease Complexities,
Deliver Results.
@ 2023 Dynamic Communities
Peter Ramer
Director of Managed Application Services
RSM
Microsoft Business Applications MVP (2x)
www.dynamics365musings.com
@ 2023 Dynamic Communities
Agenda
• Coding Tips
• D365FO.Tools
• Quality of Life Hacks
• Debugging
• Visual Studio Hidden
The Largest Independent Gathering
of the Microsoft User Ecosystem
Decrease Complexities,
Deliver Results.
@ 2023 Dynamic Communities
Coding Tips
@ 2023 Dynamic Communities
Use Set Based Operations
• Update_recordset rather than while select w/ update
• RecordInsertList rather looped inserts
• RecordInsertList rather than insert_recordset
• Delete_from rather than while select update
@ 2023 Dynamic Communities
Using FieldNum Ordinals
• Standard: CustTable.AccountNum
• Using Ordinals: CustTable.(fieldNum(CustTable,AccountNum))
@ 2023 Dynamic Communities
Add Financial Dimension for OData
• Dynamics 365 > Addins > Add financial dimensions for OData
@ 2023 Dynamic Communities
Comment Code
CTRL K, CTRL U
@ 2023 Dynamic Communities
Uncomment Code
• CTRL K, CTRL U
@ 2023 Dynamic Communities
Format Code
• CTRL K , D
@ 2023 Dynamic Communities
Toggle Breakpoints
• F9
@ 2023 Dynamic Communities
Go To (Main Thing)
• Hit F9 in design view to go to
the main thing for the item
selected
• F9 on a table extension will
take you to the base table
• F9 on a field will take you to
the EDT
• F9 on a field with a
relationship will take you to
the related table
• F9 on a field in a data
entity will open the
table/entity for that
field
• F9 on COC Extension
Class will take you to
the main class
@ 2023 Dynamic Communities
Copy Event Handlers - Methods
• In design view, expand methods, right click, copy event handler
@ 2023 Dynamic Communities
Copy Event Handler - Events
• In design view, expand events, right click, copy event handler
@ 2023 Dynamic Communities
Sales order Totals
https://dynamics365musings.com/d365-sales-order-totals/
@ 2023 Dynamic Communities
Extensible Controls
• https://www.youtube.com/watch?v=QrIjTN6Vey4&t=149s
• https://sangeethwiki.blogspot.com/2017/09/extensible-controls-i
n-dynamics-365-for.html
• Use Javascript and html to create your own D365 controls.
@ 2023 Dynamic Communities
Paste Special
• Edit > Paste Special
• XML as Class
• JSON as Class
@ 2023 Dynamic Communities
Paste Special
{"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick":
"CreateNewDoc()"},
{"value": "Open", "onclick":
"OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}}
public class Menu
{
public string id { get; set; }
public string value { get; set; }
public Popup popup { get; set; }
}
public class Popup
{
public Menuitem[] menuitem { get; set; }
}
public class Menuitem
{
public string value { get; set; }
public string onclick { get; set; }
}
@ 2023 Dynamic Communities
If XML Option Missing…
• Add ASP.NET to VS
@ 2023 Dynamic Communities
CrossCompany
static void JobDemoCrossCompany(Args _args)
{
BankAccountTable tabBAT; // saveDataPerCompany == true.
container conCompanies = [ 'cm1', 'cm2', 'dat' ];
str 4 sCompanyPrevious = " "; // Maximum length is 4 characters.
int iCountCompanies = 0;
;
while select
crossCompany
: conCompanies
* from tabBAT
order by dataAreaId
{
if ( sCompanyPrevious != tabBAT.dataAreaId )
{
info( tabBAT.dataAreaId + " = tabBAT.dataAreaId" );
iCountCompanies++;
if ( iCountCompanies >= 2 )
{
break;
}
sCompanyPrevious = tabBAT.dataAreaId;
}
}
return;
}
@ 2023 Dynamic Communities
BankAccountTable tabBAT; // saveDataPerCompany == true.
container conCompanies = [ 'cm1', 'cm2', 'dat' ];
str 4 sCompanyPrevious = " "; // Maximum length is 4 characters.
int iCountCompanies = 0;
;
while select
crossCompany
: conCompanies
* from tabBAT
order by dataAreaId
{
…
}
return;
}
CrossCompany
@ 2023 Dynamic Communities
static void JobDemoAllowCrossCompany(Args _args)
{
BankAccountTable tabBAT; // saveDataPerCompany == true.
Query qry2;
QueryBuildDataSource qbds3;
QueryRun qrun4;
str sCompanyPrevious = " ";
int iCountCompanies = 0;
int iTableNumBAT;
;
qry2 = new Query();
qry2.allowCrossCompany( true );
qry2.addCompanyRange( 'dat' );
qry2.addCompanyRange( 'twf' );
iTableNumBAT = tableNum( BankAccountTable );
qbds3 = qry2 .addDataSource( iTableNumBAT );
//qbds3.company( 'dat' );
qrun4 = new QueryRun( qry2 );
while ( qrun4.next() )
{
if ( qrun4.changed( iTableNumBAT ) )
{
tabBAT = qrun4.get( iTableNumBAT );
if ( sCompanyPrevious != tabBAT.dataAreaId )
{
print( tabBAT.dataAreaId + " = tabBAT.dataAreaId" );
iCountCompanies++;
if ( iCountCompanies >= 2 )
{
break;
}
sCompanyPrevious = tabBAT.dataAreaId;
}
}
}
pause;
return;
}
CrossCompany Queries
@ 2023 Dynamic Communities
BankAccountTable tabBAT; // saveDataPerCompany == true.
Query qry2;
QueryBuildDataSource qbds3;
QueryRun qrun4;
str sCompanyPrevious = " ";
int iCountCompanies = 0;
int iTableNumBAT;
;
qry2 = new Query();
qry2.allowCrossCompany( true );
qry2.addCompanyRange( 'dat' );
qry2.addCompanyRange( 'twf' );
CrossCompany Queries
@ 2023 Dynamic Communities
public static container download(container _parms)
{
RunAsPermission perm;
perm = new RunAsPermission("Admin");
perm.assert();
Container returncontainer = runAs("Admin",
classnum(AcxSharepointIntegeration), "get", _parms);
CodeAccessPermission::revertAssert();
return returncontainer;
}
RunAsPermission
@ 2023 Dynamic Communities
str Mobile = "712,3456789";
if (strLen(strRem(Mobile, ",")) != strLen(strKeep(strRem(Mobile, ","),
"1234567890")))
{ throw error("Invalid Mobile Number"); }
else
{ info("Valid Mobile Number"); }
StrKeep
@ 2023 Dynamic Communities
static void testZeroPadding(Args _args)
{
int i = 1;
str padded;
str finalResult;
;
// Create a string, with a length of 5, ending with the value of i and padded
with zeros
padded = strRFix(int2str(i), 5, "0");
finalResult = strFmt("ABC-%1", padded);
// 00001
}
StrRFix and StrLFix
@ 2023 Dynamic Communities
• X++ is good but what it can’t do, C# can do
• Call an external web service
• Handle JSON/XML tedium
• FTP
Use C#
@ 2023 Dynamic Communities
class AAX_AzureQueueTest
{
const str connectionString =
"Endpoint=sb://[urlName]servicebus.windows.net/;SharedAccessKeyName=[SharedAccessName];SharedAccessKey=[SharedAccessKey]=;EntityPath=[QueueName]";
public static void main(Args args)
{
AAX_AzureQueueLibrary.ReceiveAzureQueue ReceiveAzureQueue = new AAX_AzureQueueLibrary.ReceiveAzureQueue();
AAX_AzureQueueLibrary.SendAzureQueue SendAzureQueue = new AAX_AzureQueueLibrary.SendAzureQueue();
//x++ get a guid, not C#
str s = "Test Message " + WinAPIServer::createGUID();
SendAzureQueue.connect(connectionString);
SendAzureQueue.sendMessage(s);
SendAzureQueue.close();
info(strFmt("sent: %1", s));
s = "";
ReceiveAzureQueue.connect(connectionString);
s = ReceiveAzureQueue.readMessage();
ReceiveAzureQueue.completeMessage();
ReceiveAzureQueue.close();
info(strFmt("Received: %1", s));
}
}
Use C#
@ 2023 Dynamic Communities
• Can’t locate an error that is being thrown? Add a breakpoint in
info.Add() (on switch (logLevel))
• Use funcName() to help with figuring problems out
• QueryBuildDataSource.toString() to see the SQL for a query
• Data Entities can be temperamental; DB Sync, delete entity (from
Data Entity Screen), rebuild list, test again
Other Stuff
The Largest Independent Gathering
of the Microsoft User Ecosystem
Decrease Complexities,
Deliver Results.
@ 2023 Dynamic Communities
D365FO.Tools
@ 2023 Dynamic Communities
• PowerShell module to handle the different management tasks
during a Dynamics 365 Finance & Operations
• Install-Module -Name d365fo.tools
• Update-Module -name d365fo.tools
D365FO.Tools
@ 2023 Dynamic Communities
• Stop-D365Environment -All
• Stop-D365Environment -Aos -Batch
• Stop-D365Environment -FinancialReporter -DMF
• Stop-D365Environment -All -Kill
Stop An Environment
@ 2023 Dynamic Communities
• Start-D365Environment -ShowOriginalProgress
• Start-D365Environment -All
• Start-D365Environment -Aos -Batch
• Start-D365Environment -FinancialReporter -DMF
Start An Environment
@ 2023 Dynamic Communities
• Restart-D365Environment -All -ShowOriginalProgress
Restart
@ 2023 Dynamic Communities
• Set-D365Admin "claire@contoso.com"
(Re)Set D365FO Admin
@ 2023 Dynamic Communities
• Invoke-D365LcsDatabaseExport -ProjectId 123456789 -
SourceEnvironmentId "958ae597-f089-4811-abbd-c1190917eaae" -
BackupName "BackupViaApi" -BearerToken "JldjfafLJdfjlfsalfd..." -
LcsApiUri "https://lcsapi.lcs.dynamics.com"
Export Database from Sandbox
@ 2023 Dynamic Communities
• Invoke-D365LcsDatabaseRefresh -ProjectId 123456789 -
SourceEnvironmentId "958ae597-f089-4811-abbd-c1190917eaae" -
TargetEnvironmentId "13cc7700-c13b-4ea3-81cd-2d26fa72ec5e" -
BearerToken "JldjfafLJdfjlfsalfd..." -LcsApiUri
"https://lcsapi.lcs.dynamics.com"
Refresh Database (Prod To Sandbox)
@ 2023 Dynamic Communities
• Invoke-D365DbSyncModule -Module "MyModel1"
• Invoke-D365DbSyncModule -Module "MyModel1","MyModel2"
• Get-D365Module -Name "MyModel*" | Invoke-D365DbSyncModule
Sync Database for Module(s)
@ 2023 Dynamic Communities
• Invoke-D365DBSyncPartial -SyncList
"CustCustomerEntity","SalesTable"
• Invoke-D365DBSyncPartial -SyncList
"CustCustomerEntity","SalesTable" -Verbose
Partial DB Sync
@ 2023 Dynamic Communities
• Invoke-D365DBSync
• Invoke-D365DBSync -Verbose
DB Sync
@ 2023 Dynamic Communities
• Install-D365SupportingSoftware -Name vscode
• Install-D365SupportingSoftware -Name "vscode","fiddler"
• Install-D365SupportingSoftware -Name googlechrome
Install Supporting Software
@ 2023 Dynamic Communities
• Get-D365Url
Getting Environment URL
@ 2023 Dynamic Communities
• Get-D365AOTObject -Name *flush* -ObjectType AxClass -Path "C:AOSService
PackagesLocalDirectoryApplicationFoundation"
• Get-D365AOTObject -Name *flush* -ObjectType AxClass -IncludePath -Path "C:
AOSServicePackagesLocalDirectoryApplicationFoundation"
• Get-D365InstalledPackage -Name Application* | Get-D365AOTObject -Name
*flush* -ObjectType AxClass
• Get-D365AOTObject -Path "C:AOSServicePackagesLocalDirectory*" -Name
*flush* -ObjectType AxClass -SearchInPackages
Searching for an AOT Object
@ 2023 Dynamic Communities
• Enable-D365MaintenanceMode -ShowOriginalProgress
• Disable-D365MaintenanceMode -ShowOriginalProgress
Maintenance Mode
@ 2023 Dynamic Communities
• Invoke-D365InstallSqlPackage
• Import-D365Bacpac -ImportModeTier1 -BacpacFile "C:temp
uat.bacpac" -NewDatabaseName "ImportedDatabase_YYYYMMDD"
Import Database into Dev (T1)
@ 2023 Dynamic Communities
• New-D365Bacpac -ExportModeTier1 -BackupDirectory c:Temp
backup -NewDatabaseName Testing1 -BacpacFile "C:TempBacpac
Testing1.bacpac"
Export Database from Dev (T1)
The Largest Independent Gathering
of the Microsoft User Ecosystem
Decrease Complexities,
Deliver Results.
@ 2023 Dynamic Communities
Quality Of Life
@ 2023 Dynamic Communities
• https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/fin-ops/
get-started/grid-capabilities
• Just copy and paste.
• Plus, lots of other features (Enabled in Feature Management)
Copy data from excel to D365 grid
@ 2023 Dynamic Communities
• https://dynamics365musings.com/d365-table-browser/
• https://<environmentURL>/?
mi=SysTableBrowser&tablename=<tablename>
Table Browser
@ 2023 Dynamic Communities
Run VS as Admin
• Start
• Search for Visual Studio 2019
• Right click > Open file location
• Find icon, right click > Properties > Advanced
• Check “Run As Administrator”
@ 2023 Dynamic Communities
Run SSMS as Admin
• Nearly the same as for VS 2019
@ 2023 Dynamic Communities
Run D365FO.Tools in VS
• Run PowerShell from VS
• Like D365FO.Tools
@ 2023 Dynamic Communities
@ 2023 Dynamic Communities
Run D365FO.Tools in VS
• Run PowerShell from VS
• Like D365FO.Tools
@ 2023 Dynamic Communities
Plus Aliases
• Use notepad $profile
@ 2023 Dynamic Communities
@ 2023 Dynamic Communities
• Using NOLOCK when directly querying SQL can show uncommitted
records
• Useful when debugging
• I.e.:
SELECT *
FROM SalesTable WITH (nolock)
WHERE SalesId = ‘SO04381969’
AND DataAreaId = ‘USMF’
Querying in SQL w/ nolock
The Largest Independent Gathering
of the Microsoft User Ecosystem
Decrease Complexities,
Deliver Results.
@ 2023 Dynamic Communities
Debugging
@ 2023 Dynamic Communities
Debugging Batch Jobs
• Attached to process
• Show all processes from all users
• Look for Batch.exe
@ 2023 Dynamic Communities
Loading Symbols
• Tools > Options
@ 2023 Dynamic Communities
Loading Symbols
@ 2023 Dynamic Communities
Loading Symbols
@ 2023 Dynamic Communities
Load all modules
The Largest Independent Gathering
of the Microsoft User Ecosystem
Decrease Complexities,
Deliver Results.
@ 2023 Dynamic Communities
Visual Studio
Hidden Gems
@ 2023 Dynamic Communities
• Create code extension
Create code extension
@ 2023 Dynamic Communities
• Update model parameters
Update Model Parameters
@ 2023 Dynamic Communities
Order Labels in label file by ID
@ 2023 Dynamic Communities
Build Options
@ 2023 Dynamic Communities
Dark Mode Plus Custom Colors
@ 2023 Dynamic Communities
@ 2023 Dynamic Communities
Dark Mode Plus Custom Colors
@ 2023 Dynamic Communities
@ 2023 Dynamic Communities
Metadata Search
• Search on any option, value, metadata, whatever,
on an element
• type:"form" ccount
• type:"class"
extensionpoint:"eventhandlers,eventdelegates"
@ 2023 Dynamic Communities
• type:"dataentityview"
property:"PublicCollectionName=CustomerStatisticsGroups"
• type:"dataentityview"
property:"PublicEntityName=CustomerStatisticsGroup"
Metadata Search
@ 2023 Dynamic Communities
• Open Source
• https://github.com/TrudAX/TRUDUtilsD365
• Prototyping Tools that help with productivity
• Configurable
• Similar idea from AX 2009/2012 with configurable MorphX tools
TRUDUtilsD365
@ 2023 Dynamic Communities
VS E: on Form Extensions
@ 2023 Dynamic Communities
VS L: on Form Extensions
@ 2023 Dynamic Communities
• http://www.atomicax.com/article/d365fotools-and-vs2017-manhattan-project
• https://docs.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/dev-ref/x
pp-business-run-time-functions
• https://docs.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/dev-ref/x
pp-string-run-time-functions
• https://jatomas.com/en/2020/05/02/dark-mode-visual-studio-x-code-editor/
• https://dynamics365musings.com/d365-sales-order-totals/
• https://www.youtube.com/watch?v=QrIjTN6Vey4&t=149s
• https://sangeethwiki.blogspot.com/2017/09/extensible-controls-in-dynamics-36
5-for.html
Resources
@ 2023 Dynamic Communities
• https://ariste.info/en/2021/06/socratex-application-checker/
• https://github.com/TrudAX/TRUDUtilsD365
Resources
The Largest Independent Gathering
of the Microsoft User Ecosystem
Decrease Complexities,
Deliver Results.
@ 2023 Dynamic Communities
Questions?
@ 2023 Dynamic Communities
• Nathan Clouse
• nclouse@envistacorp.com
• www.atomicax.com
• www.dynamics.fo
• @NathanClouseAX
• https://www.linkedin.com/in/nath
anclouseax/
Thanks!
• Peter Ramer
• www.dynamics365musings.com
• https://www.linkedin.com/in/peter-r
amer/
82
@ 2023 Dynamic Communities
Decrease Complexities,
Deliver Results.
The Largest Independent Gathering
of the Microsoft User Ecosystem
Thank you for
Attending!
© 2023 Dynamic Communities. All rights reserved.
© 2023 Dynamic Communities. All rights reserved.

More Related Content

PPTX
MongoDB.local Atlanta: Introduction to Serverless MongoDB
MongoDB
 
PDF
Google Analytics for Developers
Paradigma Digital
 
PDF
Google Analytics for Developers
Rubén Martínez
 
PDF
#MBLTdev: Разработка первоклассных SDK для Android (Twitter)
e-Legion
 
PDF
Google Developer Days Brazil 2009 - Google Social Web
Patrick Chanezon
 
PPTX
A Microsoft Silverlight User Group Starter Kit Made Available for Everyone to...
DataLeader.io
 
PDF
The Future of Sharding
EDB
 
PPTX
Criteo Infrastructure (Platform) Meetup
Ibrahim Abubakari
 
MongoDB.local Atlanta: Introduction to Serverless MongoDB
MongoDB
 
Google Analytics for Developers
Paradigma Digital
 
Google Analytics for Developers
Rubén Martínez
 
#MBLTdev: Разработка первоклассных SDK для Android (Twitter)
e-Legion
 
Google Developer Days Brazil 2009 - Google Social Web
Patrick Chanezon
 
A Microsoft Silverlight User Group Starter Kit Made Available for Everyone to...
DataLeader.io
 
The Future of Sharding
EDB
 
Criteo Infrastructure (Platform) Meetup
Ibrahim Abubakari
 

Similar to F&O Summit 2023 Speaker X++ Tips and Tricks.pptx (20)

PDF
Supercharge your data analytics with BigQuery
Márton Kodok
 
PPTX
10 ways to make your code rock
martincronje
 
PPTX
Building Your First App with MongoDB Stitch
MongoDB
 
PDF
AngularJS in large applications - AE NV
AE - architects for business and ict
 
PDF
Building Twitter's SDKs for Android
Andy Piper
 
PPTX
Tutorial: Building Your First App with MongoDB Stitch
MongoDB
 
PPTX
Azure from scratch part 4
Girish Kalamati
 
PDF
VMWorld 2017 Hackathon training: Getting Started with Clarity
Jeeyun Lim
 
PDF
Google Devfest 2009 Argentina - Google and the Social Web
Patrick Chanezon
 
PDF
Scaling Experimentation & Data Capture at Grab
Roman
 
PPTX
WebAppseqweqweqweqwewqeqweqweReImagined.pptx
FaisalTiftaZany1
 
PPTX
Digital analytics with R - Sydney Users of R Forum - May 2015
Johann de Boer
 
PPTX
A miało być tak... bez wycieków
Konrad Kokosa
 
PDF
Engage 2013 - Why Upgrade to v10 Tag
Webtrends
 
PPTX
GraphQL Summit 2019 - Configuration Driven Data as a Service Gateway with Gra...
Noriaki Tatsumi
 
PDF
Large scale data capture and experimentation platform at Grab
Roman
 
PDF
JavaScript Refactoring
Krzysztof Szafranek
 
PDF
Social Stream Analysis Use Cases
WSO2
 
PPTX
Machine learning with Spark : the road to production
Andrea Baita
 
PDF
Data Science on Google Cloud Platform
Virot "Ta" Chiraphadhanakul
 
Supercharge your data analytics with BigQuery
Márton Kodok
 
10 ways to make your code rock
martincronje
 
Building Your First App with MongoDB Stitch
MongoDB
 
AngularJS in large applications - AE NV
AE - architects for business and ict
 
Building Twitter's SDKs for Android
Andy Piper
 
Tutorial: Building Your First App with MongoDB Stitch
MongoDB
 
Azure from scratch part 4
Girish Kalamati
 
VMWorld 2017 Hackathon training: Getting Started with Clarity
Jeeyun Lim
 
Google Devfest 2009 Argentina - Google and the Social Web
Patrick Chanezon
 
Scaling Experimentation & Data Capture at Grab
Roman
 
WebAppseqweqweqweqwewqeqweqweReImagined.pptx
FaisalTiftaZany1
 
Digital analytics with R - Sydney Users of R Forum - May 2015
Johann de Boer
 
A miało być tak... bez wycieków
Konrad Kokosa
 
Engage 2013 - Why Upgrade to v10 Tag
Webtrends
 
GraphQL Summit 2019 - Configuration Driven Data as a Service Gateway with Gra...
Noriaki Tatsumi
 
Large scale data capture and experimentation platform at Grab
Roman
 
JavaScript Refactoring
Krzysztof Szafranek
 
Social Stream Analysis Use Cases
WSO2
 
Machine learning with Spark : the road to production
Andrea Baita
 
Data Science on Google Cloud Platform
Virot "Ta" Chiraphadhanakul
 
Ad

Recently uploaded (20)

PDF
How-Cloud-Computing-Impacts-Businesses-in-2025-and-Beyond.pdf
Artjoker Software Development Company
 
PDF
Presentation about Hardware and Software in Computer
snehamodhawadiya
 
PDF
Security features in Dell, HP, and Lenovo PC systems: A research-based compar...
Principled Technologies
 
PDF
Automating ArcGIS Content Discovery with FME: A Real World Use Case
Safe Software
 
PPTX
IoT Sensor Integration 2025 Powering Smart Tech and Industrial Automation.pptx
Rejig Digital
 
PDF
Event Presentation Google Cloud Next Extended 2025
minhtrietgect
 
PDF
MASTERDECK GRAPHSUMMIT SYDNEY (Public).pdf
Neo4j
 
PPTX
ChatGPT's Deck on The Enduring Legacy of Fax Machines
Greg Swan
 
PDF
Trying to figure out MCP by actually building an app from scratch with open s...
Julien SIMON
 
PPTX
The-Ethical-Hackers-Imperative-Safeguarding-the-Digital-Frontier.pptx
sujalchauhan1305
 
PDF
Architecture of the Future (09152021)
EdwardMeyman
 
PDF
Brief History of Internet - Early Days of Internet
sutharharshit158
 
PDF
Oracle AI Vector Search- Getting Started and what's new in 2025- AIOUG Yatra ...
Sandesh Rao
 
PDF
Accelerating Oracle Database 23ai Troubleshooting with Oracle AHF Fleet Insig...
Sandesh Rao
 
PDF
Beyond Automation: The Role of IoT Sensor Integration in Next-Gen Industries
Rejig Digital
 
PDF
NewMind AI Weekly Chronicles - July'25 - Week IV
NewMind AI
 
PDF
Research-Fundamentals-and-Topic-Development.pdf
ayesha butalia
 
PDF
Orbitly Pitch Deck|A Mission-Driven Platform for Side Project Collaboration (...
zz41354899
 
PDF
REPORT: Heating appliances market in Poland 2024
SPIUG
 
PDF
Unlocking the Future- AI Agents Meet Oracle Database 23ai - AIOUG Yatra 2025.pdf
Sandesh Rao
 
How-Cloud-Computing-Impacts-Businesses-in-2025-and-Beyond.pdf
Artjoker Software Development Company
 
Presentation about Hardware and Software in Computer
snehamodhawadiya
 
Security features in Dell, HP, and Lenovo PC systems: A research-based compar...
Principled Technologies
 
Automating ArcGIS Content Discovery with FME: A Real World Use Case
Safe Software
 
IoT Sensor Integration 2025 Powering Smart Tech and Industrial Automation.pptx
Rejig Digital
 
Event Presentation Google Cloud Next Extended 2025
minhtrietgect
 
MASTERDECK GRAPHSUMMIT SYDNEY (Public).pdf
Neo4j
 
ChatGPT's Deck on The Enduring Legacy of Fax Machines
Greg Swan
 
Trying to figure out MCP by actually building an app from scratch with open s...
Julien SIMON
 
The-Ethical-Hackers-Imperative-Safeguarding-the-Digital-Frontier.pptx
sujalchauhan1305
 
Architecture of the Future (09152021)
EdwardMeyman
 
Brief History of Internet - Early Days of Internet
sutharharshit158
 
Oracle AI Vector Search- Getting Started and what's new in 2025- AIOUG Yatra ...
Sandesh Rao
 
Accelerating Oracle Database 23ai Troubleshooting with Oracle AHF Fleet Insig...
Sandesh Rao
 
Beyond Automation: The Role of IoT Sensor Integration in Next-Gen Industries
Rejig Digital
 
NewMind AI Weekly Chronicles - July'25 - Week IV
NewMind AI
 
Research-Fundamentals-and-Topic-Development.pdf
ayesha butalia
 
Orbitly Pitch Deck|A Mission-Driven Platform for Side Project Collaboration (...
zz41354899
 
REPORT: Heating appliances market in Poland 2024
SPIUG
 
Unlocking the Future- AI Agents Meet Oracle Database 23ai - AIOUG Yatra 2025.pdf
Sandesh Rao
 
Ad

F&O Summit 2023 Speaker X++ Tips and Tricks.pptx

  • 1. The Largest Independent Gathering of the Microsoft User Ecosystem Decrease Complexities, Deliver Results. @ 2023 Dynamic Communities X++ Extreme: Boost Your Development Skills with Proven Tips and Tricks
  • 2. The Largest Independent Gathering of the Microsoft User Ecosystem Decrease Complexities, Deliver Results. @ 2023 Dynamic Communities Nathan Clouse Technical Architect enVista Corp. Microsoft Business Applications MVP (4x) [email protected] www.atomicax.com www.dynamics.fo @NathanClouseAX
  • 3. The Largest Independent Gathering of the Microsoft User Ecosystem Decrease Complexities, Deliver Results. @ 2023 Dynamic Communities Peter Ramer Director of Managed Application Services RSM Microsoft Business Applications MVP (2x) www.dynamics365musings.com
  • 4. @ 2023 Dynamic Communities Agenda • Coding Tips • D365FO.Tools • Quality of Life Hacks • Debugging • Visual Studio Hidden
  • 5. The Largest Independent Gathering of the Microsoft User Ecosystem Decrease Complexities, Deliver Results. @ 2023 Dynamic Communities Coding Tips
  • 6. @ 2023 Dynamic Communities Use Set Based Operations • Update_recordset rather than while select w/ update • RecordInsertList rather looped inserts • RecordInsertList rather than insert_recordset • Delete_from rather than while select update
  • 7. @ 2023 Dynamic Communities Using FieldNum Ordinals • Standard: CustTable.AccountNum • Using Ordinals: CustTable.(fieldNum(CustTable,AccountNum))
  • 8. @ 2023 Dynamic Communities Add Financial Dimension for OData • Dynamics 365 > Addins > Add financial dimensions for OData
  • 9. @ 2023 Dynamic Communities Comment Code CTRL K, CTRL U
  • 10. @ 2023 Dynamic Communities Uncomment Code • CTRL K, CTRL U
  • 11. @ 2023 Dynamic Communities Format Code • CTRL K , D
  • 12. @ 2023 Dynamic Communities Toggle Breakpoints • F9
  • 13. @ 2023 Dynamic Communities Go To (Main Thing) • Hit F9 in design view to go to the main thing for the item selected • F9 on a table extension will take you to the base table • F9 on a field will take you to the EDT • F9 on a field with a relationship will take you to the related table • F9 on a field in a data entity will open the table/entity for that field • F9 on COC Extension Class will take you to the main class
  • 14. @ 2023 Dynamic Communities Copy Event Handlers - Methods • In design view, expand methods, right click, copy event handler
  • 15. @ 2023 Dynamic Communities Copy Event Handler - Events • In design view, expand events, right click, copy event handler
  • 16. @ 2023 Dynamic Communities Sales order Totals https://dynamics365musings.com/d365-sales-order-totals/
  • 17. @ 2023 Dynamic Communities Extensible Controls • https://www.youtube.com/watch?v=QrIjTN6Vey4&t=149s • https://sangeethwiki.blogspot.com/2017/09/extensible-controls-i n-dynamics-365-for.html • Use Javascript and html to create your own D365 controls.
  • 18. @ 2023 Dynamic Communities Paste Special • Edit > Paste Special • XML as Class • JSON as Class
  • 19. @ 2023 Dynamic Communities Paste Special {"menu": { "id": "file", "value": "File", "popup": { "menuitem": [ {"value": "New", "onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, {"value": "Close", "onclick": "CloseDoc()"} ] } }} public class Menu { public string id { get; set; } public string value { get; set; } public Popup popup { get; set; } } public class Popup { public Menuitem[] menuitem { get; set; } } public class Menuitem { public string value { get; set; } public string onclick { get; set; } }
  • 20. @ 2023 Dynamic Communities If XML Option Missing… • Add ASP.NET to VS
  • 21. @ 2023 Dynamic Communities CrossCompany static void JobDemoCrossCompany(Args _args) { BankAccountTable tabBAT; // saveDataPerCompany == true. container conCompanies = [ 'cm1', 'cm2', 'dat' ]; str 4 sCompanyPrevious = " "; // Maximum length is 4 characters. int iCountCompanies = 0; ; while select crossCompany : conCompanies * from tabBAT order by dataAreaId { if ( sCompanyPrevious != tabBAT.dataAreaId ) { info( tabBAT.dataAreaId + " = tabBAT.dataAreaId" ); iCountCompanies++; if ( iCountCompanies >= 2 ) { break; } sCompanyPrevious = tabBAT.dataAreaId; } } return; }
  • 22. @ 2023 Dynamic Communities BankAccountTable tabBAT; // saveDataPerCompany == true. container conCompanies = [ 'cm1', 'cm2', 'dat' ]; str 4 sCompanyPrevious = " "; // Maximum length is 4 characters. int iCountCompanies = 0; ; while select crossCompany : conCompanies * from tabBAT order by dataAreaId { … } return; } CrossCompany
  • 23. @ 2023 Dynamic Communities static void JobDemoAllowCrossCompany(Args _args) { BankAccountTable tabBAT; // saveDataPerCompany == true. Query qry2; QueryBuildDataSource qbds3; QueryRun qrun4; str sCompanyPrevious = " "; int iCountCompanies = 0; int iTableNumBAT; ; qry2 = new Query(); qry2.allowCrossCompany( true ); qry2.addCompanyRange( 'dat' ); qry2.addCompanyRange( 'twf' ); iTableNumBAT = tableNum( BankAccountTable ); qbds3 = qry2 .addDataSource( iTableNumBAT ); //qbds3.company( 'dat' ); qrun4 = new QueryRun( qry2 ); while ( qrun4.next() ) { if ( qrun4.changed( iTableNumBAT ) ) { tabBAT = qrun4.get( iTableNumBAT ); if ( sCompanyPrevious != tabBAT.dataAreaId ) { print( tabBAT.dataAreaId + " = tabBAT.dataAreaId" ); iCountCompanies++; if ( iCountCompanies >= 2 ) { break; } sCompanyPrevious = tabBAT.dataAreaId; } } } pause; return; } CrossCompany Queries
  • 24. @ 2023 Dynamic Communities BankAccountTable tabBAT; // saveDataPerCompany == true. Query qry2; QueryBuildDataSource qbds3; QueryRun qrun4; str sCompanyPrevious = " "; int iCountCompanies = 0; int iTableNumBAT; ; qry2 = new Query(); qry2.allowCrossCompany( true ); qry2.addCompanyRange( 'dat' ); qry2.addCompanyRange( 'twf' ); CrossCompany Queries
  • 25. @ 2023 Dynamic Communities public static container download(container _parms) { RunAsPermission perm; perm = new RunAsPermission("Admin"); perm.assert(); Container returncontainer = runAs("Admin", classnum(AcxSharepointIntegeration), "get", _parms); CodeAccessPermission::revertAssert(); return returncontainer; } RunAsPermission
  • 26. @ 2023 Dynamic Communities str Mobile = "712,3456789"; if (strLen(strRem(Mobile, ",")) != strLen(strKeep(strRem(Mobile, ","), "1234567890"))) { throw error("Invalid Mobile Number"); } else { info("Valid Mobile Number"); } StrKeep
  • 27. @ 2023 Dynamic Communities static void testZeroPadding(Args _args) { int i = 1; str padded; str finalResult; ; // Create a string, with a length of 5, ending with the value of i and padded with zeros padded = strRFix(int2str(i), 5, "0"); finalResult = strFmt("ABC-%1", padded); // 00001 } StrRFix and StrLFix
  • 28. @ 2023 Dynamic Communities • X++ is good but what it can’t do, C# can do • Call an external web service • Handle JSON/XML tedium • FTP Use C#
  • 29. @ 2023 Dynamic Communities class AAX_AzureQueueTest { const str connectionString = "Endpoint=sb://[urlName]servicebus.windows.net/;SharedAccessKeyName=[SharedAccessName];SharedAccessKey=[SharedAccessKey]=;EntityPath=[QueueName]"; public static void main(Args args) { AAX_AzureQueueLibrary.ReceiveAzureQueue ReceiveAzureQueue = new AAX_AzureQueueLibrary.ReceiveAzureQueue(); AAX_AzureQueueLibrary.SendAzureQueue SendAzureQueue = new AAX_AzureQueueLibrary.SendAzureQueue(); //x++ get a guid, not C# str s = "Test Message " + WinAPIServer::createGUID(); SendAzureQueue.connect(connectionString); SendAzureQueue.sendMessage(s); SendAzureQueue.close(); info(strFmt("sent: %1", s)); s = ""; ReceiveAzureQueue.connect(connectionString); s = ReceiveAzureQueue.readMessage(); ReceiveAzureQueue.completeMessage(); ReceiveAzureQueue.close(); info(strFmt("Received: %1", s)); } } Use C#
  • 30. @ 2023 Dynamic Communities • Can’t locate an error that is being thrown? Add a breakpoint in info.Add() (on switch (logLevel)) • Use funcName() to help with figuring problems out • QueryBuildDataSource.toString() to see the SQL for a query • Data Entities can be temperamental; DB Sync, delete entity (from Data Entity Screen), rebuild list, test again Other Stuff
  • 31. The Largest Independent Gathering of the Microsoft User Ecosystem Decrease Complexities, Deliver Results. @ 2023 Dynamic Communities D365FO.Tools
  • 32. @ 2023 Dynamic Communities • PowerShell module to handle the different management tasks during a Dynamics 365 Finance & Operations • Install-Module -Name d365fo.tools • Update-Module -name d365fo.tools D365FO.Tools
  • 33. @ 2023 Dynamic Communities • Stop-D365Environment -All • Stop-D365Environment -Aos -Batch • Stop-D365Environment -FinancialReporter -DMF • Stop-D365Environment -All -Kill Stop An Environment
  • 34. @ 2023 Dynamic Communities • Start-D365Environment -ShowOriginalProgress • Start-D365Environment -All • Start-D365Environment -Aos -Batch • Start-D365Environment -FinancialReporter -DMF Start An Environment
  • 35. @ 2023 Dynamic Communities • Restart-D365Environment -All -ShowOriginalProgress Restart
  • 36. @ 2023 Dynamic Communities • Set-D365Admin "[email protected]" (Re)Set D365FO Admin
  • 37. @ 2023 Dynamic Communities • Invoke-D365LcsDatabaseExport -ProjectId 123456789 - SourceEnvironmentId "958ae597-f089-4811-abbd-c1190917eaae" - BackupName "BackupViaApi" -BearerToken "JldjfafLJdfjlfsalfd..." - LcsApiUri "https://lcsapi.lcs.dynamics.com" Export Database from Sandbox
  • 38. @ 2023 Dynamic Communities • Invoke-D365LcsDatabaseRefresh -ProjectId 123456789 - SourceEnvironmentId "958ae597-f089-4811-abbd-c1190917eaae" - TargetEnvironmentId "13cc7700-c13b-4ea3-81cd-2d26fa72ec5e" - BearerToken "JldjfafLJdfjlfsalfd..." -LcsApiUri "https://lcsapi.lcs.dynamics.com" Refresh Database (Prod To Sandbox)
  • 39. @ 2023 Dynamic Communities • Invoke-D365DbSyncModule -Module "MyModel1" • Invoke-D365DbSyncModule -Module "MyModel1","MyModel2" • Get-D365Module -Name "MyModel*" | Invoke-D365DbSyncModule Sync Database for Module(s)
  • 40. @ 2023 Dynamic Communities • Invoke-D365DBSyncPartial -SyncList "CustCustomerEntity","SalesTable" • Invoke-D365DBSyncPartial -SyncList "CustCustomerEntity","SalesTable" -Verbose Partial DB Sync
  • 41. @ 2023 Dynamic Communities • Invoke-D365DBSync • Invoke-D365DBSync -Verbose DB Sync
  • 42. @ 2023 Dynamic Communities • Install-D365SupportingSoftware -Name vscode • Install-D365SupportingSoftware -Name "vscode","fiddler" • Install-D365SupportingSoftware -Name googlechrome Install Supporting Software
  • 43. @ 2023 Dynamic Communities • Get-D365Url Getting Environment URL
  • 44. @ 2023 Dynamic Communities • Get-D365AOTObject -Name *flush* -ObjectType AxClass -Path "C:AOSService PackagesLocalDirectoryApplicationFoundation" • Get-D365AOTObject -Name *flush* -ObjectType AxClass -IncludePath -Path "C: AOSServicePackagesLocalDirectoryApplicationFoundation" • Get-D365InstalledPackage -Name Application* | Get-D365AOTObject -Name *flush* -ObjectType AxClass • Get-D365AOTObject -Path "C:AOSServicePackagesLocalDirectory*" -Name *flush* -ObjectType AxClass -SearchInPackages Searching for an AOT Object
  • 45. @ 2023 Dynamic Communities • Enable-D365MaintenanceMode -ShowOriginalProgress • Disable-D365MaintenanceMode -ShowOriginalProgress Maintenance Mode
  • 46. @ 2023 Dynamic Communities • Invoke-D365InstallSqlPackage • Import-D365Bacpac -ImportModeTier1 -BacpacFile "C:temp uat.bacpac" -NewDatabaseName "ImportedDatabase_YYYYMMDD" Import Database into Dev (T1)
  • 47. @ 2023 Dynamic Communities • New-D365Bacpac -ExportModeTier1 -BackupDirectory c:Temp backup -NewDatabaseName Testing1 -BacpacFile "C:TempBacpac Testing1.bacpac" Export Database from Dev (T1)
  • 48. The Largest Independent Gathering of the Microsoft User Ecosystem Decrease Complexities, Deliver Results. @ 2023 Dynamic Communities Quality Of Life
  • 49. @ 2023 Dynamic Communities • https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/fin-ops/ get-started/grid-capabilities • Just copy and paste. • Plus, lots of other features (Enabled in Feature Management) Copy data from excel to D365 grid
  • 50. @ 2023 Dynamic Communities • https://dynamics365musings.com/d365-table-browser/ • https://<environmentURL>/? mi=SysTableBrowser&tablename=<tablename> Table Browser
  • 51. @ 2023 Dynamic Communities Run VS as Admin • Start • Search for Visual Studio 2019 • Right click > Open file location • Find icon, right click > Properties > Advanced • Check “Run As Administrator”
  • 52. @ 2023 Dynamic Communities Run SSMS as Admin • Nearly the same as for VS 2019
  • 53. @ 2023 Dynamic Communities Run D365FO.Tools in VS • Run PowerShell from VS • Like D365FO.Tools
  • 54. @ 2023 Dynamic Communities
  • 55. @ 2023 Dynamic Communities Run D365FO.Tools in VS • Run PowerShell from VS • Like D365FO.Tools
  • 56. @ 2023 Dynamic Communities Plus Aliases • Use notepad $profile
  • 57. @ 2023 Dynamic Communities
  • 58. @ 2023 Dynamic Communities • Using NOLOCK when directly querying SQL can show uncommitted records • Useful when debugging • I.e.: SELECT * FROM SalesTable WITH (nolock) WHERE SalesId = ‘SO04381969’ AND DataAreaId = ‘USMF’ Querying in SQL w/ nolock
  • 59. The Largest Independent Gathering of the Microsoft User Ecosystem Decrease Complexities, Deliver Results. @ 2023 Dynamic Communities Debugging
  • 60. @ 2023 Dynamic Communities Debugging Batch Jobs • Attached to process • Show all processes from all users • Look for Batch.exe
  • 61. @ 2023 Dynamic Communities Loading Symbols • Tools > Options
  • 62. @ 2023 Dynamic Communities Loading Symbols
  • 63. @ 2023 Dynamic Communities Loading Symbols
  • 64. @ 2023 Dynamic Communities Load all modules
  • 65. The Largest Independent Gathering of the Microsoft User Ecosystem Decrease Complexities, Deliver Results. @ 2023 Dynamic Communities Visual Studio Hidden Gems
  • 66. @ 2023 Dynamic Communities • Create code extension Create code extension
  • 67. @ 2023 Dynamic Communities • Update model parameters Update Model Parameters
  • 68. @ 2023 Dynamic Communities Order Labels in label file by ID
  • 69. @ 2023 Dynamic Communities Build Options
  • 70. @ 2023 Dynamic Communities Dark Mode Plus Custom Colors
  • 71. @ 2023 Dynamic Communities
  • 72. @ 2023 Dynamic Communities Dark Mode Plus Custom Colors
  • 73. @ 2023 Dynamic Communities
  • 74. @ 2023 Dynamic Communities Metadata Search • Search on any option, value, metadata, whatever, on an element • type:"form" ccount • type:"class" extensionpoint:"eventhandlers,eventdelegates"
  • 75. @ 2023 Dynamic Communities • type:"dataentityview" property:"PublicCollectionName=CustomerStatisticsGroups" • type:"dataentityview" property:"PublicEntityName=CustomerStatisticsGroup" Metadata Search
  • 76. @ 2023 Dynamic Communities • Open Source • https://github.com/TrudAX/TRUDUtilsD365 • Prototyping Tools that help with productivity • Configurable • Similar idea from AX 2009/2012 with configurable MorphX tools TRUDUtilsD365
  • 77. @ 2023 Dynamic Communities VS E: on Form Extensions
  • 78. @ 2023 Dynamic Communities VS L: on Form Extensions
  • 79. @ 2023 Dynamic Communities • http://www.atomicax.com/article/d365fotools-and-vs2017-manhattan-project • https://docs.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/dev-ref/x pp-business-run-time-functions • https://docs.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/dev-ref/x pp-string-run-time-functions • https://jatomas.com/en/2020/05/02/dark-mode-visual-studio-x-code-editor/ • https://dynamics365musings.com/d365-sales-order-totals/ • https://www.youtube.com/watch?v=QrIjTN6Vey4&t=149s • https://sangeethwiki.blogspot.com/2017/09/extensible-controls-in-dynamics-36 5-for.html Resources
  • 80. @ 2023 Dynamic Communities • https://ariste.info/en/2021/06/socratex-application-checker/ • https://github.com/TrudAX/TRUDUtilsD365 Resources
  • 81. The Largest Independent Gathering of the Microsoft User Ecosystem Decrease Complexities, Deliver Results. @ 2023 Dynamic Communities Questions?
  • 82. @ 2023 Dynamic Communities • Nathan Clouse • [email protected] • www.atomicax.com • www.dynamics.fo • @NathanClouseAX • https://www.linkedin.com/in/nath anclouseax/ Thanks! • Peter Ramer • www.dynamics365musings.com • https://www.linkedin.com/in/peter-r amer/ 82
  • 83. @ 2023 Dynamic Communities Decrease Complexities, Deliver Results. The Largest Independent Gathering of the Microsoft User Ecosystem Thank you for Attending!
  • 84. © 2023 Dynamic Communities. All rights reserved. © 2023 Dynamic Communities. All rights reserved.

Editor's Notes

  • #25: https://allaboutdynamic.com/2020/07/07/runas-function-method-in-dynamics-365-finance-operations/
  • #26: https://allaboutdynamic.com/
  • #37: https://blog.simonw.se/getting-an-access-token-for-azuread-using-powershell-and-device-login-flow/
  • #38: https://blog.simonw.se/getting-an-access-token-for-azuread-using-powershell-and-device-login-flow/
  • #53: http://www.atomicax.com/article/d365fotools-and-vs2017-manhattan-project
  • #54: http://www.atomicax.com/article/d365fotools-and-vs2017-manhattan-project
  • #55: http://www.atomicax.com/article/d365fotools-and-vs2017-manhattan-project
  • #70: https://jatomas.com/en/2020/05/02/dark-mode-visual-studio-x-code-editor/
  • #71: https://jatomas.com/en/2020/05/02/dark-mode-visual-studio-x-code-editor/
  • #72: https://jatomas.com/en/2020/05/02/dark-mode-visual-studio-x-code-editor/
  • #73: https://jatomas.com/en/2020/05/02/dark-mode-visual-studio-x-code-editor/