Programmering


Jeg er gået i gang med at programmere et lønsystem med en Firebird database. Den SQL-kode, som bruges her, er selvfølgelig specifik for Firebird 2.0, men mon ikke det kan være inspiration til den SQL, som bruges i andre database også.

For at kunne danne en fil, som kan oploades til SKAT, er den første udfordring at kunne skrive en “field” ind i en “record”.

Dette gøres ved at lave en ny stored procedure. Jeg kommenterer koden med rødt

CREATE PROCEDURE PR_REC_WRITE (
REC varchar(200), –den record, som skal skrives i
FORMAT char(1), –hvilket format? N=numerisk; A=alfanumerisk; D=dato; B=beløb
POS integer,
LEN integer,
INPUTVAL varchar(75), –tal eller tekst
INPUTVALD date) –hvis det er en dato indsættes værdien her
returns (
REC_OUT varchar(200)) –den ændrede record returneres
as
declare variable FIELDSTR varchar(200); –denne variable bruges til at gemme den formatterede streng med værdien
declare variable MM varchar(2);
declare variable DD varchar(2);
begin
/* I alfanumeriske felter skal ledige felter udfyldes med blanke værdier.” */
/* “Alfanumeriske felter udfyldes venstrestillet, med mindre andet er angivet…” */
if (:FORMAT = ‘A’) then
FIELDSTR = rpad(:INPUTVAL, :LEN); –teksten fyldes op med blanke felter i hele længden
/* Numeriske felter skal, hvis værdien ikke udgør det fulde antal karakterer fyldes op med 0,
til antallet af karakterer er opfyldt. */
if (:FORMAT = ‘N’) then
FIELDSTR = lpad(:INPUTVAL, :LEN,  ‘0’); –tal fyldes op med foranstillede nuller
/* Alle datoer skal angives som ÅÅÅÅMMDD, hvor ‘ÅÅÅÅ’ er årstal, ‘MM’ er måned på 2 cifre
og ‘DD’ er dag i måneden med 2 cifre. Datofelter er numeriske */
if (:FORMAT = ‘D’) then
begin
MM = extract(month from :INPUTVALD);
MM = iif(char_length(MM) = 1, ‘0’ || MM,  MM); en måned skal altid fylde 2 tegn, evt med foranstillet nul
DD = extract(day from :INPUTVALD);
DD = iif(char_length(DD) = 1, ‘0’ || DD,  DD); –samme princip for dagen
FIELDSTR = extract(year from :INPUTVALD) || MM || DD;
end
/* Alle BELØB skal angives med 6 decimaler uden komma
…Fortegn angives altid i separat felt. */
if (:FORMAT = ‘B’) then
FIELDSTR = lpad(cast(cast(INPUTVAL as float) * 1000000 as integer), :LEN,  ‘0’); –her leges lidt med felttyper for at få beløb til at være  tal
— med 6 decimaler uden komma
REC_OUT = substring(:REC from 1 for :POS – 1) || FIELDSTR ||
substring(:REC from :POS + :LEN for 200); –recorden sammensættes af den oprindelige tekst før og efter det nye field
suspend;
end;

Således er en field indsat i en record, udelukkende ved brug af SQL i Firebird.

Efter at have brugt den gratis udgave af Interbase 6.0 gennem en årrække (med dens forskellige bugs) var det med megen  skepsis, at jeg downloadede Firebird 2.0. Men min skepsis er for længst gjort til skamme. Jeg har nu lavet utallige programmer i Delphi med Firebird som database, og må imponeres over den konstante stræben fra udviklernes side til at rette bugs og udvikle nye features,  anvende de nyeste SQL standarder osv. Og så er det ganske gratis. Det er selvfølgelig nogle russere, som er primus motor i dette projekt. De kan bare det der med computerprogrammer.