Do you want to join a major online retailer?
Connecting to online platforms such as bol.com, Amazon, Zalando or Thuisbezorgd seems very easy for many entrepreneurs and therefore very interesting. But what does this do to the competitive position of your organization? And what are other challenges you can face?
Threat or opportunity?
The large online platforms saw profits grow enormously due to the corona crisis. We also saw an increase in demand from our customers for links with such platforms. Many organizations will think “if you can’t beat them join them”. In many cases this is certainly the case. However, we also see various challenges when entering into such a collaboration.
This creates an unhealthy incentive if an operator of a platform is also a provider. The market master, who determines his own rules of the game, then also becomes a market trader on this same market. A platform can then better position its “own products” by placing them higher in search results. Because the administrator of the platform has all user data, he can see exactly which products sell best. Amazon is already making use of this by making ‘private label’ products cheaper and more visible.
Yet it can also pay off for organizations to join a platform. Especially bol.com or Zalando are interesting sales channels where you can reach a large audience relatively easily. A big advantage of bol.com over Amazon is that it does not yet offer private label products. At the same time, all these parties are partly shops – with their own stock and warehouse – and partly market places for other providers. Without clear rules, the incentive continues to exist to favor one’s own goods.
Do you have a unique product? Or if you have the exclusive right to sell, an online platform is quickly interesting. After all, it does not matter to customers who offers or supplies a (commodity) product. It is often the price which is the decisive factor.
Product and price determine your succes
It is important to ask yourself a few questions when considering joining a platform. Is my product unique? Can we distinguish ourselves on the platform or in customer experience (after sales)? How often does an average customer buy your product or service? Is it a one-off or repetitive sale? What do we outsource and what do we do ourselves? How do we bind the customer to us.
In addition, it is important to bear in mind that such a platform also raises certain expectations. This includes the terms of delivery, service, returns and complaints handling. When it turns out to be a success, this can also bring new challenges. Ultimately, it is up to the organization to weigh the costs of commission and – sometimes – distribution of a platform against the greater reach of potential customers. When an organization does not invest in its own distribution and marketing channels, the platform takes over this customer contact and your organization becomes enormously dependent.
Ultimately, it is very important that abuse of power and monopoly formation is actively combated. That platforms have a dominant position does not have to be a problem, as long as smaller companies have access to the online market and have a fair chance against the big (er) players. Supervision and new laws and regulations can also contribute to a healthier and more balanced online climate.
Create tracking dimension in D365FO.
When we have a close look at the InventDim table, the fields can be split up in 3 groups. These 3 groups are already represented in the existing field groups.
The investigation
As you can see there are also Russian localization field in it, those can be turned off with the configuration key “Invent tracking dimensions – GTD, inventory profile, owner.”
So now how doe we add new tracking dimensions? There is a good documentation Add new inventory dimensions through extension – Finance & Operations | Dynamics 365 | Microsoft Docs
On the end there is an explanation how to add the predefined field to the product dimensions.
It is a good article with also an example code, but it will not work incase you want only a tracking dimension. To get that job don I investigated the tracking dimension Batch. The key trick for your new tracking dimension is to create a new extension of the InventTrackingDimension Class. Below picture shows the current extensions.
Lets do it
The next step is creating table extensions on the next 2 tables:
- InventDim
- Add the InventDimension1 to the field group Tracking Dimension.
- Create a new relation from the InventDimension1 to your new lookup table.(Below example the table name is XXTable)
- InventDimParm (Display settings)
- Add the InventDimension1Flag to the field group Tracking Dimension.
- Create and EDT extension for the correct labels on:
- InventDimension1
- InventDimension1Flag
So those where the easy steps. Now we start coding. The next step is creating an (COD)extension on the next 3 tables:
[ExtensionOf(tableStr(InventDim))] final class InventDimXXDim1_Extension { public DlvTermId parmInventFlavorId(DlvTermId _XXTable = this.getValueForDimension(classStr(XXInventTrackingDimensionDim1))) { if (!prmIsDefault(_XXTable)) { this.setValueForDimension(classStr(XXInventTrackingDimensionDim1), _XXTable); } return _XXTable; } public static FieldID fieldIdFlavor() { return InventDim::fieldIdForDimension(classStr(XXInventTrackingDimensionDim1)); } } |
[ExtensionOf(tableStr(InventDimParm))] final class InventDimParmXXDim1_Extension { public NoYes parmInventFlavorFlag(NoYes _flavorFlag = this.getValueForDimension(classStr(XXInventTrackingDimensionDim1))) { this.setValueForDimension(classStr(XXInventTrackingDimensionDim1), _flavorFlag); return _flavorFlag; } public static FieldID fieldIdFlavor() { return InventDimParm::fieldIdForDimension(classStr(XXInventTrackingDimensionDim1)); } } |
[ExtensionOf(tableStr(InventDimFieldBinding))] public final class InventDimFieldBindingXXDim1_Extension { protected static FieldName className2FieldName(ClassName _className) { var fieldName = next className2FieldName(_className); if (_className == classStr(XXInventTrackingDimensionDim1)) { return fieldStr(InventDim, InventDimension1); } return fieldName; } } |
And finally, the new extended class from InventTrackingDimension
final class XXInventTrackingDimensionDim1 extends InventTrackingDimension { public IndexId indexHintForTable(TableId _tableId) { switch (_tableId) { case tableNum(InventDim): return IndexNum(InventDim, InventDimension1Idx); } return 0; } public static XXInventTrackingDimensionDim1 getInstance() { return InventDimension::singletonFromInventDimFieldId(fieldNum(InventDim, InventDimension1)) as XXInventTrackingDimensionDim1; } public boolean isAffectingPrice() { return true; } ///Override next lines incase behavior should change public boolean checkExistsValueForItem(InventTable _inventTable, anytype _value) public boolean isSelective() public boolean isTransferReceiptMergeable() public boolean isTransferTransitReceiptMergeable() } |
The whole solution would look like something like this.
The results
And of course, do not forget to turn on the configuration key for InventDimension1, testing would be impossible with out 😉. The next screen dumps show the look and feel. As you also see the Owner field is still there, I guess MS has forgotten to add a configuration key to it….
Second Love
In the Netherlands and the countries around us, it goes without saying that you have one partner. Both business and private there is a huge taboo on having multiple partners at the same time. In this blog I explain the benefits you enjoy when you have 2 partners. On a business level, that is.
The implementation of a new ERP system is often quite a job. It is essential to select the right partner. A partner who is stable and reliable, both in planning and implementation and who has the right industry knowledge. Suppliers distinguish themselves by providing tailor-made solutions, specially developed for specific industries. Although organizations think they can benefit from this, in practice this often turns out to be different. It is precisely through the use of such customized solutions from partners that you are and remain dependent on this party. Both in the (further) development of the ERP system, as well as in support of the delivered solutions. This is not a healthy relationship, where you as a customer bear the most risks.
In an ERP implementation process it is therefore wise to do business directly with 2 parties, whereby the division of roles can be fulfilled according to your own wishes and taste. For example, you can choose to use this party as a second opinion and include it in all choices. You can also appoint a second party as project manager in order to gain and maintain control over the entire project. The benefit of such a collaboration translates into several ways. For example, the project (plan) will be assessed more critically and estimates will be better tested. Ultimately, this will translate into a better price and quality of the end product to be delivered.
After implementation, a new phase begins in which this same partner often continues to provide its services. Even after an implementation process it is wise to involve a second partner. This partner can assess whether what is currently running is functioning properly and give advice on this. A butcher who inspects his own meat is not likely to admit that it is not good. A second partner can always be honest about this because he has no other interest except yours!
Although organizations spend a lot of time selecting the right partner prior to ERP processes, this hardly ever happens until the next implementation or update. For years we have been the party that tells the real story without ministering to the mouth and invisible interests. We at Kaya are happy to be your second choice, your second opinion, your conscience, your rock in the surf. Because we believe in polygyny / polyandry for business relationships.
End of extended support for Microsoft Dynamics AX 2009 & 2012
From October 2021, it will no longer be possible to get extended support for Microsoft Dynamics AX 2009 & 2012. What exactly does this mean for you? Without this extended support, your organization will no longer receive essential support for updates, security issues, or other incidents. If your Microsoft Dynamics AX environment experiences problems, it can have a major impact on your organization and business operations.
In addition to the support you’re missing out on, Microsoft is constantly releasing new updates that increase usability. By continuing to work with an outdated Dynamics AX system, you run the risk of losing your competitive advantage.
“It is not the strongest of the species that survives,
nor the most intelligent that survives.
It is the one that is most adaptable to change.”
Charles Darwin
Next step?
Implementing a new ERP system offers many opportunities for your organization. For example, you can dramatically reduce infrastructure costs by switching to the cloud. It is also possible to make updates and changes more frequently and without any problems. Switching to a new ERP system offers many more opportunities compared to the existing environment.
The biggest advantages are:
- Access to new features and functionalities
- The system is available on all devices
- Access to Power Apps and Flow
- Reduction of cost adjustments up to 40% (especially if you have made adjustments around BI, manufacturing or Retail)
- Predictable costs, per month and less up front/implementation costs
- scalable and future-proof solution
Curious?
Kaya-Consulting has a number of self-developed services and solutions that help you and your organization make the right choices. Whether it’s determining the current TCO, the performance or the future-proofing of your ERP solution. We will help you quickly obtain clarity through our scans. So that you can make informed choices and be ready for the future.
.
Automated backups of D365FO databases.
When you work with LCS then below list of data base movement operations are familiar to you. Nowadays exporting and refreshing can also be triggered with the Database Movement API This can become extremely handy for daily automated backups of D365FO databases. How we do it? With DEVOPS release pipelines. The pipeline looks like this. The BACKUP TST is disabled because the API does not ‘yet’ support Tier 1 Databases.
Speeding up
Because we had to apply automated backups of D365FO databases at multiple customers. It became time consuming. So, we optimized it. All customer specific setting became Variables of the pipeline. Because customer specific Client ID, Client Secret, and password, are sensitive information we have hidden them. Be aware in case you unhide, the values are cleared.
PowerShell
Below PowerShell script is a sample of how we generate the Token. This token is later used on the backup commands PowerShell.
$tokenUrl = “https://login.microsoftonline.com/common/oauth2/token” $tokenBody = @{ grant_type = “password” client_id = “$(CLIENTID)” client_secret = “$(CLIENTSECRET)” resource = “https://lcsapi.lcs.dynamics.com” username = “$(USERNAME)” password = “$(PASSWORD)” } $tokenResponse = Invoke-RestMethod -Method ‘POST’ -Uri $tokenUrl -Body $tokenBody $token = $tokenResponse.access_token Write-Host “##vso[task.setvariable variable=TOKEN] $token” |
In the next sample we create the backup
$cstzone = [System.TimeZoneInfo]:ConvertTimeBySystemTimeZoneId( (Get-Date), ‘W. Europe Standard Time’) $filedate = Get-Date $cstzone -f “yyy-MM-dd” $BackupName = “ACC-$filedate” Write-Output $BackupName $refreshUrl = “https://lcsapi.lcs.dynamics.com/databasemovement/v1/export/project/$(LCSPRPOJID)/environment/$(ACC)/backupName/$BackupName” $refreshHeader = @{ Authorization = “Bearer $(TOKEN)” “x-ms-version” = ‘2017-09-15’ “Content-Type” = “application/json” } $refreshResponse = Invoke-RestMethod $refreshUrl -Method ‘POST’ -Headers $refreshHeader Write-Output $refreshResponse |
And the DEVOPS insider will comment, yeah dream on, no build , is also no release. True, you just must reuse a build pool in your environment.
Please be aware that MS is throttling these requests, only 3 backups a day are possible.
And at the end, we generate an email notification for the people that really need it.
LCS
We do not use the alerts from LCS, it causes simply too many emails. So, we disable the next notification for all LCS users
Don’t forget the other handy LCS tricks
Performance tuning development VM
It is a general complain of any developer. Why is it so SLOOOWWWWW? And yes, it is slow. But there are performance tuning tricks. Slow is influence on 3 things
- Startup VM
- Is also startup of
- Batches
- Management reporter
- Windows security
- Windows update
- Windows maintenance
- SQL
- There is no SQL maintenance
- Disk
- Is also startup of
You could disable the batches & management reporter. That will help. But the real issue is how the disks of that VM are configured. In general, it looks like below 16 lazy disks.
Now you can change these to faster disks , but please be aware of the prices. Also, these are managed disk, the cost fixed amount every month, so stopping the VM will not reduce below cost.
Size | Premium SSD | Standard SSD | Standard HDD |
64 GiB | 9.47 | 4.05 | 2.54 |
128 GiB | 18.29 | 8.10 | 4.97 |
256 GiB | 35.26 | 16.20 | 9.56 |
512 GiB | 67.92 | 32.39 | 18.36 |
How does the disk migration work? The first step is migration to managed disks
Managed Disks simplify disk management for VMs by managing the Storage accounts behind the scenes. Managed Disks also provide granular access control with RBAC and better reliability for VMs in an Availability Set. Learn more about the benefits of using Managed Disks
Source unmanaged disks are not deleted after the migration. Managed Disks are created by making a copy of the source disks. You can revert back to unmanaged disks by creating a new VM with the source disks. Configuration of the VMs is not changed after the migration. Learn more about migrating to Managed Disks
In order to complete migration, we will need to start the virtual machine. Once migration is complete, you may stop the virtual machine.
Next you can change all the discs
But hold on 16 disks multiplied with 18.29 makes 292 euro on top of running the VM. This is very expensive in the relation to how you use it. So next step:
- Archive your code & database.
- Delete the VM
- Deploy a new one
And of course, do not forget to setup the auto shutdown and the azure software reductions
Extensible Data Security examples – Secure by retail channel
When I initially learned AX 2012, before it got released, I was quite enthusiastic about the security changes and the organization hierarchies. Then also I learned about the eXtensible Data Security (XDS) concept. While working on one of my first AX2012 implementations, I also had to do a presentation for a Dutch community. The topic was about the Organizations and Hierarchies. While preparing the session, I suddenly got the idea to combine security role assignments, organizational hierarchies and XDS. After the presentation, I lost the demo and objects used at that time. For another presentation during the Summit EMEA in Dublin this year, also about organizational hierarchies, I decided to create a new demo. In a former blog, you can find the link for downloading the objects for this example. (Extensible Data Security examples for Microsoft Dynamics)
In this blog, I will explain you how this “Secure by retail channel” works functionally and technically.
(meer…)
Extensible Data Security examples – Secure by warehouse
In this post, I will continue explaining the examples created with eXtensible Data Security. In this part, I will explain how I did think of a solution for restricting warehouse access for users. There were a lot of questions on forums in the past about how to secure this. So, for a presentation on the Summit EMEA in Dublin this year, I decided to step into the challenges that comes with securing access to warehouses and related tables like inventory journals or purchase orders. I created a demo which will be covered in this part of the XDS blog series. In addition, this is a good example how to deal with different assignment of groupings per user without creating a policy per group or user.
(meer…)
Extensible Data Security examples – Secure by legal entity
In my last blog, I shared some code examples for eXtensible Data Security (XDS). In this post, I will explain how it works and also introduce a V2 version which will be more advanced in determine which legal entities will be visible for the user.
(meer…)
Extensible Data Security examples for Microsoft Dynamics
The last few months, I did spend a lot of time on speaker sessions for the Summit EMEA, MVP Monday webcast and a coming Dutch Dynamics Community event. In the meantime, it was also extremely busy completing work. One of the topics I talked about recently, is eXtensible Data Security (XDS) in Microsoft Dynamics 365 for Finance and Operations and Microsoft Dynamics AX 2012.
Code examples
There is not that much written related to this XDS topic. You may find two white papers and some blogs posts on this topic. One whitepaper also describes an example how to restrict financial dimension values.
Developing Extensible Data Security Policies (White paper) [AX 2012]
Securing Data by Dimension Value by using Extensible Data Security (White paper) [AX 2012]
As there is in general not that much knowledge and experience, I decided to share my knowledge in this area on some events and now also using my blogs.
I did create and demo some examples what can be achieved using XDS. During the sessions related to this topic, I promised to share these examples. The examples created do have the next features:
- Secure legal entities
When you do assign security roles with organizations assigned, by default a user can still see them all in the Legal entities form. This policy has the ability to limit it to only those assigned to the user. - Warehouse security
This example show how you can achieve some record based security on warehouses and sites. It uses a custom setup form to specify the warehouses linked to a user. - Retail channel security
This example is combining the organization hierarchies, security organization assignment and XDS. Quite a powerful example which could be an inspiration for you.
Detailed information how to use these examples and an explanation how they are created will be posted in separate blogs. Watch them coming or come back on this page where the links will be updated. Also, the list with examples might grow in future.
At this moment, I can share the examples based on AX2012 and they reside on my OneDrive. The same features for Dynamics 365 for Finance and Operations will be added in the future. The location of the code examples might change in future, so ensure to bookmark this page to be able to find the examples anytime. Currently, you can find them on this location: My OneDrive DynamicsShare
If you want to explore these examples, feel free to download and use it. The software is provided as-is and you cannot obtain any rights if something is not working correctly. You have to ensure you will install the examples in a separate environment first and test it carefully. If you have questions or feedback, feel free to add comments or send a message.
That’s all for now. Till next time!