Arquivo da categoria ‘Abap’

A linguagem de banco de dados SQL permite que você retorne um resultado de dados completo de uma única vez, mas as vezes precisamos manipular este resultado em tempo de execução, uma linha de cada vez, deste modo podemos utilizar um recurso chamado Cursor para realizar este procedimento.

Basicamente todos os bancos de dados possuem este recurso, entretanto cada um deles possui também suas peculiaridades e funcionalidades diferenciadas, mas no geral funcionam da seguinte maneira: a instrução DECLARE CURSOR define os atributos de um cursor do servidor SQL, como o seu comportamento de rolagem e a consulta usada para construir o conjunto de resultados no qual o cursor funciona. A instrução OPEN popula o conjunto de resultados e FETCH retorna uma linha do conjunto de resultados. A instrução CLOSE libera o conjunto de resultados atual associado ao cursor. A declaração DEALLOCATE libera os recursos usados ​​pelo cursor.

Native SQL - Cursor

Native SQL – Cursor

O Native SQL possui uma sintaxe simplificada apesar de nos permitir uma conexão direta sem utilizar o dicionário de dados ABAP. No banco de dados, geralmente um cursor é criado dentro de uma Stored Procedure, mas algumas linguagens de programação possuem instruções para cria-los utilizando a sintaxe da própria língua, em ABAP esta sintaxe é bem parecida com a sintaxe utilizada pelo Open SQL.

Sintaxe:

  • OPEN <cursor name> FOR <statement>
  • FETCH NEXT <cursor name> INTO <target(s)>.
  • CLOSE <cursor name>

Exemplo:

Neste exemplo criamos uma cursor SQL direto sem utilizar uma procedure.

Abap

*&---------------------------------------------------------------------*
*& Report  ZCURSOR
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Native SQL - Open Cursor
*&---------------------------------------------------------------------*

REPORT  ZCURSOR.

* Cria parametro de pesquisa
DATA : parametro1 TYPE spfli-carrid VALUE 'AZ'.
DATA : parametro2 TYPE spfli-carrid VALUE 'LH'.

* Cria variáveis do cursor
DATA: BEGIN OF cur,
       variavel1 TYPE spfli-CONNID,
       variavel2 TYPE spfli-CITYFROM,
       variavel3 TYPE spfli-CITYTO,
       variavel4 TYPE spfli-DISTANCE,
       variavel5 TYPE spfli-DISTID,
 END OF cur.

* Declara e Abre um cursor
* -------------------------
*
* Atente-se que estamos utilizando o SAP MaxDB para este exemplo.
* O Native SQL possui sua própria sintaxe e não utiliza
* a sintaxe do banco de dados, neste caso a sintaxe para o banco seria:
*
* --SAP MaxDB ANSI 92 SQL
*
* DECLARE db1 CURSOR FOR
* SELECT * FROM TABELA
* WHERE X = 1
*
* Em vez disto, utiliza o comando NATIVE SQL: 
* OPEN nome do cursor FOR clausula sql
* este comando declara e abre um cursor no banco de dados.

EXEC SQL.
  OPEN db1  FOR
    SELECT CONNID, CITYFROM, CITYTO, DISTANCE,  DISTID
    FROM spfli
    WHERE
    MANDT  = '200' AND
    CARRID = :parametro1
    UNION
    SELECT CONNID, CITYFROM, CITYTO, DISTANCE,  DISTID
    FROM spfli
    WHERE
    MANDT  = '200' AND
    CARRID = :parametro2

ENDEXEC.

* Executa Fetch e alimenta as variáveis do cursor
DO.
  EXEC SQL.
    FETCH NEXT db1 INTO :cur-variavel1, :cur-variavel2, :cur-variavel3, :cur-variavel4, :cur-variavel5
  ENDEXEC.

  IF sy-subrc <> 0.
    EXIT.
  ELSE.
    WRITE : / cur-variavel1, cur-variavel2, cur-variavel3, cur-variavel4, cur-variavel5.
  ENDIF.
ENDDO.

* Fecha o cursor
EXEC SQL.
  CLOSE db1
ENDEXEC.

 

Stored Procedures são procedimentos de código SQL armazenados no banco de dados, as stored procedures são mais rápidas do que o código tradicional, o que significa que elas estão se tornando cada vez mais populares. Com código da aplicação se mudando dos programas externos para o motor de banco de dados, Os DBAs precisam entender os requisitos de memória relacionados para procedimentos armazenados e saber como gerenciar estes procedimentos para o ideal desempenho do banco de dados. Isto muda de banco para banco, cada um deles possui suas recomendações de melhores praticas para atingir um melhor desempenho.

Uma palavra sobre o Dicionário de Dados SAP

Como sabemos Native SQL nos permite utilizar código SQL direto, ignorando a camada de banco de dados do SAP R/3, isto significa que o Native SQL é o método mais rápido para manipular grande quantidade de dados em ABAP, apesar do desenvolvedor estar sozinho nesta empreitada e não poder utilizar nenhum recurso do dicionário ABAP, incluindo os tipos de campos compatíveis entre banco e linguagem de programação, manipulação automática do campo MANDT do cliente, escrita SQL única para qualquer banco de dados (Open SQL) entre outras facilidades.

Apesar dos contras este conceito nos permite utilizar Stored Procedures como métodos para extrair ou manipular dados utilizando o ABAP, podendo até exercer a mesma função do RFC em termos de manuseio de dados entre diferentes servidores e aplicações não R/3.

Por exemplo algumas tabelas contendo dados massivos como o caso da tabela de notas fiscais ou lançamentos contábeis entre outras que necessitam de algum tipo de auditoria de algum sistema não R/3 que pretende importar os dados do sistema R/3, podem obter método de extração da própria empresa detentora do sistema R/3 utilizando procedures obtendo a melhor performance possível na extração e importação de dados aplicando técnicas de Bulk dos bancos de dados(importação em massa) ao invés de utilizar as próprias funções de RFC disponíveis pela SAP, cujo criam um set de dados na memoria e necessitam de um looping para extrair linha a linha da tabela alocada por um sistema não R/3.

SAP MaxDB SQL Studio

Utilizaremos neste post o banco de dados MaxDB da própria SAP, mas escreveremos as Stored Procedures para os bancos de dados Oracle, IBM DB2 e Microsoft SQL Server.

Este tipo de técnica necessita que o desenvolvedor tenha um conhecimento avançado do banco de dados a ser utilizado e do próprio banco de dados SAP, suas tabelas e seus conceitos por traz do dicionário de dados.

1- Entre no SAP MaxDB e utilize o script SQL completo encontrado abaixo.

SQL Studio

SQL Studio

2 – Crie um programa no SAP e utilize o código correspondente.

Stored Procedure - Abap

Stored Procedure – Abap

Exemplo:

Neste exemplo criamos uma tabela que não está declarada no dicionário de dados ABAP e criamos uma Stored Procedure com parâmetros de entrada e saída, e a utilizamos como um método para extrair dados diretamente em um programa ABAP.

Obs: Visto que no campo de valor flutuante da imagem acima, o mesmo foi extraído diretamente do banco de dados, ele não pode ser formatado pela linguagem ABAP por seus tipos nativos, mas você pode criar seu próprio tipo de dado para mostra-lo corretamente usando o dicionário de dados após a operação no banco de dados, utilizando o tipo de valor padrão para números flutuantes com casas decimais, que compõe o conceito padrão da linguagem ABAP ou seja, utilizando um Data Object.

SAP MaxDB

-- Cria tabela no schema SAPNSP
CREATE TABLE SAPNSP.ZFUNCIONARIO
(
            ID_FUNCIONARIO INT,
            NOME VARCHAR (30),
            SOBRENOME VARCHAR(70),
            CARGO VARCHAR(30),
            SALARIO DECIMAL(9,2)
)

-- Insere dados na tabela
Insert into SAPNSP.ZFUNCIONARIO values (1,'Steve','Gates','Programador',2550.56)
Insert into SAPNSP.ZFUNCIONARIO values (2,'Bill','Jobs','Diretor',5143.71)

-- Visualiza dados
select * from SAPNSP.ZFUNCIONARIO

-- Cria Stored Procedure
CREATE DBPROC SAPNSP.ZFUNCIONARIOS    (
           IN PID_FUNCIONARIO INT,
           OUT  PNOME VARCHAR (30),
           OUT PSOBRENOME VARCHAR(70),
           OUT PCARGO VARCHAR(30),
           OUT PSALARIO FLOAT      )  

    AS
           SELECT NOME, SOBRENOME, CARGO, SALARIO
           INTO :PNOME, :PSOBRENOME, :PCARGO, :PSALARIO
           FROM SAPNSP.ZFUNCIONARIO
           WHERE ID_FUNCIONARIO = :PID_FUNCIONARIO;

-- Testa Stored Procedure
  CALL SAPNSP.ZFUNCIONARIOS (1, :PNOME , :PSOBRENOME , :PCARGO , :PSALARIO)

Oracle

create or replace PROCEDURE SAPNSP.ZFUNCIONARIOS
- Cria parametros
(pid_funcionario IN FUNCIONARIOS.ID_FUNCIONARIO%TYPE,
 p_nome OUT FUNCIONARIOS.NOME%TYPE,
 p_sobrenome OUT FUNCIONARIOS.SOBRENOME%TYPE,
 p_cargo OUT FUNCIONARIOS.CARGO%TYPE,
 p_salario OUT FUNCIONARIOS.SALARIO%TYPE
 )
AS
BEGIN
-- Insere dados da query dentro dos parametros de saida
  SELECT NOME, SOBRENOME, CARGO, SALARIO
  INTO p_nome, p_sobrenome, p_cargo, p_salario
  FROM SAPNSP.ZFUNCIONARIO
  WHERE ID_FUNCIONARIO = pid_funcionario;

END;

DB2

-- Cria procedure
CREATE PROCEDURE SAPNSP.ZFUNCIONARIOS
( IN pid_funcionario INTEGER,
  OUT p_nome VARCHAR(30),
  OUT p_sobrenome VARCHAR(70),
  OUT p_cargo VARCHAR(30),
  OUT p_salario DECIMAL(9,2)
 )

P1: BEGIN

  SELECT NOME, SOBRENOME, CARGO, SALARIO
  INTO p_nome, p_sobrenome, p_cargo, p_salario
  FROM SAPNSP.ZFUNCIONARIO
  WHERE ID_FUNCIONARIO = pid_funcionario;

END P1

MSSQL

CREATE PROCEDURE SAPNSP.ZFUNCIONARIOS
   @pfuncionario INT,
   @pnome		 NVarchar(30) OUTPUT,
   @psobrenome	 NVarchar(70) OUTPUT,
   @pcargo	     NVarchar(30) OUTPUT,
   @psalario	 Decimal(9,2) OUTPUT
AS
BEGIN
   SELECT @pnome = Nome,
		  @psobrenome = Sobrenome,
		  @pcargo = Cargo,
		  @psalario = Salario
   FROM SAPNSP.ZFUNCIONARIO
   WHERE ID_Funcionario = @pfuncionario
END

Abap

*&---------------------------------------------------------------------*
*& Report  ZSTOREDPROCEDURE
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Native SQL - Stored Procedures - Abap
*&---------------------------------------------------------------------*

REPORT  ZSTOREDPROCEDURE.

* Declara parametros de saida para a procedure
DATA :  pnome      TYPE c LENGTH 30,
        psobrenome TYPE c LENGTH 70,
        pcargo     TYPE c LENGTH 30,
        psalario   TYPE f.

* Declara parametro de entrada para a procedure
PARAMETERS id_func TYPE i.

* Executa Native SQL utilizando os parametros
EXEC SQL.

 EXECUTE PROCEDURE SAPNSP.ZFUNCIONARIOS (IN :id_func, OUT :PNOME , OUT :PSOBRENOME , OUT :PCARGO , OUT :PSALARIO)

ENDEXEC.

* Exibe resultado dos parâmetros
WRITE: / 'Dados Retornados direto do banco SAP MaxDB' Color 5.

skip 2.

WRITE: / 'Código:'    Color 1, id_func,
       / 'Nome:'      Color 1, pnome,
       / 'Sobrenome:' Color 1, psobrenome,
       / 'Cargo:'     Color 1, pcargo,
       / 'Salário:'   Color 1, psalario .

SAP – Database – Native SQL – Abap

Publicado: 24 de junho de 2014 em Abap

Instruções Native SQL permitem utilizar comandos SQL específicos de um banco de dados em um programa ABAP. Isso significa que você pode usar instruções de banco de dados que não são administradas pelo dicionário ABAP, e, portanto, programas criados com instruções SQL nativas não podem ser transportados para qualquer plataforma pois utilizam por exemplo PL/SQL para o banco de dados Oracle ou Transact-SQL para o Microsoft SQL Server e assim por diante.

Instruções SQL nativas permitem uma maior flexibilidade de dados em um programa ABAP por não ter restrições e permitem que você utilize quase todos os recursos da linguagem de cada banco de dados, pois instruções SQL nativas ignoram a interface de banco de dados do R/3. Não há registro de tabelas de log, e não há sincronização com o buffer do banco de dados no servidor de aplicativos. Por esta razão, você deve, sempre que possível, usar o Open SQL para alterar as tabelas de banco de dados declaradas no dicionário ABAP. Em particular, as tabelas declaradas no dicionário ABAP que contêm longas colunas com os tipos LCHR ou LAW e só devem ser abordadas usando o Open SQL, já que as colunas contêm, informação extra e de comprimento específico do banco de dados. O SQL nativo não tem essa informação, e pode,  produzir resultados incorretos. Além disso, o SQL nativo não suporta manuseio automático de cliente. Em vez disso, você deve tratar campos do cliente como qualquer outro.

O Native SQL permite que você execute Stored Procedures, cursores e outros tipos de procedimentos comuns do banco de dados, mas existe algumas ressalvas, o SQL nativo funciona sem os dados administrativos sobre as tabelas armazenadas no dicionário ABAP. Consequentemente, não pode realizar todas as verificações de consistência como o Open SQL. Isto coloca um maior grau de responsabilidade sobre os desenvolvedores de aplicativos em como trabalhar com campos ABAP corretamente. Você deve sempre garantir que o tipo de dado ABAP e o tipo da coluna de banco de dados são idênticos.

Native SQL

Native SQL

Em sua sintaxe, o Native SQL deve começar com uma instrução EXEC SQL e terminar com ENDEXEC, a instrução também permite que você utilize uma instrução FORMPERFORM que é executada automaticamente.

Exemplo:

Neste exemplo escrevemos uma simples instrução SQL nativa que utiliza parâmetros para executar uma instrução SQL para o banco de dados SAP MaxDB.

Abap

*&---------------------------------------------------------------------*
*& Report  ZNATIVESQL
*&
*&---------------------------------------------------------------------*
*& Desenvolvimento Aberto
*& Abap - Native SQL
*&---------------------------------------------------------------------*

REPORT  ZNATIVESQL.

* Cria tabela interna
DATA: BEGIN OF itabela,
        connid   TYPE spfli-connid,
        cityfrom TYPE spfli-cityfrom,
        airpfrom TYPE spfli-airpfrom,
        cityto   TYPE spfli-cityto,
        airpto   TYPE spfli-airpto,
        deptime  TYPE spfli-deptime,
        arrtime  TYPE spfli-arrtime,
      END OF itabela.

* Cria parametro de pesquisa
DATA parametro TYPE spfli-carrid VALUE 'AZ'.

* Executa Native SQL utilizando um procedimento FORM
EXEC SQL PERFORMING dados.
  SELECT connid, cityfrom, airpfrom, cityto, airpto, deptime, arrtime
  INTO   :itabela
  FROM   spfli
  WHERE  carrid = :parametro
ENDEXEC.

* Pula duas linhas
SKIP 2.

* Retorna a quantidade de linhas afetadas
WRITE: / 'A instrução SQL retornou', SY-DBCNT, ' linhas de dados.'.

* Cria procedimento
FORM dados.
  WRITE: / itabela-connid, itabela-cityfrom, itabela-airpfrom,
           itabela-cityto, itabela-airpto, itabela-deptime, itabela-arrtime.
ENDFORM.

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.

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.

 

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

O SAP R/3 possui um conceito de clientes definidos por diferentes cenários dentro de um sistema SAP, cada cliente possui um proposito exclusivo e por padrão alguns destes clientes são configurados durante a instalação do R/3, é possível que um implementador configure seus próprios clientes a partir da configuração padrão.

Basicamente todos os objetos e dados que pertencem a um cliente estão contidos dentro do banco de dados do SAP, entre as milhares de tabelas do sistema, estão todas as configurações necessárias para que o sistema funcione corretamente e é onde também estão as configurações customizadas de cada implementação, incluindo tabelas, dados, programas, funções, classes entre outros.

NetWeaver 7

O NetWeaver 7 roda sobre o banco de dados da SAP chamado NSP, e por padrão possui os esquemas DOMAIN, SAPNSP, SUPERDBA, SYSINFO, possui índices, Stored Procedures, Sinônimos, mas não possui Triggers, é comum sistemas de grande porte não utilizarem Triggers estas são consideradas armadilhas por muitos DBAs, por gerar erros desnecessários e minimizar a velocidade do sistema já que normalmente tratam registro a registro até os procedimentos de dados em massa, mesmo as IDEs de programação SQL de hoje mudaram a localização do node de Triggers em sua interface, pois antes costumavam ficar junto com as tabelas e eram facilmente esquecidas na hora da programação as tornando muitas vezes invalidas.

Cliente 000

O cliente 000 é o cliente SAP standard, que quando uma nova versão é instalada, SAP atualiza automaticamente: os conteúdos e estruturas de tabelas, os programas, as telas, os formulários, a ajuda on-line e outros objetos e dados do sistema SAP. Este cliente sempre tem o status atual padrão e você pode transferir as configurações padrão do cliente 000 para um outro cliente. O cliente 000 não é um cliente de trabalho e sim de configuração inicial do sistema.

Por padrão os dados de exemplo do NetWeaver 7 e este conjunto de tabelas e dados é chamado Flight Model estão armazenados dentro do cliente 000 e precisa ser transportado para um cliente por exemplo de DEV ou SANDBOX para poder ser utilizados corretamente. Neste post não vamos importar os dados definitivamente, o objetivo é entender como funciona o armazenamento de dados dentro de um cliente.

Para informação adicional sobre os clientes do sistema SAP clique aqui.

Mandante

O mandante é o nível máximo da hierarquia no sistema SAP, as especificações feitas, ou os dados entrados neste nível são válidos para todas as empresas e para todas as outras estruturas organizacionais. Portanto, é necessário fazer essas especificações, ou entrar com esses dados somente uma vez. Isto assegura a consistência dos dados.

Os usuários devem entrar com uma chave de mandante quando fazem o logon no sistema SAP. Isto define o mandante em que eles pretendem trabalhar. Todas as entradas feitas são salvas por mandante. Processamento e analise de dados são também executados por mandante. Um mandante contem a unidade comercial, organizacional e tecnicamente auto-contida em um sistema SAP. Os mandantes têm os seus próprios registros mestre e conjuntos de tabelas. A definição de unidade organizacional mandante é obrigatória.

Na pratica o mandante é um campo chave existente em quase todas as tabelas do banco de dados do sistema SAP. Existem transações que contem programas que manipulam configurações entre clientes, este programas visam manter consistência de configuração e dados de todo o sistema SAP, quando se manipula requisitos de transportes de um cliente para o outro.

Workaround Para Transportar Dados

Você NUNCA deve executar este tipo de procedimento em um sistema SAP a não ser que esteja utilizando uma cópia de estudos. É possível fazer o transporte diretamente no banco de dados usando simples instruções SQL, mas para isso você deve conhecer a modelagem de dados principalmente no que se refere as chaves estrangeiras.

A seguir vamos mostrar como funciona realmente o conceito de mandantes e como os dados são passados de um cliente para o outro.

1-  Primeiro você precisa de um acesso de DBA e uma ferramenta de SQL do banco de dados utilizado pelo seu sistema SAP, em nosso caso estamos usando o SAP MaxDB e o SQL Studio. Vamos efetuar um comando básico na tabela de exemplo do Flight Model do NetWeaver 7, chamada SCARR e poderemos ver que os dados estão contidos apenas no mandante padrão que é o cliente 000.

Dados - Mandante 000

Dados – Mandante 000

2 – No dicionário de dados na transação SE11, podemos ver a estrutura da tabela SCARR, a mesma que esta aberta no Studio SQL, porem no sistema R/3 estamos logados no mandante 001 e como podemos ver na tabela acima não existe dados para o campo MANDT para o cliente 001.

SCARR - Estrutura

SCARR – Estrutura

3 – Quando tentamos verificar o conteúdo da tabela SCARR sobre o mandante 001 o sistema acusa corretamente que não existe dados.

SCARR - Dados - 001

SCARR – Dados – 001

4 – Para transportar os dados para o mandante 001 basta utilizar uma instrução SQL básica contendo um comando INSERTSELECT com um alias no campo mandante, visto que é preciso respeitar a ordem da proteção referencial do banco de dados sobre as chaves estrangeiras contidas na tabela, esta tabela por ser uma tabela pai não possui uma chave estrangeira atrelada a ela.

Transporte - Insert...Select

Transporte – Insert…Select

5 – Após as rows serem duplicadas com sucesso você pode verificar usando uma instrução Select.

Dados Transportados

Dados Transportados

6 – Agora você pode verificar o conteúdo da tabela SCARR dentro do mandante 001 no qual estávamos logados e os dados serão encontrados.

Mandante 001 - Dados

Mandante 001 – Dados

OBS: Existem ferramentas especificas para transporte entre os clientes, este método pode ser utilizado somente a nível de estudo, em um ambiente empresarial você esta sujeito aos termos de garantia do sistema SAP.