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

Den som vil rydde opp i klient-server-arkitekturar i Delphi ønsker, har sjeldan eit „dårleg“ system framfor seg. Oft er det robust bedriftsprogramvare som er utvida gjennom år, dekkjer mange spesialtilfelle og som i kvardagen kjøyrer påliteleg. Problemet oppstår ikkje på grunn av Delphi som plattform, men på grunn av oppvaksne ansvarsforhold: Klienten inneheld plutseleg datalogikk, „serveren“ er i praksis berre ei database, og grensesnitt har vorte lagde til ad hoc. Det straffar seg når nye sikkerheitskrav, databaseskifte, Homeoffice-VPN, Terminalserver-Setups eller integrasjonar med ERP, DMS eller portalar kjem til.

Denne artikkelen syner korleis de kan strukturerast rydde opp i Delphi-klient-server-landskap i praksis: utan dogmatisk fullstendig nybygg, men med klare mål for drift, administrasjon, datakonsistens, grensesnittmoglegheit og vedlikehald. I fokus står avgjerder som IT-Leitung og tekniske prosjektansvarlege kan styre: arkitekturgrenser, utrullingsstrategiar, Logging, rettigheitskonsept, migrasjonsvegar og typiske risikokjelder.

Korleis ein ser at klient-server-arkitekturen er „samvaksen“

Teknisk gjeld visar seg i drift som regel før i kjeldekoden. Typiske signal er mindre «dårleg kode», og meir tilbakevendande friksjonspunkt mellom klient, database og infrastruktur:

  • Uklare ansvarsforhold: Klienten «veit“ for mykje om tabellar, Trigger, Stored Procedures eller til og med filstiar på Shares.
  • Vanskelege release-prosessar: Kvar lita endring krev klientutrulling på mange arbeidsplassar, ofte med manuelle steg.
  • Sårbare dataåtkomstar: Tilfeldige Deadlocks, inkonsistente transaksjonar eller «hengande“ lås i toppbelastningstimar.
  • Sikkerheit som ettertanke: Databaseåtkomstar går med for vide rettar; passord ligg i INI-filer; nettverkssegmentering bryt funksjonar.
  • Integrasjon kostar uforholdsmessig mykje: Eit Kundeportal eller ei REST-API er vanskeleg å ettermontera, fordi forretningsreglar er spreidde.
  • Vanskeleg feilsøking: Utan påliteleg Logging er det uklart om feil oppstår i klienten, i nettverket, i databasen eller i eit grensesnitt.

Dersom fleire av desse punkta gjeld, er «rydding“ ikkje kosmetikk, men eit tiltak for driftsikkerheit. Målet er ikkje perfeksjon, men eit system som framleis er påliteleg endringsbart.

Klient-server i Delphi: kva som i drift verkeleg tel

I mange Delphi-landskap blir «Klient-Server“ implisitt forstått som «klienten snakkar direkte med databasen». Det kan fungera – så lenge rammevilkåra ikkje endrar seg. For verksemder tel likevel andre eigenskapar:

  • Skalerbarheit i kvardagen: ikkje blankpolerte Benchmarkar, men stabil ytelse ved typiske lasttoppar (månadsslutt, skiftbytte, importkøyringar).
  • Endringsbarheit: Tilpassingar utan kjedereaksjonar av utrulling, datamigrasjon og opplæring.
  • Sikker drift: etterprøvbare rettar, reviderbarheit, ryddig hemmeligheitsforvaltning (Credentials), nettverksgrenser.
  • Integrasjonsevne: definerte grensesnitt i staden for ein «annan klient“ som òg koplar seg direkte til tabellane.

Desse måla kan nåast utan å erstatta Delphi. Avgjerande er korleis de set grensene: kva er UI, kva er forretningslogikk, kva er dataaksess, og gjennom kva grensesnitt skal andre system kunne koble seg til?

Rydd opp i klient‑server‑arkitekturar i Delphi: målbilete i staden for Big Bang

Eit praktisk gjennomførbart målbilete er sjeldan eit radikalt brot. Eit inkrementelt tilnærming med ein klar arkitekturramme har vist seg å fungere. Dette blir ofte realisert som Layer-3-arkitektur: tre lag med klare ansvarsområde. „Layer“ betyr her: ei definert skiljing mellom UI (presentasjon), forretningslogikk (reglar/use-cases) og dataaksess (SQL, transaksjonar, persistens). Dette kan også strukturerast innanfor ein Delphi-monolitt før de løyser ut ein eigen teneste.

Steg 1: Gjer arkitekturkantar 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 triggrar, delvis i rapportar eller importskript.
  • Databasetilkoblingar blir opna overalt, ofte med ulike parameter.

Målet er ein oversiktleg kjerne: få inngangspunkt til forretningsfunksjonar og ein sentralisert dataaksess som handterer tilkoblingar, transaksjonar og feilhandtering konsistent.

Steg 2: «Kontraktar» definera – også utan tenester

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

Stabiliser dataaksess: FireDAC, transaksjonar og ein klar tilkoblingsstrategi

Dataaksess er i klient‑server-oppsett ofte den største spaken for stabilitet. To tema dominerer: konsistente tilkoplingar og klare transaksjonsgrenser. I Delphi-miljø er BDE-avløysing med nativ tilkopling (ein dataaksessbibliotek med drivarar og tilkoplingspooling) ofte moderniseringsankeret, særleg når framleis BDE (Borland Database Engine, eit eldre lag for dataaksess) er i bruk.

BDE-avløysing: meir enn eit drivarbyte

Ei BDE-avløysing blir undervurdert om ein ser på ho som berre eit «bytte av komponentar». I praksis rører ho ved:

  • SQL-dialekt og parametrisering: Ulike databasar og drivarar reagerer ulikt på datumsformat, NULL-handtering, sortering og teiknsett.
  • Transaksjonsatferd: Autocommit, isolasjonsnivå (reglar for kor strengt lås/lesing blir handsama) og feiloppretting.
  • Ytelse og låsing: Nokre eldre logikkar stolar ubevisst på implisitte låsingsmekanismar.

Operativt viktig er eit testkonsept som ikkje berre klikkar gjennom skjermane, men som etterliknar 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 feil blir ikkje rulla tilbake på ein ryddig måte. Det fører til deltilstandar som seinare må «manuelt reingjort» bli retta opp. Bedre er eit konsekvent mønster:

  • Transaksjon per fagleg operasjon (t.d. «Opprett ordre», «Bokfør varemottak»), ikkje per SQL-setning.
  • Tydelege feilløp: Ved valideringsfeil skal det ikkje vere ein halvferdig datatilstand, men eit kontrollert avbrot.
  • Idempotens ved import: Gjentakeleg innspel utan doble bokføringar.

For IT-drift og support er dette særleg viktig: Når ein operasjon feilar, må feilet vere etterprøvbart – med loggoppføringar, korrelerbare ID-ar og ei entydig feilmeldingsklasse (t.d. autorisering, datakonflikt, teknisk feil).

Trekk ut forretningslogikk frå klienten – utan å øydeleggje brukaropplevinga

Mange Delphi-klientar har historisk vorte «UI-sentrert» bygd: Flyten ligg i skjema, valideringar i OnChange-hendingar, sideeffekt i OnExit. Det er for brukarane ofte raskt og direkte – frå arkitekturperspektiv er det derimot vanskeleg å teste og vidareutvikle.

Use-cases i staden for skjema-logikk

Eit praktisk mellomsteg er å samle funksjonalitet i faglege use-cases: ein use-case kapslar ein prosess (t.d. «Godkjenne faktura») inkludert valideringar, utrekningar, dataåtkomst og protokollføring. UI-en kallar use-casen og viser resultat, i staden for å implementere reglane sjølv. Fordel: Seinare kan same use-case nyttast via ein REST-API, til dømes for eit portal eller ein importteneste.

Sentralisere reglar: validering, nummerseriar, tilstandsmodellar

Typiske kandidatar for sentralisering er:

  • Valideringsreglar (obligatoriske felt, verdiområde, plausibilitetar)
  • Nummerseriar (bilag, parti, prosessar) med konfliktunngåing
  • Tilstandsmodellar (utkast → kontrollert → frigitt → bokført) med tillatne overgangar
  • Tilgangskontroller nær forretningsoperasjonen, ikkje berre i UI-en

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

Bli grensesnittdyktig: REST-API som kontrollert tilgang, ikkje som «ein omveg»

Mange bedrifter treng integrasjon: data for BI, kopling til ERP/DMS/CRM, automatisering av import/eksport eller eit kundeportal. Den typiske feilen er å bygge ein REST-API «ved sida av» som går direkte på tabellar fordi det går raskt. Det skapar to sanningar: klientlogikken og API-logikken divergerer, og datakonsistens blir tilfeldig.

REST som fasade foran stabile use-cases

Ein REST-API (HTTP-basert grensesnitt, vanlegvis JSON) bør tilby faglege operasjonar, ikkje spegle tabellar. Døme: «Opprett ordre», «hent status», «last opp dokument til ein prosess». API-en kallar dei same use-casene som klienten nyttar. Det reduserer doble reglar og skapar klar styring: eksterne system får ein kontrollert tilgang som kan versjonerast og sikrast.

Sikkerheit og drift av ein API

Frå eit B2B-synspunkt er det mindre endepunkta som er interessante, og meir drift og sikring:

  • Autentisering: t.d. token-baserte metoder; i bedriftsmiljø ofte tilkopling til sentrale identitetar (SAML 2.0 er ein utbreidd standard for single sign-on).
  • Autorisering: rettar per operasjon, ikkje berre «kan bruke API».
  • Rate-Limits und Schutz vor Missbrauch: viktig ved partnertilgangar.
  • Versionierung: planlagde endringar utan stille brot.

Hvis du allereie planlegg ein modernisering av grensesnitt, lønner det seg å sjå på ein strukturert tilnærming for å etterinstallere ein REST-API i eksisterande programvare: Det gjer prioritering lettare og reduserer driftsrisiko.

Utrulling og oppdateringsevne: den stille kostnadsdrivaren

Mange Delphi-system mislykkast ikkje på funksjonalitet, men på rollout-prosessar. «Client-Server» betyr i praksis: mange arbeidsplassar, ulike rettigheiter, av og til terminalserver eller Citrix, i tillegg eksterne lokasjonar med VPN. Eit ryddig system har ein definert oppdateringshistorikk.

Standardisere: Konfigurasjon, versjonar, miljø

Typiske tiltak som verkar umiddelbart i drift:

  • Hent konfigurasjon frå binærpakka: separate konfigurasjonsfilar eller sentrale konfigurasjonskjelder, slik at oppdateringar ikkje overskriv innstillingar.
  • Miljøprofilar: test, staging, produksjon med klart separerte database- og teneste-endepunkt.
  • Automatisert installasjon: reproduserbar, òg for terminalserver-images.

Viktig: Sjølv om klienten «berre» er eit skrivebordsprogram, tener du på release-disiplin som for servertenester: versjonering med changelog-støtte, rollback-moglegheiter og definerte migrasjonstrinn.

Databasemigrasjonar: planlagt framfor risikabelt

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

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

Dette er ikkje eit mål i seg sjølv: utan denne disiplinen blir arkitekturforbetringar i dagleg drift «for farlege» og ligg att.

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

«Det skjer sjeldan, men når det skjer, står alt» er eit varselsignal. Vaksne «Client-Server»-system har ofte utilstrekkeleg logging, særleg på tvers av systemgrenser. For driftsteam er det avgjerande at ei feilsituasjon kan rekonstruerast tidsmessig og fagleg.

Kva som bør loggast i praksis

  • Korrelasjon: ein korrelasjons-ID som knyter klient, teneste og databaseoperasjonar saman
  • Kontext: brukar, leietakar, maskin/lokasjon, versjon, påverkad operasjon
  • Tekniske detaljar: databasefeilkoder, timeout-informasjon, omprøvingsforsøk
  • Sikkerheitsrelevant: mislykte påloggingar, rettigheitsovertramp, mistenkelege kallemønster

Viktig er skiljet mellom tekniske loggar og faglege protokollar. Eit fagleg protokoll (t.d. «Bilag frigitt av brukar X») er ofte revisjonsrelevant; tekniske loggar blir brukt til feilsøking og bør beskyttast og roterast deretter.

Nettverk, sikkerheit og rettar: frå „køyrer i LAN“ til „køyrer i verksemda“

Mange Delphi-klient-server-system vart designa i ein tid då «i LAN» var likestilt med «påliteleg». I dag gjeld: segmentering, Zero-Trust-tilnærmingar, VPN, MFA og restriktive brannmurreglar er standard. Å rydde i arkitekturen er følgjeleg også sikkerheitsarbeid.

Databaserettar: prinsippet om minimale rettar

Ein vanleg gamal tilstand er ein databasebrukar med omfattande rettar som alle klientar brukar. Betre er:

  • Rollebaserte rettar per funksjonsområde
  • Separate tilgangar for klient, tenester, batch-jobbar
  • Ingen admin-rettar i produksjonstilgangar for dagleg drift

Det avgrensar følgjene av feil og gjer revisjonar klart meir ukompliserte. Samstundes aukar transparens og feildiagnoseevne, fordi feil i rettar ikkje lenger oppstår «tilfeldig».

Hemmelegdomar og konfigurasjon: vekk frå passord i klartekst

Legitimasjonar i INI-filar eller i registeret er ein klassikar. Avhengig av miljøet kan ein ta i bruk sentrale secret-stores, kryptert konfigurasjon eller i det minste driftskonsept med restriktive filrettar. Avgjerande er: løysinga må halde seg administrerbar. Sikkerheit som blir sett til side i kvardagen, er inga sikkerheit.

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

Prioriteringa avgjer om ryddinga strandar etter to månader eller gir målbar avlasting. Ein rekkjefølgje som fyrst tek for seg driftssikkerheit og deretter fører med seg strukturoppdateringar, har vist seg å fungere.

Ein pragmatisk moderniseringsplan

  1. Stabilisere transaksjons- og feilåtferd: mindre datakorrupsjon, færre «manuelle reparasjonar».
  2. Sentralt dataåtkomst: einheitleg tilkoblingskonfigurasjon, timeouts, gjenforsøk, logging.
  3. Samle brukstilfelle: trekke kritiske kjerneprosessar ut av brukargrensesnittet.
  4. Definere grensesnitt ut mot omverda: REST-API eller tenestefasade for integrasjon, utan direkte tabelltilgang.
  5. Profesjonalisere utrulling: reproducerbare oppdateringar, versjonerte DB-migrasjonar.
  6. Security-hardening: rettar, hemmeligheitar, nettverksgrenser, revisjonsevne.

Denne rekkjefølgja er ikkje dogmatisk, men ho sørgjer for at tidlege tiltak får umiddelbar effekt i drift og at seinare steg blir lettare å gjennomføre.

Typiske snublesteinar frå prosjektperspektiv – og korleis unngå dei

Når ein ryddar, feilar prosjekt sjeldan på teknikken, men på rammevilkår. Nokre snublesteinar går att spesielt ofte:

«Ved sidan av»-ombygging utan kvalitetssikringsnett

Når arkitekturtiltak går parallelt med faglege endringar, manglar det ofte eit tryggleiksnett. Minst nødvendig er: reproducerbare testdata, definerte smoke-testar for kjerneprosessar, og ein release-prosess som ser rollback ikkje som eit nederlag, men som eit driftsverktøy.

To datamodellar samtidig

Integrasjon utan styring

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

Konklusjon: Å rydde opp betyr å gjere drift og endringar handterlege att

Dersom de ryddar opp i klient‑server‑arkitekturar i Delphi, handlar det ikkje om «modern for modernitetens skuld». Det handlar om å strukturere ei forretningskritisk digital bedriftsløysing slik at drift, tryggleik og vidareutvikling held seg planlagde. Dei sterkaste tiltaka er ofte uspektakulære: tydelege lag, konsekvent tilgang til data, klare transaksjonsgrenser, robust logging og ei grensesnittstrategi som ikkje dupliserer reglar.

Den avgjerande faktoren er framgangsmåten: inkrementelt, med eit målbilete og ei prioritering som først 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 fullstendig nystart.

Dersom de ønskjer å vurdere dei neste stega for arkitekturen, databasetilgangar og grensesnitt 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.

Del innlegg

Del dette innlegget direkte

LinkedIn, X, XING, Facebook, WhatsApp og e-post er tilgjengelege med ein gong. 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.