Net-Base Magasin

08.05.2026

Rydde opp i klient‑server‑arkitekturar i Delphi: vinne att stabilitet, drift og grensesnitt

Vaksne Delphi-klient-server-system er ofte forretningskritiske – og samstundes vanskelege å vedlikehalde. Artikkelen syner praksisnært korleis ein kan skilje ansvarsområde, stabilisere datatilgangar, modernisere grensesnitt og sikre drifta, utan eit risikabelt...

08.05.2026

Frå magasinetema til prosjektpraksis

Passande teneste- og tekniske sider til innlegget

Kven som vil rydde opp i klient‑server‑arkitekturar i Delphi

har sjeldan eit «dårleg» system framfor seg. Ofte handlar det om robust forretningsprogramvare som er blitt utvida over år, dekkjer mange særtilfelle og som i kvardagen går stabilt. Problemet oppstår ikkje på grunn av Delphi som plattform, men på grunn av vaksne ansvarsgrenser: klienten inneheld plutseleg datalogikk, «serveren» er i realiteten berre ein database, og grensesnitt er blitt lagt til ad hoc. Det slår tilbake når nye sikkerheitskrav, databaseskifte, heimekontor‑VPN, terminalserver‑oppsett eller integrasjonar med ERP, DMS eller portalar kjem til.

Denne artikkelen viser korleis de kan strukturert rydde opp i Delphi‑klient‑server‑landskap i praksis: utan dogmatisk totalnybygging, men med klare mål for drift, administrasjon, datakonsistens, grensesnittkapasitet og vedlikehaldbarheit. I fokus står avgjerder som IT‑leiing og tekniske prosjektansvarlege kan styre: arkitekturgrenser, utrullingsstrategiar, logging, rettigheitskonsept, migrasjonsstiar og typiske risikokjelder.

Korleis ein ser at klient‑server‑arkitekturen er samvaksen

Teknisk gjeld viser seg i drift som oftast tidlegare enn i kjeldekoden. Typiske signal er ikkje primært «dårleg kode», men gjentakande friksjonspunkt mellom klient, database og infrastruktur:

  • Uklare ansvarsgrenser: Klienten «vet» for mykje om tabellar, trigger, Stored Procedures eller til og med filstiar på delte nettverksressursar.
  • Vanskelege utgjevingar: Kvar liten endring krev klientutrulling på mange arbeidsplassar, ofte med manuelle steg.
  • Fragile datatilgangar: Tilfeldige deadlocks, inkonsistente transaksjonar eller «hengjande» låsing i periodar med høg belastning.
  • Sikkerheit som ettertanke: Databaseåtkomstar går med for vide rettar; passord ligg i INI‑filer; nettverkssegmentering bryt funksjonar.
  • Integrasjon kostar uforholdsmessig: Eit kundeportal eller ein REST‑API er vanskeleg å ettermontere, fordi forretningsreglar er spreidde.
  • Vanskeleg feilsøking: Uten robust logging er det uklårt om feil oppstår i klienten, i nettverket, i databasen eller i eit grensesnitt.

Når fleire av desse punkta treff, er «rydding» ikkje kosmetikk, men eit tiltak for driftstryggleik. Målet er ikkje perfeksjon, men eit system som framleis er påliteleg og som kan endrast trygt.

Klient‑server i Delphi: Kva som verkeleg tel i drift

I mange Delphi‑landskap blir «klient‑server» implisitt forstått som «klienten snakkar direkte med databasen». Det kan fungere – så lenge rammevilkåra ikkje endrar seg. For verksemder tel likevel andre eigenskapar:

  • Skalerbarheit i kvardagen: ikkje glanspolerte benchmarkar, men stabil ytelse ved typiske belastningstoppar (månadsavslutning, skiftbytte, importkøyringar).
  • Endringsdyktigheit: Tilpassingar utan kjedereaksjonar som krev utrulling, datamigrasjon og opplæring.
  • Sikker drift: etterprøvbare tilgangar, revisjonerbarheit, ryddig handtering av hemmelegskap (Credentials), og klare nettverksgrenser.
  • Integrasjonsevne: definerte grensesnitt i staden for ein «andre klient» som òg koplar seg direkte til tabellar.

Desse måla kan nåast utan å Delphi „avløyse“. Avgjerande er korleis de trekkjer grenser: kva er UI, kva er forretningslogikk, kva er datatilgang, og gjennom kva grensesnitt kan andre system koble seg på?

Klient‑server‑arkitekturar i Delphi ryddast opp: målbildet framfor Big Bang

Eit praxistaugleg målbilete er sjeldan eit radikalt brot. Ein inkrementell framgangsmåte med ein klar arkitekturramme har vist seg å fungere. Det blir ofte realisert som ei Layer-3-arkitektur: tre lag med klare ansvarsområde. „Layer“ tyder her ei definert skiljing mellom UI (presentasjon), forretningslogikk (reglar/Use‑Cases) og datatilgang (SQL, transaksjonar, persistens). Dette kan strukturerast òg innanfor ein Delphi‑monolitt før de løyser ut ein eigen teneste.

Steg 1: Gjere arkitekturgrenser synlege

Før de byggjer om, må de vite kvar kopling oppstår. Typiske grensebrot i Delphi‑klientar er:

  • UI‑hendingar (knappetrykk) inneheld SQL eller direkte tabelltilgang.
  • Forretningsreglar er spreidde: delvis i klienten, delvis i triggarar, delvis i rapportar eller importskript.
  • Databaskoplingar blir opna «ved sidan av» overalt, med ulike parameterar.

Målet er ein oversiktleg kjerne: få inngangspunkt til forretningsfunksjonar og ein sentral datatilgang som handterer koplingar, transaksjonar og feilhandtering konsekvent.

Steg 2: „Kontraktar“ definere – òg utan tenester

Mange team trur at grensesnitt fyrst oppstår med REST. I røynda treng de fyrst interne kontraktar: kva funksjonar finst, kva parameter blir sende, kva feilkodar er tillatne, kva transaksjonar høyrer saman? Desse kontraktane kan fyrst eksistere som klart definerte modul/byggeklossar i Delphi‑prosjektet. Seinare kan dei relativt reint overførast til ein REST‑server eller ein Windows‑ og Windows‑ og Linux‑services.

Stabilisere datatilgang: FireDAC, transaksjonar og klar koplingsstrategi

Datatilgang er i klient‑server‑oppsett ofte den største spaken for stabilitet. To tema dominerer: konsistente koplingar og klare transaksjonsgrenser. I Delphi‑miljø er ein BDE‑utskifting med nativ kopling (datatilgangsbibliotek med drivarar og tilkoplingspooling) ofte moderniseringsankeret, særleg om BDE (Borland Database Engine, eit eldre datatilgangslag) framleis er i bruk.

BDE‑utskifting: meir enn eit drivarbytte

Ein BDE‑utskifting blir undervurdert dersom ein ser på han som å «bytte komponentar». I praksis rører han ved:

  • SQL‑dialekt og parameterisering: Ulike databasar og drivarar reagerer ulikt på datoformat, NULL‑handtering, sortering og teiknsett.
  • Transaksjonsatferd: Autocommit, isolation‑nivå (reglar for kor strengt låsing/lesing blir handsama) og feilgjenoppretting.
  • Ytelse og låsing: Nokre eldre logikkløysingar stolar ureflektert på implisitte låsingsmekanismar.

Operativt viktig er eit testkonsept som ikkje berre «klikkar gjennom» skjermbilete, men som simulerer typiske bokførings‑ og importprosessar under last.

Transaksjonar: Mindre magi, fleire reglar

I mange etablerte Delphi-klientar oppstår transaksjonar tilfeldig: Eit skjema lagrar fleire tabellar, men feilsituasjonar blir ikkje rulla tilbake på ein rein måte. Det fører til delvise tilstandar som seinare må «reingjerast manuelt». Bedre er eit konsistent mønster:

  • Éin transaksjon per fagleg prosess (t.d. «Opprett ordre», «Bokfør varemottak»), ikkje per SQL-setning.
  • Tydelige feilvegar: Ved valideringsfeil ikkje ein halvferdig datatilstand, men ein kontrollert avbrot.
  • Idempotens ved importar: Gjentakbart innspel utan dobbeltregistreringar.

For IT-drift og support er det særleg viktig: Når ein prosess feilar, må feilet vere etterprøvbart – med logginnslag, korrelerbare ID-ar og ei entydig feilmeldingstype (t.d. autorisasjon, datakonflikt, teknisk feil).

Trekk forretningslogikk ut av klienten – utan å øydeleggje brukaropplevinga

Mange Delphi-klientar har vorte historisk «UI-sentrerte»: Flyten ligg i skjema, valideringar i OnChange-hendingar, sideeffekt i OnExit. Det er ofte raskt og direkte frå brukarens synspunkt – men sett frå arkitektur er det vanskeleg å teste og utvide.

Use-Cases i staden for skjema-logikk

Eit praksisnært mellomsteg er å samle funksjonaliteten i faglege Use-Cases: Ein Use-Case kapslar ein prosess (t.d. «Godkjenne faktura») inkludert valideringar, utrekningar, dataåtkomst og protokollering. UI-et kallar opp Use-Casen og viser resultat, i staden for å implementere reglane sjølv. Fordel: Seinare kan same Use-Case nyttast via ei REST-API, til dømes for eit portal eller ein importteneste.

Reglar sentralisere: Validering, nummerrekkjer, tilstandsmodellar

Typiske kandidatar for sentralisering er:

  • Valideringsreglar (påkravsfelt, verdiområde, plausibilitetskontrollar)
  • Nummerrekkjer (bilag, parti/lot, prosessar) med konfliktunngåing
  • Tilstandsmodellar (utkast → kontrollert → frigitt → bokført) med tillatne overgangar
  • Autorisasjonskontroller nær forretningsoperasjonen, ikkje berre i UI-en

Særleg for autorisasjonar er dette avgjerande: Når reglar berre finst i klienten, er dei vanskelege å halde konsistente for grensesnitt, automatiseringar eller seinare portal-løysingar.

Gjer systemet grensesnittsvenleg: REST-API som kontrollert tilgang, ikkje som «ein andre veg»

Mange verksemder treng integrasjon: data for BI, tilkopling til ERP/DMS/CRM, automatisering av import/eksport eller eit kundeportal. Den vanlege feilen er å byggje ei REST-API «ved sida av» som går direkte på tabellar fordi det går raskt. Det skapar to sanningar: klientlogikk og API-logikk divergerer, og datakonsistens blir tilfeldig.

REST som fasade framfor stabile Use-Cases

Ei REST-API (HTTP-basert grensesnitt, vanlegvis JSON) bør tilby faglege operasjonar, ikkje spegle tabellar. Døme er: «Opprett ordre», «spør om status», «last opp dokument til prosess». API-en kallar dei same Use-Casene som klienten brukar. På den måten reduserer ein doble reglar og byggjer ein klar styringsmodell: eksterne system får ei kontrollert tilgang som kan versjonerast og sikrast.

Sikkerheit og drift av ei API

Frå eit B2B-perspektiv er endepunkt mindre interessante; det er drift og sikring som tel:

  • Autentisering: t.d. token-baserte løysingar; i føretaksmiljø er det ofte tilknyting til sentrale identitetar (SAML 2.0 er ein utbreidd standard for Single Sign-on).
  • Autorisasjon: rettar per operasjon, ikkje berre „darf API nutzen“.
  • Rate-Limits og vern mot misbruk: viktig ved partnartilgangar.
  • Versjonering: planlagde endringar utan stille brot.

Dersom du allereie planlegg ei modernisering av grensesnitt, løyner det seg å sjå på ein strukturert tilnærming for å ettermontere ei REST-API i eksisterande programvare: Det forenklar prioriteringa og reduserer driftsrisiko.

Utrulling og oppdateringsevne: Den stille kostnadsdrivaren

Mange Delphi-system lukkast ikkje på grunn av manglande funksjonalitet, men på grunn av utrullingsprosessane. „Client-Server“ betyr i praksis: mange arbeidsplassar, ulike rettigheiter, av og til terminalserver eller Citrix, i tillegg fjernlokasjonar med VPN. Eit ryddig system har ei definert oppdateringsprosedyre.

Standardisere: konfigurasjon, versjonar, miljø

Typiske tiltak som verkar med ein gong i drift:

  • Konfigurasjon frå binærpakken: separate konfigurasjonsfiler eller sentrale konfigurasjonskjelder, slik at oppdateringar ikkje overskriver innstillingar.
  • Miljøprofilar: test, staging, produksjon med klart skilte database- og tenesteendepunkt.
  • Automatisert installasjon: reproduserbar, også for terminalserver-bilete.

Viktig: Sjølv om klienten „nur“ er eit skrivebordsprogram, tener du på slippdisiplin som for servertenester: versjonering med changelog-støtte, rollback-alternativ og definerte migrasjonstrinn.

Databasemigrasjonar: planlagde framfor risikable

Ved kvar strukturell endring av tabellar, indeksar eller visningar må det vere klart: Kva versjon av applikasjonen forventar kva skjema? Ein ryddig tilnærming brukar:

  • Versjonerte migrasjonsskript per release
  • Bakoverkompatible overgangsfasar, når klientutrulling ikkje kan skje samstundes
  • Ryddige backout-strategiar (Backup, Wiederherstellung, definerte nedetidsvindauge)

Dette er ikkje eit mål i seg sjølv: Utan denne disiplinen blir arkitekturforbetringar i kvardagen „for farlege“ og blir liggande.

Logging, overvaking og feilsøking: Uten telemetri ingen stabilitet

„Es kommt selten vor, aber wenn, dann steht alles“ er eit varselteikn. Etablerte Client-Server-system har ofte utilstrekkeleg logging, særleg på tvers av systemgrenser. For driftsteam er det avgjerande at ein feilsituasjon kan rekonstruerast både tidsmessig og fagleg.

Kva som i praksis bør loggast

  • Korrelasjon: ei transaksjons-ID som knyter klient, teneste og databaseoperasjonar saman
  • Kontekst: brukar, tenant, maskin/lokasjon, versjon, påverka operasjon
  • Tekniske detaljar: databasefeilkodar, timeout-informasjon, retry-forsøk
  • Sikkerheitsrelevant: mislykka innloggingar, brot på rettar, mistenkelege anropsmønster

Viktig er skilnaden mellom tekniske loggar og faglege protokollar. Ein fagleg protokoll (t.d. „Beleg freigegeben durch Benutzer X“) er ofte revisjonsrelevant; tekniske loggar finst for feilsøking og bør vere tilstrekkeleg beskytta og roterte.

Nettverk, sikkerheit og rettar: Frå „läuft im LAN“ til „läuft im Unternehmen“

Mange Delphi-klient‑server-system vart utforma i ei tid då «i LAN» var lik «påliteleg». I dag gjeld: segmentering, Zero-Trust-tilnærmingar, VPN, MFA og restriktive brannmurreglar er standard. Opprydding i arkitekturen er difor òg sikkerheitsarbeid.

Databaserettar: prinsippet om minst mogleg rettar

Ein vanleg tidleg tilstand er ein databasebrukar med omfattande rettar som alle klientar nyttar. Bedre er:

  • Rollebaserte rettar per funksjonsområde
  • Separate tilgangar for klient, tenester, batch‑jobbar
  • Ingen admin‑rettar i produksjonstilgangar for kvardagsoperasjonar

Det avgrensar følgjer av feil og gjer revisjonar langt enklare. Samstundes aukar transparens og diagnostiseringsevne, fordi feil knytte til rettar ikkje lenger oppstår «tilfeldig».

Hemmelighaldingar og konfigurasjon: Bort frå passord i klartekst

Påloggingsdata i INI‑filer eller i registeret er ein klassikar. Avhengig av omgjevnaden kan sentrale Secret‑Stores, kryptert konfigurasjon eller åtminstone driftskonsept med restriktive filrettar vere aktuelle løysingar. Avgjerande er: Løysinga må halde seg administrerbar. Sikkerheit som vert omgått i kvardagen, er ingen sikkerheit.

Trinnvis modernisering: Kor byrje når alt verkar viktig?

Prioriteringa avgjer om oppryddinga stopper etter to månader eller gir målbar lettnad. Det har vist seg nyttig å følgje ei rekkjefølgje som fyrst adresserer driftssikkerheit og deretter tek med strukturelle forbetringar.

Ein pragmatisk moderniseringsplan

  1. Stabilisere transaksjons‑ og feilåtferd: mindre datakorruptjon, færre «manuelle Reparaturen».
  2. Sentralt datatilgang: eintydig tilkoblingskonfigurasjon, timeouts, retries, logging.
  3. Samle Use‑Cases: trekk kritiske kjerneprosessar ut av brukargrensesnittet.
  4. Definere grensesnitt utad: REST‑API eller servicefasade for integrasjon, utan direkte tabelltilgang.
  5. Profesjonalisere Deployment: reproduserbare oppdateringar, versjonerte DB‑migrasjonar.
  6. Sikkerheits‑Hardening: rettar, Secrets, nettverksgrenser, revisjonsevne.

Denne rekkjefølgja er ikkje dogmatisk, men ho sørgjer for at tidlege steg får umiddelbar effekt i drifta og gjer seinare steg enklare.

Typiske snublesteinar frå prosjektomsyn – og korleis ein unngår dei

Ved opprydding feilar prosjekt sjeldan på grunn av teknikk, men på grunn av rammevilkår. Nokre snublesteinar går igjen:

«Ved sidan av»‑ombygging utan kvalitetssikringsnett

Når arkitekturtiltak køyrer parallelt med faglege endringar, manglar det ofte eit tryggingsnett. Minst nødvendig er: reproduserbare testdata, definerte Smoke‑Tests for kjerneprosessar, og ein release‑prosess som ser rollback ikkje som eit nederlag, men som eit driftsverktøy.

To datamodellar samtidig

Den som byggjer nye modullar, men let gamle skjermbilete framleis aksessere tabellar direkte, får raskt inkonsistente reglar. Bedre: definer klare overgangsreglar. Enten held eit område fram som «gammelt» og blir ikkje modernisert parallelt, eller det blir konsekvent køyrt gjennom det nye laget.

Integrasjon utan styring

Så snart partnarar eller interne system blir kopla til, oppstår avhengigheiter. Utan versjonering, kontraktstesting og definert utfasingstrategi blir kvar endring ein avstemmingssløyfe. Dette er mindre eit utviklarproblem enn eit arkitektur- og driftsproblem.

Konklusjon: Rydding handlar om å gjere drift og endring att styrbare

Når de ryddar opp i klient–server-arkitekturane i Delphi handlar det ikkje om «modernisering for moderniteten si skuld». Det handlar om å strukturere ei forretningskritisk digital bedriftsløysing slik at drift, tryggleik og vidareutvikling kan planleggast. Dei mest effektive tiltaka er som regel lite spektakulære: klare lag, konsekvent tilgang til data, tydelege transaksjonsgrenser, robust logging og ein grensesnittsstrategi som ikkje dupliserer reglar.

Det avgjerande er framgangsmåten: inkrementelt, med eit målbilete og ei prioritering som fyrst skapar stabilitet. Slik kan de modernisere eit etablert Delphi-landskap utan å setje den daglege drifta i fare – og utan å bli pressa inn i ein risikabel totalomstart.

Om de vil vurdere neste steg for arkitekturen, databaseåtkomstane og grensesnittene på ein pragmatisk måte, ta kontakt med oss:

I fagleg samanheng spelar også Delphi modernisering ei viktig rolle når integrasjonar, dataflyt og vidareutvikling må spele godt saman.

Drøft prosjekt eller moderniseringsprosjekt med Net-Base.

neste steg

Når temaet blir eit reelt prosjekt, bør arkitektur, eksisterande system og drift tidleg saman vurderast.

Vi støttar ikkje berre ved enkeltspørsmål, men òg når korte kildekodesnuttar, legacy-tema eller portalidéar skal utviklast til eit robust bedriftsprosjekt.

  • Eksisterande tilstand, målbiletet og tekniske risikoar blir vurderast samla.
  • REST, datatilgang, portalar og utrulling blir ikkje utsett til seinare fasar.
  • De ser tidleg kva veg som er økonomisk og driftsmessig berekraftig.

Del innlegg

Del dette innlegget direkte

LinkedIn, X, XING, Facebook, WhatsApp og e-post er straks tilgjengelege. For Instagram klargjer vi lenke og kort tekst med det same.

E-post

Instagram opnar i ein ny fane. Lenkje og kort tekst blir kopiert til utklippstavla på førehand.