Net-Base Magasin

08.05.2026

Sanera klient-serverarkitekturer i Delphi: återta stabilitet, drift och gränssnitt

Etablerade Delphi-klient-server-system är ofta affärskritiska – och samtidigt svåra att underhålla. Artikeln visar praktiskt hur du kan separera ansvar, stabilisera åtkomst till data, modernisera gränssnitt och säkra driften utan en riskfylld...

08.05.2026

Från magasinets tema till projektpraxis

Passande tjänste- och tekniksidor för inlägget

Den som vill rensa upp klient-server-arkitekturer i Delphi har sällan ett „dåligt“ system framför sig. Ofta handlar det om robust affärsprogramvara som byggts ut under år, hanterar många specialfall och fungerar pålitligt i vardagen. Problemet uppstår inte från Delphi som plattform, utan från tillväxta ansvarsområden: klienten innehåller plötsligt datalogik, „servern“ är i praktiken bara en databas, och gränssnitt har lagts till ad hoc. Det slår tillbaka när nya säkerhetskrav, databasskiften, Homeoffice-VPN, terminalserver‑konfigurationer eller integrationer med ERP, DMS eller portaler tillkommer.

Detta inlägg visar hur ni praktiskt och strukturerat kan rensa upp Delphi-klient-server-landskap: utan dogmatisk totalombyggnad, men med tydliga mål för drift, administration, datakonsistens, gränssnittsbarhet och underhållbarhet. Fokus ligger på beslut som IT-ledning och tekniskt projektansvariga kan styra: arkitekturgränser, rollout‑strategier, loggning, behörighetskoncept, migrationsvägar och typiska riskkällor.

Hur man ser att klient-server-arkitekturen är „sammanvuxen“

Teknisk skuld syns i driften oftare än i källkoden. Typiska signaler är mindre „dålig kod“ än återkommande friktionspunkter mellan klient, databas och infrastruktur:

  • Oklara ansvarsområden: Klienten „vet“ för mycket om tabeller, triggers, stored procedures eller till och med sökvägar på shares.
  • Svåra releaser: Varje liten ändring kräver rollout av klienten på många arbetsstationer, ofta med manuella steg.
  • Sköra dataåtkomster: Slumpmässiga deadlocks, inkonsekventa transaktioner eller „hängande“ lås vid hög belastning.
  • Säkerhet som eftertanke: Databasåtkomster sker med för vida rättigheter; lösenord ligger i INI-filer; nätverkssegmentering bryter funktioner.
  • Integration är oproportionerligt kostsam: En kundportal eller en REST-API är svår att eftermontera eftersom affärsreglerna är spridda.
  • Svårt att felsöka: Utan pålitlig loggning är det oklart om fel uppstår i klienten, i nätverket, i databasen eller i ett gränssnitt.

Om flera av dessa punkter stämmer är „rensa upp“ inte kosmetik utan en åtgärd för driftssäkerhet. Målet är inte perfektion, utan ett system som förblir pålitligt ändringsbart.

Klient-server i Delphi: Vad som verkligen räknas i driften

I många Delphi-landskap uppfattas „klient-server“ implicit som „klienten pratar direkt med databasen“. Det kan fungera – så länge förutsättningarna inte ändras. För företag är dock andra egenskaper viktiga:

  • Skalbarhet i vardagen: inte glänsande benchmarkresultat, utan stabil prestanda vid typiska belastningstoppar (månadsbokslut, skiftbyte, importkörningar).
  • Ändringsbarhet: Anpassningar utan kedjereaktion av rollout, datamigrering och utbildning.
  • Säker drift: spårbara behörigheter, revisionsmöjlighet, korrekt hantering av hemligheter (Credentials), nätverksgränser.
  • Integrationsförmåga: definierade gränssnitt istället för „en andra klient“ som också kopplar direkt mot tabellerna.

Dessa mål kan uppnås utan att ersätta Delphi. Avgörande är hur ni drar gränser: Vad är UI, vad är affärslogik, vad är dataåtkomst, och via vilka gränssnitt får andra system ansluta?

Rensa upp klient-server-arkitekturer i Delphi: Målbild istället för Big Bang

En praktiskt gångbar målbild är sällan ett radikalt avbrott. Ett inkrementellt förfarande med en tydlig arkitekturram har visat sig fungera. Ofta genomförs detta som Layer-3-arkitektur: tre lager med tydliga ansvarsområden. „Layer“ betyder här: en definierad separation av UI (presentation), affärslogik (regler/use cases) och dataåtkomst (SQL, transaktioner, persistens). Det går att strukturera så även inom en Delphi-monolit innan ni extraherar en verklig service.

Steg 1: Gör arkitekturgänser synliga

Innan ni bygger om måste ni veta var koppling uppstår. Typiska gränsöverträdelse i Delphi-klienter är:

  • UI-händelser (knappklick) innehåller SQL eller direkta tabellåtkomster.
  • Affärsregler är utspridda: delvis i klienten, delvis i triggers, delvis i rapporter eller importskript.
  • Databasanslutningar öppnas överallt „vid sidan om“, med olika parametrar.

Målet är en hanterbar kärna: få ingångspunkter till affärsfunktioner och en central dataåtkomst som konsekvent hanterar anslutningar, transaktioner och felhantering.

Steg 2: „Kontrakt“ definiera – även utan services

Många team tror att gränssnitt först uppstår med REST. I verkligheten behöver ni först interna kontrakt: Vilka funktioner finns, vilka parametrar skickas, vilka felkoder tillåts, vilka transaktioner hör ihop? Dessa kontrakt kan inledningsvis finnas som tydligt definierade moduler/komponenter i Delphi-projektet. Senare kan de relativt rent överföras till en REST-Server eller till Windows- och Windows- och Linux-services.

Stabilisera dataåtkomst: FireDAC, transaktioner och en tydlig anslutningsstrategi

Dataåtkomst är i klient-server-uppsättningar ofta den största hävstången för stabilitet. Två frågor dominerar: konsekventa anslutningar och tydliga transaktionsgränser. I Delphi-miljöer är BDE-Ablösung mit nativer Anbindung (dataåtkomstbibliotek med drivrutiner och anslutningspoolning) ofta moderniseringsankaret, särskilt om BDE (Borland Database Engine, ett äldre dataåtkomstlager) fortfarande används.

BDE-Ablösung: Mer än ett drivrutinsbyte

En BDE-Ablösung underskattas om man ser den som „byte av komponenter“. I praktiken berör den:

  • SQL-dialekt och parametrisering: Olika databaser och drivrutiner reagerar olika på datumformat, NULL-hantering, sortering och teckenuppsättningar.
  • Transaktionsbeteende: autocommit, isolationsnivåer (regler för hur strikt låsning/läsning hanteras) och felåterställning.
  • Prestanda och låsning: Viss äldre logik förlitar sig omedvetet på implicita låsmekanismer.

Operativt viktigt är ett testkoncept som inte bara „klickar igenom“ formulär, utan simulerar typiska boknings- och importflöden under belastning.

Transaktioner: Mindre magi, fler regler

I många äldre Delphi-klienter uppstår transaktioner slumpmässigt: Ett formulär sparar flera tabeller, men felhantering rullas inte tillbaka korrekt. Det leder till delvis färdiga tillstånd som senare måste ‚manuellt rensas‘. Bättre är ett konsekvent mönster:

  • Transaktion per affärshändelse (t.ex. ‚Skapa order‘, ‚Bokföra varumottagning‘), inte per SQL-kommando.
  • Tydliga felvägar: Vid valideringsfel inget ofullständigt datatillstånd, utan kontrollerad avbrytning.
  • Idempotens vid importer: Upprepningsbar inmatning utan dubbla bokföringar.

För IT-drift och support är det viktigast: När en process misslyckas ska det vara spårbart – med loggposter, korrelerbara ID:n och en entydig felklass (t.ex. behörighet, datakonflikt, tekniskt fel).

Extrahera affärslogik från klienten – utan att försämra användbarheten

Många Delphi-klienter har historiskt vuxit fram som „UI-centrerade“: Flödet ligger i formulär, valideringar i OnChange-Events, sidoeffekter i OnExit. Det är ofta snabbt och direkt ur användarens perspektiv – men ur arkitektursynpunkt svårt att testa och utöka.

Use-cases istället för formulärlogik

Ett praktiskt mellansteg är att samla dem i affärsorienterade use-cases: Ett use-case kapslar in en process (t.ex. ‚Frigöra faktura‘) inklusive valideringar, beräkningar, dataåtkomst och loggning. UI:n anropar det och visar resultat, i stället för att implementera reglerna själv. Fördelen: Samma use-case kan senare användas via en REST-API, till exempel för en portal eller en importtjänst.

Centralisera regler: validering, nummerserier, tillståndsmodeller

Typiska kandidater för centralisering är:

  • Valideringsregler (obligatoriska fält, värdeintervall, rimlighetskontroller)
  • Nummerserier (verifikat, partier, transaktioner) med konfliktundvikande
  • Tillståndsmodeller (utkast → granskad → frigiven → bokförd) med tillåtna övergångar
  • Behörighetskontroller nära själva affärsoperationen, inte bara i UI:n

Särskilt för behörigheter är detta avgörande: Om reglerna bara finns i klienten blir det svårt att hålla dem konsekventa för gränssnitt, automatiseringar eller framtida portaler.

Bli gränssnittskompatibel: REST-API som kontrollerad åtkomst, inte som en ‚bakväg‘

Många företag behöver integration: data för BI, koppling till ERP/DMS/CRM, automatisering av import/export eller en kundportal. Det typiska misstaget är att bygga en REST-API ‚vid sidan av‘ som går direkt på tabeller eftersom det går snabbt. Det skapar två sanningar: klientlogik och API-logik divergerar, och datakonsistens blir slumpmässig.

REST som fasad framför stabila use-cases

En REST-API (HTTP-baserat gränssnitt, ofta JSON) bör erbjuda affärsoperationer, inte spegla tabeller. Exempel är: ‚Skapa order‘, ‚Hämta status‘, ‚Ladda upp dokument till ärende‘. API:n anropar samma use-cases som klienten använder. Det minskar dubbla regler och skapar klar governance: externa system får en kontrollerad åtkomst som kan versioneras och säkras.

Säkerhet och drift av ett API

Ur ett B2B-perspektiv är det mindre de enskilda endpunkterna som är intressanta, och mer hur driften och säkringen genomförs:

  • Autentisering: t.ex. tokenbaserade metoder; i företagsmiljöer ofta anslutning till centrala identiteter (SAML 2.0 är en vanlig standard för Single Sign-On).
  • Auktorisation: rättigheter per operation, inte bara ”får använda API”.
  • Rate‑limits och skydd mot missbruk: viktigt vid partneråtkomst.
  • Versionshantering: planerade förändringar utan tysta brytningar.

Om ni redan planerar en gränssnittsmodernisering är det värt att granska en strukturerad metod för att eftermontera en REST-API i befintlig mjukvara: det förenklar prioriteringarna och minskar driftsriskerna.

Deployment och uppdaterbarhet: den tysta kostnadsdrivaren

Många Delphi-system misslyckas inte på grund av funktionalitet utan på grund av utrullningsprocesser. ”Client‑Server” betyder i praktiken: många arbetsstationer, olika behörigheter, ibland terminalservrar eller Citrix, samt filialer med VPN. Ett välordnat system har en definierad uppdateringsprocess.

Standardisera: Konfiguration, versioner, miljöer

Typiska åtgärder som ger omedelbar effekt i drift:

  • Extrahera konfiguration från binärpaketet: separata konfigurationsfiler eller centrala konfigurationskällor, så att uppdateringar inte skriver över inställningar.
  • Miljöprofiler: test, staging, produktion med klart separerade databas‑ och serviceendpunkter.
  • Automatiserad installation: reproducerbar, även för terminalserver‑images.

Viktigt: Även om klienten ”bara” är ett skrivbordsprogram, gynnas ni av release‑disciplin som för servertjänster: versionshantering med changelog‑stöd, rollback‑alternativ och definierade migrationssteg.

Databasmigrationer: planerat snarare än riskfyllt

Vid varje strukturell ändring av tabeller, index eller vyer måste det vara tydligt: vilken version av applikationen förväntar sig vilket schema? En ordnad metod använder:

  • Versionsstyrda migrationsskript per release
  • Bakåtkompatibla övergångsfas(er), när klientutrullning inte kan ske samtidigt
  • Tydliga backout‑strategier (backup, återställning, definierade driftstoppfönster)

Detta är inte ett ändamål i sig: utan denna disciplin blir arkitekturförbättringar i det dagliga arbetet ”för farliga” och blir liggande.

Loggning, övervakning och felsökning: utan telemetri ingen stabilitet

”Det händer sällan, men när det händer står allt still” är en varningssignal. Befintliga klient‑server‑system har ofta otillräcklig loggning, särskilt över systemgränser. För driftteam är det avgörande att ett felfall kan rekonstrueras tidsmässigt och innehållsmässigt.

Vad som bör loggas i praktiken

  • Korrelation: en ärende‑/korrelations‑ID som kopplar ihop klient, tjänst och databasoperationer
  • Kontext: användare, tenant, maskin/plats, version, berörd operation
  • Tekniska detaljer: databasfelkoder, timeout‑information, omförsök
  • Säkerhetsrelevant: misslyckade inloggningar, behörighetsöverträdelser, avvikande anropsmönster

Det är viktigt att skilja tekniska loggar från verksamhetsprotokoll. Ett verksamhetsprotokoll (t.ex. „Verifikation frigiven av användare X“) är ofta revisionsrelevant; tekniska loggar används för felanalys och bör skyddas och roteras.

Nätverk, säkerhet och behörigheter: från „fungerar i LAN“ till „fungerar i företaget“

Många Delphi-klient-server-system designades när „i LAN“ var liktydigt med „pålitligt“. Idag gäller: segmentering, Zero Trust-ansatser, VPN, MFA och restriktiva brandväggsregler är standard. Att rensa upp arkitekturen är därför också säkerhetsarbete.

Databasbehörigheter: principen om minsta privilegium

En vanlig ärvd situation är en databasuser med långtgående rättigheter som alla klienter använder. Bättre är:

  • Rollbaserade rättigheter per funktionsområde
  • Separerade åtkomster för klient, tjänster, batchjobb
  • Inga adminrättigheter i produktionsåtkomster för dagliga operationer

Det begränsar följderna av fel och gör revisioner avsevärt enklare. Samtidigt ökar transparens och diagnostisk förmåga, eftersom behörighetsfel inte längre uppträder „slumpmässigt“.

Hemligheter och konfiguration: bort från lösenord i klartext

Credentials i INI-filer eller i registret är en klassiker. Beroende på miljö kan centrala hemlighetshanterare, krypterad konfiguration eller åtminstone driftkoncept med restriktiva filrättigheter vara aktuella. Avgörande är: lösningen måste vara administrerbar. Säkerhet som kringgås i vardagen är ingen säkerhet.

Stegvis modernisering: Var börja när allt känns viktigt?

Prioriteringen avgör om upprensningen stannar efter två månader eller ger mätbar avlastning. Ett beprövat förhållningssätt är att först adressera driftstabilitet och därefter driva strukturella förbättringar.

En pragmatisk moderniseringsfärdplan

  1. Stabilisera transaktions- och felbeteende: mindre datakorruption, färre „manuella reparationer“.
  2. Centraliserad datatillgång: enhetlig anslutningskonfiguration, tidsgränser (timeouts), omförsök (retries), loggning.
  3. Samla användningsfall: lyfta ut kritiska kärnprocesser från användargränssnittet.
  4. Definiera gränssnitt mot omvärlden: REST-API eller service-fasad för integration, utan direkt åtkomst till tabeller.
  5. Professionalisera deployment: reproducerbara uppdateringar, versionshanterade DB-migrationer.
  6. Säkerhetshärdning: rättigheter, hemligheter, nätverksgränser, revisionsbarhet.

Denna ordning är inte dogmatisk, men den gör att tidiga steg omedelbart märks i driften och att senare steg blir lättare att genomföra.

Typiska fallgropar ur projektsynpunkt – och hur man undviker dem

Vid upprensning misslyckas projekt sällan på grund av teknik, utan på grund av kringvillkor. Några fallgropar dyker upp särskilt ofta:

Parallell ombyggnad utan säkerhetsnät

När arkitekturåtgärder genomförs parallellt med funktionsändringar saknas ofta ett säkerhetsnät. Minst behövs: reproducerbara testdata, definierade smoke-tester för kärnprocesser och en releaseprocess som ser rollback inte som ett nederlag utan som ett driftverktyg.

Två datamodeller samtidigt

Den som bygger nya moduler men låter gamla formulär fortsätta att läsa direkt från tabeller får snabbt inkonsekventa regler. Bättre: definiera tydliga övergångsregler. Antingen förblir ett område tillfälligt „gammalt“ och moderniseras inte parallellt, eller så leds det konsekvent via det nya lagret.

Integration utan styrning

När partner eller interna system ansluts uppstår beroenden. Utan versionering, avtalstester och en definierad utfasningsstrategi blir varje ändring en samordningsslinga. Det är mindre ett utvecklarproblem än ett arkitektur- och driftproblem.

Slutsats: Att städa upp innebär att åter göra drift och förändring hanterbara

När ni städar upp klient-server-arkitekturer i Delphi handlar det inte om „modern bara för modernitetens skull“. Det handlar om att strukturera en affärskritisk digital företagslösning så att drift, säkerhet och vidareutveckling förblir planbara. De kraftfullaste hävstängerna är ofta ospektakulära: tydliga lager, konsekvent dataåtkomst, rena transaktionsgränser, robust loggning och en gränssnittsstrategi som inte duplicerar regler.

Det avgörande är tillvägagångssättet: inkrementellt, med en målbild och en prioritering som först skapar stabilitet. På så sätt kan ni modernisera ett befintligt Delphi-landskap utan att äventyra den löpande verksamheten – och utan att tvingas till en riskfylld total nystart.

Om ni vill pragmatiskt bedöma nästa steg för er arkitektur, databasåtkomster och gränssnitt, kontakta oss:

I det tekniska sammanhanget spelar även Delphi Modernisering en viktig roll när integrationer, dataflöden och vidareutveckling måste samspela väl.

Diskutera projekt eller moderniseringsprojekt med Net-Base.

nästa steg

När ett ämne blir ett verkligt projekt bör arkitektur, befintligt bestånd och drift tidigt ses över gemensamt.

Vi stöder inte bara vid enstaka frågor, utan även när kodsfragment, legacy-frågor eller portalidéer ska utvecklas till ett robust företagsprojekt.

  • Nuläge, målbild och tekniska risker bedöms tillsammans.
  • REST, dataåtkomst, portaler och utrullning skjuts inte upp som sena följder.
  • Ni ser tidigt vilken väg som är ekonomiskt och driftmässigt hållbar.

Dela inlägg

Dela det här inlägget direkt

LinkedIn, X, XING, Facebook, WhatsApp och e-post är omedelbart tillgängliga. För Instagram förbereder vi länken och en kort text direkt.

E-post

Instagram öppnas i en ny flik. Länken och korttexten kopieras till urklipp först.