Kazuhiro Yoshida
ThinReports 再び 9 April 2014!
at Hamamatsu.rb #38
振り返り
思えば2年前...
!
前回は少し投げやり感があった...
※投げやり感があった
 労基署の監査でやりたくない仕事の後始末に追われていた
今回は寝ても覚めてもコーディング
❖ 明確な目的
❖ 現実逃避
❖ たのしいRuby!
前回は
「帳票出力」
!
ThinReports + Ruby on Rails
今回は
「帳票出力」
!
ThinReports + sinatra
なぜRailsじゃないのか?
❖ 勝手にファイルが作られる
❖ ルール?規則?つーか俺がルール!
❖ PerlでCGI.pmで作ってた頃がたのしかった♪
で、 sinatra いいんじゃない!
開発の流れ
1. 現状の作業をエクセルにて可能なかぎり
自動化
2. それをRubyでコーディングしてコンソー
ルアプリにする
3. さらにそれをsinatraでWEBアプリにする
目標:作業時間の短縮
15分 を 15秒に
開発イメージ
受注オーダーファイル
.xls
帳票作成プログラム
pdicard.rb
thinreports
sinatra
require 'spreadsheet'!
require 'sequel'!
require 'thinreports'
コントローラー
pdicard_controller.rb
テンプレート
upload.haml
%html!
%body!
%h1 PDi Card Generate!
%form(method="post" enctype='multipart/form-data') !
%input(type='file' name='myfile') !
%br!
%input(type='submit' value='Upload!')
require 'rubygems'!
require 'sinatra'!
require 'haml'!
require 'pp'!
require './pdicard'!
require 'tempfile'!
require 'sinatra/reloader'
.pdf
ファイルアップロード画面とコード
%html!
%body!
%h1 PDi Card Generate!
%form(method="post"
enctype='multipart/form-data') !
%input(type='file' name='myfile') !
%br!
%input(type='submit' value='Upload!')
#!/usr/bin/ruby!
# encoding:utf-8!
require 'spreadsheet'!
require 'sequel'!
require 'thinreports'!
require 'pp'!
!
class ItemTB!
DB = Sequel.sqlite!
DB.create_table :items do!
primary_key :id!
String :item_no!
String :item_name!
String :code_of_customer!
String :line_code_of_production!
end!
DataSet = DB[:items] # Create a dataset!
!
book = Spreadsheet.open("品目マスター.xls")!
sheet = book.worksheet(0)!
ThinReportエディターとコード
report = ThinReports::Report.create do |r|!
r.use_layout 'inspections.tlf', :default => true!
r.start_new_page #:layout => 'inspections.tlf'!
until (label_data.empty?) do!
read_as_col(label_data, 2) do |data_row_array|!
r.page.list(:list).add_row do |row|!
# Set details!
data_row_array.each_with_index do |col_array, _index|!
row.item(Symbol_table[_index][0]).value(col_array[:item_no
row.item(Symbol_table[_index][1]).value(col_array[:date_del
row.item(Symbol_table[_index][2]).value(col_array[:time_de
row.item(Symbol_table[_index][3]).value(col_array[:quantity
row.item(Symbol_table[_index][4]).value(col_array[:quantity
row.item(Symbol_table[_index][5]).value(col_array[:inspectio
row.item(Symbol_table[_index][6]).value(col_array[:line_cod
row.item(Symbol_table[_index][7]).value(col_array[:line_nam
row.item(Symbol_table[_index][8]).value(col_array[:code_of_
row.item(Symbol_table[_index][9]).value(col_array[:order_no
end!
end!
end!
end!
!
r.use_layout 'inspections_list.tlf', :id => :list_all!
r.start_new_page :layout => :list_all!
orders.DB.fetch("select * from orders where line_code_of_produc
or line_code_of_production is null", '42%') do |data_row|!
r.page.list(:list).add_row do |row|!
row.item(:item_no).value(data_row[:item_no])!
row.item(:date_delivery).value(data_row[:date_delivery])!
row.item(:time_delivery).value(data_row[:time_delivery])!
出力帳票とコード
r.use_layout 'inspections_list.tlf', :id => :list_all!
r.start_new_page :layout => :list_all!
orders.DB.fetch("select * from orders where line_code_of_productio
or line_code_of_production is null", '42%') do |data_row|!
r.page.list(:list).add_row do |row|!
row.item(:item_no).value(data_row[:item_no])!
row.item(:date_delivery).value(data_row[:date_delivery])!
row.item(:time_delivery).value(data_row[:time_delivery])!
row.item(:quantity_of_order).value(data_row[:quantity_of_order
row.item(:quantity_of_order_sum).value(data_row[:quantity_of_
row.item(:inspection_as_standard).value(data_row[:inspection_a
row.item(:line_code_of_customer_delivery).value(data_row[:line
row.item(:line_name_of_customer_delivery).value(data_row[:lin
#row.item(:code_of_customer).value(data_row[:code_of_custom
row.item(:order_no).value(data_row[:order_no])!
end!
end!
end!
report.generate!
report = ThinReports::Report.create do |r|!
r.use_layout 'inspections.tlf', :default => true!
r.start_new_page #:layout => 'inspections.tlf'!
until (label_data.empty?) do!
read_as_col(label_data, 2) do |data_row_array|!
r.page.list(:list).add_row do |row|!
# Set details!
data_row_array.each_with_index do |col_array, _index|!
row.item(Symbol_table[_index][0]).value(col_array[:item_no])
row.item(Symbol_table[_index][1]).value(col_array[:date_deliv
row.item(Symbol_table[_index][2]).value(col_array[:time_deliv
結果
受注オーダー
ファイル
.xls
.pdf
「現状」
.doc
差し込み印刷
.xls
差し込みデータ
作成
「改善後」
受注オーダー
ファイル
.xls 帳票作成
プログラム
PDFファイル
出力
目標作業時間
15分 -> 15秒
達成
課題
1. PDFをインラインで表示したい(今はダ
ウンロードさせている)
2. ドキュメントが少ないので問題解決に時
間がかかる
3. 基本的にたのしすぎて家族と会話が少な
くなる
“Rubyで世界を変える!”
今後もRubyで寝食を忘れて
作業改善に取り組んでいく!
その後…
1. PDFをインラインで表示したい
headers["Content-Type"] = "application/pdf"!
headers["Content-Disposition"] = "inline;filename=pdicard.pdf"
解決!!

Thin reports再び