Uploading Project Categories

Part 1: Export Project Category Data

The School of Athens by Raphael

The whole is better than the sum if its parts.

~Aristotle, maybe.


In our previous posts in this series we looked at understanding project categories and using project categories. Completing the series, today we’ll look at uploading project categories through a package in the data migration framework.

Remembering our initial diagram, project category data don’t exist on a single table, but are on a set of related tables. To manually create a Project category, you need to

  1. Configure a Category group
  2. Configure a Shared category
  3. Create a Project category
  4. Update Expense or Cost category details (if necessary)

The same holds true when uploading project categories through the data management workspace. We will need to upload data through multiple data entities to successfully build our project categories.

Data management workspace

A quick refresher on the Data management workspace – The Data management workspace relies on data entities to pass data in and out of D365. An Import project can be created to pass data into D365. An Export project can be created to pass data out of D365. When examining data in an existing system, it can sometimes help to create an Export project to view the available data.

Above is an export project with the data entities related to project categories

  1. Project category group
  2. Shared category
  3. Category table
  4. Project category
  5. Expense category

Clicking export processes the data in these entities so they can be downloaded in a package. Refresh the following screen until the completed checkbox appears – you can now click Download package.

The downloaded package is a zip file containing excel files for your data entities as well as two .xml files – Manifest.xml and PackageHeader.xml. You can extract the contents of the zip file to examine the contents of the project category data. The xml files will be helpful when we make changes or additions to the project category data and are ready to import those changes back into D365. As we will see in the next post, the xml files tell the Data management workspace what data entities we want to upload and the order in which we want to upload them.

STAY TUNED FOR THE EXCITING FOLLOW-UP…

Part 2: Import Project Category Data

Using Project Categories

The School of Athens by Raphael

There are Ten Categories of Being: Substance, Quantity, Quality, Relative, Place, Time, Position, Having, Acting upon, Being affected.

~Aristotle

Is that MECE?

~Literally every management consultant, ever.


How many project categories do I need?” is a common D365 implementation question. Remembering the rules from our initial project categories post, a project category can be of only one transaction type – so you will need at least one project category group for each transaction type used and at least one project category within each project category group.

Below is a survey of places where project categories are used in D365 for Finance and Operations. The list is not exhaustive, and project categories are not the only drivers of the below (for instance, there are many attributes that can be used to drive sales prices), but the below can be a good starting point for thinking about how granularly an organization’s project categories ought to be defined.

Ledger Posting Setup

Project and category relationships are the two main drivers of both cost and revenue account posting profiles in the Project management and accounting module.

Sales prices

Hour, Expense, and Fee transaction types all have their own sales price tables. Sales prices for items are set through trade agreements. Project category is one of many attributes that can be used to drive sales prices.

Cost prices

While it is more common for cost prices to be driven at the resource or role level, specific cost prices can also be set at the project category level.

Line property defaults

Line property default behaviors are configured on the project/group line properties table. For some organizations, it makes sense to have billable and non-billable expense categories instead of having users directly select the line property on their expense report lines.

Expense category attributes

Different expense types have different attributes – for instance, an expense type of mileage requires a number of miles to be entered on the expense report, calculating a reimbursement amount, instead of allowing the user to directly enter their mileage expense reimbursement amount.

Expense policies

Different company expense policies can be applied specifically to project categories of certain expense types.

Indirect costs

If using indirect costing, indirect cost components need to be associated to an indirect cost project category. Less frequently used, project categories can be used to drive whether indirect costs are applied through the Indirect cost component group assignment rules configuration.

Item sales tax groups

Different sales tax codes apply to different goods and services. In D365, this sales tax configuration is applied through the item sales tax group on the project category.

Posted transaction reporting

Whether viewing posted transactions in D365 or an external reporting solution, project category can be an important reporting dimension. In the image above, the hours transactions form is grouped by project category.

Project forecast reporting

As with posted transactions, project categories can be a useful dimension for project forecast reporting. Sometimes forecasting is done at a more general level of project category than those anticipated for posting. (For example, an “Expense forecast” project category may be used to estimate all the different expense postings anticipated on a project)

Project invoice document

Project categories display on the project invoice document – which makes sense especially if sales prices are being driven by project categories. That being the case, it is worth considering what customers would like to see related to the project categories displayed.


Do you see an important project category function missing from the list above? Call it out in the comments!

Understanding Project Categories

The School of Athens by Raphael

Fun fact: Aristotle thought there were ten categories.
Possibly related fact: Aristotle never used the D365 Projects Module.


Project categories are not a new concept in D365. A quick search will show that categories date back at least to AX2012, and perhaps even time immemorial. The latest project category documentation (see here, here, or here) is 5+ years old – more ancient than Aristotle in tech-years.

Why do I think I can explain an old topic any better than it’s already been explained? Aristotle would call this Hubris.


What Are Project Categories?

Understanding project categories requires knowing a few D365 projects module rules:

  • Cost or revenue associated with a project must be defined by a project category.
  • A project category can only be of one transaction type (Hour, Expense, Item, Fee).
  • A project category can only be used within its own legal entity.
  • To work with the Expense module, a Project category needs to be setup as an Expense category.
  • To work with the production module, a Project category needs to be setup as a Cost category.

These rules lead to a D365 category table structure that looks like this:

Why so complicated? The complexity comes from the rules…let’s examine.

1) Category group

Category groups…groups categories! Project categories can only have one transaction type, and the category group is where the category’s transaction type is defined. All project categories in the same category group will be of the same transaction type.

2) Shared category

Because a project category can be used only within its own legal entity, the concept of a global “shared category” exists in D365 to link project categories across different legal entities. The shared category is also where the category’s identity as a “Project category” for use in the Project management and accounting module is defined. The Shared category is also where a category’s use in the Production or Expense management modules is defined if applicable.

3) Project category

Once a category group and shared category have been setup, the project category can be created. When creating a new project category on the project category form, the category ID dropdown will show all shared categories not yet associated to project categories in the current legal entity. Notice that Category group is a required field for the project category, and that selecting the category group sets the project category’s transaction type.

4) Production category

When “Use in production” is enabled on the Shared category, the associated Project category is also setup as a Cost category. An additional fastab related to Production attributes is displayed on the project category (this additional production information is stored on the Cost Category table). The category is also visible in the production module. This is the same category record information, just viewed from a filtered list of categories used in production.

5) Expense category

When “Use in expense” is enabled on the Shared category, the associated Project category is also setup as an Expense category. Two additional fastabs related to expense attributes are displayed on the project category (this additional information is stored on the expense category table), and the category is also visible in the Expense management module. Like the Cost category, the Expense category record in Expense management displays its same record information as in the Project category list.


As you can see, setting up a new Project category is as easy as 1, 2, 3 (configurations for Category groups, Shared categories, and Project categories)…and possibly 4 or 5 (additional configurations for Cost categories or Expense categories, if applicable). In a future post, I plan to look at different results that can be driven by Project categories, as well as how to efficiently upload Project categories through data management.

Move and Hide Fields – Personalization | D365 Platform

Bill And Ted 3 Officially Happening With Keanu Reeves And Alex Winter Returning
So-crates, from Bill & Ted’s Excellent Adventure (1989)

Let him who would move the world first move himself” – Socrates


Rounding out this personalization series, let’s take a look at the move and hide features.

I think these two features should be more widely utilized. D365 forms are designed for multiple personas / business processes. Decluttering forms for specific personas by moving less frequently used fields farther down the form or hiding them completely is an easy way to increase day-to-day efficiency, as well as simplify the training/change-management process.


Move a Field

Open the personalization toolbar Ctrl+Shift+P and select the Move button. Click on the Field, Field Group, or FastTab to be moved. From there, drag with the cursor or use the Arrow Keys to indicate where the form element should go. I find using the arrows a bit easier to control. An orange indicator line displays where the form indicator will go, and Enter will set the field in its new location. Close the personalization toolbar to view the result.

Moving the Responsible field group to the end of the General FastTab.
Note the highlighted indicator line.

Result after closing the personalization toolbar.

Move can also be used to adjust the column order on a listpage.


Hide a Field

The hide feature works similar to the move feature. Hide can be applied to Fields, Field Groups, or FastTabs, as well as Tabs, Groups, or Buttons in the form’s header ribbon. It can be done through the personalization toolbar, or by right-clicking, selecting personalize, and then selecting Hide for the desired form element.

Right-click, Personalize, and Hide the Project team and scheduling FastTab.

The FastTab disappears from the form.

But Where Do Hidden Fields Go?

Dust. Wind. Dude. …Woah.

No, the fields aren’t lost forever. Using the Personalization toolbar, click on the hide button to reveal which form elements have been hidden through personalization.

Some parts of the Projects form are hidden, but which ones?
I don’t have a photographic memory.

Open Personalization toolbar and selecting Hide
What was hidden is now revealed.

Create a New Field – Personalization | D365 Platform

Statue of Issie, Japanese Lake Monster

In 1955, Bernard Heuvelmans created a new field: Cryptozoology – the study of imaginary animals.


Create a New Field

As mentioned previously, when adding a field through personalization users also have the option to create a new field. After opening the personalization toolbar, selecting Add a field, and choosing the desired location for the added field, users are prompted to select from an existing field or Create new field.

In the Create new field area, users can define

  • The table where the new field should be added
  • The new field’s prefix (all fields added through personalization end in _Custom)
  • The field’s data type (Text, Number, Decimal, DateTime, Date, Picklist, Checkbox)
  • The field’s label
  • The field’s help text (what displays when the hovering the cursor over the field)

Example of new Picklist field creation

Example of new Checkbox field creation

Example of new Example fields displayed on Customer form


Additional Considerations:

In a few clicks, a new field can be created and added to a form – saving hours of developer time, code promotion, and testing over the standard approach of doing this through development. That’s good. But with the ease of creating a new field, don’t neglect thinking through the below – which could save headaches associated with implementing any new field – whether through personalization or development.

Access

Who needs to see or edit the new field? From what forms? Personalization can add the new field to the saved view, but the new view(s) will need to be published to the desired users or roles.

Data Migration

How will the current data for this field be loaded in D365? Who will do it? In System administration, there is a form to manage Custom fields. Here, a custom field can be added to a data entity for data migration. The Custom fields form is also where field values like picklist options or the length of a text field can be updated.

Reporting

Does this custom field need to be added to any reports? It is easy to add a custom field to a listpage using personalizations. Visibility on the listpage is frequently enough, and Ctrl+Shift+E can be used to quickly export listpages to excel.

Custom Example field on Customer Listpage

If the new field needs to be added to a formatted report, or to a data model for consumption in PowerBI or another reporting solution, you may need additional developer assistance.

Testing

One last thought about creating a new field through personalization – it doesn’t follow the standard QA->UAT->Production path of regular code promotion. A new field can be created as a test in a test environment, but at showtime a user has to create the new field directly in the production environment. This is probably fine for fields that are “just extra attributes”, but probably not fine for fields related to a company’s core business. If additional methods or logic need to be applied to a field, it is probably better the field be created through development.

Additional Reading
Personalize the user experience
Create and work with custom fields
No Developer Required – Adding Custom Fields in Dynamics 365

Add a Field – Personalization | D365 Platform

untitled, field, farm, green, grass, agriculture, tree, plant, nature, outdoor

When he went out to plough his fields…his heart would fill with joy.”

How Much Land Does a Man Need? | Leo Tolstoy


D365 contains thousands of related tables with an almost innumerable number of fields – some say D365 has almost as many fields as this blog has fans. But sometimes a user just needs one more field.

Users access this table data through forms. Frequently, a form’s standard view will not contain every single field of related table data. Did you know the customer table (CustTable) has 203 different fields? Add a field allows additional table information to be presented on a form.


Add a Field

Use Ctrl+Shift+P to bring up the Personalization Toolbar and click on Add a field. Once Add a field is selected, click on the part of the form where the new field should go.

A new “Add columns” area will pop up on the right allowing the user to select which field (or fields) to bring into the form. Did you know that 3 of the 203 fields on the Customer Table are notes fields?

The selected field(s) will now display on the form.

If the field isn’t positioned quite where intended, the Move button ca be used to fine-tune the location of the new field.

Add a Field, Again!

It is generally bad database design to represent the same field twice on the same table, but not necessarily bad form design. For example, it may make sense to have customer currency in the sales demographics FastTab, and terms of payment in the Payment defaults FastTab. It might also be helpful to have this information closer to the top of the form. Add a field could be used to bring those fields onto the general FastTab in addition to their standard locations.

Add a Custom Field

Observant readers will notice the “Add columns” area also includes a “Create new field” button. Links below are included to outline that functionality – I’ll add my own opinions on the pros and cons of adding custom fields through personalization in a later post.

Additional Reading
Personalize the user experience
Create and work with custom fields
No Developer Required – Adding Custom Fields in Dynamics 365

Personalize Lock Fields | D365 Platform

The ‘Loch Ness Monster’ is not that kind of ‘Lock’. Regardless, you want to lock monsters from ruining your system with bad data entry.


Lock Fields

In personalization, Lock allows users to view fields, but not change their values. To lock a field, right click, select personalize, and then check the lock button.

As with all personalization features, these locked fields can be distributed to other users as published saved views.


Can’t This Be Done Through Security?

Yes. Without personalization, controlling who can see or edit what fields is managed through security. If you click on security diagnostics for the Vendor form, you can see there are two security privileges: one to view vendors and one to maintain (edit) vendor data.

To lock down a subset of fields through security, a system administrator would need to create a new security privilege (or modified copy of the maintain vendors privilege) and assign it to the desired duties or roles.

An advantage of locking fields through personalization is that it is easier to see which fields are being locked through the UI. Also, users can have multiple views – It’s possible have a default view where the data is not editable, but allow the user to toggle to another view where the data can be edited. This would be a more difficult proposition to manage through security. Pro tip – if you care very much about tracking edits to a particular field, consider enabling database logging on that field.


Lock Many Fields

Personalizations can be applied to individual fields, as well as Field Groups or FastTabs. If you want to lock lots of fields on a form, the easiest way to do this is by opening the personalization toolbar, clicking Lock and then clicking on the desired Field Group or FastTab.

Clicking on the Payment group controls all fields in the Payment group

Clicking on the Payment FastTab controls all fields in the Payment FastTab


That’s pretty much the whole concept – Lock, Stock, and Barrel.

Additional Reading
Personalize the user experience
D365 security topics
Database logging

Personalize Labels | D365 Platform

Campbell’s Soup Can by Andy Warhol

You say ‘Tomato’, I say ‘Tomato’ ” …a phrase better sung than read. No matter what label you wrap around a can of tomato soup – it’s still a can of tomato soup. In D365, buttons and headers have labels. The flexibility of having labels allows D365 to be useable in 46 different languages (including 9 types of English!). All the buttons are the same, but each has a set of language-specific labels. Custom labels can also be created through personalizations, then distributed to individuals or groups of users through saved views.


Personalize Labels

Right click on the desired button or header and select Personalize.

The label name will appear in the white field of the personalize box.

This text is editable, edits will change the label presented to the user.

These personalizations can be saved as a view (note the asterisk after “Standard view” in the last image) and the view can then be used individually or published to other users as desired.


Is This a Good Idea?

Well, maybe.

Without personalizations, label changes are a development task. A developer has to update the label file. That code has to get promoted up to the production environment. These changes then affect all system users of that language Want a label for only some users of that language? – just create a 10th version of English…then have that subset of users change their language preference. Personalizations is clearly a lighter touch for changing the name of a button.

But what is the purpose of a language? Common language facilitates communication. When I point to a can and tell you “tomato soup”, it’s only helpful if you also know it as “tomato soup” (Gazpacho…What’s that?). If sub-groups start referring to something by a new name, it can be difficult to talk about it across the whole organization – or describe to support technicians.

If Bob wants to rename the “Adjust transactions” button to “Bob’s Oh-no Button,” and have that on his own view…good news! That functionality exists.

Bob will have trouble describing “his” button to other members of that organization that know it as “Adjust transactions” in the standard view.

Clicking Bob’s Oh-no Button will still take Bob to the same Adjustments form (remember, this is the same button for everyone, only being viewed with a different label).

However, if accommodating a special request like this can facilitate change management, or win Bob as a champion of D365 throughout his organization, the exercise might be worthwhile.

So, Maybe.

Additional Reading
Personalize the user experience
How to create a label in Dynamics 365 for finance and operations
How to create a new language in Dynamics 365 for Operations

Personalize Required Fields | D365 Platform Update

Photo: Charge of the Light Brigade by Richard Caton Woodville Jr.

For want of a nail the shoe was lost;
For want of a shoe the horse was lost;
For want of a horse the battle was lost;
For the failure of battle the kingdom was lost—
All for the want of a horse-shoe nail.


Little things matter. Sometimes little things matter a great deal. Adding required fields helps prevent little bits of data from being lost on the great battlefield of D365.


Personalize Required Fields

In Platform Update 10.0.12. Require has been added as an option to the personalization toolbar.

As long-time readers will remember, the personalization toolbar can be accessed through the option tab, or by pressing the Ctrl+Shift+P hotkey. Once open, the user clicks on Require, then clicks on the fields to be required, and then closes the personalization toolbar.


Saved Views

As Saved views, these personalizations can be published to the desired members of the organization through security roles (see Publish saved views link below in additional reading for more details).

In addition to being a no-development solution, an advantage to this approach is that different fields can be required from different users. Imagine a business process where a general projects team create new projects across the company, but project managers are expected to enter a projected start and end date for visibility once they are specifically assigned to and begin maintaining their project.

Requiring the field through a saved view makes it easy for the project team to create and update other elements of the project through a standard view, while the Project manager’s view requires these data points to be entered.

Project manager view requires project start / end dates

Error message for Project manager not entering required fields

With fields populated, happy projects are all the same.

Additional Reading
Platform updates for version 10.0.12 of Finance and Operations
Personalize the user experience
Publish saved views

Requirements Gathering: An Application – Part 2

In the previous post, we considered a 2-part framework for requirements gathering:

  1. Functional Requirement – Identifying the Who, What, and Why (As a [fill-in-the-blank], I need to [fill-in-the-blank], so that [fill-in-the-blank])
  2. Non-Functional Requirements – Evaluating the additional considerations around the requirement (Availability, Compliance, Data retention, Performance, Privacy, Security, Scalability, etc)

This got me thinking – could I build an app to facilitate requirements gathering in this format?

As a [Solution Architect], I need to [Capture complete requirements], So that [I can create complete solutions]

I wanted an app structuring requirements entry so that the users would be guided to consider all of the requirement’s functional and non-functional elements. This seemed like a convenient use-case to try to build a PowerApp.

The Napkin Sketch


The SharePoint List

I started by creating a SharePoint list with columns for the functional and non-functional data points I wanted to capture. Then, to my surprise, I saw that there is a PowerApps “Create an app” button in the banner. That’s right – SharePoint lists come with a PowerApps Easy Button!!! (I understand this functionality has been around for a couple years, but it was new to me.)

I was impressed by how well the default app creation worked – it created a browse screen, detail screen, and edit screen with most of the functionality I wanted (though not necessarily captured in my initial napkin sketch).

The PowerApp

As my first PowerApp building experience, I wanted to play with the tool. The “Who” and “What” displayed on the Browse screen by default, but I also wanted to include the “Why”. I wanted to model the As a [fill-in-the-blank], I need to [fill-in-the-blank], so that [fill-in-the-blank] formula. I wanted sort the items by the ID number instead of the “Who” value. After some experimenting, my app now looks like this:

The Improved(?) PowerApp

Your eyes do not deceive you – after 1 hour of experimentation I was able to take a default app and make it less aesthetically appealing than when I started!

The Next Steps

I was really impressed with how simple it was to build a basic PowerApp. If i spent more time on this, I’d like to make the search functional, create validations for personas so that the “Who” field isn’t free text, maybe make the app more beautiful. However, the big takeaway is that I do now have a functional prototype. With minimal effort I could now give this to other solution architects for testing and feedback and see if this is a useful tool.

As the kids on YouTube say, let me know what you think in the comments!

Additional reading
PowerApps with a SharePoint List – Learn PowerApps Tutorial
Microsoft Power Platform: Learning Resources
Power Apps