Moving to the Microsoft Cloud: Benefits and Challenges

In the modern digital era, businesses increasingly move their operations to the cloud to benefit from scalability, flexibility, and cost efficiency. Among the popular cloud platforms, Microsoft Cloud stands out due to its comprehensive suite of services, robust security features, and seamless integration with other Microsoft products.

 

This blog post will delve into the benefits and challenges of migrating to the Microsoft Cloud, providing a balanced perspective for organizations considering this transition.

 

Benefits of Moving to the Microsoft Cloud

Scalability and Flexibility

 

One of the primary advantages of the Microsoft Cloud is its scalability. Businesses can easily adjust their computing resources to match their current needs, ensuring they only pay for what they use.

 

This flexibility allows companies to handle fluctuating workloads efficiently without the need for extensive on-premises infrastructure.

 

Cost Efficiency

 

Moving to the Microsoft Cloud can result in significant cost savings. With a pay-as-you-go model, businesses eliminate the expenses associated with maintaining physical servers and data centers.

 

Additionally, Microsoft offers various pricing plans and discounts, enabling organizations to optimize their cloud expenditure according to their budget and requirements.

 

Robust Security

 

Microsoft Cloud provides top-tier security features, including advanced threat detection, encryption, and compliance with industry standards. With continuous updates and monitoring, organizations can trust that their data is protected against cyber threats.

 

The built-in security mechanisms help safeguard sensitive information and ensure regulatory compliance.

 

 

Seamless Integration

 

For businesses already using Microsoft products, the transition to Microsoft Cloud is seamless. Services like Azure, Office 365, and Dynamics 365 integrate smoothly with existing applications, enhancing productivity and collaboration.

 

This integration minimizes disruption during migration and accelerates the adoption of cloud services.

 

 

Enhanced Collaboration and Productivity

 

Microsoft Cloud facilitates improved collaboration and productivity through tools like Microsoft Teams and SharePoint. Employees can work together in real-time, share documents securely, and access resources from anywhere in the world.

 

This connectivity fosters a more dynamic and efficient work environment.

 

Challenges of Moving to the Microsoft Cloud

 

Data Migration

 

One of the significant challenges organizations face when moving to the Microsoft Cloud is data migration. Transferring large volumes of data from on-premises to the cloud requires careful planning and execution to avoid data loss or corruption.

 

Businesses must develop a comprehensive migration strategy to ensure a smooth transition.

 

Downtime and Disruption

 

During the migration process, businesses may experience downtime and disruption to their operations. It is crucial to schedule migrations during off-peak hours and communicate effectively with employees to minimize the impact.

 

Proper planning can help mitigate these challenges and ensure business continuity.

 

Training and Adoption

 

Adopting the Microsoft Cloud requires employees to learn new tools and workflows. Organizations must invest in training programs to ensure staff are comfortable with the new systems.

 

Resistance to change can also pose a challenge, making it essential to foster a culture of adaptability and continuous learning.

 

Cost Management

 

Although the Microsoft Cloud can be cost-efficient, businesses must actively manage their cloud expenditure to avoid overspending. Monitoring usage, setting budget limits, and optimizing resource allocation are essential steps to ensure the cloud remains financially sustainable.

 

Migrating to the Microsoft Cloud presents numerous benefits, including scalability, cost efficiency, robust security, seamless integration, and enhanced collaboration.

 

However, organizations must also address challenges such as data migration, downtime, training, and cost management. By carefully planning and executing their cloud strategy, businesses can successfully leverage the power of the Microsoft Cloud to drive innovation and growth.

 

The journey to the Microsoft Cloud requires a balanced approach, considering both the advantages and potential hurdles.

 

How to Optimize Your Retail Operations?

Retail’s not what it used to be. It’s not just about selling stuff, it’s keeping up with customer expectations, staying ahead of what’s popular, and making sure everything runs smoothly.

 

There is a lot. So, how can you manage everything without getting overwhelmed? Smart technology and creative strategy. Running a store means everything is linked — your products, your people, and your customer experience.

 

The good news? You don’t have to do it all yourself, tools like Microsoft Dynamics 365 helps you to streamline the work, so you can focus on what really matters.

 

Retails’ Growing Pains

 

Retailers today are facing more challenges than ever. Customers expect more, there are many different ways to shop, and keeping everything running smoothly is becoming harder.

 

Even with older systems in place, it’s tough to avoid issues like too much inventory, running out of stock, and inconsistent customer experiences. Without a smart system that brings everything together, making improvements can feel like an ongoing struggle.

 

The Retail Game-Changer: Dynamics 365

 

Dynamics 365 is not just a solution, but it’s a retail optimizer. It uses AI, real-time data, and smart automation to help retailers turn confusion into clear action.

 

Imagine having tools for predicting inventory needs, offering proactive customer service, and getting a complete view of your business, all in one place. It’s designed to make retail operations easier, smarter, and more efficient.

 

From Reactive to Proactive Retail

 

 

Retailers have spent too much time reacting to problems with outdated data. With Dynamics 365, they can plan ahead.

 

No more last-minute restocking or frustrating customers, it’s always about staying one step ahead of the potential issues before they happen.

 

 

Unified Data = Better Decisions

 

Imagine your marketing, sales, and warehouse teams all having access to the same, real-time data. With Dynamics 365, it connects everyone and helps them work together more easily.

 

This leads to faster and smarter decisions because everyone has the same clear view of what’s happening.

 

Why AXM365?

 

We don’t just implement solutions, but we transform businesses.

 

Our retail-specific expertise with Dynamics 365 ensures you don’t get a one-size-fits-all solution, but a strategic approach tailored to your goals.

 

Ready to Optimise?

 

Retail success today means being agile, data-driven, and customer-obsessed.

 

Smart Factories: AI’s Role in Modern Manufacturing

The manufacturing world is changing fast. With the rise of Industry 4.0, we’re seeing more and more factories adopting smart technologies, things like AI, IoT, and cloud platforms. These tools aren’t just concepts that are popular anymore, they’re actively explaining how products are made, how operations are managed, and how businesses compete.

 

One tool that’s making this transition easier for both factory workers and business leaders is Microsoft Dynamics 365 Supply Chain Management (D365 SCM). It brings everything together in one place, helping companies work more smoothly, adjust quickly, and preparing for whatever the future brings.

 

Real-Time Visibility and Predictive Insights With D365 SCM

 

Manufacturers can see what’s happening in their operations as it happens. Thanks to AI and IoT, the system gathers and analyzes data from across the factory, helping spot problems before they turn into bigger issues.

 

This means less downtime, fewer surprises, and a smoother production process.

 

Keeping the Supply Chain in Sync

 

In today’s connected world, teamwork between suppliers, manufacturers, and distributors is more important than ever.

 

D365 SCM makes it easier for everyone to stay on the same page by bringing all the information into one place.

 

That way, everyone involved can make faster, smarter decisions based on the latest updates.

 

Agile and Responsive Manufacturing Processes

 

Markets change fast and that means manufacturers need to keep up. D365 SCM helps companies quickly adjust when there are shifts in demand, supply chain issues, or new opportunities.

 

Its flexible system makes it easier to change production plans, manage inventory, and update distribution without missing a beat.

 

Data-Driven Decision Making

 

It’s always easier to guess but forget about that. D365 SCM gives manufacturers the chance to make better choices based on real data.

 

By looking at past trends and current conditions, now the businesses can be planed ahead, manage stock more efficiently, and improve day-to-day operations, all that while cutting down on costs.

 

Integration with Technologies, bringing It All Together

 

D365 SCM seamlessly integrates with other Microsoft solutions and third-party applications, establishing an integrated digital framework.

 

That means you can easily plug in machine learning and AI to take your smart factory to the next level.

 

Partner with AXM365 for Your Smart Factory Journey

 

We specialize in implementing and optimizing Microsoft Dynamics 365 solutions tailored to your manufacturing needs. Our expertise ensures that your transition to a smart factory is smooth and effective.

 

The Future of Smart Manufacturing with Microsoft Technology

The manufacturing industry stands at a pivotal moment. Global competition, supply chain disruptions, labor shortages, and rising demands for sustainability are pushing manufacturers to rethink how they operate.

 

The answer? Smart manufacturing — and Microsoft is helping lead the charge.

 

Tackling Manufacturing’s Toughest Challenges

 

Smart manufacturing goes beyond automation, it’s about transforming operations to be data-driven, agile, and seamlessly integrated.

 

Microsoft’s technology suite, including Azure, Dynamics 365, and Microsoft Cloud for Manufacturing — is enabling factories to overcome traditional limitations and step confidently into the future.

 

Operational Efficiency at Scale

 

One of the biggest pain points for manufacturers is inefficiency, whether in machine utilization, production throughput, or maintenance. Microsoft Cloud for Manufacturing helps bridge the gap between operational and IT systems, delivering real-time visibility into performance metrics like OEE.

 

This enables faster decision-making, proactive issue resolution, and continuous optimization at scale.

 

Workforce Empowerment

 

As the industry struggles with skills shortages and an aging workforce, Microsoft is enabling a smoother transition.

 

Using tools like Dynamics 365 Remote Assist and HoloLens, frontline workers can connect with remote experts in real time, eliminating unnecessary travel and improving first-time fix rates.

 

AI-powered copilots simplify complex tasks, making it faster to train new employees and easier to capture and retain valuable knowledge directly on the factory floor.

 

Predictive Maintenance & Quality Control

 

In manufacturing, unexpected equipment failures can disrupt production and lead to significant costs.

 

With Azure AI and IoT, manufacturers can predict issues before they occur, enabling predictive maintenance that minimizes downtime and extends the operational life of critical machinery.

 

On the quality control front, Microsoft’s AI-driven visual inspection systems automatically detect defects in real time, ensuring consistent product quality and compliance with stringent industry standards—critical in sectors like automotive and electronics.

 

Sustainable Manufacturing at the Core

 

By adopting Microsoft’s cloud solutions, manufacturers can transition their operations to Azure. Azure’s powerful tools enable real-time monitoring of energy usage and emissions, helping companies optimize their processes and align with sustainability goals.

 

This shift to the cloud not only enhances operational efficiency but also accelerates the move toward more eco-friendly and resource-conscious manufacturing practices.

 

Industry Collaboration for Innovation

 

To drive innovation in manufacturing, Microsoft’s advanced technologies leverage generative AI to streamline and enhance automation processes. Tools like AI-powered industrial copilots assist engineers in creating and optimizing automation code, significantly reducing development time and increasing productivity across manufacturing operations.

 

By empowering teams with cutting-edge solutions, manufacturers can accelerate their journey toward smarter, more efficient production.

 

The Road Ahead

 

Smart manufacturing is no longer a distant goal, it’s a present reality. Manufacturers who embrace this transformation will be at the forefront of the next wave of industrial excellence.

 

By minimizing waste, enhancing quality, and driving sustainability, Microsoft’s technologies are not just optimizing factory operations; they are reshaping the entire manufacturing industry.

 

 

Revolutionizing Customer Experience with Microsoft Call Center Solutions

In today’s fast-paced world, customer service is the heartbeat of every successful business. With the ever-increasing demands of customers, companies need to adopt innovative solutions to stay ahead in the game.

 

Enter Microsoft Call Center Solutions – a game-changer that promises to revolutionize the customer experience landscape.

 

Why Microsoft Call Center Solutions?

 

Microsoft, a name synonymous with cutting-edge technology, offers a robust suite of call center solutions designed to enhance customer interactions. But what sets Microsoft apart in this crowded market?

 

Seamless Integration with Existing Systems

 

One of the standout features of Microsoft Call Center Solutions is its seamless integration with existing systems. Whether you’re using Microsoft Dynamics 365, Office 365, or other third-party applications, the transition is smooth and hassle-free.

 

This integration ensures that your agents have access to all the necessary tools and information at their fingertips, making customer interactions more efficient and effective.

 

AI-Powered Assistance

 

Artificial Intelligence (AI) is no longer a futuristic concept; it’s a reality that’s transforming the way we do business. Microsoft’s AI-powered assistance tools are designed to enhance agent productivity and improve customer satisfaction.

 

From intelligent chatbots that handle routine inquiries to advanced sentiment analysis that gauges customer emotions, AI is at the forefront of delivering personalized and timely support.

 

Omnichannel Support

 

Today’s customers expect support across multiple channels – be it phone, email, chat, or social media. Microsoft Call Center Solutions excel in providing a unified platform that supports omnichannel interactions.

 

This means that no matter how your customers choose to reach out, your agents can manage all communications from a single interface, ensuring a consistent and seamless experience.

 

Advanced Analytics and Reporting

 

Data is the new gold, and Microsoft understands the importance of leveraging data to make informed decisions.

 

With advanced analytics and reporting features, businesses can gain valuable insights into customer behavior, agent performance, and overall call center operations.

 

These insights enable companies to identify trends, address issues proactively, and continually refine their customer service strategies.

 

Real-World Success Stories

 

The proof of any solution lies in its real-world application. Numerous companies across various industries have successfully transformed their customer service operations using Microsoft Call Center Solutions.

 

From reducing call handling times to improving first-call resolution rates, the benefits are tangible and impactful.

 

The Future of Customer Service

 

As technology continues to evolve, so too will the expectations of customers. Microsoft Call Center Solutions are designed to adapt and grow with these changing demands, ensuring that businesses can always offer top-notch service.

 

By embracing these innovative tools, companies can not only meet but exceed customer expectations, fostering long-term loyalty and success.

 

In conclusion, if you’re looking to revolutionize your customer service operations, Microsoft Call Center Solutions offer the perfect blend of technology and innovation.

 

With seamless integration, AI-powered assistance, omnichannel support, and advanced analytics, the future of customer service is here – and it’s powered by Microsoft.

 

Transforming Recruitment with TalentXpert for Dynamics 365

Efficient hiring is more than a goal—it’s a necessity. In today’s fast-moving talent landscape, organizations need smart, scalable recruitment solutions that deliver results.

 

That’s where TalentXpert for Dynamics 365 comes in.

 

This powerful module streamlines the entire recruitment lifecycle—from attracting and tracking candidates, to scheduling interviews and gaining data-driven insights.

 

Built on the Dynamics 365 platform, TalentXpert empowers HR teams with tools for:

 

  • Applicant Tracking across every stage of the hiring journey;

 

  • Candidate Relationship Management to build and nurture talent pipelines;

 

  • Interview Scheduling and Feedback Management for seamless coordination;

 

  • Advanced Reporting & Analytics to optimize hiring strategies

 

The result? Faster processes, stronger engagement, and better hiring outcomes.

 

TalentXpert helps businesses focus on what matters most: finding the right people and creating a standout candidate experience.

 

Driving Innovation in Manufacturing with Microsoft’s Intelligent Cloud

The manufacturing industry is undergoing a rapid transformation, driven by the need for efficiency, agility, and resilience. In today’s highly competitive market, manufacturers must embrace data-driven decision-making, automation, and cloud-powered collaboration to stay ahead.

 

Microsoft’s intelligent cloud ecosystem provides the foundation for modernizing manufacturing, enabling real-time insights, predictive analytics, and seamless integration across operations.

 

The Role of Microsoft Cloud in Smart Manufacturing

 

 

Microsoft Cloud offers a comprehensive suite of solutions designed to optimize manufacturing operations, integrate smart automation, and unlock new levels of productivity.

 

Through platforms like Azure, Dynamics 365, and Microsoft 365, manufacturers can build a connected, data-driven ecosystem that enhances efficiency and innovation.

 

 

 

 

Azure: The Foundation for Smart Manufacturing

 

Microsoft Azure provides manufacturers with a secure, scalable, and flexible cloud infrastructure to manage data, connect devices, and improve operational efficiency.

 

With services like Azure IoT, AI, and Digital Twins, manufacturers can:

 

  • Monitor and optimize production processes in real time;
  • Predict maintenance needs and reduce equipment downtime;
  • Improve energy efficiency and sustainability initiatives.

 

IoT and Edge Computing for Real-Time Insights

 

The combination of IoT and Edge Computing allows manufacturers to collect and analyze data from factory floors, supply chains, and logistics networks.

 

Azure IoT Hub enables seamless device connectivity, while Azure Edge Computing processes critical data locally, ensuring faster response times and enhanced automation capabilities.

 

Intelligent Business Operations with Dynamics 365

 

Microsoft Dynamics 365 is transforming how manufacturers manage supply chains, finance, and customer relationships. By integrating ERP and CRM solutions, Dynamics 365 helps manufacturers:

 

  • Gain end-to-end visibility across supply chains;
  • Automate workflows and streamline inventory management;
  • Deliver personalized customer experiences with AI-driven insights.

 

Enhanced Collaboration with Microsoft 365

 

Seamless communication and collaboration are essential in modern manufacturing. With Microsoft 365, including tools like Teams, SharePoint, and Power Platform, manufacturers can:

 

  • Enable real-time communication across teams and global operations;
  • Automate reporting and document management;
  • Enhance productivity with AI-powered tools and automation.

 

The Future of Manufacturing in the Cloud

 

With the Microsoft Cloud, manufacturers can build a resilient, intelligent, and agile business model that adapts to market changes and technological advancements.

 

Addressing Retail Challenges with Technology-Driven Solutions

The retail industry is facing significant challenges as consumer expectations evolve, competition intensifies, and the shift to omnichannel shopping accelerates.

 

To remain competitive, retailers must address operational inefficiencies, improve customer experiences, and leverage data-driven decision-making. By implementing the right technology solutions, retailers can turn these challenges into opportunities for growth and success.

 

The Biggest Challenges in Online Retail Today

 

  1. High Home Delivery Costs

 

Many omnichannel retailers struggle with the financial burden of home delivery services, often leading to increased costs and reduced profitability.

 

  1. Lack of Profitability in Online Retail

 

Pure online retailers often face challenges due to low gross margin contributions, leading to the discontinuation of free returns and increased pricing pressure.

 

  1. Inadequate Online Order Management

 

Many retailers operate without sophisticated online order management systems, resulting in inefficiencies and customer dissatisfaction due to delayed or incorrect orders.

 

  1. Limited Inventory Visibility Across Channels

 

Retailers without a unified inventory view face cost consequences, including lost sales and increased clearance markdowns due to overstocking or stockouts.

 

  1. Growth of Serial Returners

 

The increasing trend of consumers ordering multiple sizes and returning unwanted items impacts profitability and supply chain efficiency.

 

  1. Suboptimal Store Visual Merchandising Online

 

Many retailer websites fail to incorporate best practices from physical stores, resulting in missed opportunities to drive conversions.

 

  1. Insufficient Advanced Personalization

 

Retailers still have room for improvement in leveraging AI-driven personalization techniques to enhance customer engagement and loyalty.

 

  1. Missed Opportunities in Customer Segmentation

 

Retailers often fail to integrate online customer data with existing store-based CRM and loyalty programs, limiting opportunities for optimizing assortment, store presentation, and customer service.

 

  1. Adapting to Omnichannel Retailing

 

Retailers struggle to keep pace with the evolving omnichannel landscape, creating gaps in the seamless integration of online and offline shopping experiences.

 

How Technology is Transforming Retail

 

By adopting innovative technology solutions, retailers can overcome these challenges and enhance their operations. We can provide tools to optimize retail processes, drive efficiencies, and enhance customer satisfaction.

 

Optimizing Retail Operations with Advanced Order Management

 

  • Implementing order management solutions to maximize full-price sales and reduce markdowns.
  • Enhancing inventory visibility to reduce lost sales and improve stock management.

 

Leveraging Data and Analytics for Personalization

 

  • Using CRM and analytics solutions to build customer lifestyle profiles and improve segmentation.
  • Deploying AI-driven personalization techniques to create tailored shopping experiences.

 

Enhancing Fraud Prevention and Returns Management

 

  • Implementing fraud detection and prevention solutions to minimize financial losses.
  • Utilizing analytics to reduce serial returns and optimize sales strategies.

 

Creating a Seamless Omnichannel Experience

 

  • Integrating e-commerce platforms with in-store experiences for consistent branding and customer engagement.
  • Implementing AI-powered chatbots and virtual assistants to enhance customer support.

 

The Future of Retail: Embracing Technology for Success

 

Retailers that embrace data-driven decision-making, AI-powered insights, and omnichannel strategies will gain a competitive edge in the evolving market.

 

The Future of Retail with Dynamics 365 AI-Powered ERP Solutions

The retail industry is undergoing a transformation driven by advancements in technology. Among the key players leading this transformation is Microsoft’s Dynamics 365, an AI-powered ERP solution. This cutting-edge technology is set to revolutionize the way retailers operate, offering unprecedented levels of efficiency, personalization, and customer satisfaction.

 

The Evolution of Retail

 

The retail sector has always been dynamic, adapting to changes in consumer behavior and technological advancements. From brick-and-mortar stores to e-commerce platforms, the industry has seen a significant shift.

 

The next wave of transformation is being spearheaded by AI-powered ERP solutions like Dynamics 365.

 

Challenges in the Current Retail Landscape

 

Retailers face numerous challenges in today’s market. These include managing vast amounts of data, ensuring seamless operations across multiple channels, and meeting the ever-growing expectations of customers. Traditional ERP systems, while effective, often fall short in addressing these complexities.

 

Introducing Dynamics 365

 

 

Dynamics 365 is an integrated suite of applications that leverage AI and machine learning to provide intelligent insights and automate processes.

 

It combines CRM (Customer Relationship Management) and ERP (Enterprise Resource Planning) capabilities, offering a holistic solution for retailers.

 

 

 

AI-Powered Insights

 

One of the standout features of Dynamics 365 is its ability to harness the power of AI to provide actionable insights. From predicting customer behavior to optimizing inventory levels, AI-driven analytics enable retailers to make data-informed decisions.

 

This not only enhances operational efficiency but also leads to improved customer experiences.

 

Seamless Integration

 

Dynamics 365 seamlessly integrates with other Microsoft applications, such as Office 365 and Power BI. This integration ensures that retailers have a unified platform, reducing the need for multiple disparate systems.

 

The result is streamlined operations and a cohesive view of the business.

 

Personalized Customer Experiences

 

In today’s competitive retail landscape, personalization is key. Dynamics 365 enables retailers to deliver personalized experiences by analyzing customer data and preferences.

 

This allows for tailored marketing campaigns, personalized product recommendations, and enhanced customer service, ultimately driving customer loyalty and satisfaction.

 

Inventory Management

 

Effective inventory management is crucial for retailers. Dynamics 365 offers advanced inventory management capabilities, including real-time tracking and demand forecasting.

 

By optimizing inventory levels, retailers can reduce costs, minimize stockouts, and ensure that the right products are available at the right time.

 

The Future of Retail with Dynamics 365

 

The future of retail lies in the ability to harness the power of AI and data-driven insights. Dynamics 365 is at the forefront of this revolution, providing retailers with the tools they need to thrive in an increasingly complex market.

 

Enhanced Customer Engagement

 

As AI continues to evolve, so too will the capabilities of Dynamics 365. Retailers can expect even more sophisticated tools for customer engagement, including advanced chatbots, predictive analytics, and personalized shopping experiences.

 

These innovations will help retailers build stronger relationships with their customers and stay ahead of the competition.

 

Operational Efficiency

 

The automation of routine tasks and processes will free up valuable time and resources for retailers. This will allow them to focus on strategic initiatives and innovation.

 

Dynamics 365’s AI-powered automation will drive operational efficiency, reducing costs and increasing profitability.

 

Adapting to Market Trends

 

The retail industry is constantly evolving, and staying ahead of market trends is essential. Dynamics 365’s AI capabilities enable retailers to quickly adapt to changing market conditions.

 

By analyzing data in real-time, retailers can identify emerging trends and adjust their strategies accordingly.

 

Sustainability and Ethical Practices

 

Consumers are increasingly concerned about sustainability and ethical practices. Dynamics 365 can help retailers meet these demands by providing insights into their supply chain and enabling more sustainable practices.

 

This not only benefits the environment but also enhances the retailer’s brand reputation.

 

The future of retail is bright with Dynamics 365 AI-powered ERP solutions.

 

By leveraging the power of AI and data-driven insights, retailers can overcome the challenges of today’s market and thrive in the competitive landscape.

 

Unleashing Potential: Dynamics 365 Business Central for Growing Businesses

In the quest for business growth, efficiency, and competitive edge, Microsoft Dynamics 365 Business Central emerges as a beacon of innovation for small and medium-sized businesses.

 

It’s more than just software — it’s a transformational tool that adapts to your unique business needs.  

 

What is Business Central? 

 

Microsoft Dynamics 365 Business Central is built and optimized for small and medium businesses.

 

It’s an application for companies that have outgrown their entry-level business applications or are replacing outdated legacy systems and need an end-to-end solution for financials, sales, service, and operations.

 

It automates and streamlines business processes and helps clients manage their business. 

 

 

Modules 

 

The modules in Dynamics 365 Business Central are designed to provide powerful capabilities for financial management, sales and marketing, supply chain management, project management, customer service, human resource management, data analytics, and customized modules. 

 

Benefits 

 

It empowers organizations to transform, improve, and optimize various aspects of their operations. Here are some key features and benefits: 

 

Cloud-Based Solution

 

Business Central operates in the cloud, allowing businesses to access it from anywhere. This cloud technology ensures scalability, flexibility, and security. 

 

Functional Areas Covered

 

  • Financial Management: Manage your finances, including accounting, budgeting, cash flow, and financial reporting.
  • Sales and Service: Streamline sales processes, track leads, manage customer interactions, and enhance service delivery.
  • Supply Chain Management: Optimize inventory, procurement, production, and distribution.
  • Project Management: Facilitate project success by tracking tasks, resources, and budgets.
  • AI Integration: Leverage artificial intelligence (AI) capabilities for smarter decision-making.

 

Customization and Tailoring

 

  • Easily tailor Business Central to your specific needs using prebuilt apps;
  • Collaborate within Microsoft Teams and streamline workflows;
  • Connect with existing systems seamlessly. 

 

Total Economic Impact

 

A commissioned study found that adopting Microsoft Dynamics 365 Business Central resulted in significant benefits for organizations 

 

Business Central is more than an ERP — it’s a catalyst for business excellence.

 

Revolutionizing Sales Order Processing: Dynamics 365 F&O Sales Order Automation with AI

In the ever-evolving landscape of business operations, staying ahead means embracing innovation. Introducing our latest breakthrough – Dynamics 365 F&O Sales Order Automation with AI.

 

This transformative solution is set to redefine how businesses handle sales orders, introducing a seamless and intelligent approach to order processing.

 

Unveiling the Power of Automation

 

Automatic Draft Generation

 

Say goodbye to the days of manual order entry. Our system excels at converting unstructured orders, received in free-text formats like emails, into draft sales orders within Dynamics 365 F&O.

 

This not only accelerates the order processing timeline, but also reduces the risk of errors associated with manual data entry.

 

AI-Powered Predictions

 

Harness the potential of artificial intelligence to predict key order details with unmatched precision.

 

From customer names and shipping dates to specific items and quantities, our advanced model ensures that your draft orders are not just generated swiftly, but with unparalleled accuracy.

 

Empowering Users with Control

 

Staging Overview

 

Gain a comprehensive view of all staging orders and their lines. Simultaneously, review the original order content from the customer for quick validation.

 

This intuitive interface ensures that users have the necessary context to make informed decisions during the approval process.

 

Color-Coded Accuracy

 

We believe in transparency. Every order and line is color-coded based on the model’s prediction accuracy – green for high accuracy, yellow for moderate, and red for areas that may need attention.

 

This visual cue empowers users to make swift decisions with confidence.

 

User Validation and Customizable Thresholds

 

Our system doesn’t just rely on automation; it embraces user expertise. Users can validate and approve draft orders, correcting any inaccuracies directly on the staging form.

 

Customize threshold values for prediction accuracy, tailoring the system to meet the unique needs of your business.

 

Tailored for Your Business

 

Flexible Item Identification

 

Not all customers are the same, and neither should your item identification methods be.

 

Define item identification preferences in the setup form to accommodate different customer requirements, whether it’s external item identification numbers or barcode scanning.

 

String Matching Technology

 

In cases where the model encounters incomplete item names, our system employs advanced string-matching technology.

 

It ensures that the system recognizes the closest existing item, leaving no room for ambiguity in your orders.

 

Comprehensive Validation and Monitoring

 

Validation Log

 

Access a detailed validation log presenting all messages related to the selected order.

 

This feature is especially useful for addressing issues linked to missing data on the customer or item level, ensuring that every order is processed seamlessly.

 

Dashboard Workspace

 

Our system comes equipped with a dynamic dashboard workspace. Monitor the number of draft, rejected, approved, and error orders at a glance.

 

Track the model’s performance with charts illustrating the number of user-edited versus non-edited approved orders on a monthly basis.

 

Gain insights into order sources with a visually intuitive pie chart.

 

Elevate Your Business Processes

 

Experience the future of sales order management with Dynamics 365 F&O Sales Order Automation.

 

Unified Pricing Management (UPM) in Dynamics 365 Supply Chain Management

Unified Pricing Management (UPM) is a comprehensive solution that enables businesses to efficiently set, manage, and apply pricing rules across various sales channels.

 

Designed for flexibility and scalability, UPM allows organizations to maintain consistent pricing strategies while adapting to market demands and customer needs.

 

Key Features of UPM

 

  • Centralized Pricing Control – Businesses can define pricing structures in a single place, ensuring consistency across different sales and order processes.

 

  • Flexible Pricing Rules – UPM supports tiered pricing, volume discounts, and promotional offers, allowing for dynamic price adjustments.

 

  • Omnichannel Compatibility – The system seamlessly integrates with multiple sales channels, including e-commerce, retail, and B2B transactions.

 

  • Advanced Discounting Mechanisms – Users can configure complex discounting scenarios based on customer groups, product categories, or purchase volumes.

 

  • Scalability for Business Growth – Whether managing simple price lists or advanced pricing strategies, UPM adapts to growing business needs.

Benefits of UPM

 

  • Ensures consistent and transparent pricing policies;
  • Reduces manual pricing errors and discrepancies;
  • Enhances customer satisfaction through accurate and competitive pricing;
  • Streamlines pricing updates across the organization.

 

UPM is a powerful tool for businesses looking to optimize pricing strategies while maintaining flexibility in a competitive market.

 

Pricing Components in Unified Pricing Management

 

Unified Pricing Management (UPM) determines pricing based on several key components:

 

  • Price Attributes – These provide a flexible way to define pricing factors by using data from customers, products, sales order headers, and sales order lines. Since they integrate with the customer and product attribute framework, they are highly customizable. Additionally, extension points are available for further modifications.

 

  • Price Component Codes – These serve as the foundational elements of the pricing structure by grouping related price attributes. When setting up price and discount rules, each rule is assigned to a specific price component code.

 

  • Price Structures – These define the order in which price component codes are applied. A company can use a single price structure or multiple structures based on different order attributes. The embedded pricing logic ensures that a base price is established before any adjustments are applied (Base Price + Adjustments = Final Selling Price).

 

  • Concurrency Modes – These determine how the final price is calculated when multiple pricing rules apply to the same price component code, ensuring accurate price determination. 

 

In summary, Unified Pricing Management (UPM) in Dynamics 365 Supply Chain Management provides a structured and flexible approach to pricing.

 

By leveraging price attributes, component codes, structured pricing logic, and concurrency modes, businesses can ensure consistency, transparency, and adaptability in their pricing strategies.

 

This comprehensive system not only streamlines pricing operations but also enhances accuracy and competitiveness across multiple sales channels.

 

Microsoft Fabric: Automatically Synchronize Data from Semantic Models into OneLake

This feature is incredibly exciting, and it feels like it hasn’t received the attention it deserves amidst all the other recent updates. There’s certainly a lot of innovative updates in the Fabric platform coming every day!

 

In this post, I’ll guide you on how to automatically export data from your semantic models to Delta tables in OneLake. You only need to set the configuration up once, and Fabric will take care of exporting and updating the data for you—no need for pipelines, dataflows, or scripts. It’s that simple!

 

Prerequisites

 

OneLake integration for semantic models is exclusively available with Power BI Premium P and Microsoft Fabric F subscription tiers. This feature isn’t accessible through Power BI Pro, Premium Per User licenses, or Power BI Embedded A/EM plans.

 

1. Workspace with at least one semantic model in import mode hosted on a Power BI Premium or Fabric capacity.

 

2. Option Large semantic model storage format enabled for the particular model.

 

Permissions

 

The user should have a contributor role in order to be able to create shortcuts linking the semantic model delta tables into Lakehouse.

 

 

1. Semantic model settings

 

Go to the settings pane of the semantic model which date you would like to export to OneLake and make sure both options: Large semantic model storage format  and OneLake Integration are enabled.

 

 

In addition, make sure that the following settings are enabled in the Power BI Admin portal:

 

1. Semantic models can export data to OneLake: If this option is turned off, users cannot enable OneLake integration for their semantic models, and any models already set up for OneLake integration will stop exporting import tables to OneLake. By default, OneLake integration is enabled for the entire organization.

 

2. Users can store semantic model tables in OneLake: Allowing specific or all users to configure OneLake integration for their models. If this feature is disabled for a particular user, they will no longer be able to enable OneLake integration. However, any semantic models they’ve already set up for OneLake integration will continue exporting import tables.

 

Both options are enabled by default and can be managed by global and tenant administrators.

 

2. Refresh

 

After the OneLake integration has been enabled, a manual or scheduled refresh is needed to be performed on the semantic model in order for the data to be written to a Delta table in OneLake.

 

3. Import data into Lakehouse

 

Next step is to link the exported data into your lakehouse, by creating shortcuts.

 

1. Go to your Lakehouse.

 

2. Under Tables, select the three dots and select New shortcut

 

 

3. In the pop-up window, select Microsoft OneLake as a source.

 

4. If the refresh of your semantic model was successful and you have proper permissions on it, you should be able to see the semantic model in the list of available data sources to choose from

5. After selecting your semantic model, you can select which tables from it you would like to create a shortcut in your Lakehouse. You can select a specific table or create them all.

 

6. Once the creation process is complete, you can see your newly created shortcuts under the Tables section. Now you can do all the necessary operations over them, as they are regular tables in Lakehouse (i.e. querying through PySpark notebook).

 

 

7. Upon each model refresh, the latest data will be exported to the OneLake, thus the user will always have the newest data in the Lakehouse.

 

Limitations

 

There are certain limitations that should be considered in order to understand whether this functionality fulfills your business requirement and whether you should proceed with its implementation. The most important ones are:

 

  • Measures, DirectQuery tables, hybrid tables, calculation group tables, and system managed aggregation tables can’t be exported to Delta format tables.

 

  • Only a single version of the delta tables is exported and stored on OneLake. Old versions of the delta tables are deleted after a successful export. Meaning that there is no mechanism for storing historical data or versioning. To do this, a workaround can be implemented.

 

Thinking Outside the Box: Leveraging OData Entities and Power Query in Dynamics 365 for Finance

In today’s fast-paced business environment, the ability to think outside the box and find innovative solutions is crucial. One such example is how we recently addressed a customer’s requirement in Dynamics 365 for Finance without resorting to customizations.

 

By harnessing the power of OData entities and Power queries in Excel, we were able to deliver a real-time, efficient solution that exceeded our customer’s expectations.

 

The Challenge

 

In essence our customer needed a way to summarize weights based on commodity codes for consolidated packing slips, a task that traditionally might have required custom development.

 

However, we aimed to achieve this using the standard tools available within Dynamics 365 for Finance, avoiding the time and cost associated with customizations.

 

The Solution

 

We turned to OData entities and Excel, leveraging their capabilities to create a seamless and efficient process. Here’s how we did it:

 

1. Utilizing OData Entities

 

OData (Open Data Protocol) entities in Dynamics 365 for Finance allow for easy access to data. We identified the relevant OData entities that contained the packing slip and commodity code information we needed.

 

–  To see all publicly available entities add the keyword /data in the URL

In that list we have identified the entities:

CustPackingSlipTransBiEntities and ProductCategories

 

– To check if the entity provides all fields needed, add the entity name in the URL

 

2. OData Feed in Excel

 

OData Feed in Excel allows us to connect to these entities and manipulate data further within Excel.

 

– To expose the entity data in Excel, copy the URL with the entity name and maybe add some filters to reduce the data load, like:

 

https://xxxxxx.operations.dynamics.com/data/CustPackingSlipTransBiEntities?$filter=dataAreaId eq ‘xyz’  (indicating to fetch only data from ‘xyz’ legal entity).

 

– Paste that URL in:

 

 

3. Power Query in Excel

 

Power Query is a powerful tool within Excel that enables data transformation and combination. We used Power Query to merge two queries from the OData entities, effectively summarizing the weights based on commodity codes on the consolidated packing slips.

 

4. Real-Time Data Extraction

 

By connecting Excel to the OData entities, we ensured that the data extraction was real-time. This means that any updates in Dynamics 365 for Finance were immediately reflected in our consolidated packing slips.

 

 

The Outcome

 

The result was a streamlined process that met the customer’s requirements without any customizations. The real-time data extraction ensured accuracy and timeliness, and the customer was extremely satisfied with the solution.

 

 

Conclusion

 

This experience highlights the importance of thinking creatively and utilizing the tools at our disposal. By leveraging OData entities and Excel, we can achieve powerful results without the need for custom development.

 

Creating D365 F&O Workspaces with Dynamic Filters

A D365 F&O workspace is a centralized hub within Dynamics 365 Finance and Operations that consolidates commonly used links, tiles, lists, and tasks specific to a user’s role.

 

In this blog, we will show how to create a workspace in Dynamics 365 for Finance and Operations. We will also explain how to make personalized views with dynamic filters and add them to the workspace to display the necessary KPIs.

 

The process starts by right-clicking on the default dashboard in the Workspace area. Then, click on “Personalize: Workspaces

 

 

In the pop-up that appears, the next step is to click on “Add a page” and then select “Workspace“.

 

 

Next, enter the name you want to use as the workspace title. In this demo, we will name it “Sales orders created today.”

 

Once the workspace is successfully created, it will appear alongside other existing workspaces. Click on it, and you should be able to see its content.SS

 

At this point, the workspace will be empty because nothing has been added yet. The next step is to personalize a form. In our demo, we will use the “All Sales Orders” form. The goal is to add a personalization with a dynamic filter to the workspace and display the count of records as a tile.

 

Navigate to Sales and Marketing > Sales Orders > All Sales Orders.

 

Personalize the form by adding the field “Created Date and Time”. Apply a filter on the grid using Day(0). This filter ensures that only the orders created on the same day the form is opened are displayed. There are also many other dynamic filters available, which you can explore using this link.

 

 

After successfully applying the Created Date and Time filter, save the personalized view. Then, add it to the previously created workspace.

 

 

Once you click on “Save as“, enter the title and description for the view. Then, using the Action Pane, click Options > Personalize > Add to Workspace.

 

Select the previously created workspace, choose the necessary presentation, which is Tile in our demo, and then click Configure. Finally, click Add to Workspace.

 

 

To test the outcome, navigate to the default dashboard and access your workspace.

 

 

In conclusion, workspaces in D365FO are beneficial because they provide a personalized and efficient way to access and monitor key data. By allowing users to customize views, apply dynamic filters, and display relevant KPIs through tiles, workspaces streamline workflows and enhance decision-making.

 

Understanding Key Financial Terms in Microsoft Dynamics 365 Finance and Operations

For Functional Consultants and Financial Professionals

 

If you’re diving into the world of Microsoft Dynamics 365 Finance and Operations (D365 F&O), you’ll quickly encounter a variety of terms and concepts related to accounting and financial management.

 

 

Whether you’re a seasoned consultant or just getting started, it’s essential to have a solid understanding of key financial terms, like the General LedgerSub LedgerGeneral Journal, and Vouchers.

 

These are the building blocks that keep your financial data organized and transparent.

 

 

 

In this blog, we’ll break down these terms in a way that makes sense and helps you understand how they work together in D365 F&O.

 

General Ledger (GL): The Big Picture

 

The General Ledger is the heart of your financial system. Think of it as the primary record of your company’s financial health. It provides a high-level overview of all your company’s accounts, like Accounts ReceivableAccounts PayableCash Management, and more.

 

In essence, the GL holds the total balances for all these accounts. It gives you the snapshot of where your business stands financially at any given moment.

 

Whether you’re reviewing your year-end financials or preparing a report for a client, the General Ledger is your go-to source of truth for the overall financial position of the company.

 

Sub Ledger (Subsidiary Ledger): The Details Behind the Numbers

 

While the General Ledger provides the big picture, the Sub Ledger offers the finer details. The sub ledger is where individual transactions are recorded, offering more granularity than what’s available in the GL.

 

For example, in the Accounts Receivable (AR) sub ledger, you’ll see all transactions related to individual customers, like invoices, payments, and credits. Similarly, the Accounts Payable (AP) sub ledger keeps track of every vendor-related transaction, from invoices to payments.

 

In D365 F&O, these sub ledgers play a crucial role in ensuring that every transaction is accurately captured and linked back to the General Ledger. This makes it easy to reconcile and verify the financial data.

 

General Journal: The First Step in Recording Transactions

 

The General Journal is where transactions begin their journey. Whenever a financial transaction occurs, it is first recorded in the general journal before being summarized and posted to the General Ledger.

 

This is typically where you’ll record low-volume, non-repetitive transactions, such as adjustments, accruals, and manual entries. For example, if you’re entering a one-time expense or a journal entry for a payroll adjustment, it will likely go into the General Journal first.

 

After being reviewed and approved, the entries in the general journal are transferred to the General Ledger, where they are grouped with similar transactions.

 

Vouchers: Linking the Dots

 

A Voucher is like a bridge between the sub ledger and the general ledger. When you post transactions from the sub ledger to the GL, they are recorded as vouchers.

 

Vouchers ensure that each transaction is accurately linked and traceable. They act as a reference for detailed transaction information, allowing you to trace the transaction back to its origin in the sub ledger.

 

For example, if you’re looking at an entry in the GL, the voucher allows you to see the original document and details from the AR or AP sub ledger.

 

This is incredibly helpful for tracking and auditing purposes, ensuring that all financial data can be traced back to its source for clarity and verification.

 

Putting It All Together

 

Now that we’ve broken down each term, it’s clear how these financial components work together in D365 F&O:

 

  • The General Ledger (GL) gives you the overall financial position.
  • The Sub Ledgers provide specific transaction details within each major account (AR, AP, etc.).
  • The General Journal is the starting point for entering low-volume transactions.
  • Vouchers tie everything together by linking sub ledger transactions to the General Ledger.

 

Each of these components plays a crucial role in maintaining an organized, accurate, and auditable financial system. Understanding how they interact will help you navigate the complexities of D365FO more effectively, ensuring that your financial data is always in order.

 

Final Thoughts

 

As a consultant or financial professional working with Microsoft Dynamics 365 Finance and Operations, mastering these key financial terms will help you communicate more effectively with clients, navigate the system with ease, and ensure that financial records are always accurate and complete.

 

Whether you’re managing accounts, reviewing financial reports, or troubleshooting issues, having a solid grasp of the General LedgerSub LedgersGeneral Journal, and Vouchers will set you up for success.

 

Location Blocking Causes Policy

Managing warehouse locations efficiently is crucial for smooth warehouse operations. Sometimes, the warehouse managers may decide that some of the locations must be temporarily blocked for inbound or outbound work operations.

 

The reasons can vary, ranging from maintenance and quality issues to utilization of the empty space.

 

In Dynamics 365 Finance & Operations (D365 F&O) versions prior to 10.0.40, there were multiple options for blocking locations, but none were straightforward or easy to use. The process often required a combination of multiple tools.

 

Starting from version 10.0.40, Microsoft introduced changes to the process. With the update, there’s a new policy feature that enhances how blocking causes are applied called Location blocking causes policy.

 

When using the blocking causes fields (Input blocked and Output blocked) on locations, a new Blocking cause policy needs to be assigned, one that determines if the blocking cause will be used when processing warehouse work or not. The policy not only visually informs the workers, but also blocks the location and prevents the system from processing work.

 

 

If the policy is set to Do not use for warehouse work, the locations blocked for this reason will not be blocked during warehouse work processing.

 

This means that the system will be able to assign this location when using the location directives and other rules from the setup.

 

However, if the policy is set to Also use for warehouse work, the associated locations for this blocking cause will also be blocked during warehouse work processing.

 

The second option is useful for preventing the system to create inbound put away work at the assigned location during the inbound receiving process.

 

How Business Central Can Transform Your Business

In today’s fast-paced world, business models are evolving rapidly. Now is the perfect time to move to the cloud and implement a solution that drives greater value for your customers. Companies that have implemented Microsoft Dynamics 365 Business Central are already seeing significant growth.

 

Microsoft Dynamics 365 Business Central is a powerful digital platform designed to help small and medium-sized businesses streamline their operations and fuel growth.

 

It brings together all your essential business functions such as Finance, Purchase, Sales, Service, Production, Inventory, Warehouse management, Project management, Planning, Human resources, and Fixed assets, into one unified solution.

 

With Business Central, your teams can collaborate more effectively, respond faster to changes, and achieve better results.

 

Microsoft Dynamics 365 Business Central Key Benefits

 

Streamlined Business Processes

 

Business Central simplifies your operations by automating and integrating various processes and tasks. This not only boosts efficiency but also frees up your team to focus on more strategic activities.

 

Its cloud-based flexibility means you can manage your business from anywhere, on any device, keeping you competitive in today’s remote work environment. Plus, Business Central grows with you, easily scaling as your business expands.

 

Enhanced Financial Management

 

Gain real-time insights into your financial performance with Business Central’s robust financial tools. From automating financial reports to managing cash flow and handling multi-currency transactions, Business Central helps you maintain accurate financial records and make decisions.

 

Optimized Supply Chain Management

 

Manage your supply chain like never before with advanced tools that track inventory in real-time, automate reordering, and streamline logistics.

 

Business Central helps you ensure timely deliveries, reduce shipping costs, and optimize warehouse storage, all while predicting stock needs and improving overall efficiency.

 

Automated Sales and Service

 

Boost your sales and service operations with features that manage the entire customer lifecycle. From automating sales processes to tracking service contracts and resolving issues quickly, Business Central provides valuable insights to better understand and meet your customers’ needs.

 

Cost-Effective Solution

 

With Business Central, you get the benefits of a powerful cloud ERP without the high costs. The subscription-based model eliminates the need for large upfront investments, and you can avoid the expenses of servers, IT resources, and maintenance.

 

You can start using Business Central right out of the box and be up and running in no time.

 

If you’re ready to see how Microsoft Dynamics 365 Business Central can revolutionize your business, reach out to us for a personalized consultation.

 

2024 Release Wave 2 Plans For Microsoft Dynamics 365 And Power Platform

On July 16, 2024, Microsoft published the 2024 release wave 2 plans for Microsoft Dynamics 365 and Microsoft Power Platform, a compilation of the new capabilities planned to be released between October 2024 to March 2025. This release introduces a wealth of new features designed to enhance customer understanding and improve overall user experience, showcasing Microsoft’s dedication to driving digital transformation for their customers and partners.

 

The new wave is focused on improving user productivity and streamlining processes across various business applications by employing Microsoft Copilot and cutting-edge AI technologies. These enhancements include intelligent automation, AI-powered insights, and immersive user experiences and aim to remove boundaries between data, insights, and individuals.

 

Discover the newest features that enable organisations to run more effectively and adaptably.

 

The new capabilities allow businesses to take proactive measures to address challenges and capitalise on opportunities. Examples of these include predictive analytics in supply chain management, autonomous financial processes, AI-driven sales insights and customer service enhancements.

 

Early Access Period

 

Starting July 29, 2024, customers and partners can validate the latest features in a non-production environment. These updates include user experience enhancements that will be automatically enabled in production environments by October 2024.

 

We have briefly described numerous of the features from the second release wave in this blog post’s contents.

 

Wave Highlights for Microsoft Dynamics 365

 

Microsoft Dynamics 365 Sales

 

Microsoft Dynamics 365 Sales continues to enhance customer understanding and boost sales through data, intelligence, and user-friendly experiences.

 

In this release, Microsoft are focused on including natural language copilot for summarizing information, creating a new full-screen Copilot Home with curated insights and role-specific actions, and using AI-powered insights to find leads.

 

Microsoft Copilot for Sales

 

Microsoft Copilot for Sales continues to deliver and enhance cutting-edge generative AI capabilities for sellers by enriching Copilot in Microsoft 365 capabilities with sales-specific workflows, data, and actions.

 

Microsoft will focus on using AI-powered insights to create leads, deepen the integration into Copilot in Microsoft 365, and use natural language capabilities to allow sellers to ask data-related questions of their CRM.

 

Microsoft Dynamics 365 Customer Service

 

Microsoft Dynamics 365 Customer Service will continue to empower agents to work more efficiently through new copilot capabilities such as proactive prompting, ability to access data from external systems securely with plugins, email enhancements, and AI-infused routing.

 

Microsoft Copilot for Service

 

Microsoft Copilot for Service is now generally available, bringing new capabilities to enhance user experiences. These features will be integrated across Outlook, Teams, Microsoft 365 Chat, and Copilot embedded in third-party CRMs.

 

Microsoft Dynamics 365 Field Service

 

Microsoft Dynamics 365 Field Service enables a shift from reactive to proactive and predictive service, empowering digital transformation and innovative business models.

 

Using Copilot, frontline workers will be able to retrieve critical information and initiate mixed-reality remote assist calls within Teams through Copilot.

 

Managers will be able to create, update, and manage work orders effortlessly across web, Outlook, and Teams interfaces.

 

Microsoft Dynamics 365 Finance

 

Microsoft Dynamics 365 Finance continues its journey of leading in autonomous finance, using AI to transform common end-to-end financial processes.

 

This release focuses on in-app copilot capabilities, immersive persona-based user experiences, expanding country coverage, electronic invoicing enhancements, business performance analytics and planning enhancements, and autonomous reconciliation capabilities.

 

Microsoft Copilot for Finance

 

Microsoft Copilot for Finance is expanding data reconciliation capabilities in Excel with assisted data sanitization and preparation routines. Extending variance analysis capabilities with support from additional data sources and enabling collaboration on findings with stakeholders will also be a focus in the upcoming wave.

 

Additionally, the Teams integration will facilitate collections calls with suggested scripts and automated recording of action items in the financial system.

 

Microsoft Dynamics 365 Supply Chain Management

 

Microsoft Dynamics 365 Supply Chain Management is advancing along the path of an autonomous supply chain by integrating intelligence, automation, and analytics into every facet of business procedures, thereby improving user productivity and enhancing organizational adaptability.

 

In this update, the spotlight is on improving order-promising capabilities for manufacturers. Demand planning is upgraded to incorporate forecasting with external signals, and the inclusion of Copilot weaves insights and analyses directly into workflows, identifying trends and irregularities, while also allowing for specific data inquiries at the cell level.

 

Additionally, Traceability Copilot keeps track of actual products in production and compiles a comprehensive historical record of related activities.

 

Microsoft Dynamics 365 Project Operations

 

Microsoft Dynamics 365 Project Operations is focused on enhancing usability, performance, and scalability in key areas such as project planning, invoicing, time entry, and core transaction processing.

 

The spotlight is on AI-assisted core functionality improvements in estimation, proposal generation, journals, approvals, and contract management, with added mobile capabilities and scale improvements to handle larger projects and invoices at an increased scale.

 

Finance and Operations Cross-app Capabilities

 

Finance and Operations cross-app capabilities will continue to invest in capabilities applying to Finance, Supply Chain Management, Microsoft Dynamics 365 Commerce, Microsoft Dynamics 365 Human Resources, and Project Operations.

 

Microsoft is infusing copilot experiences across applications, including natural language chat, embedded AI, and intelligent process automation, and enabling extensibility for copilot scenarios.

 

Microsoft will also bring more value and insights to finance and operations apps data and enhancements to ensure continued enterprise-grade security and compliance at scale.

 

Microsoft Dynamics 365 Human Resources

 

Microsoft Dynamics 365 Human Resources continues to build intelligence, develop automation and analytics around the hire-to-separate process, increase user productivity, and empower business agility.

 

Microsoft is enhancing recruiting with AI-driven assessments and offers management, improving experiences for employees and HR business partners in benefits and performance management, and advancing analytics, insights, and planning through business performance planning and analytics capabilities.

 

Microsoft Dynamics 365 Commerce

 

Microsoft Dynamics 365 Commerce is using the power of AI to empower retailers to streamline their operations and drive increased customer loyalty and conversions. With Copilot, retail managers, sales associates, and merchandisers will gain new AI-powered insights into customer buying patterns and preferences, recommendations for positioning and selling products, and business intelligence on store performance.

 

Improvements to the self-checkout POS make customer checkouts more efficient, and user experience updates to Store Commerce app streamline daily tasks for faster, more efficient sales and service.

 

Microsoft Dynamics 365 Business Central

 

Microsoft Dynamics 365 Business Central is focused on maintaining service reliability performance and security standards. Microsoft will continue enhancing productivity by optimizing core processes with Copilot, expanding to cover more than 170 countries, and offering enhanced reporting with more than 80 Microsoft Power BI reports.

 

Additionally, integration with Field Service will be expanded, along with new financial management features. Microsoft will also enhance development tools and governance, along with improved data privacy and compliance management.

 

Wave Highlights for Microsoft Power Platform

 

Microsoft Power Apps

 

Microsoft Power Apps will continue to transform app experiences with infused intelligence, enabling users to be more productive by using Copilot to work with data, get insights, and improve their apps.

 

Makers will continue to benefit from AI-assisted development, enabling rich and complex applications to be built with monitoring, control, and unmatched governance for admins, ensuring organizations can adopt low-code and AI transformation at scale.

 

Microsoft Power Pages

 

Microsoft Power Pages will expedite site building for a low-code maker or pro developer to build intelligent sites that reimagine the way you interact with your employees, customers, and partners.

 

Microsoft Power Automate

 

Microsoft Power Automate will continue to make it easier to build flows by using natural language and multi-modal generative AI capabilities across cloud flows and desktop flows, troubleshooting runs, and managing your automation estate with an end-to-end view.

 

This, along with improvements in process mining to jumpstart creation of automation through Microsoft 365 integration and ongoing improvements to scaling, means it’ll be easier than ever for new users to get started and scale.

 

Microsoft Copilot Studio

 

Microsoft Copilot Studio is advancing copilot capabilities and IVR support with Customer Service and will expand geographically to the United Arab Emirates and Germany.

 

Additionally, the team is improving software lifecycle management capabilities with topic-level import/export and role-based access control (RBAC), as well as enhancing governance and administration functionalities.

 

Key Dates for the 2024 Release Wave 2

 

You can access additional information regarding the key dates for the 2024 release wave 2 here.

 

If your goals are to improve and optimize your business processes, ensure data security in the cloud, make application usage simpler in the long term and seek assistance in upgrading your Dynamics 365 versions to newer versions, we are excited about the possibility for potential collaboration. Reach out to us here.

Understanding Data Sources: Overview of Different Data Sources that Can Be Connected to Power BI

Power BI, a unified platform for self-service and business intelligence is a group of software services, applications, and connectors that come together to transform your disparate data sources into cohesive, interactive, and visually stunning insights.

 

Your data may be stored in a hybrid data warehouse both on-premises and in the cloud, or it may be an Excel spreadsheet. With Power BI, you can visualize and identify what’s important, connect to your data sources with ease, and share that information with whomever you choose.

 

Starting with these three fundamentals, Power BI is made up of multiple components that function as a whole:

 

  • A Windows desktop application called Power BI Desktop;
  • An online SaaS service called the Power BI service;
  • Mobile applications for Windows, iOS, and Android devices called Power BI Mobile.

 

In addition to those three, Power BI has two more components: Power BI Report Builder and Power BI Report Server for creating and publishing your reports.

 

Comprehending the diverse data sources that may be integrated with Power BI is crucial to fully utilize this tool for data analysis and representation. Power BI allows users to import, convert, and visualize data from many platforms by connecting to a broad range of data sources, both on-premises and in the cloud.

 

An overview of the various kinds of data sources that can be linked to Power BI is provided below.

 

File-based Data Sources

 

  • Excel: One of the most used data sources (.xlsx,.xlsm) can be connected to Power BI in order to import named ranges, data tables, and ranges.
  • Text and CSV Files: Import information from plain text and comma-separated values (CSV) files.
  • XML and JSON Files: For hierarchical data processing, load structured data from XML and JSON files.

 

Database Management Systems (DBMS)

 

  • SQL Server: Establish a direct connection to on-premises and cloud-based SQL Server databases (Azure SQL Database).
  • MySQL: Data extraction is made easy with the integration with MySQL databases.
  • Access data kept in PostgreSQL databases using PostgreSQL.
  • Oracle: Use enterprise data by connecting to Oracle databases.
  • Import data from Access databases (.accdb,.mdb) using Microsoft Access.

 

Cloud-based Data Sources

 

  • Azure Services: Establish a connection with different Azure data services, including Azure Data Lake, Azure SQL Database, and Azure Blob Storage.
  • Google BigQuery: Use Google’s scalable big data solution to import data.
  • Connect to Amazon’s data warehousing service by utilizing Amazon Redshift.
  • Salesforce: For in-depth business insights, import data from Salesforce CRM.

 

Online Services and APIs

 

  • SharePoint Online Lists: Access information from libraries and lists on SharePoint Online.
  • Microsoft Dynamics 365: Access Dynamics 365 data for business resource planning (ERP) and customer interaction.
  • Google Analytics: Use Google Analytics to import analytics data for websites and apps.
  • Facebook: Use Facebook data to access social media analytics tools.

 

Big Data and Advanced Analytics

 

  • Hadoop/HDFS: For large data analytics, establish a connection to the Hadoop Distributed File System (HDFS).
  • Spark: To process data in memory, integrate with Apache Spark.
  • R and Python Scripts: For sophisticated analytics and statistical calculations, import and analyse data using R and Python scripts.

 

Business Applications

 

  • Power BI Datasets: Utilise the Power BI service to establish connections to pre-existing Power BI datasets.
  • SAP HANA and SAP BW: For enterprise data solutions, import data from SAP Business Warehouse and SAP HANA.
  • OData Feeds: To access standardized data online, connect to OData feeds.

 

Other Data Sources

 

  • Web Pages: Use Power BI’s web connector to import data straight from websites.
  • Folder: Allows for the batch processing of related files by importing data from several files into a folder.
  • Azure Marketplace: Use the Azure Marketplace to connect to a variety of datasets.

 

Add/Apply Charges on Invoice Journal when Posting Free Text Invoice and/or Sales Invoice

Requirement 

 

By law, stamp duty(charge) in some countries must be applied to all invoices above some threshold (in absolute value, for positive and negative documents) that use specific sales tax codes.

 

The requirement is to automatically apply stamp duty (charge) on the invoices (and credit notes) during posting of sales invoice or free text invoice.

 

The idea is to add new parameters to identify the threshold amount, the stamp duty value to apply, the sales tax codes subjected, and to define a charge code that will be added during the invoice process.

 

Although this might seem like simple requirement, in the background it took some time to figure out the correct place where to add the charge – and on which document to add it. So, the focus would be on the technical part where and how to add the charge.

 

Free Text Invoice Posting

 

The first part we are going to look at is Free Text Invoice (FTI) posting. Since the requirement was to add the charge on the posted journal, the focus was to find the place where to add a new charge on the journal itself – not on the FTI.

 

The appropriate method to extend for this was: CustPostInvoice\processMarkup() where the other charges from the FTI were brought on the invoice journal.

 

 

With this implementation, there are a couple of issues we encountered.

 

Problem No.1

 

The totals on the journal were not correct. The reason was simply because the code where we added the charge was too late in this process and the whole creation of the invoice journal was strictly dependent of the FTI, the charges and the taxes on it. When taxes were calculated later, we were missing tax transactions for the newly added charge – so nothing was created in the journal correctly and the totals were messed up.

 

Solution

 

The appropriate implementation was to add the charge on the FTI first and let the system take care of copying the charge on the invoice journal and handling the totals calculation. So, the code was changed to add the charge earlier in the process.

 

If we look at the CustPostInvoice\run() method, we can see the part where there is charge and tax calculation, which is executed and committed before our modification. This caused the tax to be not recalculated after adding the charge.

 

 

The code was adjusted and the correct method to use here was CustPostInvoice\prePostCustInvoice()

 

 

Problem No.2

 

The tax lines related to the newly created charge were not calculated.

 

Solution

 

After adding our charge, delete taxes so that they can be recreated.

 

 

Problem No.3

 

Payment schedule total does not match the invoice total.

 

 

Solution

 

After adding the charge, we needed to recreate the payment schedule for the invoice, because we encountered this error during posting:

 

Sales Invoice Posting

 

The second part we are going to look at is Sales Invoice posting. Since the requirement was to add the charge on the posted journal, the focus was to find the place where to add a new charge on the journal itself – not on the sales invoice. But, because we already had a lot of issues with the FTI, we learned that the best approach is to add the charge on the original document.

 

With debug, we found the correct place to add the charge, before posting the journal. The appropriate method to extend was: SalesInvoiceJournalCreate\initSourceTable().

 

Finally, the method which is adding the charge:

A Big Step Forward for the Macedonian Food Giant: Vitaminka with a Successful Full Implementation of Dynamics 365 Finance and Operations

With the successful implementation of Dynamics 365 Finance and Operations, the Macedonian food giant opened the doors to full technological improvement and digitalization of the business.

 

Founded more than 66 years ago, Vitaminka is synonymous with quality, a company that cares to always satisfy the taste of its consumers, known for its audacity in introducing innovations and following innovation trends.

 

To make a big step forward in its operational efficiency, modernization of its operations, management, and implementation of best practices, Vitaminka decided to invest in the latest technologies, and as its partner in this significant step towards complete technological transformation chose Axapta Masters.

 

 

By joining forces, after an intensive period of work and cooperation, in January 2024 the implementation of D365 F&O was successfully completed. Today, Vitaminka has a fully integrated platform that unites the warehouse, production, and financial aspects of their work.

 

D365 F&O offers a fully integrated system, which allows companies complete control and visibility of all aspects of business operations.

 

Benefits of the Implementation

 

  • Increased Efficiency: The system enables a significant improvement in operational efficiency, which will lead to a reduction in the time required to carry out certain activities and a reduction in costs.

 

  • Accurate and Fast Financial Reports: The implementation of D365 F&O allows the generation of accurate financial reports in real time, which significantly improves the management of finances.

 

  • Improvement of Warehouse Operations and Production Process: The system provides efficient management of the warehouse operation and production processes, which enables better control and monitoring of the real situation in the warehouse and production.

 

  • Better User Experience and Growth Opportunities: D365 F&O will improve and facilitate the work process of teams in the company. The system is designed to adapt to the needs of companies, making it an ideal choice for businesses that are constantly growing and investing in innovation.

 

Dynamics 365 Finance and Operations is much more than just a sophisticated system. D365 F&O is the key to successful operations management and business growth in today’s digital age.

 

Therefore, with the successful implementation, Vitaminka remains a leader in its industry with innovative and technologically advanced solutions. This significant transformation will provide the company with not only an economic advantage, but also financial stability in the long term.

 

With Axapta Masters on its side, Vitaminka opened the way to new successes and heights in its successful Macedonian business story.

Resolving Duplicate Key (RecId) Error on D365 F&O

If you have an issue with a duplicate value for RecId field in some table you can fix it with executing a script/procedure in SQL.

 

Example

 

Considering below example query as where duplicate errors are appearing.

 

INSERT INTO WMSLocationAggregateStatus results in duplicate key error.

 

You will need to check what keys the relevant tables have and determine what the likely duplicate column is. In this particular case it is related to a system sequence issue. The error is happening because the next RecId that is generated for a new record is already used in another record. We all know that RecId should be unique for every record in the table.

 

For issues related to the RecId sequence, the sequence name will be table specific. You can use the following query to determine what the correct RecId sequence name is for your table:

 

Query: SELECT ID FROM TABLEIDTABLE WHERE NAME LIKE /*<Table Name as a string>*/;

 

The RecId sequence name for the table will be “SEQ_” followed by whatever Id is returned by the query. For example, if the above returned 12345, then the RecId sequence name will be “SEQ_12345”.

 

Example

 

SELECT ID FROM TABLEIDTABLE WHERE NAME LIKE WMSLocationAggregateStatus;   –19972

select max(RecID) from WMSLocationAggregateStatus

–5637173928

select current_value from sys.sequences where name = ‘SEQ_19972’

–5637164075

 

If current_value from sys.sequences is lower than the max(RecID) from the table then you need to correct this.

 

Example Script

 

DECLARE @SequenceName varchar;SET @SequenceName = ‘SEQ_19972’;

DECLARE @SafeRange int;

SET @SafeRange = 1000;

DECLARE @CurrentValueFromSequence bigint;

DECLARE @CurrentValueFromTable bigint;

DECLARE @NewSequenceValue bigint;

DECLARE @Discard bigint;

BEGIN TRANSACTION;

SELECT @CurrentValueFromSequence = CAST(seq.current_value AS bigint) FROM sys.sequences seq WHERE seq.name = @SequenceName;

SELECT TOP 1@CurrentValueFromTable = RecId FROM WMSLocationAggregateStatus ORDER BY RecId DESC;

IF @CurrentValueFromTable >=@CurrentValueFromSequence

BEGIN

SET@NewSequenceValue=(@CurrentValueFromTable -@CurrentValueFromSequence)+@SafeRange

EXEC sp_sequence_get_range @SequenceName, @NewSequenceValue, @Discard;

END

COMMIT TRANSACTION;

 

Template Script

 

You need to fill the yellow fields to run the script for your needs.

 

Script:

DECLARE @SequenceName varchar;

SET @SequenceName = /*<Sequence Name>*/;

DECLARE @SafeRange int;

SET @SafeRange = 1000;

DECLARE @CurrentValueFromSequence bigint;

DECLARE @CurrentValueFromTable bigint;

DECLARE @NewSequenceValue bigint;

DECLARE @Discard bigint;

BEGIN TRANSACTION;

SELECT @CurrentValueFromSequence = CAST(seq.current_value AS bigint) FROM sys.sequences seq WHERE seq.name = @SequenceName;

SELECT TOP 1 @CurrentValueFromTable = /*<Column Name>*/ FROM /*<Table Name<*/ ORDER BY /*<Column Name>*/ DESC;

IF @CurrentValueFromTable >= @CurrentValueFromSequence

BEGIN

SET@NewSequenceValue=(@CurrentValueFromTable-@CurrentValueFromSequence)+@SafeRange

EXEC sp_sequence_get_range @SequenceName,@NewSequenceValue, @Discard;

END

COMMIT TRANSACTION;

 

What to Do if the Script Is Not Working

 

If the script is not working you can run the following line

 

exec sp_sequence_get_range [ @sequence_name = ] N'<sequence>’, [ @range_size = ] range_size,[ @range_first_value = ]range_firstValueOutput

 

Note that in @range_size you need to enter a number by how many you want to increase the current_value for that sequence.

 

Best way to determinate this is if you get the max(RecId) from that table sustract the current_value for that sequence and add 1000 to it. This way you will be sure that the RecId is not used and you wont have a conflict.

 

Example

 

select max(RecID) from WMSLocationAggregateStatus  result –5637173928

select current_value from sys.sequences where name = ‘SEQ_19972’; result –5637164075

Range size = 5637173928 – 5637164075 + 1000 = 10,853exec sp_sequence_get_range SEQ_19972, @range_size = 10853, @range_first_value = 1

 

How to Run the Procedure

 

  • For cloud hosted environments you can do it directly in SQL Server Management Studio on the environment itself.
  • For Microsoft managed environments that are not PROD you can connect using a JIT access and run the script/procedure.
  • For PROD environment you need to contact Microsoft to do that for you.

A Short Walkthrough into the Amazing Microsoft Fabric World

If you are into Data Analytics you know that the most exciting platform has been GA now – Microsoft Fabric, maybe the most significant one in Microsoft Data Platform space that consolidates Power BI, Azure Synapse, and other applications into one united powerful platform!

 

If you haven’t been inspired yet, now is the time for you to get your free trial license and explore this easy-to-use experience. We have been doing this for almost six months now and are amazed by all the opportunities that this platform can provide for the business.

 

Why Microsoft Fabric is a Great Platform

 

 

It unites the three main Microsoft’s Data Analytics products – Azure Synapse, Azure Data Factory and Power BI.

 

  • OneLake as Storage;
  • Data Factory as Data integration;
  • Synapse as Data engineering, Data warehousing, Data science and Real – time analytics;
  • Power BI as Business Intelligence;
  • Data Activator as Action platform;
  • Purview as Governance.

 

What can be easier than having one place for everything?

 

Introduction of the Above-mentioned Products

 

OneLake

 

The descriptive name for this product would be – Collaboration. Every Fabric tenant has no zero, no more, but exactly one OneLake from where can access all its data through data items. All tabular data is stored in one single format – Delta Parquet, the format that allows us to use the same data across different analytical engines (Spark, T – SQL, KQL, Analysis Services, etc.).

What does this mean? If SQL developer using T – SQL loads data in a fully transactional data warehouse, and data engineer loads data into lakehouse using Spark, both are contributing to the same data lake.

 

 

Data Factory

 

The superpower of Data Factory is to transfer billions, trillions of rows of data. For this to be done in Fabric we can choose between Dataflow Gen2 (a more improved new generation of dataflows that allows you to choose the preferred destination for each query result and also, to integrate with data pipelines) and of course Data pipeline (to copy or ingest and clean data).

 

 

Synapse

 

This should not be confused with Azure Synapse Analytics as it’s not the same. Truly it is built on top of the existing Synapse technology but with a lot of improvements to its architecture and functionality. It enables users to build, design and maintain systems and infrastructures that are enabling their organizations to collect, store, process and analyze large volumes of data.

 

For this purpose, Microsoft Fabric has a Lakehouse which can store big structured or unstructured data for cleaning, querying, reporting, and sharing in one location. Once the lakehouse is created it automatically creates Semantic model (Dataset) and SQL analytics end point.

 

 

In the Semantic model we can either choose to have all the tables from Lakehouse or only the ones that will serve us for our purposes.

 

In the SQL analytics endpoint, we can analyze/explore our data and even make additional calculations, create views and measures, and of course, model our tables relations. Don’t get worried because if you want to Spark you have that too! All you need to do is switch to Data Engineering, choose Spark Job Definition, and associate it with the preferred lakehouse:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Another useful item that needs attention is the Warehouse – an item that provides strategic insights from multiple sources into your entire business. The data is stored into parquet file format and published as Delta Lake Logs, it is also built for any skill level – from citizen developer through to the professional developer, DBA or data engineer.

 

Having an easily consumable, always connected semantic model that is always integrated with Power BI in DirectLake mode ensures a customer’s report always to has the most recent data for analysis and reporting.

 

Power BI

 

Nothing that you already don’t know – the report editor where you design the reports your customers see, with charts, tables, maps, and other visuals. You can either start creating the report in Power BI Desktop and then publish it to the Power BI service, or you can just click on the “New report” button in your already created SQL analytics endpoint or your Warehouse and let the design imagination begin!

 

 

One thing that must be underlined is that the coupling of Power BI and OneLake is more than just another data source – it comes with a new connection type called DirectLake which is for sure faster than DirectQuery.

 

Data Activator

 

Known as a no-code experience for automatically taking actions when patterns or conditions are detected in changing data, it’s a new tool for building a digital nervous system! You can easily automate actions and set query runs when a certain measure’s value in Power BI goes above or below a particular amount.

 

Purview

 

It helps Fabric users to manage, store, analyze and govern their Fabric data estate. It provides insights through reports about sensitive data, but also provides integrated coverage and helps address the recent increases in remote user connectivity.

 

Sending Multiple Attachments via Email Using Electronic Reporting

Sending multiple attachments that are linked with some entities in Dynamics 365 F&O, together with one main document has always been a hot topic for the clients.

 

This functionality is not available through standard SSRS reporting and a customization is needed so it can be performed. Many clients use external ISV solutions that also provide implementation for it. But there is also a standard possibility that the user can set up to use this functionality — using an electronic reporting framework.

 

We’ll provide detailed step-by-step guidance on how it can be achieved. For this purpose, we will be performing the setup on the sales invoice document.

 

1. Import Necessary Configurations from Global Repository

 

The first step is to import the necessary electronic reporting configurations from the global repository. If you have imported your configurations already and they are present in your local repository, skip this step.

 

Go to Electronic reporting workspace > Select Repositories from the Microsoft configuration provider > Open the Global repository. Here you will see a list of all predefined Microsoft reports and configurations. Find the one that you need, select the latest version, and import it.

 

In this scenario, we are importing the format Sales invoice (Excel).

 

 

Note that by importing the format, all necessary related configurations will be automatically imported as well, such as the model and the model mapping. So, you don’t need to worry about them.

 

2. Model Configuration Customization

 

The second step is to create a placeholder for the attachments in the model that is used by the format. Go to your local repository and find the model that is the parent of your format. In this scenario, that is the Invoice model.

 

Go to Create configuration > Derive from Name: Invoice model, Microsoft > Create configuration.

 

 

Select the newly created configuration > Go to Designer > Select the root node where you want to add the node for attachments.

 

In this scenario we want to send attachments linked to the invoice record, so we will choose InvoiceBase as a parent node. The node where you should add the attachments node in your scenario depends on the specified business goal you want to achieve.

 

Select InvoiceBase node > Go to New  > Set a name such as Attachments and item type equal to Record list. Inside of that node, create two more nodes: FileContent of type Container that will store the content of the attachments and FileName of type String that will be used for attachment names.

 

 

After you have completed this step, go back to the configuration repository > Select your derived model configuration > Change status to Complete.

 

3. Model Mapping Configuration Customization

 

In this step we will map the newly created attachments node with the data source where those attachments are being stored. Locate the standard model mapping configuration that is being used for the report, in this case that is Invoice model mapping.

 

Select the model mapping configuration > Create configuration > Derived from Name: Invoice model mapping, Microsoft > Select target model to be our newly created model (AXM Invoice model (Test)) > Create configuration.

 

 

Go to the Designer of the newly created derived model mapping. In the data sources pane, find the data source where your attachments are linked to. In this case, we go to the $SalesInvoiceTmp_First because this is our main data source. In the left pane we select Functions > Calculated field and then we select Add.

 

 

We create a new calculated field named $CustInvoiceJourAttachments with the following formula:

 

 

If you need additional filtering or attachments of another type, you can modify the formula accordingly. After the calculated field is mapped, we bind the nodes in the model that we have created with corresponding nodes in the calculated field.

 

 

After you have completed this step, go back to the configuration repository > Select your derived model mapping configuration > Change status to Complete.

 

4. Format Configuration Customization

 

On same principle, create a derived format configuration with corresponding parameters. In this case, we are using the Sales invoice (Excel) format configuration.

 

It is important to create the derived format based on our custom data model and the proper data model definition. Also set the latest data model version (in this case we only have one completed version of the model).

 

 

After the derived format has been successfully created, go to its Designer window. You can see only one root node. In this case, it’s named Sales invoice. Click Add root > Select Folder > Set the name parameter (e.g. Folder).

 

You will see that now the already existing Excel node was set as a child of the Folder node. Select the Folder node > Click Add > Select Common/File > Set name as Attachments. Select the new node > Click Add > Select Binary contents > Set name as Content. Bind the Attachments and Content nodes correspondingly with Attachments and FileContent nodes from the model. Select the Attachments node on the format and in the File name formula designer set the path to the FileName node of the model.

 

 NOTE: If you are not able to see the node type Common/File, in the action pane of the format designer change the type to All (in this case was predefined as Excel).

 

 

 

After you have completed this step, go back to the configuration repository > Select your derived format configuration > Change status to Complete.

 

5. Electronic Reporting Destination Setup

 

In order to send the invoice together with the related attachments on the invoice record, we need to do a proper setup in the Electronic Reporting Destination form. Go to Organization administration > Electronic reporting destination > Click New > In Reference select the customized format configuration, in this case AXM Sales Invoice (Excel).

 

In File destination, create two records for each component, Attachments and Sales invoice. Select both records and click on Group. Click on the Sales Invoice record and in Settings do a set up for the email template that will be generated. In the setup you can specify sender and recipient email address, subject and body.

 

 

With this setup, the whole procedure is completed, and you are ready to send multiple attachments via email to your desired destination.

Microsoft Launches Power Automate Process Mining and Next-generation AI

Microsoft recently announced that Power Automate Process Mining has become available as of August 1, 2023. Process intelligence is changing the way businesses optimize their processes, save costs, and discover opportunities to run more efficient business operations.

 

Power Automate Process Mining, infused with next-generation AI, now enables organizations to easily understand what is happening across their business, maximize process insights, use out-of-box recommendations to reduce the complexity of processes, transform operations, and drive continuous process improvement with automation and low-code apps.

 

Power Automate Process Mining

 

The process mining capability in Power Automate works with the existing Microsoft platform and ecosystem to provide end-to-end solutions and enable faster business decisions.

 

Out-of-box templates enable customers to seamlessly drive powerful business process insights from core line-of-business apps like SAP and also from cloud flows in Power Automate, Power Apps, Power Virtual Agents, Azure (DevOps, Logic Apps, Durable Functions, Bot Framework), and other systems of records.

 

Identify Inefficiencies and Gain Insights with Deep Analytics

 

You can get insights for process improvement by capturing rich visual process maps, analyzing end-to-end processes with AI-powered root cause analysis, and unlocking hierarchical views with interactive drill-downs.

 

Use recommended key performance indicators (KPIs) and filter options to uncover inefficiencies and opportunities for automation. Get value faster with out-of-box templates for finance including order-to-cash and peer-to-peer pay, supply chain, and other use cases.

 

 

Optimize Processes and Act with Low-code Automation

 

You can unlock process insights, get guided recommendations, and automate with Power Automate or leverage multiple actions and optimize your processes with Power Apps, Power Virtual Agents, and low-code.

 

Set up notifications in Microsoft Teams or Outlook when KPIs are not met.

 

Monitor Your Processes to Drive Continuous Improvement

 

With Power Automate you can stay on top of the implemented process optimizations through ongoing monitoring, identify process deviations, and define new goals and challenges.

 

Continuously analyze and improve to achieve the most efficient process and drive continuous process improvement.

 

 

With the general availability of Power Automate Process Mining, Microsoft further expands its low-code offering, providing customers with not only the most complete hyper-automation offering in the market, but also the most comprehensive low-code platform including Copilot in Microsoft Power Platform.

 

The following updates went into effect on August 1, 2023.

 

  • Customers are able to buy “Power Automate Premium” (the former “Power Automate Attended RPA per user”). This license will continue to include both unlimited cloud flows, known as digital process automation (DPA), and unlimited desktop flows, known as robotic process automation (RPA) in attended mode as well as entitlements to Power Automate Process Mining.

 

  • Microsoft introduced a new “Power Automate Process” license that gives customers access to an automation ‘bot’ which can be used for unattended desktop automation (RPA), or to run an organization-wide cloud-flow-based process that needs to be accessed by unlimited users in an organization.

 

  • Organizations can get started with Power Automate Process Mining by subscribing to the new Power Automate Premium license.

 

  • The “Power Apps per user” license is renamed to “Power Apps P”

 

To find more details, visit the source page.

2023 Release Wave 2 Plans for Microsoft Dynamics 365 and Power Platform

On July 18, 2023, Microsoft published the 2023 release wave 2 plans for Microsoft Dynamics 365 and Microsoft Power Platform, a compilation of new capabilities planned to be released between October 2023 and March 2024.

 

The second release wave of the year offers hundreds of new features, including AI capabilities and enhancements, demonstrating Microsoft’s continued investment to power digital transformation for their customers and partners.

 

The new capabilities empower new ways to make informed decisions with AI-guided insights and suggested actions, easier ways to automate tasks and processes, and collaboration seamlessly integrated into the flow of work, plus, new low-code ways for anyone to build solutions.

2023 Release Wave 2 Features Available for Early Access Period

 

Starting July 31, 2023, company users and partners will be able to validate the latest features in a non-production environment. These features include user experience enhancements that will be automatically enabled for users in production environments during October 2023.

 

In the contents of this blog post, we have succinctly outlined a selection of the features from the second release wave.

 

Wave Highlights for Microsoft Dynamics 365

 

Microsoft Dynamics 365 Marketing

 

Microsoft Dynamics 365 Marketing will bring enhancements to Copilot features and will bring unprecedented levels of personalization to email content, images, and layouts.

 

Additionally, business-to-business (B2B) dashboards and directly assigning leads to the right sales rep will align marketers and sellers, enabling them to act as a unified team across the buying journey.

 

Microsoft Dynamics 365 Field Service

 

Microsoft Dynamics 365 Field Service updates will include new capabilities for frontline workers, service managers, and dispatchers. Microsoft will deliver several top requests such as converting quotes to work orders, enhancing inspections, and evolving resource scheduling capabilities.

 

Microsoft Dynamics 365 Sales

 

Microsoft Dynamics 365 Sales will focus on enabling sales organizations to prioritize and manage digital sales processes through enhanced sequence capabilities.

 

Microsoft will allow users to assign and monitor lead assignment status with enhanced lead assignment capabilities by providing recommendations, summarizing data, retrieving information, and performing actions in context and within the flow of work.

 

Microsoft Dynamics 365 Customer Service

 

Microsoft Dynamics 365 Customer Service will continue to empower agents to work more efficiently through Copilot capabilities, Join Me On Teams, visual enhancements to the agent workspace, ability to see live chats and voice calls in Inbox and personalizing size of conversational control.

 

Additionally, Microsoft is making enhancements to the voice channel, call dialer improvements, and routing calls to agents with longest idle time.

 

Microsoft Dynamics 365 Finance

 

Microsoft Dynamics 365 Finance is focused on enhancing organizations’ visibility into their data, continued enhancements for accounts payable and bank statement automation, and expanding out-of-the-box country coverage in Latin America.

 

Additionally, the team will deliver further automation of complex tax scenarios and e-invoicing requirements for new countries and provide organizations ability for business model expansion and agility.

 

Microsoft Dynamics 365 Supply Chain Management

 

Microsoft Dynamics 365 Supply Chain Management continues to improve and optimize business processes to deliver the agility and resilience needed for businesses to thrive in an increasingly complex business environment. The sales and procurement processes will be further enhanced, manufacturers will enjoy greater flexibility, and warehouse processes related to counting, customer returns, and product receipts will be improved.

 

Microsoft Dynamics 365 Project Operations

 

Microsoft Dynamics 365 Project Operations is investing in enhancements to services procurement scenarios and project contracting and new functionalities and scenarios in pricing models will support the evolving patterns in the service-centric economy.

 

Additionally, improvements to intelligent resource recommendations will provide suggestions based on experience, cost, and utilization across employees and subcontractors.

 

Microsoft Dynamics 365 Human Resources

 

Microsoft Dynamics 365 Human Resources will be improving recruiting experiences that target recruiters, candidates, and hiring managers. Microsoft will expand the human capital management ecosystem to include learning management system integration through public APIs using Microsoft Dataverse along with expanding our payroll partner network.

 

Microsoft Dynamics 365 Commerce

 

Microsoft Dynamics 365 Commerce uses the power of AI to enable the effortless creation of engaging product content for digital commerce sites. New B2B investments allow distributors to view, accept, and reject orders from a centralized dashboard that enables B2B sellers, distributors, and buyers to all work in the same place.

 

Wave Highlights for Power Platform

 

Microsoft Power Apps

 

Microsoft Power Apps is expanding the use of Copilot to bring AI-assisted experiences to increase developer productivity, bring natural language to all users, and give insights to admins. Microsoft will bring modern controls and rich collaborative experiences to users, as well as improved deployment and governance support to ensure low-code can be enabled organization wide.

 

Microsoft Power Pages

 

Microsoft Power Pages continues to make strides in the Copilot maker experience to enable building a site. Managed environments will include Power Pages capabilities for maker usage and onboarding. For data, you will be able to connect easily to data where it exists today. Low-code makers can collaborate and detect co-presence.

 

Microsoft Power Automate

 

Microsoft Power Automate will continue to make it easier to get started building new flows by using natural language across cloud flows and desktop flows, and by improving process mining to jumpstart creation of automation and authoring experiences. Additionally, Microsoft is making it easier to manage work at scale by introducing unified activity view and deeper notifications on capabilities across the product.

 

Microsoft Power Virtual Agents

 

Microsoft Power Virtual Agents will bring general availability for capabilities including Multi-Lingual bot support, Generative Answers and Actions, Standalone interactive voice response (IVR) and IVR integration with Dynamics 365 Customer Service, and integration with the Conversational Language Understanding service. Additionally, Microsoft will offer their customers new Enterprise Trust capabilities.

 

Key Dates for the 2023 Release Wave 2

 

Here you can access additional information regarding the key dates for the 2023 release wave 2.

 

If your aim is to enhance and optimize your business processes, simplify application usage for long-term convenience, ensure data security in the cloud, and seek assistance in upgrading your Dynamics 365 systems to newer versions, we welcome the opportunity for potential collaboration. Reach out to us here.

Embracing the Future of Data Analytics with Microsoft Fabric

Yesterday, Microsoft unveiled its latest innovation in data analytics – Microsoft Fabric, an all-encompassing platform designed to revolutionize the way businesses handle their data.

 

As a leading Business Intelligence company, our team is eager to delve deeper into the functionalities and potential of Microsoft Fabric. We believe that this game-changing platform will bring a plethora of new opportunities for our clients and the industry as a whole.

 

Microsoft Fabric 01

 

Microsoft Fabric, with its OneLake and Lakehouse paradigm, aims to simplify data management by eliminating the need for multiple data copies or migration. This innovative approach presents a streamlined workflow that integrates seamlessly with a company’s existing data frameworks.

 

As experts in the field of Business Intelligence, we understand the immense impact this will have on helping our clients optimize their data-driven strategies.

 

Microsoft Fabric 02

 

We stand on the precipice of a new era in Business Intelligence and Data Engineering driven by Microsoft Fabric, and we are more than ready to embrace the challenges and opportunities that lie ahead.

 

Here at Axapta Masters, we remain committed to staying ahead of the curve and leveraging the latest advances in technology to deliver unparalleled solutions for our clients.

 

Microsoft Fabric is shaping up to be another powerful tool in our arsenal, and we are eager to explore its full potential to help our customers harness the true power of their data.

 

Microsoft Fabric

Understanding Caching And Cache Lookup Property Of Table

Client Cache

 

A client-side cache is used only by the client when a select is executed from the client tier. If the record doesn’t exist in the client cache, the client will search the record in the server cache. If the same record doesn’t exist in the sever cache, it is retrieved from the database.

 

Server Cache

 

A server-side cache can be used by any connection to the server and is used when a select is executed on the server tier. If the record doesn’t exist in the server-side cache, the record is retrieved from the database.

 

We can configure the number of records to be maintained in the cache by using this path:

 

System administration > Area page > Setup > System > Server configuration

 

Server Cache

Cache Lookup Property of Table

 

AOT > Data Dictionary > Tables > [TableName] > Properties > CacheLookup

 

Cache lookup property of table

 

Two types of Table Caching

 

 

    • At design time, by setting the table’s CacheLookup property to EntireTable.
    • In code, by using the RecordViewCache class.

 

 

    • At design time, by setting the table’s CacheLookup property to NotInTTS, Found or FoundAndEmpty.
    • In code, by using disableCache method called with a parameter of false.

 

EntireTable CacheLookup Property

 

All the records in the table are placed in the server cache after the first select. The SELECT statement WHERE clause must include equality tests on all fields of the primary index. An EntireTable cache is created for each table for a given company and is flushed whenever an insert, update, or delete is made to the table and every 24 hours by the AOS.

 

It’s not recommended to use EntireTable property for table that’s frequently updated.

 

RecordViewCache Class

 

The cache created by the RecordViewCache class stores records in a linked list. We can search the cache sequentially for records that match the search criteria.

 

If the SELECT statement contains an ORDER BY clause, a temporary index is placed on the cache and the runtime uses the index when searching records.

 

RecordViewCache class

NotInTTS CacheLookup Property

 

All successful selects are cached. When in a transaction (after ttsBegin), no caches made outside the transaction are used. When inside a transaction, the record is read once from database and subsequently from the cache.

 

The record is select-locked when read in a transaction, which ensures that the record cached is not updated while the transaction is active.

 

NotInTTS CacheLookup property

Found CacheLookup Property

 

All successful selects are cached. All caching key selects are returned from the cache if the record exists there. A select forUpdate in a transaction forces reading from the database and replaces the record in the cache.

 

Usually this type is used for static (lookup) tables, such as Unit, where the record usually exists.

 

FoundAndEmpty CacheLookup Property

 

All selects on caching keys are cached, including selects that are not returning data. All caching key selects are returned from caching if the record exists there, or the record is marked as nonexistent in the cache.

 

A select forUpdate in a transaction forces reading from the database and replaces the record in the cache.

 

disableCache Method

 

Code Example to demonstrate performance:

 

disableCache method

Best Practices

 

Set the appropriate table group property depending on how the table is used.

 

Below is a list which shows to use the different type of cache lookup property as per table group.

 

The Concept Behind Financial Dimensions and How to Make the Correct Setup

At the beginning of the new year, most companies perform year-end closing activities that close the fiscal year and bring out the profitability, losses, strengths, and weaknesses of the past year.

 

Usually, all of this can be seen through financial reports, but the depths of these reports can lead to inaccurate decisions due to the lack of information in the financial transactions.

 

 

Financial dimensions are standard feature in D365 that are based on strategic decisions and are used to get meaningful information from the transactions posted. This means that the transaction without the financial dimension will consist of the main account, amount, and date, but when the financial dimensions are added, then from the same transaction can be seen the business unit, division, and department.

 

This can provide the profitability of each location in the business. If the profit and cost center is added, then it can be easily concluded each expense or revenue from which stream comes from.

 

Another scenario is to add the fixed asset number, bank, customer, or vendor, that connects to the master data, and it is connected automatically (the main account from accounts receivable can now provide the information on which customer has ordered the most).

 

All these examples are standard in D365. However, based on the needs of the business, custom dimensions can be added and used in the same principle as the standard ones.

 

The Setup of the financial dimensions consists of several steps.

 

1. Create a Financial Dimension

 

Go to General ledger > Chart of accounts > Dimensions > Financial dimensions

 

 

Updates to a dimension will not take effect until dimension activation is run. The activation of dimensions is only allowed when the system is in maintenance mode. Maintenance mode can be enabled in this environment by running a maintenance job from LCS, or using Deployment Setup tool locally.

 

Ones the dimension has been created, the values of the dimension can be added through 

 

2. Financial Dimensions in the Account Structures

 

Go to General Ledger → Chart of accounts → Structures → Configure account structures

 

 

 

One legal entity can have several account structures and the segments in the accounts are the financial dimension. The account structures create rules for which financial dimensions can be used in which accounts. The account structures can be quite simple or very complex depending on the business’s strategic decisions.

 

Once the account structure has been activated, the financial dimensions can be seen on the master data such as main accounts, customers, vendors, items, and other. For example, look at the customer bellow:

 

 

One important step is to include the account structure in the ledger of the company. With this step, the setup of the account structure is complete.

 

 

3. Financial Dimension Configuration

 

Go to General ledger > Chart of accounts > Dimensions > Financial dimensions for integrating applications

 

 

This is often neglected, but it is a very important step in D365, especially if using the Excel add in which is an excellent tool.  The usual formats are:

 

  • Default dimensions format: used for importing default dimensions using Data management and Excel for master data and transactional data

 

  • Ledger dimensions format: used for importing ledger dimensions using data management and Excel for general ledger journals.

 

  • Budget register dimension format: used to determine the required dimensions when importing budget register entries using Excel or Data management.

 

  • Budget planning dimension format: used to determine the required dimensions when importing budget planning entries using Excel or Data management.

 

The order of the financial dimension in all of these entities is crucial and it should be the same as the order of the financial dimensions in the account structure.

 

4. Financial Dimension Sets

 

Go to General ledger > Chart of accounts > Dimensions > Financial dimension sets

 

 

The sets are a powerful tool and can be used to generate the trial balance and to get the reports needed for statistical purposes.

 

 

5. Dimension Templates

 

Go to General ledger > Chart of accounts > Dimensions > Financial dimension default templates

 

 

Templates can be created and then applied as needed to aid in the distribution of the posting to multiple combinations of dimensions.

 

6. How Financial Transactions are Filled with Financial Dimensions

 

There is a pyramid of how the financial dimensions are going to the last part of their journey and to the financial reports.

 

 

The master data is connected to different financial dimensions that are transferred to the transactional data. While the transactional data is being processed, different vouchers are posted from it.

 

The default financial dimensions from this customer will be copied on each sales order created for it. The vouchers posted from the sales order will contain the same financial dimensions as the sales order.

 

For example, the default financial dimensions from the customer and item will be copied on each sales order created with them. The vouchers posted from the sales order will contain the same financial dimensions as the sales order.  At the year-end closing, these vouchers are then used in reports.

Extensibility of a Class State: Adding New Variables in a Macro Using SysPackExtensions Framework

The exchange of knowledge, skills and experiences of employees is one of our main priorities. In this blog post, we share another fix to a challenge of one of our colleagues encountered in his everyday tasks.

 

Very often we have a business requirement that when a user opens a dialog for the first time and enters values for parameters in it, he would like those values to be saves, such that the next time he opens the dialog he won’t need to input them again. This pattern is widely used in all versions of Dynamics and is based on SysLastValue table.

 

In RunBase classes, it is done through pack() and unpack() methods. The RunBase internal class state that needs to be preserved between runs is typically done through a local macro, together with a corresponding “version” of the stored data.

 

In short terms, we save the packed state of the class with the corresponding version into the SysLastValue table record for this class and when we need to retrieve/unpack these values, we retrieve the version as we know it’s the first position in the container.

 

If the version is still the same as the current version, read the packed container into the variables specified in the local macro. If the version is different from the current version, return false, which will subsequently run initParmDefault() method to load the default values for the class state variables.

 

Problem Description

 

It is not possible to extend macros, either global or locally defined. Macros are replaced with the corresponding text at compile time which would mean that all the existing code using the macros would need to be recompiled if you extended it, which is not an option.

 

Possible solution would be to use post-method handlers for pack/unpack methods and add additional state variables there, to the end of the container. This solution becomes very unreliable if there are more than two ISV solutions deployed on the environment.

 

Let’s consider an example where two ISV’s are deployed on an environment and post-method handler is implemented for handling state extension of a RunBase class.

 

Packing the Class State

 

  1. The pack() method is run and returns a container with similar values as following:

[1, 11/2/2022, “VENDOR001”, 0].

  1. Post-method handler is called from the first ISV extension and returns the original container with additional specific state for the first ISV. Let’s assume that this is string field in the dialog with value “ISV1 Value”. The container will look like this:

[1, 11/2/2022, “VENDOR001”, 0, “ISV1 Value”].

  1. Next, post-method handler is called from the second ISV extension and the same logic will be applied here as well, so now the container will look like this:
  2. [1, 11/2/2022, “VENDOR001”, 0, “ISV1 Value”, “ISV2 Value”].

 

Unpacking the Class State

 

  • The best-case scenario would be to follow the same steps for unpacking execution. First, the unpack() method is executed and base class variables will get their values from the packed state.

 

  • The unpack post-method handler is called for ISV1 extension and it needs to retrieve only the part of the container that is relevant to the ISV1 solution, that is “ISV1 Value”.

 

  • Similar to the previous step, the post-method handler for ISV2 should unpack the “ISV2 Value” and assign it to the corresponding variable.

 

The unpacking scenario is highly risking and cannot be executed in reliable way, since the system cannot guarantee that post-method handlers will be executed in the same order for unpack as they were for pack.

 

Solution

 

In order to solve the problem described above, Microsoft has came up with a deterministic framework where each specific extended packed state can be uniquely identified by name, which allows ISV’s to call set & get for the state by it’s name.

 

 To achieve this, you need to use the SysPackExtensions class. Most important methods of the framework are:

 

  • packExtension() – adds the extended variable(s) to the end of the packed state container, prefixing it with the name of the extension.

 

  • unpackExtension()– looks through the packed state container and finds the sub-part for this particular extension based on extension name.

 

  • isCandidateExtension()– evaluates if the passed container is an extension packed state. For that it needs to consist of the name of the extension and packed state in a container.

 

To avoid collisions with other eventual extensions, prefix members and methods with some custom text. In the example, the prefix “axm” is used. This practice is important, because it helps prevent name clashes with other extensions and future versions of the augmented class.

 

In the following example, a toggle button control is added to the dialog box, the value of the control is get, in the run method action is performed on the value, and the value is serialized via the pack and unpack methods. The following example shows how to implement this scenario.

 

[ExtensionOf(classStr(SysUserLogCleanup))]
final class AXMMySysUserLogCleanup_Extension
{
// static members
static private SysUserLogCleanup axmRunningInstance;

// Extending class state...
private boolean axmArchive;
private DialogField axmDialogArchive;
#define.CurrentVersion(1)
#localmacro.CurrentList
axmArchive
#endmacro

public Object dialog()
{
Dialog dialog = next dialog();

axmDialogArchive = dialog.addField(extendedtypestr(NoYesId), "Archive");
axmDialogArchive.value(axmArchive);

return dialog;
}

public boolean getFromDialog()
{
boolean result = next getFromDialog();
axmArchive = axmDialogArchive.value();
return result;
}

public void initParmDefault()
{
next initParmDefault();
axmArchive = true;
}

public void run()
{
try
{
axmRunningInstance = this;
next run();
}
finally
{
axmRunningInstance = null;
}
}

public container pack()
{
container packedClass = next pack();
return SysPackExtensions::appendExtension(packedClass, classStr(AXMMySysUserLogCleanup_Extension), this.axmPack());
}

private boolean axmUnpack(container packedClass)
{
Integer version = RunBase::getVersion(packedClass);
switch (version)
{
case #CurrentVersion:
[version, #currentList] = packedClass;
break;
default:
return false;
}
return true;
}

private container axmPack()
{
return [#CurrentVersion, #CurrentList];
}

public boolean unpack(container _packedClass)
{
boolean result = next unpack(_packedClass);

if (result)
{
container axmState = SysPackExtensions::findExtension(_packedClass, classStr(AXMSysUserLogCleanup_Extension));
//Also unpack the extension
if (!this.axmUnpack(axmState))
{
result = false;
}
}

return result;
}

private void axmArchiveUserLog(SysUserLog _userLog)
{
if (axmArchive)
{
//...
}
}

// Wire up event handler for deletion of the record
[DataEventHandler(tableStr(SysUserLog), DataEventType::Deleting)]
static public void SysUserLog_onDeleting(Common _sender, DataEventArgs _e)
{
if (axmRunningInstance)
{
axmRunningInstance.axmArchiveUserLog(_sender as SysUserLog);
}
}
}

Microsoft Dynamics 365 Finance and Supply Chain ERP Is Named a Leader in Nucleus Research 2022 Enterprise ERP Study

This year Nucleus expanded its evaluation to specifically look at ERP vendors with a proven track record of servicing organizations with over $500M in annual revenue on the functionality and usability of their solutions, as described by their customers.

 

“With system integrators and consultants around the globe stretched thin, customers must have confidence that their vendor can provide or recommend capable partners to implement the ERP, perform upgrades, and troubleshoot after go-live,” said Research Manager Isaac Gould.

 

“Customers continue to seek ERP systems with a strong track record of uptime, broad range of localizations, security certifications, global cloud presence, and the availability of support and professional services.”

 

Microsoft Dynamics 365 Finance and Supply Chain Management is a leader in this year’s Enterprise ERP Technology Value Matrix.

 

It is recognized for its finance and supply chain solutions targeted toward large-scale enterprises, while it’s a longstanding leader in comprehensive enterprise application solutions, offering integration-platform-as-a-service in addition to the Azure cloud service.

 

The two solutions recognized in the Nucleus report include Dynamics 365 Finance and Dynamics 365 Supply Chain Management.

 

D365 Finance offers financial management software capabilities with embedded analytics and financial intelligence, while D365 Supply Chain Management provides a unified view of manufacturing, warehouse, service, inventory and logistics with embedded predictive analytics for insight generation.

 

The targeted user base for the products is large-scale corporations looking to optimize talent, sales, marketing, customer service, field service, retail, and project service automation.

 

Core functionalities include:

 

  • Business logistics;
  • Supply chain management functions;
  • Manufacturing processes performance indicators;
  • Regulatory compliance engine.

 

These features are notably offered on a singular integrated platform. Microsoft’s global reach extends to 65 countries, combined with these targeted features and cloud/on-premise deployment flexibility, leading enterprise customers to choose Microsoft Dynamics 365 Finance and Supply Chain Management for their ERP needs.

 

For more info, or to download the full 2022 Enterprise ERP Technology Value Matrix, click here

 

  • Nucleus Research is the recognized global leader in ROI technology research. They provide research streams and advisory services that allow vendors and end users to quantify and maximize the return from their technology investments.

 

* Part of the content in this blog post is from the original Nucleus Research which can be found here

 

_____________________________________________________________________________________________________________________

 

If you are interested in optimizing and improving your business processes, making the experience while using the application a whole lot easier in the long run, having the data secured in the cloud at the same time, and in need of someone to upgrade your systems to new versions of Dynamics 365, we are open for future collaboration. Contact us here.

 

And if you are interested in potential career opportunities, check out our careers page.

update_recordset from a Query in D365

There is a update_recordset method built on the global Query object which can be used for quick updates in a single database trip of all the records that the query would retrieve without traversing through them.

 

We can use it on the pre-built query or we can build it in our code. The only other thing that should be created is a map of strings that will map the field id that we need to update with the value to set.

 

 

____________________________________________________________________________

 

We hope that this blog post is helpful! If you are interested to join our team, check out our careers page, we have open positions for Microsoft Dynamics enthusiasts in every field.

2022 Release Wave 2 Plans for Power Platform and Dynamics 365 Are Here

On July 12, Microsoft published the newest release wave 2 plans, describing the new features releasing from October 2022 through March 2023 for Microsoft Power Platform and Microsoft Dynamics 365.

 

The second release wave of the year has a lot of new features and enhancements, demonstrating the continued investment in digital transformation for Microsoft’s customers and partners.

 

2022 Release Wave 2 Features Available for Early Access

 

Starting August 1, 2022, partners and company users will be able to validate the latest features in a non-production environment. The features are going to cover a broad range of functional areas and include user experience enhancements that will be automatically enabled for users in production environments during October 2022. Have in mind that Microsoft is continuously updating the release notes by changing, adding, and even removing functionality from the plan.

 

In this blog post, we have summarized some of the features, and for more info, you can check out the release plan online on download it in pdf from here.

 

Power Platform Wave Highlights

 

Power BI

 

Microsoft Power BI is continua

lly investing in enabling all teams, and organizations to encourage data-driven culture. With this update, the creation experience is improved by matching the experiences with Office and enabling users to create records on the web.

 

By integrating the Power Query diagram view into PowerBI Desktop, users can leverage a no-code experience to perform ETL on their data.

 

For teams, in this update, Microsoft brings improvements to metrics focused on business needs and integration with Viva Goals. It also enhances the big data experience with auto-aggregation, query scale-out, and privacy features with DLP, giving administrators better visibility into their activities.

 

Power Apps

 

Power Apps extends governance capabilities to enable, manage, and support the citizen developers throughout the organization. Makers and developers of all skill levels will be more productive over Microsoft Dataverse in a unified studio, with modern experiences to build and manage data and logic, as well as infused intelligence to support development, enrich data, and optimize user experiences.

 

In addition to ensuring the ability to take advantage of the reliability and a rich data experience, both creators and users will benefit from out-of-the-box collaboration capabilities that can increase the productivity of users while collaborating.

 

Power Pages and Power Automate

 

Power Pages continues to invest in bringing more out-of-the-box capabilities to support both low-code/no-code development and professional developers. While Power Automate is more accessible than ever with new experiences to help users of every skill level build out their cloud and desktop flows.

 

With the increased usage of robotic process automation (RPA), Microsoft is adding features to make it easier to manage machines in Azure and the credentials of the users and accounts.

 

Power Virtual Agents and Microsoft Dataverse

 

Power Virtual Agents brings improvements in the authoring experience with commenting, Power Pages integration, data loss prevention options, proactive bot update messaging in Microsoft Teams, and more.

 

On the other side, Microsoft Dataverse is continuing its investment in Azure Synapse Link, enabling customers to unlock deeper insights from Dataverse data using the power of Azure Synapse.

 

For more info about the rest of the release wave plans, you can check out the Power Platform website.

 

Microsoft Dynamics 365 Wave Highlights

 

Dynamics 365 Marketing and Dynamics 365 Sales

 

Dynamics 365 Marketing brings real-time customer journey interpretation enabling B2B brands to hyper-personalize the experience across the entire buying journey and confidently grow their marketing and customer experience programs to target up to 300M messages or interactions per month and serve up to 100 million customers.

 

Dynamics 365 Sales continues to use data and AI to optimize the seller experience, allowing sellers to prioritize their work, and combine business and productivity tools to meet current sellers and all sellers. Facilitates an instant collaboration experience that allows you to interact with your colleagues and serve your customers. Efficiently regaining time and increasing productivity.

 

Dynamics 365 Customer Service

 

Dynamics 365 Customer Service is focused on delivering the capabilities that help run contact centers optimally by providing enhancements in unified routing with features such as percentage-based routing, preferred agent routing, and longest idle routing. Customer support swarming in Microsoft Teams will help agents resolve complex cases through collaboration.

 

Dynamics 365 Finance

 

Dynamics 365 Finance is launching the general availability of vendor invoice optical character recognition (OCR) which automates the reading and recognition of vendor invoices and continues adding additional capabilities for subscription billing use cases.

 

Microsoft will integrate tax calculation service with Dynamics 365 Project Operations and extend electronic invoicing service to support new upcoming e-invoice legislations for France, Poland, and Saudi Arabia.

 

Dynamics 365 Supply Chain Management

 

Dynamics 365 Supply Chain Management continues to invest in features that promote agility and resilience throughout the supply chain. New analytics and support for multiple vendors in planning optimization help organizations optimize their sourcing strategies.

 

Inventory visibility allows companies to track real-time consumption within allocated quantities in support of promotions, special events, and new product launches.

 

Guided warehouse implementation and configuration experiences enable rapid reconfiguration of supply chains and manufacturers in the process industry can use Planning Optimization for shortening their planning cycles.

 

For more info about the rest of the release wave plans, you can check out the Dynamics 365 website.

 

Key Dates for the 2022 Release Wave 2

 

Here you can find more info about the key dates for the 2022 release wave 2.

 

If you are interested in optimizing and improving your business processes, making the experience while using the application a whole lot easier in the long run, having the data secured in the cloud at the same time, and in need for someone to upgrade your systems to new versions of Dynamics 365, we are open for future collaboration. Contact us here.

 

____________________________________________________________________________

 

And if you are interested in potential career opportunities, check out our careers page.

Running X++ Scripts and Jobs in an Environment with 0 Downtime

This post is about exploring the new Microsoft feature that allows you to run X++ jobs on PROD and non-PROD environments without release and with 0 downtime.

 

In 10.0.25 you can run simple X++ scripts on a production environment without any downtime. This feature lets you run custom X++ scripts without having to go through Dynamics LCS or suspend your system. Therefore, you can correct minor data inconsistencies without causing any disruptive downtime.

 

 

To be able to use this feature you need to create a deployable package with only one runnable class in it.

 

To do this, you can create a new model and reference the models which object you will use in the X++ script. Then create the runnable class and generate a deployable package from Visual Studio only with your new model that has only one runnable X++ class.

 

 

After generating the deployable package you can go to System Administration – Periodic tasks – Database – Custom scripts. Here you can upload your deployable package.

 

 

If your deployable package has not consisted of only one runnable job you won’t be able to upload it and a warning message will be displayed. After successfully uploading the deployable package, another user (different from the one who uploaded it) must Approve the script in the process workflow.

 

After the approval, you should follow the workflow and Run a test.

 

 

If the test log is okay and is without any errors, you need to Accept the test log and then you will be able to Run the script.

 

 

After the execution of the script is completed, the log will be updated and you need to end the workflow by confirming that the purpose is resolved, the purpose is unresolved, or abandon.

 

 

This is a helpful feature by Microsoft if you need to do some small data corrections or delete dates from certain tables. This way you don’t have to raise a Microsoft ticket to do small data corrections on PROD DB or connect to the ACC or other T2 environments databases.


Also, runnable classes with dialogs can be imported here not just simple data correction scripts.

 

But please be careful with running scripts like this!

 

______________________________________________________________________________________________________________

 

We hope that this blog post is helpful! If you are interested to join our team, check out our careers page, we have open positions for Microsoft Dynamics enthusiasts in every field. 

Export Multiple CSV Files in One Go

One of our colleagues recently had a requirement for having a dialog form with multiple toggle buttons to export several different files.

 

So, the standard procedure for exporting to CSV in D365 is:

 

  • to create a ‘CommaStreamIo’ object,
  • fill it with data
  • and then send a file to the user (File::SendFileToUser(stream, filename)) which file then gets downloaded from the browser.

 

However, the issue with this approach appears when we try to export multiple files with the same function, i.e. ‘File::SendFileToUser(stream, filename)’. In such a case, only the last file gets downloaded.

 

The solution to this is to use temporary storage, get the link from it and open it in a new tab.

 

 

We hope that this blog post is helpful, especially if you have found yourself in some simmliar situation.

 

______________________________________________________________________________________________________________________________

 

If you are interested to join our team, check out our careers page, we have open positions for Microsoft Dynamics enthusiasts in every field.

Performance Improvements

Measuring the output of a business process or procedure, then adjusting the process or procedure to enhance the output, increase efficiency, or raise the effectiveness of the process or procedure is known as performance improvement.

 

In this post we are sharing with you, what is performance optimization, the importance of system performance for any company, and of course how are we helping the companies to resolve this kind of issues. Besides that, we are sharing two short use cases from our clients in the manufacturing and food & beverages industry, where our experienced team members helped them resolve their issues. 

 

What is Performance Optimization?

 

Performance optimization, in the nutshell, is a process of modification of system components to make them work more efficiently and execute more rapidly. Dynamics is an enterprise application and great performance is an integral part of its design with default adjustments.

 

However, there could be objective factors that can affect the operation parameters, such as improper system settings, custom developments not following Microsoft best practices, and underestimated volumes of data.

 

Importance of System Performance

 

System performance is a key element of any Dynamics implementation that ensures a positive customer experience regardless of whether the customer interacts with the system directly or indirectly.

 

Any bottleneck in the system components might impact the business’s ability to achieve its goals. Especially if performance issues appear in areas that support key business processes, which can result in revenue loss, opportunity loss, bad customer satisfaction, employee productivity, or brand reputation.

 

How Is Axapta Masters Doing It?

 

Our approach to resolving such issueс is proven many times and mainly relies on the experience and expertise of our team members, along with the application of proper management methodologies, with a strong intention to keep the cost as low as possible by doing minimal changes in the system. These is the high-level process we execute:

 

  • Identify the process that performs slowly against business targets;
  • Collect available metrics, logs, and trace files;
  • Analyze collected information;
  • Reproduce the issues in a non-production environment;
  • Implement corrective steps;
  • Perform User Acceptance Test – new metrics vs. targets;
  • Deploy to production;
  • Monitor and cross-check telemetry data.

 

 

We have prepared for you two short use cases from two different clients we work with, about:

 

  • Use Case 1: Warehouse Load Preparation Process
  • Use Case 2: On-time Management Reporting

 

Use Case 1: Warehouse Load Preparation Process

 

A customer in the manufacturing industry approached us with an issue that an important, highly customized, business process in distribution warehouses was executing approx. 10 hours on daily basis, which resulted in major delays in load preparations.

 

Axapta Masters acquired a team of Senior AX Developers and Database Administrators to perform initial analysis and work on this issue. Conclusions were:

 

  • The database was configured and tuned properly and there was noт any bottleneck on the SQL level.

 

  • The custom code developed by their previous partner was the root cause of the issue. The code was not written according to MS best practices and common development standards which was not utilizing any parallelism and was optimized for a small volume of data.

 

The Axapta Masters team redeveloped part of the logic and managed to optimize the process to finish in about one hour.

 

Use Case 2: On-time Management Reporting

 

In informal conversation a customer in the food & beverages industry shared an issue that the business is getting important daily reports with 4-5 hours delay, increasing on daily basis. At the very beginning, the solution was working fine, but as data continued to grow, performance degradation was linear, and it was a question of time when no reports will be generated at all.

 

  • The BI solution was a black box – most of the components were encrypted without the ability for further tuning or modifications.

 

  • The customer has plans to replace this solution in about 3 years and didn’t want to invest a lot in major changes.

 

  • Two other partners analyzed the solution and confirmed it reached the limits of the architecture and no further improvements can be done.

 

  • But still, the business needed their reports on time.

 

Our Axapta Masters BI experts were confident that the existing solution can be improved, and proposed a different approach:

 

  • Utilize the majority of existing solution in order to keep the cost as low as possible, with some modifications only.

 

  • Implement an agile approach with short sprints, with Go/No Go gates in between, to be able to cancel the project if no quick wins were achieved at the very beginning.

 

In the end, the project was completed successfully on time and on budget, and now the business has its reports fully refreshed by 9 am in the morning.

 

___________________________________________________________________________________________________________________________________________

 

If you have more questions or you are considering doing performance improvements to your current system, contact us and schedule a meeting with our experts for a consultation!

 

And if you are interested in potential career opportunity, check out our careers page.

Send a File to the SFTP Server

Knowledge sharing is one of the basis and an everyday practice between our team members. So, we decided to share another fix to a challenge one of our colleagues encountered in his everyday tasks as a requirement for the client. Hopefully, this blog post will help you as well. 

 

Recently we got a client requirement to replace FTP upload for specific files with SFTP. After our team member has done some research, he found this post which was followed mostly. However, he wants to add a few things that he had to figure out during development.

 

First, you’ll need to create a DLL which you will use to connect and upload the file to SFTP. Prior to that, you need to install two DLLs for referencing through the NuGet packages for the solution:

 

 

If you don’t have the NuGet packages initially you can download them from:

 

 

Go to settings of NuGet manager and add the new folder with the two new packages:

 

 

It is very important first to install SSH.NET and then Renci.SshNet.Async. After installation without errors you should see them in the list of installed packages:

 

 

After you are done with the prerequisites you can create a new project of type C# class library in the same solution as the D365 project:

 

 

Add the following code for the C# class:

 

using System;
using System.IO;
using System.Net;
using System.Collections.Generic;
using Renci.SshNet;
using System.Text;

namespace SFTPFileTransfer
{
    public class SFTPConnect
    {
        public static string uploadSFTPFile(string host,
        string username,
        string password,
        System.IO.Stream sourceFile,
        string destinationPath,
        int port,
        string fileName,
        string privateKeyFilePath = "")
        {
            string successStr = "Fail";
            List<AuthenticationMethod> methods;

            /*It depends if the private key file is present for authentication. If the SFTP is key secured then the private key file has to be passed.*/
            if (privateKeyFilePath != "")
            {
                            var privateKeyFile = new PrivateKeyFile(privateKeyFilePath);
                            methods = new List<AuthenticationMethod>
                {
                    new PasswordAuthenticationMethod(username, password),
                    new PrivateKeyAuthenticationMethod(username, privateKeyFile)
                };
            }
            else
            {
                methods = new List<AuthenticationMethod>
                {
                    new PasswordAuthenticationMethod(username, password)
                };
            }
            try
            {
                var connectionInfo = new ConnectionInfo(host, port, username, methods.ToArray());
                using (SftpClient sftpclient = new SftpClient(connectionInfo))
                {
                    sftpclient.Connect();
                    sftpclient.ChangeDirectory(destinationPath.Trim());
                    sourceFile.Position = 0;
                    sftpclient.BufferSize = 8 * 1024;
                    sftpclient.UploadFile(sourceFile, fileName);
                }
                successStr = "Pass";
            }
            catch (WebException e)
            {
                successStr = "Fail";
            }
            return successStr;
        }

    }

}  

 

Rebuild the solution and you will now have the DLL file in the project directory\bin\Debug folder. Copy it to AosService\PackagesLocalDirectory\<your model>\bin folder.

 

Now to the X++ code, you should have parameters for all the needed fields:

 

Username: username of SFTP

 

Password: password for SFTP (container field to be filled using edit method or any encryption method), for simplification in this demo I’ll use plain text

 

HostName: this can be an ip address or <domain>.orgs.in

 

Port no: 22 by default for SFTP

 

Destination folder: /upload by default while an SFTP is created. This can vary but the input should start with “/” which depicts the folder in SFTP where the file will be dropped

 

//Upload to SFTP
        System.IO.StreamReader  reader;
        System.IO.Stream        requestStream;
        System.Byte[]           bytes;
        System.Text.Encoding    utf8;
        System.IO.Stream        stream = io.getStream();
        stream.Position = 0;

        UserId sftpUserName = companyInfo.SFTPUserName;
        str sftpHostURL = companyInfo.EDISFTPHost;
        int sftpPortNum = companyInfo.EDISFTPPortNum? companyInfo. SFTPPortNum: 22; //22 is default port for SFTP
        FilePath sftpDestinationFilePath = companyInfo.FileDestinationPath;

        if(sftpDestinationFilePath != "")
        {
            reader = new  System.IO.StreamReader(stream);
            utf8 = System.Text.Encoding::get_UTF8();
            bytes = utf8.GetBytes( reader.ReadToEnd() );
        
            reader.Close();
            try
            {
                
                Password sftpPassword = companyInfo.SFTPPW;
                str success = SFTPFileTransfer.SFTPConnect::uploadSFTPFile(sftpHostURL, sftpUserName, sftpPassword, stream, sftpDestinationFilePath, sftpPortNum, fileName);
                if(success == 'Pass')
                {
                    Info(strFmt("%1 File successfuly sent to SFTP ", fileName));
                }
                else
                {
                    Error("Error in sending file to SFTP due to incorrect Host/Port/User Credential");
                }
            }
            catch
            {
                Info(infolog.text());
            }
        }
        else
        {
            reader = new  System.IO.StreamReader(stream);
            
            File::SendStringAsFileToUser(reader.ReadToEnd(),fileName);
        }
        CodeAccessPermission::revertAssert();

 

That is all the development, you can test the solution if you have an SFTP host to send files to.

 

Let us know if you have any questions, and don’t forget if you are interested in a potential career opportunity in our company, check out the careers page for our open vacancies.

Block Invoicing Price Updates on Intercompany Sales Orders

It could happen that inventory adjustment journals are created after an intercompany sales order is created with picking list generated and packing slip posted for the same item in the order and different price.

 

This by it self doesn’t create a problem until the IC order has to be invoiced which updates the order lines with the latest price adjustments.

 

As the intercompany rules require to keep the same price from creating the orders to invoicing in order to prevent the update (actually re-update) we need to extend class ‘IntercompanySalesAtCostPriceFormLetterHandler’ and method ‘onSalesLineSelected’.

 

Before CoC we need to keep the previous value and then after it we will update the sales line with the original value.

 

[ExtensionOf(classStr(IntercompanySalesAtCostPriceFormLetterHandler))]
final class IntercompanySalesAtCostPriceFormLetterHandler_Extension
{
public void onSalesLineSelected(SalesLine _salesLine)
{    
SalesPrice          origSalesPrice = _salesLine.SalesPrice;
SalesLineAmount     origLineAmount = _salesLine.LineAmount;

    next onSalesLineSelected(_salesLine);

    //revert the price to the original price
    if (origSalesPrice)
    {
        ttsbegin;
        SalesLine salesLineLocal = SalesLine::findRecId(_salesLine.RecId, true);
        salesLineLocal.SalesPrice = origSalesPrice;
        salesLineLocal.LineAmount = origLineAmount;
        salesLineLocal.update();
        ttscommit;
    }
}

public void onSalesLinesSelectionStarted()
{
    next onSalesLinesSelectionStarted();
}

public void onSalesLinesSelectionFinished()
{
    next onSalesLinesSelectionFinished();
}
}

 

Just have in mind that you need to extend methods ‘onSalesLinesSelectionStarted’ and ‘onSalesLinesSelectionFinished’ as well as they must reside in the same transaction as ‘onSalesLineSelected’.

First Only for Data Entity Data Sources

You might have had a requirement to provide only the last record by CreatedDateTime field from a custom data entity, but you couldn’t accomplish it with what would be obvious solutions to the problem:

 

  • Using query as data source on the data entity;
  • Not possible to use query data source on data entity;
  • Using view built out of query as data entity data source:
  • For some reason the view omits the First Only setting set on the query data source and it returns all the records from the query.

 

So the solution would be to use view as data entity data source and create a computed column with ranking based on the CreatedDateTime field from the data source from which we want to select the first only record.

 

 

 

Add the following method for the computed column in the code of the View:

 

public class WorkflowTrackingView extends common

{ public static server str compColRankByCreatedDateTime()

{

str ret;

DictView dv =new DictView(tableNum(WorkflowTrackingView)); ret = 'RANK () OVER (ORDER BY '+dv.computedColumnString('WorkflowTrackingTable', 'CreatedDateTime')+' DESC)';

return ret;

}

}

 

The next step would be to use this new field on the data entity as a range with value of 1 as according to the computed column our latest record would be of rank 1.

 

 

 

And with that, you have a first only function on a data entity.

 

Electronic Reporting in D365: Replacing Existing Field with a Financial Dimension in an Outgoing Report Structured as Zip of Text Files

ER is a tool that you can use to configure formats for both incoming and outgoing electronic documents in accordance with the legal requirements of various countries/regions. ER lets you manage these formats during their lifecycle.

 

For example, you can adopt new regulatory requirements, and generate business documents in the required format to electronically exchange information with government bodies, banks, and other parties.

 

In this blog, general overview of ER components will be covered, together with a tutorial presenting a way how to add financial dimension to an existing electronic report.

 

Electronic Reporting Components

 

Electronic reporting (ER) supports the following types of components:

 

  • Data model
  • Model mapping
  • Format
  • Metadata

Data Model Component


A data model component is an abstract representation of a data structure. It describes a specific business domain area in enough detail to satisfy the reporting requirements for that domain. A data model component consists of the following parts:

 

  • Data Model: A set of domain-specific business entities and a hierarchically structured definition of relations between those entities.

 

  • Model Mapping: Linking between individual elements of the data model and selected application data sources, specifying the data flow of the model itself.

 

The business entity of a data model is represented as a container, or record. Business entity properties are represented as data items, or fields. Each data item has a unique name, label, description, and value.

 

The value of each data item can be designed so that it’s recognized as a string, integer, real, date, enumeration (enum), or Boolean value. Additionally, the data item can be another record or record list.

 

Model Mapping Component

 

Model mapping links application data sources to individual elements of a data model that specify, at runtime, the data flow, and rules for entering business data in a data model component. It can use different data types as data sources for a data model.

 

These data types include tables, data entities, methods, and enums. It supports user input parameters that can be defined as data sources for a data model when some data must be specified at runtime (for example, which financial dimension to be included). Also filtering, sorting and other operations are supported, but only for outgoing documents.

 

Format Component

 

A format component is the scheme of the reporting output that is generated at runtime. A scheme consists of a format that defines the structure and content of the generated electronic document, data sources, format mapping as a set of bindings and a format validation as a set of configurable rules that control report generation at runtime.

 

For example, there might be a rule that stops output generation of a vendor’s payments and throws an exception when specific attributes of the selected vendor are missing, such as the bank account number.

 

Created reporting output can be as individuals file in various formats, such as text, XML, Microsoft Word document, or worksheet. But there is also a possibility of creating multiple files separately and encapsulating them into zip file. The following illustration shows how the data flows in outgoing report.

 

 

Problem Description

 

In France each company has to deliver so-called FEC report to the government. It is an export of several entities having a specific format. The format is very strict, that means when it is not correct, the declaration will not be approved.

 

The FEC report is available in F&O as part of the electronic reporting functionality, a localization made for France. However, the export of the ledger transactions is based upon the Main account.

 

In France you need a specific local chart of account. Imagine that this account is stored in a custom-made financial dimension called: FRACOA. The main goal is to replace main account values with FRACOA values.

 

To be more precise, the account number (CompteNum) should be replaced with the dimension’s value, while account description (CompteLib) should be replaced with the dimension’s description.

 

 

 

The report’s output format is a ZIP file containing 5 text
documents. Only the values in the first document called
1_FEC.txt need to be replaced. 

 

 

 

Solution

 

Because the ER already exists and it’s part of Microsoft standard configurations library, we do not want to create a new model, but rather to create a duplicate of the existing one. In that way, we can do modifications on it.

 

Modifications of an existing electronic report can be done only on a duplicated version of it. You are not allowed to change or modify existing standardized configurations.

 

 

The FEC report is located under the configuration named
‘Data export model’. As we can see, it consists of a model
definition, model mapping and two report designs (German
and French localization).

 

 

If you are missing the configuration for your report, then first you should go to Workspaces > Electronic reporting > from Configuration providers select Microsoft and click on Repositories > select Global and click Open > find the desired model and click Import/Import all (depending on if you would like to import everything or just particular configuration).

 

If we take a look at the design of the data model, we can see that it has quite a complex structure unlike ones that are usually used. Fields that will be included in the final report are rather dynamically structured and, in the model, we just define some fundamental nodes so they can fetch the data.

 

In this model, all fields are implicitly defined, contrary to most of the models where nodes (fields) are explicitly defined. The Tables node defines files from the zip, while in Records is defined the structure of records in one file.

 

If we expand one of the (*)Fields node, we can only see some type of rules to check what type is the value in the field, to cast it in the appropriate type and some additional metadata for the field.

 

 

This means that the model is pretty conserved and made to be generic. We do not need to change anything here. Thus, there is no need of duplicating the data model. Instead, we need to duplicate the model mapping and do our changes there.

 

Duplicating the Data Model Mapping

 

  • Make sure you are located in Workspaces > Electronic reporting > Reporting configurations > locate and expand the desired model in the tree, in our case it is ‘Data export model’

 

  • Select the model mapping, in our case it is ‘French FEC model mapping’ and click on Create configuration

 

  • In the drop dialog, for the New field select ‘Derive from Name: French FEC model mapping, Microsoft’. In the Name field, type the name for the mapping ‘AXM – French FEC model mapping’. In the Description field, you can set a description, but it is not mandatory. Click Create configuration.

 

Map the  Model to Use Financial Dimensions

 

  • In the tree, select the newly created model mapping ‘AXM – French FEC model mapping’ and click on Designer in the action pane.
  • Since we are creating a duplicate instead of new mapping, in the grid there should already be a record for the mapping – copy of the original one. Select it and click Designer.
  • In the Model mapping designer form, it can be seen that there are already some data sources defined. Those data sources are used for the current implementation of the report. First thing we need to do is to add the data source for using financial dimensions for this report.

 

  • In the tree, select ‘Functions\Financial dimensions details’ and click Add root. This data source specifies how the scope of financial dimensions will be defined for any report that will use this model as a data source.


  • In the Name field, type a value. Select Yes in the Ask for dimensions field (select Yes to allow the user to select dimensions at run-time on the User dialog form. If set to No, all financial dimensions of the current instance will be used by default).

 

  • In the Financial dimensions selection field, select ‘Legal entity’ (select All to allow the user to select desire dimensions for the current instance in the Lookup field. Select Legal entity to allow the user to select dimensions for the company in the Lookup field. Select Dimension to allow the user to select dimensions using a single dimension set.

 

  • Select Yes in the Ask for main account field (set ‘Ask for main account’ to Yes to allow users to select the main account as part of the list of dimensions. If set to No, the main account will not be included to the list of dimensions and the ‘Is main account mandatory’ option is enabled. If “Is main account mandatory’ is set to Yes, include the main account in the list of dimensions regardless of the user’s selection).

 

  • Click OK.

 

  • The newly created data source should be visible among other data sources in the middle section of the form.


 

  • If we take a closer look at data sources and data model, we can see that Tables node in the data model is bonded to the TblGroup data source. This data source is actually a calculated field that serves as a bridge between the model and the data source named TblGroup1. We need to find the source of data providing and in this case that is the data source ‘FEC files with details(TblGroup1)’. This data source is defined using specific function (Dynamics.AX.Application.ERModelGDPdUFunction). By expanding it, we cannot add fields or change mapping because its structure is generic too.



If you cannot see details about data sources binding and inheritance, click on Show details button in the main action pane.



 

  • Select FEC files with details(TblGroup1) and click on Edit button in the ribbon.

 

  • A new dialog will appear showing data source parameters. In addition, there is a button named Editor which allows us to enter the editing mode for making changes in the structure of the report. Click on Editor.


 

  • Table Metadata form is opened. This form is divided into three parts:

 

    • Tables (most left section) where all files are being present. In this grid the name of the table (file) is being shown together with a path relating to a particular data source.

 

    • Fields (middle section) where all fields related to a selected table from the left grid are being shown. In this grid, the name of the field is being shown together with a path relating to a particular node in a data source.

 

    • Data sources (right section) where all active data sources for the desired model are being shown. Above the grid, there is an Add button. Using this button, we can find the field we want in any active data source and add it in the desired table.





If you are not able to see all sections, zoom out the browser settings.

 

  • Select the desired table in the left section. In our case, because we need the change to be applied only to the 1_FEC.txt file, we select the table 1_FEC.

 

  • In the middle section, select fields you would like to replace. In this case, we select CompteNum and CompteLib. Click Delete.


 

  • In the right section, expand the general journal entry where financial dimensions are stored. In this case, we expand $GeneralJournalForGDPdUView data source. If you are not sure which data source to use, take the one that other fields from the same table are mapped from.

 

  • Expand and select ‘$GeneralJournalForGDPdUView/getGeneralJournalAccountEntry() /LedgerDimension.Dimension/Main account and dimensions/Value/Code’.

 

  • Click Add.


 

  • Expand and select ‘$GeneralJournalForGDPdUView/getGeneralJournalAccountEntry() /LedgerDimension.Dimension/Main account and dimensions/Value/Description’.

 

  • Click Add.

 

  • New fields should be visible somewhere in the grid, under their original names. Click on the Name field with value ‘Code’ and change it to ‘CompteNum’. Change the value ‘Description’ to ‘CompteLib’.

 

  • Using the Move up and Move down buttons, you can change the order of the fields in the grid. This is important because in same manner the fields will be shown in the output file.


  • Save the changes. Click Close.

 

  • Save the changes again and click Close.

 

  • From the configuration tree, select the desired model mapping, in this case it is ‘AXM – French FEC model mapping’. Select the Draft version and click Change status.

 

  • From the drop dialog, select Complete. If it’s the first time you are modifying the mapping. Now you will get two records in the gird, one that is Completed and one that is in Draft. After every change, if we want it to be reflected in the output, we need to set the latest draft version to Completed.

 

  • In order the report to take our custom-made mapping, we need to set it as default. This way, the system will know what mapping to choose when running the report. Make sure the correct mapping is still selected.

 

  • Click Edit and set the control Default model mapping to Yes.

 

Designing the Report

 

If we open the format designer to see the structure of the report, we can notice that it is generic, same as the model itself. This means that no changes need to be done here as well.

 

The advantage of using this approach for modeling reports is that the structure of the report is partially conserved, but if you do need to do some small changes, you only need to do changes into the mapping part.

 

 

Running the Report

 

Depending how this report is set to be ran in standard environment, you can test it from there, or you can navigate to the configurations form and:

 

  • Expand the model we created mapping for and select the format that already exists, in this case it is ‘French FEC audit file’ and click Run.

  • In the Dimensions field, choose which dimension you would like to be shown in the output report instead of the main account number and click Select (if FRACOA dimension is chosen, then we will get its values in the report, otherwise if the MainAccount is chosen, then we will obtain the original report from before.

 

  • This implementation gives flexibility in the way of execution. Note that the drop dialog to choose a dimension is not available in the original configuration of the report. This is customization that was implemented using this tutorial).

 

  • After clicking the OK button, a zip file is being generated and downloaded to the local computer. The downloaded zip file has a structure similar to this:




  • We can open the first text file and compare it with a previously downloaded version of the original report.

 

 

 

We can notice that the main account values are indeed replaced with FRACOA values for all entries. No changes were made to other 4 files so they will keep the same structure and data.

 

Following this tutorial, you should be able to do a modification on any report you need to. The most important thing is to understand the logic behind components of electronic reports and their binding. In a situation where the model and the format have explicit structure and mapping from data sources is done directly, creating the desired mapping has a little bit more work to be done. You just need to stick to the following sequence:

 

Create duplicate of a model > Create the node you would like to be shown in the output (make sure you create it under the correct parent node) > Create duplicate of the model mapping > If the data source where your field comes from is not present, create it > Bind the data source field and the newly created node in the model > Create a duplicate of the format and add the node there too > Map the node from the model with the node in the format.

 

No need to thanks us, we are glad to help you. So, if you are in need of someone to upgrade your systems from Microsoft Dynamics AX to Dynamics 365, we are open to future collaboration. Reach out to us here.

 

And if you are interested to be part of our team, check out our careers page we have open job vacancies all the time!

Application Insights with D365 F&O

What is Application Insights?

 

Application Insights, a feature of Azure Monitor, is an extensible Application Performance Management (APM) service for developers and DevOps professionals. Use it to monitor your live applications. It will automatically detect performance anomalies, and includes powerful analytics tools to help you diagnose issues and to understand what users do with your app.

 

It’s designed to help you continuously improve performance and usability. It works for apps on a wide variety of platforms including .NET, Node.js, Java, and Python hosted on-premises, hybrid, or any public cloud. It integrates with your DevOps process and has connection points to a variety of development tools. It can monitor and analyze telemetry from mobile apps by integrating with Visual Studio App Center.

 

 

Application Insights can be used to log:

 

  1. Events Azure Application Insights Telemetry Data Model – Event Telemetry – Azure Monitor | Microsoft Docs
  2. Exceptions Azure Application Insights Exception Telemetry Data model – Azure Monitor | Microsoft Docs
  3. Requests Data model for request telemetry – Azure Application Insights – Azure Monitor | Microsoft Docs
  4. Metrics Data model for metric telemetry – Azure Application Insights – Azure Monitor | Microsoft Docs
  5. Traces Azure Application Insights Data Model – Trace Telemetry – Azure Monitor | Microsoft Docs

 

How to create Application Insights Create Application Insights | Microsoft Docs

 

Something more about the Application insights Application Insights Overview | Microsoft Docs

 

How We Can Connect D365 with Azure Application Insights

 

Open your environment in the browser and navigate to the System Administration -> Setup -> Monitoring and telemetry parameters form.

 

 

From here, you can enable the different telemetry types that are currently supported. More will be added over time. Each type has the Dynamics terminology followed by the Application Insights terminology in parenthesis. This will help you know where to locate it in Application Insights as well as do further learning on docs.microsoft.com.

 

 

Setup your environments, by copying the LCS Environment ID into the setup screen and mapping it to an Environment Type:

 

 

Thereafter, you can map environment types to Application Insights destinations:

 

 

The instrumentation key is retrieved from your Application Insights resource within Azure

 

 

As you copy your Finance and Operations database between environments, it will instantly pick up the new Application Insights configuration and automatically send telemetry to the correct location. If you copy your database to an environment which is not configured, then the environment will gracefully do nothing, and no telemetry will be sent.

 

D365 Standard Class Used for Application Insights

 

  • SysGlobalTelemetry class has methods to log text to Azure Application Insights.

 

We can use these methods to log metrics for Interfaces to see for how much time the file is exported and uploaded to blob.

 

    • logMetrics() – Tracks how long, on average, a compute node takes to download the required text file.
    • logEvents() – Tracks interesting events to capture.
    • global_pre_error() – logs error.

 

Example:

 

 

Creating Custom C# dll

 

Application Insights is a very popular (and FREE) approach to monitoring your websites and desktop applications. It works best with websites hosted by IIS, however it can be built into any product.

 

Create a custom C# dll to implement the methods you need to consume the Microsoft.ApplicationInsights.dll to make it easier to use from X++.

 

The handler DLL will enable to:

 

  • Set context properties like user, operation, version & custom global properties;
  • Instance and track telemetry for Events, Exceptions, Requests, Metrics, Traces;
  • Add custom properties & custom metrics related with Events, Exceptions, Requests, Metrics, Traces.

 

Let’s start by building our own C# library which uses the latest NuGet package for AppInsights:

 

 

After you have your C# library setup and the NuGet package installed, we can start developing class that can handle our events.
Here is the example of the code from my C# class. This code is only to instance and track telemetry for Exceptions and Requests.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.DataContracts;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.ApplicationInsights.DependencyCollector;
using Microsoft.ApplicationInsights.Web;

namespace AppInsightsHandler
{
    public class AppInsightsHandler
    {
        
        private TelemetryClient 	Client;

        private RequestTelemetry 	requestTelemetry;
        private ExceptionTelemetry 	exceptionTelemetry;

        string objectType;

        List<KeyValuePair<string, string>> properties = new List<KeyValuePair<string, string>>();
        List<KeyValuePair<string, string>> ContextGlobalProperties = new List<KeyValuePair<string, string>>();
        List<KeyValuePair<string, Double>> metrics = new List<KeyValuePair<string, Double>>();

        public void instantiateClient(string _instrumentationKey, string _objectType)
        {

            if (string.IsNullOrEmpty(_instrumentationKey))
            {
                throw new ArgumentNullException(nameof(_instrumentationKey), "Instrumentation key is required.");
            }
            if (string.IsNullOrEmpty(_objectType))
            {
                throw new ArgumentNullException(nameof(_objectType), "Object type is required.");
            }
            objectType = _objectType;
            TelemetryConfiguration config = new TelemetryConfiguration(_instrumentationKey);
            Client = new TelemetryClient(config);
            switch (objectType)
            {
                case "ExceptionTelemetry":
                    exceptionTelemetry = new ExceptionTelemetry();
                    break;
                case "RequestTelemetry":
                    requestTelemetry = new RequestTelemetry();
                    break;
            }

        }

        public void addProperty(string _key, string _value)
        {
            KeyValuePair<string, string> property = new KeyValuePair<string, string>(_key, _value);
            if (!properties.Exists(item => item.Key == _key))
            {
                properties.Add(property);
            }
        }

        public void addContextGlobalProperty(string _key, string _value)
        {
            KeyValuePair<string, string> property = new KeyValuePair<string, string>(_key, _value);
            if (!ContextGlobalProperties.Exists(item => item.Key == _key))
            {
                ContextGlobalProperties.Add(property);
            }
        }
        public void addMetrics(string _key, Double _value)
        {
            KeyValuePair<string, Double> metric = new KeyValuePair<string, Double>(_key, _value);
            if (!metrics.Exists(item => item.Key == _key))
            {
                metrics.Add(metric);
            }
        }

        public void setContextUserInfo(string _accountId, string _authenticatedUserId, string _userId = "", string _userAgent = "")
        {
            switch (objectType)
            {
                case "ExceptionTelemetry":
                    exceptionTelemetry.Context.User.AccountId = _accountId;
                    exceptionTelemetry.Context.User.AuthenticatedUserId = _authenticatedUserId;
                    exceptionTelemetry.Context.User.Id = _userId;
                    exceptionTelemetry.Context.User.UserAgent = _userAgent;
                    break;
                case "RequestTelemetry":
                    requestTelemetry.Context.User.AccountId = _accountId;
                    requestTelemetry.Context.User.AuthenticatedUserId = _authenticatedUserId;
                    requestTelemetry.Context.User.Id = _userId;
                    requestTelemetry.Context.User.UserAgent = _userAgent;
                    break;
            }
        }
        public void setContextOperation(string _operationId, string _operationName, string _parentId = "")
        {
            switch (objectType)
            {
                case "ExceptionTelemetry":
                    exceptionTelemetry.Context.Operation.Id = _operationId;
                    exceptionTelemetry.Context.Operation.Name = _operationName;
                    exceptionTelemetry.Context.Operation.ParentId = _parentId;
                    break;
                case "RequestTelemetry":
                    requestTelemetry.Context.Operation.Id = _operationId;
                    requestTelemetry.Context.Operation.Name = _operationName;
                    requestTelemetry.Context.Operation.ParentId = _parentId;
                    break;
            }
        }
        public void setContextComponentVersion(string _version)
        {
            switch (objectType)
            {
                case "ExceptionTelemetry":
                    exceptionTelemetry.Context.Component.Version = _version;
                    break;
                case "RequestTelemetry":
                    requestTelemetry.Context.Component.Version = _version;
                    break;
            }
        }

        public void setContextGlobalProperties()
        {
            foreach (KeyValuePair<string, string> element in ContextGlobalProperties)
            {
                
                switch (objectType)
                {
                    case "ExceptionTelemetry":
                        exceptionTelemetry.Context.GlobalProperties.Add(element);
                        break;
                    case "RequestTelemetry":
                        requestTelemetry.Context.GlobalProperties.Add(element);
                        break;
                }
            }
        }
       
        public void setsysExceptionTelemetryValues(Exception _exception, string _message, string _problemId, int _severityLevel)
        {
            if (exceptionTelemetry != null)
            {

                exceptionTelemetry.Exception = _exception;
                exceptionTelemetry.Message = _message;
                exceptionTelemetry.ProblemId = _problemId;
                switch (_severityLevel)
                {
                    case 4:
                        exceptionTelemetry.SeverityLevel = SeverityLevel.Critical;
                        break;
                    default:
                        exceptionTelemetry.SeverityLevel = SeverityLevel.Information;
                        break;
                }
                exceptionTelemetry.Timestamp = DateTimeOffset.UtcNow;
                foreach (KeyValuePair<string, string> element in properties)
                {
                    exceptionTelemetry.Properties.Add(element);
                }
                foreach (KeyValuePair<string, Double> element in metrics)
                {
                    exceptionTelemetry.Metrics.Add(element);
                }

            }
        }
  public void TrackTelemetry()
        {
            if (Client != null && objectType != "")
            {
                switch (objectType)
                {
                    case "ExceptionTelemetry":
                        Client.TrackException(exceptionTelemetry);
                        break;
                    case "RequestTelemetry":
                        Client.TrackRequest(requestTelemetry);
                        break;
                }
                Client.Flush();
            }
        }
        public void setExceptionTelemetryValues(string _exceptionMessage, string _exceptionSource, string _message, string _problemId, int _severityLevel)
        {
            if (exceptionTelemetry != null)
            {
                Exception e = new Exception(_exceptionMessage);
                e.Source = _exceptionSource;
                exceptionTelemetry.Exception = e;
                exceptionTelemetry.Message = _message;
                exceptionTelemetry.ProblemId = _problemId;
                switch (_severityLevel)
                {
                    case 0:
                        exceptionTelemetry.SeverityLevel = SeverityLevel.Verbose;
                        break;
                    case 1:
                        exceptionTelemetry.SeverityLevel = SeverityLevel.Information;
                        break;
                    case 2:
                        exceptionTelemetry.SeverityLevel = SeverityLevel.Warning;
                        break;
                    case 3:
                        exceptionTelemetry.SeverityLevel = SeverityLevel.Error;
                        break;
                    case 4:
                        exceptionTelemetry.SeverityLevel = SeverityLevel.Critical;
                        break;
                    default:
                        exceptionTelemetry.SeverityLevel = SeverityLevel.Information;
                        break;
                }
                exceptionTelemetry.Timestamp = DateTimeOffset.UtcNow;
                foreach (KeyValuePair<string, string> element in properties)
                {
                    exceptionTelemetry.Properties.Add(element);
                }
                foreach (KeyValuePair<string, Double> element in metrics)
                {
                    exceptionTelemetry.Metrics.Add(element);
                }

            }
        }
    
        public void setRequestTelemetryValues(string _requestName, string _requestId, Boolean _success, string _responseCode, string _source, string _uriString, Double _duration)
        {
            if (requestTelemetry != null)
            {
                requestTelemetry.Name = _requestName;
                requestTelemetry.Timestamp = DateTimeOffset.UtcNow;
                requestTelemetry.Success = _success;
                requestTelemetry.Id = _requestId;
                requestTelemetry.ResponseCode = _responseCode;
                requestTelemetry.Source = _source;
                requestTelemetry.Duration = TimeSpan.FromSeconds(_duration);
                if (_uriString != "")
                {
                    Uri uri = new Uri(_uriString);
                    requestTelemetry.Url = uri;
                }

                foreach (KeyValuePair<string, string> element in properties)
                {
                    requestTelemetry.Properties.Add(element);
                }
                foreach (KeyValuePair<string, Double> element in metrics)
                {
                    requestTelemetry.Metrics.Add(element);
                }
            }
        }

    }
}

 

After that create an X++ project in your solution and add a reference to your C# library:

 

 

Thereafter, let’s create an X++ class which makes use of our telemetry library:

 

 

Let us know if this helped you, and if you are interested to work with Microsoft Dynamics 365 you can check out our careers page for the open job positions. 

 

Processing an Excel File in Batch Using the FileUpload Functionality Together with SysOperationFramework

Sometimes in D365 things happen which are either human or system error, which will leave you with faulty data in your system.

 

That kind of thing happened some time ago for one of our clients, when a daily batch job removed all the loads for the purchase orders which had lines who have ‘Registered’ quantities, and left them with more than 3000 purchase orders for which they couldn’t create and post a product receipt journal, because they didn’t have the load associated with them, and going with the logic of creating a new batch job for posting product receipts for quantity = ‘Registered’ would’ve broke their workflow.

 

So, they exported the purchase orders that they wanted to update, and after seeing that the update should be done for more than 3000 orders, I knew that I should extend the SysOperationFramework, so the update could be done in batch processing on the server, and the users wouldn’t experience any performance issues on the interface itself.

 

When talking about extending the SysOperationFramework parts, you probably already know that we will have the well-known structure of classes in order to design our batch process: the controller class, responsible for running the operation and modifying the contract, the contract class, responsible for passing parameters and values from the user to the logic that processes operation, the service class, responsible for providing the logic which is being executed (in our example, iterating through the Excel file, getting the purchase orders IDs and posting a product receipt for them), and the User Interface builder (UIBuilder) class, responsible for the actual looks and event handlers of the dialog that is presented to the user.

 

Let’s have a look at what our code changes will look like in the D365 user interface, before scheduling the actual batch job:

 

 

Analyzing this dialog, we will see that it looks like every other batch dialog, with only one parameter: a file.

 

Below, we will see the code which is taking care of the design and functionality for this batch process.

 

The Controller Class:

 

/// <summary>
/// Controller class for creating & posting PO packing slips
/// </summary>
class AXMPostPOReceiptsController extends SysOperationServiceController
{
	/// <summary>
    /// Creates new instance of <c>AXMPostPOReceiptsController</c>
    /// </summary>
    public void new()
    {
        super();
     
        this.parmClassName(classStr(AXMPostPOReceiptsService));
        this.parmMethodName(methodStr(AXMPostPOReceiptsService, processOperation));
     
        this.parmDialogCaption("Create packing slips");
    }
	
	/// <summary>
    /// Sets the caption of the job
    /// </summary>
    /// <returns>Caption of the job</returns>
    public ClassDescription caption()
    {
        return "Create packing slips";
    }
	
	/// <summary>
    /// Method which is run while calling the corresponding menu item
    /// </summary>
    /// <param name = "args">Arguments passed from the menu item</param>
    public static void main(Args args)
    {
        AXMPostPOReceiptsController controller;
     
        controller = new AXMPostPOReceiptsController();
        controller.startOperation();
    }
}

 

Looking at the code for the AXMPostPOReceiptsController, we see that it has 3 methods, of which 2 are overridden: new and caption. Above every method there is a summary explanation of what that method is doing. We can see that in the new method, we are initializing a new instance of the controller class and are defining the processing class and method (the service class), in our case, AXMPostPOReceiptsService class.

 

Please don’t be confused about the caption and the dialog caption for the batch job, ‘Create packing slips’, we know that sometimes we also refer to the product receipts as packing slips.

 

The Data Contract Class:

 

/// <summary>
/// Data contract class for creating & posting PO packing slips
/// </summary>
[   DataContract,
    SysOperationContractProcessing(classStr(AXMPostPOReceiptsUIBuilder))
]
class AXMPostPOReceiptsDataContract
{
    container       storageResult;

	/// <summary>
    /// Parameter method which holds values of the packed variables from <c>FileUploadTemporaryStorageResult</c> class
    /// </summary>
    /// <param name = "_storageResult">Packed instance of <c>FileUploadTemporaryStorageResult</c> class</param>
    /// <returns>Container with packed values</returns>
    [DataMemberAttribute('StorageResult')]
    public container parmStorageResult(container _storageResult =  storageResult)
    {
        storageResult = _storageResult;
        return storageResult;
    }
}
    

 

As said, the data contract class holds the parameters that user wants to pass to the logic which is being executed. In our case, we have one parameter that we’re passing, storageResult of type container. As explained in the summary, this variable holds the values of the packed variables of the FileUploadTemporaryStorageResult class instance, which in fact holds the upload result of the FileUpload control.

 

As for now, the only thing that you need to know is that FileUploadTemporaryStorageResult implements SysPackable, which means that we can do serialization on it, like pack and unpack the variables defined in the #CurrentList for the #CurrentVersion macro.

 

Note: Please visit the File upload control page, where you can find documentation on this control.

 

The UI Builder Class:

 

/// <summary>
/// UI Builder class for posting purchase orders packing slips
/// </summary>
class AXMPostPOReceiptsUIBuilder extends SysOperationUIBuilder
{
    private str                 availableTypes = ".csv, .xlsx";
    private const str           OkButtonName = 'CommandButton';
    private const str           FileUploadName = 'FileUpload';
	
    AXMPostPOReceiptsDataContract   contract;

	/// <summary>
    /// Overriden the <c>postBuild</c> method to add a <c>FileUpload</c> control
    /// </summary>
    public void postBuild()
    {
        DialogGroup      dialogGroup;
        FormBuildControl formBuildControl;
        FileUploadBuild  dialogFileUpload;

        super();

        contract = this.dataContractObject();
        
        dialogGroup = dialog.addGroup("File path");
        formBuildControl = dialog.formBuildDesign().control(dialogGroup.name());
       
        dialogFileUpload = formBuildControl.addControlEx(classstr(FileUpload), FileUploadName);
        dialogFileUpload.style(FileUploadStyle::MinimalWithFilename);
        dialogFileUpload.baseFileUploadStrategyClassName(classstr(FileUploadTemporaryStorageStrategy));
        dialogFileUpload.fileTypesAccepted(availableTypes);
        dialogFileUpload.fileNameLabel("@SYS308842");
    }

	/// <summary>
    /// Subscribes events to the dialog form
    /// </summary>
    /// <param name = "_formRun">The instance of the dialog form</param>
    private void dialogEventsSubscribe(FormRun _formRun)
    {
        FileUpload fileUpload = _formRun.control(_formRun.controlId(FileUploadName));
        fileUpload.notifyUploadCompleted += eventhandler(this.uploadCompleted);
        fileUpload.notifyUploadAttemptStarted += eventhandler(this.uploadStarted);
        _formRun.onClosing += eventhandler(this.dialogClosing);
    }
	
	/// <summary>
    /// Executes logic for unsubscribing the registered events on the form
    /// </summary>
    /// <param name = "sender"></param>
    /// <param name = "e"></param>
    [SuppressBPWarningAttribute('BPParameterNotUsed', 'This is event parameter not required to use')]
    private void dialogClosing(xFormRun sender, FormEventArgs e)
    {
        this.dialogEventsUnsubscribe(sender as FormRun);
    }
	
	/// <summary>
    /// Unsubscribes events from the dialog form
    /// </summary>
    /// <param name = "_formRun">The instance of the dialog form</param>
    private void dialogEventsUnsubscribe(FormRun _formRun)
    {
        FileUpload fileUpload = _formRun.control(_formRun.controlId(FileUploadName));
        fileUpload.notifyUploadCompleted -= eventhandler(this.uploadCompleted);
        fileUpload.notifyUploadAttemptStarted -= eventhandler(this.uploadStarted);
        _formRun.onClosing -= eventhandler(this.dialogClosing);
    }
	
    /// <summary>
    /// Executes additional logic once the upload of the file is completed
    /// </summary>
    protected void uploadCompleted()
    {
        var formRun = this.dialog().dialogForm().formRun();
        FileUpload fileUpload = formRun.control(formRun.controlId(FileUploadName));
        FileUploadTemporaryStorageResult uploadResult = fileUpload.getFileUploadResult();

        if (uploadResult != null && uploadResult.getUploadStatus())
        {
            contract.parmStorageResult(uploadResult.pack());
        }

        this.setDialogOkButtonEnabled(formRun, true);
    }
	
	/// <summary>
    /// Additional logic which is executed once the upload of the file has started
    /// </summary>
    private void uploadStarted()
    {
        var formRun = this.dialog().dialogForm().formRun();
        this.setDialogOkButtonEnabled(formRun, false);
    }

    /// <summary>
    /// Enables/Disables the OK button of the dialog
    /// </summary>
    /// <param name = "_formRun">The instance of the dialog form</param>
    /// <param name = "_isEnabled">Should the OK button be enabled?</param>
    protected void setDialogOkButtonEnabled(FormRun _formRun, boolean _isEnabled)
    {
        FormControl okButtonControl = _formRun.control(_formRun.controlId(OkButtonName));
        if (okButtonControl)
        {
            okButtonControl.enabled(_isEnabled);
        }
    }

    /// <summary>
    /// Override of the <c>postRun</c> method in order to add events subscriptions
    /// </summary>
    public void postRun()
    {
        super();

        FormRun formRun = this.dialog().dialogForm().formRun();
        this.dialogEventsSubscribe(formRun);

        this.setDialogOkButtonEnabled(formRun, false);
    }

}

    

We can see that in this class we have more methods and more logic. You can also notice that we have event handlers, which should run the specified code once the event is started or completed. Analyzing the code, first we can see that the method postBuild has been overridden. Here, we’re constructing the actual look of the dialog. We can see that first we’re creating a group for the file path, and after that we’re adding the FileUpload control, we’re setting the style and the file upload strategy (you can see the documentation in the referenced documentation for File upload). We can also set the available types that user will be able to choose and upload. You can see that the availableTypes is actually string variable with file extensions defined.

 

After we’re done with adding controls to the dialog, it’s time to make the form responsive, and that’s when the event handlers come into action. As for every event, first we need to do a subscription to a certain event, and after we’re finished, we unsubscribe from that event. So, next we will have a look at method postRun which is called once the dialog is built and ran.

 

In this method, we see that we’re taking instance of the current dialog (FormRun), we’re making event subscriptions for that FormRun instance and we’re calling the method setDialogOkButtonEnabled which as the name suggests, it’s either enabling/disabling the ‘OK’ button, which is actually submitting the form displayed on the dialog. The solution here is only enabling the ‘OK’ button once we have successfully uploaded a file.

 

Now, let’s review the logic for subscribing and unsubscribing to an event. Looking at method dialogEventsSubscribe, we see that we’re retrieving the FileUpload control that we’ve created in postBuild method, and we’re adding (subscribing) to events for once the upload has attempted to start and once the upload is completed. The event handlers for these events are respectively methods uploadStarted and uploadCompleted. After that, we’re assigning an event handler for the onClosing event of the FormRun, which is basically calling another method, dialogEventsUnsubscribe, which is basically subtracting (unsubscribing) the event handlers from the events.

 

Looking at the event handlers, we can see that event handler uploadStarted doesn’t do anything special, but only disables the dialog ‘OK’ button. However, the other event handler, uploadCompleted, we’re once again retrieving the FileUpload, but this time, because the upload is completed, it means that we can take the upload result and store it somewhere (or do additional logic with it).

 

After taking the result of the file upload, as explained before, I am packing the result and sending it as a parameter to our contract class, so I can later use it in our service class, where all the logic for creating and posting the product receipts is located.

 

The Service Class

 

/// <summary>
/// Service class which is executing the logic for creating & posting PO packing slips
/// </summary>
class AXMPostPOReceiptsService extends SysOperationServiceBase
{
    #File
    container               currentLine;
    CommaTextStreamIo       localStream;
    PurchId                 currentPurchId;
    PurchTable              purchTable;

    /// <summary>
    /// The actual logic of the process
    /// </summary>
    /// <param name = "_contract">Instance of the <c>AXMPostPOReceiptsDataContract</c> class</param>
    public void processOperation(AXMPostPOReceiptsDataContract _contract)
    {
        if (_contract.parmStorageResult() != conNull())
        {
            FileUploadTemporaryStorageResult fileUploadResult = new FileUploadTemporaryStorageResult();

            fileUploadResult.unpack(_contract.parmStorageResult());

            if (fileUploadResult != null)
            {
                try 
                {
                    localStream = CommaTextStreamIo::constructForRead(File::UseFileFromURL(fileUploadResult.getDownloadUrl()));

                    if (localStream.status() != IO_Status::Ok)
                    {
                        throw error(strfmt('Is not possible to open the file. Error %1',enum2str(localStream.status())));
                    }
   
                    localStream.inFieldDelimiter("\,");
                    localStream.inRecordDelimiter("\n");
   
                    currentLine = localStream.read();
   
                    while(currentLine)
                    {
                        currentPurchId = conPeek(currentLine, 1);

                        purchTable = PurchTable::find(currentPurchId);

                        if (purchTable)
                        {
                            Num psNumber = strFmt("%1_PS", currentPurchId);

                            PurchFormLetter     purchFormLetter = PurchFormLetter::construct(DocumentStatus::PackingSlip);
                            purchFormLetter.update(purchTable, psNumber, systemDateGet(), PurchUpdate::Recorded, AccountOrder::None, NoYes::No, NoYes::No);
                        }
            
                        currentLine = localStream.read();
                    }
                }
                catch (Exception::Error)
                {
                    error("@RET433");
                }
            }
        }
    }
}

 

Since we’re only doing a creation and posting of a product receipt for a certain purchase orders, the logic here will be pretty simple. We can see that we have once method, processOperation, which is taking an instance of the data contract class. With the help of the data contract, we can transfer the packed values of the file upload result from the UI builder to the service class.

 

Once we have unpacked the result, we’re constructing an IO stream, to which we’re using a file from URL, and that URL is generated with the help of FileUploadTemporaryStorageResult based on the unpacked values. I have wrapped all of the logic in try – catch block, and the code iterates trough the file that the user has uploaded previously, and it’s getting column values (in my case, it’s getting only the values from the first column, since I don’t have additional columns).

 

Once the value is taking, code is checking whether a purchase order exists for that purchase ID, and if it does, it proceeds with creating and posting the product receipt with the help of the PurchFormLetter class, and as you can see the parameters for the update are a buffer of the purchase table, a number for the packing slip (which in this case is generated manually, but that can be done via number sequences too), the date of the posting, the update parameter (in this case, only ‘Registered’ lines will be included), the account order set to ‘None’, and the settings for the proforma and whether the packing slip should be printed or not (both options set to ‘No’).

 

This was everything for processing a file in batch using the SysOperationFramework that you should know for starters. I really hope that I have well explained the bits of code which were presented.

 

Please note that there is also another way to solve this, and that would be to create a data entity and a table in which you will place your values (for this example, purchase order IDs), and also a batch classes and a query against the newly created table, so you can process the data that you have implemented. Both solutions work well, and although the data entity solution is more extendible, the one with the file upload is quicker and less painful.

What Is Performance Testing and Why Do You Need One?

Digital transformation is not an option for a long time ago, and many businesses are doing it. Only entering into the digital world is not sufficient anymore, you also need to build a culture of continuous improvements, that should help you to maintain the leadership position by meeting customer and business demands.

 

On one hand you have your business, which is fully automated with high expectations on stability, reliability, and capability of their applications towards achieving their goals. Any downtime or malfunction might lead to huge losses.

 

On the other hand, you have your smart and digitally aware customers that expect responsive systems, around-the-clock availability, immediate / on-time order fulfillment, quick invoicing, and zero errors. And these are the most common drivers of progress that shouldn’t be disappointed.

 

How Can Performance Testing Help You in Achieving Your Strategic Goals?

 

Performance testing is a powerful tool that applied against a variety of use case scenarios provides valuable insights to identify a company’s digital infrastructure performance risks.

 

Companies can and must be proactive in the identification of those risks that might damage their reputation, cause revenue and/or opportunity losses, but also in their mitigation, by devoting a certain amount of resources to perform performance testing and act upon the results. 

 

When Is the Best Time to Run Performance Testing?

 

Our recommendation is to perform performance testing:

 

Before Going Live

 

Once the solution is stable from a functionality perspective, it’s time to run performance testing to uncover what needs to be improved before they go live. 

 

Before Deploying Major Changes  

 

Any change in the system is potentially dangerous with certain risks associated with it and must be approached carefully. Especially when you have major phase releases, performance testing is a mandatory step to verify the existing and new functionalities from the perspective of performance and scalability.

 

Periodical Verification that System Can Handle Peaks

 

It is common that the load on a productive system is not constant over time, and there are certain events that can trigger business activities to cause meaningful fluctuations in the load. Such events can be caused by business behavior to handle certain tasks at a certain time of a day or month, legal requirements, or some special days such as Christmas or Black Friday that dictate consumer behavior that directly or indirectly challenges the scalability of business applications. The peak load from such a usage pattern can be significantly higher than the average load. 

 

How Can Axapta Masters Help You?

 

Axapta Masters has years of technical and business expertise working with Microsoft Dynamics solutions across many industries. We are leveraging that experience to help our customers to build an adapted approach based on their business needs. Our approach is unique and is consist of two major directions, that joined together are a guarantee for success: 

 

  • 24/7 production monitoring, and  
  • Performance Testing using a non-production environment. 

 

24/7 Production Monitoring

 

24/7 monitoring over a period of time is a crucial activity that helps us to capture valuable system metrics from a production environment, that are available only at that particular moment, without the possibility to retrieve them afterward.

 

Metrics such as AOS, SQL utilization, head-blockers, slow queries, batch job executions, integration points and exceptions are captured mainly in real-time, collected, and organized into a daily or weekly report. 

 

 

Performance Testing

 

Performance testing itself is a complex process that involves many steps to be successfully performed to get the desired outcome. 

Capture Requirements 

 

Discuss with business and IT users to understand exact requirements, day-to-day processes, and known issues, to design representative test cases with a focus on specific areas of interest. 

 

Test Environment

 

Usually a non-production environment.

 

Identify Test Scenarios

 

Work closely with the business and IT users to identify and agree on exact test scenarios taking into consideration multiple factors such as current system load, known issues/challenges, painful areas, and expected growth in the future. 

 

Plan and Design Tests

 

Create and agree on the schedule, test data, the specific configuration of the environment, and the team that will perform the testing.

 

Configure Test Environment

 

Our engineers will inspect the environment prior to testing, to assess its health and apply certain configuration changes required to support the testing and capture test results.

 

Test Execution

 

Execute test cases, monitor the executions, environment utilization metrics, and capture the statistics and trace log files. 

 

If you have more questions or you are interested in a performance review testing, contact us here and schedule a meeting!

 

And if you are interested in potential career opportunities, check out our careers page.

Error During Platform Update – “UpdateRetailSelfService.ps1 failed”

Starting the process of digital transformation for your company it’s not easy. In one of our previous blog posts, we shared how to install a deployable package like platform update/D365 version, and one of the errors we encountered in the Sync AX Database step.

 

As many of you know during the installation of the platform update you might encounter various errors. This time we would like to share a quick fix for the following error: “UpdateRetailSelfService.ps1 failed”

 

 

For this error try to start the Azure Storage Emulator on your D365 environment. As soon as you get the confirmation that the storage emulator is running you can click on the resume in LCS or rerun the failed step in your already opened cmd:

 

AXUpdateInstaller.exe execute -runbookid=”runbook1″ -rerunstep=52

 

 

Now the error is fixed.

 

No need to thanks us, we are glad to help you. So, if you are in need of someone to upgrade your systems from Microsoft Dynamics AX to Dynamics 365, we are open to future collaboration. Reach out to us here.

 

And if you are interested to be part of our team, check out our careers page we have open job vacancies all the time!

Sync AX Database Error – Installing Platform Update Deployable Package

If you are reading this blog post, you have encountered the same issues as us, so don’t worry you are not alone in this process.

 

For you who are for the first time here, you should check our previous blog post, learn how to install a deployable package like platform update/D365 version, and start the digital transformation of your company.

 


 

During the installation of the platform update package on your environment, you might get an error in the Sync AX Database step. Although there might be different errors when this step is executed the most common is the following (usually if you perform the installation on a local VM):

 

 

“The running command stopped because the preference variable “ErrorActionPreference” or common parameter is set to Stop: System.Management.Automation.RuntimeException: An exception of type System.Net.WebException occurred when making an http request to: http://127.0.0.1:80/ReportServer. Refer to the log file for more details.”

 

The error can easily be resolved following the steps below.

 

1. Open the SQL Reporting Services Configuration Manager (as an administrator).

 

 

2. Before clicking on the connect button check if the “Server Name” is the same as Computer Name.

 

 

3. The next step would be starting the SSRS server. If the server is already up and running please stop it and then again click on the start button.

 

 

4. As soon as you get a confirmation that the Report server is up and running you can continue with the installation of the deployable package using the command:

 

AXUpdateInstaller.exe execute -runbookid=”<name of the runbook>” -rerunstep=<step id where the update failed>

 

In our case this would be:

AXUpdateInstaller.exe execute -runbookid=”runbook1″ -rerunstep=25

 

Another error you can encounter in the process is “UpdateRetailSelfService.ps1 failed”, and here you can find our solution for it.

 

If you are in need of someone to upgrade your systems from Microsoft Dynamics AX to Dynamics 365, we are open to future collaboration. Reach out to us here.

 

And if you are interested in potential career opportunities, check out our careers page.

Installing a Deployable Package – Platform Update D365 Version

The digital transformation of your company will fundamentally change how you operate and deliver value to the end customer. No matter the industry you are in if you are using an older version of Dynamics, you should consider updating to Dynamics 365 version.

 

So, in this blog post, we are sharing the steps for installing a deployable package like platform update/D365version.

 

  1. Download the deployable package from LCS.
  2. Customize the necessary files for the update.
  3. Execute the commands using the axupdateinstaler.exe.

 

Before we jump into the process of installing a deployable package we would like to point out that you’ll need to:

 

1.1. Download the deployable package from LCS. When the file is downloaded check the general properties and make sure that they are like in the photo. (if there is a checkbox “unlock” make sure it’s marked)

 

 

1.2. Unzip the file in a new location. For example, C:\package. This should be done because of the length of the file path (just avoid using downloads or temp and MAKE SURE your folder doesn’t have space characters)

 

1.3. The package should look like this:

 

 

2.1. In that folder find the file: DefaultTopologyData.xml Right click and edit. Leave the notepad window open.

 

 

2.2  In the same folder open cmd as an administrator

 

 

2.3. Execute the command: AXUpdateInstaller.exe list

 

 

2.4. Copy all of the services you’ve got from the cmd command into the DefaultTopologyData.xml file ( <string>XXX</string> ) and save the file.

 

<ServiceModelList>

<string>AOSService</string>

<string>DevToolsService</string>

<string>ALMService</string>

<string>BIService</string>

<string>DIXFService</string>

<string>MROneBox</string>

<string>PayrollTaxModule</string>

<string>PerfSDK</string>

<string>ReportingService</string>

<string>RetailCloudPos</string>

<string>RetailHQConfiguration</string>

<string>RetailSDK</string>

<string>RetailSelfService</string>

<string>RetailServer</string>

<string>RetailStorefront</string>

<string>SCMSelfService</string>

<!– DefaultTopologyData are only for dev vhd, which we only support AOS update–>

<!– Create a new topology data for your Cloud AX topology–>

</ServiceModelList>

 

3.1. On the currently running cmd windows execute this command:

 

AXUpdateInstaller.exe generate -runbookid=”runbook1″ -topologyfile=”DefaultTopologyData.xml” -servicemodelfile=”DefaultServiceModelData.xml” -runbookfile=”runbook1.xml”

 

(note: the “runbook1” and “runbook1.xml” are just an example, type your text as you want)

 

This command would generate the runbook that will provide step-by-step instructions for updating the environment.

 

3.2. Next, execute the following command:

 

AXUpdateInstaller.exe import -runbookfile=”runbook1.xml”

 

3.3. And the last step is:

AXUpdateInstaller.exe execute -runbookid=”runbook1″

After successful deployment, the cmd will look like this (the number of steps may vary but you need to get the last step completed and get a clean command line)

 

 

After all the steps are done the D365 should have the desired platform update/ version.

 

*Note: If any of the steps fail you can use this command to rerun the deployment from the step that failed after troubleshooting it:

 

AXUpdateInstaller.exe execute -runbookid=”runbook1″ -rerunstep=25

 

If you are in need of someone to upgrade your systems from Microsoft Dynamics AX to Dynamics 365, we are open to future collaboration.

 

Reach out to us here, and if you are interested in potential career opportunities, check out our careers page.

AZCOPY for Easier and Faster Download of Files

Those of you who are familiar with the struggle of waiting hours for downloading a file from LCS (either for the Platform Update zip files or the Database backups from the Asset Library) can now benefit from the AzCopy app.

 

First things first and that means downloading the azcopy application which can be found here.

 

After downloading it, extract the zip file into the desired location (in my case is the “C:\” Drive).

 

 

 

 

Now, to use it we need to open cmd from the folder where you’ve extracted the zip file (or open cmd and navigate to that folder).

 

 

The command that we are going to use is:

 

azcopy copy “<Source Destination>” “<Desired/Target Destination>” –recursive=true

 

Based on the command above we can see that we have two parameters which be changed based on our activity.

 

As an example, I am trying to download the PlatformUpdate package to my local VM and for that first, I’ve logged in to the LCS and picked up the desirable package from the AssetLibrary but only to get the download link which I’ll use in the command.

 

 

Now equipped with what we need we can modify the command to suit us.

 

*NOTE: Please look at the end of the second parameter. You can notice that I’ve named my file as “pu10_16.zip”. If you don’t specify the name and especially the type of file your downloading, the azopy will download it as type “file” and you don’t want that cause it will be of no use for you.

 

azcopy copy “https://uswedpl1catalog.blob.core.windows.net/product-navproductname/6567e2af-004a-4f7b-91a1-d41fcca4e095/NavProductName-22-10-6ffd92c1-b99d-4d62-9a2c-4f3278adc44d-6567e2af-004a-4f7b-91a1-d41fcca4e095?sv=2015-12-11&sr=b&sig=yTbGuo9taddUO%2FtpUzrr65XZkTE58O5rA9PEhU9dVjc%3D&se=2021-01-29T09%3A37%3A05Z&sp=r” “C:\Platform_Update\pu10_16.zip” –recursive=true

 

 

You can see that my 5GB were downloaded in less than 20 minutes (way faster than using the regular download). Satisfied with the results I can now continue with deploying the platfrom_update package to my local D365 VM.

If you need to do the same there is another blog regarding the installation of platform update packages on the following link.

 

If you are interested in optimizing/improving your business processes, making the experience while using the application a whole lot easier in the long run, having the data secured in the cloud at the same time, and in need for someone to upgrade your systems from Microsoft Dynamics AX to Dynamics 365, we are open for future collaboration.

 

Reach out to us here, and if you are interested in potential career opportunities, check out our careers page.

The First Features Release Wave for 2021 Is Here – Dynamics 365

Brace yourselves, the first release wave for 2021 is here and it has some cool features. The newest release wave describes the new features releasing from April until September this year, and the first sneak peek can be accessed today.

 

The features are going to cover a broad range of functional areas, which we summarized it in a few points, and for the details, you can read more in the release plan online. Be prepared to take the chance, test, and validate all the new features and capabilities that will be a part of the 2021 release, before they are live for your users.

 

Finance and Operations

 

Dynamics 365 Finance

 

Dynamics 365 Finance continues with the lead in bringing in intelligence and automation to the users. With this release users experience out-of-the-box machine learning for their different financial operations.

 

Also, this release in core finance is focused on incorporating capabilities into the cash flow forecast and continuous enhancements across all financial areas.

 

Dynamics 365 Supply Chain Management

 

Dynamics 365 Supply Chain Management is expanding the inventory and logistic scenarios for chain management increasing transparency and efficiency for Asset Management users. Another thing is that it’ll help in reducing training time and cost, and increasing productivity of warehouse workers with a fresh, user-friendly mobile application.

 

Dynamics 365 Project Operations

 

Dynamics 365 Project Operations in the 2021 release wave 1, Microsoft will deliver functionally rich experiences in several areas such as the ability to forecast, use, and invoice nonstock materials on projects.

 

It will enable the ability to set up contractual commitments like billing methods and chargeability rules by the task or a work breakdown schedule element, and it will enable customers using the Dynamics 365 Project Service Automation application to upgrade to Project Operations.

 

Dynamics 365 Guides

 

Dynamics 365 Guides is a mixed-reality application that displays step-by-step holographic instructions right where the work happens, enabling employees to quickly learn and execute complex tasks.

 

In this release wave, the Dynamics 365 Guides team is focusing on intelligent workflows. Additionally, new entities for completion time will enable customers to build Power Automate flows that support their unique enterprise needs.

 

Commerce

 

As we mentioned in one of our previous blog posts, this year Microsoft has big plans for commerce, especially by introducing cloud for retail. Besides that, commerce expands the native integrations with Bing for Commerce search for product search, as well as Customer Service and Power Virtual Agents.

 

Human Resources

 

Through integration APIs and strategic partnership Dynamics 365 Human Resources continues to broaden the human capital, providing a better employee experience with a consolidated view of benefits for employees.

 

Sales

 

On the other hand, Dynamics 365 for Sales is focused on adding productivity enhancement for sellers, helping them in the decision-making process by providing data-driven insights. The updates will tackle automation, conversation intelligence, and enhancement to the mobile dashboard for a better experience for sellers on the go.

 

Dynamics 365 Customer Insights

 

The audience insights will enable every company better understanding of the customer data by adding customization and extensibility capabilities of the customer view, additional connectors for data ingestion, better controls for AI-based unification, and much more.

 

Besides that, the engagement insights capabilities will enable individual and holistic analytics over different device usage.

 

Customer Voice

 

Will take the customer’s feedback on a whole another level, by expanding the capabilities to collect feedback with a lot of different customized survey options. Additionally, creating follow-up action workflows will be much easier with the Power survey response trigger.

 

Service

 

With the all-in-one contact center, the Dynamics 365 Customer Service will ship with a logistic and integrated first-party voice and chat solution, which will enable customers to be up and running quickly.

 

Marketing

 

The improvements in Dynamics 365 for Marketing definitely are going to enhance marketer’s reach, analysis and with the help of AI, are going to deliver deeper personalization and different channels for customer engagement.

 

SMB

 

Dynamics 365 Business Central with the new features will simplify and improve the way Microsoft Partners administer tenants, and how the managing of licensing and permissions is done. The integration will also include Microsoft Teams and Visual Studio Code, which will help in providing modern development tools.

 

Check all the key dates for the 2021 release wave 1 here.

 

If you are interested in optimizing/improving your business processes, making the experience while using the application a whole lot easier in the long run, having the data secured in the cloud at the same time, and in need for someone to upgrade your systems from Microsoft Dynamics AX to Dynamics 365, we are open for future collaboration. Reach out to us here.

 

And if you are interested in potential career opportunities, check out our careers page.

What a Busy Year It Was – 2020 Recap

2020 brought unexpected challenges to the world of business and everyone around us. For Axapta Masters, 2020 has been a busy and very successful year!

 

Despite all the challenges we faced together with the start of the world pandemic in 2020, we can proudly say that we hit our targets and grew our team even more. Covid-19 didn’t stop us — with our shields (masks) on and we are ready to tackle 2021!

 

So, here are our highlights of 2020.

 

Microsoft Gold Partner

 

It’s official, our hard work and dedication paid off — the “Gold title” has our back and all we can say is a big thank you to the whole team who contributed to this. Nothing would be the same without you. Cheers!

 

 

“Becoming a Microsoft Gold Partner has only proven our expertise and effort we have put in the previous years. Besides that, it will definitely benefit our clients in terms of improving and widening our services portfolio and technical expertise.

 

Axapta Masters is a company with a strong core team, and we are thrilled to have a team of professionals, who are up to date with the latest Microsoft Dynamics 365 technologies and applications. The goals for 2021 are high, and we can’t wait to share our next big thing in the following months.”

 

– Managing Partners at Axapta Masters

 

Company Growth

 

In the other news, despite all the challenges, working from home and hours of online meetings, our team grew by 32%. We expanded the company departments and opened new ones.

 

Besides that, our internship program had 26 interns, our team passed more than 60 certification exams and more than 20 internal workshops have taken place.

 

“Despite all the difficulties in the past year that the entire world public faced and still faces, we as a company with well-built policies and methods, have managed to maintain and even experience growth in every field. In terms of a larger number of customers, increased workload, and thus a large number of employees, which something in a pandemic was a challenge for each of us.

 

Certainly, our well-organized policy did not allow these changed circumstances to affect our employees, as well as our company as a whole. I must say, the flawless correlation and commitment of the company and employees were one of the conditions for the growth and success of our company in these challenging times. Huge thanks to all our employees who are more than dedicated in these challenging times.”

 

Natasha Apostolovikj Gjorgjievska, HR Manager at Axapta Masters

 

ISO Certification & Macedonian Localization Package

 

As we strive to grow, we also strive to be better in any way –  Axapta Masters successfully completed the ISO certification process!

 

With ISO 9001, 20000-1, and 27001, we aim to provide a practical and workable Quality Management System improving all areas of the business with consistent high-quality delivery of services internally and externally for extended networks and end-customers. This includes monitoring, reviewing, maintaining, and improving the company’s information security management system.

 

Besides working with global clients, we managed to deploy the Macedonian localization package, and we had our first Macedonia rollout. We are delivering high-end solutions and 24/7 support for any client, so feel free to reach us out at here, we’ll gladly help you with our services.

 

Online Hangouts

 

In 2020 our team, altogether had 5373 days working from home, but Covid-19 didn’t stop the team spirit. In fact, it even gave us the opportunity to be more creative while spending our online time together.

 

Our goal is to grow as a team and reach 100 colleagues in 2021, so if you are interested in a new career opportunity, check out our careers page and tell us your story!

Data Upgrade from Microsoft Dynamics AX2012 R2 / AX2012 R3 to Dynamics 365 for Finance and Operations

Upgrading Microsoft Dynamics AX2012 to Dynamics 365 Finance and Operations brings the digital transformation in most companies by giving them the ability to use significant new features and capabilities.

 

Recently, we have added another successfully completed data upgrade project for one of our clients in our portfolio. If you are looking for some help while upgrading from AX2012 R2 or Ax 2012 R3 to Dynamics 365 then you are at the right place.

 

This process contains several phases:

 

  • Preparing the database in the AX2012 environment
  • Installing a deployable package on the D365 development environment
  • Migrating upgraded database from D365 one-box to sandbox environment

 

 

 

AX2012 Procedure

 

The process starts in the AX 2012 environment where you have to prepare the ax2012 database for upgrading to Dynamics 365. Microsoft has put together a pre-upgrade checklist that has to be installed in Dynamics AX 2012. The checklist ensures you have updated information in your database for the AX 2012 to D365 upgrade.

 

 

After the installation of the hotfix, run the sysCheckList classes to prepare the database. After executing the process in the AX2012 environment we must make a backup from this database and transfer it to the D365 development environment. For transferring databases between environments, we will use Microsoft Azure Storage.

 

D365 Procedure

 

Most of the errors must be resolved in this process while installing the data upgrade deployable package.

 

The process on D365 development environment is following:

 

  1. Restore and rename the database.
  2. Install deployable package.
  3. Made another back up from this database and restore it to prepare it for Tier2 environment.
  4. Export a bacpac file for transferring

 

 

Restore the Database

 

After restoring the database on D365 environment we need to rename the names of the databases. Rename the original AxDB to AxDB_Orig and then rename the newly restored database to AxDB.

 

Install a Deployable Package

 

Download data upgrade deployable package from Shared asset library from Software deployable package, find the data upgrade package that corresponds to your upgrade.

 

If you’re upgrading from AX 2012, the package name starts with AX2012DataUpgrade-x-x-x where x-x-x is the application release. Select the package that corresponds to the release you are upgrading to. After downloading extract it and install it.

 

Make a Back-up to Prepare the Database for Tier 2

 

After the installation of the deployable package completes, we need to make back up from this database and restore it again in this environment. We will do this because we will delete some objects from it to prepare for the sandbox environment.

 

Do the following steps in SQL management studio against the newly imported database:

 

  • Update sysglobalconfiguration table

 

  • Drop procedure XU_DisableEnableNonClusteredIndexes and drop following users: axdbadminaxdeployuseraxmrruntimeuseraxretaildatasyncuseraxretailruntimeuser

 

  • remove NT users as these are not supported in Azure SQL Database

 

  • remove any AX 2012 RTM model store procedures that still exist

 

  • If you receive a message that you cannot delete users because they own a schema, then check which schema the user owns. Either change the ownership to another user (for example to do) or drop the schema if it does not contain any objects.

 

  • drop all views in the current database because some refresh the tempDB, which is not a supported action in Azure SQL Databases

 

  • Drop MaintainShipCarrierRole procedure because it contains a tempDB reference that is not supported in Azure SQL Database

 

  • Export a bacpac file for transferring 

 

After all this, the last step on the development environment is to export a bacpac file that should be imported in a sandbox environment. Go to the following location and execute the following command for exporting the file

 

A Process on the D365 Sandbox Environment

 

After transferring the database, we need to do the following steps:

 

  • Import the database;
  • Create users and prepare the database;
  • Rename the database;
  • Full database synchronization.

 

Import the Database

 

Import the database into the sandbox environment.

 

Create Users on the Newly Imported Database

 

Create users that were dropped in the preparation procedure. The passwords for the users must be copied from the LCS from the environment where we are importing the database. After users are created, alter the database with the required configuration.

 

Rename the Database

 

Full Database Synchronization  

 

Run full database synchronization and after it completes successfully you are ready to use the environment.

 

If you are interested in optimizing/improving your business processes, making the experience while using the application a whole lot easier in the long run, having the data secured in the cloud at the same time, and in need for someone to upgrade your systems from Microsoft Dynamics AX to Dynamics 365, we are open for future collaboration.

 

Reach out to us here, and if you are interested in potential career opportunities, check out our careers page.

Starting 2021 with Big News – Microsoft Introduces Cloud for Retail

Retail is one of the industries that faced a big digital leap in 2020. We can say that customers no longer see the shopping experiences as an only offline activity.

 

With the announcement of the new B2B e-commerce capabilities for Dynamics 365, you can give your customers more options to purchase, wherever they are, on any type of device.

 

 

Microsoft Cloud for Retail aims to connect experiences across the end-to-end shopper journey with integrated and intelligent capabilities.

 

By bringing together disparate data sources across the retail value chain, we will enable retailers to realize the true value of their data by enriching core business processes and turning data into actionable insights. ” –  Shelley Bransten, Corporate Vice President, WW Retail & Consumer Goods Industry

 

The announcement was made as the company ramps up its presence at the NRF 2021 BIG Show virtual event.

 

 

Everyone who is part of the retail industry, needs to approach the new world we are living in with a digital-first mindset. Is your business ready for the digital transformation in 2021?

Save a Predefined Query to Use for All the Users

If you have a business requirement that requires saving the filtered query to use it later for all the users (whenever the user opens some form, this form will be opened as it is on the predefined query)– that means that you would need to make new development.

 

My requirement was the following: For all users whenever they open this form “All project quotation” from “All Customers” the form should be opened as It is on the predefined query, and they wanted to be able to change this query when is needed.

 

Step-by-step Instructions for Dynamics 365

 

1. The first step is to create a new table where you can save a filtered query. The field should be a type of container to save the query run. I made the logic for this table in such a way that there will always have only one record.

 

 

2. Then we should create a new service class, controller, and contract to save the query.

 

For my requirement, I needed to save the SalesQuotationListPage_Proj query which is set on the property on the MenuItemDisplay – the menu item for the “All Project Quotation” form.

 

 

 

 

 

3. We need to create a new action menu item set the controller class on it, and to place this menu item somewhere in AX client so the user will be able to set this query as he wants.

 

4. After saving this query on the table now we should change the query on the original form with the saved one. For this purpose, I made the extension on the CustTable form (because my requirement was this form to be opened by All customers). I added a new Command button and copy the event handler Clicked to write the logic.

 

 

5. I created a new display menu item for the “All Project quotation” form and set the Form View Option to GRID. I made this because whenever I opened the form the detailed view was opened, this change helps me to solve that problem.

 

 

6. I Wrote a new event handler class and paste the event handler for the clicked method. You need to include the args.initialQuery()to set the saved query.

 

 

Note: Also there is another way to change the query on the existing form, you can use Chain Of Command. New extension class for the “All project quotation ” from and put this code args.initialQuery(query) in the Init() method before next().

Generate a New Voucher Number for Each Inventory Journal Line

If you have a business requirement that requires a new voucher number to be generated for each posted inventory movement journal line – that means that you would need to make customization to the out-of-the-box functionality for generating vouchers for inventory journals.

 

Out of the box functionality that we have so far is that a new voucher is being generated on:

 

  • Change date: For each different date in the inventory journal lines.

 

    • Example: If we have an inventory movement journal with 10 lines, 4 lines with date 1/10/2020, and 6 lines with date 4/10/2020, this setup would post the journal and generate 2 voucher numbers: 1 voucher number for the lines with the date 1/10/2020 and 1 voucher number for the lines with the date 4/10/2020.

 

  • Change date or item: For each different date or item in the inventory journal lines.

 

    • Example: If we have an inventory movement journal with 10 lines, 4 lines with item itemnumber1 and 6 lines with item itemnumber2 and all lines having the same date, then this setup would post the journal and generate 2 voucher numbers: 1 voucher number for the lines with the item itemnumber1 and 1 voucher number for the lines with the item itemnumber2.

 

This is defined in the setup of the inventory journal name:

 

AX2012: (Inventory management/Setup/Journals/Journal names, inventory/General/Voucher)
D365: (Inventory management/Setup/Journal names/Inventory/General/Voucher)

 

 

 

So, this blog post is about how to extend this functionality by enabling the generation of a new voucher per journal line.

 

Example: We have 10 lines in the inventory movement journal, and we want to generate 10 different vouchers -one voucher per journal line.

 

Step-by-step Instructions for AX2012

 

  • The first step is to extend the enum InventJournalVoucherChange and add a new option ‘Line change’:

 

 

    • After this step, we should be able to select ‘Line change’ as an option in the inventory journal name setup:

 

 

  • Then we should modify the class InventJournalTransData and override the initVoucher method. This method is the place where we can control the voucher number generation for each journal line.

 

 

  • Now, we want to keep the same logic for voucher numbers when the setup is ‘Change date’ or ‘Change date or item’.

 

    • For that purpose, we need to copy the code from the \Classes\JournalTransData\initVoucher and add it in case the setup is ‘Change date’ or ‘Change date or item’. In case the setup is our new option ‘Line change’, then we need to add a code that will generate the new voucher number.

 

    • After these changes the initVoucher method on the InventJournalTransData should look something like below:

 

 

  • Now, when we create an inventory movement journal with 10 lines and post the journal, we will see 10 different vouchers created for each journal line.

 

Step-by-step Instructions for D365

 

  • The first step is to create an extension of the enum InventJournalVoucherChange and add a new option ‘Line change’:

 

    • After this step, we should be able to select ‘Line change’ as an option in the inventory journal name setup:

 

 

  • Then we should create an extension of the class InventJournalTransData and using Chain of command we will add the new initVoucher method.

 

    • Please note that this solution needs to call the super() (next call) and for that reason is going to create a new voucher number in the super call, and then we are going to override that voucher number with a new one.

 

  • Now, when we create an inventory movement journal with 10 lines and post the journal, we will see 10 different vouchers created for each journal line.

Microsoft Dynamics 365 Applications – What’s New

More and more companies, especially now given the state of the world, opt for digital transformations in many sectors of their businesses. Microsoft has followed this movement every step of the way of providing its clients with customizable solutions to best suit any businesses and their needs.

 

Thanks to the variety of available solutions for digital transformation fit for financial services, retail, healthcare, and much more, Microsoft has been able to help its clients adjust seamlessly to the ever-growing technological demands that arise.

 

On this topic, you may come across new and recently updated Microsoft Dynamics 365 suite.

 

Microsoft Dynamics 365 Applications

 

Microsoft Dynamics 365 is a total business software package, ERP, and CRM solutions, comprised of multiple applications. Applications offered are Sales, Customer Service, Field Service, Human Resources, Finance, Project Operations, Supply Chain Management,  Commerce, Project Service Automation, Marketing, and Business Central.

 

What is important to note here from the aforementioned is the news regarding splitting Dynamics 365 for Finance and Operations in new separated applications that covers parts of the business functionalities that offer one ERP system.

 

What was formerly known as Dynamics 365 Finance and Operations has now been split into separate applications and with that, we now have Dynamics 365 Finance, Dynamics 365 Supply Chain Management, Dynamics 365 Project Operations, Dynamics 365 Commerce, and Dynamics 365 Human Resources. This change was made in order to offer greater flexibility to the users to apply the applications per their business processes’ needs.

 

Let make a quick overview of what the new applications offer to the Microsoft Dynamics 365 community.

 

Dynamics 365 Finance

 

Dynamics 365 Finance is the application used to simplify and automate global financial operations. This is the only solution you will need for all financial plans and decisions.

 

With Finance, all company expenses can be automated, saving on time and manpower. Automated financials results in greater control over regular expenses, cash flow, budgeting, and much more.

 

In addition, coming soon there will be Finance Insights with which predictions of financial success would become much easier and more accurate.

 

 

  • Increased awareness of company-wide finances with real-time analytics;

 

  • Taking advantage of AI with machine learning, predictive recommendations ensures an increase in profits and simplifies decision making;

 

  • Simplified financial planning and budget control with financial process automation;

 

  • Ensured compliance with local (and global) financial and business requirements with customizable payment, tax, and reporting formats.

 

Dynamics 365 Supply Chain Management

 

Dynamics 365 Supply Chain Management is the new application used to streamline all company operations from production to transportation and more.

 

Apart from automation of supply of stock, with which overstocking or lack of stock can be avoided, with Supply Chain Management you can modernize warehouse management as well as prolong the life of equipment with regularly scheduled maintenance aided by IoT and mixed reality.

 

 

  • A greater understanding of warehousing capacity, shipping operations, and turnover of materials in real-time;

 

  • Improvement of manufacturing operations and delivery processes by using machine learning and increase the productivity of people, processes, and equipment with mixed reality;

 

  • Ensured timely availability of necessary materials and products on designated locations with automatization of supply chain operations;

 

  • Increased product quality with integrated quality-control.

 

Dynamics 365 Commerce

 

Dynamics 365 Commerce, formerly known as Retail, offers its users a full omnichannel solution that unifies back-office, in-store, call center, and digital experiences.

 

With Commerce, retailers can forge a stronger connection and have a better understanding of their customers’ needs. With this solution, online stores work seamlessly on any device.

 

 

  • Ability to engage with customers at any stage and have access to a comprehensible view of every client;

 

  • Highly scalable to fit the specific needs of e-commerce;

 

  • Simplify the creation of interesting and intelligent storefronts with easy-to-use development tools;

 

  • Maximize profits and customer loyalty by using all AI has to offer, from targeted recommendations to insights.

 

Dynamics 365 Human Resources

 

Dynamics 365 Human Resources is an application for people. Any company that cares for its employees wants to make their day to day office life simpler so they can focus on more important things.

 

With this solution, all HR-related questions are easily accessible to the employees through self-service tools. HR management has never been so simple as this app can be easily tailored to fit companies of any size and help them simplify and organize all HR programs such as compensation, benefits, absence, and more.

 

 

  • Keep track of employee KPIs, certifications, training, and skills by creating detailed employee profiles;

 

  • Very adaptable allowing any company, whatever size or vocation, to successfully scale, extend, and connect to existing systems;

 

  • Ability to optimize HR programs by simplifying absence reporting, optimizing benefits, managing recruiting, and much more.

 

Dynamics 365 Project Operations

 

Dynamics 365 Project Operations is the latest release and it’s set to be available in October of 2020. Project functionality that used to come native to Dynamics 365 Finance and Dynamics 365 — Project Service Automation will now be merged and available as Dynamics 365 Project Operations.

 

Businesses that work with project-based services know that this is cooperative work. Dynamics 365 Project Operations was created with this in mind, so the goal is to unify operational workflows within a single application for increased productivity and timely project delivery.

 

 

  • Greater visibility for better collaboration between previously disconnected systems with the goal of precise tracking of project expenses, delivery dates, timely billing, and more;

 

  • Supply teams with the right insights to better understand every step made with visibility into the back-end and front-end processes of the same application;

 

  • Faster client billing and reimbursement with simplified processes of reporting time and expenses.

 

These are only a few of the capabilities of these new applications. Now as Microsoft keeps up to date with the needs of its users, so do we. As a Gold Partner specialized in delivering Microsoft Dynamics 365 services that cover the ERP part of the suit, we keep up with the latest Microsoft updates and help our clients to adapt more easily.

 

The developers and consultants here at Axapta Masters are skilled at these new applications and up to the task of assisting our clients as they begin to integrate them for themselves.

 

If you are interested in our services, or you have an idea of how can we help, feel free to drop us a line in the Contact section.

Microsoft Introduced Dataflex Pro as the New Rebranded Common Data Service

Microsoft rebranded the Common Data Service which represents the data storage and management foundation of Power Platform.

 

This change is part of Microsoft’s plan to connect Power Apps with Microsoft Teams, enabling easy and simple usage empowered with more functionalities to its users.

 

CDS is very popular and well-known in the Microsoft Dynamics Community as well. It is widely used at our clients and we are exited to see the new capabilities with Dataflex.

 

Microsoft Dataflex Pro delivers a built-in, low-code data platform for Teams, and provides relational data storage, rich data types, enterprise grade governance, and one-click solution deployment.

 

Microsoft Dataflex enables everyone to easily build and deploy apps and intelligent chatbots in Teams with Microsoft Power Apps and Microsoft Power Virtual Agents. – said Charles Lamanna CVP Microsoft 

 

Dataflex Pro enables people and organization to create and run thousands of applications, flows and intelligent agents with smart, secure, and scalable low-code data platform. Representing all the Common Data Services capabilities available for using in Microsoft Teams, Dataflex Pro enables more productive and collaborative working environment.

 

 

Microsoft Teams and Power Platform is shaping the future of work with low-code application to streamline the business processes in the organization. This new functionality enables users to easily build applications and bots directly within Teams, empowering business users to rapidly respond to changing business needs and create custom solutions.

 

With the addition of Microsoft Dataflex Pro, Teams users now have key business data at their fingertips to build new apps that address real business problems — all without ever leaving Teams.

 

With Dataflex, Microsoft expands the possibilities of using Microsoft Teams as a central application for serving an organization’s operational requirements both with custom-built applications and chat bots. This means a step further into the digital transformation empowering organizations to:

 

  • Deliver services with agility – adding business value with an extensible data platform that use open ecosystem enabled with Common Data model;

 

  • Increase scale and efficiency – boost productivity, decrease the risk, reduce costs and increase agility by quickly developing applications;

 

  • Make data work smarter – getting more accurate insights by adding low-code AI tools to the process automation;

 

  • Rely on the security of a trusted platform – protect the company data with a robust security management infrastructure.

 

Microsoft Dataflex can offer a streamlined experience for Teams users to configure data models and manage security. Functionally, the Teams-focused Dataflex offer possibility for its users who need access to entities and data for creating apps and bots but should not touch the more complex tools and systems that IT controls like security, data loss prevention, and database architecture.

AXUG Summit and Microsoft Ignite l The Tour 2019 Recap

Here are a few words on how we experienced User Group AXUG Summit Europe in Amsterdam and how it will imply to us throughout the year.

 

We are happy we experienced a well organized, interactive, and worthful conference this year that grabbed our attention longer than expected. We met great people and discussed possible future collaboration, talk business issues, and explored different solutions.

 

It will be useful for us in the future in terms of how to dedicate our current strategies and which points should get more time and focus by our side.

 

Instead of AXUG 2018 in Dublin where we held a presentation about: “How to be in control of your Dynamics365 integrations”this time, in cooperation with our client Terberg, we decided to attend as more lectures as we can and deep-dive into the amazing and engaging tech presentations.

 

 

Our people also took part in Microsoft Ignite in Amsterdam and Stockholm, where they had a chance to hear briefly on the future of cloud development, data, IT, and business intelligence and latest Dynamics products and services.

 

 

The picture above represents our developers during their Microsoft Ignite l The Tour Stockholm, where they selected from several custom ‘learning paths’ on the sessions, guided through the modules and workshops focused on Azure, Microsoft 365, and Dynamics 365. Actually, there were not several, but 100 + sessions and workshops and more than 350 experts to share their word.

 

Talking about Microsoft AXUG Summits, we have not missed any of those in-person tech happenings since 2016 and we plan to continue this way.

 

All of us who left our desks for a week in order to hear the great minds have a different exciting story to tell, but all wrapped together it was a month for educating and experiencing as much as possible in tech.

 

Do you already know if you’re going to attend Summit in Barcelona in March 2020? If yes, of course, we can meet there, but let’s not wait until the next year.

 

Reach out to us to discuss ERP issues you’ve considered in previous months.

Extending Standard Data Entity with Fields Coming From a View

When working with Microsoft Dynamics AX, we often encounter with situations where a standard table needs to be extended with more fields that come from a view, when the relation to the view is through RecId.

 

When using the table for data export and import the data management framework can not find the related record coming from the view, so this needs to be set manually in the findEntityDataSource method of the entity, which is used for the import export.

 

Because the scenario involves a standard table and a standard entity, we need to use an extensible solution and in addition of extending data entity we need to add an event handler method that is subscribed onFoundEntityDataSource event.

 

We all know that in our Microsoft Dynamics community we have a lot of challenges with extending the Data management framework, which is the reason for writing this blog post, simply because we wanted to share this findings and try to help and save some time to someone that encounters a similar scenario. 

 

In our case, we were extending the TSTimesheetLine table with fields from the ResourceCategoryView view.

 

Extending standard data 1

 

Next, we were extending the TSTimesheetLineEntity data entity and its staging table. On the TSTimesheetLineEntity we have also added the ResourceCategoryView as a data source and we added CategoryId field to the field list.

 

Extending standard data entity with fields coming from a view 2

 

 

Extending standard data entity with fields coming from a view 3

 

The AXMResourceCategoryField is not included in the staging table, because it’s the RecId relation field to the ResourceCategoryView and it is set to private in the data entity.

 

The logic that we added here, that is nowhere to be found in the standard Microsoft Dynamics AX, for finding related record of the view in the method that subscribes to the onFoundEntityDataSource event for finding and setting the related view record is as follows:

 

Extending standard data entity with fields coming from a view 4

Integration Between Dynamics 365 for Sales and Dynamics 365 for Finance and Operations

Large and multinational companies own multiple sources of data, and they are facing the problem to manage all of that company information, which is difficult and time-consuming.

 

Integration between various systems has always been a challenge to the software engineers. Communication between the systems and keeping the systems synchronized is one of the main points to focus on.

 

The purpose of this blog is to present a two-way integration, between Dynamics 365 for Sales and Dynamics 365 for Finance and Operations, and to give you just a quick glimpse of what our integration experts are working on for a client.

 

As a starting point was chosen the account module in Dynamics 365 for Sales and the customer module in Dynamics 365 for Finance and Operations.

 

After the initial integration of these modules, the plan is to integrate the following modules:

 

  • Opportunity
  • Quotes
  • Sales Orders
  • Demand Forecast Lines
  • Payment Terms
  • Delivery Mode
  • Delivery Terms
  • Sales Tax Groups
  • Customer Assets
  • Work Order

 

Account-to-Customer Module Integration

 

What actually means the integration between the two modules, account and customer?

 

Creating a new account in Dynamics 365 for Sales will result in a new customer created in Dynamics 365 for Financial Operations. Updating an account in Dynamics 365 for Sales will result in an update of the corresponding customer in Dynamics 365 for Financial Operations.

 

Deleting an account in Dynamics 365 for Sales will result with a delete of the corresponding customer in Dynamics 365 for Financial Operations.

 

The purpose of this integration is to increase the employees’ productivity, to make it easier for them to store the data in one system, and easier and more transparently to manipulate the data between the systems, keeping the information relevant and accurate.

 

 

So, where do we start?

 

Microsoft Dynamics 365 offers out-of-the-box web service end-points for communicating, accessing and tracking data and objects.

 

In Dynamics 365 for Sales, there is SOAP web service end-point known as Organization Service and a HTTP REST API known as Microsoft Dynamics 365 Web API. In Dynamics 365 for Finance and Operations, the web service end-point is knowns as OData, a REST end-point based on open data protocol.

 

The URL of the Organization’s Service end-points is used to generate service proxy classes. The URL of the OData end-point is used to generate OData classes.

 

Plug-in Registration Tool

 

Plug-in registration tool will be used to deploy assemblies containing the implementation code as separate packages.

 

Architecture

 

Integration between different systems has always been a challenge. Keeping the data and the system synchronized was never an out-of-the-box solution.

 

We will try to keep our system architecture as simple as possible. We can distinguish different processes and states of the system.

 

The following components are parts of the solution:

 

  • Dynamics 365 for Sales
  • Dynamics 365 for Finance and Operations
  • Azure Active Directory
  • Azure Service – WCF
  • Azure Service Bus
  • Subscription Listener
  • Azure SQL – Master Data

 

In the next blog post, communication between the systems and the workflow among them will be explained in details. Stay tuned.

Impressions from the AXUG Summit EMEA 2018

Dublin. 2 weeks ago. AXUG Summit EMEA.

 

It was our second year in a row to be part of this amazing happening and again, three days weren’t enough for such a positive time spent, sharing knowledge and becoming up to date with greatest minds in our industry.

 

dublin summit emea

 

Not only a classical visitors but this year we experienced the famous Summit EMEA’s spotlight and freedom to speak about us and present our working challenges and results gained in front of other Microsoft Dynamics experts. It was such an incredible experience for our colleagues who made it.

 

how to be in control of your integrations

 

The Showcase elaboration was directly related to our appreciated client TERBERG, a manufacturing company and one of the largest independent specialist vehicle suppliers, coming from the Netherlands.

 

The presentation was titled “How to Be in Control of Your Dynamics365 Integrations” and what really encouraged us was that it opened a lot of discussions and questions by the listeners. In the given 90 minutes on the stage, we succeed to describe the integration project we are working for the last year all together with Terberg to harmonize their majority of processes.

 

axapta masters and terberg presentation and

 

We are grateful to all of you who decided to come and join us. We recommend a participation in such an event because there is always unpredictable moments, meetings and stories you’ll hear that will change your perception of view. Summit EMEA is the right place to expand your network, to meet new people from the industry and of course to benefit from such a valuable experience while applying the new-gained knowledge in practice.

 

Not to forget to mention our Technical Architect Riste Marevski and our Partner Peter Meekes who gave their best on the stage, sharing a detailed working process of the project and the successful results.

 

You can check out the video of the whole presentation here:

 

 

The Latest Update from Microsoft about Dynamics 365: Microsoft Brings Artificial Intelligence and Modular Apps to Dynamics 365

At Microsoft’s Ignite Conference, taking place this week in Orlando, Microsoft unveiled several updates to its technology portfolio, including a tighter integration between its LinkedIn and Microsoft 365 properties, and artificial intelligence capabilities for its customer care solutions in Dynamics 365.

 

Microsoft Ignite

 

“The nature of work is changing,” said Satya Nadella, Microsoft’s CEO during his keynote. “It’s no longer about routine tasks; it’s about unlocking the creativity inside your organization.

 

It is about going beyond individual productivity in dynamic teams; it is about ensuring the security of your digital estate, really changing the frontier of simplicity of managing the digital estate, and that is what’s driving us to build Microsoft 365.”

 

This powerful speech from Nadella affirms the digital transformation started by their vision and allocated through their new technology improvements aimed for the companies’ adaptation in the constant changing environment.

 

Satya Nadella

Dynamics 365 AI Solutions

 

When it comes to Dynamics 365, Microsoft announces a portfolio of new capabilities at the conference, which are including expansion of Dynamics 365’s intelligence capabilities with “Dynamics 365 AI solutions” that are designed to deliver high-value and complex enterprise scenarios.

 

These new Dynamics 365 AI solutions run on the existing Microsoft’s platforms in AI and machine learning. The first of the solutions is innovated for customer support and engagement teams in a form of “virtual agents”.

 

The virtual agents engage with the customers in order to receive real-time suggestions about their problems, and also a real-time feedback, which helps them to train more effectively to become even more effective over time. This AI solution is already used by worlds’ biggest retailers and is handling more than 650 000 sessions weekly.

 

Modular Apps

 

Kept in mind that customers need more targeted solutions, Microsoft introduced modular SaaS applications which allow the business users to transform a single process. These apps are meant to be used every day, and take advantage of the existing data, connect to existing data and deliver insight from the other Microsoft’s product to deliver meaningful results.

 

Microsoft introduced two modular apps: Dynamics 365 for Talent: Attract and Dynamics 365 for Talent: Onboard, which will allow its users to perform more effectively and more easily the attract and the onboard activities in the hiring process, using Human Capital Management capabilities module.

 

Also there are announced improvements within integrations between Dynamics 365 with Linkedin, as well with other productivity apps, delivering new opportunities and improved user experience.

 

Another upcoming integrations from Microsoft include Microsoft PowerApps and Microsoft Power BI which will allow to embed contact information from Linkedin and to create and analyze detailed reports.

 

Microsoft continually improves its products and services and also create powerful integrations of the products, in order to achieve its mission – to empower every person and organization on the planet to achieve more.

 

If you are interested in finding more about Satya Nadella’s keynote presentation at Microsoft Ignite, take a look at this video:

 

Receive Goods After Invoice Posting in Dynamics AX – Myth or Reality?

Standard AX application supports purchase order processing in a way that goods need to be received before the invoice can be posted against the purchase order.

 

However, it is not possible to process the documents in the opposite way e.g. to post invoice first and then post the product receipt afterward.

 

The second scenario is getting quite common lately so there is a real need for such an option. There are different workarounds that accountants use to overcome this problem. But, every approach has downsides which make the problem even more complex when a big part of the trading is done this way.

 

To overcome this limitation, we designed a solution that complies with the standard AX processes and rules.

 

Standard purchase order processing flow requires the stock to be received in order to process and invoice. The general idea is to keep the same process and declare the received stock as “virtual stock”. This is achieved with an additional operation that redirects the stock to a different warehouse so-called “virtual warehouse”.

 

This virtual warehouse stores the stock that is not yet received but the invoice is already booked against the purchase order. This way the received goods will be physically available but in a separate warehouse that is treated in a different way. At the same time, a transfer journal is created from the virtual warehouse to the initial warehouse defined on the purchase order. The following diagram shows the high-level process:

 

Receive goods after invoice posting in Dynamics AX – Myth or Reality

 

The steps in orange are the additionally developed operations that execute automatically. The transfer journal lines reserve the stock received on the purchase order as a safety mechanism to ensure that it is impossible to move the stock from the virtual warehouse.

 

With this customization, we keep the accounting process the same. The only additional step is the one in green as this step marks the product receipt as a virtual. The steps in blue remain as standard for invoice and product receipt processing.

 

The purchase order processing has an impact on other processes like warehouse management, general ledger, and master planning. The following section describes the impact on each process.

 

Warehouse Management

 

The warehouse receiving procedure is usually executed using the “Arrival overview” form. This form shows all the expected arrivals including the arrivals originating from transfer journals. As we automatically generate transfer journals the expected arrival will appear on the screen. The process remains the same as arrival journals can be created and processed.

 

General Ledger

 

As the standard purchase order process remains in place the stock value is going to be booked on the main accounts specified in the inventory module. Just in the same way as standard product receipt and purchase invoice is booked. The virtual warehouse concept allows the accounting department to use the “Inventory value” report in order to determine the value of the “virtual stock”.

 

The results of the report can be used to transfer value to different accounts if required for any reason.

 

Master Planning

 

The master planning uses the warehouse stock as well as the orders to calculate the planned purchase orders. The stock in the virtual warehouse should be considered on the real receiving date and not as a physical stock before that date.

 

In order to achieve this, the virtual warehouse should be excluded from the MRP calculation. Since the real warehouses are included in the calculation the transfer journal will be considered with the receipt date. This is a standard configuration of the system and requires no customization.

 

Quality Management

 

In the case when there is a quality control enabled for the items received in the virtual warehouse the automatic quality order creation need to be skipped. Since items are not physically present it makes no sense to block these items. The quality control is postponed for the later stage when the warehouse workers receive against the transfer document.

 

Does it Really Work?

 

This is not just a design or an idea. It is a solution that was implemented at European customer that has intensive trade with vendors from Asia. The goods they purchase travel more than 2 months before they receive while they get the invoice at the time of loading.

 

The solution allows all departments to continue with their routines with no process changes and simplifies the accounting activities around these kinds of orders. Thus, it provides a better overview of the stock quantities and value as well as reduces the errors/differences caused by any workaround solution.

‘View Details’ Button Does Not Work on EDT Fields Used in Forms Displaying Records from Customized Tables

In previous versions of Microsoft Dynamics AX, table relationships could be defined in the Application object tree under the Relations node of either an EDT node or a specific table node.

 

Starting with Microsoft Dynamics AX 2012, the use of relations on EDT is obsolete and should be deleted in its future versions.

 

All table relations defined under an EDT should be migrated since they should be defined on tables only. If this is not done correctly, the ‘View details’ option can be unavailable for EDT fields used in forms displaying records from customized tables. This problem might occur even though the ReferenceTable property on the EDT is set to some table and this EDT matches the type of the primary index from the corresponding reference table.

 

Our team came to a different possible solution to this problem, which is explained in the text below:

 

Firstly, you need to create a self-relation in the table whose primary index matches the EDT.

 

view details' button does not work on EDT fields used in forms displaying records from customized tables

 

Another option is to create a hidden menu item button, which opens the main form of the data from the table whose primary index matches the given EDT.

 

Next, on the grid displaying the records from this table set this button as a default action. ‘View button’ option will appear on right-clicking the first field in the grid.

 

It is important to note that this is not the best solution since this works only on forms containing a grid with the corresponding table set as the main data source.

 

If you want to use this field from the same table in other forms, the ‘View details’ button won’t be shown again, unless the previously mentioned conditions are fulfilled. This approach is used in the Sales agreements list page.

 

edt fields

edt fields 2

 

edt fields 3

Personalization in Dynamics 365 for Finance and Operations

Dynamics 365 has a feature which allows the user to personalize their experience while working with the program. They can personalize the appearance, dashboard, work-spaces, and forms using different types of personalization. In this blog post, only personalization of forms will be explained.

 

The main benefit of Dynamics 365 for Finance and Operations personalization is that it only affects the user who did it, leaving the interface of the other users not changed at all. That is the main difference over the other previous AX versions.

 

Personalization Functionalities

 

Implicit Form Personalization

 

Column adjustment within a grid, expanding/collapsing fast tabs and fax boxes is part of implicit personalization.

 

  • Width adjustment of a column is same as in AX2012, just select the boundary between two column headings and drag to the required size.
  • FastTabs and FactBoxes in can be expanded/collapsed and Dynamics 365 automatically stores the personalization.

 

When the same grid is opened again, Dynamics 365 retrieves the personalization done on the columns, fast tabs and fact boxes from the last time.

 

Explicit Form Personalization

 

Explicit personalization is personalization done by explicitly using a personalization menu. Basic type of explicit personalization is achieved with right-click on a field and selecting Personalize. Personalize toolbar will be displayed.

 

personalization explicit form

 

This personalization method is used if a user wants to:

 

  • Change the label of a field;
  • Hide field;
  • Include field information in FastTab summary (if the element is on a FastTab);
  • Skip the field when Tab is pressed;
  • Mark filter as not editable.

 

Additional options for personalization can be used with Personalize this form option. This form offers a possibility to:

 

  • Add fields;
  • Unhide fields;
  • Move (reposition) field;
  • Clear, import and export personalization.

 

Personalize this form option can be opened either from the form’s Action pane, under the Personalize group of the Option tab or from the Personalize toolbar. When Personalize this form is opened, a new pane will be displayed on the page.

 

personalization in dynamics 365 hide field

 

The functions of the buttons are described in the following picture:

 

functions of the buttons

 

Personalization Options

 

Change Label of a Field

 

This can be done by using the more simplified personalization option. Right-click on a field and choose Personalize. Personalize toolbar will be displayed with the current name of the field. Just type the new name and close the form. So, the name of the field will be the new one you’ve just typed on the Personalization toolbar.

 

Selec Field to Personalize

 

With the Select option of the Personalize this form pane, the user can select field which will be subject of personalization.

 

Move Field

 

The first thing we need to know is that each field is related to a form area and it can be removed only within that area. Now, open Personalize this form and select the Move button. Choose a field you want to re-position and start dragging it. You will notice that it will get highlighted with yellow color and just drag it to the new position.

 

Hide Field

 

Important information to know is that mandatory fields cannot be hidden and when a field is hidden, the data of it is not changed, it is just the field that does not appear on the page. A field can be hidden in both ways, using Personalize toolbar or with Personalize this form.

 

  1. a) A field or column can easily be hidden with a just right-click on a field and selecting Personalize. The final step is selecting field Hide on Personalize form.
  2. b) Open Personalize this form, select Hide tool. Now mark the data fields that you want to hide. Close the pane and now the fields are hidden.

 

Show Field

 

The user can unhide a hidden field in this way: On action pane select Option – Personalize this form, select Hide tool. Now all hidden fields will be displayed and highlighted. Click on the field you want to unhide and again click Hide on the pane. Close the pane. Now, the selected field will be shown on the form.

 

Add Field to FastTab Summary Area

 

The Summary button should be used when a user wants numeric or string field to be shown in the FastTab summary area.

 

Skip the Field when Tab Is Pressed

 

This can be achieved by using Skip tool, using Personalize toolbar or Personalize this form pane. When Skip tool is chosen, all currently skipped fields will be displayed with shaded yellow color, so user can choose which of them should be included on the tab sequence.

 

Mark Filter as Not Editable

 

This can be done by using Edit tool in Personalize this form or Don’t edit checkbox on Personalization toolbar. When Edit tool is used in Personalize this form, all currently non-editable elements will be shown in a shaded container so that you can choose them to make them editable.

 

Add Field

 

Similar as hiding field, adding field can be done in two ways. The first way is using the simplified personalization form and the second one is using the advanced personalization form.

 

  1. a) Choose an area you want to add a field into. Right-click on it and select Personalize. Select + Add field button. A pop-up appears with all the fields that can be added. Select field(s) and press Insert. Now selected field(s) is added to the area you first chose.
  2. b) Open Personalize this form pane, click on the + Add field button and then select the form area you want to customize. Again, a pop-up appears with all the fields that can be added. Select field(s) and press Insert. Now selected field(s) is added to the area you first chose.

 

Manage

 

If you want to clear all existing customization on a form, import a previously saved personalization or export the current one, you can do that by using Manage tool in Personalize this form.

How to Set Up Team Foundation Server on Visual Studio in Dynamics AX 365?

In this blog post, we will provide you with the required steps to configure your VS to enable source control on your model.

 

Create a New Model and Project

 

The first thing we need to do is to create a new project and a model which will be used for that project. You can find out here how to do that.

Connect to Team Foundation Server

 

The next step is to connect to your Team Foundation Server. To do this, we need to follow up these steps:

 

  • Open the Team Explorer window (View -> Team Explorer)

 

  • Click on the manage connection button and select Connect to Team Project

 

tfs1

 

  • From the newly open window click on Servers… button and add your TFS and connect to it

 

tfs

 

Create the Folder Structure

 

Before starting with development, we need to open the Source Control Explorer and create the following recommended folder structure in our team project.

 

 

tfs2

 

The source XML files organized by packages and models will be held in the Metadata folder and our VS projects will be in the Projects folder.

 

Mapping

 

Next step is to configure the mapping for the Metadata and Projects server folder to a local metadata/project folder that will hold our VS solution and project files.

 

Add the Descriptor

 

The last step required to be done is to add the mapping for the Descriptor or you will face the problem a lot of people encounter during this configuration “The model <ModelName> specified on the project cannot be found.

 

To do this first create such folders locally inside your model repository and drag/drop the Descriptor and XppMetadata folder from there to the TFS branch in the VS.  This will automatically create the mapping for these two folders.

 

 

You can then start with development in your newly configured environment.

Creating View Out of an AOT Query Object

The purpose of today’s featured article is to show how to create automatically view out of a query object in AOT, based on the selected query. This is a very helpful enhancement that provides easy testing with queries.

 

Iteration through AOT elements is done by using the TreeNode class which has very useful methods for finding a specific node, creating and compiling subnodes, retrieving their children and so on.

 

Creating a view and setting some properties through X++ code is showed below. The view is named as the query and by adding the ‘View’ suffix.

 

aot query object 1

 

But there is one problem when it comes to a query that has many data-sources and even some of them have nested data-sources. In order to solve this ‘inception’ problem, we need to iterate through all data-sources and add every field to the view.

 

The following code example shows how to iterate recursively through the data-sources and the addFields function adds the fields to the view.

 

aot query object 2

 

aot query object 3

 

At the end, the newly created view should be compiled and a data dictionary synchronization is recommended:

 

treeNodeView.AOTcompile();
SqlDataDictionary::synchronize();

How to Resolve Conflicts After Installing a Model in AX 2012?

As promised in our previous post, in this blog post we will describe the process of resolving conflicts occurred after installing a model.

 

Conflicts may appear after importing a model, if some of the elements included in the model are already in another model on the same layer. In that case, you can use the push option when importing the model:

 

(Windows PowerShell) –Conflict Push
(AxUtill) /conflict:push

 

The conflicting elements will be put into a new conflict model that is located in the patch layer for the current layer in the AOS. This new model will have a name that indicates it contains resources that have caused a conflict.

 

You can find the conflicting elements in this model and use the Compare tool to see the differences between the element in the path layer and the element in the main layer. Using that information and available actions from the Comparison form you can merge changes from the conflict model into an existing layer.

 

After you have resolved all of the conflicts, consider removing the conflict model from the patch layer. That way, somebody looking at the system will not assume that there are model conflicts that have to be resolved. If you are leaving a resource in the patch layer, move the resource out of the conflict model into another model in the patch layer. Then delete the conflict model.

 

Another scenario, where code conflicts may occur, is installing Cumulative updates or hotfixes (patch models) if the changes of affected elements may be over layered by customizations in higher layers.

 

Let’s assume that you are currently working on CUS layer. You have to install patch provided by ISV and this patch model will be installed in the ISP layer. You may potentially have changes on elements in ISP that are over layered/modified in CUS layer and code conflicts will be occurred between these layers.

 

For resolving these conflicts, Detect code upgrade conflicts tool can be used from Tools – > Code upgrade

 

resolving-conflicts after installing a model in ax 1

 

NOTE: Although no baseline database is required to run code pattern detection, analysis of layer conflicts requires that you configure a baseline database before you run this task.

 

Therefore, you need to create a baseline database from the database you’re using before installing the model, then you need to configure the baseline database on the AX server. Follow these steps to configure the baseline database:

 

  1. Close the Microsoft Dynamics AX client.
  2. Open the Microsoft Dynamics AX 2012 Server Configuration utility (StartAdministrative Tools > Microsoft Dynamics AX 2012 Server Configuration).
  3. If there is no editable configuration, create a new one.
  4. On theDatabase Connection tab, set the Baseline database name value so that it is the same as the Database name
  5. Restart AOS.
  6. Reopen the Microsoft Dynamics AX client, and continue with the upgrade.

 

Now, you can run the task for detecting code upgrade conflicts. After finishing, 3 projects may be included:

 

– Private project AxUpgradeLayerConflicts_<layer>
– Private project AxUpgradeRecIdConflicts_<layer>
– Private project AxUpgradeRuleConflicts_<layer>

 

In the project AxUpgradeLayerConflicts_<layer> you will find all elements that contain code conflicts and you can resolve them by using Compare tool

 

resolving-conflicts-after-installing-a-model-in-ax-2012-second-picture

 

resolving-conflicts-after-installing-a-model-in-ax-2012-third-picture

 

It is important to analyze the changes on both layers and conclude which lines need to be merged or removed on the higher layer.

 

After resolving all conflicts for an element, save the changes and mark the element in the project as resolved.

 

resolving-conflicts-after-installing-a-model-in-ax-2012-fourth-picture

Microsoft Had Called out Dynamics AX 2012 R3 Licenses from the Market

Last month Microsoft had announced the retirement of the brand Dynamics AX.

 

As of July 1st 2017, new customers won’t be able to buy Dynamics AX 2012 R3. This means that existing Dynamics AX customers will still be able to buy additional licenses, but the pricing will be revised after 1st of July. Existing Dynamics AX 2009 customers won’t be able to upgrade to Microsoft Dynamics AX 2012, they will need to upgrade directly to Microsoft Dynamics 365 for Operations.

 

Recently was announced the end of mainstream support of Dynamics AX 2009 until April in 2018, and the mainstream support for the final Dynamics AX 2012 products is extended to continue until 2021.

 

This extended support timeline gives customers more flexibility to choose the best timing for their business to upgrade to Microsoft Dynamics 365 for Operations.

 

The idea behind this Microsoft’s decision is every company to upgrade to Microsoft Dynamics 365 for Operations, in order to get enhanced Dynamics AX software with a lot of beneficial and useful features.

 

The Dynamics AX brand, beginning at version 4.0 in March 2006, was the successor to Axapta which Microsoft originally developed with IBM and was first released in 1998. Now it is rebranded into Microsoft Dynamics 365 for Operation, which is Microsoft’s business application for enterprises that enables people to make smarter decisions quickly through an intelligent user interface that provides access to real-time insights and intelligence.

How to Create a Matrix on a Form in Dynamics AX 2012

Dynamics AX grid control is usually bound to a data source. It has finite number of columns that display the data.

 

However, sometimes there is a need to display the data in a matrix form. This is standard feature of the SSRS framework, but it is also possible to be done on an AX form.

 

The Table Control is an unbound control that offers unique interaction with the user and provides functionality that is not accessible if we were to use ListView and Grid instead. With using the Table Control, we can specify the number of columns and rows we need and we will be allowed to indicate which types of controls can be used for each cell.

 

The ability to vary the input type per cell is the most powerful feature using this control. It is done by the developer who indicates an edit control method that will return the control type needed to be displayed in that cell. This article will help you achieve just that, data represented in a Matrix form.

 

In this example, we show how to create a dynamic matrix for employee capacity. Each row represents an employee while each column represents a specific date. The number of columns is dynamic and based on the date range selected. Below are presented the steps we need to follow which describe the process of using table controls:

 

Adding the Control

 

Right click on the Design node of the form where the matrix needs to be displayed and choose New control >> Table. Set an appropriate name for it and set the following properties: AutoDeclaration – Yes, Width – Column width, Height – Column height.

 

Adding-a-table-control-and-its-components

Table Control Components

 

Insert Int field and set its AutoDeclaration property to Yes (in our case we have 2 fields since we want to display red and green color for busy and available days). We have also set the ColorScheme property to RGB and BackgroundColor as needed for each field, red and green respectively.

 

Declare Your Global Variables In ClassDeclaration

 

declare-your-global-variables

InitValues()

 

Initialize the number of the columns (dates) and rows (users) that will be displayed on the form.

 

initialize-the-number-of-the-columns-and-rows

Run Method

 

Here we populate the framework of the matrix with the dates and users.

 

framework-of-the-matrix

ColorCell() Method

 

This is the part where we decide if the cell should be colored red or green.

 

color-cell-method

Override editControl() Method of the Table Control

 

The last part is to override the editControl method and call our previous defined colorCell method for every cell.

 

editControl-method

 

And here is the final result:

 

You can also add some extras such, as filters for date selection, double-click on a particular cell to assign a new task to an employee or modify to exclude the weekend days and color them with Red if your employees don’t work during the weekend.

Microsoft Dynamics 365 Certifications

Microsoft recently has announced a business application path for certifying Microsoft solutions experts.

 

Microsoft Certified Solutions Expert is a certification intended for IT professionals seeking to demonstrate their ability to build innovative solutions across multiple technologies, both on-premises and in the cloud.

 

In order to become a MCSE, it is prerequisite the developers to have MCSA certificate. Microsoft Certified Solutions Associate is a certification program intended for people who seek entry-level jobs in an IT environment.

 

Business Applications Path

 

Microsoft Dynamics 365 developers can choose a business application path to their certificate which depends on the applications they work on. Microsoft Dynamics 365 developers who worked with previously called Dynamics CRM are following one business application path, and the Microsoft Dynamics 365 for operations developers who have worked with Dynamics AX are following another.

 

Even there are mandatory exams which need to be passed for getting the MCSE title, Microsoft announced and an elective exam pool where they can choose one exam that suits their knowledge and expertise in their area of work.

 

Below are presented the business applications paths for becoming Microsoft Certified Solutions Expert for Microsoft Dynamics 365 and also the MCSE for Microsoft Dynamics 365 for Operations.

 

 

MB2-715: Microsoft Dynamics 365 Customer engagement Online Deployment

 

MB2-716: Microsoft Dynamics365 Customization and Configuration

 

MCSA Dynamics 365
+
MB2-717: Microsoft Dynamics 365 for Sales

 

MB2-718: Microsoft Dynamics 365 for Customer Service

 

MB6-892: Microsoft Dynamics AX – Distribution and Trade

 

MB6-893: Microsoft Dynamics AX – Financials

 

70-764: Administering a Microsoft SQL Database Infrastructure

 

MB6-890: Microsoft Dynamics AX Development Introduction

 

MCSA Dynamics 365 for Operations
+
MB2-717: Microsoft Dynamics 365 for Sales

 

MB2-718: Microsoft Dynamics 365 for Customer Service

 

MB6-892: Microsoft Dynamics AX – Distribution and Trade

 

MB6-893: Microsoft Dynamics AX – Financials

 

Here is the official link where you can get information about MCSE Business Applications: https://www.microsoft.com/en-us/learning/mcse-business-applications.aspx

Purchase Price Variance In Accounting Distribution – Service Invoice

Posting a purchase order related invoice for a non-stocked product in AX resulted in a price variance posting. Normally this shouldn’t happen. Investigating the problem we noticed that it happens in case of a partial invoice posting related to single receipt. This problem happens when the invoice is the last one for the line. The AX version is AX 2012 R2.

 

To make it simple, we have one line with quantity 100 and unit price 1. We invoice 25 on the first invoice. The posting goes well. On the second invoice, we invoice the rest e.g. 75.

 

The expectation is that the no price variance will be calculated. However, if we post the invoice or view the accounting distribution we can see price variance calculated and the extended price calculated for the full amount of the line.

 

In this case, the accounting distribution looks like this:

 

Net amount: 75.00
Extended price: 100.00
Price variance: 25.00

 

The accounting distributions are calculated in the Source Document Framework. Looking into the code we noticed that when the line needs to be closed, there is a different calculation for the remaining amount.

 

The calculation starts in VendorInvoiceLineSourceDocLineItem class in the calculateSourceDocumentAmountMap method. On the line 79, it switches to the calcRemainingAmount in the same class. The third parameter marked with the red box is part of the fix. We will come back later with this.

 

calculate SourceDocumentAmountMap method

 

The calcRemainingAmount method uses the SourceDocumentBalanceProvider class to calculate the balance. Here we propagate the same parameter to the parmDoRestrictByAccountingEvent. This is a new parm method created.

 

parmDoRestrictByAccountingEvent

 

SourceDocumentBalanceProvider calculates the amounts. We are interested in the calculateRelievedAmount method since this is the amount used in the price calculation. Again, we propagate the information in the SourceDocumentLineProvider::getDistributedAmountInCurrency method.

 

Purchase price variance in accounting distribution - service invoice

 

Here is the origin of the problem. The query that calculates the amount uses the Accounting Distributions as a source of data. But, the accounting distributions that belong to the previous invoices are not filtered out!

 

Here is the origin of the problem

 

The parameter that we propagated through out the classes is now used to implement the filter. This is a classical AX 2012 R2 problem. In R3 version it is fixed and in this post, the same fix is applied in R2.

 

This post is written since the problem was noticed (and it was a huge problem for the accounting department at the client). We hope that this could help someone and save some investigating time.

Top 10 Recommended Topics at the AXUG Summit EMEA, Amsterdam 2017

Summit EMEA is the biggest peer to peer conference dedicated to the end user education and networking of the IT solution providers in the field of Microsoft Dynamics. It will be held from 4-6 April in Amsterdam.

 

The conference invites professionals that belong to Microsoft Dynamics AX User Group – AXUG, Dynamics NAV User Group (NAVUG), Dynamics CRM User Group (CRMUG) and Dynamics Power BI User Group (PBIUG).

 

The three days conference will cover the most important trends related to the features of Microsoft Dynamics AX, with special focus on application lifecycle management, BI & Reporting, Functional AX, Security and Dynamics 365. With 75 speakers and 84 sessions which include member showcases, presentations, and how to’s, AXUG Summit EMEA is promising place of knowledge, expertise and networking. The agenda can be found on this link.

 

Here are the topics that we recommend to attend:

 

  • Optimize Your Services with Microsoft Dynamics 365 for Operations
  • AXUG General Session: Dynamics 365 for Operations, Product Strategy & Roadmap
  • Implementation of Specific MDM Tools and Processes in Dynamics AX
  • Microsoft AppSource: Software as a Service (SaaS) Business Apps Marketplace Strategy
  • Learn About the New Licensing Models for Microsoft Dynamics 365
  • Advanced Warehousing Scenarios for AX R3 and AX7
  • LCS – Then, Now, and the Future
  • The Digital Supply Chain Platform: Why It’s at the Heart of the Digital Economy
  • Visualizations – Reporting and Dashboards
  • Real Life Experience of Using TFS in Large Scale, Complex Development Project

 

Recently, Dynamic Communities, the organization behind the conference, announced the keynote Microsoft speakers. As all of us can guess, AXUG’s general session is going to be about Dynamics 365 for Operations, where we can hear and learn about the latest updates od Dynamics 365 for operations, roadmaps and futures of the new intelligent business application.

 

We won’t miss this chance to learn and network with the like-minded experts, and also with the proactive end-users who will attend the AXUG Summit this April.

 

If you want to meet us there, schedule a meeting so we can connect and discuss about similar interests and problems in our area of work.

Route Calculation And Editing The Operations For A Specific Route

In order to describe the production process, Microsoft Dynamics AX 2012 introduces the concept of routes.

 

Each route contains several combinations of operations and other resource requirements for a specific item describing its production process.

 

One of our clients needed a technical specific solution to provide his company a route recalculation that will propose a new combination of resources for a specific item. To achieve this, an automatic function was developed.

 

The standard form where the overview of the routes for the items is available can be accessed via Product information management > Common > Released products where the product can be selected, and then the next step is to click on the Route in the Engineer tab. The upper grid shows the route versions assigned to the item (RouteVersion is set as a datasource) and the grid below displays all the information for the route.

 

Although, ProdRoute is set as a datasource on the lower grid, it actually uses data from two other tables – Route and RouteOpr. This means that the changes for the operations need to be made in these two tables and then transferred to ProdRoute so they will be visible in the form.

 

The RouteInventForm class makes this possible. In the form where you want to display the routes and operations, you have to override the executeQuery method on the ProdRoute datasource and make a call to the prodRouteDSExecuteQueryPre method of the RouteInventForm class:

 

public void executeQuery()
{
routeInventForm.prodRouteDSExecuteQueryPre(routeVersion, configAll ? ” : configId);
super();
}

 

This way, all operations required to produce the item will be visible in the lower grid (keep in mind that RouteVersion is in a relation with InventTable by ItemId). The ProdRoute data source is set as a temporary table in the prodRouteDSInitPost method of the previously mentioned class. The instantiating of the class object is also tricky and it is done as following:

 

routeInventForm = RouteInventForm::newForm(element);

 

Thus, you can have a preview of the routes and operations for the item you specify as a parameter in the prodRouteDSExecuteQueryPre method.

 

In addition, the following Job is given as an example to demonstrate how you can change some of the values of the operations required for a specific item. Here, the testing operation is increased by one hour, and the routeOpr buffer is updated, but it is visible in the lower grid because ProdRoute is pulling data from this table.

 

route calculation and editing the operations

 


static
void Job10(Args _args)
{
RouteOpr                        routeOpr;
Route                           route;
//iterate through all operations for the Item with an ItemId = D0003 and RouteId = 000002
    while select forUpdate routeOpr
exists join route
where routeOpr.RouteRelation == route.RouteId
&& routeOpr.RouteRelation == ‘000002’
&& routeOpr.ItemRelation == ‘D0003’
{
if(routeOpr.OprId == ‘Testing’)
{
ttsBegin;
routeOpr.ProcessTime += 1;
routeOpr.update();
ttsCommit;
}
}
}

Microsoft Will End the Mainstream Support to AX 2009 in April 2018

Microsoft ends its mainstream support to AX 2009 at 10th of April 2018. As it is already known, Microsoft has an obligation to provide support availability guidelines for its products, so the information about product lifecycle and support are transparent and available for the vendors and the end users.

 

Every product from the Microsoft family has a lifecycle which begins when the product is released, and ends when it’s no longer supported.  Microsoft ERP products usually are supported for 10 years from the release date. The companies need to know the key dates in the product lifecycle, in order to be informed and prepared about making decisions on when to upgrade the software to its newer and improved version.

 

What Does It Mean?

 

Ending mainstream support for a Microsoft’s product means that Microsoft won’t be enhancing that product. When in mainstream support, requests to change product designs and features are considered and implemented up until this date, in this case until April 2018.

 

Furthermore, security updates and non-security hotfixes will no longer be supplied, the warranty claims will end too and most importantly the consulting resources will become almost impossible to find.

 

How To Prepare?

 

In the ever changing technology world, the companies must meet the market’s requirements in order to sustain their company’s growth.  Even if we are a year and two months away the end of the mainstream support, the reality is that there is not enough time, and the end users of AX 2009 should start thinking how they will answer to this challenge.

 

One of the most common dilemmas between the end users this Microsoft Dynamics AX product is to choose between upgrade to newer version, or to face the situation where they can’t count on Microsoft anymore regarding the fixing issues, the resources and the security.

 

The Reality

 

Regardless all of that, the reality is different. Most of the companies are not enough flexible or liquid to make the migration to newer Dynamics AX version. After following the discussions in the ERP community on this topic, we came to this conclusion – the benefit vs the cost didn’t add up to the companies which work with AX 2009. Some of them, regardless they are informed, they are planning to continue their work with ax 2009 at least for 2 years.

 

In any case, the companies will never be on their own when it comes of dealing with the problems while working with AX 2009.  We as company specializing in Dynamics AX support will keep supporting AX 2009 version and the older versions like AX4 or AX3.

 

If you are ready to answer to this change, we are eager to help you. Our experts can ease your transition with our flexibility and ability to react quickly to your changing business needs.

How To Add Custom Description To Allocation Ledger Transaction?

Adding description to a transaction happens to be a common problem in Microsoft Dynamics AX 2012. In this blog post we are going to give you a short insight about describing the steps of adding custom description to allocation ledger transaction.

 

 

Adding Custom Description to Allocation Ledger Transaction

 

First you need to extend the LedgerAllocationItem class with the parm method for description. This class holds the information related to an account allocation.

 

adding custom description to allocation ledger transaction

The LedgerAllocationController class allocates an allocation account to the physical ledger accounts that it represents. The LedgerAllocationController class has a method that performs the actual allocation of the amount based on percentage and creates the ledger – allocateAmounts method.

 

In this method you have an instance of LedgerAllocationItem class and you can fill data for description calling parm method that you have created.

 

description to allocation ledger transaction parm method

 

Then in LedgerVoucherTransObject class (represents a single transaction in an individual voucher) in newLedgerAllocationItem method (initializes a new instance of the LedgerVoucherTransObject class from a ledger allocation item) you can fill transaction by calling the parmTransTxT with the description that you put on ledgerAllocationItem instance.

 

custom description to allocation ledger transaction parmtranstct

This should happen no matter where the transaction is posted from. It could be a general journal, a free text invoice, an invoice journal, etc.

Deploying and Managing Models in AX 2012

Microsoft had introduced the Model concept in Dynamics AX 2012, in order to help customers more easily to install and maintain multiple solutions side by side in same layer. It is recommended to use models and the model store to deploy customizations or entire solutions.

 

Model management should be very well known topic for build managers, but sometimes developers need to do the same task for any purpose.

 

For that purpose, our team made instructions using two command-line tools:

 

  • Windows PowerShell
  • AXUtill

 

How to Create an Empty Model that Has Default Manifest Properties

 

(AXUtil)

On the Start menu, click Command prompt.

 

Navigate to the directory for the management utilities. Typically, the location of this directory is %ProgramFiles%\Microsoft Dynamics AX\60\ManagementUtilities. At the command prompt, type the following command, and then press ENTER.

 

axutil create /model:<ModelName>/layer:<LayerName>

 

(Windows PowerShell)

 

On the Start menu, click All Programs -> Administrative Tools -> Microsoft Dynamics AX Management Shell. At the Windows PowerShell command prompt, PS C:\>, type the following command, and then press ENTER.

 

New-AXModel –Model <ModelName> -Layer <LayerName>

 

How to Export a Model

 

(AXUtil)

 

On the Start menu, click Command prompt.

 

Navigate to the directory for the management utilities. Typically, the location of this directory is %ProgramFiles%\Microsoft Dynamics AX\60\ManagementUtilities. At the command prompt, type the following command, and then press ENTER.

 

axutil export /model:<modelname> /file:<filename> /verbose

 

(Windows PowerShell)

 

On the Start menu, click All Programs -> Administrative Tools -> Microsoft Dynamics AX Management Shell. At the Windows PowerShell command prompt, PS C:\>, type the following command, and then press ENTER.

 

Export-AXModel -Model <ModelName> -File <FileName.axmodel>

 

These commands export the model to an .axmodel file

 

 

How to Uninstall a Model

 

 

(AXUtil)

 

On the Start menu, click Command prompt. Navigate to the directory for the management utilities. Typically, the location of this directory is %ProgramFiles%\Microsoft Dynamics AX\60\ManagementUtilities.

 

At the command prompt, type the following command, and then press ENTER.

 

axutil delete /model:<name>

 

(Windows PowerShell)

 

On the Start menu, click All Programs -> Administrative Tools -> Microsoft Dynamics AX Management Shell. At the Windows PowerShell command prompt, PS C:\>, type the following command, and then press ENTER.

 

Uninstall-AXModel –Model <ModelName>

 

It is recommended to perform this action only if the intention is the model to be permanently removed. But if the goal is to upgrade a model or replace a model with newer version, it is better to import the model over the existing model, because element IDs and element handles are assigned at installation.

 

If you delete a model, and then import the same model or a model with newer version, element IDs and element handles are randomized, and that affects data integrity.

 

How to Import a Model

 

(AXUtil)

 

On the Start menu, click Command prompt. Navigate to the directory for the management utilities.

 

Typically, the location of this directory is %ProgramFiles%\Microsoft Dynamics AX\60\ManagementUtilities. At the command prompt, type the following command, and then press ENTER.

 

axutil import /file:<filename> /verbose

 

(Windows PowerShell)

 

On the Start menu, click All Programs -> Administrative Tools -> Microsoft Dynamics AX Management Shell. At the Windows PowerShell command prompt, PS C:\>, type the following command, and then press ENTER.

 

Install-AXModel –File <FileName.axmodel> -Details

 

These commands install the specified .axmodel file in the same layer that it was exported from.

 

When you import a model, elements in the model that you are importing may conflict with another model in the same layer or may conflict with overlaying version for these elements in upper layer. These conflicts must be resolved. There are several ways to resolve the conflicts occurred during the model import process, and we will write about it too.

 

When you install or uninstall a model, it is recommended, before taking the action, to create a backup of the database and after the performed action you can run a full compile, synchronize the database and generate Full CIL.

Print Multiple Invoices into One PDF File in AX7

The Problem

 

One of the improvements that we had to do for one of our clients was the possibility to select multiple invoices from the grid control and then print them all into one PDF, instead of the default action of creating a separate PDF file per invoice.

 

print multiple invoices into one pdf

 

In our particular case, the print destination settings are maintained for all the invoices and confirmed on the press of the OK button.

 

print destination settings

The Solution

 

To perform the operation, we had to extend the system SRSReportRunController class and to create an additional method “runFromArgs(Args _args)” where we replicated all the steps that are performed when the report is run, with the purpose of getting the rendered report bytes for the selected invoices.

 

The next step was to put the data into a container and use the merging method where the container is being read as a stream and afterwards written to a file and sent to the user.

 

In this process, we used the PDFsharp library (PDRSharp.dll) which needed to be added as a reference to the project.

 

public static void runFromArgs(Args _args)
{
if (!_args || _args.dataset() != tableNum(InvoiceTable))
{
            throw error(“@SYS22996”);
}

InvoiceTable invoice = _args.record() as InvoiceTable;

Map selectedRecordMap =          Map::create(Helpers::getFormRecordOrderedByField(FormDataUtil::getFormDataSource(invoice), fieldNum(InvoiceTable,InvoiceNum)));

MapEnumerator mapEnum = selectedRecordMap.getEnumerator();

boolean firstReport = true;
boolean printMediumFile;
container con;
str mergedFileName;
boolean proceed = true;
SRSPrintMediumType firstMediumType;

while (mapEnum.moveNext())
{
   PdfSharp.Pdf.PdfDocument initialDocument;
   invoice = mapEnum.currentValue();
           ExtendedInvoiceReportController controller = new ExtendedInvoiceReportController();
           controller.parmReportName(invoice.PSOInvoiceLayoutTable().ReportName);
           _args.record(invoice);
           controller.parmArgs(_args);
   controller.parmShowDialog(firstReport==true);

   SrsReportDataContract reportContract = controller.parmReportContract();
   SRSReportExecutionInfo executionInfo;
   guid reportRunId = newGuid();
   executionInfo = new SRSReportExecutionInfo();
   executionInfo.parmReportRunId(reportRunId);
   reportContract.parmReportExecutionInfo(executionInfo);
           reportContract.parmReportServerConfig(SRSConfiguration::getDefaultServerConfiguration());

   SRSPrintDestinationSettings printSettings;
   printSettings = reportContract.parmPrintSettings();

   if(firstReport)
   {
controller.prompt();
   }
   else
   {
printSettings.printMediumType(firstMediumType);
printSettings.fileFormat(SRSReportFileFormat::PDF);
printSettings.overwriteFile(true);
   }
   if(controller.dialogCanceled && firstReport == true)
   {
proceed = false;
firstReport = false;
   }
   if(proceed)
   {
             if(printSettings.printMediumType() == SRSPrintMediumType::File)
             {
                 firstMediumType = printSettings.printMediumType();
                 controller.runReport();

Microsoft.Dynamics.AX.Framework.Reporting.Shared.ReportingService.ParameterValue[]  parameterValueArray;
Map reportParametersMap;
rsReportRunPrinter reportRunPrinter;

SrsReportRunService service = new SrsReportRunService();
service.getReportDataContract(invoice.InvoiceLayoutTable().ReportName);
service.preRunReport(reportContract);

reportParametersMap = service.createParamMapFromContract(reportContract);

parameterValueArray = SrsReportRunUtil::getParameterValueArray(reportParametersMap);
reportRunPrinter = new SrsReportRunPrinter(reportContract, parameterValueArray);

SRSReportFileFormat fileFormat = printSettings.fileFormat();
System.Byte[] reportBytes;

SRSProxy proxy = reportRunPrinter.parmSrsProxy();
                reportBytes = proxy.renderReportToByteArray(reportContract.parmReportPath(),
                                                  parameterValueArray,
                                                  fileFormat,
                                                  printSettings.deviceInfo());

                str content = System.Convert::ToBase64String(reportBytes);

                if(firstReport)
                {
                           mergedFileName = printSettings.parmFileName();
                }
                con += content;
                firstReport = false;

                printMediumFile = true;

                }
                else
                {
                   irstMediumType = printSettings.printMediumType();
                   controller.runOperation();
                   firstReport = false;
                }
             }
         }
         if(printMediumFile)
        {
           Helper::mergePDFs(con, mergedFileName);
        }

  }

 

The Method

 

Further on, the actual method for merging of the PDFs is as follows:

 

   static PdfSharp.Pdf.PdfDocument mergePDFs(container _con, str _mergedName)
    {
        PdfSharp.Pdf.PdfDocument outPutPDFDocument = new PdfSharp.Pdf.PdfDocument();
        PdfSharp.Pdf.PdfDocument inputPDFDocument = new PdfSharp.Pdf.PdfDocument();
        PdfSharp.Pdf.PdfPages pdfPages;
        container con = _con;
        int i, j, pageCount;
        FileName pdfFile;
        InteropPermission permission;
        str errorMessage;
        System.IO.MemoryStream mergedStream;
        str tempDir;
        str mergedName = ‘INVOICES_’ + _mergedName;

        try
        {
            permission = new InteropPermission(InteropKind::ClrInterop);
            permission.assert();

            for (i = 1; i <= conLen(con); i++)
            {

                System.Byte[] reportBytes;
                System.IO.MemoryStream stream;

                reportBytes = System.Convert::FromBase64String(conPeek(con,i));

                stream  = new System.IO.MemoryStream(reportBytes);
inputPDFDocument = PdfSharp.Pdf.IO.PdfReader::Open(stream,PdfSharp.Pdf.IO.PdfDocumentOpenMode::Import);
                outputPDFDocument.set_Version(inputPDFDocument.get_Version());
                pageCount = inputPDFDocument.get_PageCount();
                pdfPages = inputPDFDocument.get_Pages();

                if (pageCount > 0)
                {
                    for (j = 0 ; j < pageCount; j++)
                    {
                        outputPDFDocument.AddPage(pdfPages.get_Item(j));
                    }
                }
            }
            new InteropPermission(InteropKind::ClrInterop).assert();

    tempDir = ‘C:\\tempDir’;
            System.IO.Directory::CreateDirectory(tempDir);

            CodeAccessPermission::revertAssert();
            outputPDFDocument.Save(tempDir + ‘\\’ + mergedName);
            System.Byte[] outBytes = System.IO.File::ReadAllBytes(tempDir + ‘\\’ + mergedName);
            mergedStream = new System.IO.MemoryStream(outBytes);
            File::SendFileToUser(mergedStream, mergedName);
            CodeAccessPermission::revertAssert();

            new InteropPermission(InteropKind::ClrInterop).assert();
            PSOHelpers::clearDirectory(tempDir);
            System.IO.Directory::Delete(tempDir);
            CodeAccessPermission::revertAssert();
        }
        catch(Exception::CLRError)
        {
            errorMessage = AifUtil::getClrErrorMessage();
            CodeAccessPermission::revertAssert();
            throw error(errorMessage);
        }
        return outputPDFDocument;
    }

    static void clearDirectory(Filename _folderName)
    {
        System.String[] files;
        int             filecount;
        int             i;

        if (WinAPI::folderExists(_folderName))
        {
            files = System.IO.Directory::GetFiles(_folderName);
            filecount = files.get_Length();

            for(i=0; i < filecount; i++)
            {
                System.IO.File::Delete(files.get_Item(i));
            }

        }

   }

 

Side Effects

 

As a side effect, we faced the problem that extra PDF files were being created for all the invoice reports that were additionally going to be sent to the client along with the merged file, which would be pretty annoying for the client.

 

We managed to resolve that problem with the use of a post handler for the “onToFile” method from the SRSPrintDestinationSettingsDelegates class, where the method was set to not return a value in a set condition.

 

[PostHandlerFor(classStr(SRSPrintDestinationSettingsDelegates), methodStr(SRSPrintDestinationSettingsDelegates, onToFile))]
public static void SRSPrintDestinationSettingsDelegates_Post_onToFile(XppPrePostArgs args)
{
        ProjectHoursContract projectHoursContract;
        SrsReportDataContract dataContract;

        dataContract = args.getArgNum(2);
        projectHoursContract = dataContract.parmRdpContract() as ProjectHoursContract;

        if(!projectHoursContract)
        {
            args.setReturnValue(false);
        }
}

Zero Cost Price on Purchase Line Inventory Transactions

One of our clients experienced the following issue: Posting a purchase order invoice resulted in an inventory transaction with zero cost.

 

However, the postings in the General ledger were correct. The stock valuation model was Weighted average date. The AX version is AX2012, R2, CU7.

 

We went trough the execution of the invoice posting and noticed that the cost price calculation is based on the accounting distributions. The logic takes into account all distributions on the line with the same financial dimensions as the PO line. In our case these are different.

 

We assume this is because the PO is created from a PRQ. The accounting distribution has the same dimension as the PRQ line while the PO line dimensions are blank.

 

The cost price calculation starts in InventCostInputAmount class, getInputAmountFromDistribution method where the ledger dimension selection criteria is defined based on the purchase line. Then actual calculation is implemented in SourceDocumentLineProvider class. getDistributedAmountInAccountingCurrency method where AccountingDistribution entries are selected based on the previously defined ledger dimension combination.

 

This seems to be a common issue since it was experienced by others as well. The proposed solution from Microsoft is the following hotfix: KB 2967526 “Deleting a financial dimension affects the distributions on a purchase order receipt, invoice vouchers and inventory costs”.

Consulting Service: How Did It Change in the Dynamics AX World?

How Did the Consulting Service Change in the Dynamics AX world?

 

Consulting means delivering a consulting service, however since technology is advancing so rapidly, the consulting market changes alongside with it.

 

That means that there will be a huge change in the way the consulting services are delivered. Most of consulting in this day and age can be described as a technical exercise. Consultants for instance, may be very well trained in Dynamics AX, however they may lack the consulting experience needed to do the job right.

 

Most often, problems arise because of the different expectations clients and consultants have. The clients usually expect to be guided by the consultants into the best ways and methods for using their ERP product. The problems arise when the consultants expect for the client to give directions as to what comes next. So one thing leads to another, leading to the most frequent complaint the clients have – ‘the consultants don’t understand our business.’

 

This is a bad thing, but can have good consequences, because of the importance of identifying the problems, and the even bigger importance of dealing with them. This leads to the importance of experience, since in most cases, if the team working on a certain project, collectively lacks the experience and skills needed to face and overcome the project challenges and obstacles, a step back to acquire the necessary experience is needed, or matters will only get worse.

 

The success of a project is usually very dependent on the planning phase, however if the implementations is not going according to plan in the first few months, measurements need to be taken in order to revise the plan. Controlling the scope of the implementation is the responsibility of both you and the partner, as the responsibility for the budget mostly falls on the shoulders of the owner.

 

Here are a few things you must actively manage throughout the project:

 

Overall Plan

 

Most of the time the client has absolutely no idea what you are doing as consultants. It is very important you understand the plan as a whole, so you can offer valuable feedback on your short-term performance in order to put your clients mind at ease.

 

Budget

 

Understanding how your money is being spent is the key to success. Analyzing how much time was budgeted, and how long activities took is the easiest way to find out how effectively work is going, and can sometimes reflect on the quality of the planning.

 

Team

 

The single most important aspect is of course the client’s involvement which can determine the success or failure of the implementation.

 

Processing Change Requests

 

Customizations can lead to huge overruns in cost and in most cases can be the reason for project failure. That is why it truly important to understand what you have and need in a project, and centralize the control over work authorization and review processes.

 

This is mostly due to the fact that these customizations and changes can lead to huge budget changes, and if the client is not involved into running the project it can have disastrous results. So you have to remember that the control of the scope as well as the management of the budget is a shared responsibility.

 

We at Axapta Masters can bring our experience closer to you and assist you in handling your very important strategic business and technological issues with our consulting service. We can provide you with the knowledge and tools to measure your key business performances, improve your business processes, and enable change throughout your entire organization. Find out how consulting services change for the better with us.

Customer Relationship Managements in the Digital Era

Customer Relationship Managements in the Digital Era

 

Throughout history, customer satisfaction was the only method to guarantee success in the long run. In the digital age we live in, that has not changed. In fact, it is now more emphasized than ever before. The expectations of the customers are far greater now.

 

Customers, with the rise of the internet and social media expect a much more personal relationship with you. They expect to get the same treatment from the largest of brands as they used to get only from local stores. Without a CRM system that would follow their individual needs and preferences, the battle for the customer can easily be lost. Expectations are far higher, and great innovation is needed in order to retain a customer. And we all know that retaining a customer is much more cost efficient than acquiring a new one.

 

CRM System. Why?

 

This leads to the conclusion that the success of a company is very much dependent on the tool meant to retain customers – the CRM (Customer Relationship Management). This is the most effective tool for building and retaining a positive relationship with a customer.

 

The advancements in technology have both an up and a down side to them. Using modern technology and a CRM in order to retain customers is becoming easier, however the customers’ expectations are becoming higher and higher every day. It is becoming harder and harder to stay ahead in the game and keep customers engaged and satisfied with what you are providing and how you are treating them.

 

It is not only the customer side of things that is assisted by the CRM system. The integration of marketing campaigns, the analytics of data, all sorts of meetings, and the care of the customers happen simultaneously, a powerful Customer Relationship Management solution is needed to bring all these functions together in one place so that you are able to extract information crucial to your business.

 

Microsoft Dynamics CRM and Dynamics AX CRM module

 

Microsoft Dynamics CRM system is a standalone CRM product from Microsoft that provides Sales, Marketing and Service Management capabilities only via individual modules. The Dynamics CRM is a standalone web application whereas Dynamics AX is a complete ERP system, which can be used to manage a business’ entire operations like Warehousing, Finance, Trade & Logistics, Production, Accounting, Master Planning, CRM and HR is a complete business solution, which also offers CRM functionality via an integrated module – the Dynamics AX CRM.

 

This module system offers one of the most advanced Customer Relationship Management solutions. It provides a deep integration with the other modules in the ERP system which can come in handy while looking at the big picture. The Dynamics AX CRM module covers all the functionalities offered by any CRM system, however it has the advantage of data sharing within the Dynamics AX platform, which is exceptionally handy and easy.

 

Intelligent customer engagement enables your company to build trust, loyalty and insight. The customer engagement solution of the Dynamics AX will help your company deliver an extraordinary experience, creating proactive personalized customer experiences by analyzing and predicting patterns and behavior. The CRM module of the Dynamics AX which we at Axapta Masters have the extensive expertise to implement is a solution that will help your company stay at the top, or will help you take your company there ahead of the competition.

 

Contact us and get a quote now in order to implement the most complete ERP software out there and with the help of the Customer Relationship Management module achieve and exceed your goals and satisfy even the most demanding customers! It is up to you, do not waste time, be proactive, not reactive!

How Does ERP Improve Business Workflow?

How Does ERP Improve Business Workflow?

 

A company doesn’t need ERP software to be successful. However, it will force an organization to improve its business processes which can lead to cost savings and increased profit margins. Every company is different and has its own unique set of challenges, but most companies will face mainly the following problems:

 

  • Inefficient scheduling of resources;
  • Slow production cycles;
  • Uncontrolled purchasing procedures;
  • Inefficient materials requirement planning;
  • Data inconsistencies;
  • Decreasing customer loyalty;
  • High overhead costs;
  • Delayed financial tracking and analysis.

 

If the companies are encountering any of these problems, the business will have a negative impact at the end. In the case of experiencing some of these problems, it is more than evident that your company can benefit from investing in ERP software.

 

ERP software can help define best practices, optimize activities and help you regain control over your processes. By streamlining operations and providing business process automation, ERP software improves the accuracy of information and accelerates data flow, helping free up the employees to focus on more complex issues that require personalized attention. As a result, productivity is dramatically increased and operating and overhead costs are dramatically reduced.

 

1. ERP Software Improves Visibility

 

Through a singular base, ERP software organizes the data essential to the business. It provides visibility to all the systems and processes and integrates them so all employees have access to the information they need, when they need it, to do their jobs more efficiently.

 

Storing company information in one common database makes it easier to manage and share information among key individuals within the company. Employees often use their own spreadsheets and databases to perform their jobs and, as a result, the other people in the organization find it difficult to obtain the information they need in a format they can use.

 

By implementing a single, unifying system, ERP software, you create a common “language” throughout the company that simplifies communication and makes it easier to understand and share important information.

 

2. ERP Software Streamlines Operations

 

Business processes and activities have become increasingly complex, requiring multiple teams and divisions to operate as a single, cohesive unit on a single project. Without an ERP software, creating that kind of cross-departmental coordination and workflow execution can be very challenging and very time consuming, which means quite costly.

 

ERP software helps companies streamline their business processes in the following ways:

 

Eliminating Data Entry errors

 

Data redundancy, besides being time consuming, increases the chances to make a mistake when entering the same data in multiple places. Once data has been entered into an ERP system it automatically updates the data throughout the entire system, ensuring that employees have access to the same and most up-to- date information with the click of a button.

 

Enhancing Workflow

 

ERP software helps companies improve efficiency by providing a way to standardize work sequences throughout all processes.

 

Providing Consistent Directions

 

Companies with employees who have easy access to work documentation see production errors go down and quality go up. ERP software gives employees the ability to document work steps and processes. That way other employees know how to perform the work on a consistent basis, keeping quality on a standardized level.

 

Collaborating with Suppliers, Customers and Remote Employees

 

The ERP software gives you the ability to connect with your business partners as well. Each member of your staff can log on to the ERP software wherever they are located acquiring crucial information in order to give an outstanding performance. Certain partners can also gain remote access to the information they need around the clock.

 

Working with Multiple Languages and Business Rules

 

For companies who operate globally, ERP software gives them the ability to document directions in multiple languages and adapt the procedures to local practices.

 

Effective ERP software is crucial to a company’s success because of its ability to manage the business across all departments in real time. Most of the processes consume both time and money. To be profitable and competitive, businesses must streamline operations across all departments, including automating critical yet routine activities, standardizing their speed and quality as much as possible.

 

With lots of enterprise resource planning solution available, you might wonder which is the perfect one for you. Talk with Axapta Masters’ experts to find out. 

Why Do You Need an Enterprise Resource Planning System?

Why Do You Need an Enterprise Resource Planning System?

 

An Enterprise Resource Planning system is often viewed as an extra expense by small to mid-sized companies, sometimes even by large ones. This comes due to the fact that the management sometimes believes that company operations are simple enough to be controlled through a few separate systems or simply by looking at a couple of spreadsheets of data. This is unfortunately one of the areas these companies can give the edge away to the competition. Running a tight ship without an ERP system in most cases is merely an illusion.

 

The bottom line is that the implementation of an ERP software should be looked at as a long term investment not as a cost. In the end the benefits will outweigh the initial time, effort and cost associated with the incorporation of the software into your organization by far. That is why understanding the benefits of Enterprise Resource Planning software implementation is the key step towards taking a big leap in front of the competition.

 

Cost Effectiveness with Enterprise Resource Planning

 

ERP packages don’t seem cheap on the first glance, seeming unlikely the company is going to be able to save money while implementing them. However, saving money is usually the most likely outcome of the implementation.

 

An ERP is going to unify all of the systems in your organization, starting from the management and manufacturing, to logistics and inventory, as well as IT support etc. By this merger of all the systems, business processes are usually becoming more time and cost efficient, and what is more important the information in the system are far more accurate and closer to real-time, enabling faster and better decisions to be made on the spot.

 

The centralization of data is only the beginning. Your organization can actually save money by eliminating the need to train different employees on different systems, and sometimes train the same employees in multiple systems. Using one software in the entire company is both cost and time saving.

 

Information Speed and Interdepartmental Cooperation

 

The problem with running separate marketing, finance, accounting and sales systems comes in plain sight when you realize how much time and effort it takes to keep the data all of these systems provide up to date and to correlate the data from all the different systems together. Another thing is that no matter how much time and effort you put into the data integration, the data will never be as accurate nor as fast as it would be if all of these company sectors were served by just one data center.

 

Without it simple processes like setting up a new customer are usually done in multiple places bringing up data redundancy issues, and the risk of data inaccuracy is increased with every new entry you make. Automated integration can help, but bringing the data in the right format can be a bug hassle. Data speed is not always the main issue. Certain data is simply owned by certain teams which can be reluctant to share it.

 

Special procedures are in place in order to acquire that data, and sometimes your key employees don’t have the information they need in order to make the right decisions. A single system will let everyone access the data they need, while keeping the confidential information available to those who need to know them.

 

Imagine the time and cost savings if this was all done in a single system?

 

Client Satisfaction

 

Even though an Enterprise Resource Planning is an internal system within the company it is astonishing how much it can help you keeping your clients satisfied. One of the greatest benefits of using an ERP system is improved customer relations. This comes as a result of better business processes that include lead generation and customer acquisition to late-phase customer service and customer retention.

 

Ultimately, it will improve your communication with your clients through all stages of the process.

 

System Expandability

 

No matter what size your company is, nor how fast it is growing, an Enterprise Resource Planning system is very adaptive to the changes your company is going through. Upgrading the initial system is very fast and easy making it cost effective and practical. New processes can be easily added to the primary system, and old processes can be easily upgraded in order to satisfy the current needs of your company.

 

Not acquiring an ERP system at the right time can be a lot costlier then implementing one too early.In fact, there is no too early when it comes to Enterprise Resource Planning software implementation, as it would only help your company grow faster and readily welcome whatever growth level your company might have.

 

It is a mandatory investment for most companies who are willing to keep the edge in front of the competition in the modern ruthless times of global competition.

Workflow Threw an Exception for the Following Reason: The Communication Object, System.ServiceModel.Channels.ServiceChannel, Cannot be Used for Communication Because It Is in the Faulted State

Working on a new workflow recently I got the following error:

 

Workflow threw an exception for the following reason: The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted state.”

 

I did a research on the error and seems that it could be related to a lot of different reasons. Basically it means that the server threw an error that is not handled.

 

In this case the problem was that the user did had appropriate privileges. Running AX as an administrator did the thing.

Charts in AX7

Charts in AX 7 are new features that gives great visual overview on records and they are great improvement from the old way of creating charts on AX 2012.

 

They are usually used as Parts forms to another forms mostly to Workspaces and they shows calculated information represented as  graphs or charts.

 

For creating Form with chart is used “Hub Part Chart” pattern and this pattern is contained of HeaderGroup (optional) and Chart control.

 

Chart control contains 5 sub-nodes:

 

  • Bindings –used for binding records to specific range or group of records as some names or items or orders.
  • Series – used to specify series of data bind to specified Binding data as dates, calculated sums or quantities.
  • Secondary Y-Axes – used to specify second series that will be bind to Binding data.
  • Methods
  • Events

 

To be able to control Bindings in code you can use it the method from the chart DataSets(), same if we want to change the Series with code we can use method Measures()

 

List mdt = chartControlName.Measures();
ListEnumerator mdit = mdt.getEnumerator();
while (mdit.moveNext())
{
                    SysChartMeasure ms = mdit.current();
                    ms.parmKeyField(fieldStr(dataSourceName,ResourceTeamName));
}
chartControlName.Measures(mdt);
ds.parmCategoryField(fieldStr(dataSourceName, ResourceTeamName));
ds.parmDataSource(tableStr(dataSourceName));
chartControlName.parmCategoriesType(SysChartCategoriesType::String);
chartControlName.DataSets(fd);               
chartControlName.ZoomLimit(SysChartDateTimeInterval::Default);
chartControlName.update();

 

When you change the categories field in code to field that is from another type that defined one you must define the type of the categories.

 

Example we have chart with bindings (categories properties) to field TransDate from type date, and we try to change through code to field Name from type string we must use parmCategoriesType(SysChartCategoriesType::String) method.

 

When we change some parameters in the chart we need to use update() method for this changes to be refreshed to the current form.

 

There is possibility to do some action from menu item when you click on some part of the chart bars which is controlled with properties on the chart MenuItemType and MenuItemName or with override to a method DrillThrough() on the chart.

 

public void DrillThrough(str _contextObject)
{
       Args args = new Args();
       args.parmObject(hourStatisticsHelper.createRangeForOverview());
       args.record(PSOHourStatisticsAggEntity);
       new MenuFunction(menuItemDisplayStr(PSOTSTimesheetLineOverview), MenuItemType::Display).run(args);

Keeping Your Data Secure in the Cloud

How is information supposed to be stored? Is it better to store information locally or on the cloud? How secure is your information anyway? These questions do not often have an easy answer.

 

We used to use disks, drives, and all sorts of equipment for storing our data, but today the cloud has become a place where both people and companies keep and exchange information on.

 

Lately we have been getting used to using the cloud more and more in order to permanently store all sorts of information, even the most sensitive ones. We trust the cloud more and more so the question arises.

 

How Sure Can We Be that Our Information Is Safe and Secure Out there on the Cloud?

 

This is both a legitimate and an illegitimate concern. It is legitimate because most of us feel safer when we hold something away from harm ourselves. To truly be out of harm, information needs to be kept in a closed system, with no outside influence. That is sometimes OK with pictures on a USB drive, but it certainly is not OK with information critical for many departments in a company for instance.

 

In the modern age of doing business, information needs to be available instantaneously, and nothing is faster than keeping them on the cloud. You need to think of information as money (which in many cases it is), and think of the cloud as a bank that holds the most important information. Most of us keep our money in the bank considering it secure, since we know banks are often safer than our homes when it comes to it. It is quite similar with the cloud. This is why, same as with the bank you choose, it is really important to choose who stores and handles your most critical information.

 

This is where Microsoft Dynamics AX comes handy. While you can read about the benefits of an ERP software for most businesses in our previous post, here you can find out why Microsoft Dynamics AX is the most secure ERP software out there.

 

Dynamics AX is built using the Security Development Lifecycle, which is a mandatory process that embeds security requirements into every phase of development. Identifying users and groups of users is made easy and that way you can assign and revoke access authorization easily.

 

Security-hardened infrastructure is used to connect data centers which helps block unauthorized traffic to and within those data centers, using a variety of technologies. Microsoft Anti malware helps protect the information against online threats. Intrusion detection, distributed denial of service (DDoS) attack prevention, regular penetration testing, and data analytics are some of the methods used to help mitigate threats.

 

In terms of privacy, you own and control your data. It can be accessed at any time and for any reason without the help or approval of Microsoft. The data will never be used for any purpose by Microsoft whatsoever. Steps are taken to prevent unauthorized access. Furthermore, Dynamics AX provides your own database to maximize the security and integrity of your data.

 

Government or law enforcement must follow applicable legal processes in order to gain access to your data even for national security purposes. In case that happens Microsoft always attempts to redirect the request directly to our customer. Unless legally prohibited from doing so, Microsoft will promptly notify you of any such request.

 

Microsoft is committed to achieving and maintaining compliance with leading data protection and privacy laws applicable to cloud services. As an ERP system, Dynamics AX includes features that will help organizations meet specific tax, accounting, or financial reporting requirements.

 

Finally, your data is stored transparently, and you always know where it is stored. Moreover, it is disclosed how the data storage location is determined.

 

These are amongst the reasons why choosing Microsoft Dynamics AX is the safest cloud based ERP software out there. It is because a successful attack against an ERP system can be devastating for any company. Especially for businesses with highly sensitive information, a company always need to pick the safest option.

 

Contact us to find the best and safest AX solution for your business.

Determining the Difference Between Dynamics AX(7) and Dynamics 365

The ERP world is shifting to the cloud causing rifts in this space because of the difference in cloud and on-premise installations; this blog Dynamics AX(7) versus Dynamics 365 Enterprise Edition hopes to explain the new functions, terms, and how Dynamics 365 relates to the new Dynamics AX (7).

 

How to Get Dynamics AX 7?

 

The new release of Dynamics AX (7) can be purchased now for over 20 users in the public cloud; it will be offered on premise sometime in 2017. The New Dynamics AX is a game changer for ERP in that it can be used anytime, anywhere, on any device and it includes development space. A package deal including CRM will soon also be available on Microsoft Azure cloud platform by subscribing to Microsoft Dynamics 365 Enterprise Edition plan 2 (see more details on our site).

 

What is Microsoft Dynamics 365?

 

Microsoft Dynamics 365 is evolving into a total business software package allowing Microsoft’s current CRM and ERP cloud solutions to be deployed in one cloud service with new role based subscriptions with purpose-built apps to help manage specific business functions like field service, customer service, and project service automation. Using the common data model, Dynamics 365 includes analytics from Cortana Intelligence and Power BI, and the productivity power of Office 365.

 

The Dynamics 365 apps are designed so they can be easily and independently deployed. Your business can start with the apps you need, and as your business demands, you can adopt additional capabilities with ease as all the apps work together.

 

Dynamics 365 is available to purchase a subscription on November 1st.

 

Dynamics 365 Enterprise Plan 1 includes CRM and these Apps:

 

  • Optimized for 250+ Employees;
  • Microsoft Dynamics CRM and light ERP;
  • Min 20 seats on select offers;
  • Powerapps that use the Microsoft common data model (see below);
  • Flow (New App – see more below);
  • Sales;
  • Field Service;
  • Customer Service;
  • Project Service Automation.

 

Plan one does not include operations whereas Dynamics 365 plan 2 includes plan 1 and operations or AX(7). AX (7) will be referred to as Operations in the Dynamics 365 Enterprise Edition.

 

Dynamics 365 Plan 2:

 

  • Includes everything in plan 1;
  • Dynamics AX (7) also referred to as the New Dynamics AX;
  • Adobe Marketing Cloud.

 

The Differences Between Dynamics AX7 versus Dynamics 365

 

The difference of Dynamics AX7 versus Dynamics 365 Enterprise Edition is that your company can purchase plans and not just an on premise application. The plans for Dynamics 365 are offered in two ways: plan 1 & plan 2.

Cannot Create a Record in Balance (CustVendTmpOpenTransBalances). Amount: 0,00. The Record Already Rxists. – SpecTrans Issue

In my previous post I wrote about vendor settlement issue related to inconsistent data. In this post the issue is more or less similar but in this case it is impossible to open the Vendor settlement form (Accounts payable > Common > All vendors > Tab: Invoice > Settle open transactions). When user try to open the form it ends up with error message:

 

“Cannot create a record in Balance (CustVendTmpOpenTransBalances). Amount: 0,00. The record already exists.”

 

Again the problem is the inconsistent data in the SpecTrans table. This table contains records that connect vendor records (VendTable) with vendor open transactions (VendTransOpen). These records are used to fill a temporary table called(CustVendTmpOpenTransBalances) which has unique index on TransOpenRecId field.

 

This filed is filled with VendTransOpen RecId value. SpecTrans table contains reference to non-existing VendTransOpen records so consequently TransOpenRecId field in CustVendTmpOpenTransBalances table is populated 0. The unique index restriction thrown an error when AX tries to insert the second record with the same 0 value.

 

The solution again is to cleanup inconsistent SpecTrans data. I created a job to cleanup the inconsistent SpecTrans. In my job the records are filtered by vendor but you can remove the range in order to execute for all vendors.

 

static void VendTransOpenSpecTransCleanup(Args _args)
{
VendTransOpen vendTransOpen; // tableId: 866
SpecTrans specTrans;
ttsBegin;
while select forUpdate SpecTrans
where  specTrans.SpecCompany == ‘DataAreaId’
&& specTrans.SpecTableId == 505         // VendTable ID
&& specTrans.SpecRecId   == 11111111 // Vendor RecId
&& SpecTrans.RefTableId  == 866
notExists join vendTransOpen
where  vendTransOpen.TableId    == specTrans.RefRecId
&& vendTransOpen.RecId      == specTrans.RefRecId
&& VendTransOpen.dataAreaId == SpecTrans.RefCompany
{
info(strFmt(‘%1’,specTrans.RecId));
SpecTrans.delete();
}
ttsCommit;
}

Reverse Wrong Invoice with Charges

The invoice reversal in AX is a process of creating credit notes (negative Purchase order or Sales order lines) and posting issue/receipt against these lines. At the end an invoice should be posted against the same lines.

 

With these steps the user can reverse the invoice and issue/receipt of products in case of items.

 

In order to post the correct invoice the user need to replicate the initial lines and then to issue/receive goods and post correct invoice as a last step.

 

When invoice with charges defined on lines need to be reversed the user need to be very careful because charges on the negative lines should also be negative. If charges are defined as positive AX posts the charges as normal charges resulting in double charges in the ledger. This happens often especially when user copies the lines and just change the sign in the quantity field. So, be careful when reversing invoices and always check the vouchers created.

Sales Order XX Has Been Updated by Another User – Packing Slip Posting

The error message “Sales order XX has been updated by another user.” is a standard error message when user tries to update (post document) against a sales order but in the mean time another user already did updated the same order.

 

In general, AX captures the quantities remaining when posting parameter form opens and check if these values are the same when posting executed. In case of a change, the error message appears.

 

This is a safety mechanism that prevents updating the same lines and quantities more times. However this error message can also be a result of customization.

 

One of my clients asked for a customization in packing slip grouping/splitting. Standard AX offers a setup for this but is some cases this setup does not fit the customer needs. In such a case SalesFormLetterParmData classes need to be customized. I did changed the ParmData class to meet the customer requirements. Everything was working just fine until we got the error message “Sales order XX has been updated by another user.”

 

At first I thought that multiple users tried to update the same order at the same time since we experienced this in test environment. But very soon I figured out that it was not updated by another user because the order was not updated at all.

 

Investigating the problem, I found out that one sales order line was part of multiple packing slips. This was the origin of the problem. When Packing slip update function called AX creates SalesParmLine records for each SalesLine that need to be updated. Besides other information like ItemId, InventTransId, quantities etc. AX also copies remaining quantities from SalesLine into SalesParmLine table. This information is stored into the following fields:

 

  • RemainBefore
  • RemainBeforeInvent
  • RemainBeforeInventPhysical
  • RemainAfter
  • RemainAfterInvent

 

In case when one sales line is split between multiple packing slips that should be posted in one go (same ParmIdI there is an issue. The first packing slip goes well without any issues and this action reduces the Remain fields on SalesLine. When second packing slip goes trough the validation process AX finds out that the Remain values on SalesLine and SalesParmLine differ and “Sales order XX has been updated by another user.” error message appears.

 

In order to avoid this Remain field on the SalesParmLines need to be maintained. For example, sales line has quantity 10 where 7 goes to first packing slip and 3 goes to second one. The second SalesParmLine record need to have Remain quantities reduced by 7. This way AX will validate that the remain quantity is 3 (which is correct) and will proceed with the posting.

 

The validation for remain quantities is executed twice, once when Parm form displayed and once when user clicks on OK button (when posting trough code or in batch is only once). Before form opening both SalesParmRecords must have the same values because they are compared with the original SalesLine. For the second check, after OK click, we need to udate Remain quantities. This is important because we need to change the values after prompt method on SalesFormLetter class, but before run method.

 

Another attention point are the units of measurement. The Remain fields that contain “Invent” in the name store quantities in inventory unit while the rest in sales unit. If these are different then inventory unit conversion is needed in order to calculate the inventory remain fields.

Caching Display Methods

In AX 2012 there are two ways of caching display methods on form.

 

The first way is to add attribute to display method itself:

 

[SysClientCacheDataMethodAttribute([_updateOnWrite])]
Display Type methodname(Params)
{

}

 

The second way is to call cacheAddMethod after super() call:

 

public void init()
{
super();
this.cacheAddMethod(tablemethodstr(methodName));
}

Problem with Vendor Settlement – SpecTrans Issue

One of my clients reported an issue that the settlement is not possible for vendor transactions (Accounts payable > Common > All vendors > Tab: Invoice > Settle open transactions). The records were marked with red exclamation and when the user try to mark the record gets the an error message:

 

“This transaction has been marked for settlement by another user.”

 

This error message is very clear and when I saw it I said that someone else already marked the transaction for settlement. The interesting part came when they said that they are sure that this is not correct.

 

Using the Specifications form (Inquires > Specifications) I tried to find the transaction that was marked against. The result was no transaction in the specification form.

 

On the other side the “Is marked” column shows that there is a related transaction.

 

This column is actually a display method that use SpecTrans table to decide if the transaction is already marked.

 

Select firstonly crossCompany RecId from specTrans where

(specTrans.SpecCompany != specCompany ||
specTrans.SpecTableId != specTableId ||
specTrans.SpecRecId != specRecId) &&
specTrans.RefCompany == _refCompany &&
specTrans.RefTableId == _refTableId &&
specTrans.RefRecId == _refRecId;

 

(Ref fields consist the relationship with Vendor open transaction in our case – VendOpenTrans)

 

This findings suggested that there is data inconsistency.

 

I created a simple job to find the marked lines that are inconsistent:

 

static void findMarkedTrans(Args _args)
{
VendTransOpen VendTransOpen;
SpecTrans     specTrans;
while select VendTransOpen
where VendTransOpen.AccountNum == ‘VendAccount’
join specTrans
where specTrans.RefRecId == VendTransOpen.RecId
&&    specTrans.RefTableId == tableNum(VendTransOpen)
&&    specTrans.RefCompany == ‘DataAreaId’
{
info(strFmt(‘%1 %2 %3’, specTrans.SpecCompany, tableId2name(specTrans.SpecTableId), specTrans.SpecRecId));
}
}

 

Using the Spec field I found out the records that marked those transactions. Then I just open the table I got from the job (in my case LedgerJournalTrans) and filtered by Record ID. As you assume, there we no data!

 

If you check the documentation for the SpecTrans table you can see that the description is “The SpecTrans table contains records that relate to transactions for the settlement and settlement reversal processes. Records are deleted after they are processed.” So, in this case SpecTrans table was not “cleaned up” properly.

 

Cleaning up the SpecTrans table from inconsistent records resolved the issue.

 

It is hard to say what is the reason for this issue. Probably it was an AOS crush during the time of posting. Unfortunately this happens sometimes and the consequences can be much bigger.

 

I experienced a case where the AOS crush caused to be impossible to post vendor invoices. The solution in this case was pretty similar, clean up a “temporary table”.

 

Another one resulted in even worse situation. The inventory transactions (Invoiced lines) and the postings in the ledger were not inconsistent.

Strategic and Commercial Approach with Issues

Many businesses, large and small, have a huge source of great ideas that can help them improve, innovate, and grow, and yet so many of these companies never think of using this amazing corporate asset. What is this highly valuable asset? Its own people.

 

Morgan Fraud, the author of The Thinking Corporation, says “Given that we are all capable of contributing new ideas, the question becomes how do you successfully generate, capture, process and implement ideas?”

 

Becoming an organization capable of answering this question can benefit in a number of ways:

 

Growth through Innovation/Creativity

 

Rather than be constrained by ideas for new products, services and new markets coming from just a few people, a Thinking Corporation can tap into the employees.

 

Increased Profits

 

The corporation will experience an increase in profits due to savings in operating costs as well as sales from new products, services and ventures.

 

Higher Business Values

 

The link between profits and business value means that the moment a corporation creates a new sustainable level of profit, the business value is adjusted accordingly.

 

Lower Staff Turnover

 

This, combined with the culture that must exist for innovation and creativity to flourish, means that new employees will be attracted to the organization.