Freelance Consultant


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:

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


Howto add item images to the Sales quote report

Not often, but it can be, that a client wants product pics in the lines of a report, e.g. the sales quote is a candidate for that. So the client can present his products in a more convincing way. 😉

I researched for a solution in Business Central, but did not find any solution, especially when using a word report. But i found my own way, as always.

For that follow these steps:

1) Copy the standard sales quote report, also the layout to a new custom report, set new object id (e.g. 50100) and name (e.g. “Custom Sales Quote”), so that you can make the needed changes. save, compile, publish the extension. for that steps follow my last post.

2) add variable TenantMedia: record “Tenant Media” to the global report variables

3) add new dataitem(Item;Item) after the last column of dataitem “Line” (Sales Line)

4) add the typical properties to connect the dataitems Line and Item via field “No.”

5) add column(Picture;TenantMedia.Content) to the new dataitem for viewing the item picture in the line

6) in trigger OnAfterGetrecord of dataitem “Line” add new local variable “Item: record item”.
at the end of the trigger’s code add:
if item.picture.count > 0 then begin

remark: to load the picture data within the OnAfterGetrecord trigger in new dataitem “Item” won’t work, the data is loaded to late to be shown in the line.

7) edit the word layout in vs-code using ms word, activate the developer tools menu in word, activate the xml structure to view the fields structure

8) add new column in the lines matrix. set the column heading to “Picture”, set the cursor into the new data cell in the new column, add new field Header/Line/Item/Picture as Picture (type) into the new data cell. save the word report, close word, compile and publish the extension. replace the sales quote no. in “report selection” to the new report.


Great, isn’t it?

Convert String to Char array in AL code

Was needed in a forum question.

 procedure ConvertStringToCharArray(var arr: array[10] of char; srcStr: Text) var   i: Integer; begin   for i := 1 to strlen(srcStr) do     arr[i] := srcStr[i]; end;
or simply convert a String Element into a char value. 😉
srcStr: Text;chVal: char// get 1. element of the string and convert it to a charchVal := srcStr[1]; .


HexToInt in AL code

That was needed in a forum question.

begin  hexStr := 'A2F'; // int value = 2607  intVal := HexToInt(hexStr);  Message(hexStr + ' = ' + format(intVal));end;procedure HexToInt(hexStr: Text): Integervar  len, base, decVal, i, j : Integer;begin  base := 1;  decVal := 0;  len := strlen(hexStr);  for i := 0 to len - 1 do beginj := len - i;if (hexStr[j] >= '0') and (hexStr[j] <= '9') then begin  decVal += (hexStr[j] - 48) * base;  base := base * 16;end else if (hexStr[j] >= 'A') and (hexStr[j] <= 'F') then begin  decVal += (hexStr[j] - 55) * base;  base := base * 16;end;  end;  exit(decVal);end;

Create recurring sales invoices automatically

A common issue is to generate invoices per month for items and services automatically, which are being sold periodically.

You can use report “Create recurring Sales Invoice” to generate sales invoices with the needed lines manually. The parameters “Order Date” and “Posting Date” in the request page are mandatory. So, the report cannot be used to generate invoices automatically without setting the mandatory parameters.

But one step after the other.
First goto “Recurring sales lines” and create a new record, set code and description and add a line with the item, which should be added in the sales invoice, when a new sales invoice will be created.

Next open the customer, for which the sales invoices with recurring lines should be created for. There goto Navigate/Sales/”Recurring sales lines” and add a new record with code “LIC”. Set additional values if needed.
Now, if a new sales invoice with that customer is created, the recurring lines are added automatically. That’s fine.

Next run report 172 “Create recurring sales invoices” to create sales invoices with recurring lines, semi-automatically. In the Request page set “customer no.” with the customer’s no. from above, also set the Code from the “Recurring sales lines”.

Fields “Order Date” and “Posting Date” are mandatory to run the report. Therefore it cannot run automatically without setting both date fields.

What to do now?
To run the report automatically e.g. monthly, the best choice is using a job queue entry. There the request page default values can be set. Set the filter fields like above, additional you could set a default value for the date fields. Doing that, the job queue entry can be run with no problem, but all invoices get then the default date value, what we do not want. It would be nice, if the current date is used.
To solve that  it could be an option to extend table “Standard Customer Sales Code”, if there would be a kind of “OnBeforeCreateSalesInvoice” event to replace the dates, but there isn’t.

So i decided to create a copy of report 172 and make one change.

trigger OnPreReport()  begin  //-  if (CurrentClientType = ClientType::Background) or (CurrentClientType = ClientType::NAS) then begin    OrderDate := Today;    PostingDate := Today;  end;   //+   if (OrderDate = 0D) or (PostingDate = 0D) then     Error(MissingDatesErr);end;
Ok, preparation ready.
Now create a new “job queue entry” as above described and leave the date fields empty.
The job queue entry:
To run the report monthly on every 1st of the month set a dateformula in “Next Run Date Formula”, here use “CM+D1”.


EventSubscribers are a nice feature to add code to triggers in standard objects. It’s the replacement for changing the code directly in standard objects.

A sample:
add code at the end of trigger “Address 2”-OnValidate from page “Customer Card”. It’s a so called OnAfterValidate event. There are many events available in each standard object, which one can subscribe to.

the syntax for the EventSubscriber Attribute, that connects the custom procedure with the standard trigger:

for details goto here.

the code:
create a new codeunit or use an existing to add following code.
it’s needed that property EventSubscriberInstance is set in the codeunit.
for details goto here.

the result:

Business Central Cloud in non supported countries.



Today i watched a live web session about BC Cloud Update strategies. The participants had the option to ask questions, which were answered immediatly.

One of the most asked questions was: How can companies get access to BC Cloud in non supported countries? The answers were in my opinion not really satisfying, because the answer was simply “Not now, maybe in the future….”. UK is supported, but not Ireland, the neighbor country, means North Ireland is, Republic Ireland is not. The Microsoft Headquarter Europe is settled in Dublin, Republic Ireland. 😉 Bit strange. Microsoft adds new countries over the time. Support for India is planned, but with no details about the release date. Till then indian companies can use ITAX.

So what can companies and CSPs/ASPs do now, to provide BC Cloud or kind of … ?

Current Availability for BC Cloud:

Country/RegionLocalized byAvailability
Hong Kong SARPartnerAvailable
New ZealandMicrosoftAvailable
Russia (on-premises only)MicrosoftAvailable
South AfricaPartnerAvailable
South KoreaPartnerAvailable
United Arab EmiratesPartnerAvailable
United KingdomMicrosoftAvailable
United StatesMicrosoftAvailable

Development of custom localisations


Workflows in Dynamics Nav/BC


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

What i learned from summit emea, bc day, in amsterdam

i visited amsterdam the first time in my life, it was also the first summit i joined. the event is quite well organized, but there are to less nibbles for coffee break. but this is not the point.

so what is the point? a bit surprisingly many sessions were a kind of a marketing show from and for ISVs and/or partners. this can be interesting, if someone has a special interest in the products of the ISV, for sales people, but it’s not really interesting for the public, for techies, for people who are interested in news about BC in general.

or … power bi is a quite interesting tool and it’s nice, that someone can make basic analysis reporting for BC data, but it’s not specific BC. what i saw, there was no session for “BC in the deep”, what are the features in detail, what can be done with BC and what not. there was only the starting session about BC, a very quick, facile overview, no news. the speaker spoke very quiet, a sleeping pill, so the first impession was not so good.

questions like “is a web based client a solution for everyone or not?” were not discussed, should have been. what about the current/future direction of BC, is it stable now or will we have extensions 3.0 in one year and every ISV has to update their addons? will customizations be stable with BC upgrades or not? these are important questions. there was no session about these topics and no tech session, especially a session about standard reporting in BC would have been interesting. the session about bio diesel was quite ok, it showed a successful BC project with quite complicated processes, which were handled as it should be. it was not really great, normal project work, but it showed, that BC projects can be done like NAV projects.

one exception: the last session i visited was the session of eva dupont, microsft team lead for help/documentation. one word: chapeau!
only 4 people visited the session, what a shame.
mrs. dupont told the history of nav/bc documentation from the beginning, what were the changes, what is now, how can partners/customers use and modify it for their own purposes. all presented with a humour, intelligence and competence of that kind, which are very, very rare. i was fascinated and excited. as always these kind of flowers are not cherished that way it should be.

at last, during one coffee break, i sat in the rest room with my coffee, thinking about whats going on here, suddenly a strange person came to me, sat down, and asked me why i sit here alone and do not talk to others and some more pushy questions. and this person was much too narrow too me. what the hell?! is that the american way to contact a strange person? this was very rude! i can’t stand that at all! we are here in europe, not in the states. this is not the manner how we contact strange persons here! for sure, that is one of the reasons, why the dynamics communities do not work in europe. first of all: keep distance!

so, that was it, this was also my last summit or that kind of event. that’s not that kind of events i like, it costs money, it’s time and power consuming. and in the end, not sure, what it brings. i will also reduce, maybe stop my community activities. spent over the last 5 years huge amount of my spare time, will do other things, which make more sense for me.