Thinreportsとは

ThinReportsPDF 形式の帳票生成を Ruby によって実現するシンプルで新しいソリューションです。

ThinReports が提供する専用レイアウトエディタ ThinReports Editor と 専用ライブラリ ThinReports Generator によって、

Ruby や Ruby on Rails のような Ruby製のフレームワークを使った帳票開発の負担を軽減 - thin - することを目指します

> More details

公式サイト より

リンク

サンプル

複数のレイアウトを用いて一綴りで出力するテンプレート

ruby MakeReport.rb

Pager.rb

 # thinreports をロードする。
 require 'rubygems'    # Ruby1.9+の場合は不要
 require 'thinreports'
 require 'date'
 
 # ページ番号管理クラス
 class Pager
   # 初期化
   # Param report ThinReports::Report のインスタンス
   def initialize(report)
     
     # ページ番号
     @page_no = 0
     # 最大ページ番号
     @page_nos = 0
     
     # ThinReports::Report のインスタンス
     @report = report
     
     # ページ作成時のイベントハンドラー
     @report.events.on :page_create do |e|
       e.page.item(:pg).value(@page_no + 1)
       @page_nos = @page_no
       @page_no += 1
     end
     
     # PDF 作成時のイベントハンドラー
     @report.events.on :generate do |e|
       e.pages.each do |page|
         page.item(:tpg).value(@page_nos + 1)
       end
     end
   end
   
   # 外部から変数読み込みの許可
   attr_accessor :page_no
 end

Nouhin.rb

 # thinreports をロードする。
 require 'rubygems'    # Ruby1.9+の場合は不要
 require 'thinreports'
 require 'date'
 
 # 納品書
 class Nouhin
   #初期化
   #Param report ThinReports::Report のインスタンス
   def initialize(report)
     
     # ThinReports::Report のインスタンス
     @report = report;
     
     # ダミーテンプレートファイル読み込み
     # 存在していればなんでもOK
     # テンプレートの選択にはIDで管理するが
     # 初期設定で以下のように読み込まないとエラーを吐く
     # 例外処理しているのは二重に同じファイルを読み込むとエラーでクラッシュするため
     begin
       @report.use_layout('nouhin.tlf');
     rescue
     end
     
     # レイアウト設定
     # こちらで実際に使用するテンプレートを指定
     # ただし、「:id」はユニークすること!
     @report.use_layout('nouhin.tlf', :id => :nouhin) do |config|
       # 合計金額の処理
       config.list(:list) do
         use_stores :total_money => 0
         
         events.on :footer_insert do |e|
           e.section.item(:total).value(e.store.total_money)
           #e.section.item(:tax).value(e.store.total_money * 0.05)
         end
       end
     end
   end
   
   # 納品書作成
   def execReport(header_data, hikae_flag)
     
     # 控え設定
     if hikae_flag == 1
       @hikae = '(控)'
     else
       @hikae = ''
     end
     
     # 新しいページを追加する。
     page = @report.start_new_page :layout => :nouhin
     
     # ヘッダー設定
     set_header(page, header_data)
     
     # 明細行番号初期化
     detail_no = 0
     
     # 明細を印刷する。
     header_data[:detail].each do |data|
       
       # 明細リスト
       detail_list = page.list(:list)
       
       # 明細行設定
       detail_list.add_row do |row|
         set_detail(row, detail_no + 1, data)
       end 
       
       # 合計金額計算
       detail_list.store.total_money += data[:const] * data[:item_price]
       
       # 明細行番号をカウント
       detail_no += 1
     end
   end
   
   # ヘッダー設定
   # Param page ThinReports::Core::Page オブジェクト
   # Param data ヘッダーデータ
   def set_header(page, data)
     page.values(
       :hikae         =>  @hikae,               # (控)
       :recv_id       =>  data[:recv_id],       # No
       :print_dt      =>  data[:print_dt],      # 納品日
       :eigyosyo_addr1=>  data[:eigyosyo_addr1],# 営業所住所
       :eigyosyo_addr2=>  data[:eigyosyo_addr2],# 営業所住所
       :kaisya_nm     =>  data[:kaisya_nm],     # 会社名
       :eigyosyo      =>  data[:eigyosyo],      # 営業所名
       :syozoku       =>  data[:syozoku],       # 所属
       :syain_nm      =>  data[:syain_nm],      # 社員名
       :tel           =>  data[:tel],           # Tel
       :fax           =>  data[:fax],           # Fax
       
       # 納品先
       :zip      => data[:zip],                 # 郵便番号
       :cust_nm1 => data[:cust_nm1],            # 納品先名1
       :cust_nm2 => data[:cust_nm2],            # 納品先名2
       :addr1    => data[:addr1],               # 納品先住所1
       :addr2    => data[:addr2]                # 納品先住所2
     )
   end
   
   # 明細
   # Param line ThinReports::Core::Shape::List::SectionInterface オブジェクト
   # Param num  行番号
   # Param data 明細データ
   def set_detail(line, num, data)
     line.values(
       :num        => num,                              # 行番号
       :item_nm    => data[:item_nm],                   # 商品名
       :const      => data[:const],                     # 数量
       :item_price => data[:item_price],                # 単価
       :money      => data[:const] * data[:item_price], # 金額
       :memo       => data[:memo]                       # 備考
     )
   end
 end

MakeReport?.rb

 # thinreports をロードする。
 require 'rubygems'    # Ruby1.9+の場合は不要
 require 'thinreports'
 
 # ファイル読み込み
 require './Pager.rb'
 require './Nouhin.rb'
 require './Sample.rb'
 
 # 帳票作成
 report = ThinReports::Report.new
 
 pager = Pager.new(report)
 nouhin = Nouhin.new(report)
 sample = Sample.new(report)
 
 header_data = []
 
 header_data << {
   :recv_id       => '注文番号',               # 注文番号
   :print_dt      => '2012-06-18',             # 納品日
   :kaisya_nm     => '株式会社バタ工房',       # 会社名
   :eigyosyo_addr1=> '営業所住所1 : 県市町村', # 営業所住所1 : 県市町村
   :eigyosyo_addr2=> '営業所住所2 : 番地以降', # 営業所住所2 : 番地以降
   :eigyosyo      => '営業所名',               # 営業所名
   :syozoku       => '部署名',                 # 部署
   :syain_nm      => 'バタコ',                 # 社員名
   :tel           => '0000-00-0000',           # 電話番号
   :fax           => '0000-00-0000',           # ファックス
   :biko          => '備考',                   # 備考
   
   # 納品先
   :zip           => '000-0000',               # 郵便番号
   :cust_nm1      => '納品先名1',              # 納品先名1
   :cust_nm2      => '納品先名2',              # 納品先名2
   :addr1         => '納品先住所1 : 県市町村', # 納品先住所1
   :addr2         => '納品先住所2 : 番地以降', # 納品先住所2
   
   # 商品明細
   :detail => []
 }
 
 20.times{
   header_data[0][:detail] << {
     :item_nm => "Dummy",
     :const => 10,
     :item_price => 100,
     :memo => "ダミー"
   }
 }
 
 header_data.each do |data|
   # お客様用
   nouhin.execReport(data, 0)
   # ページ番号初期化
   pager.page_no = 0;
   # 控え用
   nouhin.execReport(data, 1)
 end
 
 header_data = []
 header_data = {
   :no            =>  '番号',       # 番号
   :created_d     =>  Date::today,  # 日付
   :customer      =>  '顧客',       # 顧客名
   :title         =>  '件名',       # 件名
   :price         =>  100000000000, # 卸見積価格
   :tax           =>  1000000000,   # 消費税
   :total_price   =>  100000000000, # 卸見積金額合計
   :note          =>  '備考',       # 備考
   # 商品明細
   :detail => []
 }
 17.times{
   header_data[:detail] << {
     :title  => 'Dummy',
     :amount => 10,
     :unit_price => 100,
     :note       => 'ダミー'
   }
 }
 # ページ番号初期化
 pager.page_no = 0;
 sample.execReport(header_data)
 
 # ファイル名
 REPORT_NAME="estimate"
 
 # PDF生成
 report.generate_file("#{REPORT_NAME}.pdf")
 puts 'Done!'
 
 # PDFを開く
 system("start cmd /c #{REPORT_NAME}.pdf")

添付ファイル: filenouhin.tlf 125件 [詳細] filesample.tlf 121件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-01-16 (土) 18:03:29 (435d)