I dette indlæg gennemgår vi en enkel metode til at hente daglige valutakurser fra Danmarks Nationalbank direkte i Microsoft Dynamics 365 Business Central. Ved at automatisere valutakursopdateringen undgår I manuelle fejl og sikrer, at systemet altid anvender korrekte og autoritative kurser.
Automatiske valutakurser giver et mere pålideligt grundlag for bogføring, rapportering og regnskabsafslutning, samtidig med at økonomiafdelingen sparer tid på manuelle opdateringer. Korrekt valutahåndtering er desuden vigtig ved international handel, hvor præcise kurser understøtter korrekt prissætning og dokumentation.
Nedenfor viser vi trin for trin, hvordan Business Central konfigureres til automatisk at hente valutakurser fra Danmarks Nationalbank.
Lad os komme i gang med at åbne Business Central. Herefter skal du udføre følgende trin:
- Tryk på Alt&Q og skriv val tje i søgefeltet
- Under Gå til sider og opgaver skal du nu klikke på Valutakurstjenester
- På oversigten over Valutakurstjenester, klik på +Ny
I siden som åbnes, skriv DNB i feltet Kode og Danmarks Nationalbank i feltet Beskrivelse:
feltet URL-adresse til tjeneste skal du angive følgende URL: https://www.nationalbanken.dk/api/currencyratesxml?lang=da
Når dette er udført, har du sikret dig at kørslen er funktionel og du skal nu konfigurere Feltkoblingen. Hertil skal der angives et iterativt element i linjen med Titlen Overordnet node for valutakode.
Klik på – i feltet Kilde. Et nyt vindue åbner sig, og du skal her placere cursoren i det elementet currency
Tryk på OK for at vælge elementet.
Gentag handlingen for Valutakode – vælg code fra ressourcen
Startdato – vælg her id, som er placeret udenfor currency loopet
Associert valutakursbeløb – vælg her rate fra ressourcen
Feltet Valutakursbeløb skal springes over i feltet Kilde, men feltet standardværdi skal sættes til 100.
Nu skal der kun defineres at Valutakursbeløbet er defineret med en dansk formatering. Dette gøres ved at vælge værdi DK_DECIMALFORMAT i feltet Transformationsregel.
Du har nu foretaget den initialiserende opsætning til en periodisk rutine, så du kan opdatere dine valutakurser automatisk. Inden vi fortsætter med automatiseringen, vil vi gerne teste resultatet af webtjenesten. Til formålet kan du trykke på Vis Eksempel i menubjælken for Valutakurstjenesten. Den viste side skal indeholde alle de valutakoder, som findes i filen, som du indgangs kiggede på i din browser.
Automatisering af valutakursindlæsningen
Når du er klar til at sætte valutakursopdateringen i gang, skal du aktivere servicen ved at trykke på feltet Aktiveret.
Lige efter du har trykket på Aktiveret, åbner Business Central skal du acceptere Servicevilkårene.
Hvorefter du kan konfigurere en gentagelsescyklus for din automatisering. Tryk derfor på Ja i det næste vindue, hvor Business Central spørger om du vil åbne vinduet Jobkøposter.
I vinduet Jobkøposter kan du definere gentagelsesintervaller, samt hvornår på dagen opgaven skal udføres. Fx kan du i feltet Tidligste startdato/-tidspunkt redigere starttidspunktet. I vores tilfælde har vi angivet at servicen skal startes kl. 07:00. Da vi har aktiveret alle ugens dage, vil kørslen køre dagligt kl. 07:00. Du kan også aktivere kørslen fx hver den første i måneden. Dette udføres via datoformler i feltet Datoformel for næste aktivering. Hvis du ønsker at høre mere om denne mulighed kan du kontakte CURABIS på support@curabis.dk
Du har nu med succes oprettet og automatiseret din periodiske valutakursopdatering. For at teste kørslen kan du med fordel trykke på Kør én gang (forgrund).
Husk at aktivere Jobkøposten ved at trykke på Angiv status som Klar.
Hvis kørslen udføres uden fejl, kan du navigere til oversigten for valuta og derfra se om der er kommet nye valutakurser for i dag. Jeg tester her for valutakode EUR og kan se at valutakursen er opdateret pr. den 4. juni 2025, hvilket var dagen for udførelsen og aktiveringen af kørslen.
I denne vejledning har vi gennemgået hele processen for automatisk opdatering af valutakurser i Dynamics 365 Business Central med Danmarks Nationalbanks service. Vi har set, hvordan du opsætter tjenesten, sikrer korrekte feltkoblinger og forstår de underliggende servicevilkår. Med denne løsning får du præcise, autoritative kurser direkte ind i dit regnskabssystem og slipper for manuelle fejl og tidskrævende opdateringsrutiner.
Hvis du har spørgsmål undervejs eller ønsker mere detaljeret vejledning i din konkrete implementering, er du velkommen til at kontakte os. Vi står klar til at hjælpe med alt fra teknisk opsætning til procesoptimering, så du kan få fuldt udbytte af automatisk valutadækning. Tak igen for din opmærksomhed – og held og lykke med din integration af valutakurstjenesten i Business Central!
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
namespace UmbracoProject.Services;
public interface IBrevoNewsletterService
{
Task<(bool Ok, string? Message)> SubscribeAsync(
string apiKey,
int listId,
string email,
string? name,
string? phone,
string? culture,
CancellationToken ct);
}
public class BrevoNewsletterService : IBrevoNewsletterService
{
private readonly IHttpClientFactory _httpClientFactory;
public BrevoNewsletterService(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
public async Task<(bool Ok, string? Message)> SubscribeAsync(
string apiKey,
int listId,
string email,
string? name,
string? phone,
string? culture,
CancellationToken ct)
{
var client = _httpClientFactory.CreateClient();
// Brevo v3 API
var url = "https://api.brevo.com/v3/contacts";
// Attributes (navne skal matche jeres Brevo contact attributes)
// Hvis I ikke har FIRSTNAME/PHONE, så opret dem i Brevo eller brug standardfelter.
var attributes = new Dictionary<string, object>();
if (!string.IsNullOrWhiteSpace(name)) attributes["FIRSTNAME"] = name.Trim();
if (!string.IsNullOrWhiteSpace(phone)) attributes["PHONE"] = phone.Trim();
if (!string.IsNullOrWhiteSpace(culture)) attributes["LANG"] = culture;
var payload = new
{
email = email.Trim(),
attributes = attributes,
listIds = new[] { listId },
updateEnabled = true
};
var json = JsonSerializer.Serialize(payload, new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
var content = new StringContent(json, Encoding.UTF8, "application/json");
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("api-key", apiKey);
var resp = await client.PostAsync(url, content, ct);
if (resp.IsSuccessStatusCode)
return (true, null);
var body = await resp.Content.ReadAsStringAsync(ct);
return (false, $"Brevo error: {(int)resp.StatusCode} {resp.ReasonPhrase}. {body}");
}
}