ブログ「クロロフィル通信」

2018.09.26 [ クロロフィル通信 | オフィスだより ]

T-SQL チェックディジットの計算方法関数の実装

今回は伝票番号の入力ミス対策としてCOBOLで実装しているモジュラス11ウエイト2~7をSQL側にも関数として作成をしました。
モジュラス11ウエイト2~7は、数値の下の桁から2~7の係数を掛けて、7の次はまた2~7を掛けます。
以下は数値 123456789 のチェックディジットを算出する例です。

数値
 1 
 2 
 3 
4
5
6
7
8
9

係数
4
3
2
7
6
5
4
3
2

数値×係数
4
6
6
28
30 30
28 24 18
合計は 4 + 6 + 6 + 28 + 30 + 30 + 28 + 24 + 18 = 174
余りは 174 ÷ 11 = 15 MOD 9 ※ 余りが [0] または [1] の場合は [0] です
チェックディジットは 11 - 9 =  2 になります。

これをSQL関数で作成しました。

CREATE FUNCTION [dbo].[func_modulus11weight2_7]
(
    @value int
)
RETURNS smallint
AS
BEGIN
    declare @number nvarchar(20);
    -- 引数の数値は可変なのでREVERSE関数で反転させます。
    set @number = reverse(@value);

    declare @i integer = 1;
    declare @v integer;
    declare @digit integer = 0;
    declare @weight integer = 2;

    --
    -- 数値の各桁に、下の桁から2~7の係数を掛ける。7の次はまた2~7を掛ける。
    --
    while @i <= len(@number)
    begin
        set @v = substring(@number,@i,1);
        set @digit = @digit + (@v * @weight);
        if @weight = 7
            set @weight = 2;
        else
            set @weight = @weight + 1;

        set @i = @i + 1;
    end

    --
    -- 余りを 11 から引いたものがチェックデジットです。
    -- ただし余りが [0] または [1] の場合はチェックデジットも [0] にします。
    --
    if @digit % 11 = 0 or @digit % 11 = 1
        set @digit = 0;
    else
        set @digit = 11 - (@digit % 11);
   
    RETURN @digit;
END


作成した関数を実行すると正常なチェックディジット算出結果を確認することができます。

558

記事 情報システム管理室 筒井

前の記事を見る

次の記事を見る

トラックバック

このページのトラックバックURL:
https://www.toyotane.co.jp/p/trackback/001315

コメント

この記事に対するコメントはまだありません。

コメントを投稿

コメントは記事の投稿者が承認するまで表示されません。

前の記事を見る

次の記事を見る