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

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

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

2018.09.20 [ クロロフィル通信 | システム備忘録 ]

システムエンジニア備忘録

はじめまして。
情報システム管理室でシステムエンジニアとして働いております。筒井です。
プログラム開発、ネットワーク、サーバー運用、クライアントPC管理など全般に関わっています。

すべて独学で、50歳のなんちゃってSEですが、主にデスクトップアプリケーション開発についての自身が学んだこと、経験したこと、解決したことなどを、これからブログに記したいと思います。
少しでも皆様のお役に立つことが出来ましたら幸いです。
どうぞよろしくお願いします。

弊社システム環境について
当社の受発注(基幹)システムは自社開発で、それ以外の会計・人事などはパッケージを導入しています。

現在の基幹システムはホストコンピュータをメインとした環境でMSSQL、COBOL、Visual Basic6.0で開発しています。
基幹システムがレガシーでありBCPMの視点からもハイリスクのため、2016年からC#言語を習得しながら、システムの移行を徐々に行っております。

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