Things have changed a lot since I started blogging over a decade ago. There are so many wonderful topics to blog and learn on today; it seems like one doesn’t even know where to start. To make the process more friendly, I’ve introduced a new sort of post — the hybrid video/blog tutorial. In this series, we will produce a video and blog for every topic covered. Some very talented developers from my team have contributed their expertise to assist with this content/video approach to ensure that we keep our quality and quantity high. I hope you all sincerely enjoy the new approaches that we’ve innovated.. And as always, don’t hesitate to reach out to me.. I’m always here to help. — Brandon Ahmad
Using the Microsoft Dynamics 365 data model to create a product receipt
Now that you’ve learned how to register or reserve any purchased item from your inventory, it’s time to generate your first product receipt. Creating receipts is important and informative, as it confirms your customers have received your products. Receipts also allow you to process your purchase order lines (POs) for invoicing. Make no mistake, you can gather an amazing amount of information from receipts – if you know what to look for. After you generate the product receipt, the system creates an unchangeable voucher document. This document generates physical inventory transactions. The Dynamics 365 data model gives you a unified, ‘bird’s-eye-view’ over your product receipts. This streamlined system efficiently combines Dynamics 365 data model ERP functionality for clear oversight of changes within your physical, on-hand inventory. The most notable change is an increase in your inventory levels.
Dynamics 365 data model functional walkthrough: Manually create a product receipt
Remember, the first stage of this process occurs when a warehouse receives the product and it’s called product receipt registration. It often helps to visualize the physical processes happening behind the scenes as we cover the product receipt process. This is especially true if the following steps and functions seem difficult to grasp.
Now, let’s perform the function:
Step 1:
Click on the Receive tab and check out the list of options under ‘GENERATE.’ Go ahead and click on Product Receipt.
Step 2:
When you click Product receipt, a form opens up. Make sure all printing options have ‘No’ selected. Enter the vendor’s product receipt number under ‘Product receipt.’ Then click OK.
One thing to note here is that you don’t actually have to get your product receipt number from your vendor. If it makes more sense, you can use your own self-maintained system and create your own numbers. Just make sure it’s organized.
If you are a developer wishing to learn more than it may be wise to check out our Boot Camp, which takes you from zero to hero with some serious hands-on lab action.
Step 3:
Once you’ve posted your product receipt, you can easily return to it at any time. Just click on the Receive tab and then click the Product receipt button under ‘JOURNALS.’
The Dynamics 365 data model and the receipt tables process: Technical walkthrough
Now let’s look at how the Dynamics 365 data model uses tables to make the product receipt process more streamlined. Following tables are involved in this process, and they display a number of fields that provide you with helpful insights.
Entity Relationship Diagram:
There are important tables involved in the product receipt process. The following ERD diagram illustrates how this process works.
You can also process receipts by using X++ code. Here is a runnable class (job) that processes the receipt:
[sourcecode language=”c-sharp”] class ibPurchaseOrderLearningDemo{
/// <summary>
/// Runs the class with the specified arguments.
/// </summary>
/// <param name = "_args">The specified arguments.</param>
public static void main(Args _args)
{
PurchId purchId;
PurchTable purchtable;
PurchFormLetter purchFormLetter;
purchId = "00000275"; //replace this Purchase order number with yours.
purchtable = PurchTable::find(purchId);
//Validate if Purchase order is in Confirmed state.
if(purchtable.DocumentState != VersioningDocumentState::Confirmed)
{
throw error(strFmt("The purchase order should be in confirmed state."));
}
purchFormLetter = purchFormLetter::construct(DocumentStatus::PackingSlip);
purchFormLetter.showQueryForm(false);
purchFormLetter.update(
purchTable,
strFmt("GRN-%1", purchtable.PurchId), // enter your Product Receipt number here
DateTimeUtil::date(DateTimeUtil::utcNow()),
PurchUpdate::All,
AccountOrder::None,
false,
false);
info(strFmt("Product Receipt posted successfully."));
}
}
[/sourcecode]
VendPackingSlipJour
The VendPackingSlipJour table contains the posted product receipt headers. Here’s a rundown of what this table does.
- Checks the received quantity of purchase orders.
- Provides helpful information related to a purchase order, such as the delivery dates of the purchase order, payment terms, and more.
- Displays the physically received quantities of various warehouses in a relevant time period.
Check out the following list of important fields that you can find on the VendPackingSlipJour table. Along with related technical information, you can find explanations of each field under the ‘Description’ section.
Field | Type | Description |
OrderAccount | string | This field contains Order Account of a purchase order. |
DeliveryPostalAddress | int | This field contains Delivery Address of a purchase order. |
InvoiceAccount | string | This field contains Invoicing Account of a purchase order. |
PackingSlipId | string | This field contains Packing Slip Id of a purchase order. |
PurchaseType | enum | This field contains Purchase Order Type of purchase order. |
PurchId | string | This field contains Purchase Id of a purchase order. |
VendPackingSlipTrans
The VendPackingSlipTrans table is the other important table involved in this process, and this table contains posted product receipt lines. Here’s what this table is responsible for:
- Displays the inventory transaction details of your purchase order lines.
- VendPackingSlipTrans is involved in reporting posted purchase order product receipt details.
- Locates pending purchase order details.
Here’s a list of various fields you can find within the VendPackingSlipTrans table:
Field | Data Type | Description |
ItemId | string | This field contains Item Id of purchase order line |
PackingSlipId | int | This field contains Packing Slip Id of purchase order line |
PdsCWQty | string | This field contains CW Quantity of purchase order line |
PriceUnit | string | This field contains Unit Price of Purchase order line |
Qty | real | This field contains Quantity of Purchase Order line |
InventTrans
As we have already covered this table in the previous blog, let’s discuss some of the important fields which are affected by this process. This table shows all entries related to receiving and shipping warehouses.
Field | Data Type | Description |
ItemId | string | The inventory item id of the PO line item is repeated. |
PackingSlipId | string | Link transaction to newly created packing slip transaction. |
Qty | real | The inventory quantity transacted. |
DatePhysical | dateTime | Posting date of physical inventory transaction. |
StatusReceipt | enum | Represents the inventory receiving status in relevant warehouse. |
Summary
Congratulations! You now know how to create the Product receipt. In this section, you looked at a batch sample transaction in X++ and examined the Dynamics 365 data model behind the transaction. You also explored vendpackingslipjour, vendpackingsliptrans, and inventtrans - major tables involved in generating and processing receipts.
Although creating a product receipt increases your inventory, these tables also provide you with tons of additional information. You can use these tables to see pending purchase order details, reserve quantities, and much more. There are many different fields in each table, and each provides valuable information. This is just one example of how the Dynamics 365 data model can provide you with valuable insights.
We sincerely hope that you enjoyed part 3 of our exciting series on the Dynamics 365 data model. We aim to provide quality service at all times. And as always, if you need to reach me, you know how to get in touch by reaching out to me here. — Brandon Ahmad, founder of InstructorBrandon and Dynatuners
I’m attempting to add a column to my receipt journal – I can show the Quantity received on the PO lines, but cant add this to the journal. Is this a configuration issue? or will I need development to update the tables?
Hi Breanna,
This is a very good question. This will require a small amount of customization due to the parent-child relationship between the PurchTable and the PurchLine table. The advantage, however, is that this is a small customization.
Or, if you would like to go no-code, you can simply copy the data via OData into an Excel workbook and join it there quite quickly. We’ll make a future blog demonstrating how to do this for our next post. Thank you for asking this question!
Thanks Jorge – this was very helpful!