FileMakerで13桁のISBNコードを10桁に変換する。
今回は、Filemaker関数を使って現行13桁の書籍ISBNコードを10桁に変換する方法についての記事です。
10桁は旧仕様
そもそも、現在流通している書籍についてるISBNコードは原則13桁で、10桁コードの古いものも、機械的に13桁に計算できて、ほとんどのデータベースで利用できます。今更10桁を引っ張り出してくる理由はほとんどありません。10桁を利用する唯一の理由があるとすれば、AmazonのURLです。
AmazonのURL
Amazonのサイト内で、書籍の商品ページのURLを見てみると、いろんな情報が盛り込まれた、長いURLが表示されています。しかし、単純にページを表示させるためであれば、シンプルなURLで表示することができます。
これだけです。10桁ISBNさえわかれば機械的にリンクを生成することができます。試しにこの連載で使わせてもらっている「バカの壁」のリンクを貼ってみます。10桁のISBNコードは"4106100037"です。
https://www.amazon.co.jp/dp/4106100037
10桁のうち、9桁はそのまま
今回行うのは、前回行った10桁を13桁にするのとは逆に、13桁を10桁にします。ここでは、[ISBN]フィールドに13桁コードが格納されていて、10桁に変換したコードを[ISBN10]フィールドに格納することにします。
1桁目から9桁目までは13桁コードの冒頭3桁を除いた4桁目から12桁目ですので、Middle関数で取り出すことができます。
実際の計算式はこうなります。
10桁目はチェックデジット
10桁目は確認用のチェックデジットで、13桁コードと計算方法は異なりますがその前の9桁から計算して求めます。言葉で説明すると次のようになります。
条件分岐の式
1桁ずつ数字を掛けてみたくなるところですが、単純かつ長い数式になるのでこの部分は後回しにします。まず、計算結果(上記説明の「和を11で割って出た余りを11から引く」)による分岐を計算式にします。Case関数を使います。
ここでつくる計算式は、計算結果を"n"とすると、
n=10 ならば "X"
n=11 ならば "0"
n=それ以外ならば "n"
となります。If関数でも入れ子構造にすることで同様の処理はできますが、分岐条件が3つ以上になる場合はCaseを使うと一つの関数で処理できます。Case関数部分は次のようになります。
Case ( [n=10] ; "X" ; [n=11] ; "0" ; n)
11で割った余りを11から引く式
前の計算式で登場した、"n"にあたる部分を求める計算式を作っていきます。使う機会はあまりなさそうですが、ある数で割った余りを返す関数というのがあります。
左側の桁から10、9、8…2を掛けた和を"N"として、Mod関数に入れると、以下のようになります。
n= 11 - Mod( N ; 11)
左側の桁から10、9、8…2を掛けてそれらの和を取る式
次にNの部分です。10桁コードの左側の桁から順に掛けていきますが、元となるデータは13桁で格納されています。なので、10をかける数字は13桁コードの4桁目、9を描けるのは5桁目・・・となります。Middle関数で1桁ずつ取得して、順にそれぞれの数字を掛けていきます。次のようになります。
少し長いですが、取り出す桁と掛ける数を変えて繰り返しているだけです。
代入して10桁目をつくる計算式にする
これを前段で作った関数に代入していきます。まずは11で割った余りを11から引くnの部分
n = 11 - Mod ( Middle( ISBN ; 4 ; 1 )*10+Middle( ISBN ; 5 ; 1 )*9+Middle( ISBN ; 6 ; 1 )*8+Middle( ISBN ; 7 ; 1 )*7+Middle( ISBN ; 8 ; 1 )*6+Middle( ISBN ; 9 ; 1 )*5+Middle( ISBN ; 10 ; 1 )*4 +Middle( ISBN ; 11 ; 1 )*3+Middle( ISBN ; 12 ; 1 )*2 ; 11 )
これをさらに、条件分岐のCase関数に代入します。太字で示した3箇所です。
Case ( n=10 ; "X" ; n=11 ; "0" ; n)
実際の式は次のようになります。代入した部分を太字にしています。
Case ( 11 - Mod ( Middle( ISBN ; 4 ; 1 )*10+Middle( ISBN ; 5 ; 1 )*9+Middle( ISBN ; 6 ; 1 )*8+Middle( ISBN ; 7 ; 1 )*7+Middle( ISBN ; 8 ; 1 )*6+Middle( ISBN ; 9 ; 1 )*5+Middle( ISBN ; 10 ; 1 )*4 +Middle( ISBN ; 11 ; 1 )*3+Middle( ISBN ; 12 ; 1 )*2 ; 11 )=10 ; "X" ; 11 - Mod ( Middle( ISBN ; 4 ; 1 )*10+Middle( ISBN ; 5 ; 1 )*9+Middle( ISBN ; 6 ; 1 )*8+Middle( ISBN ; 7 ; 1 )*7+Middle( ISBN ; 8 ; 1 )*6+Middle( ISBN ; 9 ; 1 )*5+Middle( ISBN ; 10 ; 1 )*4 +Middle( ISBN ; 11 ; 1 )*3+Middle( ISBN ; 12 ; 1 )*2 ; 11 )=11 ; "0" ; 11 - Mod ( Middle( ISBN ; 4 ; 1 )*10+Middle( ISBN ; 5 ; 1 )*9+Middle( ISBN ; 6 ; 1 )*8+Middle( ISBN ; 7 ; 1 )*7+Middle( ISBN ; 8 ; 1 )*6+Middle( ISBN ; 9 ; 1 )*5+Middle( ISBN ; 10 ; 1 )*4 +Middle( ISBN ; 11 ; 1 )*3+Middle( ISBN ; 12 ; 1 )*2 ; 11 ))
これで10桁目を出すことができました。
冒頭の9桁の後ろに繋げて10桁コードを完成
複雑な計算式を作ったので忘れてしまいそうですが、計算で出したのは10桁目だけで、その前の9桁の数字に繋げて完成です。前項の9桁を取り出す計算式に付加するだけ、"&"の演算子で可能です。
ISBN10=
Middle( ISBN ; 4 ; 9 ) & Case ( 11 - Mod ( Middle( ISBN ; 4 ; 1 )*10+Middle( ISBN ; 5 ; 1 )*9+Middle( ISBN ; 6 ; 1 )*8+Middle( ISBN ; 7 ; 1 )*7+Middle( ISBN ; 8 ; 1 )*6+Middle( ISBN ; 9 ; 1 )*5+Middle( ISBN ; 10 ; 1 )*4 +Middle( ISBN ; 11 ; 1 )*3+Middle( ISBN ; 12 ; 1 )*2 ; 11 )=10 ; "X" ; 11 - Mod ( Middle( ISBN ; 4 ; 1 )*10+Middle( ISBN ; 5 ; 1 )*9+Middle( ISBN ; 6 ; 1 )*8+Middle( ISBN ; 7 ; 1 )*7+Middle( ISBN ; 8 ; 1 )*6+Middle( ISBN ; 9 ; 1 )*5+Middle( ISBN ; 10 ; 1 )*4 +Middle( ISBN ; 11 ; 1 )*3+Middle( ISBN ; 12 ; 1 )*2 ; 11 )=11 ; "0" ; 11 - Mod ( Middle( ISBN ; 4 ; 1 )*10+Middle( ISBN ; 5 ; 1 )*9+Middle( ISBN ; 6 ; 1 )*8+Middle( ISBN ; 7 ; 1 )*7+Middle( ISBN ; 8 ; 1 )*6+Middle( ISBN ; 9 ; 1 )*5+Middle( ISBN ; 10 ; 1 )*4 +Middle( ISBN ; 11 ; 1 )*3+Middle( ISBN ; 12 ; 1 )*2 ; 11 ))
これで、10桁コードを作ることができました。Amazonリンクを生成することができます。
おまけ:リンクは何が良いのか
とはいえ、アプリ内での外部ソースへのリンクとしては、閲覧履歴などが無く、よりシンプルに表示されるという点では版元ドットコム、他の項目を取得するのに使っていて、データの整合性の点で国立国会図書館サーチが向いているように思います。Amazonは本以外のものも見ていて、その閲覧履歴が影響したり、他のものがおすすめされるので、特に表示領域が小さいデバイスには向かないかなと思います。
今回はここまでです。この下の有料部分に今回検証に使用した10桁への変換式とAmazonリンクを追加したデータを置いておきます。
この記事が気に入ったらサポートをしてみませんか?