Friday, July 15, 2011

wxPython y SAP


Post original: Tasting the mix of Python and SAP - Volume 3

Hola y bienvenidos de vuelta a este pequeño y divertido rincon de Lenguajes Script -:)

Hoy dia, vamos a ver como podemos utilizar wxPython y SAP para hacer una emulacion de la SE16.

Asi que, que es wxPython? Es un wrapper en Python del wxWidgets de C++ que nos ayuda a crear aplicaciones GUI enriquecidas.

Para este blog estuve tentado a utilizar Tkinter pero debo admitir que me gusta mas el wxPython...puesto que ya lo he utlizado antes para mis proyectos en Ruby. Bueno, en Ruby era un poco mas facil que en Python -:P

Basta de hablar, vamos al codigo fuente...(Eso se veria bien en un polo, no?)

Nuevamente, y como siempre en mis proyectos Python/SAP...utilice YAML para guardar los parametros de conexion a SAP.

sap.yml

ashost: localhost
sysnr: "00"
client: "001"
lang: EN
trace: 1
loglevel: warn

SE16_wxPython.py

import wx
import sapnwrfc
import wx.grid as wxGrid

conn = ""
table = ""


class MyApp(wx.App):

def OnInit(self):
self.frame = MyFrame(None, title="Login")
self.SetTopWindow(self.frame)
self.frame.Show()
return True


class MyFrame(wx.Frame):

def __init__(self, parent, id=wx.ID_ANY, title="",
pos=wx.DefaultPosition, size=(210, 150),
style=wx.DEFAULT_FRAME_STYLE,
name="MyFrame"):
super(MyFrame, self).__init__(parent, id, title, pos,
size, style, name)

self.panel = wx.Panel(self)
self.text_font = wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL)
self.t_user = wx.StaticText(self.panel, -1, "User",
size=(40, 20), pos=(10, 12))
self.t_password = wx.StaticText(self.panel, -1, "Password",
size=(40, 20), pos=(10, 32))
self.t_user.SetFont(self.text_font)
self.t_password.SetFont(self.text_font)
self.user = wx.TextCtrl(self.panel, value="", pos=(90, 10))
self.password = wx.TextCtrl(self.panel, value="",
pos=(90, 30),
style=wx.TE_PASSWORD)
self.btnConnect = wx.Button(self.panel, label="Connect",
pos=(70, 80))

self.Bind(wx.EVT_BUTTON, self.OnButtonConnect,
self.btnConnect)

def OnButtonConnect(self, event):
global conn
user = self.user.GetValue()
password = self.password.GetValue()
sapnwrfc.base.config_location = "sap.yml"
sapnwrfc.base.load_config()
conn = sapnwrfc.base.rfc_connect({'user': user,
'passwd': password})
self.Close()
myGrid = GridFrame(None, title="SE16 Emulator")
myGrid.Show()


class GridFrame(wx.Frame):

def __init__(self, parent, id=wx.ID_ANY, title="",
pos=wx.DefaultPosition, size=(600, 400),
style=wx.DEFAULT_FRAME_STYLE,
name="GridFrame"):
super(GridFrame, self).__init__(parent, id, title, pos,
size, style, name)

self.panel = wx.Panel(self)
self.text_font = wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL)
self.t_table = wx.StaticText(self.panel, -1, "Table",
size=(40, 20), pos=(180, 12))
self.t_table.SetFont(self.text_font)
self.table = wx.TextCtrl(self.panel, value="", pos=(225, 10))
self.btnShow = wx.Button(self.panel, label="Show Table",
pos=(330, 10))

self.Bind(wx.EVT_BUTTON, self.OnButtonShow, self.btnShow)

def OnButtonShow(self, event):
global conn
table = self.table.GetValue()
fields = []
fields_name = []
func_disc = conn.discover("RFC_READ_TABLE")
func = func_disc.create_function_call()
func.QUERY_TABLE(str(table))
func.DELIMITER("|")
func.invoke()
data_fields = func.DATA.value
data_names = func.FIELDS.value
long_fields = len(func.DATA())
long_names = len(func.FIELDS())

for line in range(0, long_fields):
fields.append(data_fields[line]["WA"].strip())
for line in range(0, long_names):
fields_name.append(data_names[line]["FIELDNAME"].strip())

self.grid = wxGrid.Grid(self.panel, pos=(0, 40),
size=(853, 320))
self.grid.EnableEditing(False)
self.grid.CreateGrid(long_fields, long_names)

for line in range(0, long_names):
field_name = fields_name[line]
self.grid.SetColLabelValue(line, field_name)
for line_f in range(0, long_fields):
data_split = fields[line_f].split("|")
for line_n in range(0, long_names):
self.grid.SetCellValue(line_f, line_n,
data_split[line_n])

def onClose(self, event):
global conn
conn.close()


if __name__ == "__main__":
app = MyApp(False)
app.MainLoop() 

Ahora, las imagenes:




Asi que, basicamente, lo que tenemos aca es una ventana de Logeo con el Nombre de Usuario y Password y un boton para conectarnos. Cuando nos conectamos a SAP, entonces la ventana desaparece y una nueva ventana aparece. Esta nueva ventana nos pide el nombre de la tabla y nos muestra un Grid conteniendo toda la informacion.

Nos vemos la proxima vez -;)

Blag.

No comments: