見出し画像

FileMakerで13桁のISBNコードを10桁に変換する。

今回は、Filemaker関数を使って現行13桁の書籍ISBNコードを10桁に変換する方法についての記事です。

10桁は旧仕様

そもそも、現在流通している書籍についてるISBNコードは原則13桁で、10桁コードの古いものも、機械的に13桁に計算できて、ほとんどのデータベースで利用できます。今更10桁を引っ張り出してくる理由はほとんどありません。10桁を利用する唯一の理由があるとすれば、AmazonのURLです。

AmazonのURL

Amazonのサイト内で、書籍の商品ページのURLを見てみると、いろんな情報が盛り込まれた、長いURLが表示されています。しかし、単純にページを表示させるためであれば、シンプルなURLで表示することができます。

https://wwww.amazon.co.jp/dp/[10桁ISBN]

これだけです。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関数で取り出すことができます。

Middle
目的

テキストの先頭文字位置で指定された文字から、文字数で指定された文字数分のテキストを抽出します。
構文
Middle ( テキスト ; 先頭文字位置 ; 文字数 )
引数
テキスト - 任意のテキスト式またはテキストフィールド
先頭文字位置 - 任意の数値式、または数値を含むフィールド
文字数 - 任意の数値式、または数値を含むフィールド

FileMakerヘルプ 関数リファレンス

実際の計算式はこうなります。

ISBN10の上9桁 = Middle( ISBN ; 4 ; 9 )

10桁目はチェックデジット

10桁目は確認用のチェックデジットで、13桁コードと計算方法は異なりますがその前の9桁から計算して求めます。言葉で説明すると次のようになります。

旧規格のISBN (ISBN-10) のチェックディジットは、「モジュラス11 ウェイト10-2」という計算法にて算出される。(チェックディジットを除いた左側の桁から10、9、8…2を掛けてそれらの和を取る。和を11で割って出た余りを11から引く)
なお、計算結果が10になった場合は”X”、11になった場合は0となる。

wikipedia

条件分岐の式

1桁ずつ数字を掛けてみたくなるところですが、単純かつ長い数式になるのでこの部分は後回しにします。まず、計算結果(上記説明の「和を11で割って出た余りを11から引く」)による分岐を計算式にします。Case関数を使います。

Case
目的
一連の条件を元に可能な結果の 1 つを返します。
構文
Case ( 条件1 ; 結果1 { ; 条件2 ; 結果2 ; ... ; デフォルト値} )
引数
条件 - テキストまたは数値
結果 - 式に対応する結果
中カッコ { } 内の引数はオプションです。

FileMakerヘルプ 関数リファレンス

ここでつくる計算式は、計算結果を"n"とすると、
n=10 ならば "X"
n=11 ならば "0"
n=それ以外ならば "n"
となります。If関数でも入れ子構造にすることで同様の処理はできますが、分岐条件が3つ以上になる場合はCaseを使うと一つの関数で処理できます。Case関数部分は次のようになります。

Case ( [n=10] ; "X" ; [n=11] ; "0" ; n) 

11で割った余りを11から引く式

前の計算式で登場した、"n"にあたる部分を求める計算式を作っていきます。使う機会はあまりなさそうですが、ある数で割った余りを返す関数というのがあります。

Mod
目的
除数で数値を割った後の余りを返します。
構文
Mod ( 数値 ; 除数 )
引数
数値 - 任意の数式または数式を含むフィールド
除数 - 任意の数値式、または数値式を含むフィールド

FileMakerヘルプ 関数リファレンス

左側の桁から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桁ずつ取得して、順にそれぞれの数字を掛けていきます。次のようになります。

N=
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

少し長いですが、取り出す桁と掛ける数を変えて繰り返しているだけです。

代入して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リンクを追加したデータを置いておきます。

ここから先は

0字
この記事のみ ¥ 100
期間限定 PayPay支払いすると抽選でお得に!

この記事が気に入ったらサポートをしてみませんか?