Disclaimer: This blog is based on my own personal experiences and it's not endorsed or supported by SAP. ODBC connection to SAP HANA is neither endorsed or supported by SAP, so it must be used under your own risk, no support will be provided.
As a Technology Evangelist, I'm always trying to generate new content to share with my fellow developers, so the other day I was doing some Node.JS learning and then, all of a sudden I remembered a programming language I used to use about 10 years ago...Euphoria...which is by the way called now OpenEuphoria as it went Open Source.
Why should anybody cared about Euphoria? Well...according to the site..."It's simpler than Basic and more powerful than C++"...I have use it again for this blog, and I gotta say, the haven't loose the magic...Euphoria is a lovely programming language with a huge library to choose from.
So...why do we need to start?
Download OpenEuphoria
Download ODBC Database Connectivity
Download wxEuphoria
For this blog, I tried to use my Windows 7, but the problem is that the ODBC connector doesn't work on 64bits, so I went to my Windows XP Virtual Machine and started the fun.
I created an ODBC connection to my Amazon Web Services called SAP_HANA and from there, it was just coding and fun.
To make things simple, I used the same approach I used for my blog SAP HANA and Python? Yes Sir! which is basically, connect to SAP HANA via ODBC, show a list of CARRIERS and CITY FROM's and the perform a query to gather and show data.
| Euphoria_HANA.exw |
|---|
include wxeud.e as wxeud
include odbc.e as odbc
include std/sequence.e as seq
global atom hconn, hstmt
global sequence dsn_var, user, auth, msg, carrier_key
global object data
carrier_key = {}
constant
main = create( wxFrame, {0, -1, "Euphoria and SAP HANA", -1, -1, 450, 300}),
win = create( wxPanel, main ),
ldsn = create( wxStaticText, {win, -1, "DSN:",120, 60}),
dsn = create( wxTextCtrl, {win, -1, "", 200, 55} ),
lusername = create( wxStaticText, {win, -1, "Username:",120, 90}),
username = create( wxTextCtrl, {win, -1, "", 200, 85} ),
lpassword = create( wxStaticText, {win, -1, "Password:",120, 120}),
password = create( wxTextCtrl, {win, -1, "", 200, 115, -1, -1, wxTE_PASSWORD} ),
connect = create( wxButton, {win, -1,"Connect", 200, 150})
constant
main2 = create( wxFrame, {0, -1, "Euphoria and SAP HANA", -1, -1, 450, 300}),
win2 = create( wxPanel, main2 ),
lcarrier = create( wxStaticText, {win2, -1, "Carrier:",120, 60}),
carrier = create( wxComboBox, {win2, -1, "", 200, 55, -1, -1, {}}),
lcityfrom = create( wxStaticText, {win2, -1, "City From:",120, 90}),
cityfrom = create( wxComboBox, {win2, -1, "", 200, 85, -1, -1, {}}),
show_query = create( wxButton, {win2, -1,"Show Query", 200, 120})
constant
main3 = create( wxFrame, {0, -1, "Euphoria and SAP HANA", -1, -1, 600, 600}),
win3 = create( wxPanel, main3 ),
goback = create( wxButton, {win3, -1,"Go Back", 260, 1}),
grid = create( wxGrid, {win3, -1, 1, 30, -1, -1, 1, 1, 6} )
function getConnected()
if initODBC() > 0 then
abort(0)
end if
dsn_var = get_text_value(dsn)
user = get_text_value(username)
auth = get_text_value(password)
hconn = openConnectionODBC( dsn_var, user, auth )
if not hconn then
message_box("Connection error","Error",wxOK)
return 0
elsif hconn > 0 then
msg = getErrorODBC( hconn )
message_box(msg[2],"Error",wxOK)
return 0
else
return 1
end if
end function
function getQuery(sequence sql)
hstmt = prepareSQL( hconn, sql )
data = executeSQL( hstmt )
if hstmt > 0 then
message_box("Query failed","Error",wxOK)
end if
if data > 0 then
message_box("No data found","Error",wxOK)
return 0
else
data = {getColumnHeaders( hstmt )} & odbc:getData( hstmt )
return data
end if
end function
function fillParameters(object data, atom pos, atom combo, atom key)
sequence value, seq
seq = {}
if sequence( data ) then
for i = 2 to length( data ) do
value = remove_all(0,data[i][pos])
seq = append(seq, value)
if key = 1 then
value = remove_all(0,data[i][1])
carrier_key = append(carrier_key, value)
end if
end for
wxeud:add_item(combo, seq)
end if
return 1
end function
function fillCombos()
sequence sql
sql = "SELECT CARRID,CARRNAME FROM SFLIGHT.SCARR WHERE MANDT = 300"
data = getQuery(sql)
fillParameters(data, 2, carrier, 1)
sql = "SELECT DISTINCT CITYFROM FROM SFLIGHT.SPFLI WHERE MANDT = 300"
data = getQuery(sql)
fillParameters(data, 1, cityfrom, 0)
return 1
end function
function initializeGrid()
set_col_label(grid,0,"Carrier")
set_col_label(grid,1,"Connection")
set_col_label(grid,2,"Flight Date")
set_col_label(grid,3,"Passenger Name")
set_col_label(grid,4,"City From")
set_col_label(grid,5,"City To")
atom carrier_sel, len, row, col
sequence sql, value
carrier_sel = get_selection(carrier) + 1
sql = "SELECT SBOOK.CARRID,SBOOK.CONNID,FLDATE, " &
"PASSNAME,CITYFROM,CITYTO" &
" FROM SFLIGHT.SBOOK INNER JOIN SFLIGHT.SPFLI" &
" ON SBOOK.CONNID = SPFLI.CONNID" &
" WHERE SBOOK.CARRID = '" & carrier_key[carrier_sel] & "'" &
" AND CITYFROM = '" & get_string_selection(cityfrom) & "'" &
" AND PASSNAME >< ''" &
" AND SBOOK.MANDT = 300" &
" AND year(FLDATE) = 2012" &
" ORDER BY FLDATE DESC"
data = getQuery(sql)
if sequence( data ) then
row = 0
len = length( data ) - 2
if len < 0 then
append_rows(grid,len)
for i = 2 to length( data ) do
col = 0
for j = 1 to 6 do
value = remove_all(0,data[i][j])
set_cell_value(grid,value,row,col)
col = col + 1
end for
row = row + 1
end for
end if
end if
set_grid_editable(grid,0)
autosize_grid(grid)
return 1
end function
procedure Click_connect(atom this, atom event_type, atom id, atom event )
atom ans
ans = getConnected()
if ans = 1 then
show_window(main,0)
fillCombos()
wxMain( main2 )
end if
end procedure
set_event_handler(connect, get_id(connect), wxEVT_COMMAND_BUTTON_CLICKED, routine_id( "Click_connect" ))
procedure Click_show_query(atom this, atom event_type, atom id, atom event )
show_window(main2,0)
initializeGrid()
wxMain( main3 )
end procedure
set_event_handler(show_query, get_id(show_query), wxEVT_COMMAND_BUTTON_CLICKED, routine_id( "Click_show_query" ))
procedure Click_goback(atom this, atom event_type, atom id, atom event )
show_window(main3,0)
clear_grid(grid)
delete_rows(grid,1,get_number_rows(grid),0)
show_window(main2,1)
end procedure
set_event_handler(goback, get_id(goback), wxEVT_COMMAND_BUTTON_CLICKED, routine_id( "Click_goback" ))
procedure main3_onClose( atom this, atom event_type, atom id, atom event )
destroy(main)
destroy(main2)
destroy(main3)
end procedure
set_event_handler( main3, get_id(main3), wxEVT_CLOSE_WINDOW, routine_id("main3_onClose") )
wxMain( main )
|
Like people use to say...pics or it didn't happened...
As you can see...SAP HANA is pretty flexible and easy to use...no matter the programming language, you will get extra speed and the sense that you're things the right way.
Greetings,
Blag.













