Arquivo de maio, 2014

Model-view-controller (MVC), em português modelo-visão-controlador, é um modelo de arquitetura de software que separa a representação da informação da interação do usuário. O modelo (model) consiste nos dados da aplicação, regras de negócios, lógica e funções. Uma visão (view) pode ser qualquer saída de representação dos dados, como uma tabela ou um diagrama. É possível ter várias visões do mesmo dado, como um gráfico de barras para gerenciamento e uma visão tabular para contadores. O controlador (controller) faz a mediação da entrada, convertendo-a em comandos para o modelo ou visão. As ideias centrais por trás do MVC são a reusabilidade de código e separação de conceitos.

O que é Ruby?

Segundo os seus autores, a linguagem de programação Ruby foi influenciada pelo Perl, Smalltalk, Eiffel, Ada, e Lisp. Ruby suporta múltiplos paradigmas de programação, incluindo o funcional, orientada a objetos, e imperativo. Ruby também possui um sistema de tipo dinâmico e gerenciamento automático de memória. A sintaxe e alguns comandos do Ruby são parecidos com o Python.

O que é Rails ?

Rails é um framework de desenvolvimento de aplicações web escrito na linguagem Ruby. Ele é projetado para tornar os aplicativos de programação web mais fáceis, fazendo suposições sobre o que cada desenvolvedor precisa para começar. Ele permite que você escreva menos código enquanto faz mais do que muitas outras linguagens e frameworks. Desenvolvedores Rails experientes também relatam que torna o desenvolvimento de aplicações web mais divertido.

Hello World Rails!

Para criar sua primeira aplicação Ruby on Rails siga os seguintes passos:

1 – Abra a IDE Aptana Studio 3 e crie um novo projeto do tipo Rails chamado Demo-Rails, caso questionado utilize a senha de root para a criação do projeto:

Demo-Rails - Projeto

Demo-Rails – Projeto

2 – Após criar o projeto, na janela inferior, no prompt do Rails, digite o seguinte comando:


rails g controller hello

Cria Controle - MVC

Cria Controle – MVC

3 – No arquivo hello_controller.rb digite o código abaixo, na pasta app/view/hello crie um novo arquivo chamado index.html.erb e o preencha com o código html logo abaixo:

Html - Visão - MVC

Html – Visão – MVC

4 – Na pasta config, abra o arquivo chamado routes.rb e insira a linha abaixo:


resources :hello

Configuração - recursos

Configuração – recursos

5 – Agora você precisa iniciar o servidor Rails, digite no console:


rails server

Inicia Servidor

Inicia Servidor

6 – Para testar o seu servidor abra o seu browser e digite: localhost:3000.

Teste - Servidor - Rails

Teste – Servidor – Rails

7 – Para testar sua aplicação digite /hello após o endereço do seu servidor no browser.

Hello World Rails!

Hello World Rails!

Exemplo:

Neste exemplo utilizamos o modelo MVC para criar uma aplicação Ruby on Rails.

Ruby

Arquivo – hello_controller.rb

class HelloController < ApplicationController
   def index()

   end
end

Arquivo – index.html.erb

<!DOCTYPE html>
<html>
 <head>
   <title>Desenvolvimento Aberto</title>
</head>

<body>

<h1>Desenvolvimento Aberto</h1>
<br>
<p>Hello World Rails!!!</p>

</body>
</html>
Anúncios

Ruby on Rails

É um framework livre que promete aumentar velocidade e facilidade no desenvolvimento de sites orientados a banco de dados, uma vez que é possível criar aplicações com base em estruturas pré-definidas. Frequentemente referenciado como Rails ou RoR, o Ruby on Rails é um projeto de código aberto escrito na linguagem de programação Ruby. As aplicações criadas utilizando o framework Rails são desenvolvidas com base no padrão de arquitetura MVC (Model-View-Controller).

Além do Ruby vamos instalar o servidor web Apache, o banco de dados MYSQL, a ferramenta visual de manipulação do banco de dados MySQL Workbench, a IDE para Ruby on Rails chamada Aptana e ferramentas necessárias para a instalação do RoR.

Instalação dos Aplicativos

Para instalar somente o Ruby:

sudo apt-get install ruby

Ruby: https://www.ruby-lang.org/en/documentation/installation/

 

Para instalar o pacote de aplicativos contendo os softwares descritos acima abra o Terminal e digite os seguintes comandos:

sudo apt-get install ruby-dev

sudo apt-get install apache2

sudo apt-get install mysql-server

sudo apt-get install mysql-workbench

sudo apt-get install libmysqlclient-dev

sudo apt-get install sqlite3 libsqlite3-dev

sudo apt-get install libwebkitgtk-1.0-0

sudo apt-get install nodejs

sudo apt-get install rails

sudo gem install jquery-rails

sudo gem install coffee-rails

sudo gem install sqlite3

sudo gem install mysql

sudo gem install mysql2

sudo gem install bundler

Ubuntu

1 – Instalação MySQL, durante a instalação escolha uma senha de root:

 

MySQL - Instalar

MySQL – Instalar

2 – Instalação MySQL Workbench:

MySQL WorkBench

MySQL WorkBench

3 – Teste a conexão com o MySQL na ferramenta MySQL Workbench clicando no menu Database:

Conexão - OK

Conexão – OK

4 – Baixe o Aptana clicando aqui, descompacte em uma pasta e abra o seu executável clique em novo projeto Ruby, crie um novo arquivo, o nomeie como Hello.rb e digite o código abaixo:

Aptana - Ruby - Hello World

Aptana – Ruby – Hello World

Exemplo:

Neste exemplo escrevemos o clássico programa inicial chamado Hello World para a linguagem Ruby.

Ruby

# Desenvolvimento Aberto
# Ruby
# hello.rb

class HelloWorld
  def Hello()
    puts "Desenvolvimento Aberto"
    puts "Hello World"
  end
end  

HelloWorld.new().Hello()

Como criar meu primeiro programa Ruby on Rails?
Clique para criar seu primeiro programa Ruby on Rails.

Na linguagem de programação Python você pode usar os módulos, cx_Oracle, ibm_db e odbc para se conectar aos bancos de dados Oracle, IBM DB2 e MSSQL Server e manipular dados através de um cursor.

Python - Database

Python – Database

Exemplo:

Este programa foi escrito para retornar uma linha de dados de uma tabela e exibir os campos em caixas de textos.

SQL

Oracle

create table Funcionarios
(     

    ID_Funcionario  NUMBER(5),
    Nome            VARCHAR2(30),
    Sobrenome       VARCHAR2(70),
    Cargo           VARCHAR2(30),
    Salario         NUMBER(9,2)

);

Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56);
Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);

DB2

create table Funcionarios
(     

    ID_Funcionario  INTEGER,
    Nome            VARCHAR(30),
    Sobrenome       VARCHAR(70),
    Cargo           VARCHAR(30),
    Salario         NUMERIC(9,2)

);

Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56);
Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);

Mssql

create table Funcionarios
(     

    ID_Funcionario  Int,
    Nome            VARCHAR(30),
    Sobrenome       VARCHAR(70),
    Cargo           VARCHAR(30),
    Salario         Decimal(9,2)

);

Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56);
Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);

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("350x280+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 = "oracle"

# Cria conexão com o banco de dados
def conectar(banco):
    # Cria string de conexão Oracle
    if (banco == "oracle"):
        sconexao = "user/p@55w0rd@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=p@55w0rd"
        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/p@55w0rd"
        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

# 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
    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")
# 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)

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

# loop do tcl
mainloop()

Na linguagem de programação C++ você pode usar o objeto CRecordSet através de um driver ODBC para retornar campos de um set de dados no qual poderá ser manipulado de modo que você possa escolher qualquer um dos campos da tabela contida em seu Dataset.

C++ - Database

C++ – Database

Visual Studio

Para utilizar uma linha de dados por coluna em C++ nos bancos de dados Oracle, DB2 e MSSQL, siga os seguintes passos:

1 – Crie a tabela de exemplo e insira as linhas de dados com o script para o seu banco de dados que você encontra logo abaixo. No Visual Studio crie um design como na figura abaixo, utilizando 7 Static Text, 6 Edit Control, 1 GroupBox e um Button. Mude o ID do primeiro Static Text para IDC_Rotulo e associe as respectivas variáveis aos campos da tela. Use o código abaixo para completar seu código gerado automaticamente.

C++ - MFC - Design

C++ – MFC – Design

Exemplo:

Este programa foi escrito para retornar uma linha de dados em uma tabela e exibir os campos em caixas de textos.

SQL

Oracle

create table Funcionarios
(     

    ID_Funcionario  NUMBER(5),
    Nome            VARCHAR2(30),
    Sobrenome       VARCHAR2(70),
    Cargo           VARCHAR2(30),
    Salario         NUMBER(9,2)

);

Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56);
Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);

DB2

create table Funcionarios
(     

    ID_Funcionario  INTEGER,
    Nome            VARCHAR(30),
    Sobrenome       VARCHAR(70),
    Cargo           VARCHAR(30),
    Salario         NUMERIC(9,2)

);

Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56);
Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);

Mssql

create table Funcionarios
(     

    ID_Funcionario  Int,
    Nome            VARCHAR(30),
    Sobrenome       VARCHAR(70),
    Cargo           VARCHAR(30),
    Salario         Decimal(9,2)

);

Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56);
Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);

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

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 dialog

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

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

// CCamposcppDlg message handlers

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

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	// TODO: Add extra initialization here

	return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CCamposcppDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

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

		// Center icon in client rectangle
		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;

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

// The system calls this function to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CCamposcppDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

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;
	CString m_db;

	// Referincia objeto statico
	CWnd * p_rotulo;

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

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

}

Na linguagem de programação C# você pode usar o objeto SqlDataReader através de um driver ADO.NET para retornar campos de um set de dados no qual poderá ser manipulado de modo que você possa escolher qualquer um dos campos da tabela contida em seu Dataset.

Vale ressaltar que no programa abaixo não utilizamos um método genérico para manipular os dados e sim um driver especifico de cada fornecedor de banco de dados, optamos por este método pois somente ele possibilita utilizar features avançadas de cada um de seus respectivos fornecedores(Oracle e IBM)

Database - Table Fields

Database – Table Fields

Ai esta uma grande diferença entre Java e C#, você pode analisar o código em Java (mesmo programa) que nos permite utilizar os drivers JDBC nativos de cada fornecedor utilizando um ResultSet comum. O C# não possui o objeto ResultSet mas é possível cria-lo à partir de interfaces abstratas  chamadas IDataReader, IDataRecord, IEnumerable e IDisposable.

Um ResultSet é muito similar ao DataReader, porem permite que você navegue por qualquer parte do set de resultado sem precisar criar outra conexão, visto que os drivers Oracle e IBM, já utilizam esta arquitetura, veja comentários no código abaixo e teste como funciona na pratica. A Microsoft disponibiliza um exemplo simples de como implementar um ResultSet, mas para uso em escala empresarial, você precisa aprimorar o exemplo básico disponível no MSDN.

ResultSet – C#: http://msdn.microsoft.com/en-us/library/ff878121.aspx

Para utilizar uma linha de dados por coluna em C# nos bancos de dados Oracle, DB2 e MSSQL, siga os seguintes passos:

1 – Crie a tabela de exemplo e insira as linhas de dados com o script para o seu banco de dados que você encontra logo abaixo. No Visual Studio crie um design como na figura abaixo, utilizando 7 Labels, 6 TextBox, 2 Panel e um Button.

Design

Design

Exemplo:

Este programa foi escrito para retornar uma linha de dados em uma tabela e exibir os campos em caixas de textos.

SQL

Oracle

create table Funcionarios
(     

    ID_Funcionario  NUMBER(5),
    Nome            VARCHAR2(30),
    Sobrenome       VARCHAR2(70),
    Cargo           VARCHAR2(30),
    Salario         NUMBER(9,2)

);

Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56);
Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);

DB2

create table Funcionarios
(     

    ID_Funcionario  INTEGER,
    Nome            VARCHAR(30),
    Sobrenome       VARCHAR(70),
    Cargo           VARCHAR(30),
    Salario         NUMERIC(9,2)

);

Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56);
Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);

Mssql

create table Funcionarios
(     

    ID_Funcionario  Int,
    Nome            VARCHAR(30),
    Sobrenome       VARCHAR(70),
    Cargo           VARCHAR(30),
    Salario         Decimal(9,2)

);

Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56);
Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);

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

        // ************** Sobre Conexões - ADO.NET **************
        //
        // A Microsoft disponibiliza por exemplo, o System.Data.OracleClient
        // porem se tornou obsoleto e ainda é suportado somente
        // a nível de compatibilidade com versões anteriores do Framework.
        // A Microsoft recomenda utilizar o driver de cada fornecedor:
        //
        // veja: http://msdn.microsoft.com/en-us/library/77d8yct7.aspx
        //
        // Você pode utilizar a classe DbProviderFactory
        // para criar um único datasource para todos os bancos de dados:
        //
        // http://msdn.microsoft.com/pt-br/library/system.data.common.dbproviderfactory(v=vs.110).aspx
        //
        // No entanto diferentemente da linguagem JAVA (JDBC) o ADO.NET não suporta
        // alguns recursos do Oracle e IBM DB2.
        //
        // *** Factory ***
        //
        // Utilizando conexões únicas de cada provedor de banco de dados
        // através de um Factory, permite que você utilize um único set de instruções
        // para todos os bancos de dados.
        //
        // Atente-se que se utilizar instruções únicas, em alguns casos poderá encontrar
        // alguns erros de compatibilidade ou criar certas limitações a outros bancos.
        // O ADO.NET é desenvolvido para o MSSQL Server e está sujeito
        // a algumas limitações quando utilizar alguns tipos de campos,
        // conceitos de conexão e acesso a dados de outros bancos de dados.
        //
        // Sistemas de grande porte possuem um Dicionário de dados
        // para se prevenir destas situações.
        //
        // Veja este mesmo programa utilizando o DriverManager equivalente ao factory para java
        // e veja comentários extras no código apontando diferenças de conceitos.

        // 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=user"+

                    // 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 =user" + 

                        // 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("oracle");

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

            // Usando um procedimento de conexão para da 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
                 // Tente utilizar a conexão sem fechar o DataReader utilizando ADO.NET nativo (MSSQL)</pre>
                 // Tente fazer o mesmo com ODAC 12c e com o IBM DB2 Data Server Provider

                 // ADO.NET É necessário fechar o DataReader antes de executar um sqlcommand.
                 // ODAC não é necessário
                 // IBM DATA Server não é necessário
                 // 
                 // Aplica-se a qualquer DataReader ADO.NET
                 //
                 // 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.

               }
           }
        }
    }
}

É permitido manipular um resultado de uma pesquisa no banco de dados através do seu código Java usando um objeto ResultSet, você pode selecionar qualquer campo contido em uma ou mais linhas de dados à partir do conteúdo de seu set de dados e escolher as colunas desejadas pelo nome ou índice, você pode exibi-las em uma grade ou em campos de edição.

Database  - Table Fields

Database – Table Fields

Para utilizar uma linha de dados por coluna em Java nos bancos de dados Oracle, DB2 e MSSQL, siga os seguintes passos:

1 – Crie a tabela de exemplo e insira as linhas de dados com o script para o seu banco de dados que você encontra logo abaixo:

Script SQL

Script SQL

Exemplo:

Este programa foi escrito para retornar uma linha de dados em uma tabela e exibir os campos em caixas de textos.

SQL

Oracle

create table Funcionarios  
(     
    
    ID_Funcionario  NUMBER(5), 
    Nome            VARCHAR2(30), 
    Sobrenome       VARCHAR2(70), 
    Cargo           VARCHAR2(30), 
    Salario         NUMBER(9,2)
    
);

Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56);
Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);

DB2

create table Funcionarios  
(     
    
    ID_Funcionario  INTEGER, 
    Nome            VARCHAR(30), 
    Sobrenome       VARCHAR(70), 
    Cargo           VARCHAR(30), 
    Salario         NUMERIC(9,2)
    
);

Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56);
Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);

Mssql

create table Funcionarios  
(     
    
    ID_Funcionario  Int, 
    Nome            VARCHAR(30), 
    Sobrenome       VARCHAR(70), 
    Cargo           VARCHAR(30), 
    Salario         Decimal(9,2)
    
);

Insert into FUNCIONARIOS values (1,'Steve','Gates','Programador',2550.56);
Insert into FUNCIONARIOS values (2,'Bill','Jobs','Diretor',5143.71);

Java

import java.awt.BorderLayout;
import java.awt.Container;
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.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 Border borda;
	
	// Declara objetos de conexão
	private static Connection conn;
	private static Statement query;
	
	// Declara variaveis
	private 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", "user", "p@55w0rd");

				// 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@55w0rd");

				// 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=user;password=p@55w0rd";

				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 BorderLayout());
		painel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
		
		// Cria titulo
		ltitulo = new JLabel("Database - Fields -Sem conexão");
		
		painel.add(ltitulo, BorderLayout.PAGE_START);
		
		// 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();
		
		// 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));
		
		painel.add(painelDados, BorderLayout.CENTER);
		
		// 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);
		
		painel.add(painelPesquisa, BorderLayout.PAGE_END);
		
		return painel;
	}
	
	
	// Clique do botão de pesquisa
	public void actionPerformed(ActionEvent arg0) 
	{
		// Cria instancia de objeto
		Campos campos = 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";
		campos.conectar(bconexao);
		
		// 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();		
		}		
		
	}
	
	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();
			
			formulario.setContentPane(acesso.criaPainel());
			
			// Exibe o formulario
			formulario.pack();
			formulario.setVisible(true);
		
	}

	public static void main(String[] args) {
		
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			
			@Override
			public void run() {
		
				// Mostra GUI
				criaGUI();				
				
			}
		});		

	}

}

 

Assim que um desenvolvimento é terminado você pode transporta-lo para um ambiente de qualidade para que seja realizado um teste unitário em seu programa afim de identificar possíveis erros. A seguir veremos como efetuar este procedimento no NetWeaver 7 (Mini-SAP) passo a passo.

1 – Primeiro você precisa criar um cliente de qualidade de numero 300 e depois efetuar uma cópia do cliente 001 para este cliente, você encontra um walkthrough para realizar este procedimento na categoria Abap.

QAS - 300

QAS – 300

2 – No ambiente de desenvolvimento DEV (200) crie uma nova Change Request utilizando a transação SE10.

Trasport Organizer

Trasport Organizer

3 – Para criar uma nova Request clique em novo e escolha o tipo de Request que você necessita.

WorkBench Request

WorkBench Request

4 – Preencha a descrição e as propriedades da nova Request.

Propriedades

Propriedades

5 – Clique em Salvar para criar a nova Request.

Nova Change Request

Nova Change Request

6 – Entre no Abap Development WorkBench usando a transação SE80, escolha o objeto Package e escolha o nome ZDA-00001 e clique em pesquisar, quando questionado, escolha criar nova Package.

Abap - Nova Package

Abap – Nova Package

7 – Preencha as propriedades da nova Package como na figura abaixo:

Propriedades - Package

Propriedades – Package

8 – Associe a nova Package a Request que acabamos de criar.

Package --> Change Request

Package –> Change Request

9 – Ainda no Abap WorkBench crie um novo programa chamado ZDEVTOQAS e o inclua em nossa nova Package.

Programa --> Package

Programa –> Package

10 – No editor, escreva o código fonte encontrado logo abaixo.

Programa ZDEVTOQAS

Programa ZDEVTOQAS

 

11 – Após compilar, ativar e testar o programa, entre na transação SE03 para conferir se esta tudo OK com nossa Change Request.

Transport Organizer Tools

Transport Organizer Tools

12 – Clique em Find Request e busque pela sua Request para ver seu conteúdo.

Change Request OK

Change Request OK

13 – Selecione sua Request e clique no ícone de transporte chamado Release Directly.

Release - Request

Release – Request

14 – Efetue Logoff do cliente de desenvolvimento 200 e efetue um Login no cliente de qualidade 300, entre na transação SCC1, e selecione o cliente de desenvolvimento e a Request que pretende transportar.

Selecionar Request

Selecionar Request

15 – Clique no botão Start Immediately para iniciar o transporte ou você pode optar por executar este procedimento em background.

Iniciar Imediatamente

Iniciar Imediatamente

16 –  Após o termino do transporte clique em sair e você recebera um relatório com o contendo o resumo de seu transporte.

Transporte Concluido

Transporte Concluído com Sucesso

Obs:

Programas são Client-Independent e não é necessário transportar programas dentro de um mesmo servidor de aplicação, normalmente se transporta programas para outros servidores como o QAS e o PRD.

Na imagem abaixo segue uma pesquisa executada em cima do banco de dados NSP do NetWeaver 7, onde podemos ver que a tabela responsável pelo diretório de programas não possui o campo chave MANDT.

Cross-Client - Table -Diretório de Programas

Cross-Client – Table -Diretório de Programas

Exemplo:

Programa básico para ser transportado do ambiente de desenvolvimento para o ambiente de qualidade.

Abap

*&---------------------------------------------------------------------*
*& Report  ZDEVTOQAS
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Desenvolimento para Qualidade
*&---------------------------------------------------------------------*

REPORT  ZDEVTOQAS.

Write : / 'Este programa será transportado para o client QAS-300'.

O Cliente 001 é criado na instalação do sistema SAP e é um modelo neutro para que você possa criar outros clientes à partir dele. Após criar um novo cliente na transação SCC4, você pode transportar uma copia do cliente 001 para que seja a base do cliente de desenvolvimento numero 200.

Copiando Clientes

1 – Efetue o login no cliente de desenvolvimento 200, usando o usuário SAP* e a senha pass,  entre na transação SCCL, escolha o perfil SAP_ALL, escolha o cliente fonte a ser copiado, escolha o cliente 001 para os itens Source Client e Source Client User Master:

Source Client

Source Client

2 – Você pode optar por rodar o procedimento imediatamente ou rodar em um processo de background, escolha Start Immediately, uma janela de confirmação irá lhe mostrar o resumo das opções escolhidas, clique em continuar.

Resumo

Resumo

3 – IMPORTANTE – Após a cópia o sistema irá abrir automaticamente uma ferramenta para conversão de nomes lógicos de sistema para tabelas Cross-Clients, por enquanto nós ainda não configuramos estes nomes no Mini SAP, clique em cancelar para sair desta ferramenta.

Logical Name Tools

Logical Name Tools

4 – Logo após você cancelar a ferramenta o sistema irá lhe retornar o relatório do resultado da cópia de clientes.

Client Copy Successfully

Client Copy Successfully

5 – Use o Tcode /nex para sair do sistema e efetue um login no cliente 200 já com o usuário BCUSER e está apto a desenvolver programas neste ambiente.

Obs: Neste procedimento todas as tabelas serão sobrescritas, todos os dados serão perdidos, após este procedimento você pode rodar novamente o programa de copia de dados do Flight Model do post anterior para transportar os dados do cliente 000 para o cliente 200.

IMPORTANTE:

Na configuração padrão do NetWeaver 7 você pode executar procedimentos cross-client apenas em um sistema SAP e transportar esta tabela para todos os outros sistemas SAP. Alternativamente, você pode definir os sistemas lógicos para cada sistema SAP , para  que os procedimentos sejam efetuados em cada um dos diferentes sistemas.

Logical System: Configurando sistemas lógicos.

Após criar o cliente 200 para desenvolvimento e copiar o cliente base 001,  você precisa importar os dados do Flight Model para pode utilizar em seus programas o modelo de dados contidos no NetWeaver 7.

Importando Dados para o Cliente 200

1 – Efetue o Login no cliente 200 com o usuário BCUSER.

2 – Na transação se38 chame o programa SAPBC_DATA_GENERATOR, compile, ative e execute.

SAPBC_DATA_GENERATOR

SAPBC_DATA_GENERATOR

3 – Clique no botão de radio na opção STANDARD DATA RECORD e clique no botão executar.

Programa

Programa

4 – Após o termino da execução do programa, abra a transação SE16 e pesquise pela tabela SFLIGHT.

Data Browser

Data Browser

Obs: Para uma visão geral do Flight Model clique aqui.

Após instalar o Mini SAP você pode criar seus objetos e programas no mandante 001, porem o mandante 001 também é um mandante de sistema apesar de possuir um flag do tipo C na tabela de mandantes que permite desenvolvimento e customização, a SAP recomenda que você utilize este mandante apenas para criar uma cópia neutra para outros mandantes.

De acordo com as melhores praticas de configuração da SAP você precisa criar dois novos clientes para desenvolvimento e customização, em um ambiente de desenvolvimento que são o CUST e o SANDBOX e dois clientes de qualidade para o ambiente de QAS, o QTST e o TRNG que são os ambientes de teste e integração e treinamento.

 

Ambiente de desenvolvimento – DEV

CUST-  Desenvolvimento – Mandante – 200

Cliente de desenvolvimento e customização todas as alterações feitas para objetos específicos do cliente são automaticamente gravadas e armazenadas em solicitações de desenvolvimento neste cliente. Você só pode executar personalização cliente-independent neste cliente. Você deve manter manualmente os dados mestres e de transações para testes.  Você também pode usar o cliente para desenvolver programas.

Somente use os programas de teste no cliente de garantia de qualidade (300) para evitar configurações de personalização prejudiciais.

SAND – SandBox –  Mandante – 210

Não é permitido personalização ou desenvolvimento do trabalho neste cliente. Utilize este cliente para testar funções sem correr o riscos de alterações de dados. O administrador do sistema atualiza o cliente regularmente usando uma cópia do cliente 200.

 

Ambiente de QualidadeQAS

QTST –  Qualidade – Mandante – 300

Nenhuma personalização ou desenvolvimento de trabalho é feito neste cliente. Este é o cliente de teste primário para testar unidades individuais de trabalho de desenvolvimento e testes de qualidade antes da fase de pré-produção.

Cliente 300 é mantido up-to-date, copiando os pedidos criados de customização e desenvolvimento do cliente 200. Normalmente, quando cada unidade de trabalho de personalização é concluída, resulta em um pedido que deve ser copiado. O personalizador deve testar as novas funções em um “teste de unidade”. Às etapas do projeto, por exemplo, imediatamente antes da fase de pré-produção, você deve executar testes de qualidade de maior escala com os usuários em sua empresa.

TRNG – Treinamento – Mandante – 310

Este cliente é usado para treinar os usuários finais. Ele contém dados mestre e de transação para que o treinamento seja o mais realista possível. Você deve manter os dados manualmente, conforme necessário para o treinamento. Nem o trabalho de desenvolvimento e nem personalização independente do cliente é permitido neste ambiente.

 

Perfil

Os perfis do SAP ficam gravados no seguinte endereço: C:\usr\sap\NSP\SYS\profile

 

Criando o Cliente 200 – Mini SAP

1 – Para criar um novo cliente entre na transação  SCC4, clique em Display/Change, clique em OK, no aviso de tabelas Cross-Client(tabelas que não possuem o campo MANDT, apesar desta possuir, é tabela pai dos mandantes para o sistema) e clique em New Entry, inclua um novo cliente com a opção Client Role: Customizing e salve.

Novo Cliente

Parâmetros do Novo Cliente

2 – Você deve obter um novo cliente como na figura abaixo, quando você criar um novo cliente nenhum usuário do sistema esta apto a se conectar neste cliente, para isto precisamos mudar algumas configurações:

Cliente 200 - DEV (CUST)

Cliente 200 – DEV (CUST)

3 – IMPORTANTE: -para se conectar no novo mandante você precisar inserir ou modificar o parâmetro de login para que habilite o usuário SAP* a se conectar ao cliente 200. Entre na transação RZ10 para efetuar esta modificação nos parâmetros do perfil SAP.

Perfil SAP - Start, Default e Instancia

Perfil SAP – Start, Default e Instância

4 – Caso seu perfil não apareça automaticamente no botão de busca do campo Profile, use o botão Import para importar seu perfil DEFAUT e o seu perfil de instancia para que você possa modifica-los.

Após o perfil DEFAULT importado, selecione o botão de radio, Extended Maintenance e clique em Change, na tela de parâmetros clique no botão Parameters e preencha o campo Parameter name com: login/no_automatic_user_sapstar e o campo Parameter Val com o valor 0.

Parâmetros

Parâmetros

5 – Clique no botão copiar e em seguida no botão voltar, e quando questionado escolha ativar o perfil DEFAULT.

Perfil

Perfil

6 – Reinicie o servidor SAP.

Servidor SAP

Servidor SAP

7 – Agora você esta apto a se conectar no cliente de desenvolvimento 200, para isto utilize o usuário SAP* e a senha “pass“.

Login - Cliente 200

Login – Cliente 200

 

Problemas Com o Perfil

Normalmente a instalação e configuração do SAP é feita por um consultor especializado chamado BASIS, no caso do Mini-SAP instalado em uma estação de trabalho para estudos, talvez você não tenha todas as permissões requeridas no sistema operacional para manipular os perfis do sistema SAP e isto pode gerar alguns erros, e os mais comuns são:

Ao tentar Ativar o perfil:

  • unknown error activating profile.

Ao checar o perfil:

  • j2ee/dbname changes not permitted.

Se receber uma destas mensagens de erro você não poderá se conectar ao novo cliente.

Causa

Você não possui os diretos necessário no sistema operacional para manipular a alteração do perfil.

Solução

  1. Após executar a modificação ou a inserção do parâmetro: login/no_automatic_user_sapstar
  2. Entre na pasta C:\usr\sap\NSP\SYS\profile
  3. Abra o arquivo chamado DEFAULT.PFL.
  4. Verifique se o parâmetro acima pode ser gravado no final do arquivo
  5. caso contrario insira a linha: login/no_automatic_user_sapstar = 0
  6. Reinicie o servidor e conecte ao cliente 200 com o usuário SAP* e a senha pass.

Exemplo:

Arquivo DEFAULT.PFL

SAPDBHOST = Estacao01
j2ee/dbtype = sap
j2ee/dbname = NSP
j2ee/dbhost = Estacao01
SAPSYSTEMNAME = NSP
SAPGLOBALHOST = Estacao01
system/type = ABAP
#-----------------------------------------------------------------------
# SAP Message Server for ABAP
#-----------------------------------------------------------------------
rdisp/mshost = Estacao01
rdisp/msserv = 0
rdisp/msserv_internal = 3900
login/system_client = 200
login/no_automatic_user_sapstar = 0