Arquivo de junho, 2014

SAP – BAdis – Business add-ins – Abap

Publicado: 10 de junho de 2014 em Abap

BAdis são melhorias para a versão padrão do sistema. Elas podem ser inseridas no sistema SAP para acomodar as necessidades específicas dos utilizadores e serem incluídas no fornecimento Standard. Algumas indústrias específicas muitas vezes exigem funções especiais, a SAP permite que você crie estas funções pré-definidas em seu software utilizando os Business Add-ins.

Para criar uma BAdi siga os seguintes passos:

  1. Entre na transação SE18.
  2. Crie um novo Enhancement Spot chamado: ZDA_BADI_SPOT.
  3. No ícone criar BAdi, crie uma BAdi de nome ZDA_BADI.
  4. Desmarque a opção Multiple Use de sua BAdi:

    ZDA_BADI

    ZDA_BADI

  5. Salve sua BAdi e expanda seu conteúdo.
  6. Clique em interface e insira uma nova interface de nome ZAD_BADI_INTERFACE.
  7. Na aba métodos crie um novo método de instancia chamado GET_DADOS e insira uma descrição de sua escolha:

    Método

    Método

  8. Crie os Parâmetros para sua Interface de acordo com a figura abaixo:

    Parametros

    Parâmetros

  9. Salve e Ative a sua BAdi.
  10. De volta a tela principal da transação SE18, em modo de alteração cheque a opção CALL FALLBACK IF NO IMPLEMENTATION IS EXECUTED, insira o nome da classe como ZDA_CLASSE e salve:

    Classe

    Classe

  11. Você será levado ao Class Builder e verá que sua classe herdou os métodos da interface criada logo acima, dê um duplo clique no método e preencha seu código com o método descrito logo abaixo.
  12. Salve e ative sua classe.
  13. Na transação SE38 crie um programa chamado Z_PROG_BADI e utilize o código abaixo para testar sua BAdi.

Exemplo:

Neste exemplo criamos uma BAdi e a utilizamos em um programa Abap.

Obs: BAdis não devem ser confundidas com BAPIs, existe um post de exemplo de uma BAPI neste site que possui quase a mesma funcionalidade deste exemplo, e modificando a instrução SELECT deste método podemos deixar as funcionalidades idênticas, entretanto BAdis e BAPIs são utilizadas para propósitos diferentes em um sistema SAP.

Abap

Método da classe – ZDA_CLASSE

method ZDA_BADI_INTERFACE~GET_DADOS.

  Select * From SFLIGHT
    INTO TABLE TFLIGHT
    WHERE carrid EQ carrid AND
          connid EQ connid AND
          fldate EQ fldate.

endmethod.

Programa – Z_PROG_BADI

*&---------------------------------------------------------------------*
*& Report  Z_PROG_BADI
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& BAdis - Business Add Ins
*&---------------------------------------------------------------------*

REPORT  Z_PROG_BADI.

* Exemplo de entrada de dados na tabela SFLIGHT
*    airlineid       = 'LH'
*   connectionid    = '0401'
*    flightdate      = '07.03.2014'

* Cria parametros
PARAMETERS:
  empresa TYPE scarr-carrid,   " Airline code
  conexao TYPE sflight-connid, " Connection number
  data    TYPE sflight-fldate. " Flight date

* Declara variaveis
DATA:
t_flight TYPE STANDARD TABLE OF sflight,
dados    LIKE LINE OF t_flight,
badi_flight TYPE REF TO zda_badi.

* Incia seleção
START-OF-SELECTION.

* Acessa objeto Badi
  GET BADI badi_flight.

* Chama BADI
  CALL BADI badi_flight->get_dados
    EXPORTING
      carrid  = empresa
      connid  = conexao
      fldate  = data
    RECEIVING
      tflight = t_flight.

* Imprime dados
  LOOP AT t_flight INTO dados.
    WRITE:
    / dados-carrid,
      dados-connid,
      dados-fldate,
      dados-price,
      dados-PLANETYPE,
      dados-CURRENCY.
  ENDLOOP.

Você pode utilizar o método Save em um controlador para salvar dados em um banco de dados. O método a seguir é parte integrante de dois posts anteriores e contem instruções de como criar um website MVC básico, o banco de dados, conexões e como criar uma pagina índice, você encontra os posts em sequencia decrescente de data na categoria Ruby on Rails.

Agora nosso objetivo é criar uma nova pagina VIEW para adicionar dados sobre o evento NEW do controlador.

Adicionar dados

Adicionar dados

Alteração do Projeto

  1. Crie uma nova pagina na pasta Views\empresas chamada new.html.erb.
  2. Utilize a pasta layout para alterar o arquivo de layout padrão para exibição da mensagem flash.
  3. Utilize os códigos abaixo para cada arquivo correspondente.

Exemplo:

Neste exemplo criamos uma nova pagina para exibir um formulário de entrada de dados para nossa tabela de empresas e utilizamos o controlador para criar a ação de salvar os dados no banco de dados MySql.

Html

Arquivo – index.html.erb

<h2>Desenvolvimento Aberto</h2>
<p>Lista de Blogs e Projetos Open Source</p>
<pre>
<table width="500">
<tr>
	<th>Cod:</th>
	<th>&nbsp;&nbsp;</th>
	<th>Empresa:</th>
	<th>&nbsp;&nbsp;</th>
	<th>Site:</th>
</tr>
<% @empresas.each do |empresa| %>

<tr>
<td><%= empresa.codigo%> </td>
<td>&nbsp;&nbsp;</td>
<td><%= link_to empresa.nome, empresa %> </td>
<td>&nbsp;&nbsp;</td>
<td><%= empresa.site%> </td>
</tr>

<%end%>
</table>

<p> <%= link_to "Adicionar um novo registro", new_empresa_path %> </p>
</pre>

Arquivo – new.html.erb

<h2> Adicionar nova Empresa </h2>

<%= form_for @empresa do |cad|%>

	<p>
		<%= cad.label :codigo%> <br />
		<%= cad.text_field :codigo%>
	</p>

	<p>
		<%= cad.label :nome%> <br />
		<%= cad.text_field :nome%>
	</p>

	<p>
		<%= cad.label :site%> <br />
		<%= cad.text_field :site%>
	</p>

	<p>
		<%= cad.label :projeto%> <br />
		<%= cad.text_field :projeto%>
	</p>

	<p>
		<%= cad.label :tipo%> <br />
		<%= cad.text_field :tipo%>
	</p>

	<p>
		<%= cad.label :linguagem%> <br />
		<%= cad.text_field :linguagem%>
	</p>

	<p>
		<%= cad.label :descricao%> <br />
		<%= cad.text_field :descricao%>
	</p>

	<p> <%= cad.submit "Adicionar dados" %></p>

<% end %>

Arquivo – layout\Application.html.erb

<!DOCTYPE html>
<html>
<head>
  <title>DARails</title>
  <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
  <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
  <%= csrf_meta_tags %>
</head>
<body>

<% flash.each do |key, value|%>
<p><%= value %> </p>
<%end%>

<%= yield %>

</body>
</html>

Arquivo – empresas_controller.erb

class EmpresasController < ApplicationController

  def index
    @empresas = Empresa.all
  end

  def show
    @empresa = Empresa.find(params[:id] )
  end

  def new
    @empresa = Empresa.new
  end

  def create
    @empresa = Empresa.new(empresa_params)
    if @empresa.save
      redirect_to empresas_path :notice => "Seu registro foi criado com sucesso"
    else
      render "new"
    end
  end

  private

  def empresa_params
    params.require(:empresa).permit(:codigo, :nome, :site, :projeto, :tipo, :linguagem, :descricao)
  end

end

BAPI é uma interface definida com precisão para fornecer acesso a processos e dados em sistemas de aplicação de negócios, tais como o SAP R/3. Uma BAPI é similar a uma API de programação comum entretanto é direcionada a negócios, é manipulada no sistema SAP através do FUNCTION BUILDER e pode ser utilizada em programas SAP ou não SAP através de acesso remoto chamado RFC.

Requisitos

Utilizaremos um exemplo do NetWeaver 7 do modelo de dados chamado Fligth Model, para isto você precisa criar um cliente de desenvolvimento DEV de numero 200, transportar as configurações dos cliente padrão 001 para este cliente e carregar os dados de exemplo do Flight Model contidos no ambiente 000, para seu ambiente de desenvolvimento você encontra um walkthrough de como realizar estes dois procedimentos em nossa categoria ABAP.

BAPI

A BABI de exemplo será a BAPI_FLIGHT_GETDETAIL, que exibe todos os detalhes de um voo contido na tabela SFLIGHT. Você pode visualizar o código fonte desta BABI utilizando o function Builder na transação SE37.

BAPI

BAPI

Exemplo:

Este programa exibe os dados de voo através de uma interface de aplicação de negócios utilizada em um sistema SAP.

Abap

*&---------------------------------------------------------------------*
*& Report  ZVOOS
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& BAPI_FLIGHT_GETDETAIL
*&---------------------------------------------------------------------*

REPORT  ZVOOS.

* Exemplo de entrada de dados na tabela SFLIGHT
*    airlineid       = 'LH'
*   connectionid    = '0401'
*    flightdate      = '07.03.2014'

* Declara variaveis
DATA : dados TYPE bapisfldat,
       dados_info TYPE bapisfladd,
       dados_availability TYPE bapisflava,
       dados_it_ret TYPE STANDARD TABLE OF bapiret2.

* Declara parametros
PARAMETERS : empresa TYPE sflight-carrid,
             conexao TYPE sflight-connid,
             data    TYPE sflight-fldate.

* Chama BAPI
CALL FUNCTION 'BAPI_FLIGHT_GETDETAIL'
  EXPORTING
    airlineid       = empresa
    connectionid    = conexao
    flightdate      = data
  IMPORTING
    flight_data     = dados
    additional_info = dados_info
    availibility    = dados_availability
  TABLES
    return          = dados_it_ret.

* Imprime Resultado dos campos
write : / 'Flight Data: ',
        / dados-AIRLINEID,
        / dados-AIRLINE,
        / dados-CONNECTID,
        / dados-FLIGHTDATE,
        / dados-AIRPORTFR,
        / dados-CITYFROM,
        / dados-AIRPORTTO,
        / dados-CITYTO,
        / dados-DEPTIME,
        / dados-ARRTIME,
        / dados-ARRDATE,
        / dados-PRICE,
        / dados-CURR,
        / dados-CURR_ISO.

 

A linguagem de programação Ruby permite transformar dinamicamente um campo extraído do banco de dados em um link para uma pagina de sua preferencia.

Para utilizar este post é necessário criar a aplicação básica MVC criada no post anterior, para criar a aplicação utilize o link abaixo:

Instruções Ruby

Tag <% %>

Esta Tag permite que sejam escritos comandos Ruby em uma pagina HTML.

Link_to

Uma instrução Ruby que permite criar um link dinâmico em uma pagina HTML.

Controller

Um controller possui sete opções de ações que podem ser executadas, vamos utilizar a padrão chama INDEX que é responsável pela pagina principal do website e a ação SHOW que é responsável por mostrar o conteúdo de uma VIEW do website.

Programa básico:

MVC Ruby on Rails: https://desenvolvimentoaberto.wordpress.com/2014/06/01/websites-model-view-controller-mysql-ruby-on-rails-linux/

Website MVC

Pagina com os links criados à partir de uma tabela do banco de dados:

Pagina - Principal

Pagina – Principal

Pagina com os detalhes de cada link:

Pagina de Detalhes

Pagina de Detalhes

Nosso objetivo é modificar a aplicação criada no post anterior para que cada descrição do campo nome na pagina HTML principal seja transformada em um link para uma outra pagina que fornece mais detalhes sobre o assunto referido.

Primeiro conecte-se ao banco de dados DAprod e altere a tabela manualmente e modifique os dados utilizando o script abaixo.

  1. Utilize os script MySQL abaixo para alterar a tabela e os dados utilizados no website.
  2. Crie um novo arquivo de VIEW para a ação SHOW do CONTROLLER  chamado show.html.erb.
  3. Altere os códigos dos seus arquivos de acordo com os códigos abaixo.
  4. Inicie o servidor Rails utilizando o seguinte comando: rails server
  5. Digite no browser a seguinte url para utilizar o programa: http://localhost:3000/empresas/

Exemplo:

Neste exemplo criamos um website MVC com que exibe dados e a descrição dos dados em uma pagina de detalhes.

MySQL

-- Usa o banco de dados
use DAprod;

-- Verifica a tabela
select * from empresas;

-- Adiciona campos
alter table empresas add projeto varchar(30);
alter table empresas add tipo varchar(20);
alter table empresas add linguagem varchar(35);
alter table empresas add descricao varchar(100);

-- Altera dados
update empresas set projeto = 'DA-Samples',
					tipo = 'OpenSource',
					linguagem = 'Abap-Java-C#-Python-Ruby-C++',
					Descricao = 'TRN - Treinamento dirigido ao desenvolvedor'
				Where id = 1;

update empresas set projeto = 'DA-Tools',
					tipo = 'Free',
					linguagem = 'Abap-Java-C#-Python-Ruby-C++',
					Descricao = 'Samples - Ferramentas desenvolvidas a partir do projeto de treinamento'
				Where id = 2;

update empresas set projeto = 'DA-ERP',
					tipo = 'OpenSource',
					linguagem = 'Abap-Java-C#-Python-Ruby-C++',
					Descricao = 'DEV - Projeto ERP Integrado OpenSource'
				Where id = 3;

View – index.html.erb

<h2>Desenvolvimento Aberto</h2>
<p>Lista de Blogs e Projetos Open Source</p>
<pre>
<table width="500">
<tr>
	<th>Cod:</th>
	<th>&nbsp;&nbsp;</th>
	<th>Empresa:</th>
	<th>&nbsp;&nbsp;</th>
	<th>Site:</th>
</tr>
<% @empresas.each do |empresa| %>

<tr>
<td><%= empresa.codigo%> </td>
<td>&nbsp;&nbsp;</td>
<td><%= link_to empresa.nome, empresa %> </td>
<td>&nbsp;&nbsp;</td>
<td><%= empresa.site%> </td>
</tr>

<%end%>
</table>
</pre>

View – show.html.erb

<h1><%= @empresa.nome	%></h1>
<p>codigo: <%= @empresa.codigo%> Nome: <%= @empresa.projeto%> Tipo:<%= @empresa.tipo%> </p>
<p>Lingua: <%= @empresa.linguagem%></p>
<p>Criado em: <%= @empresa.created_at%></p>
<p>Desc: <%= @empresa.descricao%></p>

Controller – empresas_controller.rb

class EmpresasController < ApplicationController

  def index
    @empresas = Empresa.all
  end

  def show
    @empresa = Empresa.find(params[:id] )
  end

end

Routes – routes.rb

Rails.application.routes.draw do

  resources :empresas

end

Quando o Javascript foi criado ainda não existia uma API para manipular a estrutura de um documento HTML e o único método disponível para alterar um documento dinamicamente era utilizando códigos Javascript para escrever tags HTML enquanto a pagina fosse carregada.

Quando um script passa texto para a instrução document.write (), o texto é adicionado ao documento, e o analisador de HTML se comporta como se o elemento de script tivesse sido substituído por esse texto. Está pratica não é mais considera um bom estilo de programação, porem ainda é funcional e possui importantes implicações.

Se o interpretador de HTML encontrar um elemento <script>, deve, por padrão, executar o script antes de poder analisar o restante do documento. Está técnica não oferece problemas quando você utiliza scripts de um modo procedural. Este modo de execução de scripts é o padrão e é chamado de modo síncrono.

Html - Dinâmico

Html – Dinâmico

Exemplo:

Neste exemplo criamos uma tabela HTML em tempo de execução utilizando o modo síncrono do interpretador do browser.

Html / JavaScript

<!DOCTYPE html>
<html>
 
<head>
   <title>Desenvolvimento Aberto</title>
</head>
 
<body>
 
<h2>Desenvolvimento Aberto</h2>
<h3>Javascript - WebBrowser - HTML Din&#226mico</h3>

<pre>

<script>
// Cria função
function factorial(n) 
{
   if (n <= 1) return n;
   else return n*factorial(n-1);
}

// Escreve tags html dinamicamente
document.write("<table border="1">");
document.write("<tr><th>Valor</th><th>Numero</th><th>Fatorial</th></tr>");

// Cria conteudo da tabela
for(var i = 1; i <= 10; i++) 
{ 
    document.write("<tr><td>Valor = </td><td>" + i + "</td><td>" + factorial(i) + "</td></tr>");
}

// Fecha tag html
document.write("</table>"); 
document.write("\nCriado em: " + new Date());
</script>
</pre>
 
</body>
 
</html>

Na linguagem de programação Python você pode executar instruções SQL diretas, utilizando o método execute para os bancos de dados Oracle e Microsoft SQL Server e o método exec_immediate para executar instruções sobre o banco de dados IBM DB2.

Neste método utilizamos as APIs de conexão cx_oracle para o banco de dados Oracle, a API ibm_db para o banco de dados DB2 e a API win32 para criar uma conexão ODBC com o banco de dados MSSQL Server.

Execute

O método execute() analisa e executa uma instrução SQL.

exec_immediate

Este procedimento prepara e executa uma única instrução SQL.

API

Para saber mais sobre como utilizar estas APIs utilize nossa categoria Python ou digite a palavra “Conexão” no item de busca do menu deste site.

Python - Database

Python – Database

Exemplo:

Este programa executa as quatro operações básicas em diferentes bancos de dados.

Python

#!/usr/bin/env python
# -*- coding: latin-1 -*-
# Desenvolvimento Aberto
# campos.py

# importa modulos
from Tkinter import *
import tkMessageBox
import cx_Oracle
import ibm_db
import odbc

# Cria formulario
formulario = Tk(className='Desenvolvimento Aberto')
formulario.geometry("400x330+300+300")

# Cria janela para menssagem
janela = Tk()
janela.wm_withdraw()

# Define banco de dados
# oracle = Oracle Database
# db2 = IBM DB2 Database
# mssql = Microsoft SQL Server
DBconexao = "mssql"

# Cria conexão com o banco de dados
def conectar(banco):
    # Cria string de conexão Oracle
    if (banco == "oracle"):
        sconexao = "user/pass@localhost/XE"
        try:
            con = cx_Oracle.connect(sconexao)
        except ValueError:
            tkMessageBox.showinfo(title="Menssagem", message="Erro de Conexão", parent=janela)

    if (banco == "db2"):
        # Cria string de conexão IBM
        sconexao = "DATABASE=DEVA" +  \
                   ";HOSTNAME=localhost;PORT=50000;PROTOCOL=TCPIP;" + \
                   "UID=user;" + \
                   "PWD=pass"
        try:
            con = ibm_db.connect(sconexao, "", "")
        except ValueError:
            tkMessageBox.showinfo(title="Menssagem", message="Erro de Conexão", parent=janela)

    if (banco == "mssql"):
        # Cria string de conexão MSSQL ODBC
        sconexao =  "MSSQLSERVER/user/pass"
        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, banco):
    if (banco == "oracle"):
        cursor = con.cursor()
        cursor.execute(sql)
    if (banco == "db2"):
        cursor = ibm_db.exec_immediate(con, sql)
    if (banco == "mssql"):
        cursor = con.cursor()
        cursor.execute(sql)
    return cursor

# Limpa campo
def limpar():
    tcodigo.delete(0, END)
    tpnome.delete(0, END)
    tsnome.delete(0, END)
    tcargo.delete(0, END)
    tsalario.delete(0, END)

# Evento do botão
def on_Pesquisar():
    # Exibe banco de dados
    titulo['text'] = "Database: " + DBconexao

    # Cria conexão
    con = conectar(DBconexao)

    # Define e executa SQL
    sql = "Select * From FUNCIONARIOS Where  ID_FUNCIONARIO = " + tpesquisa.get()
    tabela = retornaFuncionarioID(sql, con, DBconexao)

    # Cria cursor
    if (DBconexao == "oracle"):
        dados = tabela.fetchone()
    if (DBconexao == "db2"):
        dados = ibm_db.fetch_tuple(tabela)
    if (DBconexao == "mssql"):
        dados = tabela.fetchone()

    # Exibe dados
    limpar()
    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]))

# limpa widgets
def on_novo():
    limpar()
    tcodigo.focus()

# Insere dados
def on_inserir():
    con = conectar(DBconexao)
    if (DBconexao != "db2"): cursor = con.cursor()

    sql ="Insert into Funcionarios Values (" + \
          tcodigo.get() + ", '" + \
          tpnome.get() + "', '" + \
          tsnome.get() + "', '" + \
          tcargo.get() + "', " + \
          str(tsalario.get()).replace(",",".") + ")"
    try:
        if (DBconexao != "db2"):
            cursor.execute(sql)
            con.commit()
        else:
            cursor = ibm_db.exec_immediate(con, sql)
        tkMessageBox.showinfo(title="Menssagem", message="Dados inseridos com sucesso!", parent=janela)
    except ValueError:
        tkMessageBox.showinfo(title="Menssagem", message="Erro ao inserir dados!", parent=janela)

# Altera dados
def on_alterar():
    con = conectar(DBconexao)
    if (DBconexao != "db2"): cursor = con.cursor()

    sql ="Update Funcionarios set " + \
          "ID_FUNCIONARIO = " + tcodigo.get() + ", NOME= '" + \
          tpnome.get() + "', SOBRENOME= '" + \
          tsnome.get() + "', CARGO= '" + \
          tcargo.get() + "', SALARIO= " + \
          str(tsalario.get()).replace(",",".") + " Where ID_FUNCIONARIO=" + tcodigo.get()

    try:

       if (DBconexao != "db2"):
           cursor.execute(sql)
           con.commit()
       else:
           cursor = ibm_db.exec_immediate(con, sql)            

       tkMessageBox.showinfo(title="Menssagem", message="Dados alterados com sucesso!", parent=janela)
    except ValueError:
        tkMessageBox.showinfo(title="Menssagem", message="Erro ao alterar dados!", parent=janela)

# Exclui dados
def on_apagar():
    con = conectar(DBconexao)
    if (DBconexao != "db2"): cursor = con.cursor()

    sql ="Delete From Funcionarios Where ID_FUNCIONARIO = " + tcodigo.get()

    try:
        if (DBconexao != "db2"):
            cursor.execute(sql)
            con.commit()
        else:
            cursor = ibm_db.exec_immediate(con, sql)
        limpar()
        tkMessageBox.showinfo(title="Menssagem", message="Dados excluidos com sucesso!", parent=janela)
    except ValueError:
        tkMessageBox.showinfo(title="Menssagem", message="Erro ao excluir dados!", parent=janela)

# Cria componentes widgets
titulo = Label(formulario, text="Database: Nenhum")

# 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)
tsnome = Entry(formulario)
tcargo = Entry(formulario)
tsalario = Entry(formulario)

# Pesquisa
lpesquisa = Label(formulario, text="Pesquisa:")
tpesquisa = Entry(formulario)
botao = Button(formulario, text = "Pesquisar", command=on_Pesquisar)

#Ações
painel = Frame()
bnovo = Button(painel, text="Novo", command=on_novo)
binserir = Button(painel, text="Inserir", command=on_inserir)
balterar = Button(painel, text="Alterar", command=on_alterar)
bapagar = Button(painel, text="Apagar", command=on_apagar)

# Define Layout
titulo.grid(row=0, sticky=W+E+N+S, pady=20)
lcodigo.grid(row=2, sticky=W, padx=20)
tcodigo.grid(row=2, column=1, pady=5)
lpnome.grid(row=3,sticky=W, padx=20)
tpnome.grid(row=3, column=1, pady=5)
lsnome.grid(row=4,sticky=W, padx=20)
tsnome.grid(row=4, column=1, pady=5)
lcargo.grid(row=5, sticky=W, padx=20)
tcargo.grid(row=5, column=1, pady=5)
lsalario.grid(row=6, sticky=W, padx=20)
tsalario.grid(row=6, column=1, pady=5)

# Layout pesquisa
lpesquisa.grid(row=1, column=0, pady=20)
tpesquisa.grid(row=1, column=1, pady=20)
botao.grid(row=1, column=2,pady=20)

# Loayout Ações
bnovo.grid(row =1, column=0, pady=15)
binserir.grid(row =1, column=1, pady=15)
balterar.grid(row =1, column=2, pady=15)
bapagar.grid(row =1, column=3, pady=15)
painel.grid(row=7, columnspan= 3, padx=100, pady=10)

# loop do tcl
mainloop()

Na linguagem de programação C++ um desenvolvedor pode utilizar as classes de fundação da Microsoft chamadas de MFC para desenvolver programas capazes de executar instruções SQL diretas utilizando a classe CDatabase ao invés de utilizar um DataSource.

A maioria dos comandos para manipular uma fonte de dados são emitidos através de um objeto CRecordSet que suporta os comandos para a seleção de dados, inserir novos registros, excluir registros e edição de registros. No entanto, nem todas as funcionalidades do ODBC são suportadas diretamente pelas classes de banco de dados, então as vezes, você precisa fazer uma chamada SQL direta com a instrução ExecuteSQL.

CDatabase::ExecuteSQL

Chame este membro da função quando você precisar executar um comando SQL diretamente.

C++ - MFC - CDatabase

C++ – MFC – CDatabase

 

Visual Studio

Para criar um programa que executa as quatro operações básicas de um banco de dados em uma aplicação C++ MFC Dialog Based, siga os seguintes passos:

1 – Crie um novo projeto C++ e disponha os componentes como na imagem abaixo:

Design Time

Design Time

3 – Use o Class Wizard para introduzir a mensagem WM_SHOWWINDOW, e crie as variáveis e os eventos adequados para cada componente, para isto você pode se basear no método DoDataExchange e BEGIN_MESSAGE_MAP encontrados no código abaixo:

Class Wizard

Class Wizard

Exemplo:

Este programa executa as quatro operações básicas em diferentes bancos de dados, atente-se para o padrão de campos do Microsoft SQL Server, que por default utilizando a classe CDatabase o torna case-sensitive.

C++

Arquivo .h


// CamposcppDlg.h : header file
//

#pragma once

// Inclui classe de banco de dados MFC
#include "afxdb.h"
#include "afxwin.h"

// CCamposcppDlg dialog
class CCamposcppDlg : public CDialogEx
{

public:
	CCamposcppDlg(CWnd* pParent = NULL);	// standard constructor

// Dialog Data
	enum { IDD = IDD_CAMPOSCPP_DIALOG };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support

// Implementation
protected:
	HICON m_hIcon;

	// Generated message map functions
	virtual BOOL OnInitDialog();
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:

	// Cria métodos e objetos da classe
	CDatabase db;

	// Esta variavel define o banco de dados
	// oracle = Oracle Database
	// db2 = IBM DB2
	// mssql = MSSQL Server
	CString m_db = L"oracle";

	// Conecta ao banco de dados
	void conectarDB(CString banco);

	afx_msg void OnBnClickedButton1();
	CEdit m_pesquisa;
	CEdit m_codigo;
	CEdit m_pnome;
	CEdit m_snome;
	CEdit m_cargo;
	CEdit m_salario;
	afx_msg void OnBnClickedButton2();
	afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
	afx_msg void OnBnClickedButton3();
	afx_msg void OnBnClickedButton4();
	afx_msg void OnBnClickedButton5();
	CButton m_apagar;
	CButton m_novo;
};

Arquivo .cpp


// CamposcppDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Camposcpp.h"
#include "CamposcppDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

CCamposcppDlg::CCamposcppDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CCamposcppDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CCamposcppDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_EDIT6, m_pesquisa);
	DDX_Control(pDX, IDC_EDIT1, m_codigo);
	DDX_Control(pDX, IDC_EDIT2, m_pnome);
	DDX_Control(pDX, IDC_EDIT3, m_snome);
	DDX_Control(pDX, IDC_EDIT4, m_cargo);
	DDX_Control(pDX, IDC_EDIT5, m_salario);
	DDX_Control(pDX, IDC_BUTTON5, m_apagar);
	DDX_Control(pDX, IDC_BUTTON2, m_novo);
}

BEGIN_MESSAGE_MAP(CCamposcppDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, &CCamposcppDlg::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON2, &CCamposcppDlg::OnBnClickedButton2)

ON_WM_SHOWWINDOW()
ON_BN_CLICKED(IDC_BUTTON3, &CCamposcppDlg::OnBnClickedButton3)
ON_BN_CLICKED(IDC_BUTTON4, &CCamposcppDlg::OnBnClickedButton4)
ON_BN_CLICKED(IDC_BUTTON5, &CCamposcppDlg::OnBnClickedButton5)
END_MESSAGE_MAP()

BOOL CCamposcppDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	SetIcon(m_hIcon, TRUE);
	SetIcon(m_hIcon, FALSE);
	return TRUE;
}

void CCamposcppDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); 

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

HCURSOR CCamposcppDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

// ************************         Desenvolvimento Aberto
// Nosso código começa aqui

void CCamposcppDlg::conectarDB(CString banco)
{
	// Cria string de conexão
	CString dns, usuario, senha;

	// Define banco de dados
	if (banco == "oracle")
	{
		dns = L"OracleXE";
		usuario = L"daberto";
		senha = L"p@55w0rd";
	}

	if (banco == "db2")
	{
		dns = L"IBMDB2";
		usuario = L"db2admin";
		senha = L"p@55w0rd";
	}

	if (banco == "mssql")
	{
		dns = L"MSSQLSERVER";
		usuario = L"devaberto";
		senha = L"p@55w0rd";
	}

	// Cria string de conexão ODBC
	CString conexao;

	// Cria string de conexão
	conexao = L"DSN=" + dns + L";UID=" + usuario + L";PWD=" + senha;

	// Abre conexão
	db.OpenEx(conexao, 0);
}

void CCamposcppDlg::OnBnClickedButton1()
{
	// Define variaveis
	CString codigo;
	CString m_campo;

	// Referincia objeto statico
	CWnd * p_rotulo;

	// Associa objeto statico
	p_rotulo = GetDlgItem(IDC_Rotulo);
	p_rotulo->SetWindowTextW(L"Database - Fields - " + m_db);

	// Conecta ao banco de dados
	conectarDB(m_db);

	// Cria um set de dados
	CRecordset  dados(&db);

	// Cria pesquisa
	m_pesquisa.GetWindowTextW(codigo);

	dados.Open(CRecordset::forwardOnly,
		L"Select * From FUNCIONARIOS Where  ID_FUNCIONARIO = " + codigo);

	// Retorna dados por nome de campo e os exibe
	// Oracle e o DB2 transformam os nomes de campos para maiusculo,
	// basta efetuar um select na tabela de cada banco e você verá
	// O MSSQL não faz esta mudança sendo assim você precisa mudar os campos
	// do banco de dados MSSQL para que fique compativel com o ORACLE e DB2 ou
	// encontrará um erro ao tentar utilizar a tabela que criamos anteriormente.
	dados.GetFieldValue(L"ID_FUNCIONARIO", m_campo);
	m_codigo.SetWindowTextW(m_campo);

	dados.GetFieldValue(L"NOME", m_campo);
	m_pnome.SetWindowTextW(m_campo);

	dados.GetFieldValue(L"SOBRENOME", m_campo);
	m_snome.SetWindowTextW(m_campo);

	dados.GetFieldValue(L"CARGO", m_campo);
	m_cargo.SetWindowTextW(m_campo);

	dados.GetFieldValue(L"SALARIO", m_campo);
	m_salario.SetWindowTextW(m_campo);

	// Fecha o set de dados e a conexão
	dados.Close();
	db.Close();

}

void CCamposcppDlg::OnBnClickedButton2()
{
	// Limpa componentes
	m_codigo.SetWindowTextW(NULL);
	m_pnome.SetWindowTextW(NULL);
	m_snome.SetWindowTextW(NULL);
	m_cargo.SetWindowTextW(NULL);
	m_salario.SetWindowTextW(NULL);

	// Define foco
	CEdit* pesquisa;
	pesquisa = (CEdit*)GetDlgItem(IDC_EDIT1);
	GotoDlgCtrl(pesquisa);

}

void CCamposcppDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
	CDialogEx::OnShowWindow(bShow, nStatus);

	// Define foco inicial
	CEdit* pesquisa;
	pesquisa = (CEdit*)GetDlgItem(IDC_EDIT6);
	GotoDlgCtrl(pesquisa);
}

// Cria método de menssagem
int menssagem(bool correto, LPCWSTR texto)
{
	LPCWSTR msg;

	if (correto)
	{
		msg = texto;
	}
	else
	{
		msg = texto;
	}

	// Cria nova caixa de menssagens
	int msgboxID = MessageBox(
		NULL,
		msg,
		(LPCWSTR)L"Conexão",
		MB_ICONWARNING | MB_OK | MB_DEFBUTTON2
		);

	switch (msgboxID)
	{
	case IDOK:

		break;
	}

	return msgboxID;
}

// Clique do botão inserir
void CCamposcppDlg::OnBnClickedButton3()
{
	// Define variaveis para componentes
	CString codigo;
	CString pnome;
	CString snome;
	CString cargo;
	CString salario;

	// conecta ao banco de dados
	conectarDB(m_db);

	// Recupara texto dos componentes
	m_codigo.GetWindowTextW(codigo);
	m_pnome.GetWindowTextW(pnome);
	m_snome.GetWindowTextW(snome);
	m_cargo.GetWindowTextW(cargo);
	m_salario.GetWindowTextW(salario);

	// Troca ponto decimal para o banco de dados
	int i = salario.Replace(L",", L".");

	// Cria instrução SQL
	CString sql = L"Insert into FUNCIONARIOS values ( " +  codigo + ", " +
		"'" + pnome + "', " +
		"'" + snome + "', " +
		"'" + cargo + "', " +
		salario + ")";

	// Executa SQL
	try
	{
		db.ExecuteSQL(sql);
		menssagem(true, L"Dados inseridos com sucesso!");
		db.Close();
	}
	catch (CDBException* pe)
	{
		menssagem(false, L"Erro ao inserir dados.");
		db.Close();
	}	

}

// botão Updata
void CCamposcppDlg::OnBnClickedButton4()
{
	CString codigo;
	CString pnome;
	CString snome;
	CString cargo;
	CString salario;
	CString troca;

	conectarDB(m_db);

	m_codigo.GetWindowTextW(codigo);
	m_pnome.GetWindowTextW(pnome);
	m_snome.GetWindowTextW(snome);
	m_cargo.GetWindowTextW(cargo);
	m_salario.GetWindowTextW(salario);

	int i = salario.Replace(L",", L".");

	CString sql = L"Update FUNCIONARIOS set ID_FUNCIONARIO =  " + codigo + ", " +
		"NOME = '" + pnome + "', " +
		"SOBRENOME  = '" + snome + "', " +
		"CARGO = '" + cargo + "', " +
		"SALARIO = " + salario + " " +
		"Where ID_FUNCIONARIO = " + codigo;

	try
	{
		db.ExecuteSQL(sql);
		menssagem(true, L"Dados alterados com sucesso!");
		db.Close();
	}
	catch (CDBException* pe)
	{
		menssagem(false, (LPWSTR)pe);
		db.Close();
	}
}

void CCamposcppDlg::OnBnClickedButton5()
{
	CString codigo;
	conectarDB(m_db);

	m_codigo.GetWindowTextW(codigo);

	CString sql = L"Delete From FUNCIONARIOS Where ID_FUNCIONARIO =  " + codigo;

	try
	{
		db.ExecuteSQL(sql);

		// Executa clique do botão novo
		// crie variavel m_novo
		SendMessage(WM_COMMAND, MAKEWPARAM(IDC_BUTTON2, BN_CLICKED), (LPARAM)m_novo.m_hWnd);

		menssagem(true, L"Dados apagados com sucesso!");
		db.Close();
	}
	catch (CDBException* pe)
	{
		menssagem(false, L"Erro ao apagar dados.");
		db.Close();
	}
}

Na linguagem de programação C# podemos utilizar a instrução ExecuteNonQuery para executar uma instrução SQL estática e retornar os resultados produzidos.

C# - Database

C# – Database

Visual Studio

Crie um design como na figura abaixo, utilizando 3 Panels, 7 Labels, 6 TextBox e 5 Buttons:

C# - Design

C# – Design

Exemplo:

No programa abaixo utilizamos 3 drivers ADO.NET para criar uma query para executar as quatro operações básicas sobre diferentes bancos de dados.

C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using Oracle.DataAccess.Client;
using IBM.Data.DB2;

namespace DACampos
{

    public partial class Campos : Form
    {
        // Declara componentes de conexão
        private static OracleConnection connORA; // ODAC 12c
        private static DB2Connection connDB2;   // IBM Data Server Provider
        private static SqlConnection connMSSQL; // ADO .NET

        // Declara variável do banco de dados
        private static string DBconexao;

        public Campos()
        {
            InitializeComponent();
        }

        // Cria método de conexão
        public void conectarDB(string banco)
        {
            DBconexao = banco;

            if (banco == "oracle")
            {

                try
                {
                    // String de Conexao
                    string connectionString =

                    // Usuario
                    "User Id=daberto"+

                    // Senha
                    ";Password=p@55w0rd" +

                    // TNSnames
                    ";Data Source=XE";

                    //Conecta ao datasource usando a conexão Oracle
                    connORA = new OracleConnection(connectionString);

                    //Abre a conexão com o banco de dados
                    connORA.Open();
                }
                    // Retorna erro
                catch (Exception ex)
                {
                    // Mostra menssagem de erro
                    MessageBox.Show(ex.ToString());
                }
            }

            if (banco == "db2")
            {
                try
                {
                    // String de Conexao
                    string connectionString =

                        // Servidor
                        "Server=localhost" + 

                        // Banco de dados
                        ";Database=DEVA" +

                        // Usuario
                        ";UID=db2admin" + 

                        // Senha
                        ";PWD=p@55w0rd" + 

                        // Timeout
                        ";Connect Timeout=40";

                    //Conecta ao datasource usando a conexão DB2
                    connDB2 = new DB2Connection(connectionString);

                    //Abre a conexão com o banco de dados
                    connDB2.Open();

                }
                // Retorna erro
                catch (Exception ex)
                {
                    // Mostra menssagem de erro
                    MessageBox.Show(ex.ToString());

                }

            }

            if (banco == "mssql")
            {
                try
                {
                    // String de Conexao
                    string connectionString =

                        // Servidor
                        "Data Source=localhost" + 

                        // Banco de dados
                        ";Initial Catalog=DevAberto" +

                        // Usuario
                        ";User ID =devaberto" + 

                        // Senha
                        ";Password=p@55w0rd" +

                        // Timeout
                        ";Connect Timeout=40";

                    //Conecta ao datasource usando a conexão Padrão
                    connMSSQL = new SqlConnection(connectionString);

                    //Abre a conexão com o banco de dados
                    connMSSQL.Open();

                }
                // Retorna erro
                catch (Exception ex)
                {
                    // Mostra menssagem de erro
                    MessageBox.Show(ex.ToString());

                }

            }

        }

        // Evento de clique do botão
        private void button1_Click(object sender, EventArgs e)
        {
            // Cria instancia do objeto
            Campos campos = new Campos();

            // A variável abaixo:
            // Define banco de dados
            // oracle = Oracle Database
            // db2    = IBM DB2 Database
            // mssql  = Microsoft SQL Server
            campos.conectarDB("mssql");

            // Define instrução SQL
            string sql = "Select * From FUNCIONARIOS Where  ID_FUNCIONARIO = " + textBox6.Text;

            // Usando um procedimento de conexão para o driver especifico.

            // Oracle - ODAC
            if (DBconexao == "oracle")
            {
                label1.Text = "Database - fields : " + DBconexao;

                OracleCommand oracmd = new OracleCommand(sql, connORA);
                OracleDataReader orareader = oracmd.ExecuteReader();

                if (orareader.HasRows)
                {
                    while (orareader.Read())
                    {
                        textBox1.Text = Convert.ToString(orareader.GetInt32(0));
                        textBox2.Text = orareader.GetString(1);
                        textBox3.Text = orareader.GetString(2);
                        textBox4.Text = orareader.GetString(3);
                        textBox5.Text = Convert.ToString(orareader.GetDecimal(4));
                    }
                }

            }

            // IBM Data Server Provider
            if (DBconexao == "db2")
            {
                label1.Text = "Database - fields : " + DBconexao;

                DB2Command db2cmd = new DB2Command(sql);
                db2cmd.Connection = connDB2;
                DB2DataReader db2reader = db2cmd.ExecuteReader();

                if (db2reader.HasRows)
                {
                    while(db2reader.Read())
                    {
                        textBox1.Text = Convert.ToString(db2reader.GetInt32(0));
                        textBox2.Text = db2reader.GetString(1);
                        textBox3.Text = db2reader.GetString(2);
                        textBox4.Text = db2reader.GetString(3);
                        textBox5.Text = Convert.ToString(db2reader.GetDecimal(4));
                    }
                }

            }

            // microsoft ADO.NET
           if (DBconexao == "mssql")
           {
               label1.Text = "Database - fields : " + DBconexao;

               SqlCommand mssqlcmd = new SqlCommand(sql);
               mssqlcmd.Connection = connMSSQL;
               SqlDataReader mssqlreader = mssqlcmd.ExecuteReader();

               if (mssqlreader.HasRows)
               {
                   while (mssqlreader.Read())
                   {
                       textBox1.Text = Convert.ToString(mssqlreader.GetInt32(0));
                       textBox2.Text = mssqlreader.GetString(1);
                       textBox3.Text = mssqlreader.GetString(2);
                       textBox4.Text = mssqlreader.GetString(3);
                       textBox5.Text = Convert.ToString(mssqlreader.GetDecimal(4));
                   }
               }

               // Aqui nota-se uma diferença entre os drivers:
               // Microsoft, Oracle e IBM
               // ADO.NET É necessário fechar o DataReader antes de executar um sqlcommand.
               // ODAC não é necessário.
               // IBM DATA Server não é necessário.

               // Enquanto o DataReader está em uso, 
               // o Connection associado está ocupado servindo o DataReader.
               // Enquanto estiver neste estado, 
               // nenhuma outra operação pode ser realizada sobre o Connection além de fechá-lo.
               // Os drivers da Oracle e IBM não possuem esta arquitetura e não ocupam a conexão
               // permitindo ainda múltiplas operações sobre ela.

               mssqlreader.Close();
           }
        }

        private static void executaSQL(string sql)
        {
            // Declara comandos em diferentes drivers
            OracleCommand oracmd;
            DB2Command db2cmd;
            SqlCommand sqlcmd;

            // Define banco de dados e executa comandos SQL
            if (DBconexao == "oracle")
            {
                oracmd = new OracleCommand();
                oracmd.Connection = connORA;
                oracmd.CommandText = sql;

                try
                {
                    oracmd.ExecuteNonQuery();
                    MessageBox.Show("Ação requerida executada com sucesso!");
                }
                catch (Exception ex)
                {
                    // Mostra menssagem de erro
                    MessageBox.Show(ex.ToString());
                }

            }

            if (DBconexao == "db2")
            {
                db2cmd = new DB2Command();
                db2cmd.Connection = connDB2;
                db2cmd.CommandText = sql;
                try
                {
                    db2cmd.ExecuteNonQuery();
                    MessageBox.Show("Ação requerida executada com sucesso!");
                }
                catch (Exception ex)
                {
                    // Mostra menssagem de erro
                    MessageBox.Show(ex.ToString());
                }
            }

            if (DBconexao == "mssql")
            {
                sqlcmd = new SqlCommand();
                sqlcmd.Connection = connMSSQL;
                sqlcmd.CommandText = sql;

                try
                {
                    sqlcmd.ExecuteNonQuery();
                    MessageBox.Show("Ação requerida executada com sucesso!");
                }
                catch (Exception ex)
                {
                    // Mostra menssagem de erro
                    MessageBox.Show(ex.ToString());
                }
            }           

        }

        private static String trocaDecimal(string conteudo)
        {
            // Substitui decimal na manipulação de SQL
            string troca = conteudo.Replace(",", ".");
            return troca;
        }

        // Novo registro
        private void button2_Click(object sender, EventArgs e)
        {
            // Limpa componentes
            textBox1.Text = null;
            textBox2.Text = null;
            textBox3.Text = null;
            textBox4.Text = null;
            textBox5.Text = null;

            // Define foco
            textBox1.Focus();
        }

        // Insere registro
        private void button3_Click(object sender, EventArgs e)
        {
            // Cria instrução SQL
            string  sql = "Insert into FUNCIONARIOS values (" +
                textBox1.Text + ", \'" +
                textBox2.Text + "\', \'" +
                textBox3.Text + "\', \'" +
                textBox4.Text + "\', " +
                trocaDecimal(textBox5.Text) + ")";

            // Executa sql
            executaSQL(sql);
        }

        // Altera registro
        private void button4_Click(object sender, EventArgs e)
        {
            // Cria instrução SQL
            string sql = "Update FUNCIONARIOS SET " +
                            "ID_FUNCIONARIO = " + textBox1.Text + ", " +
                            "NOME = \'" + textBox2.Text + "\', " +
                            "SOBRENOME = \'" + textBox3.Text + "\', " +
                            "CARGO = \'" + textBox4.Text + "\', " +
                            "SALARIO = " + trocaDecimal(textBox5.Text) + " " +
                            "Where ID_FUNCIONARIO = " + textBox1.Text;

            // Executa sql
            executaSQL(sql);
        }

        // Deleta registro
        private void button5_Click(object sender, EventArgs e)
        {
            // Cria instrução SQL
            string sql = "Delete from FUNCIONARIOS Where ID_FUNCIONARIO = " + textBox1.Text;

            // Executa sql
            executaSQL(sql);
            // Executa clique no botão
            button2.PerformClick();
        }
    }
}

Na linguagem de programação Java podemos utilizar a classe Statament para criar um objeto usado para executar uma instrução SQL estática e retornar os resultados produzidos.

Java - Oracle - DB2 - MSSQL

Java – Oracle – DB2 – MSSQL

Exemplo:

No programa abaixo utilizamos uma única query para executar as quatro operações básicas sobre diferentes bancos de dados.

Java

import java.awt.ComponentOrientation;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;

public class Campos implements ActionListener {
	// Declara componentes
	private JLabel ltitulo;
	private JLabel lid;
	private JLabel lpnome;
	private JLabel lsnome;
	private JLabel lcargo;
	private JLabel lsalario;
	private JLabel lpesquisa;

	private JTextField tid;
	private JTextField tpnome;
	private JTextField tsnome;
	private JTextField tcargo;
	private JTextField tsalario;
	private JTextField tpesquisa;

	private JButton botao;
	private JButton alterar;
	private JButton inserir;
	private JButton deletar;
	private JButton novo;

	private Border borda;

	private JFrame menssagem;

	// Declara objetos de conexão
	private static Connection conn;
	private static Statement query;

	// Declara variaveis
	private static String bconexao;

	// Cria conexão
	public void conectar(String banco) {

		// Verifica strings de conexão

		// ORACLE
		if (banco == "oracle") {
			try {
				// Define Driver de conexão JDBC thin
				Class.forName("oracle.jdbc.driver.OracleDriver");
				conn = DriverManager.getConnection(
						"jdbc:oracle:thin:@localhost:1521:xe", "daberto",
						"p@55w05d");

				// Executa pedido SQL
				query = conn.createStatement();

			}

			catch (ClassNotFoundException ex) {
				ex.printStackTrace();
			}

			catch (SQLException ex) {
				ex.printStackTrace();
			}
		}

		// DB2
		if (banco == "db2") {
			try {
				// Define Driver de conexão JDBC
				Class.forName("com.ibm.db2.jcc.DB2Driver");
				conn = DriverManager.getConnection(
						"jdbc:derby:net://localhost:50000/deva", "db2admin",
						"p@55w05d");

				// Executa pedido SQL
				query = conn.createStatement();
				// JOptionPane.showMessageDialog(menssagem,
				// "Conexão Efetuada com sucesso!");
			}

			catch (ClassNotFoundException ex) {
				ex.printStackTrace();
			}

			catch (SQLException ex) {
				// JOptionPane.showMessageDialog(menssagem, "Erro na conexão!");
				ex.printStackTrace();
			}

		}

		// MICROSOFT SQL SERVER
		if (banco == "mssql") {
			try {
				// Define Driver de conexão JDBC
				String URL = "jdbc:sqlserver://localhost\\SQLEXPRESS:1433;databaseName=devaberto"
						+ ";user=devaberto;password=p@55w05d";

				Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
				conn = DriverManager.getConnection(URL);

				// Executa pedido SQL
				query = conn.createStatement();

			}

			catch (ClassNotFoundException ex) {
				ex.printStackTrace();
			}

			catch (SQLException ex) {
				ex.printStackTrace();
			}

		}

	}

	// Retorna funcionario
	public ResultSet retornaFuncionarioId(String codigo) throws SQLException {
		// Cria uma nova conexão
		Statement query;
		query = conn.createStatement();
		String sql;

		// Verfica banco de dados e passa script SQL

		sql = "Select * From FUNCIONARIOS Where  ID_FUNCIONARIO = " + codigo;

		// Executa Script
		ResultSet dados = query.executeQuery(sql);

		// Retorna set de dados
		return dados;
	}

	public Container criaPainel() {
		// cria painel
		JPanel painel = new JPanel();
		painel.setLayout(new FlowLayout());
		painel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
		painel.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
		// Cria titulo
		ltitulo = new JLabel("Database - Fields -Sem conexão");

		painel.add(ltitulo);
		painel.add(Box.createVerticalStrut(60));

		// Cria painel de usuario
		JPanel painelDados = new JPanel(new GridLayout(0, 2, 10, 10));

		// Cria componentes
		lid = new JLabel("Código:");
		lpnome = new JLabel("Primeiro Nome:");
		lsnome = new JLabel("Sobrenome:");
		lcargo = new JLabel("Cargo:");
		lsalario = new JLabel("Salário:");

		tid = new JTextField();
		tpnome = new JTextField();
		tsnome = new JTextField();
		tcargo = new JTextField();
		tsalario = new JTextField();

		tid.setPreferredSize(new Dimension(150, 20));
		
                  // Adiciona componentes no painel
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(lid);
		painelDados.add(tid);
		painelDados.add(lpnome);
		painelDados.add(tpnome);
		painelDados.add(lsnome);
		painelDados.add(tsnome);
		painelDados.add(lcargo);
		painelDados.add(tcargo);
		painelDados.add(lsalario);
		painelDados.add(tsalario);
		painelDados.add(Box.createVerticalStrut(10));
		painelDados.add(Box.createVerticalStrut(10));

		// Cria painel de pesquisa
		JPanel painelPesquisa = new JPanel(new GridLayout(0, 3, 10, 10));
		borda = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
		painelPesquisa.setBorder(borda);

		// Cria pesquisas
		lpesquisa = new JLabel("Pesquisa código:");
		tpesquisa = new JTextField();
		botao = new JButton("Pesquisar");
		botao.addActionListener(this);

		// Define foco do cursor no campo de pesquisa
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				tpesquisa.requestFocus();
			}
		});

		// Adiciona compoentes ao painel de pesquisa
		painelPesquisa.add(lpesquisa);
		painelPesquisa.add(tpesquisa);
		painelPesquisa.add(botao);

		// Cria painel de pesquisa
		JPanel painelAcao = new JPanel(new GridLayout(0, 4, 10, 10));
		borda = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
		painelAcao.setBorder(borda);

		// Cria botões de manipulação de banco
		novo = new JButton("Novo");
		inserir = new JButton("Inserir");
		alterar = new JButton("Alterar");
		deletar = new JButton("Apagar");

		// Cria ouvintes de eventos
		novo.addActionListener(this);
		inserir.addActionListener(this);
		alterar.addActionListener(this);
		deletar.addActionListener(this);

		// Insere componentes em um painel 
		painelAcao.add(novo);
		painelAcao.add(inserir);
		painelAcao.add(alterar);
		painelAcao.add(deletar);

		// Adiciona paineis
		painel.add(painelPesquisa);
		painel.add(painelDados);
		painel.add(painelAcao);

		return painel;
	}

	// Clique do botão de pesquisa
	public void actionPerformed(ActionEvent arg0) {

		// Verifica pesquisa
		if (arg0.getSource() == botao) {

			// Cria instancia de objeto
			Campos campos = new Campos();
			
			// retorna result de dados
			try {
				ResultSet dados = campos.retornaFuncionarioId(tpesquisa
						.getText());
				ltitulo.setText("Database - Fields - " + bconexao);

				// Preenche campos da tela
				while (dados.next()) {
					tid.setText(dados.getString("ID_FUNCIONARIO"));
					tpnome.setText(dados.getString("NOME"));
					tsnome.setText(dados.getString("SOBRENOME"));
					tcargo.setText(dados.getString("CARGO"));
					tsalario.setText(dados.getString("SALARIO"));
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		

		// Botão Novo
		if (arg0.getSource() == novo) {
			tid.setText(null);
			tpnome.setText(null);
			tsnome.setText(null);
			tcargo.setText(null);
			tsalario.setText(null);

			javax.swing.SwingUtilities.invokeLater(new Runnable() {
				public void run() {
					tid.requestFocus();
				}
			});

		}

		// Insere dados
		if (arg0.getSource() == inserir) {
			String sql = "Insert into FUNCIONARIOS "
					+ " (ID_FUNCIONARIO, NOME, SOBRENOME, CARGO, SALARIO) "
					+ "values (" + tid.getText() + ", " + "\'"
					+ tpnome.getText() + "\', " + "\'" + tsnome.getText()
					+ "\', " + "\'" + tcargo.getText() + "\', "
					+ tsalario.getText() + ")";

			try {
				query.execute(sql);
				JOptionPane.showMessageDialog(menssagem,
						"Dados inserido com sucesso!");
			} catch (SQLException e) {
				JOptionPane.showMessageDialog(menssagem, e.toString());
				e.printStackTrace();
			}

		}

		// Altera dados
		if (arg0.getSource() == alterar) {
			String sql = "Update FUNCIONARIOS SET " + "ID_FUNCIONARIO = "
					+ tid.getText() + ", " + "NOME = \'" + tpnome.getText()
					+ "\', " + "SOBRENOME = \'" + tsnome.getText() + "\', "
					+ "CARGO = \'" + tcargo.getText() + "\', " + "SALARIO = "
					+ tsalario.getText() + " " + "Where " + "ID_FUNCIONARIO = "
					+ tpesquisa.getText();

			try {
				query.execute(sql);
				JOptionPane.showMessageDialog(menssagem,
						"Dados alterados com sucesso!");
			} catch (SQLException e) {
				JOptionPane.showMessageDialog(menssagem, e.toString());
				e.printStackTrace();
			}
		}

		// Deleta dados
		if (arg0.getSource() == deletar) {
			String sql = "Delete from FUNCIONARIOS WHERE ID_FUNCIONARIO = "
					+ tid.getText();

			try {
				query.execute(sql);
				JOptionPane.showMessageDialog(menssagem,
						"Dados Apagados com sucesso!");
				novo.doClick();
			} catch (SQLException e) {
				JOptionPane.showMessageDialog(menssagem, e.toString());
				e.printStackTrace();
			}
		}

	}

	public static void criaGUI() {
		// Cria formulario
		JFrame formulario = new JFrame("Desenvolvimento Aberto");
		formulario.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// cria painel de conteudo
		Campos acesso = new Campos();
		// conecta ao banco de dados defindo
		// mude a variavel bconexao para escolher o banco de dados
		// importe os drivers para o projeto
		// oracle = ORACLE
		// db2 = IBM DB2
		// mssql = MSSQL Server

		bconexao = "oracle";
		acesso.conectar(bconexao);
		formulario.setContentPane(acesso.criaPainel());

		// Exibe o formulario
		formulario.setSize(400, 450);
		formulario.setVisible(true);

	}

	public static void main(String[] args) {

		javax.swing.SwingUtilities.invokeLater(new Runnable() {

			@Override
			public void run() {

				// Mostra GUI
				criaGUI();

			}
		});

	}

}

Nosso objetivo é entender o conceito da arquitetura de software MVC na construção de um website atrelado a uma conexão com um banco de dados para exibir dados armazenados em tabelas, visto que está apresentação é voltada para sistema operacional Linux, mas vale ressaltar que o seu conteúdo é multi-plataformas, este modelo pode ser portado para Windows, Mac OS X e qualquer outra plataforma que suporte a linguagem de programação Ruby on Rails.

Model – View – Controller

Por padrão um projeto denominado Rails, possui a arquitetura MVC e este projeto pode ser criado de varias formas diferentes, em nosso caso vamos utilizar a IDE de desenvolvimento chamada Aptana Studio 3.

1 – Primeiro precisamos de um banco de dados MySQL, abra o MySQL WorkBench e crie e adicione os diretos adequados ao banco de dados DAprod.

Cria Database

Cria Database

2 – Abra a IDE Aptana e crie um novo projeto do tipo Rails, o nomeie de DA-Solution e marque o botão de radio chamado I´ll Generate my own code. Abra uma nova janela do terminal dentro da IDE Aptana utilizando a barra de ferramentas.

Solução - Projeto - Rails

Solução – Projeto – Rails

3 -Utilizaremos este primeiro projeto como uma solução e é preciso criar um novo projeto Rails para nosso website, na janela inferior do terminal digite os seguintes comandos:

Cria Projeto


rails new DA-Rails -d mysql
cd Da-Rails

Cria o Controller e a View (Controlador e Visão)

rails g controller empresas index

Cria o Model (Modelo)

rails g model empresa codigo:integer nome:string site:string

Cria a migração (Tabela no banco de dados)

rake db:migrate

Inicia o servidor Rails

rails server

4 – Configure o arquivo database.yml encontrado na pasta config e abra o browser e digite o endereço padrão do seu website: http://localhost:3000/empresas/index. Use o arquivo do mesmo nome logo abaixo para referencias de login com o banco de dados.

Website MVC Padrão

Website MVC Padrão

5 – Volte ao MySQL WorkBench. Para um melhor entendimento, vamos inserir as dados manualmente, visto que a tabela já foi criada automaticamente quando utilizamos o comando rake db:migrate. Insira as linhas de dados utilizando a segunda parte do script abaixo.

Inserindo Dados

Inserindo Dados

6 – De volta a IDE Aptana, agora vamos modificar os arquivos de controle e visão para exibir os dados referentes a migração do modelo, para isto utilize os códigos Ruby e Html encontrados abaixo para preencher seu arquivo de controle e sua visão e atualize o website.

Website - MVC - Dados

Website – MVC – Dados

Exemplo:

Neste exemplo criamos um website que possui uma pagina desenvolvida na arquitetura MVC e exibe dados contidos em um base da dados MySQL.

MySQL

Script – Criar banco de dados e direitos adequados

-- Cria banco de dados
Create database DAprod;

-- Cria privilegios para o usuário root
Grant all privileges on DAprod.*
to 'root'@'localhost' identified by 'p@55w0rd';

-- nivela privilegios
FLUSH PRIVILEGES;

-- Use está parte do script após criar o MODEL
-- Coloca o banco de dados em uso
use DAprod;
-- Mostra tabela criada pela migração
select * from empresas;

-- Insere dados
insert into empresas values
 (1, 1, 'Desenvolvimento Aberto',
        'https://desenvolvimentoaberto.wordpress.com/', CURDATE(), null);

insert into empresas values
 (2, 2, 'Desenvolvimento Aberto Tools',
        'http://desenvolvimentoabertotools.wordpress.com/', CURDATE(), null);

insert into empresas values
 (3, 3, 'Desenvolvimento Aberto ERP',
        'Em desenvolvimento - V1.0 - Alpha indisponivel', CURDATE(), null);

Arquivo de Conexão Ruby on Rails – database.yml

# MySQL.  Versions 5.0+ are recommended.
#
# Install the MYSQL driver
#   gem install mysql2
#
# Ensure the MySQL gem is defined in your Gemfile
#   gem 'mysql2'
#
# And be sure to use new-style password hashing:
#   http://dev.mysql.com/doc/refman/5.0/en/old-client.html
#
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: p@55w0rd
  socket: /var/run/mysqld/mysqld.sock

development:
  <<: *default
  database: DAprod

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: DA-Rails_test

# As with config/secrets.yml, you never want to store sensitive information,
# like your database password, in your source code. If your source code is
# ever seen by anyone, they now have access to your database.
#
# Instead, provide the password as a unix environment variable when you boot
# the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database
# for a full rundown on how to provide these environment variables in a
# production deployment.
#
# On Heroku and other platform providers, you may have a full connection URL
# available as an environment variable. For example:
#
#   DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase"
#
# You can use this database configuration with:
#
#   production:
#     url: <%= ENV['DATABASE_URL'] %>
#
production:
  <<: *default
  database: DA-Rails_production
  username: DA-Rails
  password: <%= ENV['DA-RAILS_DATABASE_PASSWORD'] %>

Arquivo – Controle – empresas_controller.rb

class EmpresasController < ApplicationController
  def index
    @empresas = Empresa.all
  end
end

Arquivo – Visão – index.html.erb

<h2>Desenvolvimento Aberto</h2>
<p>Lista de Blogs e Projetos Open Source</p>
<pre>
<table width="500">
<tr>
	<th>Cod:</th>
	<th>&nbsp;&nbsp;</th>
	<th>Empresa:</th>
	<th>&nbsp;&nbsp;</th>
	<th>Site:</th>
</tr>
<% @empresas.each do |empresa| %>

<tr>
<td><%= empresa.codigo%> </td>
<td>&nbsp;&nbsp;</td>
<td><%= empresa.nome%> </td>
<td>&nbsp;&nbsp;</td>
<td><%= empresa.site%> </td>
</tr>

<%end%>
</table>
</pre>