SAP MaxDB – Aplicações Enterprise com Python – Python

Publicado: 12 de novembro de 2014 em Abap, Python

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:

SAP - Servidor de Aplicação - e Banco de dados - NetWeaver/MaxDB

SAP – Servidor de Aplicação – e Banco de dados – NetWeaver/MaxDB

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:

NSP - NetWeaver Database

NSP – NetWeaver Database

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:

Tabela Não Transparente

Tabela Z Não Transparente

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:

Driver SAP MaxDB ODBC 64bit

Driver SAP MaxDB ODBC 64bit

5 – Crie uma nova fonte de dados do usuário escolha o driver NSP ou o driver apropriado e clique em concluir:

Fonte de Dados do Usuário

Fonte de Dados do Usuário

6 – Preencha os dados de conexão com o servidor e o banco de dados:

Dados do DNS da conexão

Dados do DNS da conexão

7 – Clique em testar a conexão e alimente o usuário e senha para o banco de dados:

Testar Conexão - Usuário e Senha

Testar Conexão – Usuário e Senha

8 – Com tudo funcionando conclua a conexão:

Conexão OK

Conexão OK

9 – Utilize o código abaixo para manipular dados utilizando o SAP MaxDB:

MaxDB - Programa Python

MaxDB – Programa Python

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:

Stored Procedure - Abap

Stored Procedure – 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()
Publicidade

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s