Thursday, April 21, 2016

Walkthrough: Implementing New Workflow Events and Responses for Sales Header on Delete Record

Walkthrough: Implementing New Workflow Events and Responses

Introduction

Microsoft Dynamics NAV 2016 Workflows enable you to model real-life business processes like best practices or industry-standard practices. Ensuring a customer’s credit limit has been independently verified or requiring a two-person approval for a significant vendor payment are both examples of these.  Workflow can be thought of as the movement of documents or tasks through a work process. Workflows in Dynamics NAV focus on three main building blocks and almost any workflow process, short or long, is likely to be comprised of steps related to these three blocks.  They are:
  • Approval, approval leaves a work task, item or document in an blocked or unapproved state until approved by a suitable person in your organization
  • Notification, notifications tell users that something has happened and/or that they need to take some kind of action
  • Process automation, process automation means executing a process routine and have the Dynamics NAV system calculate something or perform an action


The workflows in Dynamics NAV are represented by Workflow Events and Responses.  The smallest workflow is the pairing of a single Event and a Response.  Simple workflows could be
  • When a new customer is created, email the sales person responsible for that region to alert them to the new customer
  • When a purchase invoice exceeds $250, email the financial controller to alert them


More complex workflows are built of chains of events and responses.  Examples could be
  • When a Purchase Invoice exceeds $250, put the purchase invoice on hold until it is approved by a manager.
  • When new customers are created, block them until they have had a credit check performed.
  • Once a purchase document has been approved by the accounting manager, automatically post it to the Dynamics NAV system.


Note: in all the examples above, you can see a “when something happens, do something” pattern.  This is the “Event and Response” model and is the simple but effective design behind Dynamics NAV workflows.

Events and Workflow Events

Perhaps confusingly, Dynamics NAV 2016 introduces two new event concepts.  Events and Workflow events.  The two are distinct but often coupled together to build solutions.  Dynamics NAV Events allow you to write code which will be called when an event occurs – this is called subscribing to an event.  An example could be to subscribe to the OnCreate trigger for a table and writing code which will be called whenever a new record is created.
Workflow Events typically use Platform Events as their trigger, but are richer.  Workflow events are registered in the workflow engine and show up in the workflow designer.  Microsoft recommends that Workflow events be written at a higher level of abstraction than Platform Events, for example while OnCreateNewCustomerRecord makes a suitable platform event, a good workflow event could be AfterOverduePaymentIsPosted.



Scenarios

Demo 1 – Create a workflow event
The scenario in this demo script is to define an event based on the OnDelete trigger of the “Sales Header” table and expose that event as a workflow event.  This is done in the C/AL Object Designers.  This task is typically performed by C/AL developers.

Demo 2 – Create a workflow response
The scenario in this demo script is to define a response which send an email to “Sales Manager”.  This is done in the C/AL Object Designers.  This task is typically performed by C/AL developers.

Demo 3 - Enable the workflow & response in the NAV system
The scenario of this part of the demo script is to show managing workflow events & responses from a Dynamics NAV system to build a workflow.  This task is typically performed by super users.

Demo 1 - Create a workflow event
To demonstrate the definition of an event you will need to work in the C/AL editor and Object Designer.  Most of the work is done in the code editor and we will use codeunits for our application objects.
  • Open the Microsoft Dynamics NAV 2016 Development Environment.
  • On the Tools menu, choose Object Designer.
  • From Object Designer, create a new codeunit.
  • Create a method called OnDeleteOrderCode. And Give the method a return value of Code, length 128.
  • And write the code: EXIT(UPPERCASE('OnDeleteOrder'));
  • Create the event itself.  This will be an empty method tied to the "Sales Header" table.
  • To do so, make another global method, called OnDeleteOrder.
  • Open the property window for the method (view->properties) and set the Event property to Susbscriber, EventPublisherObject to Table Sales Header and EventFunction to OnAfterDeleteEvent.
  • From the editor, define a local variable for the OnDeleteOrder function.
  • In locals, create a variable called WorkflowManagment, subtype codeunitWorkflow Management
  • Add the code

MESSAGE('My Delete event is fired.');// Testing purpose
     WorkflowManagement.HandleEvent(OnDeleteOrderCode,Rec);

  • Create another event that will be a subscriber to the Add Events to Workflow Library event.
  • To do so, make another global method, called AddEventToLibrary.
  • Open the property window for the method (view->properties) and set the Event property to Susbscriber, EventPublisherObject to Codeunit ‘Workflow Event Handling” and EventFunction to OnAddEventsToLibrary.
  • Create a text constant to hold the user readable string which describes the workflow event. Select view->Globals->text constants and add a new value OnDeleteTxt and set the value to ‘when a sales order is deleted’.
  • Next, define a local variable in the AddEventToLibrary function for calling the WorkflowEventHandling codeunit.
  •  In locals, define variable WorkflowEventHandling as a codeunit of subtype ‘Workflow Event Handling’.
  • Finally add the code which calls that method.


WorkflowEventHandling.AddEventToLibrary(OnDeleteOrderCode,
DATABASE::"Sales Header",
OndeleteTxt,0,FALSE);
Note: [See the bellow screenshot for better understanding].               





The scenario in this demo script is to define a response which send an email to “Sales Manager”.  Most of the work is done in the code editor and we will use codeunits for our application objects.
Note: you can create another codeunit also but in our Demo I’m going to write in this codeunit only.
  • Now Add one Method “RunSendEmailResponseCode” And set the return Type Code And Length 128.
  • Add Code:

                    EXIT(UPPERCASE('RunSendEmailResponse'));

  • Add Another method AddResponseToLibrary.
  • Add another method EsecuteResponse
  • See the bellow screenshot for details of these two methods property & Code







  • Add another method for sending email to sales header
  • See the bellow screenshot for mail sending code.






                                       
Demo 3 — Enable the workflow event in the NAV system

This part of the demo script shows managing workflow events from a Dynamics NAV system.  An entire workflow is comprised of binding a Workflow Event and a Response together and then enabling it.





Kindly let me know via comments, if you wish any clarification from my side. 
In my next post i will describe how we can create own Integration Event and called it whenever the order is Released.


Monday, March 21, 2016

Outlook Attachment & Send in NAV 2016 Using Dotnet Variables

Hi All,
     Today I'm going to describe how you can do the bellow requirements using NAV 2016.
1. Open Outlook Application.
2. Attach file.
3. Send attachment.

Solution:

      To achieve all requirements follow the given steps:

Step-1: Create a codeunit in my case ID 90001, Name "Outlook Attachment & Send".

Step-2: Open the C/AL Globals and Declare theses Variables [See the Bellow Screenshot].



Name DataType    Subtype  Length
olapp DotNet Microsoft.Office.Interop.Outlook.ApplicationClass.'Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'

olMail DotNet Microsoft.Office.Interop.Outlook.MailItem.'Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'

OlItemType DotNet Microsoft.Office.Interop.Outlook.OlItemType.'Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'

olAttachType DotNet Microsoft.Office.Interop.Outlook.OlAttachmentType.'Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'

BodyFormats DotNet Microsoft.Office.Interop.Outlook.OlBodyFormat.'Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'

Note: Sets the each DotNet Variables "RunOnClient" property "Yes" [See the Bellow Screenshot].

CU-Outlook Attachment & Send Variables Property


Step-3: Write the C/AL Code on "OnRun" trigger [See the Bellow Screenshot].

CU-Outlook Attachment & Send


Step-4: Save & Run this Codeunit.

Result: Opened Outlook And Sent Email with Attachments.

Note: If  this "olMail.Send;" is commented then only display the outlook application with attachment.


Thanks & Best Wishes
Binesh Singh
(MCP, MS, MCTS)

Friday, January 29, 2016

Creating the Word Template for MS Dynamics NAV 2016 (or) Export to Word

Hi, All
Today one of my client wants to Export the data from NAV to MS Word, for that i prepared documentation, you can also use, its working fine.

Automation lets you use the capabilities and features of Microsoft Office products,
such as Microsoft Word or Microsoft Excel, in your Microsoft Dynamics NAV application.
In this demonstration, we will implement Word Automation from a Estimating Project card in the Microsoft Dynamics NAV Windows client.

The letter will include information about the Estimating Project, such as the Estimating Project's name and the address and so on...

-------------------------------
Creating the Word Template for Use by Automation

First, you create a Word template that you will use to create letters to Projects.
To create the template, you add mail merge fields for displaying data that is extracted from Microsoft Dynamics NAV that you want included in the Estimating Project letter, such as the Project's name, Address, City, State, Dodge No. and so on...
You will create and save the template on the computer running the Microsoft Dynamics NAV Windows client, because you will configure the automation object to run on the client.

To create the template
1. On the computer running Microsoft Dynamics NAV Windows client, open Word and create a new document.
2. Choose where you want to insert the fields. Then, on the Insert tab, in the Text group, choose Quick Parts, and then choose Field.
3. In the Categories list, select Mail Merge.
4. In the Field names list, select MergeField.
5. In the Field Name box under Field Properties, type ProjectName. This field will display the name of your Project at the Estimating as taken from the Estimating Project table.
6. Choose OK to add the field.
7. Repeat steps 2 through 6 to add the remaining fields.
8. Save the Word document as a template with the name Template.dotx at C:\Temp\Estimating or a folder of your choice.
------------------------
Creating the Codeunit and Declaring the Variables

To create the codeunit
1. In Object Designer, choose Codeunit, and then choose the New button to create a new codeunit.
2. On the View menu, choose Properties to open the Properties window of the codeunit.
3. In the TableNo field, choose the AssistEdit button to open the Table List window.
4. In the Table List window, select the Estimating Project table, and then choose OK.
5. Close the Properties window.

To declare the variables
1. Choose the OnRun Trigger and on the View menu, choose C/AL Locals, and then choose the Variables tab.
2. On a blank line, type wdApp in the Name field and set the Data Type field to Automation.
3. In the Subtype field, choose the AssistEdit button. The Automation Object List window is displayed.
4. In the Automation Server field, choose the AssistEdit button.
5. In the Automation Server List, select Microsoft Word 15.0 Object Library if you are running Word 2013,
or select Microsoft Word 14.0 Object Library if you are running Word 2010, and then choose OK.
6. From the list of classes in the Automation Object List, select the Application class, and then choose OK.
7. Repeat steps 2 through 6 to add the following two Automation variables:
Name Data type Subtype Class
wdDoc Automation Microsoft Word 14.0/15.0 Object Library Document
wdRange Automation Microsoft Word 14.0/15.0 Object Library Range
TemplateName Text
-------------------------------------------------------------------------------
Writing the C/AL Code
1. In the C/AL Editor, add the following lines of code to the OnRun section.
2. To create an instance of Word before using it, enter the following line of code.
CREATE(wdApp, FALSE, TRUE);
This statement creates the Automation object with the wdApp variable.
o The first Boolean parameter in the statement (FALSE) tells the CREATE function to try to reuse an already running instance of the Automation server that is referenced by Automation before creating a new instance. If you change this to TRUE, then the CREATE function always creates a new instance of the Automation server.
o The second Boolean parameter in the statement creates the Automation object on the client. This is necessary to use this codeunit on a page in the Microsoft Dynamics NAV Windows client.

3. Enter the following lines of code to add a new document to Word that uses the template that you designed earlier.

TemplateName := 'C:\TEMP\Estimating\Template.docx';
IF NOT EXISTS(TemplateName) THEN
  ERROR('File Not Found');

wdDoc := wdApp.Documents.Add(TemplateName);
wdApp.ActiveDocument.Fields.Update;
------------Transferring Data to Word -------------
wdRange := wdApp.ActiveDocument.Fields.Item(1).Result;
wdRange.Text := "Job Name";
wdRange.Bold := 0;

wdRange := wdApp.ActiveDocument.Fields.Item(2).Result;
wdRange.Text := FORMAT("Bid Date");
wdRange.Bold := 0;

wdRange := wdApp.ActiveDocument.Fields.Item(3).Result;
wdRange.Text := Address;
wdRange.Bold := 0;

wdRange := wdApp.ActiveDocument.Fields.Item(4).Result;
wdRange.Text := Estimator;
wdRange.Bold := 0;

wdRange := wdApp.ActiveDocument.Fields.Item(5).Result;
wdRange.Text := City + State;
wdRange.Bold := 0;

wdRange := wdApp.ActiveDocument.Fields.Item(6).Result;
wdRange.Text := "ZIP Code";
wdRange.Bold := 0;

wdRange := wdApp.ActiveDocument.Fields.Item(7).Result;
wdRange.Text := "No.";
wdRange.Bold := 0;

wdRange := wdApp.ActiveDocument.Fields.Item(8).Result;
wdRange.Text := "Dodge Plan No.";
wdRange.Bold := 0;
wdRange := wdApp.ActiveDocument.Fields.Item(9).Result;
wdRange.Text := "L/P Specification No.";
wdRange.Bold :=0;

wdRange := wdApp.ActiveDocument.Fields.Item(10).Result;
wdRange.Text := FORMAT("L/P Specification Date");
wdRange.Bold := 0;


wdApp.Visible := TRUE;
wdApp.ActiveDocument.Fields.Unlink;
----------------------------------------------------------
-----IF you want to insert any Image/Shape then add this code
wdApp.Selection.ParagraphFormat.Alignment := 1;
LinkToFile := FALSE;
SaveWithDocument := TRUE;
FileName := ItemSpec."Image URL";
IF FileName <> '' THEN
  wdDoc.InlineShapes.AddPicture(FileName,LinkToFile, SaveWithDocument);
----------------------------------------------------------

Calling the Codeunit from the Estimating Project Card 
________________________________________
The final task is to ensure that you can call the codeunit from the Estimating Project Card page in the Microsoft Dynamics NAV Windows client.
To call the codeunit from the Estimating Project card page in the Microsoft Dynamics NAV Windows client.
1. Open Object Designer, and then choose Page.
2. Select the Estimating Project Card page and then choose Design.
3. On the View menu, choose Page Actions.
4. To add a new action, locate the action container with the subtype set to ActionItems.
5. Right-click the next line after the ActionItems container, and then choose New.
6. In the Caption field of the new line, type Word Letter.
7. Set the Type field to Action.
8. With the new action selected, on the View menu, choose Properties.
9. In the RunObject field, type codeunit Export Estimating in Word.
10. Save and compile the Estimating Project Card page.
---------------------------------------------------
To run the Estimating Project Card and view the Word letter
1. In Object Designer, choose the Page button.
2. Select the Estimating Project Card page, and then choose Run.
3. In the ribbon, on the Actions tab, choose the "Export Estimating in Word" action.
The letter document opens in Word.
-------------------------------------------------

References: MSDN



Thanks & Best Wishes
Binesh Singh Rajput
(MCP, MS, MCTS)

Popular Posts