Technical Article

(Dutch) Elfproef in T-SQL UDF

,

In The Netherlands we use bankaccountnumbers that need to comply to a test call 'elfproef'. This test evaluates the sum of each number multiplied by the position the number appears in the accountnumber. If the modulos of the sum divided by 11 is zero then the accountnumber is valid. The length of a bankaccountnumber in the Netherlands should be 9 numbers.

For this 'elfproef' several examples can be found for VB but I saw it never implemented in T-SQL code.

Below a T-SQL User-Defined function that does the job.

create  function f_rv_elfproef (@tRekeningnummer varchar(20))
returns int
as
begin

   --Auteur: Dinand Veldman (dveldman@home.nl)
   
   --Deze T-SQL user-defined function is gebaseerd op de broncode van de vb
   --functie IsBankrekeningNr die M. Steijn op zijn website had staan
   --De url hiervan luidt: http://home.wxs.nl/~msteijn/vbtips/index.htm

   --Aangezien in T-SQL geen for ... lus gebruikt kan worden heb ik gebruik
   --gemaakt van een while ... lus waarbij ik de teller zelf ophoog

   --De functie geeft als resultaat een integer van -1 to 2. Hieronder de 
   --uitleg van de resultaatcodes

   -- -1 : Het geteste rekeningnummer heeft 10 cijfers en is waarschijnlijk een spaarrekening
   --  0 : Het geteste rekeningnummer voldoet niet aan de elfproef
   --  1 : Het geteste rekeningnummer voldoet aan de elfproef
   --  2 : Het geteste rekeningnummer heeft minder dan 9 cijfers en is waarschijnlijk een girorekening

   -- Bij gebruik van de functie kan getest worden of het ontvangen resultaat groter is dan 0
   -- In dat geval kan het rekeningnummer worden opgeslagen in de database

declare @tTest varchar(9)
declare @tKarakter char(1)
declare @iTeller int
declare @lSom int
declare @lCijfer int

declare @iResultaat int

select @tTest=''
select @iTeller = 1

--Punten, Komma's en de eventuele voorloop P in gironummers wegfilteren

while @iTeller < len(@tRekeningnummer) + 1
begin
select @tKarakter=substring(@tRekeningnummer,@iTeller,1)
If @tKarakter not in (Select '.') 
and @tKarakter not in (Select ',') 
and @tKarakter not in (Select 'p') 
and @tKarakter not in (Select 'P')
begin
select @tTest= @tTest + substring(@tRekeningnummer,@iTeller,1)
end
select @iTeller=@iTeller+1
end

select @iTeller=1
select @lSom=0

if len(rtrim(@tTest)) = 9
begin
while @iTeller < len(rtrim(@tTest)) + 1
begin
select @lCijfer = convert(int,substring(@tTest, @iTeller,1))
select @lSom = @lSom + @lCijfer * (@iTeller+1)
select @iTeller = @iTeller + 1
end

if @lSom % 11 = 0
begin
--modulo is 0, dus dit is een geldig bankrekeningnummer
select @iResultaat = 1
end
else
begin
--modulo is niet 0, dit is dus geen geldig bankrekeningnummer
select @iResultaat = 0
end
end
else if len(rtrim(@tTest)) = 10
begin
--dit rekeningnummer heeft 10 cijfers en is dus een spaar bankrekening
select @iResultaat = -1
end
else if len(rtrim(@tTest)) < 9
begin
--dit rekeningnummer heeft minder dan 9 cijfers en is dus een giro nummer
select @iResultaat = 2
end

return @iResultaat
end

Rate

You rated this post out of 5. Change rating

Share

Share

Rate

You rated this post out of 5. Change rating