Thursday, May 14, 2009

Ruby, Sinatra y SAP


Estoy seguro de que ya se habrán dado cuenta de que amo los Lenguajes Script. Eso signigica que cada cierto tiempo, me encanta jugar con nuesvos lenguajes o algún Framework web nuevo. Esta vez me tocó jugar con Sinatra, un framework muy impresionante.

Debo decir que la documentación es bastante pobre...aún cuando un libro de Sinatra está en proceso.

He dicho muchas veces que voy a aprender Rail, pero de alguna manera...cada vez que empiezo lo dejo a los pocos días...por qué? Seguramente por Sinatra y Camping que son mucho más sencillos de aprender y aportan basicamente las mismas funcionalidades que Rails.

Pero estoy seguro que ninguno de ustedes quiere conocer mi vida privada de programación...Así que vayamos al código...


require 'rubygems'
require 'sinatra'
gem 'saprfc'
require "SAP/Rfc"

get '/' do
body do
<<-eos
<h1>Ruby/Sinatra and SAP - SE16 Emulation</h1>
<form action='/login' method='post'>
<label for='host'>Host</label><br />
<input type='text' name='host' /><br />
<label for='sysnr'>System Number</label><br/>
<input type='text' name='sysnr' /><br />
<label for='client'>Client</label><br />
<input type='text' name='client' /><br />
<label for='user'>User</label><br />
<input type='text' name='user' /><br />
<label for='password'>Password</label><br />
<input type='password' name='password' /><br />
<input type='submit' name='submit' value='Login' />
</form>
eos
end
end

get '/login_view' do
body do
<<-eos
<form action='/table_view' method='post'>
<label for='table'>Table:</label><br />
<input type='text' name='table' /><br />
<input type='submit' name='submit' value='Show Table' />
</form>
eos
end
end

get '/show_table' do
$output = "<table border='1'><tr>"
for i in 0...$Fields_Len
$Fields_Fields = $Data_Names[i].to_s
$output += "<th> #{$Fields_Fields} </th>"
end
$output += "</tr>"
for i in 0...$Data_Len
$output += "<tr>"
$Data_Fields = $Data[i]
$Data_Split = $Data_Fields.split("|")
for i in 0...$Fields_Len
$output += "<td> #{$Data_Split[i].to_s.strip} </td>"
end
$output += "</tr>"
end
$output += "</table>"
body $output
end

post '/login' do
$host,$sysnr,$client,$user,$password = params[:host],params[:sysnr],
params[:client],params[:user],
params[:password]
"#{do_login}"

redirect '/login_view'
end

post '/table_view' do
$table = params[:table]

"#{get_table}"

redirect '/show_table'
end

helpers do
def do_login
$rfc = SAP::Rfc.new(:ashost => $host,
:sysnr => $sysnr.to_i,
:lang => "EN",
:client => $client.to_i,
:user => $user,
:passwd => $password,
:trace => 1)
end

def get_table
$itab = $rfc.discover("RFC_READ_TABLE")

$itab.query_table.value = $table
$itab.delimiter.value = "|"

$rfc.call($itab)

$Fields = Array.new
$Data = Array.new
$Data_Fields = Array.new
$Data_Split = Array.new
$Data_Names = Array.new

$itab.fields.hashRows {|field| $Fields.push(field) }
$Fields_Len = $Fields.length
$itab.data.hashRows {|field| $Data.push(field['WA'].to_s.strip!) }
$Data_Len = $Data.length
$itab.fields.hashRows {|field| $Data_Names.push
(field['FIELDNAME'].to_s.strip)}
end
end

Ahora, algunas imagenes...




Saludos,

Blag.

1 comment:

Don Xmar said...

Hola,
ahora empiezo yo a darle a Sinatra, desde una experiencia 0,01 en Ruby.
Soy básicamente un programador Java... así que post como éste me vienen muy bien.
Un saludo, y a seguir tan contento como en la foto! :)