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/
Softwares Requeridos
Para utilizar este walkthrough completo integrando uma solução Java 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 Java 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
SAP MaxDB JDBC Drivers
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 os Drivers Java para que você possa acessar o banco de dados MaxDB.
C:\sapdb\NSP\db\runtime\jar
C:\sapdb\NSP\db\doc\FirstSteps\Java
SAP MaxDB JDBC Drivers: Documentação.
Conectando ao MaxDB em instancia SAP com Java
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 Java 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 – Utilize o Driver descrito acima, através da opção propriedades do seu projeto Java e adicione o arquivo sapdbc.jar nas bibliotecas externas do seu projeto:
5 – Utilize o código abaixo na IDE Eclipse:
6 – Compile o programa para manipular dados utilizando o SAP MaxDB:
7 – 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 Java e aplicações ABAP.
Exemplo:
Neste exemplo utilizamos a linguagem de programação Java 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 Java 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)
Java
import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class ConectarMaxDB implements ActionListener, ItemListener { // Cria componentes private JTable tabela; private JRadioButton banco1; private JButton botao; // Declara objetos de conexão private static Connection conn; private static Statement query; private static String bancodedados; public void conectar(String login, String senha) { // Verifica strings de conexão // SAP MaxDB // Utilize senhas com caracteres UPPERCASE if (bancodedados == "maxdb") { try { // Define Driver de conexão JDBC SAP MaxDB Class.forName("com.sap.dbtech.jdbc.DriverSapDB"); // Servidor / Banco de Dados conn = DriverManager.getConnection( "jdbc:sapdb://localhost/NSP", login, senha); // Executa pedido SQL query = conn.createStatement(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } catch (SQLException ex) { ex.printStackTrace(); } } } public ResultSet retornaTabela() throws SQLException { // Cria uma nova conexão Statement query; query = conn.createStatement(); String sql; sql = "Select * from SAPNSP.ZFUNCIONARIO"; // Executa Script ResultSet dados = query.executeQuery(sql); // Retorna set de dados return dados; } // Modelo public static DefaultTableModel criaTableModel(ResultSet rs) throws SQLException { // Cria um modelo de tabela ResultSetMetaData metaData = rs.getMetaData(); // Retorna as colunas Vector<String> colunas = new Vector<String>(); int columnCount = metaData.getColumnCount(); for (int column = 1; column <= columnCount; column++) { colunas.add(metaData.getColumnName(column)); } // Retorna dados Vector<Vector<Object>> dados = new Vector<Vector<Object>>(); while (rs.next()) { Vector<Object> vector = new Vector<Object>(); for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) { vector.add(rs.getObject(columnIndex)); } dados.add(vector); } return new DefaultTableModel(dados, colunas); } public void itemStateChanged(ItemEvent arg0) { // Verifica item banco de dados selecionado Object fonte = arg0.getItemSelectable(); int estado = arg0.getStateChange(); if (estado == arg0.SELECTED) { if (fonte == banco1) { bancodedados = "maxdb"; } } } public void actionPerformed(ActionEvent arg0) { // Efetua login no banco de dados ConectarMaxDB acesso = new ConectarMaxDB(); // SAP MaxDB utiliza senhas com caracteres maiusculos (UPPERCASE) if (bancodedados == "maxdb") { acesso.conectar("SAPNSP", "PASSWORD"); } try { tabela.setModel(criaTableModel(acesso.retornaTabela())); } catch (SQLException e) { e.printStackTrace(); } } public Container criaPainel() throws SQLException { // Cria painel principal JPanel painel = new JPanel(); // Seleciona layout painel.setLayout(new BoxLayout(painel, BoxLayout.PAGE_AXIS)); painel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); // Cria painel de escolha de conexão JPanel pescolha = new JPanel(); pescolha.setLayout(new BoxLayout(pescolha, BoxLayout.LINE_AXIS)); pescolha.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); ButtonGroup grupo = new ButtonGroup(); // Cria componentes de radio banco1 = new JRadioButton("SAP MaxDB"); // Agrupa botões de radio grupo.add(banco1); // Cria ouvinte dos botões banco1.addItemListener(this); // Seleciona primeira conexão banco1.setSelected(true); // Adiciona botões ao painel pescolha.add(banco1); // Efetua primeira conexão ao banco (SAP MAXDB) // SAP MaxDB utiliza senhas com caracteres maiusculos (UPPERCASE) ConectarMaxDB acesso = new ConectarMaxDB(); acesso.conectar("SAPNSP", "PASSWORD"); // Cria modelo de tabela tabela = new JTable(criaTableModel(acesso.retornaTabela())); // Adiciona um painel de rolagem JScrollPane rolar = new JScrollPane(tabela); // Cria painel do botão JPanel pbotao = new JPanel(); // Seleciona layout pbotao.setLayout(new BoxLayout(pbotao, BoxLayout.PAGE_AXIS)); // cria botão botao = new JButton("Ler dados"); botao.addActionListener(this); // Adiciona botão ao painel pbotao.add(botao); // componentes ao painel principal painel.add(pescolha); painel.add(rolar); painel.add(Box.createVerticalStrut(10)); painel.add(pbotao); return painel; } public static void criaGUI() { // Cria formulario JFrame formulario = new JFrame("SAP MaxDB - Acessando Dados"); formulario.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // cria painel de conteudo ConectarMaxDB acesso = new ConectarMaxDB(); try { formulario.setContentPane(acesso.criaPainel()); } catch (SQLException e) { e.printStackTrace(); } // Exibe o formulario formulario.pack(); formulario.setVisible(true); } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { @Override public void run() { // Cria e mostra a GUI criaGUI(); } }); } }