【 大感謝セール】 ★送料無料★新品 B´z 『IN THE LIFE』 アナログ盤 LP★

【 大感謝セール】 ★送料無料★新品 B´z 『IN THE LIFE』 アナログ盤 LP★

THE MAKING (100)レコードができるまで

PDF テクニック 使い方

続きを読む

帳票はヘッダー、明細そしてフッターで構成されています。ヘッダーやフッターは各帳票で一度しか出力しないので簡単ですが、明細行は次のような機能が必要でしょう。

  1. 明細データから指定した行数分のデータを取り出す
  2. 明細データを指定した行数ごとに分割する

この記事では帳票を作る際に必要な配列操作について解説します。

★送料無料★新品 B´z 『IN THE LIFE』 アナログ盤 LP★

初任給2カ月分!!50年前のDENONレコードプレイヤー分解&修理方法 DP-6000【故障】

今回利用するデータは次のような内容であることとします。

{
    "items": [
        {"name": "商品1", "price": 100, "unit": 10},
        {"name": "商品2", "price": 200, "unit": 20},
        {"name": "商品3", "price": 300, "unit": 30},
        {"name": "商品4", "price": 400, "unit": 40},
        {"name": "商品5", "price": 500, "unit": 50},
        {"name": "商品6", "price": 600, "unit": 60},
        {"name": "商品7", "price": 700, "unit": 70},
        {"name": "商品8", "price": 800, "unit": 80},
        {"name": "商品9", "price": 900, "unit": 90},
        {"name": "商品10", "price": 1000, "unit": 100},
        {"name": "商品11", "price": 1100, "unit": 110},
        {"name": "商品12", "price": 1200, "unit": 120},
        {"name": "商品13", "price": 1300, "unit": 130},
        {"name": "商品14", "price": 1400, "unit": 140}
    ]
}

この items キーが明細データになります。

レコードプレーヤーが大人気2015年04月19 日

今回のデータは明細が14件ありますので、1ページ4明細の場合は次のような帳票になります。

  • 全4ページ
  • 4ページ目が2件

こうした帳票を作る場合は、まず items キーの内容を次のように分割すれば良さそうです。

[
    [
            {"name": "商品1", "price": 100, "unit": 10},
            {"name": "商品2", "price": 200, "unit": 20},
            {"name": "商品3", "price": 300, "unit": 30},
            {"name": "商品4", "price": 400, "unit": 40}
    ],
    [
            {"name": "商品5", "price": 500, "unit": 50},
            {"name": "商品6", "price": 600, "unit": 60},
            {"name": "商品7", "price": 700, "unit": 70},
            {"name": "商品8", "price": 800, "unit": 80}
    ],
    [
            {"name": "商品9", "price": 900, "unit": 90},
            {"name": "商品10", "price": 1000, "unit": 100},
            {"name": "商品11", "price": 1100, "unit": 110},
            {"name": "商品12", "price": 1200, "unit": 120}
    ],
    [
            {"name": "商品13", "price": 1300, "unit": 130},
            {"name": "商品14", "price": 1400, "unit": 140}
    ]
]

このようにデータを分割するメソッドが chunk です。次のように実行します。

#set($pages = $ROOT.items.chunk(4))

この chunk メソッドは指定したデータ件数(今回は4)ごとにデータを分割して、配列にします。つまり $pages の内容は次のようになります。

[
    [
            {"name": "商品1", "price": 100, "unit": 10},
            {"name": "商品2", "price": 200, "unit": 20},
            {"name": "商品3", "price": 300, "unit": 30},
            {"name": "商品4", "price": 400, "unit": 40}
    ],
    [
            {"name": "商品5", "price": 500, "unit": 50},
            {"name": "商品6", "price": 600, "unit": 60},
            {"name": "商品7", "price": 700, "unit": 70},
            {"name": "商品8", "price": 800, "unit": 80}
    ],
    [
            {"name": "商品9", "price": 900, "unit": 90},
            {"name": "商品10", "price": 1000, "unit": 100},
            {"name": "商品11", "price": 1100, "unit": 110},
            {"name": "商品12", "price": 1200, "unit": 120}
    ],
    [
            {"name": "商品13", "price": 1300, "unit": 130},
            {"name": "商品14", "price": 1400, "unit": 140}
    ]
]

後はこの pages ごとにループ処理をすれば、ページごとの明細を出力できます。

#for ($page in $pages)  ## ページ単位のループ
  #for ($item in $page) ## 明細ごとのループ
    #end
#end

オマケ ザブングル LPレコード 初版ポスター付き

次は1ページ目を4件、2ページ目以降は6件の場合は、次のような帳票になります。明細データは先ほどと同じく14件とします。

  • 全3ページ
  • 1ページ目は4件、2ページ目は6件、3ページ目は4件

【入門】レコードのある生活のはじめかた PART.2_レコードプレーヤーの選び方

まず items キーの中から4件のデータを取得します。この時には take を使います。

#set($firstPage = $ROOT.items.take(4))

この時、$firstPage は次のような内容になっています。

[
        {"name": "商品1", "price": 100, "unit": 10},
        {"name": "商品2", "price": 200, "unit": 20},
        {"name": "商品3", "price": 300, "unit": 30},
        {"name": "商品4", "price": 400, "unit": 40}
]

1ページ目のテンプレートを作り、そのまま出力を行います。

究極の解説!レコードは買うなよ!デジタル?アナログ?わかっているのか?サブスクでいいじゃん!音が聴ければ!!レコード愛?何処に?宝物であるレコード?わからん???

次に2ページ目以降、データを6件ずつに分割します。この時に使うのが drop です。 drop は指定した数字(今回は4)分、データをスキップします。そして残りのデータについて chunk で6件ずつに分割します。

#set($pages = $ROOT.items.drop(4).chunk(6))

この時の $pages の内容は次のようになります。

[
    [
            {"name": "商品5", "price": 500, "unit": 50},
            {"name": "商品6", "price": 600, "unit": 60},
            {"name": "商品7", "price": 700, "unit": 70},
            {"name": "商品8", "price": 800, "unit": 80},
            {"name": "商品9", "price": 900, "unit": 90},
            {"name": "商品10", "price": 1000, "unit": 100},
 ],
    [
            {"name": "商品11", "price": 1100, "unit": 110},
            {"name": "商品12", "price": 1200, "unit": 120},
            {"name": "商品13", "price": 1300, "unit": 130},
            {"name": "商品14", "price": 1400, "unit": 140}
    ]

2ページ目以降のテンプレートを作り、出力します。

【オーディオテクニカ レコードプレーヤー】アナログのすすめ。昭和レトロ漂うBluetooth対応レコードプレーヤーをご紹介(audeio-technica/AT-LP60XBT)

帳票において、最後のページだけ出力内容が異なるケースは良くあります。たとえば集計行の出力です。ループ処理の中で最後のページかどうか判別する際には $foreach.last を使います。

#for ($page in $pages)  ## ページ単位のループ
  #for ($item in $page) ## 明細ごとのループ
    #end
  #if ($foreach.last) ## 最後のページの場合
      ## 集計行の表示など
    #end
#end

$foreach.last を含め、次のようなデータがあります。

データ 意味
$foreach.first 真偽値 ループの先頭ならtrue
$foreach.last 真偽値 ループの最後ならtrue
$foreach.count 数値 ループの回数(1..)
$foreach.index 数値 ループのインデックス(0..)

firstNum は最初のページの明細件数、 num は2ページ目以降の明細件数です。

  • 最初のページ
    #set($page = $e.items.take(firstNum))
  • 2ページ目以降のページ(最後のページを除く)
    #set($pages = $e.items.drop(firstNum).chunk(num).slice(0, -1))
  • 最後のページ 帳票の上の部分に掲載される情報。全ページまたは最初のページだけに表示される。
  • フッター 購入した商品情報など、帳票の中で動的に繰り返される情報。帳票によって数が異なる。

今回はDocurainにおける明細行の集計方法をいくつかのパターンに分けて紹介します。

レコードの日SP「アナログ・トーク」2022《「レコード新時代?CD超え…「レコードの日」アナログ盤を聴きながら3人でたっぷり音楽談義…曲作りの秘密?弾き語りも!》曽我部恵一 オカモトコウキ 寺尾紗穂

今回は分かりやすくするためにヘッダー、フッターに数字以外の情報は載せていません。

f:id:moongift:20211222184153p:plain

RADWIMPS 君の名は。完全受注生産限定 アナログレコード盤紹介‼

データは次のようなJSONです。明細ごとに単価、数量が記載されています。項目数は可変です。

{
  "items" :  [
    {
      "note":  "商品1",
      "unit": 100,
      "amount": 5
    },
    {
      "note":  "商品2",
      "unit": 500,
      "amount": 3
    },
    {
      "note":  "商品3",
      "unit": 1500,
      "amount": 10
    },
  ]
}

アナログLPをいい音で楽しむ

f:id:moongift:20211222183350p:plain

帳票が必ず1ページの場合 #EASY_SHIFT_FORMULA を指定するのが最も簡単です。A1セルで次のように記述します。

#EASY_SHIFT_FORMULA
#set($e = $ROOT) ## 変数用

#EASY_SHIFT_FORMULA を記述しておけば、数式の簡易自動シフトモードになり、自動で計算範囲を調整してくれるようになります。そして、明細部分を次のように記述します。

A B C D E
10 詳細 単価 数量 金額
11 #foreach($line in $e.items)
12 ${line.note} ${line.unit} ${line.amount} =D12*E12
13 #end

さらにフッター部分の集計では次のように記述します。10%はExcelのパーセント表示を使っていますので、実際には0.1になります。

A B C
14 小計 =SUM(E12:E12)
15 税率 10%
16 集計 =C14 + C14*F15

この状態で帳票を作成すると、明細部分では行ごとにD12(またはE)がD13やD14に自動的にシフトします。これが簡易自動シフトモードです。フッターについても =SUM(F12:F12)=SUM(F10:F12) へ自動的に変更されます(明細が3つの場合)。もちろん、最後の計算についても =F13+F13*F14 となり、正しい計算結果が得られます。

f:id:moongift:20211222183650p:plain

アナログレコード盤 2014年末 棚卸 その1 右2列2番目

B'zのアナログ・レコードが発売したぞ!!!!

スコープはまず #scope("全て")#end の形で定義します。"全て"

昭和歌謡のアナログ・レコード洗浄 / Washing a vinyl record

では帳票を作ってみましょう。今回は1ページあたり10明細とします。そこでデータを10明細ごとに分割します。

#set($e = $ROOT)
#set($pages = $e.items.chunk(10))

例えば items が5行分のデータを持っていたとして、chunk(3) と指定すると、 $pages は次のようなデータになります。

[
    {
        items: [
        {"note":  "商品1", "unit": 100, "amount": 5},
        {"note":  "商品2", "unit": 200, "amount": 3},
        {"note":  "商品3", "unit": 300, "amount": 1}
        ]
    },
    {
        items: [
        {"note":  "商品4", "unit": 400, "amount": 5},
        {"note":  "商品5", "unit": 500, "amount": 3}
        ]
    }
]

そして、この $pages を繰り返し処理しますが、この時、全体に対してscopeを定義します。

#scope("全て")
  #foreach($page in $pages)
      : 省略
    #end
#end

そして、明細行を記述します。単ページの場合は $e.items でしたが、今度は $pages ごとに処理します。

A B C D E
14 詳細 単価 数量 金額
15 #foreach($line in $page)
16 ${line.note} ${line.unit} ${line.amount} =D16*E16
17 #end

フッター行では DR.SHIFT_FORMULA を使います。これはDocurain独自の仕組みで、スコープに合わせた計算式のシフトを行うための記述です。この時のスコープとして、先ほど定義した名前を指定します。

A B C
18 小計 =DR.SHIFT_FORMULA(SUM(E16),"scope=全て, target=all")
19 税率 10%
20 集計 =C19+C19*C20

targetall または nearest を指定します。 nearest はスコープ内の最近傍範囲になります。デフォルトは nearest です。

f:id:moongift:20211222183821p:plain

B'z ''SICK'' LP

明細は単ページの時と同じく計算されます。そして、フッターでは次のように変換が行われます(一例です)。

=SUM(F10:F19,F28:F33)

f:id:moongift:20211222183849p:plain

ページごとの計算対象範囲を自動的に判別し、SUM関数に複数の範囲を指定してくれます。これによって正しい集計結果が得られます。

【オーディオテクニカ レコードプレーヤー】全世界累計約100万台を販売した大人気シリーズの最新作!無線接続\u0026USBでデータ保存可能!(audeio-technica/AT LP120XBT USB)

帳票全体の集計もありつつ、ページ単位でも小計を出したい場合はスコープを複数定義します。スコープ名はページごとにユニークなものになっていなければならないので、#scope("ページ-$foreach.count") のように変数を使って定義します。

A B C D E
13 詳細 単価 数量 金額
14 #scope("ページ-$foreach.count")
15 #foreach($line in $page)
16 ${line.note} ${line.unit} ${line.amount} =D16*E16
17 #end
18 #end

そしてページ計を下に記述します。この時もスコープの範囲について、変数を用いて指定します。

A B C
19 ページ計 =DR.SHIFT_FORMULA(SUM(E16),"scope=ページ-$foreach.count, target=all")

このようにスコープを2つ使うことで、ページ内での集計と帳票全体での集計を同時に行えます。

f:id:moongift:20211222183943p:plain

ももすけ様専用 本物 ドルチェ&ガッバーナ 花柄 レース切替 キャミワンピース"> 【美品!】Naturehike Spider1 ソロテント">

Docurainでは帳票を生成する際にK18WG✨チラチラ揺れる♡天然ダイヤ スタッドピアス✨total0.60ct">

引用をストックしました

引用するにはまずログインしてください

引用をストックできませんでした。再度お試しください

限定公開記事のため引用できません。

ヴィヴィアン・ウエストウッド バッグ デニム(値下げ交渉可)">