Thursday, August 18, 2022

Ideas implemented in Microsoft Dynamics 365 SCM: Vendor group default financial dimensions

In these series of posts, I would like to go through some ideas that were implemented and show case the actual features details:

Vendor group default financial dimensions: 

See ideas for your reference:

In 10.0.28 this feature has been introduced:

This feature enable you to setup default financial dimensions on the vendor group and set financial dimensions on the vendor based on the vendor group selected. The concept is similar to the exact same functionality on the Customer side.

Walkthrough: 
  • Go to Accounts payable > Vendors > Vendor groups.
  • Select Vendor group tab on the Action pane and select Default financial dimensions button.
  • Define the financial dimensions values.

  • Navigate to Accounts payable > Vendors > All vendors.
  • Select New button.
  • Set mandatory fields like Vendor account number, Name. 
  • Set the Vendor group field. Based on the selected group financial dimensions will be defaulted to the vendor.


  • Expand Financial dimensions tab. Notice that financial dimensions are automatically set.
  • Change the Vendor group field value. 
  • Confirmation dialog will be shown. 
    • If you select Yes, the Vendor group will be changed and Financial dimensions will be overridden. 
    • If you select Cancel, the Vendor group value will be reverted back to the previous saved value. 


You can also track financial dimension for Vendor group and use "Copy values to this dimensions on each vendor group created". I will first start off by saying what this Copy flag does. If this parameter is enabled, when you create a new vendor group and vendor group is defined as a financial dimension, default financial dimensions for that vendor group will be filled in with the created Vendor group ID.  


Walkthrough: 
  • Go to General ledger > Chart of accounts > Dimensions > Financial dimensions.
  • Create a new financial dimension Vendor group.
  • Do not set "Copy values to this...."


  • Select Activate button (You will need to turn off maintenance mode)
  • Create a new Vendor group.
  • Select Default financial dimensions button. Notice that Vendor group financial dimension is blank.

  • Create a new Vendor with the created vendor group.
  • Notice that Vendor group financial dimension is blank as well.
  • Go to the Financial dimensions and set "Copy values to this...." to Yes.

  • Create a new Vendor group.
  • Select Default financial dimensions button. Notice that Vendor group financial dimension is set based on the Vendor group ID.

  • Create a new Vendor with the created vendor group.
  • Notice that Vendor group financial dimension is filled automatically by the vendor group selected.
That's it!

Thursday, August 11, 2022

WHS release to warehouse related classes in Microsoft Dynamics 365 SCM

Quite recently we needed to find all classes that are used for Release to warehouse functionality. As you might know, there are multiple release to warehouses options:

For instance, 

  • Accounts receivable > Orders > All sales order > Warehouse tab on the Action pane > Release to warehouse
  • Inventory management > Outbound order > Transfer order > Ship tab on the Action pane > Release to warehouse
  • And the rest that are under release to warehouse group in the Warehouse management module:


So, below is the list of all classes utilized by different releases to warehouse:



That's it!

Tuesday, August 9, 2022

Query to retrieve roles, duties and privileges information for a given user and resource in Microsoft Dynamics 365 SCM

In this blog post I would like to provide useful queries for retrieving roles, duties and privileges information. 


DECLARE @Resource varchar(250)

DECLARE @NetworkAlias varchar(250)

 

SET @Resource = '<<RESOURCE NAME>>' -- sample: BATCHABORT, SALESLINE

SET @NetworkAlias = '<<NETWORK ALIAS>>' <name>@d365operationslicensing.ccsctp.net

 

DECLARE @UserID varchar(100)

 

SELECT @UserID = ID FROM USERINFO

WHERE NETWORKALIAS = @NetworkAlias

 

1. Roles for given User

SELECT DISTINCT SECURITYROLE, SR.AOTNAME, SR.NAME 

FROM SECURITYUSERROLE SUR

JOIN SECURITYROLE SR

ON SR.RECID = SUR.SECURITYROLE

WHERE SUR.USER_ = @UserID

AND SUR.ASSIGNMENTSTATUS = 1


1a. Roles specific to a company/organization

SELECT DISTINCT 

USER_ AS [USER ID], 

SUR.SECURITYROLE AS [ROLE ID],

SR.NAME AS [ROLE NAME],

ISNULL(CSR.DATAAREA, '4ALL') AS [COMPANY]

FROM SECURITYUSERROLE SUR

LEFT JOIN SECURITYUSERROLECONDITION CSR

ON SUR.RECID = CSR.SECURITYUSERROLE

JOIN SECURITYROLE SR

ON SR.RECID = SUR.SECURITYROLE

WHERE SUR.USER_ = @UserID

AND ASSIGNMENTSTATUS = 1

 

2. Roles and sub-roles for given User 

SELECT RECID AS [SECURITYROLE], AOTNAME, NAME, 'Yes' AS [IS SUB ROLE]

FROM SECURITYROLE SR

WHERE RECID IN

(SELECT SECURITYSUBROLE

FROM SECURITYSUBROLE 

WHERE SECURITYROLE IN

(SELECT SECURITYROLE 

FROM SECURITYUSERROLE

WHERE USER_ = @UserID

AND ASSIGNMENTSTATUS = 1

))

UNION

SELECT RECID AS [SECURITYROLE], AOTNAME, NAME, 'No' AS [IS SUB ROLE]

FROM SECURITYROLE SR

WHERE RECID IN

(SELECT SECURITYROLE

FROM SECURITYSUBROLE 

WHERE SECURITYROLE IN

(SELECT SECURITYROLE 

FROM SECURITYUSERROLE

WHERE USER_ = @UserID

AND ASSIGNMENTSTATUS = 1

))

 

3. Duties assigned to given User

SELECT * 

FROM SECURITYDUTY

WHERE RECID IN 

(SELECT SECURITYDUTY 

 FROM SECURITYROLEDUTYEXPLODEDGRAPH SDE

 JOIN SECURITYUSERROLE SUR

 ON SUR.SECURITYROLE = SDE.SECURITYROLE AND SUR.ASSIGNMENTSTATUS = 1

 WHERE SUR.USER_ = @UserID

)

 

4. Privileges for given User (this includes privileges assigned via duties and subrole)

SELECT DISTINCT 

SP.IDENTIFIER,

SP.NAME AS [PRIVILEGE]

FROM SECURITYPRIVILEGE SP

JOIN SECURITYROLEPRIVILEGEEXPLODEDGRAPH MAP

ON MAP.SECURITYPRIVILEGE = SP.RECID

WHERE MAP.SECURITYROLE 

IN (SELECT SECURITYROLE FROM SECURITYUSERROLE

WHERE USER_ = @UserID

AND ASSIGNMENTSTATUS = 1)

 

5. Permissions and grants for given User (this includes privileges assigned via duties)

SELECT DISTINCT SECURABLETYPE,

MAP.SECURITYROLE AS [ROLEID],

RES.AOTNAME AS [RESOURCE],

RES.AOTCHILDNAME AS [CHILD RESOURCE],

SP.NAME AS [PRIVILEGE],

RES.READACCESS,

RES.UPDATEACCESS,

RES.CREATEACCESS, 

RES.CORRECTACCESS,

RES.DELETEACCESS

FROM SECURITYRESOURCEPRIVILEGEPERMISSIONS RES

JOIN SECURITYPRIVILEGE SP

ON SP.IDENTIFIER = RES.PRIVILEGEIDENTIFIER

JOIN SECURITYROLEPRIVILEGEEXPLODEDGRAPH MAP

ON MAP.SECURITYPRIVILEGE = SP.RECID

WHERE MAP.SECURITYROLE 

IN (SELECT SECURITYROLE FROM SECURITYUSERROLE

WHERE USER_ = @UserID

AND ASSIGNMENTSTATUS = 1)

 

6. Permission for a given User and Resource (this includes privileges assigned via duties)

SELECT DISTINCT SECURABLETYPE,

MAP.SECURITYROLE AS [ROLEID],

RES.AOTNAME AS [RESOURCE],

RES.AOTCHILDNAME AS [CHILD RESOURCE],

SP.NAME AS [PRIVILEGE],

RES.READACCESS,

RES.UPDATEACCESS,

RES.CREATEACCESS, 

RES.CORRECTACCESS,

RES.DELETEACCESS

FROM SECURITYRESOURCEPRIVILEGEPERMISSIONS RES

JOIN SECURITYPRIVILEGE SP

ON SP.IDENTIFIER = RES.PRIVILEGEIDENTIFIER

JOIN SECURITYROLEPRIVILEGEEXPLODEDGRAPH MAP

ON MAP.SECURITYPRIVILEGE = SP.RECID

WHERE MAP.SECURITYROLE 

IN (SELECT SECURITYROLE FROM SECURITYUSERROLE

WHERE USER_ = @UserID

AND ASSIGNMENTSTATUS = 1)

AND RES.AOTNAME = @Resource

 

7. Permissions required for given Resource

SELECT DISTINCT SECURABLETYPE,

MAP.SECURITYROLE AS [ROLEID],

SR.NAME AS [ROLE NAME],

RES.AOTNAME AS [RESOURCE],

RES.AOTCHILDNAME AS [CHILD RESOURCE],

SP.NAME AS [PRIVILEGE],

RES.READACCESS,

RES.UPDATEACCESS,

RES.CREATEACCESS, 

RES.CORRECTACCESS,

RES.DELETEACCESS

FROM SECURITYRESOURCEPRIVILEGEPERMISSIONS RES

JOIN SECURITYPRIVILEGE SP

ON SP.IDENTIFIER = RES.PRIVILEGEIDENTIFIER

JOIN SECURITYROLEPRIVILEGEEXPLODEDGRAPH MAP

ON MAP.SECURITYPRIVILEGE = SP.RECID

JOIN SECURITYROLE SR

ON SR.RECID = MAP.SECURITYROLE

WHERE RES.AOTNAME = @Resource

ORDER BY MAP.SECURITYROLE , SECURABLETYPE

 

8. Permissions required for given Resource (using SecurityroleRuntime table. This is used during runtime and should have same data as above)

SELECT DISTINCT TYPE, SECURITYROLE AS [ROLEID], NAME AS [RESOURCE], CHILDNAME AS [CHILD RESOURCE], CREATEACCESS, READACCESS, UPDATEACCESS, DELETEACCESS FROM SECURITYROLERUNTIME

WHERE NAME = @Resource

ORDER BY SECURITYROLE, TYPE


That's it!

Monday, August 8, 2022

Financial dimensions defaulting logic on the purchase orders created from purchase requisitions (active dimension link, merge parameters) in Microsoft Dynamics 365 SCM

In this blog post I would like to explain what capabilities we have out of the box for financial dimension setup on the purchase order/lines when creating purchase order from purchase requisition. 

When Purchase requisition is being created (without project involvement), financial dimensions are set from the following setups and in the following priority: Dimension link -> Vendor -> Item.

When PO is being created from the Purchase requisition, financial dimensions on the created purchase orders are initialized in the following way:

  • Purchase order header financial dimensions are set from the vendor
  • Purchase lines financial dimensions are set from the purchase requisition lines

If Merge financial dimensions from the vendor that was added after purchase requisition approval = YES (Purchasing policies > Purchase order creation and consolidation rule > Manual purchase order creation), then financial dimension from the requisition line will be merged with the financial dimensions from the vendor and set it on the purchase order line.

  • Purchase order header financial dimensions are set from the vendor
  • Purchase lines financial dimensions are set from the purchase requisition lines. If any fin dims are blank on purchase requisition line -> then it will be taken from vendor. 
Imagine the following situation: 
You raised a Purchase requisition with Business unit = 001, Cost center = <blank> and submitted for approval. While waiting for approval, vendors financial dimensions Cost center gets defaulted to 007. Upon purchase order creation, purchase order line will get financial dimension: Business unit = 001, Cost center = 007. Without this parameter activated, it would have set to Business unit = 001, Cost center = <blank>.

Within 10.0.25 release, a new feature has been introduced that affects the financial dimensions merge logic.

Feature name: “Merge financial dimensions from the vendor with active dimension link financial dimension on the purchase order”
Feature description: This feature allows for the merge financial dimensions from the vendor with active dimension link financial dimension after purchase requisition approval if you set up a link between a financial dimension and the site inventory dimension. Purchase order creation and demand consolidation purchasing policy rule can be setup to drive the decision for merging financial dimensions from vendor with active dimension link financial dimension on purchase order header level.

Once this feature is enabled, new parameter will be displayed Merge financial dimensions from the vendor with active dimension link financial dimension on the purchase order (Purchasing policies > Purchase order creation and consolidation rule > Manual purchase order creation).

If this parameter is enabled, the financial dimension from the vendor and dimension link will be merged together and set on the purchase order header. 

Try out the following: 
1. Enable Dimension link (Inventory management > Setup > Posting > Dimension link).
  • Select the financial dimension in the Dimension link page, for instance Cost center
  • Go to Sites and set Cost center value for all sites (Inventory management > Setup > Inventory breakdown > Sites)
  • Go to Dimension link page and select Activate link. Wait until completed. 
2. Set Business unit = 001, Cost center = <blank> on the vendor record. 
3. Create Purchase requisition with Business unit = 001, Cost center from the site, let's say 008. 
4. Submit and Approve requisition.
5. If parameter is disabled, Purchase order header financial dimensions will be defaulted to Business unit 001, Cost center = <blank>.
If parameter is enabled, Purchase order header financial dimensions will be defaulted to Business unit 001, Cost center = 008.

That's it!