Copy-paste automation in D365 FO with a keyboard emulator

by Eugen Glasow

The Microsoft Dynamics Product Group in their infinite wisdom first deprecated in D365 FO the import into an arbitrary table (because entities can do much more, and they became the First Class Citizens in the development environment), then the table browser in Production (because Microsoft Support Engineers were complaining the partners did not behave).

However, the ~2600 First Class Citizens are still too few in front of the common crowd of 9000+ application tables, and Microsoft Support Engineers themselves never execute SQL scripts against the database. In the absence of other mass update tools in Dynamics 365 FO, the consultant’s last resort became the clipboard: <Ctrl-C> <Tab> <Ctrl-V> <Ctrl-C> <Tab> <Ctrl-V> <Ctrl-C> <Tab> <Ctrl-V> <Ctrl-C> <Tab> <Ctrl-V> <Ctrl-C> <Tab> <Ctrl-V> <Ctrl-C> <Tab> <Ctrl-V> <Ctrl-C> <Tab> <Ctrl-V>… This activity is well paid like any other consulting routine, but it is as entertaining as watching the grass grow. Most importantly, it is error prone.

Desperate times call for desperate measures. Many large partners out there have already deployed their table browser forms and SQL injection tools, but in simple cases a keyboard emulator may help. I used the program called AutoHotkey with its rich scripting language.

The below scripts are started by this program with the hotkey <Ctrl-J>. They send key combinations into the browser window to perform repetitive actions. The <F1> key is your panic button to stop a script running amok. The D365 browser UI is not instantly responsive: allow for 10-100 milliseconds to enter data across different fields in one record, and 1000-1500 milliseconds on database operations of saving, deleting, or opening/closing a form. This is achieved by the “Sleep(x)” command. Even the tabulator key and <Alt-Something> combinations require some time for the JavaScript presentation layer to respond. The scripts simulate the key pressed, give some time to D365 to respond, and depress the key.

Watch it in action:

Mass-deleting lines

‘Simple list’ forms in D365 FO often offer no multi select capability, and with the table browser locked, mass deletion of lines becomes a sweaty exercise for the consultant. The following script calls <Alt-Del> and confirms ‘yes, delete’ one hundred times in a loop:
; ---------Press Ctrl-J to trigger
^j::
Loop 100 {
Sleep, 500
Send, {alt down}
Sleep, 100
Send, {Del}
Sleep, 100
send, {alt up}
Sleep, 500
Send, {TAB down}{TAB up}
Send, {TAB down}{TAB up}
Send, {Space}
Sleep, 500
}
Return
; Press F1 to stop
F1::ExitApp

Copy language translations

Many master tables come with translations into the customer/supplier language: terms of payment, terms and modes of delivery, miscellaneous charges etc. Entities such as the ‘Unit translation’ only exist for a few of them. Here is the rescue: import the language text with the entity into an existing field (e.g. Description), then copy and paste it into the Translation form. The below script copies 200 payment term descriptions into the ‘en-us’ language:
^j::
Loop 200 {
Sleep, 100
; ---------Copy the content of the Description field
Send, ^a
Sleep, 200
Loop 20{
Send, {Shift Down}{Right}{Shift Up}
Sleep, 10
}
Send, ^c
Sleep, 100
; --------- Open the ribbon, 'click' Translations
Send, !m
Sleep, 100
Send, a
Sleep, 100
Send, {TAB down}{TAB up}
Send, {TAB down}{TAB up}
Send, {TAB down}{TAB up}
Send, {Space}
Sleep, 1500
; ---------Create a new record
Send, {Alt Down}
Sleep, 100
Send, n
Sleep, 100
Send, {Alt Up}
Sleep, 1000
Send, en{-}us
; ---------Paste the content, save the record
Send, {TAB down}{TAB up}
Send, {TAB down}{TAB up}
Sleep, 200
Send, ^v
Sleep, 200
Send, ^s
Sleep, 200
; ---------Close the Translation form
Send, {Escape Up}
Sleep, 200
Send, {Escape Down}
Sleep, 500
; ---------Scroll down to the next record, and repeat the cycle
Send, {LControl Down}{Down}{LControl Up}
}
Return
; Press F1 in panic
F1::ExitApp

Leave a Reply

Your email address will not be published. Required fields are marked *