Business Central – Implementierung, Schritte, Herausforderungen

Das ERP Projekt

Wie es meist abläuft?

Gerade beim Starten einer ERP Einführung werden manchmal viele Fehler gemacht, bei kleineren Firmen im Besonderen. Budget und Zeit werden deutlich überschritten, Anforderungen werden nicht erfüllt.

Warum?

  • Der aktuelle Software Partner nimmt das Projekt zu wenig ernst.
  • Unerfahrene Junior Berater übernehmen das Projekt.
  • Es wurde keine oder eine unzureichende Business Analyse durchgeführt.
  • Das Projektmanagement hat schlichtweg versagt.
  • Anforderungen werden nicht oder schlampig umgesetzt.
  • Termine werden nicht eingehalten.
  • Der Berater ist oft nicht erreichbar, hält keine Zusagen ein.
  • Die behaupteten Ergebnisse sind nicht nachvollziehbar.
  • Das Vertragswerk benachteiligt den Kunden erheblich.
  • Die Basis Einrichtung, speziell die Fibu Einrichtung wird schlampig umgesetzt.
  • Die Altdaten werden vor der Übernahme nicht bereinigt und korrigiert.
  • Bei der Datenmigration wird unsauber gearbeitet, Folge sind Fehler bei den importierten Daten.
  • Es wird viel zu wenig getestet.
  • Die Mitarbeiter des Kunden werden viel zu wenig eingebunden.

Folgen

  • Ärger mit dem Partner und der Software dauert oft Jahre.
  • Ein Partnerwechsel wird kaum in Betracht gezogen, da das Risiko als zu hoch eingeschätzt wird.

Wie sollte die Einführung von Business Central, generell von einem ERP System ablaufen?

  • Mit einer umfassenden Business Analyse werden ihre Prozesse erfasst, obsolete Prozesse frühzeitig erkannt, Optimierungen werden vorgeschlagen.
  • Die Analysen werden genau protokolliert und dokumentiert.
  • Die Datenmigration wird detailliert vorbereitet, die Altdaten werden zuvor gesichtet, bereinigt, korrigiert.
  • Die Buchhaltung wird genau besprochen, Kontenplan, Buchungsgruppen und dgl. Die Einrichtung wird entspechend vorbereitet.
  • Die Berichte werden besprochen, Layout und Informationen definiert.
  • Nötige Anpassungen werden erörtert.
  • Ein Testsystem wird aufgesetzt, die Basis Einrichtung inkl. Fibu wird umgesetzt, ein wesentliches Set an Echtdaten wird übernommen, die Mitarbeiter des Kunden arbeiten damit, um das System kennenzulernen.
  • Die besprochenen Anpassungen bei den Tabellen, Formularen, Berichten werden umgesetzt und getestet. Erforderliche Änderungen werden übernommen und ebenfalls getestet.
  • Termine werden eingehalten, Hindernisse und Verschiebungen werden zeitgemäß bekanntgegeben.
  • Das Projektmanagement arbeitet agil, Tasks werden in einem passenden Tool wie Jira oder MS Planner verwaltet.
  • Nach erfolgreichen Tests mit dem Testsystem wird das Produktivsystem aufgesetzt, die Anpassungen (Tabellen, Formulare, Berichte, Schnittstellen) werden eingespielt, die Einrichtung incl. Fibu durchgeführt, die Datenmigration wird vorbereitet und Schritt für Schritt die Datenbank aufgebaut, die Eröffnungsbilanz eingerichtet, Abnahmetests schließen den Vorgang ab, der GoLive wird einige Tage bis Wochen begleitet, notwenige Änderungen und Korrekturen durchgeführt.

Freelance Consultant

Hi,

since a couple of years i work as freelance consultant, in the bc/nav area as well as business analyst and project manager.

If you are looking for support, want to implement bc, have issues with your bc or nav system or you are not satisfied with your current partner, feel free to contact me.

I provide consulting for Business Central and Navision. That contains business analysis, project management, license management, data migration, trainings, coding, reports.

Other services are business analysis and project management for every kind of software project as well as software evaluation.

As you may know i was an active member of the nav/bc community for many years, helped thousands to solve there issues. I do also have many years of project experience in various branches.

My company homepage: dfk-consult.at

So, you are welcome to contact me via

freelancermap, my homepage, mail

Dipl.Ing. Franz Kalchmair

ERP consultant, Business Analyst, Project Manager
Problem solver, Former MVP

Austria

Record Race Condition – 2 users block each other

A forum user needed help for a typical situation in dynamics nav. 2 users are working on the same sales order at the same time. both make changes. as a result one gets the error: the current record has an old load status, record was changed by an other user.

this is a so called race condition, means two persons want to change the same record or the value of the same field. at the time were the second person, who edited the record, wants to save his changes, the system realizes, that the status of the loaded record is old, because the first person has already saved his changes.

the question was: how to lock the sales order, when one user edits the record, so that a 2. user cannot edit the record.

how to solve the problem:

  • the process answer: i most cases that should not be an issue, because only one user should work with one record at a time, e.g. one sales order. it makes no sense that 2 persons work at the same time with the same order. if that occurs, the work process in the company needs some optimization. So some consultancy is needed.
    • situation 1: 2 persons do different things with the same order. In that case a workflow has to be defined, so that person 1 does his work first, then in step 2 person 2 his work step. result: never work 2 persons at the same time with the same order.
    • situation 2: both do the same. then it’s needed to set the field assigned user, so that each person can filter the sales order list by that field and get so the assigned work load. as a result there is never a situation, where 2 persons work with the same order.
  •  tech answer: the issue is also solvable technically, but i recommend the process change.
    • table sales header: add 2 fields InUse – boolean, UsedBy – code.20
    • page 42 sales order, add following code to
      trigger OnQueryClosePage

      IF UsedBy = USERID THEN BEGIN

      UsedBy := ”;
      InUse := FALSE;
      modify;

      END;

      trigger OnAfterGetCurrRecord()
      IF NOT InUse THEN BEGIN

      InUse := TRUE;
      UsedBy := USERID;
      modify;

      END ELSE

      IF UsedBy <> USERID THEN
      ERROR(‘in use by %1’, UsedBy);

cheers

Workflows in Dynamics Nav/BC

Hallo,

ich beschäftige mich aktuell mit Workflows in Dynamics Nav.
Ich bin seit vielen Jahren Senior Consultant für Dynamics Nav und hatte keinen einzigen Kunden, der das Workflow Modul im Einsatz hat, was schade ist, weil das Modul durchaus was kann. Gestern ist mir jedoch klar geworden, dass man keine Genehmigungsrollen in einem Workflow benutzen, nur mit spezifischen Benutzern arbeiten kann. Tasks von einer Rolle zu einer anderen Rolle weiterzuleiten ist aber ein typisches Thema in Workflowszenarien, etwa beim Eingangsrechnungsworkflow.

Dazu ein paar Fragen:
* Lässt sich das Thema Genehmigungsrolle mit dem Standard Nav Workflow umsetzen bzw. gibt es dafür entsprechende Erweiterungen von Drittherstellern?
* Welche konkreten, typischen Anforderungen haben die Kunden, die das Workflow Modul benutzen? Mussten hier Anpassungen vorgenommen werden oder reichten die Features des Standard Nav Workflow Moduls?

Würde mich über Feedback freuen.

beste Grüße
Dipl.Ing. Franz Kalchmair

Do you know Uniconta?

Because working with D365 BC is not that fun and the features are for small customers too much (they pay for many, what they don’t need), i started with Uniconta. First of all, it is far away from big ERP Systems like NAV and BC. The marketing propaganda says it’s easy to use … So what is the reality?

Uniconta is a new cloud based ERP System. At first view some nice features, quite cheap, very fast, but lacks in some kind in the areas configuration, usability and business logic. It’s quite hard to customize it in that way we know it from NAV. It’s easy to add fields in tables, but not easy to add a button with it’s on functionality. It’s not possible too change existing code, e.g. the posting routines like in Nav often done.

Examples:

  • Often needed information is not available on the current point, e.g. item ledger entries (i.e. inventory posting entries in uniconta) are not available in the shipment list.
  • Shipment can be created from an order multiple times without changing anything in the system except that there is a new shipment in the list. That’s really disturbing.
  • Creating a shipment does not reduce the item stock. That’s also really disturbing.
  • To post an order only for delivering, but without invoicing was really hard to find out, how this simple basic erp process works in uniconta. that after some needed configuration (sales preferences, activating of some inventory module features) the item quantity of the sales line is removed from stock immediatly when you set up the quantity in the sales line and not after posting, is quite strange. seems that this is a kind of reservation. is this a well considered erp process? not sure …

I tested a lot, found a huge number of programming/logic/translation failures and irritating and/or not translated error messages (some of them are like “error has occured”), wrote a lot, lot mails to the austrian support. It’s tedious … Nevertheless, maybe i will continue, will see, if i have the time …

In the end, who knows, maybe it will be developed into the right direction. Hopefully the bugs will be fixed and the usability & the business logic will be better.

For more details see:

cheers

 

Read & process CSV files programmaticaly

LOCAL ReadCsvFile()
fmode := fmode.Open;
fstream := fstream.FileStream(‘c:\temp\test.csv’,fmode);
enc := enc.UTF8; // read text as UTF8 charset, can also be Default (Windows) or Ascii
reader := reader.StreamReader(fstream,enc);
REPEAT
Line := reader.ReadLine;
//MESSAGE(Line);
ColNo := 1;
REPEAT
CellValue := StringSplit(Line,’;’);
Column[ColNo] := CellValue;
ColNo += 1;
UNTIL Line = ”;
// Process columns
UNTIL reader.EndOfStream;
reader.Close;
fstream.Close;

//variables: all .net vars RunClient=Yes
CellValue Text
Column Text, Dim 20
Line Text
ColNo Integer
reader DotNet System.IO.StreamReader.’mscorlib
fstream DotNet System.IO.FileStream.’mscorlib
fmode DotNet System.IO.FileMode.’mscorlib
enc DotNet System.Text.Encoding.’mscorlib

LOCAL StringSplit(VAR Text : Text[1024];Separator : Text[1]) Token : Text[1024]
Pos := STRPOS(Text,Separator);
IF Pos > 0 THEN BEGIN
Token := COPYSTR(Text,1,Pos-1);
IF Pos+1 <= STRLEN(Text) THEN
Text := COPYSTR(Text,Pos+1)
ELSE
Text := ”;
END ELSE BEGIN
Token := Text;
Text := ”;
END;

//variables
Pos Integer

Also have a look at:
https://www.olofsimren.com/xml-buffer-and-csv-buffer-tables/
http://www.dynamics.is/?tag=csv-file

Access protected file share

There was a post, where a user wanted to get read/write acces to a file share outside the current domain from within Nav.

This can be done via .Net:

NetworkCredential := NetworkCredential.NetworkCredential(username, password, domain); // Credentials for domain 2
CredentialCache := CredentialCache.CredentialCache;
Uri := Uri.Uri(‘\\server’); // the server name from domain 2
CredentialCache.Add(Uri, ‘Basic’, NetworkCredential);
Dirs := SysDir.GetDirectories(‘\\server\directory’); // get folder list from the file share
FOR i:=1 TO Dirs.GetLength(0) DO
DirListTxt := DirListTxt + FORMAT(Dirs.GetValue(i-1))+’\’; //.net index starts with 0
MESSAGE(DirListTxt); // print out the dir list

variables
NetworkCredential DotNet System.Net.NetworkCredential.’System
CredentialCache DotNet System.Net.CredentialCache.’System
Uri DotNet System.Uri.’System
Dirs DotNet System.Array.’mscorlib
SysDir DotNet System.IO.Directory.’mscorlib
DirListTxt Text
i Integer

 

User bulk import with powershell

the ps command to add single users in nav is new-navserveruser. detailed info can be found here:
https://docs.microsoft.com/en-us/powershell/module/microsoft.dynamics.nav.management/new-navserveruser?view=dynamicsnav-ps-2018
https://community.dynamics.com/nav/b/magnosblog/archive/2015/08/26/creating-users-with-powershell

i found a great ps script for bulk import:
https://marcellusnav.wordpress.com/2017/07/31/import-nav-users-from-csv-with-powershell/

to work with that, here is a tutorial:

* start the windows powershell ISE in admin mode. this is needed, because only then your are allowed to create new users in nav.

* create a csv text file with comma as separator. semicolon does not work here. save it e.g. as c:\temp\users.csv. check, if the windows users in the list are created on your server (AD).

UserName,FullName,Email
domain\user1,John,john@test.com
domain\user2,Adam,adam@test.com

* create a new text file and copy the script into the text file, save it as c:\temp\Import-NavUsersFromCSV.ps1

* in the ps ISE write “cd \temp” to change to the working directory.

* Import-Module .\Import-NavUsersFromCSV.ps1
to load the new script

* $Permissions = (‘SUPER’)
to set the default user permissionset for the new users

* at last:
Import-NavUsersFromCSV -NavVersion 100 `
-NavServerInstanceName ‘DynamicsNAV100’ `
-AuthenticationMethod Windows `
-ImportFilePath ‘C:\Temp\users.csv’ `
-PermissionSets $Permissions

result:
Creating domain\user1
Verbose: Opening admin connection to ServerInstance ‘MicrosoftDynamicsNavServer$DynamicsNAV100’
Verbose: Admin connection to ServerInstance ‘MicrosoftDynamicsNavServer$DynamicsNAV100’ has been opened
Verbose: Ausführen des Vorgangs “New-NAVServerUser” für das Ziel “ServerInstance = MicrosoftDynamicsNavServer$DynamicsNAV100, Sid = S-1-5-21-236
3956306-4252412874-2321867446-1054, WindowsAccount = domain\user1”.
Verbose: Closing admin connection to ServerInstance ‘MicrosoftDynamicsNavServer$DynamicsNAV100’
Verbose: Admin connection to ServerInstance ‘MicrosoftDynamicsNavServer$DynamicsNAV100’ has been closed
Verbose: Opening admin connection to ServerInstance ‘MicrosoftDynamicsNavServer$DynamicsNAV100’
Verbose: Admin connection to ServerInstance ‘MicrosoftDynamicsNavServer$DynamicsNAV100’ has been opened
Verbose: Ausführen des Vorgangs “New-NAVServerUserPermissionSet” für das Ziel “ServerInstance = MicrosoftDynamicsNavServer$DynamicsNAV100, Permi
ssionSetId = SUPER, Sid = S-1-5-21-2363956306-4252412874-2321867446-1054, WindowsAccount = domain\user1”.
Verbose: Closing admin connection to ServerInstance ‘MicrosoftDynamicsNavServer$DynamicsNAV100’
Verbose: Admin connection to ServerInstance ‘MicrosoftDynamicsNavServer$DynamicsNAV100’ has been closed
Creating domain\user2
Verbose: Opening admin connection to ServerInstance ‘MicrosoftDynamicsNavServer$DynamicsNAV100’
Verbose: Admin connection to ServerInstance ‘MicrosoftDynamicsNavServer$DynamicsNAV100’ has been opened
Verbose: Ausführen des Vorgangs “New-NAVServerUser” für das Ziel “ServerInstance = MicrosoftDynamicsNavServer$DynamicsNAV100, Sid = S-1-5-21-236
3956306-4252412874-2321867446-1055, WindowsAccount = domain\user2”.
Verbose: Closing admin connection to ServerInstance ‘MicrosoftDynamicsNavServer$DynamicsNAV100’
Verbose: Admin connection to ServerInstance ‘MicrosoftDynamicsNavServer$DynamicsNAV100’ has been closed
Verbose: Opening admin connection to ServerInstance ‘MicrosoftDynamicsNavServer$DynamicsNAV100’
Verbose: Admin connection to ServerInstance ‘MicrosoftDynamicsNavServer$DynamicsNAV100’ has been opened
Verbose: Ausführen des Vorgangs “New-NAVServerUserPermissionSet” für das Ziel “ServerInstance = MicrosoftDynamicsNavServer$DynamicsNAV100, Permi
ssionSetId = SUPER, Sid = S-1-5-21-2363956306-4252412874-2321867446-1055, WindowsAccount = domain\user2”.
Verbose: Closing admin connection to ServerInstance ‘MicrosoftDynamicsNavServer$DynamicsNAV100’
Verbose: Admin connection to ServerInstance ‘MicrosoftDynamicsNavServer$DynamicsNAV100’ has been closed

the “change password at next login” flag is not set. this is only set if you use the -ChangePasswordAtNextLogOn option with the New-NAVServerUser command.

 

Performance compare tests between Nav 2013 and Nav 2017

There were some discussions about the newer Nav versions performance. As for my own experience, i can say Nav 2017/2018 releases are quite slow.

To get a better feeling about that i did the following:

I converted Nav 2013 Cronus db (build 46056) to Nav 2017 (build 13682) by simply run the convert job in the dev. env. nothing more. then created a nav service for the converted nav2013-db.

test scenario: i wanted to test the load time for the item list page. in many huge database there can be 1000s and 1000s of items. it’s a very important page, very often loaded per day by many people. so high peformance would be a good thing. in both databases are the same no. of items: 145. in both pages are the same columns/fields in the same order shown. i have the same nav system, same binaries, but different db. so the situation is quite ok for a valid comparison.

next step: i wrote a simple test cu for loading the item-list page.

[Test] TestItemList()
// ItemList / TestPage / item list
// dt / DateTime
dt := CURRENTDATETIME;
ItemList.OPENEDIT;
MESSAGE(FORMAT(CURRENTDATETIME – dt));

i started the test cu with the simple test function and measured the time:
1. run: 270ms
2. run: 230ms
3. run: 170ms

now copied that test cu to the nav2017 db, ran the same test, measured the time:
1. run: 380ms
2. run: 320ms
3. run: 300ms

WOW!!!!!! simple test, the numbers tell the story!
What’s about other main list pages (customers, vendors, ledger entries and so on)? What about performance of posting processes? What would i measure, if i continue that kind of tests? i think better not measure …

Is that really a progress??? What is the advantage of new features, if the performance lowers and lowers from release to release ???

i think here is a todo for the nav microsoft team.

cheers