Tuesday, January 26, 2010

What's new in Microsoft Dexterity 11.0

The excitement around Microsoft Dynamics GP 2010 could not be any higher. Traffic on my site has doubled since I began releasing information about the upcoming version, which is currently being beta tested by a number of partners and have even seen a customer gone live as reported by Inside Microsoft Dynamics GP. For past articles, click on the following links:

Microsoft Dynamics GP 2010 - Navigation Enhancements
Microsoft Dynamics GP 2010 - Security Enhancements

However, none of these application enhancements could have been possible without the hard work of the Microsoft Dexterity team, which brought the following enhancements of their own to version 11.0 of Dexterity:

IDE Enhancements


  • Enhancements to Report Writer - While a number of you still dredge the fact that there is still Report Writer, the bottom line is I believe there will be Report Writer for a while. There's simply too much code tied to Report Writer and way too many reports in the system to simply replace them all. So to compensate, my friends in the Dex team have significantly improved the rendering of report outputs in HTML format and have provided a way to create an XML representation of the report layout.

  • Context Menus - While this is nothing new in the Windows world and holds true for many other applications, it was a long overdue feature in Dexterity. Dexterity now supports right-click enabled context menus for windows, window fields, scrolling window lines and scrolling window fields. When a context menu is displayed, a script is run that allows commands to be added to the context menu. Here is a sample script:



  • local integer result;
    local integer command_tag;
    local integer view_menu_command_list;
    local integer context_menu_command_list;

    {Build the View submenu}
    view_menu_command_list = Command_GetTag(command View of form RESM_Explorer);

    {Only need to build this once. Unlike the context menu, it is not cleared
    automatically when the context menu action is complete.}
    if CommandList_NumCommands(view_menu_command_list) = 0 then
    {Large Icon}
    command_tag = Command_GetTag(command Large_Icon of form RESM_Explorer);
    result = CommandList_Add(view_menu_command_list, command_tag);

    {Small Icon}
    command_tag = Command_GetTag(command Small_Icon of form RESM_Explorer);
    result = CommandList_Add(view_menu_command_list, command_tag);

    {List}
    command_tag = Command_GetTag(command List of form RESM_Explorer);
    result = CommandList_Add(view_menu_command_list, command_tag);

    {Report}
    command_tag = Command_GetTag(command Report of form RESM_Explorer);
    result = CommandList_Add(view_menu_command_list, command_tag);

    end if;

    {Build the context menu}
    context_menu_command_list = Command_GetTag(command cmdListContextMenu);

    {Add the View sub-menu}
    result = CommandList_Add(context_menu_command_list, view_menu_command_list);

    {Separator}
    command_tag = Command_GetTag(command cmdSeparator);
    result = CommandList_Add(context_menu_command_list, command_tag);

    {Print}
    command_tag = Command_GetTag(command Print of form RESM_Explorer);
    result = CommandList_Add(context_menu_command_list, command_tag);

    As you can tell, context menus are based on command lists... same principle used for standard menu items.

  • Dexterity now sports a new Watch window, wich can be selected from the Debug menu in test mode.




  • The Script Debugger has a context menu in test mode. The truth is, I could not get this feature to work in my current build of Dexterity - 11.00.0206.000


SanScript Enhancements


  • run report statement now has the option to define a new XML export type. The constant defined for this operation is XMLFILE. The statement syntax is still the same:


  • run report report_name {with restriction boolexp}{sort by field{nocase}{descend}}
    {by key_name by number expr}{legends [string_expr_list array_index_list]
    {destination screen_boolean, printer_boolean
    {, export_type, export_name}}{
    printer printer_settings}


  • Similar enhancements have been implemented for the run report with name statement. You can also specify an XML export type.


  • run report with name report_name {with restriction boolexp}{sort by field{nocase}{descend}}
    {by key_name by number expr}{legends [string_expr_list array_index_list]
    {destination screen_boolean, printer_boolean
    {, export_type, export_name}}{
    printer printer_settings}{in dictionary product_ID}

  • The savefile() function has also been given the ability to save documents to XML format by using the XMLFILE constant.


  • local string path;
    local integer file_type;

    if savefile("Export file", file_type, path, "XML file (*.xml)*.xml) then
    call Export_XML_File(file_type, path);
    end if;



New Functions

File
File_GetSize()
File_GetTempDirectory()


File list
FileList_Add()
FileList_Count()
FileList_Create()
FileList_Destroy()
FileList_Get()
FileList_Remove()
FileList_ShowDialog()

File type
FileType_CanAppend()
FileType_FillList()
FileType_GetExtension()
FileType_IsValid()


MAPI
MAPI_DisplayReplyToDialog()
MAPI_GetAddress()
MAPI_IsLoggedOn()
MAPI_IsMailEnabled()
MAPI_LogOff()
MAPI_LogOn()
MAPI_ProfileGetAddress()
MAPI_PropertyListCount()
MAPI_PropertyListCreate()
MAPI_PropertyListDestroy()
MAPI_PropertyListGetValue()
MAPI_PropertyListGetValueByIndex()
MAPI_PropertyListSetValue()
MAPI_ResolveAddress()
*MAPI_Send()
*MAPI_SendDialog()


* Enhanced to support attachments, reply to lists, and properties not exposed through the MAPI function.

Path
Path_ParsePathFromPath()

Registry
Registry_DeleteKey()
Registry_DeleteValue()
Registry_GetProtectedString()
Registry_GetValue()
Registry_SetKeyValue()
Registry_SetProtectedKeyString()


Trigger
*Trigger_RegisterFocus()
*Trigger_RegisterFocusByName()


* Enhanced to support focus triggers on context menu events.

Until next post!

MG.-
Mariano Gomez, MVP
Maximum Global Business, LLC
http://www.maximumglobalbusiness.com/

5 comments:

Anonymous said...

Thanks Mario for the update on Dex. I find it incredible that they still haven't added true MDI support in the IDE or even rolled this language into the Visual Studio IDE.

Mariano Gomez said...

Wishfull thinking my friend.

MG.-

RonH said...

I guess Dex is continuing to evolve, a real surprise.
And yes, all Dex developers are ‘wishful thinkers’.

Anonymous said...

Hi Mariano,

I was wondering if I could validate the 'run report' statement in dex to determine if the report was actually printed. I know VBA may fix this, only that I want to check it within dex i.e. if run report is successful, then an event is logged, or a trigger is fired etc.. Any ideas are most welcome.

Peter Muchira

Mariano Gomez said...

@Peter:

My first thought would have been a try..catch..end try block, but in looking at the system exceptions, I noticed that there are no exceptions that deal with the run report statement, so we are SOL on this one.

The best thing would be to open a Microsoft Connect case requesting this as feature enhancement to Dexterity.

MG.-