記録データのデータ構造の説明

(COBOL式、DTD式、グラフィック表現式)

私が設計したこの伝票綴.XMLのデータ形式を説明します。
 まず、古典的にCOBOLのデータ部のように表現すれば、

伝票綴のデータ構造のCOBOL式の表現


FD    伝票綴.
DATA RECORD IS 伝票.
01    伝票.
    02    前付.
        03    伝票番号                 PIC 9(3).
        03    日付                     PIC X(10).
        03    稟議フラグ                 PIC X(1).
    02    明細.
        03    借方                 OCCURS 3.
            04     勘定科目コード        PIC 9(4).
            04     勘定科目             PIC X(30).
            04     金額                 PIC 9(12).
            04     摘要                 PIC X(100).
            04     相手先部.
                05     相手先フラグ    PIC X(1).
                05     相手先コード    PIC 9(3).
                05     相手先             PIC X(50).
            04     商品部             OCCURS 3.
                05     商品フラグ        PIC X(1).
                05     商品コード        PIC X(8).
                05     商品             PIC X(50).
                05     単価             PIC 9(12).
                05     数量             PIC 9(5).
                05     金額             PIC 9(12).
        03    貸方     OCCURS 3.
            04     勘定科目コード        PIC 9(4).
            04     勘定科目             PIC X(30).
            04     金額                 PIC 9(12).
            04     摘要                 PIC X(100).
            04     相手先部.
                05     相手先フラグ    PIC X(1).
                05     相手先コード    PIC 9(3).
                05     相手先             PIC X(50).
            04     商品部             OCCURS 3.
                05     商品フラグ        PIC X(1).
                05     商品コード        PIC X(8).
                05     商品             PIC X(50).
                05     単価             PIC 9(12).
                05     数量             PIC 9(5).
                05     金額             PIC 9(12).
    02    後付.
        03    FILLER                     PIC X(10).

 以上のようになります。
 一応、勘定の諸口の回数と商品の種類は3回以内とみなして、記述していますが、XMLの場合は、<借方>〜</借方> や <貸方>〜</貸方> や <商品部>〜</商品部> のように囲んでおけば、要素がないときは省略してもよいし、いくつもあるときには何回分でも並べることができます。
 だから、逆にCOBOLの場合は、OCCURS句の回数指定を増やせば対応ができます。ただし、ネットワークの先の別の利用者が元の「OCCURS 3」のままで読み取ろうとすれば、レコードが正しく読みとれないエラーが発生するでしょう。この点で、COBOLのような固定長レコードは融通が利かないことが指摘できます。

 次に伝票綴.XMLのデータ構造をグラフィック表現で表記してみます。
 なお、独特の記号として、?は1回あるかないか、+は1回以上ある、*は0回以上あることを示します。また、->は下の要素が左から順番通りに出てくることの指定です。そして、何も記号をつけていない要素は必ず1回ということを意味します。

伝票綴.XMLのデータ構造のグラフィック表現

dpstrcht.gif (10708 バイト)


 以上がグラフィック表現です。COBOLの表記が各フィールド名を下の行に書き加えていくのに対して、XMLのグラフィック表現は、各要素を横に並べて、線で結んで階層構造を表現します。
 そして、この各要素の親子関係を考慮しながら、データの抽出や整列や集計をしていきます。

 そして、第3番目にXML文書の文書型定義DTD(Document Type Definition)の記述を挙げます。XML文書はタグの入れ子に矛盾がなければ、このDTDがなくても使えますが、一応、COBOLの記述と対比してみると興味深いと思います。

伝票綴.XMLのDTD


<!DOCTYPE 伝票綴>
<!ELEMENT 伝票綴 (伝票*)>
<!ELEMENT 伝票 (前付,明細,後付?)>
<!ELEMENT 前付 (伝票番号,日付,稟議フラグ?)>
<!ELEMENT 伝票番号 (#PCDATA)>
<!ELEMENT 日付 (#PCDATA)>
<!ELEMENT 稟議フラグ (#PCDATA)>
<!ELEMENT 明細 (借方+,貸方+)>
<!ELEMENT 借方 (勘定科目コード?,勘定科目,金額,摘要,相手先部?,商品部*)>
<!ELEMENT 勘定科目コード (#PCDATA)>
<!ELEMENT 勘定科目 (#PCDATA)>
<!ELEMENT 金額 (#PCDATA)>
<!ELEMENT 摘要 (#PCDATA)>
<!ELEMENT 相手先部 (相手先フラグ?,相手先コード?,相手先)>
<!ELEMENT 相手先フラグ (#PCDATA)>
<!ELEMENT 相手先コード (#PCDATA)>
<!ELEMENT 相手先 (#PCDATA)>
<!ELEMENT 商品部 (商品フラグ?,商品コード?,商品,単価,数量,金額)>
<!ELEMENT 商品フラグ (#PCDATA)>
<!ELEMENT 商品コード (#PCDATA)>
<!ELEMENT 商品 (#PCDATA)>
<!ELEMENT 単価 (#PCDATA)>
<!ELEMENT 数量 (#PCDATA)>
<!ELEMENT 金額 (#PCDATA)>
<!ELEMENT 貸方 (勘定科目コード?,勘定科目,金額,摘要,相手先部?,商品部*)>
<!ELEMENT 後付 EMPTY>
<!-- 後付部分が発生したら追加する。 <!ELEMENT 後付 (#PCDATA)> -->
<ATTLIST 伝票 伝票区分 (仕訳伝票|振替伝票|入金伝票|出金伝票|仕入伝票|売上伝票|受取手形伝票|支払手形伝票) #IMPLIED>
<ATTLIST 貸方 諸口勘定科目数 CDATA #IMPLIED>
<!-- 借方も貸方も仕訳単子として扱う使用の場合に追加する。 <ATTLIST 仕訳単子 貸借区分 (借方|貸方) #REQUIRED> -->

 以上です。このDTDの終わり4行分の属性指定は、いずれ伝票の形式を5伝票制に対応するように変形できるようにするために追加しています。
 また、借方と貸方の形式が同一ということは、仕訳単子という集合要素を決めて、その属性に借方か貸方を示す貸借区分を付加すれば、もっと簡潔になるはずです。
 また、手形処理の要素は省略していますので、より汎用性を持たせるには、手形処理用の要素を組み込んだ方がよいでしょう。ただ、別に実用化するあてはないのですが。

 

伝票綴.XMLの表記例

 これにより、具体的に取引の記録をXML形式で表記すると、下のような例になります。紫色の部分が伝票綴XMLで決めたタグです。HTMLに似て見えるでしょう。また、緑色の部分が個々のデータで、任意の値が入ります。はさむもののないタグを取り除いても、うまく働きます。
 これは、「バーゲン本舗へ単価\150,0000のノートパソコン2台を当座預金振込で売上げた」という取引を表現しています。
 XMLファイルのソースコードを表示してもらえば分かりますが、すべてのXMLファイルの内容は同じです。ただ、第2行目で指定しているスタイルシートを換えることで、編集方法の違う表記をします。データそのものにすでに集計表の足掛かりが用意されているのです。
 試しにブラウザ上のURL表記の拡張子を(*.XML) から (*.XSL)に打ち換えてスタイルシートを表記してみれば、集計表示するために各項目の階層構造を厳密に表記しながら集計関数や整列の指定をしていることを見ることができます。


 <!--
9/16 当座預金 300,000 / 売 上 300,000 -->
<伝票>
    <前付>
        <伝票番号>
6</伝票番号>
        <日付>
2002/09/16</日付>
        <稟議フラグ></稟議フラグ>
    </前付>

    <明細>
        <借方>
            <勘定科目コード>
2</勘定科目コード>
            <勘定科目>
当座預金</勘定科目>
            <金額>
300000</金額>
            <摘要>
バーゲン本舗へ販売したノートパソコン2台の代金</摘要>
            <相手先部>
                <相手先フラグ>
1</相手先フラグ>
                <相手先コード>
1</相手先コード>
                <相手先>
開運銀行</相手先>
            </相手先部>
            <商品部>
                <商品フラグ></商品フラグ>
                <商品コード></商品コード>
                <商品></商品>
                <単価></単価>
                <数量></数量>
                <金額></金額>
            </商品部>
        </借方>

        <貸方>
            <勘定科目コード>
13</勘定科目コード>
            <勘定科目>
売上</勘定科目>
            <金額>
300000</金額>
            <摘要>
大和電業へノートパソコン2台を当座預金振込で売上げ</摘要>
            <相手先部>
                <相手先フラグ>
1</相手先フラグ>
                <相手先コード>
4</相手先コード>
                <相手先>
バーゲン本舗</相手先>
            </相手先部>
            <商品部>
                <商品フラグ>
1</商品フラグ>
                <商品コード>
1</商品コード>
                <商品>
ノートパソコン</商品>
                <単価>
150000</単価>
                <数量>
2</数量>
                <金額>
300000</金額>
            </商品部>
        </貸方>
    </明細>

    <後付>
    </後付>
</伝票>

 

 構想としては、伝票XML自動編集Webページを開発するつもりです。仕訳伝票風のWebページの各フィールドに入力すれば、伝票の下の枠に入力したとおりの1件分の伝票XMLが自動的に編集されて表示されるWebページです。JavaScriptを組み込めば、フロッピーディスクからでもブラウザに呼び出せて使えるでしょう。