Saturday, May 23, 2009

Blag's Flex 3 compiler - Edición ejecutable


El año pasado, escribí un blog en el SCN titulado Blag's Flex 3 Compiler que era basicamente, una aplicación Ruby que usaba WxRuby para el GUI y Flex 3 SDK para compilar aplicaciones Flex y AIR.

Se preguntarán por qué vuelvo a postear luego de un largo año...fácil...finalmente pude crear una versión ejecutable.

Cuando desarrollé el compilador por primera vez, intenté hacer un archivo .EXE utilizando RubyScript2Exe y Exerb, que son excelentes scripts para compilar Ruby en archivos .EXE...pero los dos fallaron cuando utilizé WxRuby...

Hace unos cuantos días...encontré Ocra. Debo decirlo...Ocra es excelente! Is veloz, compila cualquie cosa y lo más importante...mantiene los archivos .EXE generados, relativamente pequeños...

Así que, acá está el link del compilador...y no se olviden del leer el archivo README (Solo está en Inglés...la verdad me da mucha flojera traducirlo) -;)


Saludos,

Blag.

Thursday, May 14, 2009

Shoes y SAP


Seguramente se estarán preguntando...Que es Shoes? Bueno...de acuerdo con why the lucky stiff es:

Shoes is a tiny graphics toolkit, designed for beginners. But make no mistake: this is real programming. You can make real, colorful apps in Shoes
(Shoes es un pequeño toolkit gráfico, diseñado para principiantes. Pero no se equivoquen: esto es verdadera programación. Puedes hacer aplicaciones reales y coloridas en Shoes)

Shoes viene como un archivo ejecutable que puede ser descargado de Download Shoes.

Para poder hacer la integración con SAP, deben bajar este archivo de la página de Piers Harding, descomprimirlo y copiar el contenido de la carpeta SAP dentro de la carpeta Lib de su instalación de Shoes.

Con eso, estamos listos para empezar.


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

class SE16 < Shoes
url '/', :index
url '/table', :table
url '/show', :show

def index
stack :margin => 10 do
para 'Host: '
@Host = edit_line :width => 100
end
stack :margin => 10 do
para 'System Number: '
@Sysnr = edit_line :width => 100
end
stack :margin => 10 do
para 'Client: '
@Client = edit_line :width => 100
end
stack :margin => 10 do
para 'User: '
@User = edit_line :width => 100
end
stack :margin => 10 do
para 'Password: '
@Password = edit_line :width => 100, :secret => true
end
stack :margin => 10 do
button('Login') do
$rfc = SAP::Rfc.new(:ashost => @Host.text,
:sysnr => @Sysnr.text,
:lang => "EN",
:client => @Client.text,
:user => @User.text,
:passwd => @Password.text,
:trace => 1)
visit "/table"
end
end
end

def table
stack :margin => 10 do
para 'Table: '
@Table = edit_line :width => 100
stack :margin => 10 do
button('Show') do
$Table = @Table.text
visit "/show"
end
end
end
end

def show
$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)}

para "Tabla: #{$Table}"

for i in 0...$Data_Len
stack :margin => 10 do
$Data_Fields = $Data[i]
$Data_Split = $Data_Fields.split("|")
flow :margin => 10 do
for i in 0...$Fields_Len
para "#{$Data_Split[i].to_s.strip} |"
end
end
end
end
end
end

Shoes.app :width => 600, :height => 450

Ahora, algunas imágenes...





Espero que les guste -:)

Saludos,

Blag.

Blue Ruby (Ruby en SAP)


Alguna vez han oido hablar de Blue Ruby? No? Bueno...dejando las cosas simples, Blue Ruby te permite programar con Ruby dentro del Stack de ABAP de SAP NetWeaver...es lo suficientemente bueno? Lo es para mi obviamente -:)

Los que me conocen...virtual o personalmente, saben que soy muy apasionado acerca de las tecnologías y sobre todo de los Lenguages Script.

Esta semana, gracias a Juergen Schmerder y el Team de Blue Ruby, tengo acceso temprano al IDE de Blue Ruby basado en WebGui.

Por supuesto, lo primero que hice fué logearme y tratar de hacer algunas pruebas...mayormente pruebas relacionadas al lenguage. Afortunadamente descubrí que casi todo lo que hacía en Ruby(Core Language) podía hacerlo en Blue Ruby.

Así que, lo siguiente que hice fué comenzar a trabajar en mi ejemplo de toda la visa...un emulador de SE16.

Fué relativamente sencillo porque he hecho muchos examplos de SE16 utilizando Ruby, Camping, WxRuby, Sinatra, PHP y PHP/Flex.

En fin...Aquí está el código. Solo para que lo sepan...hay una manera de hacer el código mucho más corto...algo de 6 líneas...pero decidí quedarme con el ejemplo largo por 3 simples razones.

1.- Quería probar las capacidades del lenguaje.

2.- Quería separar cada campo y mostrarlo de forma individual.

3.- Quería divertirme escribiendo más código -:P


#RFC Example by Blag.

require 'rfc'

$spfli = Rfc.new 'RFC_READ_TABLE'

$spfli.query_table = 'SPFLI'
$spfli.delimiter = '|'

$spfli.call!

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

$spfli.fields.each do |field|
$Fields.push(field.fieldname.to_s)
$Fields_Length.push(field.length.to_i)
end
$spfli.data.each do |field|
$Data.push(field.wa.to_s.strip!)
end

$Fields_Len = $Fields.length
$Data_Len = $Data.length

print "Table: SPFLI\n\n"

for i in 0...$Data_Len
$Data_Fields = $Data[i]
$Data_Split = $Data_Fields.split("|")
for i in 0...$Fields_Len
$space = ""
$len = ( $Fields_Length[i].to_i - $Data_Split[i].length ) + 1
$len.times do
$space += "\s"
end
print $Data_Split[i].to_s + "#{$space}"
end
print "\n"
end

Ahora, las imagenes...




Estoy seguro de que se van a sorprender con esto -:) Yo aún continúo impresionado -:D

Así que...si quieren aprender más, les dejo algunos enlaces muy útiles:

Blue Ruby: A Ruby VM in ABAP (PDF)
Blue Ruby - a Ruby VM in ABAP
Blue Ruby Demo Video Part 1: How to get started
Blue Ruby Demo Video Part 2: How to call ABAP functions
Introduction to Blue Ruby Replay

Saludos,

Blag.

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.