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.