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();
}
});
}
}








