Net-Base Magasin

08.05.2026

Rydde opp i klient-server-arkitekturer i Delphi: gjenvinne stabilitet, drift og grensesnitt

Etablerte Delphi-Client-Server-systemer er ofte forretningskritiske – og samtidig vanskelige å vedlikeholde. Artikkelen viser praksisnært hvordan du kan skille ansvar, stabilisere datatilganger, modernisere grensesnitt og sikre driften, uten en risikabel...

08.05.2026

Fra magasinetema til prosjektpraksis

Egnede tjeneste- og tekniske sider for innlegget

Den som vil rydde opp i klient-server-arkitekturer i Delphi, står sjelden overfor et «dårlig» system. Ofte er det robust forretningsprogramvare som er utvidet over flere år, dekker mange unntakstilfeller og fungerer pålitelig i hverdagen. Problemet oppstår ikke på grunn av Delphi som plattform, men på grunn av gradvis oppståtte ansvarsområder: Klienten inneholder plutselig datalogikk, «serveren» er i realiteten bare en database, og grensesnitt er blitt lagt til ad hoc. Det får konsekvenser når nye sikkerhetskrav, databasebytter, hjemmekontor‑VPN, terminalserver‑oppsett eller integrasjoner med ERP, DMS eller portaler legges til.

Denne artikkelen viser hvordan du kan rydde opp i Delphi-klient‑server-landskap praktisk og strukturert: uten dogmatisk fullstendig gjenoppbygging, men med klare mål for drift, administrasjon, datakonsistens, grensesnitt‑egnethet og vedlikeholdbarhet. Fokus er på beslutninger som IT‑ledelse og tekniske prosjektansvarlige kan styre: arkitekturgrenser, utrullingsstrategier, logging, rettighetskonsepter, migrasjonsveier og typiske risikokilder.

Hvordan man kan se at klient-server-arkitekturen er «sammengrodd»

Teknisk gjeld viser seg i drift vanligvis tidligere enn i kildekoden. Typiske signaler er mindre «dårlig kode» enn tilbakevendende friksjonspunkter mellom klient, database og infrastruktur:

  • Uklare ansvarsforhold: Klienten «vet» for mye om tabeller, triggere, lagrede prosedyrer eller til og med filstier på delte nettverksmapper.
  • Vanskelige utrullinger: Hver lille endring krever klientutrulling på mange arbeidsplasser, ofte med manuelle steg.
  • Skjør dataadgang: Tilfeldige deadlocks, inkonsistente transaksjoner eller «hengende» låser i perioder med høy belastning.
  • Sikkerhet som ettertanke: Database‑tilganger kjører med for vide rettigheter; passord ligger i INI‑filer; nettverkssegmentering bryter funksjoner.
  • Integrasjon er uforholdsmessig kostbart: En kundeportal eller en REST‑API er vanskelig å ettermontere fordi forretningsreglene er fordelt.
  • Vanskelig feilsøking: Uten pålitelig logging er det uklart om feil oppstår i klienten, i nettverket, i databasen eller i et grensesnitt.

Hvis flere av disse punktene gjelder, er «opprydding» ikke kosmetikk, men et tiltak for driftssikkerhet. Målet er ikke perfeksjon, men et system som fortsatt kan endres pålitelig.

Klient‑server i Delphi: Hva som virkelig teller i drift

I mange Delphi‑landskap forstås «klient‑server» implisitt som «klienten snakker direkte med databasen». Det kan fungere – så lenge rammebetingelsene ikke endrer seg. For virksomheter teller imidlertid andre egenskaper:

  • Skalerbarhet i hverdagen: ikke høyglans‑benchmarks, men stabil ytelse ved typiske belastningstopper (månedsslutt, skiftbytte, importkjøringer).
  • Endringsmulighet: Tilpasninger uten kjedereaksjon av utrulling, datamigrasjon og opplæring.
  • Sikker drift: etterprøvbare rettigheter, revisjonsspor, hensiktsmessig håndtering av hemmeligheter (Credentials), nettverksavgrensning.
  • Integrasjonsevne: definerte grensesnitt i stedet for en «andre klient» som også kobler seg direkte mot tabellene.

Disse målene kan nås uten å „avløse“ Delphi. Avgjørende er hvordan dere trekker grenser: Hva er UI, hva er forretningslogikk, hva er dataadgang, og via hvilke grensesnitt kan andre systemer koble seg på?

Rydde opp i klient-server-arkitekturer i Delphi: Målbilde fremfor Big Bang

Et praktisk gjennomførbart målbilde er sjelden et radikalt brudd. Et inkrementelt forløp med en klar arkitekturramme har vist seg å fungere. Ofte implementeres dette som Layer-3-arkitektur: tre lag med klare ansvarsområder. „Layer“ betyr her: en definert separasjon av UI (presentasjon), forretningslogikk (regler/brukstilfeller) og dataadgang (SQL, transaksjoner, persistens). Dette kan også struktureres innenfor en Delphi-monolitt før dere utløser en faktisk tjeneste.

Trinn 1: Gjør arkitekturgrenser synlige

Før dere bygger om, må dere vite hvor koblinger oppstår. Typiske grensebrudd i Delphi-klienter er:

  • UI-hendelser (knappeklikk) inneholder SQL eller direkte tabelltilgang.
  • Forretningsregler er spredt: delvis i klienten, delvis i triggere, delvis i rapporter eller importskript.
  • Databasetilkoblinger åpnes overalt „ved siden av“, med ulike parametere.

Målet er en oversiktlig kjerne: få inngangspunkter til forretningsfunksjonene og en sentral dataadgang som konsistent håndterer tilkoblinger, transaksjoner og feilhåndtering.

Trinn 2: Definere „kontrakter“ – også uten Services

Mange team tror at grensesnitt først oppstår med REST. I realiteten trenger dere først interne kontrakter: Hvilke funksjoner finnes, hvilke parametere overføres, hvilke feilkoder er tillatt, hvilke transaksjoner hører sammen? Disse kontraktene kan først eksistere som klart definerte moduler/komponenter i Delphi-prosjektet. Senere kan de relativt rent overføres til en REST-server eller til en Windows- og Linux-Services.

Stabilisere dataadgang: FireDAC, transaksjoner og klar tilkoblingsstrategi

Dataadgang er i klient-server-oppsett ofte det største løftet for stabilitet. To tema dominerer: konsistente tilkoblinger og klare transaksjonsgrenser. I Delphi-miljøer er BDE-utskifting med native tilkobling (dataadgangsbibliotek med drivere og tilkoblingspooling) ofte moderniseringsankeret, særlig hvis BDE (Borland Database Engine, et eldre dataadgangslag) fortsatt er i bruk.

BDE-utskifting: Mer enn et driverbytte

En BDE-utskifting blir undervurdert hvis man ser den som „bytte av komponenter“. I praksis berører den:

  • SQL-dialekt og parametrisering: Ulike databaser og drivere reagerer forskjellig på datoformater, NULL-håndtering, sortering og tegnsett.
  • Transaksjonsatferd: Autocommit, isolasjonsnivåer (regler for hvor strengt låsing/lesing behandles) og feilgjenoppretting.
  • Ytelse og låsing: Noe gammel logikk stoler ubevisst på implisitte låsemekanismer.

Operativt viktig er et testkonsept som ikke bare „klikker gjennom“ skjermer, men som simulerer typiske bokførings- og importflyter under belastning.

Transaksjoner: Mindre magi, flere regler

I mange modne Delphi-klienter oppstår transaksjoner tilfeldig: Et skjema lagrer flere tabeller, men feiltilfeller rulles ikke tilbake ordentlig. Det fører til deltilstander som senere må «manuelt ryddes opp». Bedre er et konsistent mønster:

  • Transaksjon per faglig operasjon (f.eks. «Opprett ordre», «Bokfør vareinnkomst»), ikke per SQL-statement.
  • Tydelige feilforløp: Ved valideringsfeil ingen halvferdig datatilstand, men kontrollert avbrudd.
  • Idempotens ved import: Gjentakbar innlasting uten doble bokføringer.

For IT-drift og support gjelder først og fremst: Når en operasjon feiler, må den feile sporbar – med loggoppføringer, korrelerbare ID-er og en entydig feilmeldingsklasse (f.eks. rettighet, datakonflikt, teknisk feil).

Forretningslogikken ut av klienten – uten å ødelegge brukeropplevelsen

Mange Delphi-klienter har historisk vokst «UI-sentrert»: Flyten ligger i skjemaer, valideringer i OnChange-events, sideeffekter i OnExit. Det er fra brukerens ståsted ofte raskt og direkte – fra arkitekturperspektiv derimot vanskelig å teste og utvide.

Use-Cases i stedet for skjema-logikk

Et praktisk mellomtrinn er å samle faglige Use-Cases: En Use-Case kapsler en operasjon (f.eks. «Godkjenne faktura») inkludert valideringer, beregninger, datatilgang og protokollering. UI-en kaller den og viser resultater, i stedet for å implementere reglene selv. Fordel: Senere kan samme Use-Case benyttes via en REST-API, for eksempel for en portal eller en importtjeneste.

Sentraliser regler: Validering, nummerserier, tilstandsmodeller

Typiske kandidater for sentralisering er:

  • Valideringsregler (påkrevde felt, verdiområder, plausibilitetskontroller)
  • Nummerserier (bilag, batcher, operasjoner) med konfliktunngåelse
  • Tilstandsmodeller (Utkast → kontrollert → frigitt → bokført) med tillatte overganger
  • Autorisasjonskontroller nær forretningsoperasjonen, ikke bare i UI-en

Særlig for autorisasjoner er dette avgjørende: Hvis reglene kun ligger i klienten, er de vanskelige å holde konsistente for grensesnitt, automatiseringer eller senere portaler.

Gjør systemet grensesnittvennlig: REST-API som kontrollert tilgang, ikke som «annen vei»

Mange bedrifter trenger integrasjon: data for BI, kobling til ERP/DMS/CRM, automatisering av import/eksport eller et kundeportal. Den typiske feilen er å bygge en REST-API «ved siden av» som går direkte på tabellene fordi det er raskt. Det skaper to sannheter: klientlogikk og API-logikk divergerer, og datakonsistens blir tilfeldig.

REST som fasade foran stabile Use-Cases

En REST-API (HTTP-basert grensesnitt, vanligvis JSON) bør tilby faglige operasjoner, ikke speile tabeller. Eksempler er: «Opprett ordre», «hent status», «last opp dokument til en hendelse». API-en kaller de samme Use-Casene som klienten bruker. Dermed reduserer du doble regler og etablerer klar governance: eksterne systemer får kontrollert tilgang som kan versjoneres og sikres.

Sikkerhet og drift av en API

Fra et B2B-perspektiv er det ikke endepunktene som er mest interessante, men drift og sikring:

  • Autentisering: f.eks. tokenbaserte metoder; i bedriftsmiljøer ofte tilknytning til sentrale identiteter (SAML 2.0 er en utbredt standard for Single Sign-on).
  • Autorisasjon: rettigheter per operasjon, ikke bare «kan bruke API».
  • Ratebegrensninger og beskyttelse mot misbruk: viktig ved partnertilganger.
  • Versjonering: planlagte endringer uten stille inkompatibilitet.

Hvis du allerede planlegger en modernisering av grensesnitt, er det verdt å se på en strukturert tilnærming for ettermontering av en REST-API i eksisterende programvare: Det gjør prioritering enklere og reduserer driftsrisiko.

Distribusjon og oppdaterbarhet: Den stille kostnadsdriveren

Mange Delphi-systemer mislykkes ikke på grunn av funksjonalitet, men på grunn av rollout-prosesser. „Client-Server“ betyr i praksis: mange arbeidsplasser, ulike rettighetsnivåer, av og til terminalserver eller Citrix, i tillegg eksterne lokasjoner med VPN. Et ryddig system har et definert oppdateringsforløp.

Standardisere: Konfigurasjon, versjoner, miljøer

Typiske tiltak som har umiddelbar effekt i driften:

  • Konfigurasjon fra binærpakken: separate konfigurasjonsfiler eller sentrale konfigurasjonskilder, slik at oppdateringer ikke overskriver innstillinger.
  • Miljøprofiler: Test, Staging, Produksjon med klart adskilte database- og tjenesteendepunkter.
  • Automatisert installasjon: reproduserbar, også for terminalserver-images.

Viktig: Selv om klienten «bare» er et skrivebordsprogram, drar du nytte av release-disiplin som for servertjenester: versjonering som støtter changelog, rollback-muligheter og definerte migrasjonstrinn.

Database-migrasjoner: planlagt fremfor risikabelt

Ved enhver strukturell endring av tabeller, indekser eller views må det være klart: Hvilken versjon av applikasjonen forventer hvilket skjema? En ryddig tilnærming benytter:

  • Versjonerte migrasjonsskript per release
  • Bakoverkompatible overgangsfaser, når klientrullout ikke kan skje samtidig
  • Tydelige backout-strategier (Backup, gjenoppretting, definerte nedetidsvinduer)

Det er ikke et mål i seg selv: Uten denne disiplinen blir arkitekturforbedringer i det daglige «for farlige» og blir liggende.

Logging, overvåking og feilsøking: Uten telemetri ingen stabilitet

«Det skjer sjelden, men når det skjer, stopper alt» er et faresignal. Modne Client-Server-systemer har ofte utilstrekkelig logging, særlig over systemgrenser. For driftsteam er det avgjørende at en feilsituasjon lar seg rekonstruere tidsmessig og faglig.

Hva som bør logges i praksis

  • Korrelasjon: en operasjons-ID som binder klient, tjeneste og databaseoperasjoner sammen
  • Kontekst: bruker, tenant, maskin/lokasjon, versjon, berørt operasjon
  • Tekniske detaljer: database-feilkoder, timeout-informasjon, gjenforsøk
  • Sikkerhetsrelevant: mislykkede pålogginger, rettighetsbrudd, mistenkelige anropsmønstre

Det er viktig å skille tekniske logger fra faglige protokoller. En faglig protokoll (f.eks. „Bilag frigitt av bruker X“) er ofte revisjonsrelevant; tekniske logger brukes til feilanalyse og bør beskyttes og roteres deretter.

Nettverk, sikkerhet og rettigheter: Fra „kjører i LAN“ til „kjører i bedriften“

Mange Delphi-klient-server-systemer ble designet i tider da „i LAN“ var likestilt med „pålitelig“. I dag gjelder: segmentering, Zero Trust-tilnærminger, VPN, MFA og restriktive brannmurregler som standard. Å rydde opp i arkitekturen er derfor også sikkerhetsarbeid.

Databaserettigheter: prinsippet om minste privilegium

En vanlig eldre tilstand er en databasebruker med vidtrekkende rettigheter som alle klienter bruker. Bedre er:

  • Rollebaserte rettigheter per funksjonsområde
  • Separate tilganger for klient, tjenester, batch-jobber
  • Ingen admin-rettigheter i produksjonstilganger for daglige operasjoner

Det begrenser konsekvensene av feil og gjør revisjoner betydelig enklere. Samtidig øker transparens og diagnoseevne, fordi rettighetsfeil ikke lenger oppstår „tilfeldig“.

Hemmeligheter og konfigurasjon: bort fra klartekstpassord

Påloggingsdata i INI-filer eller i registeret er en klassiker. Avhengig av miljø kan man vurdere sentrale Secret-Stores, kryptert konfigurasjon eller i det minste driftskonsepter med restriktive filrettigheter. Avgjørende er: Løsningen må forbli administrerbar. Sikkerhet som blir omgått i det daglige, er ikke sikkerhet.

Trinnvis modernisering: Hvor begynne når alt virker viktig?

Prioritering avgjør om oppryddingen stopper etter to måneder eller gir målbar avlastning. En rekkefølge som først adresserer driftssikkerhet og deretter fører med seg strukturelle forbedringer, har vist seg å fungere.

En pragmatisk moderniseringsplan

  1. Stabilisere transaksjons- og feiladferd: mindre datakorruptjon, færre „manuelle reparasjoner“.
  2. Sentralt data-tilgang: enhetlig tilkoblingskonfigurasjon, timeouts, gjenforsøk, logging.
  3. Samle brukstilfeller: trekke kritiske kjerneprosesser ut av brukergrensesnittet.
  4. Definere grensesnitt mot utsiden: REST-API eller servicefasade for integrasjon, uten direkte tabelltilgang.
  5. Profesjonalisere deployment: reproduserbare oppdateringer, versjonerte DB-migrasjoner.
  6. Sikkerhetshardening: rettigheter, hemmeligheter, nettverksgrenser, revisjonssporbarhet.

Denne rekkefølgen er ikke dogmatisk, men den sørger for at tidlige steg umiddelbart merkes i drift og gjør senere steg enklere å gjennomføre.

Typiske fallgruver fra prosjektperspektiv – og hvordan man unngår dem

Når man rydder opp, feiler initiativer sjelden på grunn av teknikk, men på grunn av rammebetingelser. Enkelte fallgruver forekommer særlig ofte:

„Ved siden av“-ombygging uten kvalitetsnett

Når arkitekturtiltak kjøres parallelt med funksjonelle endringer, mangler det ofte et sikkerhetsnett. Minst nødvendig er: reproduserbare testdata, definerte smoke-tester for kjerneprosesser, og en release-prosess som ser rollback ikke som et nederlag, men som et driftsverktøy.

To datamodeller samtidig

Den som bygger nye moduler, men lar gamle skjermbilder fortsatt aksessere tabellene direkte, får raskt inkonsistente regler. Bedre: definer klare overgangsregler. Enten forblir et område foreløpig „gammelt“ og moderniseres ikke parallelt, eller det føres konsekvent gjennom det nye laget.

Integrasjon uten styring

Når partnere eller interne systemer kobles til, oppstår avhengigheter. Uten versjonering, kontraktstester og en definert utfasingsstrategi blir hver endring en avstemmingssløyfe. Det er mindre et utviklerproblem enn et arkitektur- og driftsproblem.

Konklusjon: Opprydding betyr å gjøre drift og endringer håndterbare igjen

Når du rydder opp i klient-server-arkitekturer i Delphi, handler det ikke om „modernisering for moderniseringens skyld“. Det handler om å strukturere en forretningskritisk digital bedriftsløsning slik at drift, sikkerhet og videreutvikling forblir planbare. De mest effektive grepene er vanligvis uspektakulære: klare lag, konsistent datatilgang, rene transaksjonsgrenser, robust logging og en grensesnittsstrategi som ikke dupliserer regler.

Det avgjørende er fremgangsmåten: inkrementelt, med et målbilde og en prioritering som skaper stabilitet først. Slik kan du modernisere et etablert Delphi-landskap uten å sette den daglige driften i fare – og uten å bli presset inn i en risikabel fullstendig nystart.

Hvis du ønsker å vurdere de neste stegene for din arkitektur, databaseadgang og grensesnitt pragmatisk, snakk med oss:

I faglig sammenheng spiller også Delphi Modernisering en viktig rolle når integrasjoner, dataflyt og videreutvikling må samhandle på en ryddig måte.

Diskutere prosjekt eller moderniseringsprosjekt med Net-Base.

Neste trinn

Når et tema blir et reelt prosjekt, bør arkitektur, eksisterende systemer og drift vurderes samlet allerede tidlig i prosessen.

Vi bistår ikke bare med enkeltspørsmål, men også når kodesnutter, legacy-temaer eller portalideer skal utvikles til et robust virksomhetsprosjekt.

  • Eksisterende tilstand, målbildet og tekniske risikoer vurderes samlet.
  • REST, datatilgang, portaler og utrulling blir ikke utsatt som etterfølgende oppgaver.
  • Dere ser tidlig hvilken vei som er økonomisk og driftsmessig levedyktig.

Del innlegg

Del dette innlegget direkte

LinkedIn, X, XING, Facebook, WhatsApp og e-post er umiddelbart tilgjengelige. For Instagram forbereder vi lenke og kort tekst umiddelbart.

E-post

Instagram åpnes i en ny fane. Lenken og kortteksten kopieres først til utklippstavlen.