SAP MaxDB é um banco de dados estratégico criado para rodar em todas as soluções SAP e substituir os bancos de dados Oracle, IBM DB2 e MSSQL Server tornando as soluções SAP mais acessíveis em termos de custo para clientes de grande e médio porte. O SAP MaxDB foi construído como uma solução open source baseado em MySQL sob a licença GNU GPL, as versão anteriores do MaxDB ainda são mantidas pela comunidade open source mas a SAP não contribui mais com estas versões.
Ao longo dos últimos anos, a tecnologia SAP MaxDB continuou a evoluir com investimentos muito significativos em inovações e essas inovações não são em código aberto. Assim o mais recente produto SAP MaxDB não é open source, entretanto ele é gratuito em sua versão comunitária para uso com aplicações não SAP e possui licença comercial para uso com aplicações SAP.
Com 40 anos de inovação atuando em mais de 130 países e com mais de 100 mil clientes que utilizam soluções SAP, o SAP MaxDB ainda é um banco de dados jovem mas conta com mais de 6.500 clientes em 15.000 instalações mais soluções que utilizam liveCache e Content Server.
SAP MaxDB: http://maxdb.sap.com/
SAP MaxDB e Python
O Python é uma poderosa linguagem de scripts que já vem se destacando a algum tempo em aplicações para web e ambiente corporativos, a maior empresa de soluções corporativas não poderia deixar de integrar sua aplicações e utilizar os vários benéficos da linguagem de programação Python e da sua crescente comunidade de desenvolvedores.
A SAP disponibiliza módulos para utilizar o MaxDB com a linguagem de programação Python utilizando os sistemas operacionais Unix, Linux e Windows, possibilitando integrar soluções Enterprise SAP que utilizam o banco de dados MaxDB com aplicações escritas em Python ou permite que aplicações Python utilizem o SAP MaxDB gratuitamente também em soluções que não possuem o intuito de integrar dados com os sistemas SAP.
Wiki Python: Sap MaxDB
IMPORTANTE: Para utilizar este walkthrough completo integrando uma solução Python com a linguagem de programação ABAP, você precisa instalar vários software entres eles o NetWeaver Application Server ABAP no qual já possui uma instalação completa do ambiente de desenvolvimento SAP com uma instancia do banco de dados MaxDB, caso queira utilizar somente o lado Python você pode baixar o SAP MaxDB diretamente da SAP Store:
NetWeaver Application Server ABAP: Mini SAP
Download SAP MaxDB sistemas não SAP: SAP Store
SAP MaxDB SQL Studio: Desenvolvimento Aberto walkthrough
Módulos Python e Drivers ODBC
A instalação do SAP MaxDB incluída nos produtos SAP como o núcleo de desenvolvimento do sistema SAP R/3 chamado de NetWeaver Application Sever ABAP já comtempla módulos Python para que você possa acessar o banco de dados MaxDB porem a instalação suporta apenas a versão Python 2.3 e se encontra no seguinte local:
C:\sapdb\clients\NSP\lib\python2.3
C:\sapdb\NSP\db\doc\FirstSteps\Python
No entanto o banco de dados possui drivers ODBC para que você se conecte com qualquer versão do Python, você encontra detalhes sobre os módulos Python mais recentes e vários exemplos neste link:
MaxDB Python Modules: SAP Manual Python
Conectando ao MaxDB em instancia SAP com Python
1 – Caso utilize este tutorial com o NetWeaver primeiro tenha certeza que servidor de aplicação e a instancia SAP do banco de dados está rodando, caso utilize apenas o MaxDb e Python ignore este passo:
2 – Abra o SQL Studio utilizando o servidor MaxDB e o banco de dados NSP ou seu próprio banco de dados caso não utilize o sistema SAP:
3 – Crie uma tabela Z que significa uma tabela não SAP Standard que não será transparente no conceito do dicionário de dados do sistemas SAP para isto utilize o script logo abaixo, não se assuste para desenvolvedores não SAP isto é apenas uma tabela comum do banco de dados:
4 – Como estamos utilizando uma versão mais recente do Python utilizaremos os drivers ODBC do MaxDB. No painel de controle escolha ferramentas administrativas e fonte de dados ODBC de 64bit, em drivers verifique seu driver NSP:
5 – Crie uma nova fonte de dados do usuário escolha o driver NSP ou o driver apropriado e clique em concluir:
6 – Preencha os dados de conexão com o servidor e o banco de dados:
7 – Clique em testar a conexão e alimente o usuário e senha para o banco de dados:
8 – Com tudo funcionando conclua a conexão:
9 – Utilize o código abaixo para manipular dados utilizando o SAP MaxDB:
10 – Para utilizar o ABAP para ler ou gravar dados nesta mesma tabela não transparente utilizando uma Stored Procedure no MaxDB através de códigos Native SQL, utilize o link abaixo para o procedimento ABAP:
Programa SAP – ABAP Native SQL: MaxDB Stored Procedure parâmetros IN e OUT
Caso conecte em um banco de dados MaxDB utilizando soluções SAP tenha em mente que você deve respeitar o conceito de dados dos sistemas SAP e verificar os termos de garantia de cada produto SAP, visto que este método ao contrario do RFC ignora a camada de banco de dados SAP e o dicionário de dados ABAP.
Como você pode verificar na imagem acima no ambiente ABAP o valor flutuante não vem formatado por padrão como estão acostumados os desenvolvedores SAP que utilizam instruções Open SQL e o dicionário ABAP no entanto você pode utilizar campos criados no dicionário apenas para a manipulação do valor de saída da Stored Procedure neste caso você deve alinhar os tipos de dados entre as aplicações Python e aplicações ABAP.
Exemplo:
Neste exemplo utilizamos a linguagem de programação Python para se conectar ao banco de dados SAP MaxDB em uma instancia do banco de dados do NetWeaver e integrar uma tabela não transparente que pode ser manipulada tanto do lado Python como dentro do sistema SAP utilizando Native SQL.
SQL – SAP MaxDB
-- Cria tabela no schema SAPNSP CREATE TABLE SAPNSP.ZFUNCIONARIO ( ID_FUNCIONARIO INT, NOME VARCHAR (30), SOBRENOME VARCHAR(70), CARGO VARCHAR(30), SALARIO DECIMAL(9,2) ) -- Insere dados na tabela Insert into SAPNSP.ZFUNCIONARIO values (1,'Steve','Gates','Programador',2550.56) Insert into SAPNSP.ZFUNCIONARIO values (2,'Bill','Jobs','Diretor',5143.71)
Python
#!/usr/bin/env python # -*- coding: cp1252 -*- # Desenvolvimento Aberto # MeuSAPMaxDB.py # importa modulos from Tkinter import * import tkMessageBox import odbc # Cria formulario formulario = Tk(className='.::SAP MaxDB - Desenvolvimento Aberto') formulario.geometry("550x300+300+300") # Cria janela para menssagem janela = Tk() janela.wm_withdraw() # Cria conexão com o banco de dados def conectar(): # Conexão SAPMaxDB # SAP MaxDb Drivers necessita que o password seja # convertido para letras maisculas (UPPERCASE) # Coloque somente caracteres maiusculos no exemplo # trate este requerimento no seu codigo fonte sconexao = "SapMaxDB/SAPNSP/password" try: con = odbc.odbc(sconexao) except ValueError: tkMessageBox.showinfo(title="Menssagem", message="Erro de Conexão", parent=janela) return con # Executa e retorna cursor def retornaFuncionarioID(sql, con): cursor = con.cursor() cursor.execute(sql) return cursor # Evento do botão def on_Pesquisar(): # Exibe banco de dados titulo['text'] = "Database: SAP MaxDB" # Cria conexão con = conectar() # Define e executa SQL sql = "Select * From SAPNSP.ZFUNCIONARIO Where ID_FUNCIONARIO = " + tpesquisa.get() tabela = retornaFuncionarioID(sql, con) # Retorna dados dados = tabela.fetchone() # Exibe dados tcodigo.insert(0, str(dados[0])) tpnome.insert(0, dados[1]) tsnome.insert(0, dados[2]) tcargo.insert(0, dados[3]) tsalario.insert(0, str(dados[4])) # Cria componentes widgets titulo = Label(formulario, text="Database: Nenhum") separador1 = Frame(height=2, bd=1, relief=SUNKEN) separador2 = Frame(height=2, bd=1, relief=SUNKEN) # labels lcodigo = Label(formulario, text="Codigo:") lpnome = Label(formulario, text="Nome:") lsnome = Label(formulario, text="Sobrenome:") lcargo = Label(formulario, text="Cargo:") lsalario = Label(formulario, text="Salario:") # Entry tcodigo = Entry(formulario) tpnome = Entry(formulario, width=50) tsnome = Entry(formulario, width=40) tcargo = Entry(formulario, width=30) tsalario = Entry(formulario) # Pesquisa lpesquisa = Label(formulario, text="Pesquisa:") tpesquisa = Entry(formulario) botao = Button(formulario, text = "Pesquisar", command=on_Pesquisar) # Define Layout titulo.grid(row=0, sticky=W+E+N+S, pady=20) separador1.grid(row=1, sticky=W+E+N+S, pady=5, columnspan=4) lcodigo.grid(row=2, sticky=W, padx=20) tcodigo.grid(row=2, column=1, sticky=W, pady=5) lpnome.grid(row=3, sticky=W, padx=20) tpnome.grid(row=3, column=1, sticky=W, pady=5) lsnome.grid(row=4, sticky=W, padx=20) tsnome.grid(row=4, column=1, sticky=W, pady=5) lcargo.grid(row=5, sticky=W, padx=20) tcargo.grid(row=5, column=1, sticky=W, pady=5) lsalario.grid(row=6, sticky=W, padx=20) tsalario.grid(row=6, column=1, sticky=W, pady=5) separador2.grid(row=7,sticky=W+E+N+S, pady=5, columnspan=4) # Layout pesquisa lpesquisa.grid(row=8, column=0, pady=20) tpesquisa.grid(row=8, column=1, pady=20) botao.grid(row=8, column=2,pady=20) # loop do tcl mainloop()