2010年12月9日木曜日

ファイルメーカーでチェックデジットを計算する。

お仕事でとあるチェックデジットを生成する必要があったので作ってみた。

DBの
Tank No テキスト10文字
Check Digit Total 計算式
Check Digit 計算式

チェックデジットの計算は2段階に分けて実施
Check Digit Totalで合計をだしてそれを基にCheck Digitを生成する。

Check Digit TotalとCheck Digitは計算式

Check Digit Totalの計算式 これはちょっと長いですよ
--
(Case ( Left(Tank No;1) = "A" ; 10 ;
Left(Tank No;1) = "B" ; 12 ;
Left(Tank No;1) = "C" ; 13 ;
Left(Tank No;1) = "D" ; 14 ;
Left(Tank No;1) = "E" ; 15 ;
Left(Tank No;1) = "F" ; 16 ;
Left(Tank No;1) = "G" ; 17 ;
Left(Tank No;1) = "H" ; 18 ;
Left(Tank No;1) = "I" ; 19 ;
Left(Tank No;1) = "J" ; 20 ;
Left(Tank No;1) = "K" ; 21 ;
Left(Tank No;1) = "L" ; 23 ;
Left(Tank No;1) = "M" ; 24 ;
Left(Tank No;1) = "N" ; 25 ;
Left(Tank No;1) = "O" ; 26 ;
Left(Tank No;1) = "P" ; 27 ;
Left(Tank No;1) = "Q" ; 28 ;
Left(Tank No;1) = "R" ; 29 ;
Left(Tank No;1) = "S" ; 30 ;
Left(Tank No;1) = "T" ; 31 ;
Left(Tank No;1) = "U" ; 32 ;
Left(Tank No;1) = "V" ; 34 ;
Left(Tank No;1) = "W" ; 35 ;
Left(Tank No;1) = "X" ; 36 ;
Left(Tank No;1) = "Y" ; 37 ;
Left(Tank No;1) = "Z" ; 38)
+
Case ( Left(Right(Tank No; 9); 1) = "A" ; 10*2 ;
Left(Right(Tank No; 9); 1) = "B" ; 12*2 ;
Left(Right(Tank No; 9); 1) = "C" ; 13*2 ;
Left(Right(Tank No; 9); 1) = "D" ; 14*2 ;
Left(Right(Tank No; 9); 1) = "E" ; 15*2 ;
Left(Right(Tank No; 9); 1) = "F" ; 16*2 ;
Left(Right(Tank No; 9); 1) = "G" ; 17*2 ;
Left(Right(Tank No; 9); 1) = "H" ; 18*2 ;
Left(Right(Tank No; 9); 1) = "I" ; 19*2 ;
Left(Right(Tank No; 9); 1) = "J" ; 20*2 ;
Left(Right(Tank No; 9); 1) = "K" ; 21*2 ;
Left(Right(Tank No; 9); 1) = "L" ; 23*2 ;
Left(Right(Tank No; 9); 1) = "M" ; 24*2 ;
Left(Right(Tank No; 9); 1) = "N" ; 25*2 ;
Left(Right(Tank No; 9); 1) = "O" ; 26*2 ;
Left(Right(Tank No; 9); 1) = "P" ; 27*2 ;
Left(Right(Tank No; 9); 1) = "Q" ; 28*2 ;
Left(Right(Tank No; 9); 1) = "R" ; 29*2 ;
Left(Right(Tank No; 9); 1) = "S" ; 30*2 ;
Left(Right(Tank No; 9); 1) = "T" ; 31*2 ;
Left(Right(Tank No; 9); 1) = "U" ; 32*2 ;
Left(Right(Tank No; 9); 1) = "V" ; 34*2 ;
Left(Right(Tank No; 9); 1) = "W" ; 35*2 ;
Left(Right(Tank No; 9); 1) = "X" ; 36*2 ;
Left(Right(Tank No; 9); 1) = "Y" ; 37*2 ;
Left(Right(Tank No; 9); 1) = "Z" ; 38*2)
+
Case ( Left(Right(Tank No; 8); 1) = "A" ; 10*4 ;
Left(Right(Tank No; 8); 1) = "B" ; 12*4 ;
Left(Right(Tank No; 8); 1) = "C" ; 13*4 ;
Left(Right(Tank No; 8); 1) = "D" ; 14*4 ;
Left(Right(Tank No; 8); 1) = "E" ; 15*4 ;
Left(Right(Tank No; 8); 1) = "F" ; 16*4 ;
Left(Right(Tank No; 8); 1) = "G" ; 17*4 ;
Left(Right(Tank No; 8); 1) = "H" ; 18*4 ;
Left(Right(Tank No; 8); 1) = "I" ; 19*4 ;
Left(Right(Tank No; 8); 1) = "J" ; 20*4 ;
Left(Right(Tank No; 8); 1) = "K" ; 21*4 ;
Left(Right(Tank No; 8); 1) = "L" ; 23*4 ;
Left(Right(Tank No; 8); 1) = "M" ; 24*4 ;
Left(Right(Tank No; 8); 1) = "N" ; 25*4 ;
Left(Right(Tank No; 8); 1) = "O" ; 26*4 ;
Left(Right(Tank No; 8); 1) = "P" ; 27*4 ;
Left(Right(Tank No; 8); 1) = "Q" ; 28*4 ;
Left(Right(Tank No; 8); 1) = "R" ; 29*4 ;
Left(Right(Tank No; 8); 1) = "S" ; 30*4 ;
Left(Right(Tank No; 8); 1) = "T" ; 31*4 ;
Left(Right(Tank No; 8); 1) = "U" ; 32*4 ;
Left(Right(Tank No; 8); 1) = "V" ; 34*4 ;
Left(Right(Tank No; 8); 1) = "W" ; 35*4 ;
Left(Right(Tank No; 8); 1) = "X" ; 36*4 ;
Left(Right(Tank No; 8); 1) = "Y" ; 37*4 ;
Left(Right(Tank No; 8); 1) = "Z" ; 38*4)
+
Case ( Left(Right(Tank No; 7); 1) = "A" ; 10*8 ;
Left(Right(Tank No; 7); 1) = "B" ; 12*8 ;
Left(Right(Tank No; 7); 1) = "C" ; 13*8 ;
Left(Right(Tank No; 7); 1) = "D" ; 14*8 ;
Left(Right(Tank No; 7); 1) = "E" ; 15*8 ;
Left(Right(Tank No; 7); 1) = "F" ; 16*8 ;
Left(Right(Tank No; 7); 1) = "G" ; 17*8 ;
Left(Right(Tank No; 7); 1) = "H" ; 18*8 ;
Left(Right(Tank No; 7); 1) = "I" ; 19*8 ;
Left(Right(Tank No; 7); 1) = "J" ; 20*8 ;
Left(Right(Tank No; 7); 1) = "K" ; 21*8 ;
Left(Right(Tank No; 7); 1) = "L" ; 23*8 ;
Left(Right(Tank No; 7); 1) = "M" ; 24*8 ;
Left(Right(Tank No; 7); 1) = "N" ; 25*8 ;
Left(Right(Tank No; 7); 1) = "O" ; 26*8 ;
Left(Right(Tank No; 7); 1) = "P" ; 27*8 ;
Left(Right(Tank No; 7); 1) = "Q" ; 28*8 ;
Left(Right(Tank No; 7); 1) = "R" ; 29*8 ;
Left(Right(Tank No; 7); 1) = "S" ; 30*8 ;
Left(Right(Tank No; 7); 1) = "T" ; 31*8 ;
Left(Right(Tank No; 7); 1) = "U" ; 32*8 ;
Left(Right(Tank No; 7); 1) = "V" ; 34*8 ;
Left(Right(Tank No; 7); 1) = "W" ; 35*8 ;
Left(Right(Tank No; 7); 1) = "X" ; 36*8 ;
Left(Right(Tank No; 7); 1) = "Y" ; 37*8 ;
Left(Right(Tank No; 7); 1) = "Z" ; 38*8)
+
Case ( Left(Right(Tank No; 6); 1) = "1" ; 1*16 ;
Left(Right(Tank No; 6); 1) = "2" ; 2*16 ;
Left(Right(Tank No; 6); 1) = "3" ; 3*16 ;
Left(Right(Tank No; 6); 1) = "4" ; 4*16 ;
Left(Right(Tank No; 6); 1) = "5" ; 5*16 ;
Left(Right(Tank No; 6); 1) = "6" ; 6*16 ;
Left(Right(Tank No; 6); 1) = "7" ; 7*16 ;
Left(Right(Tank No; 6); 1) = "8" ; 8*16 ;
Left(Right(Tank No; 6); 1) = "9" ; 9*16 ;
Left(Right(Tank No; 6); 1) = "0" ; 0*16 )
+
Case ( Left(Right(Tank No; 5); 1) = "1" ; 1*32 ;
Left(Right(Tank No; 5); 1) = "2" ; 2*32 ;
Left(Right(Tank No; 5); 1) = "3" ; 3*32 ;
Left(Right(Tank No; 5); 1) = "4" ; 4*32 ;
Left(Right(Tank No; 5); 1) = "5" ; 5*32 ;
Left(Right(Tank No; 5); 1) = "6" ; 6*32 ;
Left(Right(Tank No; 5); 1) = "7" ; 7*32 ;
Left(Right(Tank No; 5); 1) = "8" ; 8*32 ;
Left(Right(Tank No; 5); 1) = "9" ; 9*32 ;
Left(Right(Tank No; 5); 1) = "0" ; 0*32 )
+
Case ( Left(Right(Tank No; 4); 1) = "1" ; 1*64 ;
Left(Right(Tank No; 4); 1) = "2" ; 2*64 ;
Left(Right(Tank No; 4); 1) = "3" ; 3*64 ;
Left(Right(Tank No; 4); 1) = "4" ; 4*64 ;
Left(Right(Tank No; 4); 1) = "5" ; 5*64 ;
Left(Right(Tank No; 4); 1) = "6" ; 6*64 ;
Left(Right(Tank No; 4); 1) = "7" ; 7*64 ;
Left(Right(Tank No; 4); 1) = "8" ; 8*64 ;
Left(Right(Tank No; 4); 1) = "9" ; 9*64 ;
Left(Right(Tank No; 4); 1) = "0" ; 0*64 )
+
Case ( Left(Right(Tank No; 3); 1) = "1" ; 1*128 ;
Left(Right(Tank No; 3); 1) = "2" ; 2*128 ;
Left(Right(Tank No; 3); 1) = "3" ; 3*128 ;
Left(Right(Tank No; 3); 1) = "4" ; 4*128 ;
Left(Right(Tank No; 3); 1) = "5" ; 5*128 ;
Left(Right(Tank No; 3); 1) = "6" ; 6*128 ;
Left(Right(Tank No; 3); 1) = "7" ; 7*128 ;
Left(Right(Tank No; 3); 1) = "8" ; 8*128 ;
Left(Right(Tank No; 3); 1) = "9" ; 9*128 ;
Left(Right(Tank No; 3); 1) = "0" ; 0*128 )
+
Case ( Left(Right(Tank No; 2); 1) = "1" ; 1*256 ;
Left(Right(Tank No; 2); 1) = "2" ; 2*256 ;
Left(Right(Tank No; 2); 1) = "3" ; 3*256 ;
Left(Right(Tank No; 2); 1) = "4" ; 4*256 ;
Left(Right(Tank No; 2); 1) = "5" ; 5*256 ;
Left(Right(Tank No; 2); 1) = "6" ; 6*256 ;
Left(Right(Tank No; 2); 1) = "7" ; 7*256 ;
Left(Right(Tank No; 2); 1) = "8" ; 8*256 ;
Left(Right(Tank No; 2); 1) = "9" ; 9*256 ;
Left(Right(Tank No; 2); 1) = "0" ; 0*256 )
+
Case ( Left(Right(Tank No; 1); 1) = "1" ; 1*512 ;
Left(Right(Tank No; 1); 1) = "2" ; 2*512 ;
Left(Right(Tank No; 1); 1) = "3" ; 3*512 ;
Left(Right(Tank No; 1); 1) = "4" ; 4*512 ;
Left(Right(Tank No; 1); 1) = "5" ; 5*512 ;
Left(Right(Tank No; 1); 1) = "6" ; 6*512 ;
Left(Right(Tank No; 1); 1) = "7" ; 7*512 ;
Left(Right(Tank No; 1); 1) = "8" ; 8*512 ;
Left(Right(Tank No; 1); 1) = "9" ; 9*512 ;
Left(Right(Tank No; 1); 1) = "0" ; 0*512 ))
--
Check Digitの計算式
--
(Check Digit Total/11 - Int(Check Digit Total/11)) * 11
--

もっと簡単な方法ありそうなんだけどね。